Twinkly Weihnachtsbeleuchtung: Einschalten

Begonnen von gestein, 25 November 2021, 11:30:31

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

ich wollte gestern meine Twinkly ICICLE auch in fhem einbinden.
Vorgegangen bin ich nach dieser Anleitung von peterk_de.
https://forum.fhem.de/index.php/topic,93197.msg1004834.html#msg1004834

Das scheint auch zu funktionieren. Danke dafür.

Allerdings habe ich meine Probleme mit dem Einschalten.
Anscheinend gibt es kein einfaches "on", sondern man muss einen mode aus den folgenden Möglichkeiten auswählen:

  • off - turns off lights
  • color - shows a static color
  • demo - starts predefined sequence of effects that are changed after few seconds
  • movie - plays predefined or uploaded effect. If movie hasn't been set (yet) code 1104 is returned.
  • rt - receive effect in real time
  • effect - plays effect with effect_id
  • playlist

Da bei mir noch kein movie gesetzt war, kommt halt einfach nur der Fehler 1104.
Kennt jemand eine Möglichkeit den letzten Modus aufzurufen?

Immerhin kann man z.B. den Modus einfach wechseln, mit dem eingeschaltet wird.
Wenn man z.B. die letzte statische Farbe mit "an" einschalten will, dann ändert man das Attribut eventmap:
eventMap /mode off:aus/mode color:an/.

Allerdings ändert sich der Status (zumindest bei mir) erst, wenn wieder mal ein Update aufgerufen wird.

Danke, lg, Gerhard

gestein

#1
Hallo,

ich habe mich in den letzten Tagen etwas mit meinen Twinklys und der Einbindung in fhem beschäftigt.
Eigentlich wollte ich die per MQTT einbinden, das funktioniert aber wahrscheinlich nur bei der Firmware Version F.
Ich habe beim mir Firmware Version G, damit läuft die Verbindung über TLS.
An das Zertifikat kommt man aber nicht.
Selbst Twinkly sagt njet und verweist auf Anfrage nur auf die inoffiziellen API-Dokumentationen im Netz.
Es gibt nix Offizielles dazu.
Bleibt also der Weg über HTTPMOD und das funktioniert eh ganz gut.

Mich hat bisher gestört, dass man nicht sieht, wenn das Device offline ist.
Falls es jemand brauchen kann, hier meine Lösung zusätzlich zur Anleitung von peterk_de.
attr wz.wbaum showError 1
attr wz.wbaum stateFormat {my $err=ReadingsVal($name,"LAST_ERROR",""); (($err =~ "timed out")&&(ReadingsTimestamp($name,"mode",0) lt ReadingsTimestamp($name,"LAST_ERROR",0)))? "offline":ReadingsVal($name,"mode","Error");}

Wenn jemand weiß, wie man das besser abfängt, bitte lasst es mich wissen.

Falls noch jemand die entsprechende Funktion benötigt um am Twinkly etwas zu ändern (hier als Bespiel die MQTT Einstellungen):
attr wz.wbaum set02Data {"broker_host":"192.168.0.xxx","broker_port":1883,"client_id":"E8DB840EDCA1","user":"xxxx","keep_alive_interval":60}
attr wz.wbaum set02Name set_MQTT
attr wz.wbaum set02URL http://192.168.0.xxx/xled/v1/mqtt/config


Und hier die Ergänzung zum Auslesen von Parametern, die nicht-public sind (hier z.B. MQTT):
attr wz.wbaum get02Header1 Content-Type: application/json
attr wz.wbaum get02Header2 X-Auth-Token: $sid
attr wz.wbaum get02Name MQTT
attr wz.wbaum get02URL http://192.168.0.xxx/xled/v1/mqtt/config


lg, Gerhard

Edit: Mir ist noch im laufenden Betrieb aufgefallen, dass das Reading "LAST_ERROR" nicht zurückgesetzt wird, wenn Twinkly wieder online ist.
Daher muss man das stateFormat anpassen (siehe korrigierte Version oben).
Edit2: von der Funktion "ReadingsTimestamp" wird ein String zurückgegeben, daher muss man nicht mit "<" sondern mit "lt" prüfen.
Der Code wurde korrigiert.

Beowulf

#2
Hallo gestein,

Danke für Dein Scripting hier. Dein erstes Coding würde ich auch bei mir (Twinkly Strings 2nd Gen) gerne einbauen, aber ich bekomme dabei folgende Fehlermeldung:


Missing right curly or square bracket at (eval 21195) line 1, at end of line
syntax error at (eval 21195) line 1, at EOF

