Govee2mqtt (Govee LAN API) - vielleicht hat jemand Lust mitzumachen

Begonnen von 87insane, 04 Juni 2025, 10:57:35

Vorheriges Thema - Nächstes Thema

87insane

Hallo zusammen,

in Anlehnung an ein anderes Projekt meine Überschrift-Wahl ;)

Projekt:
Nutzung der Govee LAN API und Implementierung in FHEM.

Bisher bereits geschehen:
Ich habe ein Python Skript mithilfe von ChatGPT erstellt. Dieses Skript muss via systemd, pm2 oder was man bevorzugt gestartet werden. Danach dient es wie bei sonos2mqtt als Brücke. Hier werden die UDP Daten der Govee LED in MQTT Nachrichten umgewandelt und an einen MQTT Broker gesendet.

Was kann das Skript:
- Automatische Erkennung von Govee LED mit aktivem LAN Control bei Start des Dienstes/Skriptes oder manuell über set govee_bridge scan.
- Automatische Status-Erkennung (on/off, color_temp, rgb, brightness)
  - Bei neuer Einbindung
  - Bei Schaltvorgang. Wartezeit vor Status-Abfrage per govee/config/delay (ms)
  - Alle xxx (einstellbar) Sekunden, wenn z.B. vorher über die App geschaltet wurde. Intervall per Topic govee/config/poll (Sek.)
- Schalten von allen Dingen die über die LAN API von Govee zur Zeit möglich sind.
  - An/Aus (onoff)
  - Helligkeit 0-100 % (brightness)
  - Farbtemperatur (Kelvin) (color_temp)
  - RGB-Farbe (rgb)
- Online-Überwachung: Reading online wurde manuell hinzugefügt und wird in jeder LED angezeigt.
  - Sofort offline, wenn ein Befehl unbeantwortet bleibt (DELAY_MS + offlineBuffer)
  - Regelmäßiger Timeout = POLL_SECONDS + offlineBuffer
  - Einstellbar gemacht via govee/config/offlineBuffer (s)
- Debug Modus (mit -debug starten)

Was das Skript benötigt:
- paho-mqtt (sudo apt-get install python3-paho-mqtt)
- pyyaml (pip3 install pyyaml)
- Python Version 3.7 oder höher
- Im Netzwerk muss Multicast erlaubt sein
- MQTT Broker (ich gehe in meiner Beschreibung von einem FHEM MQTT2 Server aus)

Installation in 5 einfachen Schritten:
1. Python Skript irgendwo ablegen (Beispiel /opt/govee2mqtt/govee_mqtt.py)

2. Eine Datei mit dem Namen configuration.yaml direkt neben dem Skript anlegen (/opt/govee2mqtt/configuration.yaml). (Der FHEM Benutzer muss diese Datei beschreiben dürfen. Ansonsten werden aus FHEM getätigte Einstellungen nicht gespeichert - Betrifft OFFLINE_BUF, POLL_SECONDS, DELAY_MS).
Diese mit folgendem Inhalt befüllen:
MQTT:
  HOST: localhost
  PASS: MQTTPASSWORT
  PORT: 1883
  USER: MQTTBENUTZER
OFFLINE_BUF: 1
POLL_SECONDS: 60
DELAY_MS: 300
TOPIC_BASE: govee

3. In FHEM eine Bridge anlegen - Hier mein Beispiel:
defmod goove_server MQTT2_DEVICE govee
attr goove_server bridgeRegexp govee/([0-9a-f]{14})[/]?.*:.* "govee_$1"
attr goove_server readingList govee/bridge/config:.* { json2nameValue($EVENT, '', $JSONMAP) }\
govee/bridge/scan:.* { json2nameValue($EVENT, '', $JSONMAP) }\
govee/bridge/error:.* { json2nameValue($EVENT, '', $JSONMAP) }
attr goove_server setList poll govee/bridge/config/poll $EVTPART1\
delay govee/bridge/config/delay $EVTPART1\
offlineBuffer govee/bridge/config/offlineBuffer $EVTPART1\
scan:noArg govee/command/scan
attr goove_server stateFormat Delay: delay ms<br>\
Intervall: poll s<br>\
Oflline: offlineBuffer s
attr goove_server webCmd scan

4. Überlegen wie man es starten möchte. Als System Dienst oder oder oder - Zum testen geht einfach: python3 govee_mqtt.py

