NEWS
Skript reagiert plötzlich anders
-
Guten Morgen,
leider kann ich das Thema nun doch noch nicht zu den Akten legen.
Heute morgen, als ich das Haus verlassen wollte, ist wieder die Alarmanlage angesprungen.Im Log konnte ich lesen, dass der "anwesend" als false erkannt wird. Soweit so verständlich aber der Datenpunkt "0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy" ist in den Objekten als "true" gesetzt.
Gestern Abend siehe Log von 19:48 Uhr war anwesend noch true. Seit dem hatte auch niemand mehr das Haus verlassen.
Habt ihr eine Idee, woran es hier jetzt scheitert bzw. was das Problem ist?
-
@Chrille1507
Ich habe keine genaue Vorstellung von dem Problem, aber eine Option wie du das ggf. umgehen kannst. Ich gehe aktuell davon aus das es am Zeitverhalten liegt, sprich das die Datenpunkte in einer zeitlich ungünstigen Folge gesetzt werden.Versuch mal bitte folgendes:
Der Vollständigkeit halber noch das Skript: /////////////////////////////////// /// /// /// Auslösung der Alarmanlage /// /// Stand: 02.11.2020 /// /// /// /////////////////////////////////// on({"0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy", change: "ne"}, function(obj) { log('anwesend was changed to ' + obj.state.val + ' source = ' + obj.state.from); }); on({id: "0_userdata.0.Türkontakte.alle_Türen_geschlossen", change:"ne"}, function(obj) { log('geschlossen: ' + obj.state.val + ' Typ: ' + typeof obj.state.val); let anw = getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy").val; log('anwesend: ' + anw + ' Typ: ' + typeof anw); if (obj.state.val==false && anw==false) { setState("0_userdata.0.Alarmanlage.Alarmanlage_ausgelöst", true); sendTo('telegram.0', {text: "Achtung die Alarmanlage hat ausgelöst"}); } });
Warum die Anpassungen ?
- bei dem Wechsel vom erneuten Datenpunkt holen zum Prüfen des Triggerwertes geht es um das Ausschliessen einer sogenannten "race condition" - Der Thread in dem der Datenpunkt abgefragt wird und der in dem er geändert wird laufen nicht synchron. Daher kann es durchaus vorkommen das beim erneuten holen des Datenpunktwertes der Wert der zur Aktivierung des Triggers geführt hat noch nicht geschrieben ist.
- bei dem Wechsel vom erneuten holen des Datenpunktes zur Variable "anw" geht es primär darum Ressourcen zu schonen. Du kannst hinterher einfach das 'log' auskommentieren und den rest so lassen.
- der zusätzliche Trigger überwacht wer wann den Anwesend Datenpunkt umschreibt.
A.
-
@Asgothian Vielen Dank für die schnelle Rückmeldung.
Ich werde das gleich als erstes heute testen. -
Guten Morgen,
neuer Tag gleiche Probleme.Ich hatte gestern mein Skript soweit geändert, wie @Asgothian es vorgeschlagen hat.
Heute Morgen gab es dann wieder das Problem, dass die Alarmanlage ausgelöst wurde.Anbei der Auszug aus dem Log:
2020-11-04 07:10:45.504 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: false Typ: boolean 2020-11-04 07:10:45.555 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: true Typ: boolean 2020-11-04 07:11:05.911 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: true Typ: boolean 2020-11-04 07:11:05.912 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: true Typ: boolean 2020-11-04 07:30:21.443 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: false Typ: boolean 2020-11-04 07:30:21.467 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: false Typ: boolean 2020-11-04 07:30:45.699 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: true Typ: boolean 2020-11-04 07:30:45.700 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: false Typ: boolean 2020-11-04 07:31:52.401 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: false Typ: boolean 2020-11-04 07:31:52.402 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: false Typ: boolean 2020-11-04 07:32:17.581 - info: javascript.0 (12613) Stop script script.js.Alarmanlage.Alarmanlage_ausgelöst
Das ist doch zum verzweifeln. Was mache ich nur falsch?
-
- poste bitte mal das Skript wie es jetzt ist
- hast du geschaut ob es Meldungen von dem zusätzlichen Trigger gibt ?
A.
-
@Asgothian
Anbei das Skript://///////////////////////////////// /// /// /// Auslösung der Alarmanlage /// /// Stand: 02.11.2020 /// /// /// /////////////////////////////////// on({id: "0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy", change:"ne"}, function(obj) { log('anwesend was changed to ' + obj.state.val + ' source = ' + obj.state.from); }); on({id: "0_userdata.0.Türkontakte.alle_Türen_geschlossen", change:"ne"}, function(obj) { log('geschlossen: ' + obj.state.val + ' Typ: ' + typeof obj.state.val); let anw = getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy").val; log('anwesend: ' + anw + ' Typ: ' + typeof anw); if (obj.state.val==false && anw==false) { setState("0_userdata.0.Alarmanlage.Alarmanlage_ausgelöst", true); sendTo('telegram.0', {text: "Achtung die Alarmanlage hat ausgelöst"}); } });
Nein, von denen gibt es keine Meldungen. Also wir tatsächlich das Haus verlassen haben, ca. 07.35 Uhr hat der Rest (Licht aus, Steckdosen aus etc.), der sich auf den Datenpunkt "0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy" bezieht aber funktioniert.
Kleiner Nachtrag, einen Log über den Datenpunkt "0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy" konnte er auch nicht erzeugen, weil ich Idiot ja das Skript beendet hatte, bevor ich gegangen bin. Bin ich blöd....
-
@Chrille1507 Da ist was Faul. Der Datenpunkt hat sich geändert, dementsprechend muss es eigentlich auch eine Meldung für die Änderung geben.
2020-11-04 07:11:05.911 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: true Typ: boolean 2020-11-04 07:11:05.912 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: true Typ: boolean 2020-11-04 07:30:21.443 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: false Typ: boolean 2020-11-04 07:30:21.467 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: false Typ: boolean
@Chrille1507 sagte in Skript reagiert plötzlich anders:
Kleiner Nachtrag, einen Log über den Datenpunkt "0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy" konnte er auch nicht erzeugen, weil ich Idiot ja das Skript beendet hatte, bevor ich gegangen bin. Bin ich blöd....
Zwischen den beiden oben angegebenen Zeilen muss sich der Datenpunkt geändert haben. Dementsprechend muss es auch einen Eintrag dazu im Log geben. Kannst du bitte mal auf der Log-Seite im Log schauen, nicht im am JS Editor angehängten Log ?
Zusätzlich hilft es wenn du auch vor dem SendTo einen log-Eintrag erzeugst, damit du rein im Log feststellen kannst das er da lang gegangen ist.
A.
-
Ich habe alle Daten aus dem Log und da hat gibt es keinen Eintrag. Ich bin wirklich jeden einzelnen Punkt (ich muss den Radar2-Adapter deaktivieren ) durchgegangen.
Ich habe jetzt noch ein Log in meine Anwesenheitserfassung eingebaut. Das Skript sieht so aus
//Anwesenheit Peggy oder Christian on({id: beideanwesenheit, change:"ne"}, function(obj) { if (getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Peggy").val==true || getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian").val==true) { setState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy", true); log('AnwesenheitBeide geändert auf ' + getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy").val); } else { setState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy", false); log('AnwesenheitBeide geändert auf ' + getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy").val); sendTo('telegram.0', {text: "Es ist niemand mehr zu Hause"}); }; log('AnwesenheitBeide geändert auf ' + getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy").val); });
Und jetzt auch mit den Anwesenheiten gespielt. Dazu gibt das Log folgendes aus:
2020-11-04 09:10:10.556 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: false Typ: boolean 2020-11-04 09:10:10.558 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: false Typ: boolean 2020-11-04 09:10:10.558 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: false Typ: boolean 2020-11-04 09:10:12.559 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: true Typ: boolean 2020-11-04 09:10:12.559 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: false Typ: boolean 2020-11-04 09:10:32.531 - info: javascript.0 (12613) script.js.Alarmanlage.An-_und_Abwesenheit.Anwesenheiten: AnwesenheitBeide geändert auf false 2020-11-04 09:10:32.532 - info: javascript.0 (12613) script.js.Alarmanlage.An-_und_Abwesenheit.Anwesenheiten: AnwesenheitBeide geändert auf false 2020-11-04 09:10:32.538 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend was changed to true source = system.adapter.javascript.0 2020-11-04 09:10:49.046 - info: javascript.0 (12613) script.js.Alarmanlage.An-_und_Abwesenheit.Anwesenheiten: AnwesenheitBeide geändert auf true 2020-11-04 09:10:49.047 - info: javascript.0 (12613) script.js.Alarmanlage.An-_und_Abwesenheit.Anwesenheiten: AnwesenheitBeide geändert auf true 2020-11-04 09:10:49.108 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend was changed to false source = system.adapter.javascript.0 2020-11-04 09:11:03.046 - info: javascript.0 (12613) script.js.Alarmanlage.An-_und_Abwesenheit.Anwesenheiten: AnwesenheitBeide geändert auf false 2020-11-04 09:11:03.047 - info: javascript.0 (12613) script.js.Alarmanlage.An-_und_Abwesenheit.Anwesenheiten: AnwesenheitBeide geändert auf false 2020-11-04 09:11:03.098 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend was changed to true source = system.adapter.javascript.0 2020-11-04 09:11:34.032 - info: javascript.0 (12613) script.js.Alarmanlage.An-_und_Abwesenheit.Anwesenheiten: AnwesenheitBeide geändert auf true 2020-11-04 09:11:34.034 - info: javascript.0 (12613) script.js.Alarmanlage.An-_und_Abwesenheit.Anwesenheiten: AnwesenheitBeide geändert auf true 2020-11-04 09:11:34.128 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend was changed to false source = system.adapter.javascript.0 2020-11-04 09:11:57.086 - info: javascript.0 (12613) script.js.Alarmanlage.An-_und_Abwesenheit.Anwesenheiten: AnwesenheitBeide geändert auf false 2020-11-04 09:11:57.086 - info: javascript.0 (12613) script.js.Alarmanlage.An-_und_Abwesenheit.Anwesenheiten: AnwesenheitBeide geändert auf false 2020-11-04 09:11:57.138 - info: javascript.0 (12613) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend was changed to true source = system.adapter.javascript.0
Hier muss der Fehler stecken, ich konnte ihn aber bisher nicht finden.
-
Ich habe nochmal am Skript für die Anwesenheit gearbeitet und werde jetzt erstmal folgende Einstellung testen:
//Anwesenheit Peggy oder Christian on({id: beideanwesenheit, change:"ne"}, function(obj) { let anwP = getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Peggy").val; let anwC = getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian").val; if (anwP==true || anwC==true) { setState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy", true); log('AnwesenheitBeide geändert auf ' + '"' + getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy").val + '"'); } else { setState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy", false); log('AnwesenheitBeide geändert auf ' + '"' + getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy").val + '"'); sendTo('telegram.0', {text: "Es ist niemand mehr zu Hause"}); }; log('AnwesenheitBeide geändert auf ' + '"' + getState("0_userdata.0.Alarmanlage.Anwesenheit_Übersicht.Anwesenheit_Christian_und_Peggy").val + '"'); });
-
Kleines Update. Das Problem besteht weiterhin.
javascript.0 2020-11-04 11:36:33.932 info (28278) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: false Typ: boolean javascript.0 2020-11-04 11:36:33.931 info (28278) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: true Typ: boolean javascript.0 2020-11-04 11:36:30.324 info (28278) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: false Typ: boolean javascript.0 2020-11-04 11:36:30.324 info (28278) script.js.Alarmanlage.Alarmanlage_ausgelöst: anwesend: false Typ: boolean javascript.0 2020-11-04 11:36:30.319 info (28278) script.js.Alarmanlage.Alarmanlage_ausgelöst: geschlossen: false Typ: boolean