Unknown command (($err, try help.
Unknown command }, try help.


Ich sehe ich an Deinem Scripting weder eine fehlende geschweifte Klammer, noch eine fehlende eckige Klammer. Magst Du den Codeschnipsel nochmal checken, please?

Vielen Dank im Voraus.

edit:
Ich habe gerade bemerkt, dass eine direkte Eintragung (also nicht über die Eingabeleiste oben im FHEM Bereich) scheinbar funktionert: {my $err=ReadingsVal($name,"LAST_ERROR",""); (($err =~ "timed out")&&(ReadingsTimestamp($name,"mode",0)<ReadingsTimestamp($name,"LAST_ERROR",0)))? "offline":ReadingsVal($name,"mode","Error");}

Sehe ich es richtig, dass bei einem Fehler das Reading "mode" von z. B. "movie" auf Error" "umstellt?

Beowulf

Schade. Zu früh gefreut. Leider zeigt mir mein Log jetzt doch noch Fehler an:

2021.12.23 00:06:13 1: PERL WARNING: Argument "2021-12-22 23:58:40" isn't numeric in numeric lt (<) at (eval 7324) line 1.
2021.12.23 00:06:13 3: eval: my $err=ReadingsVal($name,"LAST_ERROR",""); (($err =~ "timed out")&&(ReadingsTimestamp($name,"mode",0)<ReadingsTimestamp($name,"LAST_ERROR",0)))? "offline":ReadingsVal($name,"mode","Error");

gestein

#4
Hallo Beowolf,

Das mit der Erkennung des Timeout-Fehlers funktioniert leider eh noch nicht so wie gedacht.
Hiermit sollte der Fehlerzumindest angezeigt werden:
attr wz.wbaum stateFormat {my $err=ReadingsVal($name,"LAST_ERROR",""); (($err =~ "timed out")&&(ReadingsTimestamp($name,"mode",0) lt ReadingsTimestamp($name,"LAST_ERROR",0)))? "offline":ReadingsVal($name,"mode","Error");}

Oder Du lässt die Zeile weg und nimmst die Lösung von peterk_de:
attr wz.wbaum stateFormat mode

Das Reading "mode" wird bei meiner Lösung nicht verändert.
Es wird nur das state verändert.
Normalerweise wird der Inhalt von "mode" angezeigt, bei mir dann halt entsprechend ein anderer Text.

Am besten, Du verwendest zur Eingabe der Befehle das "+".
Damit sollte es ohne Probleme einzugeben sein.

Und bitte noch die IP-Adresse und den Names des Devices korrigieren.

lg, Gerhard

Edit: stateFormat ergänzt.

Beowulf

Hallo Gerhard,

schade, da hatte ich es wohl falsch verstanden. Ich dachte die Fehleranzeige funktioniert schon. Danke aber für Deinen Einsatz.

Bei Deinem Code:
Zitat
attr wz.wbaum {my $err=ReadingsVal($name,"LAST_ERROR",""); (($err =~ "timed out")&&(ReadingsTimestamp($name,"mode",0) lt ReadingsTimestamp($name,"LAST_ERROR",0)))? "offline":ReadingsVal($name,"mode","Error");}

bekomme ich leider folgende Fehlermeldung:
wz.wbaum: bad attribute name '{my' (allowed chars: A-Za-z/\d_\.-)
Unknown command (($err, try help.
Unknown command }, try help.


Verstehe ich es richtig, dass da nach dem attr wz.wbaum noch ein Argument kommen müsste (z. B. stateFormat)? wz.wbaum habe ich natürlich auf meinen Namen angepasst.  ;)

Damit wäre dann die Zeile ja wieder die aus Deinem Eingangspost, oder?

Zitat
attr wz.wbaum stateFormat {my $err=ReadingsVal($name,"LAST_ERROR",""); (($err =~ "timed out")&&(ReadingsTimestamp($name,"mode",0) lt ReadingsTimestamp($name,"LAST_ERROR",0)))? "offline":ReadingsVal($name,"mode","Error");}

Zitat
Oder Du lässt die Zeile weg und nimmst die Lösung von peterk_de:
attr wz.wbaum stateFormat mode

Habe ich jetzt auch tatsächlich so gemacht.  :)

Zitat
Das Reading "mode" wird bei meiner Lösung nicht verändert.
Es wird nur das state verändert.
Normalerweise wird der Inhalt von "mode" angezeigt, bei mir dann halt entsprechend ein anderer Text.

Alles klar, verstehe. Danke für die Klarstellung.

Zitat
Am besten, Du verwendest zur Eingabe der Befehle das "+".
Damit sollte es ohne Probleme einzugeben sein.

Leider nicht. Auch in dem Fall erhalte ich die Fehlermeldung:
ZitatMissing right curly or square bracket at (eval 910069) line 1, at end of line
syntax error at (eval 910069) line 1, at EOF

Unknown command (($err, try help.
Unknown command }, try help.

Die Eingabe über das "+"-Zeichen ist aber ohnehin ein guter Hinweis. Danke.

Zitat
Und bitte noch die IP-Adresse und den Names des Devices korrigieren.
Klar, aber Danke auch für den Reminder.  ;D

lg, Frank

gestein

#6
Hallo Beowolf,

da muss ich wohl auch noch einiges lernen ;)

Du hast recht, in meiner Version habe ich nun das Attribut "stateFormat" vergessen.
Bitte entschuldige - ohne Attribut kann es natürlich nicht klappen.

Ich habe es oben nochmals korrigiert.

Im Prinzip funktioniert die Lösung schon. Es wird "offline" angezeigt.
Aber es gibt ein paar Spezialfälle, wo es eben nicht stimmt, z.B. wenn nämlich "mode" nicht gesetzt ist.
Das kann man aber auch als Feature sehen ;-)

Die neue Zeile für stateFormat ist fast die gleiche, nur wird "lt" statt "<" verwendet.

lg, Gerhard