Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Wie warn-Meldungen bei nicht gesetztem Selector vermeiden

    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

    Wie warn-Meldungen bei nicht gesetztem Selector vermeiden

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

      Hallo,

      ich benutze zum zählen der eingeschalteten Lichter das hier schon mal veröffentlichte "LichterAn"-Script.

      Leider habe ich bei jedem Script-Aufruf Warnungen der Art:

      javascript.0	2016-09-24 20:46:09.870	warn	javascript.0 State "hm-rpc.2.CUX4000008.6.LEVEL" not found
      javascript.0	2016-09-24 20:46:09.870	warn	javascript.0 State "hm-rpc.2.CUX4000008.3.LEVEL" not found
      javascript.0	2016-09-24 20:46:09.869	warn	javascript.0 State "hm-rpc.2.CUX4000008.1.LEVEL" not found
      

      Die ID's und auch die entsprechenden States, also z.B. ".LEVEL", sind vorhanden, können aber irgendwie nicht gefunden werden.

      Wie kann ich die Warn-Meldungen vermeiden?

      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        @AndyUM61:

        Hallo,

        ich benutze zum zählen der eingeschalteten Lichter das hier schon mal veröffentlichte "LichterAn"-Script.

        Leider habe ich bei jedem Script-Aufruf Warnungen der Art:

        javascript.0	2016-09-24 20:46:09.870	warn	javascript.0 State "hm-rpc.2.CUX4000008.6.LEVEL" not found
        javascript.0	2016-09-24 20:46:09.870	warn	javascript.0 State "hm-rpc.2.CUX4000008.3.LEVEL" not found
        javascript.0	2016-09-24 20:46:09.869	warn	javascript.0 State "hm-rpc.2.CUX4000008.1.LEVEL" not found
        

        Die ID's und auch die entsprechenden States, also z.B. ".LEVEL", sind vorhanden, können aber irgendwie nicht gefunden werden.

        Wie kann ich die Warn-Meldungen vermeiden? `
        Kann es sein, dass für diese States noch nie ein Wert geliefert wurde?

        1 Reply Last reply Reply Quote 0
        • A
          AndyUM61 last edited by

          Ja, kann sein.

          Die Actoren werden derzeit nicht benutzt.

          Aber irgend wie müsste man das doch auch abfangen können.

          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 last edited by

            @AndyUM61:

            Die ID's und auch die entsprechenden States, also z.B. ".LEVEL", sind vorhanden, `
            Du meinst, dass die Datenpunktobjekte vorhanden sind. Die States (im Sinne von ioBroker: Zustände) sind noch nicht vorhanden, wenn diese Warnung kommt.
            @AndyUM61:

            Wie kann ich die Warn-Meldungen vermeiden? `
            Im Reiter "Zustände" einen Wert (0) eintragen.

            1 Reply Last reply Reply Quote 0
            • A
              AndyUM61 last edited by

              @paul53:

              Im Reiter "Zustände" einen Wert (0) eintragen. `

              Ähm, na ja, da soll ich also alle meine Actoren nach Nullen durchsuchen??

              Das kann ja nicht wirklich die Lösung sein!?

              Ich muss das doch Scrip-Technisch irgend wie abfangen können;)?

              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 last edited by

                @AndyUM61:

                Ich muss das doch Scrip-Technisch irgend wie abfangen können;)? `
                Ja, indem das Script so ergänzt wird, dass wenn getState(id) nicht existiert, mit setState(id, 0) der State erzeugt wird. Beispiel:

                if(!getState(id)) setState(id, 0);
                else {
                  var x = getState(id).val;
                }
                

                Dann kommt die Warnung nur noch einmal.

                1 Reply Last reply Reply Quote 0
                • A
                  AndyUM61 last edited by

                  @paul53:

                  if(!getState(id)) setState(id, 0);
                  else {
                    var x = getState(id).val;
                  }
                  ```` `  
                  

                  Dann könnte ich ja auch gleich die Schleife mit

                  if (!getState(id)) return;
                  

                  beenden.

                  Aber leider funktioniert ja genau das - aus welchem Grund auch immer - eben NICHT.

                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    @AndyUM61:

                    Dann könnte ich ja auch gleich die Schleife mit

                    if (!getState(id)) return;
                    

                    beenden. `
                    Eben nicht, da die Abfrage if(!getState(id)) die Warnung erzeugt, solange der State nicht gesetzt ist.

                    Bei meinem Vorschlag passiert dies nur noch genau einmal, weil bei Nichtexistenz der State erzeugt wird.

                    1 Reply Last reply Reply Quote 0
                    • A
                      AndyUM61 last edited by

                      Die warn-Meldung kommt trotzdem bei jedem Scriptaufruf.

                      Hier mal das komplette Script, vielleicht ist ja da trotzdem noch ein anderer Fehler.

                      createState('zählenLichter.anzahlLichter', 0);    // wenn benötigt: Anzahl der vorhandenen Lichter
                      createState('zählenLichter.anzahlLichterAn', 0);  // Anzahl der Lichter, die an sind als Variable unter Javascript.0 anlegen
                      
                      var cacheSelectorState  = $('channel[state.id=*.STATE](functions=Licht)');
                      var cacheSelectorDimmer = $('channel[state.id=*.LEVEL](functions=Licht)');
                      
                      function countLamps(obj) {
                          if (!obj) return;
                           // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
                          var anzahlLichterAn = 0;
                          var anzahlLichter = 0;
                      
                          //log('New state of ' + obj.id + ': ' + obj.newState.val);    // Info im Log, welcher Zustand sich geändert hat
                      
                          cacheSelectorState.each(function (id, i) {                       // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
                              if(!getState(id)) {setState(id, 0);} else {
                              var status = getState(id).val;                      // Zustand *.STATE abfragen (jedes Element)
                              }   
                              if (status === true) {++anzahlLichterAn}                // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt
                              // log("Licht Nr. " + i + ": " + id + ": " + status);    // gibt alle Elemente *.STATE im Gewerk Licht mit dem aktuelle Status im Log aus
                              if (status != "undefined") {++anzahlLichter;}            // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
                      
                          });
                          cacheSelectorDimmer.each(function (id, i) {  // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
                              if(!getState(id)) {setState(id, 0);} else {
                              var status = getState(id).val;                          // Zustand *.LEVEL abfragen (jedes Element)
                              }
                              if (parseFloat(status) > 0) {++anzahlLichterAn}                // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt
                              // log("Licht Nr. " + i + ": " + id + ": " + status);    // gibt alle Elemente *.STATE im Gewerk Licht mit dem aktuelle Status im Log aus
                              if (status != "undefined") {++anzahlLichter;}            // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
                          });
                      
                          // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
                      
                          //log("Anzahl Lichter: " + anzahlLichter + " # davon an: " + anzahlLichterAn);
                      
                          // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
                          setState("zählenLichter.anzahlLichter", anzahlLichter);        // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
                          setState("zählenLichter.anzahlLichterAn", anzahlLichterAn);    // Schreibt die aktuelle Anzahl der eingeschalteten Lichter
                      }
                      
                      cacheSelectorState.on(function(obj) {    // bei Zustandänderung *. STATE im Gewerk Licht
                         countLamps(obj);
                      });
                      cacheSelectorDimmer.on(function(obj) {    // bei Zustandänderung *. LEVEL im Gewerk Licht
                         countLamps(obj);
                      });
                      
                      1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 last edited by

                        Man sollte boolsche Werte nicht mit 0 sondern mit false initialisieren:

                            cacheSelectorState.each(function (id, i) {                 // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
                                if(!getState(id)) setState(id, false);
                                else {
                                	var status = getState(id).val;                      // Zustand *.STATE abfragen (jedes Element)
                                	if (status === true) ++anzahlLichterAn;                 // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt
                                	// log("Licht Nr. " + i + ": " + id + ": " + status);   // gibt alle Elemente *.STATE im Gewerk Licht mit dem aktuelle Status im Log aus
                                	++anzahlLichter;                                    // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
                        	    }
                            });
                        
                        
                        1 Reply Last reply Reply Quote 0
                        • D
                          dering last edited by

                          Das sollte die Lösung dafür sein oder?

                          http://forum.iobroker.net/viewtopic.php … 37#p130837

                          nur der vollständigkeithalber.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          552
                          Online

                          31.7k
                          Users

                          79.8k
                          Topics

                          1.3m
                          Posts

                          4
                          11
                          1736
                          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