5. Nach dem Start des Skriptes, wird automatisch nach Geräten gesucht. Diese werden bei aktivem autocreate auch direkt angelegt.
Anbei ein Beispiel, wie bei mir eine LED aussieht:
defmod govee_b116d533c0c639 MQTT2_DEVICE govee_b116d533c0c639
attr govee_b116d533c0c639 alias Arbeitszimmer Stehlampe 2
attr govee_b116d533c0c639 devStateIcon {\
my $amp = ReadingsVal($name,'online','false') eq 'false'\
? 'rot'\
: 'gruen';;\
\
my $light = Color::devStateIcon($name,'rgb','rgb','brightness','state');;\
$light =~ s/.*?:([^:]+):.*$/$1/;;\
\
return\
"<a href=\"/fhem?cmd=set $name toggle&XHR=1\">"\
. FW_makeImage('10px-kreis-'.$amp)\
. '</a>'\
. "<a href=\"/fhem?cmd=set $name toggle&XHR=1\">"\
. FW_makeImage($light)\
. '</a>';;\
}
attr govee_b116d533c0c639 devicetopic govee/b116d533c0c63961
attr govee_b116d533c0c639 jsonMap onoff:state
attr govee_b116d533c0c639 readingList $DEVICETOPIC/state:.* { json2nameValue($EVENT, '', $JSONMAP) }\
$DEVICETOPIC/info:.* { json2nameValue($EVENT, '', $JSONMAP) }\
$DEVICETOPIC/state/raw:.* raw\
$DEVICETOPIC/online:.* online
attr govee_b116d533c0c639 setList on:noArg $DEVICETOPIC/set/onoff on\
  off:noArg $DEVICETOPIC/set/onoff off\
  brightness:colorpicker,BRI,0,2,100 $DEVICETOPIC/set/$EVTPART0 $EVTPART1\
  color_temp:colorpicker,CT,2200,10,6500 $DEVICETOPIC/set/$EVTPART0 $EVTPART1\
  rgb:colorpicker,RGB $DEVICETOPIC/set/$EVTPART0 $EVTPART1\
  dimUp:noArg { my $num=ReadingsNum($NAME,'brightness',0)+10;; return qq{$DEVICETOPIC/set/brightness $num} }\
  dimDown:noArg { my $num=ReadingsNum($NAME,'brightness',0)-10;; return qq{$DEVICETOPIC/set/brightness $num} }
attr govee_b116d533c0c639 webCmd brightness:color_temp:rgb


Übersicht der Topics:
  govee/<mac>/info                  (sku, ble und wifi Version, MAC, IP)
  govee/<mac>/state/...            (devStatus)
  govee/<mac>/set/...                (onoff, brightness, color_temp, rgb)
  govee/<mac>/online              (online/offline)

Setter/Readings Bridge
  govee/bridge/config              poll (globales Poll-Intervall (Default 60s), delay Wartezeit vor devStatus (Default 300ms), offlinebuffer Extra-Puffer für Offline (Default 1s)
  govee/bridge/scan                no payload      manuellen Scan auslösen
  govee/bridge/error                Meldet Fehler



Changelog:

2025-06-04 Version 1.1
- Online/offline status hinzugefügt. Es wird alle POLL_SECONDS + offlineBuffer Sekunden geprüft ob eine LED noch im Netzwerk ist.
Wenn geschaltet wird, wird auch geprüft ob das Gerät online ist. Hier wird nach dem Schalten DELAY_MS + offlineBuffer abgewartet.
Dies kann angepasst werden mit offline_time govee/config/offlineBuffer $EVTPART1 in der setlist der Bridge. Default ist 1s.

- Verbesserung vom sende/empfangen der Nachrichten. Nun kein blockieren mehr.


2025-06-06 Version 1.2
- Konfig nun in eigene Datei ausgelagert - configuration.yaml

- Die Konfigurationswerte für Poll, Delay und Oflline Buffer können weiterhin aus FHEM geändert werden. Diese werden anstatt sie aus den Retained Topics vom MQTT Server zu holen, direkt aus der configuration.yaml gelesen. Das Beschreiben dieser Werte geht entweder aus dem Bridge Device oder manuell in der Datei selber. Um diese aus Fhem beschreiben zu können muss der FHEM Benutzer bzw. der Skript ausführende Benutzer die nötigen Dateiberechtigungen haben.

- MQTT Topics angepasst und nicht mehr für alles eigenes Topic.

- Debug Modus eingeführt. "python3 govee_mqtt.py -debug" startet ihn

- Einige Fixes. Refresh RGB Reading, etc.

- Asynchrone Timer eingefügt. Status Abfragen, Bedienung, usw. können nun auf x Geräten gleichzeitig laufen, ohne das der Benutzer einen Delay hat oder eine der LED langsamer zurück meldet.

2025-06-13 Version 1.2
- MQTT Nachrichten werden nun nicht mehr retained gesendet.



Ich hoffe, ich habe nichts vergessen und wünsche viel Spaß damit :)

Gruß,
87Insane

erdnar

#1
Danke, werde ich heute Abend mal testen.
ErdnaR

Jetzt ist Abend ;-) :
Mein "Govee TV Backlight 3 Lite" wird nicht gefunden.

87insane

#2
Hey - Hast du da auch LAN Control aktiviert? Das muss zwangsläufig an sein. Das Skript spricht nur die lokale API an.
In der Govee App -> Lampe auswählen, kleines Zahnrad/Einstellungen -> LAN Steuerung

erdnar

Eine "LAN Steuerung" gibt es in der Handy-App nicht. Aber eine "Wi-Fi Einrichtung".
Das Teil ist und war im Netz.

Es bietet Matter an  :-[

87insane

Nach kurzem googlen, die TV Backlights können wohl kein LAN Control. Und das Skript ist absichtlich nur für lokale Steuerung. In HA gibt es z.B. govee2mqtt zum Download mit lokalem aber auch Cloud Access. Ohne Cloud geht z.B. bei "normalen" LED auch keine Segment oder Szenen Steuerung. Alle warten darauf das Govee das für die API frei schaltet.

Ich werde meine Beschreibung oben verbessern müssen. Und schade das der erste, der sich gefreut hat, leider enttäuscht werden muss.

Gruß,
Kai

erdnar

Ach, alles gut.
Prinzipiell funktioniert das Ambilight. Da es die "letzte Einstellung" behält, schalte ich es einfach AN/AUS.
Ist eben leider weniger Spielerei ... :)
Aber danke für´s Basteln und Programmieren.
ErdnaR