Seite 1 von 1

GELÖST: govee2mqtt

Verfasst: 14. Nov 2024 16:48
von nw378
Moin,

ich brauche Profi-Hilfe, ich bin am Ende mit meinem Latein. Gefühlt auf der Zielgeraden, aber jetzt geht's nicht weiter. Und zwar:

Ich habe GU10-LED-Spots von Govee, Modell H600D https://eu.govee.com/de-de/products/gov ... DiWRbvlYz3

Diese lassen sich leider nicht direkt in OH einbinden. Zwar gibt es ein Govee Binding; um dies zu nutzen, muss in der Govee App der Schalter "LAN Control" eingeschaltet werden. Für dieses Modell ist das nicht verfügbar.

Aber: es gibt ein (home assistant) Tool, das per API (leider nicht lokal, aber in der Not frisst der Teufel Fliegen) auf die Govee Cloud zugreift:
https://github.com/wez/govee2mqtt/blob/ ... /DOCKER.md

Flux die .env-Datei angepasst (User, Passwort, MQTT Broker, API) und installiert - läuft und liefert Daten.

gv2mqtt/light/1005B08184C426FC/state

Code: Alles auswählen

{"brightness":70,"color_mode":"color_temp","color_temp":370,"effect":null,"state":"ON"}
und

gv2mqtt/switch/1005B08184C426FC/powerSwitch/state

OH zeigt sogar die Lampen in den Things per Autodiscovery an, allerdings stehen diese dann auf UNKNOWN statt ONLINE und haben auch keine Channel.

Code: Alles auswählen

UID: mqtt:homeassistant_gv2mqtt_2D1005B08184C426FC:mosquitto:gv2mqtt_2D1005B08184C426FC
label: Büro 3 (Light, Sensor, Switch, button)
thingTypeUID: mqtt:homeassistant_gv2mqtt_2D1005B08184C426FC
configuration:
  topics:
    - button/gv2mqtt-1005B08184C426FC-request-platform-data
    - light/gv2mqtt-1005B08184C426FC
    - sensor/sensor-1005B08184C426FC-gv2mqtt-status
    - switch/gv2mqtt-1005B08184C426FC-powerSwitch
  basetopic: homeassistant
bridgeUID: mqtt:broker:mosquitto
Also habe ich versucht, eine Lampe per Textfile zu installieren:

Code: Alles auswählen

