NEWS
[SOLVED] if - if else Logik Problem
-
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 - [32minfo[39m: javascript.0 (652) script.js.türschlösser.wohnungstuer: State: 2 ts: 17:24:46 >2023-12-28 17:24:46.885 - [32minfo[39m: javascript.0 (652) script.js.türschlösser.wohnungstuer: opening >2023-12-28 17:24:46.934 - [34mdebug[39m: 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 - [32minfo[39m: 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 - [32minfo[39m: 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 - [32minfo[39m: javascript.0 (652) script.js.türschlösser.wohnungstuer: closing >2023-12-28 17:25:01.234 - [34mdebug[39m: 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 - [32minfo[39m: 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 - [32minfo[39m: javascript.0 (652) script.js.türschlösser.wohnungstuer: opening >2023-12-28 17:25:16.890 - [34mdebug[39m: 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 - [32minfo[39m: javascript.0 (652) script.js.türschlösser.wohnungstuer: closing >2023-12-28 17:25:31.235 - [34mdebug[39m: 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 - [32minfo[39m: javascript.0 (652) script.js.türschlösser.wohnungstuer: opening >2023-12-28 17:25:46.892 - [34mdebug[39m: 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 - [32minfo[39m: javascript.0 (652) script.js.türschlösser.wohnungstuer: closing >2023-12-28 17:26:01.237 - [34mdebug[39m: 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.
-
@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 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") -
@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
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.
-
@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".
-
@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.
-
@iphilbln
Javascript-Adapter neustarten, das verhalten ist nicht nachvollziehbar.Das Skript ist in der obrigen Version nicht gegen mehrfach Aufruf gesichert. Nicht gut.