Seite 1 von 1

(solved) Shelly Bulb via MQTT: RGB Werte anstatt Prozentangabe

Verfasst: 5. Dez 2022 11:56
von mike69
Moinsen.

Versuche gerade eine Shelly BULB via MQTT zu steuern. Hilfe gab es hier:
https://community.openhab.org/t/shelly- ... 4/64176/25
und hier:
https://shelly-api-docs.shelly.cloud/ge ... -bulb-mqtt

Stumpf was zusammenkopiert, daraus sind folgende Things und Items entstanden:

thing:

Code: Alles auswählen

    Thing topic ShellyBulb01 "Shelly Bulb WRGB" @ "Shelly"{
    
    Channels:     
     Type switch : switch      "Switch"	               [ stateTopic="shellies/ShellyBulb01/color/0/", transformationPattern="JS:shelly_dimmer-status.js", 
                                                          commandTopic="shellies/ShellyBulb01/color/0/command", on="on", off="off" ]

     Type dimmer : white_dim   "Brightness"            [ stateTopic="shellies/ShellyBulb01/color/0/status", transformationPattern="JSONPATH:$.brightness", 
                                                          commandTopic="shellies/ShellyBulb01/color/0/set", formatBeforePublish="{ \"mode\": \"white\", \"brightness\" : %.0f }"]

     Type dimmer : white_temp  "White Temperature"     [ stateTopic="shellies/ShellyBulb01/color/0/status", transformationPattern="JSONPATH:$.temp", 
                                                          commandTopic="shellies/ShellyBulb01/color/0/set", min=3000, max=6400, step=10, formatBeforePublish="{ \"mode\": \"white\", \"temp\" : %s }"]

     Type dimmer : color_gain  "Color Brightness"      [ stateTopic="shellies/ShellyBulb01/color/0/status", transformationPattern="JSONPATH:$.gain",
                                                          commandTopic="shellies/ShellyBulb01/color/0/set", formatBeforePublish="{ \"mode\": \"color\", \"gain\" : %.0f }"]

     Type dimmer : color_green "Green"                 [ stateTopic="shellies/ShellyBulb01/color/0/status", transformationPattern="JSONPATH:$.green",
                                                          commandTopic="shellies/ShellyBulb01/color/0/set", min=0, max=255, formatBeforePublish="{ \"mode\": \"color\", \"green\" : %.0f }"]

     Type dimmer : color_red   "Red"                   [ stateTopic="shellies/ShellyBulb01/color/0/status", transformationPattern="JSONPATH:$.red",
                                                          commandTopic="shellies/ShellyBulb01/color/0/set", min=0, max=255, formatBeforePublish="{ \"mode\": \"color\", \"red\" : %.0f }"]

     Type dimmer : color_blue  "Blue"                  [ stateTopic="shellies/ShellyBulb01/color/0/status", transformationPattern="JSONPATH:$.blue",
                                                          commandTopic="shellies/ShellyBulb01/color/0/set", min=0, max=255, formatBeforePublish="{ \"mode\": \"color\", \"blue\" : %.0f }"]
     
     Type string : color_mode  "Color Mode"            [ stateTopic="shellies/ShellyBulb01/color/0/status", transformationPattern="JSONPATH:$.mode"]
     Type string : status      "Status"                [ stateTopic="shellies/ShellyBulb01/color/0/status", commandTopic="shellies/ShellyBulb01/color/0/set" ]
     Type number : power       "Leistung"              [ stateTopic="shellies/ShellyBulb01/light/0/power" ]
     Type number : energy      "Energie"               [ stateTopic="shellies/ShellyBulb01/light/0/energy", transformationPattern="JS:shelly_convertkwh.js" ]
     }
item:

Code: Alles auswählen