Thing mqtt:topic:mosquitto:gv2mqtt "MQTT Govee" (mqtt:broker:mosquitto) {
    Channels:
      Type switch :  office1                               [ commandTopic="gv2mqtt/light/1005B08184C426FC/command", stateTopic="gv2mqtt/light/1005B08184C426FC/state", transformationPattern="JSONPATH:$.state",  off="OFF" , on="ON" ] 
Dann noch ein Switch-Item erstellt und verlinkt:

Code: Alles auswählen

UID: mqtt:topic:mosquitto:gv2mqtt
label: MQTT Govee
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:mosquitto
channels:
  - id: office1
    channelTypeUID: mqtt:switch
    label: On/Off Switch
    configuration:
      retained: false
      postCommand: false
      formatBeforePublish: "%s"
      commandTopic: gv2mqtt/light/1005B08184C426FC/command
      stateTopic: gv2mqtt/light/1005B08184C426FC/state
      transformationPattern: JSONPATH:$.state
      off: OFF
      on: ON
Leider reagiert die Lampe nicht, wenn ich den OH-Schalter betätige.... :(

edit:

Irgendwann später erscheint in mqtt dann noch folgendes:

homeassistant/light/gv2mqtt-1005B08184C426FC/config

Code: Alles auswählen

{"availability_topic":"gv2mqtt/availability","name":null,"origin":{"name":"gv2mqtt","sw_version":"2024.07.21-c9d27764","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Büro 3","manufacturer":"Govee","model":"H600D","via_device":"gv2mqtt","identifiers":["gv2mqtt-1005B08184C426FC"]},"unique_id":"gv2mqtt-1005B08184C426FC","schema":"json","command_topic":"gv2mqtt/light/1005B08184C426FC/command","state_topic":"gv2mqtt/light/1005B08184C426FC/state","optimistic":false,"supported_color_modes":["rgb","color_temp"],"color_mode":true,"brightness":true,"brightness_scale":100,"effect":true,"effect_list":["","Adventure Game","Asleep","Aurora","Awaken","Business","Candlelight","Candy","Cards Game","Care","Carnival","Cartoon","Christmas","Dance Party","Desert","Dreamland","Dusk","Enthusiastic","Father's Day","Fighting Game","Fire","Flower Field","Forest","Game","Halloween","Happy","Healing","Karst Cave","Longing","Meditation","Mild","Morning","Mother's Day","Movie","Music: Energic","Music: Rhythm","Music: Rolling","Music: Spectrum","Night Light","Party","Profound","Puzzle Game","Quiet","Racing Game","Rainbow","Reading","Relax","Rivalry","River","Romantic","Shooting Game","Sports Game","Starry Sky","Study","Sunset Glow","Sweet","Technology","Thanksgiving","Valentine's Day","Warm","White Light"],"min_mireds":153,"max_mireds":370,"payload_available":"online"}
und

homeassistant/switch/gv2mqtt-1005B08184C426FC-powerSwitch/config

Code: Alles auswählen

{"availability_topic":"gv2mqtt/availability","name":"Power Switch","origin":{"name":"gv2mqtt","sw_version":"2024.07.21-c9d27764","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Büro 1","manufacturer":"Govee","model":"H600D","via_device":"gv2mqtt","identifiers":["gv2mqtt-1005B08184C426FC"]},"unique_id":"gv2mqtt-1005B08184C426FC-powerSwitch","command_topic":"gv2mqtt/switch/1005B08184C426FC/command/powerSwitch","state_topic":"gv2mqtt/switch/1005B08184C426FC/powerSwitch/state"}
edit2:

Wenn ich in der Govee-App den Schalter betätige, reagiert der openHAB-Schalter (s.o.). In diese Richtung funktioniert das ganze also...
Fehlt noch umgehehrt.

Re: govee2mqtt

Verfasst: 14. Nov 2024 18:27
von nw378
Und noch ein Nachtrag. Per action-Befehl in einer Rule klappt auch die Senderichtung.

Code: Alles auswählen

rule "test"
when
    Item Test changed
then
  var actions = getActions("mqtt","mqtt:broker:mosquitto")
  actions.publishMQTT("gv2mqtt/light/1005B08184C426FC/command", "{\"brightness\":5,\"color_mode\":\"color_temp\",\"color_temp\":370,\"effect\":null,\"state\":\"ON\"}")
end
Offenbar habe ich einen Fehler in der Konfiguration des Items/Commands...

Egal, so funktioniert's. Falls jemand mal vor der gleichen Aufgabe steht, so sieht dann die fertige Regel aus, um mehrere Spots gleichzeitig anzusteuern:

Code: Alles auswählen

rule "Beleuchtung Büro"
when
    Item Dimmer_OG_Office changed
then
  val x = newState
  var actions = getActions("mqtt","mqtt:broker:mosquitto")
  actions.publishMQTT("gv2mqtt/light/1005B08184C426FC/command", "{\"brightness\":" + x + ",\"color_mode\":\"color_temp\",\"color_temp\":370,\"effect\":null,\"state\":\"ON\"}")
  actions.publishMQTT("gv2mqtt/light/6C05983DAE0B0310/command", "{\"brightness\":" + x + ",\"color_mode\":\"color_temp\",\"color_temp\":370,\"effect\":null,\"state\":\"ON\"}")
  actions.publishMQTT("gv2mqtt/light/F7DB983DAE123424/command", "{\"brightness\":" + x + ",\"color_mode\":\"color_temp\",\"color_temp\":370,\"effect\":null,\"state\":\"ON\"}")
  actions.publishMQTT("gv2mqtt/light/7BEE983DAE0C2FAC/command", "{\"brightness\":" + x + ",\"color_mode\":\"color_temp\",\"color_temp\":370,\"effect\":null,\"state\":\"ON\"}") }
end

Re: govee2mqtt

Verfasst: 14. Nov 2024 19:09
von Harka
Moin,
wenn Du dennoch was versuchen möchtest -> pass Dein formatBeforePublish mal an. So wird das z.B. bei zigbee2mqtt gemacht und dies sieht doch sehr ähnlich aus.

Code: Alles auswählen

formatBeforePublish: '{"state": %s}' 

Re: govee2mqtt

Verfasst: 14. Nov 2024 19:17
von udo1toni
nw378 hat geschrieben: 14. Nov 2024 18:27 Offenbar habe ich einen Fehler in der Konfiguration des Items/Commands...
Definitiv. Du sendest ja auch per Rule etwas völlig anderes als per Channel.

Switch Channel (mutmaßlich):

Code: Alles auswählen

UID: mqtt:topic:mosquitto:gv2mqtt
label: MQTT Govee
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:mosquitto
channels:
  - id: office1
    channelTypeUID: mqtt:switch
    label: On/Off Switch
    configuration:
      retained: false
      postCommand: false
      formatBeforePublish: "%s"
      commandTopic: gv2mqtt/switch/1005B08184C426FC/command/powerSwitch
      stateTopic: gv2mqtt/switch/1005B08184C426FC/powerSwitch/state
Hier wird also das powerSwitch Topic verwendet.

Dimmer Channel:

Code: Alles auswählen

UID: mqtt:topic:mosquitto:gv2mqtt
label: MQTT Govee
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:mosquitto
channels:
  - id: dim
    channelTypeUID: mqtt:dimmer
    label: Dimmer
    configuration:
      retained: false
      postCommand: false
      formatBeforePublish: '{"brightness":%s}'
      commandTopic: gv2mqtt/switch/1005B08184C426FC/command
      stateTopic: gv2mqtt/switch/1005B08184C426FC/state
      transformationPattern: JSONPATH:$.brightness
Es ist auch möglich, dass zwingend alle Parameter im JSON Objekt gesetzt sein müssen, dann sähe formatBeforePublish so aus:

Code: Alles auswählen

formatBeforePublish: '{"brightness":%s,"color_mode":"color_temp","color_temp":370,"effect":null}'
%s enthält den Zahlenwert 0-100. Der State darf als Parameter nicht notwendig sein, sonst müsste man ja für Helligkeit 0 abweichend ein OFF senden. Wenn man einfache Anführungszeichen verwendet, kann man auf das Escapen der doppelten Anführungszeichen verzichten. Das funktioniert aber nur per yaml bzw. über die UI

Re: govee2mqtt

Verfasst: 15. Nov 2024 13:21
von nw378
Danke Harka und Udo für den Input, das hat mir beides den passenden Anstoß gegeben.

Ich habe noch etwas daran rumgetüftelt, und meine, nun fertig zu sein ;-)

