Xiaomi Yeelight - Modul

Begonnen von niceday, 28 Oktober 2016, 01:20:25

Vorheriges Thema - Nächstes Thema

niceday

Zitat von: thaliondrambor am 13 November 2016, 10:45:29
Also die feste IP habe ich über die FritzBox vergeben. Da kann man einfach ein Häkchen machen, dann vergibt die FritzBox immer die selbe IP an das Gerät (identifizieren über die MAC-Adresse). So bekommen alle relevanten Geräte bei mir eine feste IP, ansonsten würde ja so gut wie nichts hunderprozentig laufen, wenn die bei jedem Lease eine neue bekommen würden.
Ich habe keine Fritzbox sondern den Telekom-Router, hier kann man zwar die IP und Macadressen sehen, jedoch nicht fest zuordnen, daher muss ich halt immer alle 3 Wochen (kann man ja einstellen wann DHCP neue Adressen vergibt) bzw. bei ggfs. Router Neustart, die neue Adresse raussuchen und das Skript anpassen.

herrmannj

hast Du mal geprüft ob in diesem Fall der hostname bleibt ? Oft werden ja die hostnamen aus der Kombination mac gebildet.

Btw, das keine statischen Adressen gehen (wenn dem wirklich so ist) wäre ein Armutszeugnis für die speedport ...

vg
joerg

niceday

#17
Zitat von: herrmannj am 13 November 2016, 11:58:00
hast Du mal geprüft ob in diesem Fall der hostname bleibt ? Oft werden ja die hostnamen aus der Kombination mac gebildet.

Btw, das keine statischen Adressen gehen (wenn dem wirklich so ist) wäre ein Armutszeugnis für die speedport ...

vg
joerg
Jop, der Hostname bleibt, habe eben nochmal eine neue IP erzwungen, die hat sich dann geändert der Hostname jedoch nicht.
Also ich habe schon alles durchgeschaut, kann dem Gerät keine feste IP zuweisen im Speedport, Foto anbei. Man kann nur einen anderen (Host?)-Namen vergeben, oder den Eintrag aus dem DHCP löschen, sonst nichts weiter.

herrmannj

ok, wenn der hostname bleibt könntest Du ja mit dem hostnamen definieren und alles wäre ok.

Für das modul bedeutet dass das fqn in der def möglich sein sollten. Das erzwingt die Notwendigkeit die DNS Auflösung nonblocking durchzuführen. In httputils ist ein Beispiel für non blocking dns req.

vg
joerg

thaliondrambor

#19
Da mir das ganze keine Ruhe lässt und ich aber trotzdem nicht weiß, wie ich ein FHEM-Modul bauen soll, habe ich etwas an dem Script weitergebastelt ;D

Aufgerufen wird es mit bash yeelight.sh [IP-Adresse] [Befehl] [Effekt]

Die IP-Adresse ist glaube ich klar. Für den Befehl kann folgendes eingesetzt werden:

  • "on" - Einschalten
  • "off" - Ausschalten
  • "toggle" - Umschalten
  • "dim X" - Auf X% Helligkeit stellen [1-100]
  • "RGB X Y Z" - Auf den Farbwert X Y Z einstellen [0-255]
  • "ct X" - Farbtemperatur einstellen [1700-6500]
  • "hsv X Y" - Farbton [0-359] und Sättigung einstellen [0-100]

Wird für X Y Z nichts oder ein falscher Wert eingegeben, dann wird für die Helligkeit automatisch auf 50% eingestellt und bei der Farbe auf weiß. Das Abfangen der Fehler ist also rudimentär.

Für [EFFEKT] gilt folgendes:
Außerdem kann zu jedem Befehl der Effekt ausgewählt werden (außer zu toggle). Es kann sofort umgeschaltet werden mit "sudden" oder ein Verlauf vom aktuellen Zustand zum gewünschten ausgewählt werden mit "smooth" und der gewünschten Dauer in Millisekunden. Die Standardwerte für den Effekt sind "smooth" und 500.

Beispiele für Befehle:
bash yeelight.sh 192.168.0.15 on
bash yeelight.sh 192.168.0.15 off
bash yeelight.sh 192.168.0.15 toggle
bash yeelight.sh 192.168.0.15 dim 30
bash yeelight.sh 192.168.0.15 dim 0
bash yeelight.sh 192.168.0.15 rgb 100 0 220
bash yeelight.sh 192.168.0.15 rgb
bash yeelight.sh 192.168.0.15 ct
bash yeelight.sh 192.168.0.15 hsv 200 30
bash yeelight.sh 192.168.0.15 on sudden
bash yeelight.sh 192.168.0.15 off smooth 200
bash yeelight.sh 192.168.0.15 RGB 100 0 220


