Ampelsteuerung mit Shelly Plus RGBW PM -- Script-Problem

VPN/Proxy erkannt

Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.

  • 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:

    Code
    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!

  • Generell sollte Ampel nur ein einziges Mal definiert- und im nachfolgenden nur der Wert gesetzt werden. Denn wenn z.B. Schalter einen Zustand erreicht, der von dir nicht gehändelt wird, ist Ampel undefiniert, erst recht, weil es in deinem Switch/Case keinen Default gibt. Ist Schalter also z.B. NaN, oder größer als 5 bzw. kleiner als 0, ist Ampel zwangsläufig undefiniert.

    Also:

    JavaScript
    let Schalter = 1 * S1 + 2 * S2 + 3 * S3 + 4 * S4;
    let Ampel = 0; // Standardwert
    
    // ....
    
    Ampel = 123;
    
    // ...
    
    Ampel = 456;

    Andererseits hätte ich vermutlich noch eine Vielzahl von Optimierungen vorzuschlagen :D

    Für Schalter bitte auch Punkt vor Strich beachten :P

    Zu Hause ist, wo dein WiFi sich automatisch verbindet und dein Smarthome dich freundlicher begrüßt als dein Haustier.

  • Danke SoftCreatR für die schnelle Antwort. Die ganzen Definitionen habe ich erst heute eingefügt -- als letzten Versuch vor dem Posting hier. Ursprünglich gab es nur eine im Init, die da jetzt auskommentiert ist. Ich hab' auch schon andere Namen versucht und stundenlang andere (JavaScript-) Foren durchsucht.

    Die Rechenformal bei Schalter funktioniert einwandfrei. Leider kann ich den Status der Eingänge nur einzeln abfragen. Hatte gehofft, alle vier in einer Abfrage zu bekommen.

    Klar ist noch reichlich Optimierungspotential vorhanden, doch wegen des Theaters mit der Variabel Ampel bin ich nur froh, wenn der Laden läuft.

  • Ich habe mir das jetzt nochmal angesehen, vor allem die auskommentierten Teile. Ich habe mir einmal die Dokumentationen dazu angesehen:

    Demnach sollte sollte transition_duration grundsätzlich funktionieren. Aber kann es sein, dass der Shelly diese Option nicht so akzeptiert, wie Du es erwartest. Nicht jede Shelly-Version oder jedes Firmware-Update unterstützt alle Parameter wie transition_duration. Bei einigen Geräten oder Firmwares musst Du möglicherweise den Parameter anders nennen oder er wird gar nicht unterstützt. Das müsste man genauer "beleuchten".

    Und zum eigentlichen Code: Ich habe mir mal die Mühe gemacht, diesen umzuschreiben, wie ich denke, dass es funktionieren könnte. Disclaimer: Ich hab kein Shelly-Gerät und kenne mich nicht mit der Programmierung selbiger aus. Meine Aussagen berufen sich auf meine Javascript-Kenntnisse, sowie die API-Dokumentation :)

    Kurz und schmerzlos:

    Zu Hause ist, wo dein WiFi sich automatisch verbindet und dein Smarthome dich freundlicher begrüßt als dein Haustier.

  • Guten Morgen Du Nachtarbeiter ;)

    Danke für den Code -- leider stoppt der mit 'ner Fehlermeldung:

    Code
    Uncaught SyntaxError: Got TEMPLATE LITERAL expected EOF08:20:25
    at print(`Old: ${oldSchalter} Neu: ${Schalter} Ampel: ${Amp...08:20:25
    in function "updateAmpelFromInputs" called from updateAmpelFromInputs();08:20:25
    in function called from system

    Das prüfe ich nachher, während ich Deinen Code genauer studiere und bestimmt was lerne.

    Demnach sollte sollte transition_duration grundsätzlich funktionieren.

    Das hab' ich aus der API-Dokumentation und selbst deren Beispiele, sowohl als Script, wie auch per HTTP verändern den Wert einfach nicht. Hab' ich jeweils über das Web-Interface des Shelly kontrolliert. Auch ein Factory Reset half nicht -- werde ich Mal im Support-Forum ansprechen.

    Vielen Dank für Deine Hilfe!

    Noch ein Wenig Hintergrund, falls jemand die Idee aufgreift: Die Ampel ist aus der Schrottkiste der Stadtverwaltung und eigentlich wollte ich sie über das Development Board Shelly X SM 4 Relays ansteuern, da es hier vier Aus- und vier Eingänge gibt. Doch das Geklapper der Relais hat genervt. Drum hab' ich den Plus RGBW PM genommen, in die Ampel Adapterfassungen von E27 auf GY6.35 geschraubt und dimmbare 4,5 W LEDs von Osram eingesetzt. Die sind lang genug, dass die Reflektoren das Licht voll abstrahlen. Die LEDs leuchten ab 12 % der Leistung (laut Shelly Web-Interface -- etwa 4,5 Volt) und ab ca. 50 % ist keine Zunahme mehr zu erkennen. Die Ampel ist damit so hell, dass man geblendet wird. Für die Programmwahl hab' ich einen fünfstufigen Drehschalter verbaut. In der Ampel ist genug Platz, auch für das Netzteil mit 12 Volt, 3 Ampere. Als Party-Beleuchtung ganz witzig...

  • Dieses Thema enthält 7 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind.