Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Aktive Heizungen zählen Homematic und Homematic IP

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Aktive Heizungen zählen Homematic und Homematic IP

    This topic has been deleted. Only users with topic management privileges can see it.
    • X
      Xanon last edited by

      Hallo Ich habe seit Jahren das Skript im Einsatz, welches die aktiven Heizungen zählt.
      Hat immer wunderbar funktioniert.

      Nun habe ich mir Homematic IP Thermostate und hast gedacht, dass das Skript dies auch Zusammen zählt.
      Tut es aber nicht.
      Es gibt verschiedene Objekte
      Homematic = Valve
      Homematic IP = Lavel

      Bin kein Spezi und kenne mit mit Coden so gar nicht aus.
      Daher die Frage hier, ob jemand mir helfen kann das Skript wieder richtig zum laufen zu bekommen?

      Anbei mal das Originale Skript und eines, welches ich schon ein wenig angepasst habe.
      Jetzt bekomme ich "NUR NOCH" IP Thermostate in der VIS angezeigt.

      Also irgendwas scheint hier als Trennung oder so zu fehlen.
      Kann mal bitte einer rübersehen?

      Original

      /* Status Zahl Heizung
      
      zählt die Heizung in allen Räumen und meldet die Eingeschalteten namentlich
      Daten kommen vom Gewerk "Heizung"
      
      23.12.2016 Vorlage von "pix" - geändert von bahnuhr auf Heizung
      */
      var logging = false;
      
      var idAnzahlEin = 'javascript.0.Status.Heizung.Anzahl_ein',
      idAnzahl = 'javascript.0.Status.Heizung.Anzahl',
      idRaum = 'javascript.0.Status.Heizung.Raum';
      
      // Ab hier nix mehr ändern
      createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Heizung
      type: 'number',
      name: 'Anzahl aller Heizung',
      min: 0,
      def: 0,
      role: 'value'
      });
      createState(idAnzahlEin, { // Anzahl der Heizung, die auf sind als Variable unter Javascript.0 anlegen
      type: 'number',
      name: 'Anzahl der eingeschalteten Heizung',
      min: 0,
      def: 0,
      role: 'value'
      });
      createState(idRaum, {
      type: 'string',
      name: 'Räume mit eingeschalteten Heizung',
      desc: 'Namen der Räume, in denen Heizung eingeschaltet sind',
      def: ' ',
      role: 'value'
      });
      
      var cacheSelectorLevel = $('channel[state.id=*.VALVE_STATE](functions="Heizung")'); // Gewerk Heizung
      
      function checkDevices(obj) {
      // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Heizung auf 0
      var anzahlHeizungAn = 0;
      var anzahlHeizung = 0;
      var textRaum = [];
      if (logging) log('++++++ Heizung Anzahl ++++ ');
      cacheSelectorLevel.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
      var obj = getObject(id);
      var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element)
      var raumname = getObject(id, "rooms");
      
      if (logging) {
      log('-------');
      log('Kanal: ' + name);
      log('Status: ' + status + '%'); 
      }
      if (parseFloat(status) > 0) { // Wenn Dimmwert über 0
      ++anzahlHeizungAn; 
      textRaum.push(raumname.enumNames); 
      }
      ++anzahlHeizung; // Zählt die Anzahl der vorhandenen Heizungen unabhängig vom Status
      }); 
      
      // Funktion: Doppelte Einträge aus Array entfernen (für Räume) www.okco.de (c) codemaster
      function deleteDuplicates(arr) { 
          var temp = {}; 
          for (var i = 0; i < arr.length; i++) temp[arr[i]] = true; 
          var r = []; 
          for (var k in temp) r.push(k); 
          return r;
      }
      
      textRaum = deleteDuplicates(textRaum); // Löscht doppelte Einträge in den Objekt Räume
      
      // Array mit Heizungnamen sortieren
      textRaum.sort();
      // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
      if (logging) log("Anzahl Heizung: " + anzahlHeizung + " # davon Heizung an: " + anzahlHeizungAn);
      // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
      setState(idAnzahlEin, anzahlHeizungAn);
      setState(idAnzahl, anzahlHeizung); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Heizung
      setState(idRaum, textRaum.join(', ')); // Räume, in denen Heizung an ist
      }
      
      // Trigger
      cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
      if (logging) log('Auslösende Heizung: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
      checkDevices();
      });
      
      function main() {
      setTimeout(function(){
      if (logging) log('Auslöser Skriptstart');
      checkDevices();
      }, 2000);
      }
      
      main(); // Skriptstart-Auslöser
      

      Angepasst:

      /* Status Zahl Heizung
      
      zählt die Heizung in allen Räumen und meldet die Eingeschalteten namentlich
      Daten kommen vom Gewerk "Heizung"
      
      23.12.2016 Vorlage von "pix" - geändert von bahnuhr auf Heizung
      */
      var logging = false;
      
      var idAnzahlEin = 'javascript.0.Status.Heizung.Anzahl_ein',
      idAnzahl = 'javascript.0.Status.Heizung.Anzahl',
      idRaum = 'javascript.0.Status.Heizung.Raum';
      
      // Ab hier nix mehr ändern
      createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Heizung
      type: 'number',
      name: 'Anzahl aller Heizung',
      min: 0,
      def: 0,
      role: 'value'
      });
      createState(idAnzahlEin, { // Anzahl der Heizung, die auf sind als Variable unter Javascript.0 anlegen
      type: 'number',
      name: 'Anzahl der eingeschalteten Heizung',
      min: 0,
      def: 0,
      role: 'value'
      });
      createState(idRaum, {
      type: 'string',
      name: 'Räume mit eingeschalteten Heizung',
      desc: 'Namen der Räume, in denen Heizung eingeschaltet sind',
      def: ' ',
      role: 'value'
      });
      
      var cacheSelectorValve = $('channel[state.id=*.VALVE_STATE](functions="Heizung")'); // Gewerk Heizung
      var cacheSelectorLevel = $('channel[state.id=*.LEVEL](functions="Heizung")'); // Gewerk Heizung
      
      function checkDevices(obj) {
      // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Heizung auf 0
      var anzahlHeizungAn = 0;
      var anzahlHeizung = 0;
      var textRaum = [];
      if (logging) log('++++++ Heizung Anzahl ++++ ');
      
      cacheSelectorValve.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
      var obj = getObject(id);
      var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element)
      var raumname = getObject(id, "rooms");
      }); 
      
      cacheSelectorLevel.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
      var obj = getObject(id);
      var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element)
      var raumname = getObject(id, "rooms");
      
      
      
      if (logging) {
      log('-------');
      log('Kanal: ' + name);
      log('Status: ' + status + '%'); 
      }
      if (parseFloat(status) > 0) { // Wenn Dimmwert über 0
      ++anzahlHeizungAn; 
      textRaum.push(raumname.enumNames); 
      }
      ++anzahlHeizung; // Zählt die Anzahl der vorhandenen Heizungen unabhängig vom Status
      }); 
      
      // Funktion: Doppelte Einträge aus Array entfernen (für Räume) www.okco.de (c) codemaster
      function deleteDuplicates(arr) { 
          var temp = {}; 
          for (var i = 0; i < arr.length; i++) temp[arr[i]] = true; 
          var r = []; 
          for (var k in temp) r.push(k); 
          return r;
      }
      
      textRaum = deleteDuplicates(textRaum); // Löscht doppelte Einträge in den Objekt Räume
      
      // Array mit Heizungnamen sortieren
      textRaum.sort();
      // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
      if (logging) log("Anzahl Heizung: " + anzahlHeizung + " # davon Heizung an: " + anzahlHeizungAn);
      // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
      setState(idAnzahlEin, anzahlHeizungAn);
      setState(idAnzahl, anzahlHeizung); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Heizung
      setState(idRaum, textRaum.join(', ')); // Räume, in denen Heizung an ist
      }
      
      // Trigger
      cacheSelectorValve.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
      if (logging) log('Auslösende Heizung: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
      checkDevices();
      })
      
      cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
      if (logging) log('Auslösende Heizung: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
      checkDevices();
      });
      
      function main() {
      setTimeout(function(){
      if (logging) log('Auslöser Skriptstart');
      checkDevices();
      }, 2000);
      }
      
      main(); // Skriptstart-Auslöser
      

      Würde mich sehr freuen, wenn mir hier jemand helfen könnte.

      M paul53 2 Replies Last reply Reply Quote 0
      • M
        MCU @Xanon last edited by

        @Xanon
        Homematic = Valve
        Homematic IP = Lavel (Level?)

        Genutzt wird aber:

        'channel[state.id=*.VALVE_STATE](functions="Heizung")'
        

        Sollte sein ?:

        'channel[state.id=*.VALVE](functions="Heizung")'
        

        Zeig mal bitte die Datenpunkte als Bild aus den Objekten.

        Homematic = Valve
        Homematic IP = Lavel (Level?)

        X 1 Reply Last reply Reply Quote 0
        • X
          Xanon @MCU last edited by Xanon

          @MCU
          Hallo, danke für deine Nachricht.
          War wohl doch etwas spät / früh als ich dies geschrieben habe

          Homematic = VALVE_STATE
          Homematic IP = LEVEL

          Ich habe gedacht, ich baue mir einfach den neuen State dazu aber irgendetwas passt da nicht.

          Weil bei der originalen Version nur Homematic Thermostate abgefragt werden und in meiner bearbeiteten Version werden nur die HomematicIP Thermostate abgefragt.

          Da fehlt doch in meiner Version ein Komma oder eine geschweifte Klammer oder sonst etwas.😧
          Wie gesagt, kann nicht wirklich coden.

          Homematic
          Homematic.png

          HomematicIP
          Homematic IP.png

          M 1 Reply Last reply Reply Quote 0
          • M
            MCU @Xanon last edited by MCU

            @Xanon In der Schleife passiert nichts: Holt nur die Werte, aber verarbeitet sie nicht.

            cacheSelectorValve.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
            var obj = getObject(id);
            var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element)
            var raumname = getObject(id, "rooms");
            }); 
            

            Der Teil fehlt in der Schleife?

            if (logging) {
            log('-------');
            log('Kanal: ' + name);
            log('Status: ' + status + '%'); 
            }
            if (parseFloat(status) > 0) { // Wenn Dimmwert über 0
            ++anzahlHeizungAn; 
            textRaum.push(raumname.enumNames); 
            }
            ++anzahlHeizung; // Zählt die Anzahl der vorhandenen Heizungen unabhängig vom Status
            }); 
             
            
            

            Die Function deleteDuplicates sollte man vielleicht aus der Schleife rausziehen.

            X 1 Reply Last reply Reply Quote 0
            • X
              Xanon @MCU last edited by

              @MCU Danke für deine Unterstützung.

              Der Teil steh doch aber untern in meiner bearbeiteten Version drin?
              Könntest du mir das Skript vielleicht so zusammenbauen, wie du es meinst?
              Dann kann ich es versuchen.

              M 1 Reply Last reply Reply Quote 0
              • M
                MCU @Xanon last edited by

                @Xanon

                /* Status Zahl Heizung
                {1}
                zählt die Heizung in allen Räumen und meldet die Eingeschalteten namentlich
                Daten kommen vom Gewerk "Heizung"
                {1}
                23.12.2016 Vorlage von "pix" - geändert von bahnuhr auf Heizung
                */
                var logging = false;
                 
                var idAnzahlEin = 'javascript.0.Status.Heizung.Anzahl_ein',
                idAnzahl = 'javascript.0.Status.Heizung.Anzahl',
                idRaum = 'javascript.0.Status.Heizung.Raum';
                 
                // Ab hier nix mehr ändern
                createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Heizung
                type: 'number',
                name: 'Anzahl aller Heizung',
                min: 0,
                def: 0,
                role: 'value'
                });
                createState(idAnzahlEin, { // Anzahl der Heizung, die auf sind als Variable unter Javascript.0 anlegen
                type: 'number',
                name: 'Anzahl der eingeschalteten Heizung',
                min: 0,
                def: 0,
                role: 'value'
                });
                createState(idRaum, {
                type: 'string',
                name: 'Räume mit eingeschalteten Heizung',
                desc: 'Namen der Räume, in denen Heizung eingeschaltet sind',
                def: ' ',
                role: 'value'
                });
                 
                var cacheSelectorValve = $('channel[state.id=*.VALVE_STATE](functions="Heizung")'); // Gewerk Heizung
                var cacheSelectorLevel = $('channel[state.id=*.LEVEL](functions="Heizung")'); // Gewerk Heizung
                
                
                 
                function checkDevices(obj) {
                // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Heizung auf 0
                var anzahlHeizungAn = 0;
                var anzahlHeizung = 0;
                var textRaum = [];
                if (logging) log('++++++ Heizung Anzahl ++++ ');
                 
                cacheSelectorValve.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
                	var obj = getObject(id);
                	var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element)
                	var raumname = getObject(id, "rooms");
                	if (logging) {
                		log('-------');
                		log('Kanal: ' + name);
                		log('Status: ' + status + '%'); 
                		}
                	if (parseFloat(status) > 0) { // Wenn Dimmwert über 0
                		++anzahlHeizungAn; 
                		textRaum.push(raumname.enumNames); 
                		}
                	++anzahlHeizung; // Zählt die Anzahl der vorhandenen Heizungen unabhängig vom Status
                }); 
                 
                cacheSelectorLevel.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
                	var obj = getObject(id);
                	var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element)
                	var raumname = getObject(id, "rooms");
                 
                 
                 
                	if (logging) {
                		log('-------');
                		log('Kanal: ' + name);
                		log('Status: ' + status + '%'); 
                		}
                	if (parseFloat(status) > 0) { // Wenn Dimmwert über 0
                		++anzahlHeizungAn; 
                		textRaum.push(raumname.enumNames); 
                		}
                	++anzahlHeizung; // Zählt die Anzahl der vorhandenen Heizungen unabhängig vom Status
                }); 
                 
                // Funktion: Doppelte Einträge aus Array entfernen (für Räume) www.okco.de (c) codemaster
                function deleteDuplicates(arr) { 
                    var temp = {}; 
                    for (var i = 0; i < arr.length; i++) temp[arr[i]] = true; 
                    var r = []; 
                    for (var k in temp) r.push(k); 
                    return r;
                }
                 
                textRaum = deleteDuplicates(textRaum); // Löscht doppelte Einträge in den Objekt Räume
                 
                // Array mit Heizungnamen sortieren
                textRaum.sort();
                // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
                if (logging) log("Anzahl Heizung: " + anzahlHeizung + " # davon Heizung an: " + anzahlHeizungAn);
                // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
                setState(idAnzahlEin, anzahlHeizungAn);
                setState(idAnzahl, anzahlHeizung); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Heizung
                setState(idRaum, textRaum.join(', ')); // Räume, in denen Heizung an ist
                }
                 
                // Trigger
                cacheSelectorValve.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
                if (logging) log('Auslösende Heizung: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
                checkDevices();
                })
                 
                cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
                if (logging) log('Auslösende Heizung: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
                checkDevices();
                });
                 
                function main() {
                setTimeout(function(){
                if (logging) log('Auslöser Skriptstart');
                checkDevices();
                }, 2000);
                }
                 
                main(); // Skriptstart-Auslöser
                
                
                1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 @Xanon last edited by paul53

                  @Xanon sagte:

                  Es gibt verschiedene Objekte

                  Das ist ein passender Zeitpunkt, sich Gedanken über Alias zu machen.

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  438
                  Online

                  31.9k
                  Users

                  80.2k
                  Topics

                  1.3m
                  Posts

                  3
                  7
                  341
                  Loading More Posts
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes
                  Reply
                  • Reply as topic
                  Log in to reply
                  Community
                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                  The ioBroker Community 2014-2023
                  logo