Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [SOLVED] if - if else Logik Problem

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [SOLVED] if - if else Logik Problem

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

      Hej,
      ich bin grade etwas verwundert über die Aktionen meines Skripts.

      'use strict'
      
      const home_id        = '0_userdata.0.member.home';
      const door_state_id  = 'nuki.0.480179117.states.state';
      const door_action_id = 'nuki.0.480179117.actions.action';
      
      on({id: home_id, change: 'ne'}, async (obj) => {
          let state = obj.state.val;
          console.log('State: ' + state + ' ts: ' + formatDate(obj.state.ts, 'hh:mm:ss'));
      
          if (state == 0 || state == 3) {
              for (let i = 0; i < 5; i++) {
                  console.log('closing');
                  setState(door_action_id, {val: 2, ack: false}); // closing the door
      
                  await wait(30 * 1000);
      
                  state = (await getStateAsync(door_state_id)).val;
                  if (state == 1 || state == 4) break;
              }
          }
          else if (state == 2) {
              for (let i = 0; i < 5; i++) {
                  console.log('opening');
                  setState(door_action_id, {val: 1, ack: false}); // opening the door
      
                  await wait(30 * 1000);
      
                  state = (await getStateAsync(door_state_id)).val;
                  if (state == 2 || state == 3) break;
              }
          }
      });
      

      Für gewöhnlich kenne ich es so, dass nur eine der äußeren Bedingung ausgeführt werden, wenn die condition wahr ist. Allerdings scheint es so, dass hier ständig zwischen beiden hin und her geswitcht wird, ohne dass der Trigger auslöst. Dazu mal ein Auszug aus meinem LOG:

      >2023-12-28 17:24:46.885  - info: javascript.0 (652) script.js.türschlösser.wohnungstuer: State: 2 ts: 17:24:46
      >2023-12-28 17:24:46.885  - info: javascript.0 (652) script.js.türschlösser.wohnungstuer: opening
      >2023-12-28 17:24:46.934  - debug: nuki.0 (1424) stateChange nuki.0.480179117.actions.action {"val":1,"ack":false,"ts":1703780686885,"q":0,"c":"script.js.türschlösser.wohnungstuer","from":"system.adapter.javascript.0","user":"system.user.admin","lc":1703780686885}
      >2023-12-28 17:24:56.998  - info: javascript.0 (652) script.js.anwesenheiten.anwesenheit: {"default":{"name":"Home","atHome":2,"atHomeID":"0_userdata.0.member.home"},"persons":[{"name":"Phil","atHome":2,"stateID":"mqtt.0.home.member.phil.presence","atHomeID":"0_userdata.0.member.persons.phil"},{"name":"Caro","atHome":2,"stateID":"mqtt.0.home.member.caro.presence","atHomeID":"0_userdata.0.member.persons.caro"},{"name":"Sabrina","atHome":0,"stateID":"mqtt.0.home.member.sabrina.presence","atHomeID":"0_userdata.0.member.persons.sabrina"}]}
      >2023-12-28 17:24:57.043  - info: javascript.0 (652) script.js.anwesenheiten.anwesenheit: {"default":{"name":"Home","atHome":2,"atHomeID":"0_userdata.0.member.home"},"persons":[{"name":"Phil","atHome":2,"stateID":"mqtt.0.home.member.phil.presence","atHomeID":"0_userdata.0.member.persons.phil"},{"name":"Caro","atHome":2,"stateID":"mqtt.0.home.member.caro.presence","atHomeID":"0_userdata.0.member.persons.caro"},{"name":"Sabrina","atHome":0,"stateID":"mqtt.0.home.member.sabrina.presence","atHomeID":"0_userdata.0.member.persons.sabrina"}]}
      >2023-12-28 17:25:01.231  - info: javascript.0 (652) script.js.türschlösser.wohnungstuer: closing
      >2023-12-28 17:25:01.234  - debug: nuki.0 (1424) stateChange nuki.0.480179117.actions.action {"val":2,"ack":false,"ts":1703780701232,"q":0,"c":"script.js.türschlösser.wohnungstuer","from":"system.adapter.javascript.0","user":"system.user.admin","lc":1703780701232}
      >2023-12-28 17:25:01.467  - info: javascript.0 (652) script.js.anwesenheiten.anwesenheit: {"default":{"name":"Home","atHome":2,"atHomeID":"0_userdata.0.member.home"},"persons":[{"name":"Phil","atHome":2,"stateID":"mqtt.0.home.member.phil.presence","atHomeID":"0_userdata.0.member.persons.phil"},{"name":"Caro","atHome":2,"stateID":"mqtt.0.home.member.caro.presence","atHomeID":"0_userdata.0.member.persons.caro"},{"name":"Sabrina","atHome":0,"stateID":"mqtt.0.home.member.sabrina.presence","atHomeID":"0_userdata.0.member.persons.sabrina"}]}
      >2023-12-28 17:25:16.887  - info: javascript.0 (652) script.js.türschlösser.wohnungstuer: opening
      >2023-12-28 17:25:16.890  - debug: nuki.0 (1424) stateChange nuki.0.480179117.actions.action {"val":1,"ack":false,"ts":1703780716888,"q":0,"c":"script.js.türschlösser.wohnungstuer","from":"system.adapter.javascript.0","user":"system.user.admin","lc":1703780716888}
      >2023-12-28 17:25:31.232  - info: javascript.0 (652) script.js.türschlösser.wohnungstuer: closing
      >2023-12-28 17:25:31.235  - debug: nuki.0 (1424) stateChange nuki.0.480179117.actions.action {"val":2,"ack":false,"ts":1703780731233,"q":0,"c":"script.js.türschlösser.wohnungstuer","from":"system.adapter.javascript.0","user":"system.user.admin","lc":1703780731233}
      >2023-12-28 17:25:46.889  - info: javascript.0 (652) script.js.türschlösser.wohnungstuer: opening
      >2023-12-28 17:25:46.892  - debug: nuki.0 (1424) stateChange nuki.0.480179117.actions.action {"val":1,"ack":false,"ts":1703780746889,"q":0,"c":"script.js.türschlösser.wohnungstuer","from":"system.adapter.javascript.0","user":"system.user.admin","lc":1703780746889}
      >2023-12-28 17:26:01.234  - info: javascript.0 (652) script.js.türschlösser.wohnungstuer: closing
      >2023-12-28 17:26:01.237  - debug: nuki.0 (1424) stateChange nuki.0.480179117.actions.action {"val":2,"ack":false,"ts":1703780761234,"q":0,"c":"script.js.türschlösser.wohnungstuer","from":"system.adapter.javascript.0","user":"system.user.admin","lc":1703780761234}
      

      MOD-EDIT: Code in code-tags gesetzt!

      Ich hoffe man erkennt es, aber in der Konsole wird nur einmalig state mit Zeitstempel ausgegeben, was soweit auch richtig ist, denn home_id ändert sich auch nur einmalig. Und doch wird ständig zwischen den beiden setState hin und her geswitcht, was zur Folge hat, dass die Tür in unregelmäßigem Muster auf und zu geschlossen wird. Wer kann mir hier weiterhelfen?

      Meine Vermutung liegt hierbei darauf, dass die Variable state durch verschiedene Datenpunkte beschrieben wird, allerdings verstehe ich nicht wo das problem liegen könnte, da beides vom Typ Number ist und eigentlich ja auch erst nach der iF - IF ELSE condition neu beschrieben wird.

      Codierknecht amg_666 2 Replies Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @iPhilBln last edited by Codierknecht

        @iphilbln
        Wozu sollen die Schleifen dienen?

        Du veränderst innerhalb der Schleifen das state.
        Wenn die Schleifen schon unbedingt benötigt werden, würde ich innerhalb mit anderen Variablen arbeiten.

        iPhilBln 1 Reply Last reply Reply Quote 0
        • amg_666
          amg_666 @iPhilBln last edited by

          @iphilbln ich steig da nicht ganz durch, was du eigentlich machen willst, aber
          in Zeile 11 prüfst du state auf "1" oder "3" und state ist der Wert von "home_id" später in Zeile 19 bist du immer noch im "IF-Teil" und änderst state auf den Wert von "door_state_id".
          Ich weiß nicht ob es besonders schlau ist innerhalb eines IF Arguments den Wert zu ändern auf den man geprüft hat.
          (Ehrlich gesagt weiß ich es schon und es ist nicht besonders schlau 🙂 )
          Ich würd mal versuchen in Zeile 19 eine andere Variable zu nehmen (z.B. "state_door")

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

            @codierknecht
            Die Schleife ist deshalb, weil das Nuki hin und wieder Befehle verschluckt und dann die Tür nicht auf oder abgeschlossen wird. Wieso das so ist, kann ich dir nicht verraten.
            Das mit der Variable ist mir im Nachhinein auch noch aufgefallen, nur ich wüsste nicht wieso die Variable die äußere IF - IF ELSE Abfrage beeinflussen sollte?

            amg_666 1 Reply Last reply Reply Quote 0
            • iPhilBln
              iPhilBln @amg_666 last edited by

              @amg_666
              Ich verstehe schon deine Argumentation, nur wüsste ich gerne wieso es bei javascript hierbei zu Problemen kommen kann?
              Bin da eher mit C/C++ vertraut und dort kommt es eigentlich nicht zu solchen Phänomenen.

              Ich denke aber das Problem liegt aktuell auch eher daran, dass wenn der Trigger innerhalb der Schleife erneut aufgerufen wird und die gegenteilige Abfrage wahr ist, die beiden Schleifen gegeneinander laufen aktuell.

              1 Reply Last reply Reply Quote 0
              • amg_666
                amg_666 @iPhilBln last edited by

                @iphilbln sagte in if - if else Logik Problem:

                Das mit der Variable ist mir im Nachhinein auch noch aufgefallen, nur ich wüsste nicht wieso die Variable die äußere IF - IF ELSE Abfrage beeinflussen sollte?

                Probiers doch einfach mal aus

                Ich denke aber das Problem liegt aktuell auch eher daran, dass wenn der Trigger innerhalb der Schleife erneut aufgerufen wird und die gegenteilige Abfrage wahr ist, die beiden Schleifen gegeneinander laufen aktuell.

                Wenn du das vermeiden willst könntest du ja einen Logikwert verwenden, der mit im Trigger abgefragt wird und solange die Schleife durchlaufen wird auf "False" gesetzt wird, anschliessend wieder auf "True".

                iPhilBln 1 Reply Last reply Reply Quote 0
                • iPhilBln
                  iPhilBln @amg_666 last edited by

                  @amg_666 sagte in if - if else Logik Problem:

                  Probiers doch einfach mal aus

                  Hmm klar kann man viele Sachen auch über try and error erlernen, aber ich bin eigentlich eher ein Fan davon auch die Hintergründe zu verstehen.
                  Vielleicht kannst du mir ja noch nähere Infos dazu geben, das wäre super.

                  Nichtsdesto trotz habe ich das Problem jetzt glaube ich gelöst mit der gegenseitigen Verriegelung der Schleifen durch ne boolsche Variable. Ich denke das war das Problem, dass die beiden Schleifen gleichzeitig in 2 verschiedenen Threads gelaufen sind und sich so gegenseitig beeinflusst haben.

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    ticaki Developer @iPhilBln last edited by ticaki

                    @iphilbln
                    Javascript-Adapter neustarten, das verhalten ist nicht nachvollziehbar.

                    Das Skript ist in der obrigen Version nicht gegen mehrfach Aufruf gesichert. Nicht gut.

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    753
                    Online

                    31.7k
                    Users

                    79.8k
                    Topics

                    1.3m
                    Posts

                    4
                    8
                    366
                    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