Edit:

v0.0.3:

  • Auswählen des Wechseleffekts [smooth|sudden] mit Dauer
  • Toggle hinzugefügt
  • Farbtemperatur hinzugefügt
  • Farbton und Sättigung hinzugefügt
  • Helligkeit von 0% schaltet die Lampe aus

v0.0.2:

  • Dimmen funktioniert jetzt auch mit Kommazahlen, dabei werden alle Stellen nach dem Komma ignoriert (nötig für Steuerung über Slider in FHEM)
  • Beschreibung und kurze Anleitung hinzugefügt

linuxq

Hallo,

ich habe seit heute mein Yeelight RGB und wollte es gleich in FHEM einbauen. Ich habe die yeelight.sh in "/usr/local/bin/yeelight" kopiert und ausführbar gemacht. In der Konsole mit "/usr/local/bin/yeelight 192.168.178.53 on" etc. funktioniert alles super.

Mein fhem.cfg-Eintrag sieht so aus:

##### Yeelight #####
define Lampe_Yeelight dummy
attr Lampe_Yeelight group Wohnung,Wohnzimmer,Lampen
attr Lampe_Yeelight room Wohnung,Wohnzimmer
attr Lampe_Yeelight webCmd on:off:dim
attr Lampe_Yeelight setList dim:slider,0,1,100
define n_lampe_yeelight_off notify Lampe_Yeelight:off "/usr/local/bin/yeelight 192.168.178.53 off"
define n_lampe_yeelight_on notify Lampe_Yeelight:on "/usr/local/bin/yeelight 192.168.178.53 on"
define n_lampe_yeelight_dimm notify Lampe_Yeelight:dim.* "/usr/local/bin/yeelight 192.168.178.53 dim $EVTPART1"


Allerdings schaltet die Lampe nicht. Im Log erscheint es:
2016-11-15 23:49:56 dummy Lampe_Yeelight off
2016-11-15 23:50:00 dummy Lampe_Yeelight dim 46.0
2016-11-15 23:50:11 dummy Lampe_Yeelight off
2016-11-15 23:50:18 dummy Lampe_Yeelight on


Wo könnte mein Fehler liegen?

Danke für die Entwicklung!!!

LinuxQ

thaliondrambor

#21
Der Aufruf des Shell Scripts muss mit "system()" an das OS gesendet werden. Außerdem ist für das richtige Ausführen auf Systemebene ein "bash" nötig: So sollten deine Notifys funktionieren:
define n_lampe_yeelight_off notify Lampe_Yeelight:off {system('bash /usr/local/bin/yeelight 192.168.178.53 off')};
define n_lampe_yeelight_on notify Lampe_Yeelight:on {system('bash /usr/local/bin/yeelight 192.168.178.53 on')};
define n_lampe_yeelight_dimm notify Lampe_Yeelight:dim.* {system('bash /usr/local/bin/yeelight 192.168.178.53 dim $EVTPART1')};


Du hast die "yeelight.sh" in "yeelight" umbenannt? Ansonsten fehlt auch eventuell noch das ".sh"

linuxq

Danke! Jetzt kann ich die Lampe ein- und ausschalten. Dimmen geht aber nicht. In der Bash beschwert sich das Skript, das eine Ganzzahl erwartet wird:

pi@retropie:~ $ yeelight 192.168.178.53 dim 25.0
/usr/local/bin/yeelight: Zeile 15: [: 25.0: Ganzzahliger Ausdruck erwartet.
{ "id":1, "method":"set_bright", "params":[50,"smooth",500]}\r\n
pi@retropie:~ $


Wie kann ich den Sliderwert zur Ganzzahl konvertieren? Oder ist der Fehler ein anderer?

Danke für die Hilfe nochmal.

Gesendet von meinem BlackBerry DTEK50


thaliondrambor

#23
Gute Frage.
Das liegt am Slider, der den Wert als Kommazahl weitergibt. Ich habe leider nichts gefunden mit dem man das Verhalten des Sliders verändern kann.

Mir fallen zwei Lösungen ein. Entweder den Wert in FHEM erst auf eine Ganzzahl ändern oder das ganze im Script zu machen. Ich schaue mal, ob ich das auf die schnelle hinbekomme. Ich weiß aber nicht, ob ich es heute noch schaffe.

Edit:

Ich habe das Script so angepasst, dass beim Dimmen alles ab dem Punkt (inklusive dem Punkt selbst) abgeschnitten wird. So sollte es mit dem Dimmen klappen über den Slider.

linuxq

Super Danke!  Das muss ich aber leider morgen ausprobieren.

Gesendet von meinem BlackBerry DTEK50


thaliondrambor

Auch wenn ich eigentlich keine Zeit habe, habe ich dann doch an dem Script weiterbasteln müssen  :D

Das Script kann nun auch die Toggle-Funktion, einen Wechseleffekt auswählen, die Farbtemperatur steuern (Weißtöne) und die Farbe über den Farbton und Sättigung steuern. Das neue Script hänge ich in meinem ersten Post an.

cc13

Nicht so schnell, wie soll ich das alles noch in ein Modul bekommen? ;-)

