NEWS
[gelöst] Javascript-adapter ruft on ereignis doppelt auf
-
Hallo,
ich habe gerade in einem Docker Container den javascript adapter 5.2.21 installiert und meine gesicherten Skripte eingefügt.
Es handelt sich also um etwas, was auf einer früheren Version funktioniert hat.dies ist mein code:
on({id:IdFrischwasserstellmotor, ack:true},(dp) =>{ if(dp.state.val) { SendTelegramMessage("Frischwasserstellmotor öffnen",usernamePrivat); } else { // Ausgabe des aktuellen States SendTelegramMessage("Frischwasserstellmotor schließen",usernamePrivat); // Nachfolgend den Zisternenstellmotor öffnen setStateDelayed(IdZisternenstellmotor,false,verfahrzeitFrischwasserstellmotor.val * 1000); } });
Laut Log, wird die funktion doppelt aufgerufen
javascript.0 2022-03-01 16:47:42.148 info script.js.common.Zisterne: Zisternenstellmotor öffnen javascript.0 2022-03-01 16:47:41.842 info script.js.common.Zisterne: Zisternenstellmotor öffnen
schaut man sich die Zeiten an, so würde ich vermuten, dass einmal mit ack =false und ack=true aufgerufen wird.
Dies habe ich aber ja in der on Bedingung abgefangen.
Habe dies auch mal mit geloggt. bei beidenAufrufen steht ack auf true. (Laut dem dp.state.ack) -
@Ben1983
Ändere mal den Trigger auf Wertänderung:on(IdFrischwasserstellmotor, (dp) =>{
und außerdem
setStateDelayed(IdZisternenstellmotor,false, getState(verfahrzeitFrischwasserstellmotor).val * 1000); // ID stimmt? // oder ist eine Variable, dann setStateDelayed(IdZisternenstellmotor,false,verfahrzeitFrischwasserstellmotor * 1000);
-
@paul53 so funktioniert es.
So ging es allerdings vorher nicht.
Und der sinn von meiner abfrage war, dass ich den trigger erst auslöse, wenn der shellyadapter bestätigt hat.
Hat sich da was geändert? -
@paul53 sagte in Javascript-adapter ruft on ereignis doppelt auf:
und außerdem
setStateDelayed(IdZisternenstellmotor,false, getState(verfahrzeitFrischwasserstellmotor).val * 1000); // ID stimmt?Warumsollte die nicht stimmen
-
@ben1983 sagte: Warumsollte die nicht stimmen
Wenn verfahrzeitFrischwasserstellmotor eine ID ist, fehlte bei Dir getState() um die ID.
-
@paul53 Die Id ist nur die zu setzende.
Das zu schreibende ist eine interne Variabel (Deshalb steht auch kein Id davor)
Aber davon abgesehen funktioniert es ja, nur reagiert die on() Abfrage anders als auf dem windows system. -
@ben1983 sagte: ist eine interne Variabel
Ein Objekt (wegen .val)?
-
@paul53 Nein, weil ich das nicht nur da verwende.
Ich lese es bei änderung ein und reagiere darauf indem ich es in den Arbeitsspeicher schreibe.
So muss ich nicht überall getState aufrufen. -
@paul53 Frage mich jetzt nur, warum er den aufruf doppelt absetzt?
-
@ben1983 sagte: Frage mich jetzt nur, warum er den aufruf doppelt absetzt?
Welcher Adapter setzt den DP mit IdFrischwasserstellmotor?
-
@paul53 Shelly…. Ist ein Adapter im beta
@haus-automatisierung
Kann das an dem Beta liegen? -
@ben1983 sagte in Javascript-adapter ruft on ereignis doppelt auf:
Kann das an dem Beta liegen?
Dass irgendwas den (hier nicht genannten) Datenpunkt 2x schreibt? Wie soll ich darauf antworten
Kenne dein System nicht und weiß nichtmal um welche Geräte es geht.
Was erwartest da für eine Antwort?
-
@ben1983
Um zu sehen, woher es kommt, bau mal in das Skript einen zweiten Trigger auf Aktualisierung ein, der es im Log zeigt:on({id: IdFrischwasserstellmotor}, (dp) => { log('Frischwasser: ' + dp.state.val + ', Ack: ' + dp.state.ack + ', From: ' + dp.state.from); });
-
@paul53 mache ich
-
@haus-automatisierung sorry.
Es wird ein Shelly 2.5 geschaltet.
Diesen schalte ich mit setstatedelayed.
Jeweils(val=true oder false) mit dem ack nicht angegeben, also false.
Die on Methode, welche ich auf ack=true Abfrage wird zwei mal mit val=true und ack=true aufgerufen. Aber frage ich auf lediglich die id ab, dann wird bei Änderung nur einmal mit ack = fAlse aufgerufenMein Gedanke war nun, dass irgendwie bei der Abfrage auf ack=true der Wert für ack nicht richtig übergeben wird.
-
@ben1983 sagte in Javascript-adapter ruft on ereignis doppelt auf:
Mein Gedanke war nun, dass irgendwie bei der Abfrage auf ack=true der Wert für ack nicht richtig übergeben wird.
Müsste ich in Ruhe testen, aber würde mich sehr wundern wenn das passiert. Die Versionen werden ja von tausenden Leuten schon genutzt. Das wäre sicherlich aufgefallen
-
@haus-automatisierung ja,
Das hat ja auf meiner Windows Installation auch funktioniert.
Jetzt bei der neuen auf Docker trat es auf. -
@paul53 @haus-automatisierung Das hier habe ich wie beschrieben eingefügt:
on({id: IdFrischwasserstellmotor}, (dp) => { log('Frischwasser: ' + dp.state.val + ', Ack: ' + dp.state.ack + ', From: ' + dp.state.from); });
Im Log steht dann:
16:27:46.649 info javascript.0 (32410) script.js.common.eventtest: Frischwasser: false, Ack: false, From: system.adapter.javascript.0 16:27:46.652 info javascript.0 (32410) script.js.common.eventtest: Frischwasser: false, Ack: true, From: system.adapter.shelly.0 16:27:46.930 info javascript.0 (32410) script.js.common.eventtest: Frischwasser: false, Ack: true, From: system.adapter.shelly.0
also für michsieht es so aus, dassichim script auf false setze und der shelly adapter 2 x mit true zurück meldet.
Oder? -
@ben1983 sagte: im script auf false setze und der shelly adapter 2 x mit true zurück meldet. Oder?
Ja, so sieht es aus: Im Abstand von ca. 300 ms wird val = false und ack = true gesendet.
-
@ben1983 sagte in Javascript-adapter ruft on ereignis doppelt auf:
also für michsieht es so aus, dassichim script auf false setze und der shelly adapter 2 x mit true zurück meldet.
Ich würde das ja gerne nachvollziehen oder testen. Aber Du lieferst ja keine Infos
- Shelly 2.5 in welchem Modus (Switch oder Shutter)
- Welche Firmware-Version
- Welcher Datenpunkt genau
- Wie integriert (MQTT oder CoAP?), ...