//ShellyBulb01
Switch	ShellyBulb01_switch         "Switch"                        <switch>      (gShellyBulb01, gLight)              ["Switch", "Switchable"]  {channel="mqtt:topic:openhab:ShellyBulb01:switch"}
Dimmer  ShellyBulb01_white_dim      "Weiss dimmen"                  <light>       (gShellyBulb01)                      ["Dimmer"]                {channel="mqtt:topic:openhab:ShellyBulb01:white_dim"}
Dimmer  ShellyBulb01_white_temp     "Farbtemperatur"                <light>       (gShellyBulb01)                      ["Dimmer"]                {channel="mqtt:topic:openhab:ShellyBulb01:white_temp"}
Dimmer  ShellyBulb01_color_gain     "Farbhelligkeit"                <light>       (gShellyBulb01)                      ["Dimmer"]                {channel="mqtt:topic:openhab:ShellyBulb01:color_gain"}
Dimmer  ShellyBulb01_color_green    "Green"                         <light>       (gShellyBulb01)                      ["Dimmer"]                {channel="mqtt:topic:openhab:ShellyBulb01:color_green"}
Dimmer  ShellyBulb01_color_red      "Red"                           <light>       (gShellyBulb01)                      ["Dimmer"]                {channel="mqtt:topic:openhab:ShellyBulb01:color_red"}
Dimmer  ShellyBulb01_color_blue     "Blue"                          <light>       (gShellyBulb01)                      ["Dimmer"]                {channel="mqtt:topic:openhab:ShellyBulb01:color_blue"}
String  ShellyBulb01_color_mode     "Farbmodus"                     <light>       (gShellyBulb01)                      ["Status"]                {channel="mqtt:topic:openhab:ShellyBulb01:color_mode"}
Number  ShellyBulb01_power          "Leistung [%.1f W]"             <energy>      (gShellyBulb01)                      ["Status"]                {channel="mqtt:topic:openhab:ShellyBulb01:power"}
Number  ShellyBulb01_energy         "Verbrauch [%.3f kWh]"          <energy>      (gShellyBulb01)                      ["Status"]                {channel="mqtt:topic:openhab:ShellyBulb01:energy"}
//String  ShellyBulb01_status         "Status"                        <light>       (gShellyBulb01)                      ["Status"]                {channel="mqtt:topic:openhab:ShellyBulb01:status"}
Sieht so aus:
Screenshot 2022-12-05 at 11-53-40 Licht RGB.png
Habe jetzt in der Sitemap mehrere Schieberegler für die Grundfarben, welche von 0-100% dargestellt werden, würde gerne die RGB Werte 0-255 darstellen. mit der state presentation habe ich schon rumgespielt, brachte nicht den gewünschten Erfolg.

Jemand eine idee?

Ein Colorpicker wäre auch was feines :) , ist aber eine spätere Evolutionsstufe. :D

Re: Shelly Bulb via MQTT: RGB Werte anstatt Prozentangabe

Verfasst: 5. Dez 2022 18:29
von udo1toni
Puh. Also ganz grundsätzlich solltest Du Dir überlegen, wie Du die Lampe tatsächlich betreiben willst.
openHAB verwendet HSB als Farbmodell. Die Shelly unterstützt kein HSB.
Willst du ohne großen Overhead die Lampe mit einem Colorpicker nutzen, dann musst Du einen color Channel definieren. Zum Glück kann das mqtt Binding auf Wunsch HSB direkt als RGB ausgeben.

Ein Channel:

Code: Alles auswählen

Type color : color "Farbe"        [color_mode="RGB",
                                 commandTopic="shellies/ShellyBulb01/color/0/set",
                          formatBeforePublish='{"mode": "color", "red":'%1$d', "green": '%2$d', "blue": '%3$d'}'
                                  ] 
Das Problem ist dabei die Rückmeldung, Du kannst nicht auf normalem Weg (also mit JSONPATH) auswerten, stattdessen musst Du die RGB-Werte über die JS Transformation mit drei JSONPATH Transformations zu einem String mit den drei Werten (Komma separiert) zusammensetzen. Ich bin jetzt mal super faul und lasse den Teil weg. :D
Was nicht geht, ist, den Weiß-Kanal direkt mit zu berücksichtigen.
Du brauchst nur den einen Kanal, solange Du "nur" Farbe und Helligkeit steuern möchtest.
Soll der Weiß-Kanal mit berücksichtigt werden, wird es auf eine Rule hinauslaufen, die das notwendige JSON Objekt komplett frei erstellen kann (also vor allem den Weiß-Anteil mit berücksichtigen), in dem Fall musst Du einen String Channel zum Senden und empfangen anlegen und die Items unverlinkt lassen. Stattdessen kümmern sich dann zwei Rules um die Items, die eine zum Senden, die andere zum Empfangen.