Nein, finde ich prima, was du machst. Ich werde am Wochenende dein Script testen und dir Feedback geben.


thaliondrambor

#27
Naja, viel mehr können die Lampen fast nicht^^

Es fehlen nur noch Timer, Farbfolgen und Schalten zu bestimmten Uhrzeiten.

Was in dem Script fehlt, ist das komplette Auswerten der Antworten von den Lampen. Aber da es einfach eine Weile dauert bis die Antwort kommt, macht es das Script sehr langsam. Hatte mal versucht mit get_probs zu testen, ob die Lampe erreichbar ist und dann auszuwerten, ob sie an oder aus ist. Aber das hat mir alles zu lange gedauert.

Ich habe mich entschieden, mich doch mal mit der Modul-Entwicklung zu befassen. Also erstmal rauszufinden, wie das alles geht, welche Struktur, welche Herangehensweise, welche Regeln. Aber erstmal unabhängig von den Yeelights.

Edit: Momentan scheitert es daran, dass ich es nicht schaffe in Perl mittels TCP die Lampe zu schalten. Der Socket is aufgebaut, die Nachricht an den Server entspricht dem geforderten JSON-Format (wie im Shell Script eben auch), aber die Lampe reagiert nicht. Vielleicht kann mir einer einen Tipp geben, was ich falsch mache. Das Perl-Script hänge ich an (viel auskommentiert, weil ich schon viel rumprobiert habe).

thaliondrambor

Ich habe es mittlerweile auch geschafft, dass ich über den TCP-Socket mit Perl die Lampe schalten kann.
Falls sich wer anderes auch daran versuchen möchte: Damit die Lampen das Ende der Nachricht erkennen, muss das "\r\n" richtig gesendet werden. Dafür darf es nicht mit "" oder '' verpackt werden, sondern mit qq(). Also als Beispiel: $msg = qq({"id":1, "method":"set_power", "params":["on", "smooth", 500]}\r\n);

Ich habe auch eine kleine pm-Datei für FHEM geschrieben. Damit kann man momentan ein-, ausschalten, Helligkeit einstellen und den Farbwert und die Sättigung (HSV). Als Rückgabewert gibt es immer den aktuellen Zustand der Lampe aus. Ich musste noch das CPAN-Modul "Data::Validate::IP" nachinstallieren, da es auf meinem System nicht drauf war. Das Programm nutzt es zum überprüfen der korrekten Eingabe der IP. Eventuell werde ich das demnächst ohne das Modul lösen.

Vielleicht findet sich ja noch einer, der das ganze irgendwie in einem Modul umsetzen kann.

thaliondrambor

Abend,

ich habe mich zwar zwischenzeitlich auch etwas an der Modulentwicklung versucht, aber das ganze Thema, vor allem mit den nonblocking Ports, überfordert mich noch etwas.
Allerdings habe ich in der Zwischenzeit die 99_YeelightUtils.pm etwas weiter entwickelt. Es sind mehr Funktionalitäten der API umgesetzt (noch nicht alle) und es kann auch über den Farbnamen gesteuert werden, ohne den zugehörigen HSV-Wert zu kennen.

Vielleicht hilft es ja jemandem weiter.

Hat eigentlich noch jemand andere Geräte aus der Xiaomi SmartHome Serie? Dort gibt es ja auch noch Schalter, Steckdosen, Bewegungsmelder und und und. Die Kommunikation dort läuft dann allerdings über Zigbee, wofür auch noch ein Gateway benötigt wird. Das Gateway kostet knapp über 30€ und die Sensoren und Schalter sind alle unter 10€.