Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript Syntax Verstaendnisproblem

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    JavaScript Syntax Verstaendnisproblem

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

      Hallo,

      const idSensor = 'mqtt.0.tele.Gascounter.SENSOR';
      const idZaehler = '0_userdata.0.Gaszaehler.Gaszaehlerstand';
      const idVerbrauch = '0_userdata.0.Gaszaehler.Gasverbrauch';
      var idZustandszahl = '0_userdata.0.Gaszaehler.Umrechnung.Zustandszahl';
      var idBrennwert = '0_userdata.0.Gaszaehler.Umrechnung.Brennwert';
      var idAnpassfaktor = '0_userdata.0.Gaszaehler.Umrechnung.Anpassfaktor';
      var idBACK = '0_userdata.0.Gaszaehler.Umrechnung.BACK';
      var idKostenpTag    = "0_userdata.0.Gaszaehler.Verbrauch.GaskostenDaily";
       
      on({id: idSensor, change: "ne"}, async function (obj) {
          let zaehler = parseInt(getAttr(obj.state.val, "COUNTER.C1")) / 100 * 0.999820;
          var roundedm3 = Math.round((zaehler + Number.EPSILON) * 100) / 100;
          var roundedkwh = Math.round((zaehler + Number.EPSILON) * 100 * 0.95 * 11.1) / 100;
          setState(idZaehler, roundedm3, true);
          setState(idVerbrauch, roundedkwh, true);
          var costperday = parseFloat("0_userdata.0.Gaszaehler.Verbrauch.Daily") * 13.70 / 100;
          setState(idKostenpTag, costperday, true);
      });
      

      Zeile 16 costperday.... funktioniert nicht, ich verstehe nicht wie man zum Teufel eine Uservariable auslesen bzw. beschreiben kann, die Doku hilft mir hier nicht weiter... wie geht das?
      genauso wie oben die variablendeklaration.. wieso kann er nicht einfach das ausgewaehlte 'Zahl' aus der Objektdefinition auslesen? wieso wird immer string angenommen?

      ..das 13.7 ist auch noch eine userdata variable die dazukommen soll..

      rrov1 BananaJoe 2 Replies Last reply Reply Quote 0
      • rrov1
        rrov1 @NeueKlasse last edited by

        @neueklasse versuche es mal mit:

        var costperday = parseFloat(getState("0_userdata.0.Gaszaehler.Verbrauch.Daily").val) * 13.70 / 100;
        

        Dokumentation der getState()-Funktion: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#getstate

        N 2 Replies Last reply Reply Quote 0
        • BananaJoe
          BananaJoe Most Active @NeueKlasse last edited by

          @neueklasse Ich habe gerade am Anfang mir oft das Detail des Skriptes in Blockly zusammengeklickt - und dann auf die JavaScript-Ansicht umgeschaltet oben rechts.
          So lernte ich schneller die Befehle und mit welchem man was macht. Der Blockly-Code ist dann manchmal "überladen" aber das vereinfachen ist dann ja eine gute Übung

          N 1 Reply Last reply Reply Quote 0
          • N
            NeueKlasse @rrov1 last edited by

            @rrov1 Super, Danke das ist es!

            1 Reply Last reply Reply Quote 0
            • N
              NeueKlasse @BananaJoe last edited by

              @bananajoe Danke fuer den Hinweis, das versuche ich!

              1 Reply Last reply Reply Quote 0
              • N
                NeueKlasse @rrov1 last edited by

                @rrov1

                ich bringe die If funktion leider nicht zum laufen... wenn das if auskommentiert ist wird alles richtig resetted...
                der Wert beträgt aber "Room cleaning"....

                var idRobotState = 'mihome-vacuum.0.info.state';
                
                on({id: idRobotState, change: "ne"}, async function (obj) {
                
                    if (idRobotState === "Room cleaning") {
                        setState('mihome-vacuum.0.rooms.315001052296.roomClean', false);
                        setState('mihome-vacuum.0.rooms.315001052297.roomClean', false);
                        setState('mihome-vacuum.0.rooms.315001052299.roomClean', false);
                        setState('mihome-vacuum.0.rooms.315001052301.roomClean', false);
                        setState('mihome-vacuum.0.rooms.315001052302.roomClean', false);
                        setState('mihome-vacuum.0.rooms.315001052303.roomClean', false);
                        setState('mihome-vacuum.0.rooms.315001052305.roomClean', false);
                    }
                
                });
                
                paul53 BananaJoe Codierknecht 3 Replies Last reply Reply Quote 0
                • paul53
                  paul53 @NeueKlasse last edited by

                  @neueklasse

                      if(obj.state.val === 'Room cleaning') {
                  
                  N 1 Reply Last reply Reply Quote 0
                  • BananaJoe
                    BananaJoe Most Active @NeueKlasse last edited by

                    @neueklasse aus dem Kopf: nur 2x =, dann passt er die Typen an

                    if (obj.state.val == "Room cleaning")
                    

                    on reagiert auf die Datenpunktänderungen und übergibt dieses Objektzustand an die angegebene Funktion - mit dem Variablennamen obj weil das in der Klammer so angegeben wird.

                    Mit dem Objekt erhälts du auch, aber nicht nur den Wert. Sondern z.B. alle Eigenschaften oder den Zeitstempel der Änderung.
                    obj.state.val enthält den Wert zu dem Zeitpunkt wo on ausgelöst wurde.

                    Zum Vergleichsoperator === : Ich nehme eigentlich immer den ==
                    Siehe auch https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness?retiredLocale=de

                    Codierknecht 1 Reply Last reply Reply Quote 1
                    • Codierknecht
                      Codierknecht Developer Most Active @NeueKlasse last edited by

                      @neueklasse
                      Um das von @paul53 etwas zu erläutern:
                      Im Zeile 1 besetzt Du eine Variable mit der Objekt-ID des DP.
                      In Zeile 3 triggerst Du auf Änderung dieses DP.
                      Der Inhalt des betroffenen Objektes wird als Parameter obj an die anonyme Methode übergeben. Das ist aber dann das komplette Objekt!
                      Mit obj.state.val kommst Du an den eigentlichen Wert.

                      1 Reply Last reply Reply Quote 1
                      • Codierknecht
                        Codierknecht Developer Most Active @BananaJoe last edited by

                        @bananajoe sagte in JavaScript Syntax Verstaendnisproblem:

                        Zum Vergleichsoperator === : Ich nehme eigentlich immer den ==

                        Um es etwas verständlicher auszudrücken:
                        == prüft auf Wertgleichheit. === prüft zusätzlich noch auf Typgleichheit.

                        Beispiel:
                        Ein Vergleich zwischen einem Float 1 und einem Integer 1 liefert bei == ein true zurück. Bei === ein false.

                        paul53 1 Reply Last reply Reply Quote 1
                        • N
                          NeueKlasse @paul53 last edited by

                          @paul53

                          kann es sein das die if abfrage mit der obj.state.val anders sein muss aufgrund des abgefragten objekts? siehe screenshots,
                          er setzt die 6 States so nicht auf false.

                          Screenshot 2023-02-06 132317.jpg
                          Screenshot 2023-02-06 132248.jpg

                          var idRobotState = 'mihome-vacuum.0.info.state';
                          
                          on({id: idRobotState, change: "ne"}, async function (obj) {
                          
                              if(obj.state.val == 'Room cleaning') {
                                  setState('mihome-vacuum.0.rooms.315001052296.roomClean', false);
                                  setState('mihome-vacuum.0.rooms.315001052297.roomClean', false);
                                  setState('mihome-vacuum.0.rooms.315001052299.roomClean', false);
                                  setState('mihome-vacuum.0.rooms.315001052301.roomClean', false);
                                  setState('mihome-vacuum.0.rooms.315001052302.roomClean', false);
                                  setState('mihome-vacuum.0.rooms.315001052303.roomClean', false);
                                  setState('mihome-vacuum.0.rooms.315001052305.roomClean', false);
                              }
                          
                          });
                          
                          Codierknecht 1 Reply Last reply Reply Quote 0
                          • Codierknecht
                            Codierknecht Developer Most Active @NeueKlasse last edited by Codierknecht

                            @neueklasse
                            Du prüfst auf strings.
                            Die Werte sind aber number.
                            Korrekt wäre hier:

                            if(obj.state.val == 18) {
                            

                            Das wird lediglich zur besseren Lesbarkeit in Klartext übersetzt.

                            N 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @Codierknecht last edited by

                              @codierknecht sagte: Ein Vergleich zwischen einem Float 1 und einem Integer 1

                              Javascript kennt keine Integer.

                              Codierknecht 1 Reply Last reply Reply Quote 0
                              • N
                                NeueKlasse @Codierknecht last edited by NeueKlasse

                                @codierknecht habe es gerade versucht, erst wenn die Funktion "on change" ausgeklammert ist funktionert es..
                                oder gibt es eine bessere Methode? z.B einen alle 60sec loop?

                                BananaJoe 1 Reply Last reply Reply Quote 0
                                • BananaJoe
                                  BananaJoe Most Active @NeueKlasse last edited by BananaJoe

                                  @neueklasse das ganze reagiert natürlich nur wenn sich etwas ändert. Vorher passiert nichts. Also der Wert des Datenpunktes muss sich verändern (du hast change angegeben). Der Wert muss erst z.B. 17 werden um dann wieder 18 zu werden

                                  Schreib mal folgendes in die Zeile vor dem if

                                  console.warn("obj.state.val: " + obj.state.val);
                                  

                                  Das gibt er dir dann eine Warnmeldung mit dem aktuellen Wert im Log aus, siehst du unten dann in Orange (oder im Log)

                                  N 1 Reply Last reply Reply Quote 1
                                  • Codierknecht
                                    Codierknecht Developer Most Active @paul53 last edited by Codierknecht

                                    @paul53 sagte in JavaScript Syntax Verstaendnisproblem:

                                    Javascript kennt keine Integer.

                                    Eines meiner Probleme mit untypisierten Sprachen 😁
                                    Ich könnte auch schreiben "doofe Sprache" ... aber dann gibt's wieder Haue. 😇

                                    BananaJoe 1 Reply Last reply Reply Quote 0
                                    • N
                                      NeueKlasse @BananaJoe last edited by

                                      @bananajoe ok, alles klar, gerade getestet, jetzt funktioniert alles wie es soll!

                                      gibt es die möglichkeit 2 States abzufragen?

                                      on({id: idRobotState || idResetButton, change: "ne"}, async function (obj) {
                                      
                                      if(obj.state.val == 18) || (obj.state.val == 1) {
                                      
                                      paul53 1 Reply Last reply Reply Quote 0
                                      • BananaJoe
                                        BananaJoe Most Active @Codierknecht last edited by

                                        @codierknecht sagte in JavaScript Syntax Verstaendnisproblem:

                                        @paul53 sagte in JavaScript Syntax Verstaendnisproblem:

                                        Javascript kennt keine Integer.

                                        Eines meiner Probleme mit untypisierten Sprachen 😁
                                        Ich könnte auch schreiben "doofe Sprache" ... aber dann gibt's wieder Haue. 😇

                                        gib TypeScript eine Chance?

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

                                          @neueklasse sagte: gibt es die möglichkeit 2 States abzufragen?

                                          Ja, dann aber nicht mit obj.state.val.

                                          on({id: [idRobotState, idResetButton], change: "ne"}, async function (obj) {
                                             if(getState(idRobotState).val == 18 || getState(idResetButton).val == 1) {
                                          

                                          oder

                                          on({id: [idRobotState, idResetButton], change: "ne"}, async function (obj) {
                                             if(obj.id == idRobotState && obj.state.val == 18 || obj.id == idResetButton && obj.state.val == 1) {
                                          
                                          N 1 Reply Last reply Reply Quote 1
                                          • N
                                            NeueKlasse @paul53 last edited by NeueKlasse

                                            @paul53

                                            dann wird hierbei (beim ersten) das (obj) nichtmehr benoetigt? zumindestens wird es laut script nicht mehr abgefragt
                                            (grau)

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            810
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            30
                                            801
                                            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