Re: Shelly Bulb via MQTT: RGB Werte anstatt Prozentangabe

Verfasst: 5. Dez 2022 21:41
von mike69
Nabend.
udo1toni hat geschrieben: 5. Dez 2022 18:29 Puh. Also ganz grundsätzlich solltest Du Dir überlegen, wie Du die Lampe tatsächlich betreiben willst.
openHAB verwendet HSB als Farbmodell. Die Shelly unterstützt kein HSB.
Willst du ohne großen Overhead die Lampe mit einem Colorpicker nutzen, dann musst Du einen color Channel definieren. Zum Glück kann das mqtt Binding auf Wunsch HSB direkt als RGB ausgeben.

Ein Channel:

Code: Alles auswählen

Type color : color "Farbe"        [color_mode="RGB",
                                 commandTopic="shellies/ShellyBulb01/color/0/set",
                          formatBeforePublish='{"mode": "color", "red":'%1$d', "green": '%2$d', "blue": '%3$d'}'
                                  ] 
Hmm, da gibt es eine Fehlermeldung beim speichern:

Code: Alles auswählen

2022-12-05 21:17:06.565 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'shelly.things'
2022-12-05 21:17:06.601 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'shelly.things' has errors, therefore ignoring it: [53,77]: Character array is missing "e" notation exponential mark.
[53,103]: mismatched input '%' expecting ']'
[53,104]: missing '}' at '1'
[53,106]: no viable alternative at input 'd'
[53,121]: no viable alternative at input '2'
[53,123]: no viable alternative at input 'd'
[53,137]: no viable alternative at input '3'
[53,139]: no viable alternative at input 'd'
[177,1]: extraneous input '}' expecting EOF
Ob an den Schiebereglern 100% oder was mit 0-255 steht, das ist nicht kriegsentscheidend. Jedenfalls scheint der Aufwand grösser wie der Nutzen zu sein.
Und das verschieden Farbräume hier verwendet werden, war nicht bekannt, danke für die Info. :)

Wollte nur wissen, was mit dem Gerät über MQTT geht, liegt seit letztem Winter hier rum und habe, ehrlich gesagt, noch keine Verwendung dafür. Sollte das Zimmer der Tochter befeuern und vom Bett aus steuerbar sein :). Jetzt hängt was anderes an der Decke und die Shelly Bulb ist arbeitslos.

Hab erstmal Dank, Udo.

Re: Shelly Bulb via MQTT: RGB Werte anstatt Prozentangabe

Verfasst: 5. Dez 2022 22:14
von udo1toni
Nach Nachlesen denke ich, dass der Publish-String einfacher aussehen kann:

Code: Alles auswählen

Type color : color "Farbe"        [color_mode="RGB",
                                 commandTopic="shellies/ShellyBulb01/color/0/set",
                          formatBeforePublish='{"mode": "color", "red": %1$d, "green": %2$d, "blue": %3$d}'
                                  ]
Eventuell müssen aber tatsächlich durchgehend doppelte Anführungszeichen verwendet werden, mit Escaping...

Code: Alles auswählen

Type color : color "Farbe"        [color_mode="RGB",
                                 commandTopic="shellies/ShellyBulb01/color/0/set",
                          formatBeforePublish="{\"mode\": \"color\", \"red\": %1$d, \"green\": %2$d, \"blue\": %3$d}"
                                  ]
Achtung! Wenn Du einen bestehenden Channel änderst, wird openHAB diese Änderung in der *.things Datei nicht direkt übernehmen.
Abhilfe: Du änderst die UID des Channels (hin, speichern - wieder zurück, speichern)

Re: Shelly Bulb via MQTT: RGB Werte anstatt Prozentangabe

Verfasst: 6. Dez 2022 10:57
von mike69
Moinsen.
udo1toni hat geschrieben: 5. Dez 2022 22:14 Eventuell müssen aber tatsächlich durchgehend doppelte Anführungszeichen verwendet werden, mit Escaping...

Code: Alles auswählen

