Hallo,
ich baue gerade eine Ampel und hab' dabei zwei Probleme mit einem Shelly Plus RGBW PM:
Zum ersten funktioniert bei "Light.set" der Parameter 'transition_duration' nicht. Egal welche Werte ich übergebe, es wird ignoriert und das Script stoppt. Hat das noch jemand, bzw. kenn jemand ein work around dazu?
Zum zweiten spielt eine Variable nicht mit:
Per "Timer.set" rufe ich alle 500 mSec die Function "loop" auf. Darin wird mit der Variablen "Ampel" per "switch/case" die jeweilige Funktion geschaltet. Das funktioniert auch gut. Über die Eingänge des Shelly möchte ich die Funktion umschalten, indem ich "Ampel" einen neuen Wert zuweise. Doch das klappt gar nicht und ich finde keinen Fehler.
In loop frage ich zuerst die Eingänge ab, setze die Variable "Schalter" entsprechend und vergleiche sie mit der vorherigen Schalterstellung in oldSchalter. Bei einer Änderung setze ich "Ampel" auf den neuen Startwert. Das wird auch ausgeführt, wie ich durch die print-Befehle in der Console sehen kann.
Aber schon 4 Zeilen weiter kennt das Script die Variable Ampel nicht mehr und stoppt mit einer Fehlermeldung. Wenn ich beim Init (ganz unten) der "Ampel" einen Wert zuweise, werden die Neuzuweisungen durch die Schalterstellungen komplett ignoriert. Eine Variable kann doch nicht zweimal existieren.
Daran verzweifle ich gerade. Wo mach' ich den Denkfehler?
Hier die Ausgabe der Console:
Old: 10 Neu: 0 Ampel: 0 number 15:23:46
Uncaught ReferenceError: "Ampel" is not defined 15:23:47
at case 101: // gelb blinken 15:23:47
^ 15:23:47
in function called from system 15:23:47
1. Zeile: Ampel ist als number definiert und hat den Wert 0
2. Zeile: Im nächsten Schritt ist die Variable nicht mehr definiert. Wieso?
Nachfolgend das komplette Listing:
(Ja, das kann man bestimmt viel besser machen, aber ich möchte das ganze erstmal am Laufen haben, denn es ist ein Weihnachtsgeschenk für die Bar meines Schwiegersohns
Danke für jeden Hinweis!
// Ampel 2
// für Shelly Plus RGBW PM
/*
Var Ampel:
0 = alle aus
Gelb Blinklicht
101 = Gelb für xx an
102 = Gelb für xx aus, dann wieder 101
Normale Ampel
201+202 = Grün für xx
203+204 = Gelb für xx
205+206 = Rot für xx
207+208 = Rot/Gelb für xx, dann wieder 201
Lauflicht
301 = Rot für xx mit dimmen?
302 = Gelb für xx mit dimmen?
304 = Grün für xx mit dimmen? dann wieder 301
*/
function AlleAus() {
// Shelly.call("Light.set", {'id': 0, 'on': false, 'brightness': 20, 'transition_duration': 0});
// das geht nicht!
Shelly.call("Light.set", {'id': 0, 'on': false, 'brightness': hell});
Shelly.call("Light.set", {'id': 1, 'on': false, 'brightness': hell});
Shelly.call("Light.set", {'id': 2, 'on': false, 'brightness': hell});
Shelly.call("Light.set", {'id': 3, 'on': false, 'brightness': hell});
};
function loop() {
// Eingänge auswerten = Schalterstellung
let S1 = Shelly.getComponentStatus("input:0").state;
let S2 = Shelly.getComponentStatus("input:1").state;
let S3 = Shelly.getComponentStatus("input:2").state;
let S4 = Shelly.getComponentStatus("input:3").state;
let Schalter = 1 * S1 + 2 * S2 + 3 * S3 + 4 * S4;
if (oldSchalter != Schalter) {
switch (Schalter) {
case 0:
let Ampel = 0;
break;
case 1:
let Ampel = 101;
break;
case 2:
let Ampel = 201;
break;
case 3:
let Ampel = 301;
break;
case 4:
let Ampel = 0;
break;
}
print("Old: " + oldSchalter + " Neu: " + Schalter + " Ampel: " + Ampel + " " + typeof(Ampel));
oldSchalter = Schalter;
}
switch (Ampel) {
case 101: // gelb blinken
print("Blinklicht");
Shelly.call("Light.set", {"id": 1, 'on': true});
let Ampel = 102;
break;
case 102:
Shelly.call("Light.setAll", {'on': false});
let Ampel = 101;
break;
case 201: // rot, gelb, grün
print("Rot/Gelb/Grün");
Shelly.call("Light.set", {'id': 2, 'on': true}); //Grün an
Shelly.call("Light.set", {'id': 1, 'on': false}); //Gelb aus
Shelly.call("Light.set", {'id': 0, 'on': false}); //Rot aus
LoopCount = 0;
let Ampel = 202; // Grünphase vorbereiten
break;
case 202: // Grünphase
LoopCount ++;
if (LoopCount > 6) { let Ampel = 203; }
break;
case 203: // Gelbphase vorbereiten
Shelly.call("Light.set", {'id': 1, 'on': true}); //Gelb an
Shelly.call("Light.set", {'id': 2, 'on': false}); //Grün aus
LoopCount = 0;
let Ampel = 204; // Gelbphase
break;
case 204: // Gelbphase
LoopCount ++;
if (LoopCount > 4) { let Ampel = 205; }
break;
case 205: // Rotphase vorbereiten
Shelly.call("Light.set", {'id': 0, 'on': true}); //Rot an
Shelly.call("Light.set", {'id': 1, 'on': false}); //Gelb aus
LoopCount = 0;
let Ampel = 206; // Rotphase
break;
case 206: // Rotphase
LoopCount ++;
if (LoopCount > 6) { let Ampel = 207; }
break;
case 207: // Rot/Gelbphase vorbereiten
LoopCount = 0;
let Ampel = 208; // Rot/Gelbphase
Shelly.call("Light.set", {'id': 1, 'on': true}); //Gelb an
break;
case 208: // Rot/Gelbphase
LoopCount ++;
if (LoopCount > 2) { let Ampel = 201; }
break;
case 301: // Lauflicht vorbereiten
print("Lauflicht");
AlleAus();
LoopCount = 0;
let Ampel = 302;
Shelly.call("Light.set", {'id': 0, 'on': true});
break;
case 302:
LoopCount ++;
if (LoopCount > 2) { let Ampel = 303; }
break;
case 303:
Shelly.call("Light.set", {'id': 0, 'on': false});
Shelly.call("Light.set", {'id': 1, 'on': true});
LoopCount = 0;
let Ampel = 304;
break;
case 304:
LoopCount ++;
if (LoopCount > 2) { let Ampel = 305; }
break;
case 305:
Shelly.call("Light.set", {'id': 1, 'on': false});
Shelly.call("Light.set", {'id': 2, 'on': true});
LoopCount = 0;
let Ampel = 306;
break;
case 306:
LoopCount ++;
if (LoopCount > 2) { let Ampel = 307; }
break;
case 307:
Shelly.call("Light.set", {'id': 2, 'on': false});
Shelly.call("Light.set", {'id': 0, 'on': true});
LoopCount = 0;
let Ampel = 308;
break;
case 308:
LoopCount ++;
if (LoopCount > 2) { let Ampel = 302; }
break;
case 0: // alles aus
AlleAus();
}
}
// let Ampel = 0; // Startprogramm 101, 201 oder 301, siehe oben
let hell = 15; // Helligkeit bei Rot/Gelb/Grün und gelb Blinken
// sonstiger init
let LoopCount = 0, oldSchalter = 10, oldAmpel = 0, mainLoop = 0;
AlleAus(); // alles aus und auf Startwerte
// 'transition_duration' geht hier nicht, führt zu Abbruch!
myTimer = Timer.set(500, true, loop); // Dauerschleife ;)
Alles anzeigen