Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] if Abfrage will nicht

    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

    [gelöst] if Abfrage will nicht

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

      Hi zusammen,
      ich habe vermutlich irgendwo nen ganz blöden Fehler. Folgendes Script triggert nicht richtig. Es gibt immer nur "zu Hause" aus.
      Die erste Log Zeile zeigt korrekt false an aber dennoch lande ich in der ersten if Schleife.

      on({id: 'iot.0.services.custom_atHome'/*Service for atHome*/}, function (obj) {
          log("State " + getState('iot.0.services.custom_atHome'/*Service for atHome*/).val)
          if (getState('iot.0.services.custom_atHome'/*Service for atHome*/).val)
          {
              log("Zu Hause");
              //setState('scene.0.szenenname', true); // Szene starten
          }
          if (!getState('iot.0.services.custom_atHome'/*Service for atHome*/).val) //&& !getState('scene.0.Feierabend'/*Feierabend*/)
          {
              log("Unterwegs");
              //setState('scene.0.szenenname', true); // Szene starten
          }
      });
      
      
      

      5746932b-0ff4-4536-8447-8a26850b0b5b-image.png

      Ich finde meinen fehler einfach nicht 😞

      LG Michael

      UncleSam 1 Reply Last reply Reply Quote 0
      • UncleSam
        UncleSam Developer @CyberMicha last edited by

        @CyberMicha Geht es, wenn du einfach obj.val benutzt anstatt nochmals ein getState zu machen? Was ist der Typ des Datenpunktes?

        1 Reply Last reply Reply Quote 0
        • C
          CyberMicha last edited by

          669bea28-1dba-4b72-ba33-139623abc7cb-image.png
          Hab es schon umgestellt von "gemischt" auf "Logikwert"

          Wie meinst Du das mit einfach obj.val?

          htrecksler 1 Reply Last reply Reply Quote 0
          • htrecksler
            htrecksler Forum Testing @CyberMicha last edited by

            @CyberMicha

            on({id: "iot.0.services.custom_atHome"}, function (obj) {
                var value = obj.state.val;
                var oldValue = obj.oldState.val;
                log('atHome: ' + value + ' - ' + oldValue);
            });
            

            was bringt das bei dir?

            1 Reply Last reply Reply Quote 0
            • C
              CyberMicha last edited by CyberMicha

              on({id: 'iot.0.services.custom_atHome'/*Service for atHome*/}, function (obj) {
                  log("State " + getState('iot.0.services.custom_atHome'/*Service for atHome*/).val)
              
                  var value = obj.state.val;
                  var oldValue = obj.oldState.val;
                  log('atHome: ' + value + ' - ' + oldValue);
              
                  if (getState('iot.0.services.custom_atHome'/*Service for atHome*/).val)
                  {
                      log("Zu Hause");
                      //setState('scene.0.szenenname', true); // Szene starten
                  }
                  if (!getState('iot.0.services.custom_atHome'/*Service for atHome*/).val) 
                  {
                      log("Unterwegs");
                      //setState('scene.0.szenenname', true); // Szene starten
                  }
              });
              

              Ergibt ( Einmal mit false und einmal true ) :

              16:34:41.627	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: State false
              16:34:41.627	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: atHome: false - false
              16:34:41.628	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: Zu Hause
              
              16:35:21.517	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: State true
              16:35:21.517	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: atHome: true - false
              16:35:21.517	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: Zu Hause
              

              Irgendwie crazy. Ist doch eigentlich total billig.

              htrecksler paul53 2 Replies Last reply Reply Quote 0
              • htrecksler
                htrecksler Forum Testing @CyberMicha last edited by

                @CyberMicha warum machst du denn diese erneuten getState?
                Du hast doch den Wert mit dem Du arbeiten willst schon in "obj" (obj.state.val)
                Warum arbeitest du damit nicht einfach weiter?

                if value dann zu Hause sonst unterwegs

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

                  @CyberMicha sagte:

                  Ist doch eigentlich total billig.

                  Ja eigentlich. Aber zu umständlich programmiert. Weshalb triggerst Du auf jede Aktualisierung ? Das sollte man nur in Ausnahmefällen (Taster) tun. Vorschlag:

                  on('iot.0.services.custom_atHome'/*Service for atHome*/, function(dp) {
                      log("State " + dp.state.val);
                      if (dp.state.val) {
                          log("Zu Hause");
                          //setState('scene.0.szenenname', true); // Szene starten
                      } else {
                          log("Unterwegs");
                          //setState('scene.0.szenenname', true); // Szene starten
                      }
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • C
                    CyberMicha last edited by CyberMicha

                    Okay dann mache ich es so. Verstehen tue ich es aber dennoch nicht, wieso es nicht funktioniert.

                    Nur wie baue ich im false Fall noch eine Prüfung auf die szene ein. Also ob die schon true ist oder nicht? Macht ja keinen Sinn sie immer wieder neu zu starten.

                    paul53 2 Replies Last reply Reply Quote 0
                    • paul53
                      paul53 @CyberMicha last edited by

                      @CyberMicha sagte:

                      Verstehen tue ich es aber dennoch nicht, wieso es nicht funktioniert.

                      Ich kann auch keinen Fehler entdecken. Vielleicht irgendwo ein unsichtbares Zeichen ? Aber dann würde wahrscheinlich der Compiler meckern.

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

                        @CyberMicha sagte:

                        im false Fall noch eine Prüfung auf die szene ein.

                        Du meinst die kommentierte Abfrage ?

                            } else if (!getState('scene.0.Feierabend'/*Feierabend*/).val) { 
                        

                        Da fehlt im Original übrigens .val.

                        1 Reply Last reply Reply Quote 0
                        • C
                          CyberMicha last edited by CyberMicha

                          @paul53 sagte in if Abfrage will nicht:

                          ber zu umständlich programmiert. Weshalb triggerst Du auf jede Aktualisierung ? Das sollte man nur in Ausnahmefällen (Taster) tun. Vorschlag:

                          Jetzt verstehe ich gar nichts mehr. Dein Code liefert nun auch immer zu Hause. Egal was ich schicke.

                          17:16:29.347	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: State true
                          17:16:29.347	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: Zu Hause
                          17:16:46.040	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: State false
                          17:16:46.041	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: Zu Hause
                          
                          on('iot.0.services.custom_atHome'/*Service for atHome*/, function(dp) {
                              log("State " + dp.state.val);
                              if (dp.state.val) {
                                  log("Zu Hause");
                                  //setState('scene.0.szenenname', true); // Szene starten
                              } else {
                                  log("Unterwegs");
                                  //setState('scene.0.szenenname', true); // Szene starten
                              }
                          });
                          
                          UncleSam paul53 2 Replies Last reply Reply Quote 0
                          • UncleSam
                            UncleSam Developer @CyberMicha last edited by UncleSam

                            @CyberMicha kannst du mal log(JSON.stringify(obj.state.val)) ausgeben? Dann sehen wir, was der Datenpunkt tatsächlich für einen Typ hat.

                            Der Grund: wenn dort ein "false" als String drin steht, dann wird das als wahr angenommen; nur wenn wirklich ein Boolean drin steht, funktioniert es.

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

                              @CyberMicha sagte:

                              Dein Code liefert nun auch immer zu Hause. Egal was ich schicke.

                              Auch wenn das Log liefert: State false ?
                              Erweitere mal das Log:

                                  log("State " + dp.state.val + ', Typ: ' + typeof dp.state.val);
                              
                              C 1 Reply Last reply Reply Quote 0
                              • C
                                CyberMicha @UncleSam last edited by

                                @UncleSam sagte in if Abfrage will nicht:

                                false

                                   log("JSON: " + JSON.stringify(dp.state.val))
                                
                                17:20:03.384	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: JSON: "false"
                                17:20:03.385	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: State false
                                17:20:03.386	info	javascript.0 (1055501) script.js.Testing.Anwesenheit: Zu Hause
                                
                                paul53 1 Reply Last reply Reply Quote 0
                                • C
                                  CyberMicha @paul53 last edited by

                                  @paul53
                                  17:21:30.448 info javascript.0 (1055501) script.js.Testing.Anwesenheit: State true, Typ: string
                                  17:21:30.449 info javascript.0 (1055501) script.js.Testing.Anwesenheit: Zu Hause

                                  Da ist wohl das Problem. Nur wie bekomme ich iobroker dazu, es als echten bool zu nehmen.

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

                                    @CyberMicha
                                    Das ist ein String - kein Boolean.

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

                                      @CyberMicha sagte in if Abfrage will nicht:

                                      Nur wie bekomme ich iobroker dazu, es als echten bool zu nehmen.

                                      on('iot.0.services.custom_atHome'/*Service for atHome*/, function(dp) {
                                          let val = toBoolean(dp.state.val);
                                          log("State " + val);
                                          if (val) {
                                              log("Zu Hause");
                                              //setState('scene.0.szenenname', true); // Szene starten
                                          } else {
                                              log("Unterwegs");
                                              //setState('scene.0.szenenname', true); // Szene starten
                                          }
                                      });
                                      
                                      C 1 Reply Last reply Reply Quote 0
                                      • C
                                        CyberMicha @paul53 last edited by

                                        @paul53
                                        Geht, danke! Man man man, hätte gedacht iobroker ist da pfiffiger 🙂 bzw fehlt bei iot dann eine Möglichkeit bei custom services einen typen mitzugeben.

                                        Danke alle für die Zeit und die Nerven 🙂

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

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        381
                                        Online

                                        31.8k
                                        Users

                                        80.0k
                                        Topics

                                        1.3m
                                        Posts

                                        4
                                        18
                                        438
                                        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