Type color : color "Farbe"        [color_mode="RGB",
                                 commandTopic="shellies/ShellyBulb01/color/0/set",
                          formatBeforePublish="{\"mode\": \"color\", \"red\": %1$d, \"green\": %2$d, \"blue\": %3$d}"
                                  ]
Jup, keine Probleme beim speichern.

Aber irgendwas passt nicht, egal wie ich im Colorpicker rumrühre, die Werte für Rot, Grün und Blau passen nicht, zumindest was MQTT liefert. Zum Beispiel schiebe ich den Punkt in den blauen Bereich, steigt Rot an, Grün bewegst sich fast gar nicht
Hier ein Screenshot vom Channel:
Screenshot 2022-12-06 at 10-32-31 openHAB.png
Muss das so aussehen? Es ist doch RGB vorgegeben. Hätte Regler für Rot, Grün und Blau erwartet. :?

Irgendwo in den Tiefen des Channels konnte man den Color Mode vorgeben, war auf HSB gesetzt. Nach einem Neustart von OH war der Punkt weg. :lol:

Zur Info, werden die Regler für HSB bewegt, beeinflusst "H" Rot bis in den blauen Bereich, "S" Grün und im geringen Maß "B" Blau. quasi das gleiche Verhalten wie mit dem Colorpicker.

Edit:
Unter "Configure Channel" sind die Punkte für HSB, RGB und CIE xyY.
Screenshot 2022-12-06 at 11-05-53 openHAB.png
Kann man von ausgehen, das der RGB Mode nicht greift?

Re: Shelly Bulb via MQTT: RGB Werte anstatt Prozentangabe

Verfasst: 6. Dez 2022 13:18
von udo1toni
Dann passt das Schlüsselwort color_mode nicht.

EDIT: Jepp, gerade nachgeschaut, es muss colorMode heißen, also ohne Unterstrich und dafür CamelCase.

EDIT2: Interessanterweise ist das in der Doku für 3.4 schon geändert, nicht aber für 3.3. Aber und 3.3 heißt der Channel Parameter auch schon so...

Re: Shelly Bulb via MQTT: RGB Werte anstatt Prozentangabe

Verfasst: 6. Dez 2022 14:48
von mike69
udo1toni hat geschrieben: 6. Dez 2022 13:18 Dann passt das Schlüsselwort color_mode nicht.

EDIT: Jepp, gerade nachgeschaut, es muss colorMode heißen, also ohne Unterstrich und dafür CamelCase.

EDIT2: Interessanterweise ist das in der Doku für 3.4 schon geändert, nicht aber für 3.3. Aber und 3.3 heißt der Channel Parameter auch schon so...
Jap, das wars, colorMode ist es. 👍

Zwar wurde das Anliegen nicht gelöst, aber die nächste Evolutionsstufe erreicht.😂😂

Der Colorpicker funzt, baue die Regler eh aus, sind jetzt obsolet. Die Shelly hat ja zwei Moden von Hause aus, White und Color. Lasse die Regelung für White drinne, stört nicht. Mit der nicht vorhandenen Rückmeldung kann ich leben, obwohl die Werte Rot, Grün und Blau sich sofort geändert haben beim rumklicken im Colorpicker. Nach dem aktualisieren der Seite passt dann der Rest.

Udo, dir großen Dank, bin ein Schritt weiter. 👍

Re: (solved) Shelly Bulb via MQTT: RGB Werte anstatt Prozentangabe

Verfasst: 6. Dez 2022 17:22
von udo1toni
Die Rückmelduing ist wie gesagt kein großes Problem... irgendwas in dieser Art:
Im Color Channel zusätzlich das stateTopic eintragen und transformationPattern auf JS:shelly2rgb.js setzen.
Im Ordner $OPENHAB_CONF/transform/ das JS-Script shelly2rgb.js anlegen. Inhalt etwa so:

Code: Alles auswählen

(function(dataString){
    var json = JSON.parse(dataString);
    var red = json.red;
    var green = json.green;
    var blue = json.blue;
    var retval = red + ", " + green + ", " + blue;
    return retval;
})(input)
Ungetestet... Der Punkt ist, dass JS die drei Werte aus dem JSON Objekt extrahiert und als kommaseparierte Liste anliefert, was wiederum vom Color Channel verarbeitet werden sollte.