Ich habe alles als Textfile konfiguriert, mit diesem Yaml-Zeug komme ich nur schwierig zurecht.

Tatsächlich ist es so, dass state als Einzelargument gesendet werden kann; brightness benötigt die gesamte Kette, inkl. state.

Umgekehrt ist es so, dass wenn state=OFF ist, auch nur dieses als Parameter im stateTopic gesendet wird.
Deshalb habe ich noch ein JS eingefügt (sonst erscheint ein JSONPATH-transformation failed: Invalid path '$.brightness im Log).


.things

Code: Alles auswählen

Thing mqtt:topic:mosquitto:gv2mqtt "MQTT Govee" (mqtt:broker:mosquitto) {
    Channels:
      Type switch :  office1 [ commandTopic="gv2mqtt/light/1005B08184C426FC/command", stateTopic="gv2mqtt/light/1005B08184C426FC/state", transformationPattern="JSONPATH:$.state",  formatBeforePublish="{\"state\":\"%s\"}" ] 
      Type dimmer :  dimmer1 [ commandTopic="gv2mqtt/light/1005B08184C426FC/command", stateTopic="gv2mqtt/light/1005B08184C426FC/state", transformationPattern="JS:|JSON.parse(input).brightness",  formatBeforePublish="{\"brightness\":%s,\"color_mode\":\"color_temp\",\"color_temp\":370,\"effect\":null,\"state\":\"ON\"}" ] 
      ...}
.items

Code: Alles auswählen

Group:Switch:OR(ON,OFF)  gOffice_Switch
Group gOffice_Dimmer

Switch  Licht_Office1         (gOffice_Switch)                     {channel="mqtt:topic:mosquitto:gv2mqtt:office1"}
Dimmer  Dimmer_Office1        (gOffice_Dimmer)                     {channel="mqtt:topic:mosquitto:gv2mqtt:dimmer1"}
...
.rules

Code: Alles auswählen

rule "Beleuchtung Büro"
when
    Item Dimmer_OG_Office changed
then
  val x = newState
  if (x == 0)  
    gOffice_Switch.members.forEach[i | i.sendCommand(OFF)]    
  else {
    if (previousState==0) 
      gOffice_Switch.members.forEach[i | i.sendCommand(ON)]    
    gOffice_Dimmer.members.forEach[i | i.sendCommand(x.toString)]  }
end

Re: govee2mqtt

Verfasst: 15. Nov 2024 15:35
von udo1toni
Sehr schön! :)