NEWS
Finde fehler im Script nicht if/else Verschachtelung
-
Ich habe einen Fehler im Script, den ich leider nicht finde.
In dem nachfolgenden Script startet die Aktion4 also letzte if/else nicht. Immer Aktion3 obwohl Aktion4 richtig wäre.
/* Programm Abwesend Kurz Ablösen des CCU2 Programms Mit Hilfe von Jey Cee, Pix und Paul53 */ // Das Einschalten der Alarmierung der INSTAR2 Kamera erfolgt über CCU2 Programm "Anwesend kurz INSTAR2 Balkon Alarm Aus" // Abfrage der Abwesenheit Kurz: var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz var idLichthelligkeit = getState("hm-rega.0.19606").val; // zur besseren Übersicht Lichthelligkeit in eine lokale Variable geschrieben var idAstro = getState('hm-rega.0.7961').val; // zur besseren Übersicht Astro in eine lokale Variable geschrieben /* log('Abwesend Kurz = ' + getState('hm-rega.0.2330').val); log('Abwesend = ' + getState('hm-rega.0.950').val); log('Taster = ' + getState('hm-rpc.0.MEQ0670647.2.PRESS_SHORT').val); */ // lange, ausführliche Schreibweise on({ id: idAbwesendKurzVariable, // Datenpunkt der Überwachung change: 'ne' // auf Änderung }, function (obj2) { // den neuen Wert der Änderung checken if (obj2.state.val === false){ // wenn neuer Wert false // aktuelle Abfrage der zweiten Variable - also nur prüfen if (idAstro === false){ // wenn Astro ist Nacht if (idLichthelligkeit === false){ // wenn Lichthelligkeit ist Dunkel starteAktion2(); // Funktion1 (Abwesend Kurz zurück und Astro Nacht und Lichthelligkeit Dunkel aufrufen } }else{ // idAstro gleich true (Wenn Astro ist Tag) if (idLichthelligkeit === true){ starteAktion3(); } else{ //idLichthelligkeit === false (Wenn Lichthelligkeit dunkel) starteAktion4(); } } } } ); function starteAktion2() { //Nachts und Dunkel // Aktionen setState("hm-rpc.1.CUX4000002.2.PRESS_SHORT", true); // (Gruppe) Deko Licht An/Aus.PRESS_SHORT setState("hm-rpc.1.CUX4000002.1.PRESS_SHORT", true); // (Gruppe) Steckdosenleiste 1+2 An/Aus.PRESS_SHORT setState("hm-rega.0.56427", true); // Lichthelligkeit Anzeige An Trigger setState("hm-rpc.0.KEQ0926589.2.STATE", true); //Teichlicht.STATE setState("hm-rpc.0.KEQ0926570.2.STATE", true); //BlumenRGB-Stripe.STATE setState("hm-rpc.0.MEQ1711639.1.STATE", true); //Kugellampen.STATE setState("hm-rega.0.18930", true); // Bewegungsmelder aktiv ist falsch setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,22"); // MP3 Funkgong log('Nachts und Dunkel'); // verzögerte Aktionen einfügen setStateDelayed("hm-rpc.1.CUX4000001.8.PRESS_SHORT", true, 3 * 1000); // Intel16000 WoL.PRESS_SHORT nach 3 Sekunden } function starteAktion3() { //Tags und Hell // Aktionen setState("hm-rpc.1.CUX4000002.1.PRESS_SHORT", true); // (Gruppe) Steckdosenleiste 1+2 An/Aus.PRESS_SHORT setState("hm-rega.0.18930", true); // Bewegungsmelder aktiv ist falsch setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,21"); // MP3 Funkgong (Abwesend Kurz Zurück und Astro Tag und Lichthelligkeit Hell) log('Tag und Hell'); // verzögerte Aktionen einfügen setStateDelayed("hm-rpc.1.CUX4000001.8.PRESS_SHORT", true, 3 * 1000); // Intel16000 WoL.PRESS_SHORT nach 3 Sekunden } function starteAktion4() { //Tags und Dunkel // Aktionen setState("hm-rpc.1.CUX4000002.2.PRESS_SHORT", true); // (Gruppe) Deko Licht An/Aus.PRESS_SHORT setState("hm-rpc.1.CUX4000002.1.PRESS_SHORT", true); // (Gruppe) Steckdosenleiste 1+2 An/Aus.PRESS_SHORT setState("hm-rega.0.56427", true); // Lichthelligkeit Anzeige An Trigger setState("hm-rega.0.18930", true); // Bewegungsmelder aktiv ist falsch setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,23"); // MP3 Funkgong (Abwesend Kurz Zurück und Astro Tag und Lichthelligkeit Hell) log('Tag und Dunkel'); // verzögerte Aktionen einfügen setStateDelayed("hm-rpc.1.CUX4000001.8.PRESS_SHORT", true, 3 * 1000); // Intel16000 WoL.PRESS_SHORT nach 3 Sekunden }
Danke für Eure Hilfe
Gruß Zippolighter
-
Hallo Zippolighter,
in der Deklaration deiner Variable lässt du gleich den Wert des Objektes speichern. Das passiert nur beim Skriptstart. Das ist falsch:````
var idLichthelligkeit = getState("hm-rega.0.19606").val; // zur besseren Übersicht Lichthelligkeit in eine lokale Variable geschrieben
var idAstro = getState('hm-rega.0.7961').val; // zur besseren Übersicht Astro in eine lokale Variable geschriebenvar idLichthelligkeit ="hm-rega.0.19606"; // Namen des Datenpunktes in Variable schreiben, damit später übersichtlicher abgefragt werden kann
idAstro = 'hm-rega.0.7961';Dann in der Subscription (on) diese beiden Datenpunkten am Anfang einmal abfragen und den Wert in eine Variable schreiben. Das passiert dann immer, wenn sich der Wert von __idAbwesendKurzVariable__ ändert. Zur Zeit fragt dein Skript nach Wert, der zum Skriptstart gespeichert wurde. Es wird dann immer nur das ELSE ausgeführt. Ich schriebe mal alles zusammen (mit den hier im Forum üblichen Bezeichnungen):
/* Programm Abwesend Kurz
Ablösen des CCU2 Programms
Mit Hilfe von Jey Cee, Pix und Paul53
/
// Das Einschalten der Alarmierung der INSTAR2 Kamera erfolgt über CCU2 Programm "Anwesend kurz INSTAR2 Balkon Alarm Aus"
// Abfrage der Abwesenheit Kurz:
var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz
var idLichthelligkeit = "hm-rega.0.19606";
var idAstro = 'hm-rega.0.7961';
/
log('Abwesend Kurz = ' + getState('hm-rega.0.2330').val);
log('Abwesend = ' + getState('hm-rega.0.950').val);
log('Taster = ' + getState('hm-rpc.0.MEQ0670647.2.PRESS_SHORT').val);
*/
// lange, ausführliche Schreibweise
on({
id: idAbwesendKurzVariable, // Datenpunkt der Überwachung
change: 'ne' // auf Änderung
}, function (obj2) {
var helligkeit = getState(idLichthelligkeit).val,
astro = getState(idAstro).val;
// den neuen Wert der Änderung checken
if (obj2.state.val === false){ // wenn neuer Wert false
// aktuelle Abfrage der zweiten Variable - also nur prüfenif (astro === false){ // wenn Astro ist Nacht if (helligkeit === false){ // wenn Lichthelligkeit ist Dunkel starteAktion2(); // Funktion1 (Abwesend Kurz zurück und Astro Nacht und Lichthelligkeit Dunkel aufrufen } }else{ // astro gleich true (Wenn Astro ist Tag) if (helligkeit === true){ starteAktion3(); } else{ //helligkeit === false (Wenn Lichthelligkeit dunkel) starteAktion4(); } } } }
);
Darf ich fragen, ob das mit einem Skripteditor, wie ScriptGUI erstellt wurde? Die Aktionen durchzuzählen macht den Code ziemlich unleserlich. __starteAktion2__ sollte z.B. besser __starteNachtsDunkel__ heißen. Nochmal kurz zur Benennung der Variablen. Ich halte es so: Oben im Skript setz ich die Namen/Bezeichnungen der Datenpunkte (zB __hm-rpc.0.xxxx.STATE__) als Zeichekette in Variablen mit passenden Namen. Das Prefix __id__ sagt mir später, dass es sich um einen Datenpunkt handelt. Also zB __idWassermelder__. Wenn ich in eine Subscription diesen Datenpunkt verwende, kann ich einfach den Variablennamen in der Subscription verwenden: on(id: __idWassermelder__, function() … Wenn ich einen Wert dieses Objektes abfragen möchte, brauche ich zB den Befehl getState mit dem Appendix Typ Wert getState(__idWassermelder__).val für den Wert getState(__idWassermelder__).ts für den Timestamp … Funktionen lassen sich gut strukturiert benennen, wenn man das, was die Funktion tut auch in den Namen schreibt. Ein neues Wort mit einem Großbuchstaben zu beginnen, spart Unterstriche, Leerzeichen sind (glaube ich) nicht erlaubt. berechneTaupunkt() ermittleMaxWert() holeScreenshot() Viele Grüße Pix
-
Hier nochmal die Kurzschreibweise
/* Programm Abwesend Kurz Ablösen des CCU2 Programms Mit Hilfe von Jey Cee, Pix und Paul53 */ // Das Einschalten der Alarmierung der INSTAR2 Kamera erfolgt über CCU2 Programm "Anwesend kurz INSTAR2 Balkon Alarm Aus" // Abfrage der Abwesenheit Kurz: var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz idLichthelligkeit = "hm-rega.0.19606", idAstro = 'hm-rega.0.7961'; // kurze Schreibweise on(idAbwesendKurzVariable, function (obj) { var helligkeit = getState(idLichthelligkeit).val, astro = getState(idAstro).val; if (!obj.state.val) { // wenn neuer Wert false if (!astro) { // wenn Astro ist Nacht if (!helligkeit) starteAktion2(); } else { // wenn Astro ist Tag if (helligkeit) starteAktion3(); else starteAktion4(); } } });
-
Danke schonmal für die super Erklärung.
Ist alles von Hand geschrieben, ohne Scripteditor aber mit Hilfe von Forummitgliedern.
Werde dies testen und berichten.
Gruß Zippolighter
-
Kleine Anregungen:
Das Ereignis soll letztendlich nur ausgeführt werden, wenn der Wert von idAbwesendKurzVariable false wird. Hier dürfte es effizienter sein, die Prüfung gleich bei on() vorzunehmen:
on({id: idAbwesendKurzVariable', value: false},...)
Da Programm würde sich dadurch noch mal verkürzen.
/* Programm Abwesend Kurz Ablösen des CCU2 Programms Mit Hilfe von Jey Cee, Pix und Paul53 */ // Das Einschalten der Alarmierung der INSTAR2 Kamera erfolgt über CCU2 Programm "Anwesend kurz INSTAR2 Balkon Alarm Aus" // Abfrage der Abwesenheit Kurz: var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz idLichthelligkeit = "hm-rega.0.19606", idAstro = 'hm-rega.0.7961'; // kurze Schreibweise on({id: idAbwesendKurzVariable, value: false}, function (obj) { var helligkeit = getState(idLichthelligkeit).val, astro = getState(idAstro).val; if (!astro) { // wenn Astro ist Nacht if (!helligkeit) starteAktion2(); } else { // wenn Astro ist Tag if (helligkeit) starteAktion3(); else starteAktion4(); } });
Warum verwendest Du Variablen von der Homematic? Wenn es geht solltest DU in Betracht ziehen, dass zu ändern. Die Variablen von Homematic werden nur von Zeit zu Zeit aktualisiert (gewollt). Daher kann es zu deutlichen Verzögerungen kommen. Ich habe bei mir nach und nach alle Abhängigkeiten der Homematic soweit möglich entfernt. Auch der Zustand Tag/Nacht wäre ein Punkt den man nach ioBroker verschieben könnte.