NEWS
MQTT Light über Homekit steuern
-
Hallo,
ich hab mir mal auf einen meiner NodeMCUs folgenden sketch geladen:
https://github.com/Dullage/ESP-LED-MQTT
An der NodeMCU hängt ein LED Streifen dran und den kann ich jetzt per MQTT steuern. Ich schicke zb. sowas hin:{0:1,2:[255,0,0]}
und das LED ist voll rot. Also sprich der Teil zwischen den[]
ist der RGB Farbwert.
Leider kenn ich mich noch nicht so wirklich mit dem yahka adapter aus, aber geht das? Also kann der das so umkonvertieren?Und was jetzt natürlich noch super geil wäre... neben Solid-Farben... Könnte man da einen Picker machen für Farb-Effekte? Kann Homekit das? Wenn ich nämlich zb.
{0:13}
an den mqtt broker schicken würde, hätte ich einen Regenbogen-Effekt. Das wäre ein nettes Zusatzfeature, aber jetzt nicht sooo wichtig -
@Georg-Bachmann sagte in MQTT Light über Homekit steuern:
Hallo,
ich hab mir mal auf einen meiner NodeMCUs folgenden sketch geladen:
https://github.com/Dullage/ESP-LED-MQTT
An der NodeMCU hängt ein LED Streifen dran und den kann ich jetzt per MQTT steuern. Ich schicke zb. sowas hin:{0:1,2:[255,0,0]}
und das LED ist voll rot. Also sprich der Teil zwischen den[]
ist der RGB Farbwert.
Leider kenn ich mich noch nicht so wirklich mit dem yahka adapter aus, aber geht das? Also kann der das so umkonvertieren?Das Umkonvertieren kann gehen, ist aber nicht trivial, da der notwendige RGB Wert aus den bei Yahka verwendeten HSV Werten berechnet werden muss. Der Ablauf ist wie folgt:
- eigene Datenpunkte anlegen: Yahka_H, Yahka_S, Yahka_V
- 2 Skripte schreiben, einmal Umrechnung HSV zu RGB, einmal RGB zu HSV. Die Umrechnung jeweils an Veränderungen an den Datenpunkten Triggern (HSV-> RGB bei Änderung von Yahka_H, S, V), RGB->HSV an dem Datenpunkt der im MQTT Adapter liegt.
- Die Datenpunkte Yahka_H, Yahka_S, Yahka_V mit den Einstellungen im Yahka verbinden.
Skripte zu HSV-RGB Konvertierung (und Umgekehrt) sind auf Github zu finden, und können per "require" in den JS Adapter eingelesen werden.
Und was jetzt natürlich noch super geil wäre... neben Solid-Farben... Könnte man da einen Picker machen für Farb-Effekte? Kann Homekit das? Wenn ich nämlich zb.
{0:13}
an den mqtt broker schicken würde, hätte ich einen Regenbogen-Effekt. Das wäre ein nettes Zusatzfeature, aber jetzt nicht sooo wichtigDa sehe ich nicht wie man das so ohne weiteres machen kann. Du kannst halt für jeden Effekt einen eigenen Button definieren, der dann den relevanten Effekt-String an MQTT sendet. Wie das genau geht weiss ich nicht aus dem Kopf.
A.
-
@Asgothian Danke für deine Hilfe!
Ok... cool... dann schreib ich jetzt mein erstes ioBroker ScriptSchon eeeeewig nix mehr mit JS gemacht.
Alora... Ich hab jetzt mal die eine Richtung fertig. Also wenn ich in MQTT den RGB Farbwert ändere, setze ich die HSV Datenpunkte und somit bekommt HomeKit das bereits korrekt mit. Jippie...
Jetzt schreibt aber ja HomeKit dann ja auch auf diese Werte. Somit muss ich deren Änderung ja überwachen. Aber sobald ich selbst ja von RGB -> HSV schreibe, gibts da ja schon die Änderung...
Also ich geb über meinen MQTT Broker einen neuen Wert ein... somit wird der HSV Wert gesetzt. Wenn jetzt ein Script den überwacht dann würde das dann wieder einen RGB Wert schreiben (durch Rundungsfehler kann der ja auch leicht anders sein)... und das würde dann wieder das andere Script auslösen usw...
Wie löse ich das Problem?
-
@Georg-Bachmann
Das löst du ganz einfach: Du musst schauen ob die Werte vom HomeKit mit oder ohne "ack" gesetzt werden. Wenn HomeKit die Werte mit ack setzt, dann setzt du sie durch das Script ohne, und setzt den trigger auf "nur werte mit ack". Ansonsten machst du das umgekehrt. Das gleiche machst du auch beim RGB Wert zum MQTTA.
-
@Asgothian sehr cool! Danke für den Tipp!!! Eine Frage jetzt noch... es werden sich ja dann meistens 3 Datenpunkte ändern. H, S und V... das wären dann 3 Änderungen und ich will ja nicht GLEICH des an MQTT schicken... Also das wäre ja nicht sehr effizient, oder?
Und dann noch eine Frage... Um dann die MQTT Message zu schicken reicht es nicht einfach den Datenpunkt zu befüllen, oder? Muss ich das direkt machen? (Hab leider auf die schnelle keinen Sample Code gefunden :() -
@Georg-Bachmann
Korrekt. Der Trick dazu nennt sich timeout.Du machst eine funktion recalculate_rgb. Diese funktion gibst du beim Trigger fuer h, s und v an (an statt die Funktion inline in das "on" zu schreiben.
Zusaezlich machst du eine Variable "recalculate_timeout" die du mit null initialisierst.
In der Funktion recalculate_rgb kannst du dann als erstes prüfen, ob recalculate_timeout ungleich null ist. Wenn ja, sagst du "recalculate_timeout = set_timeout(...)". In dieser Funktion holst Du dir dann immer die h, s, v werte und stellst die Berechnung an. Als letztes setzt du dann noch "recalculate_timeout" auf null zurück.
Wie lange du den Timeout setzt definiert wie fix das ganze antwortet. ich wuerde mit 250 ms anfangen.
Im MQTT - wenn korrekt konfiguriert reicht das ändern des Datenpunktes um die Message auszulösen. Am besten testest du das einmal von Hand bevor du Skriptes.
A.