MQTT2+Shelly: erste Konfiguration und template-Entwicklung

Begonnen von miggun, 03 Dezember 2018, 21:05:34

Vorheriges Thema - Nächstes Thema

87insane

Okay - Also ist es eher ein Fehler das es überhaupt geht. Fand die Idee damals so gut von Beta-User. Naja gut..

Diese Variante in Perl hat nicht zufällig jemand fertig? Ich selber würde vermutlich 10 Jahre brauchen dafür.
Oder eine Idee posten mit der man bzw. ich testen kann. In Sachen Perl muss ich noch viel lernen....

Müsste man hier dann nicht sogar stateFormat in Perl umwandeln? Oder genügt devStateIcon?

Beta-User

devStateIcon mit Perl ist die richtige Adresse, nicht stateFormat! Das ganze ist weniger kompliziert, wie es dir im Moment erscheinen mag ;) . Einfach den html-Code zusammenbauen, das geht mit schlichten Textmanipulationen.

Du kannst dich z.B. hier bedienen: https://forum.fhem.de/index.php/topic,97430.0.html
Zur Erläuterung: "$ret .= ..." fügt jeweils hinten was an ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

gvzdus

Hi Beta-User und Freunde des ShellyBulbs (wohl ein übersichtlicher Kreis).

Ich habe "mein" Template "A_15_shellybulb" überarbeitet. Vor allem wollte ich es mit alexa-fhem optimieren. Jetzt läuft es sauber: Von "rot" über "gelb" rüber zum "Weißmodus" mit "warm weiß" und "hell weiß" und zurück.

Rumtricksen musste ich vor allem, damit die Helligkeit in beiden Modi einstellbar bleibt: "rgb" muss im Weißmodus Werte zurückliefern, die alexa-fhem wiederum über die Helligkeit zu spekulieren erlauben.

Ich hänge mal eben an
- DeviceList
- Template

Kommentare?

Viele Grüße, Georg

Internals:
   CFGFN     
   CID        shellybulb_3CC533
   DEF        shellybulb_3CC533
   DEVICETOPIC MQTT2_shellybulb_3CC533
   FUUID      5ccc76ea-f33f-8d06-0279-a2cddb67dbab22f3
   IODev      MQTT2_FHEM_Server
   LASTInputDev MQTT2_FHEM_Server
   MQTT2_FHEM_Server_MSGCNT 50
   MQTT2_FHEM_Server_TIME 2019-05-03 19:29:47
   MSGCNT     50
   NAME       MQTT2_shellybulb_3CC533
   NR         219
   STATE      rgb
   TYPE       MQTT2_DEVICE
   OLDREADINGS:
   READINGS:
     2019-05-03 19:14:18   announce_fw_ver 20190402-134156/v1.4.9@9be72c7e
     2019-05-03 19:14:18   announce_id     shellybulb-3CC533
     2019-05-03 19:14:18   announce_ip     192.168.0.5
     2019-05-03 19:14:18   announce_mac    DE4F223CC533
     2019-05-03 19:14:18   announce_new_fw false
     2019-05-03 19:29:47   blue            0
     2019-05-03 19:29:47   brightness      45
     2019-05-03 19:18:18   color_0         on
     2019-05-03 19:29:47   ct              3000
     2019-05-03 19:29:47   effect          0
     2019-05-03 19:29:47   gain            100
     2019-05-03 19:29:47   green           115
     2019-05-03 19:29:47   ison            true
     2019-05-03 19:29:47   mode            white
     2019-05-03 19:14:18   online          true
     2019-05-03 19:29:47   red             115
     2019-05-03 19:29:47   rgb             727272
     2019-05-03 19:18:18   state           rgb
     2019-05-03 19:29:47   temp            3000
     2019-05-03 19:29:47   white           0
Attributes:
   IODev      MQTT2_FHEM_Server
   alexaName  Licht Kinderzimmer
   genericDeviceType light
   icon       light_control
   model      A_15_shellybulb
   readingList shellies/shellybulb-3CC533/color/0/status:.* {json2nameValue($EVENT)}
shellybulb_3CC533:shellies/shellybulb-3CC533/color/0:.* color_0
   room       MQTT2_DEVICE
   setList    off:noArg shellies/shellybulb-3CC533/color/0/command off
  on:noArg shellies/shellybulb-3CC533/color/0/command on
  pct:colorpicker,BRI,0,1,100 shellies/shellybulb-3CC533/color/0/set {"turn":"on","gain":"$EVTPART1","brightness":"$EVTPART1"}
  ct:colorpicker,CT,3000,10,6500 {$EVTPART1=3000 if ($EVTPART1<3000);"shellies/shellybulb-3CC533/color/0/set {\"turn\":\"on\",\"mode\":\"white\",\"temp\":\"$EVTPART1\"}"}
  rgb:colorpicker,RGB {$EVTPART1=~/(..)(..)(..)/;if($1 ne $2 || $2 ne $3){"shellies/shellybulb-3CC533/color/0/set {\"turn\":\"on\",\"mode\":\"color\",\"gain\":\"100\",\"red\":".hex($1).",\"green\":".hex($2).",\"blue\":".hex($3)."}"}else{"shellies/shellybulb-3CC533/color/0/set {\"turn\":\"on\",\"mode\":\"white\",\"brightness\":".int(hex($1)/2.55)."}"}}
   userReadings ct {ReadingsVal($name,"temp",3000)}, rgb {if(ReadingsVal($name,"mode","") eq "color"){sprintf("%02X%02X%02X", ReadingsVal($name,"red",99), ReadingsVal($name,"green",99), ReadingsVal($name,"blue",99))}else{my $a=sprintf("%02X",ReadingsVal($name,"brightness",0)*2.555);"$a$a$a"}}
   webCmd     on:off:pct:ct:rgb


# shellybulb using original firmware
name:A_15_shellybulb
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*shellies.*
desc:shellybulb using original firmware <br>Tested with 1.49
par:DEVNAME;name of this shelly;{ AttrVal("DEVICE","readingList","") =~ m,shellies/([^/]+)/, ? $1 : undef }
attr DEVICE setList\
  off:noArg shellies/DEVNAME/color/0/command off\
  on:noArg shellies/DEVNAME/color/0/command on\
  pct:colorpicker,BRI,0,1,100 shellies/DEVNAME/color/0/set {"turn":"on","gain":"$EVTPART1","brightness":"$EVTPART1"}\
  ct:colorpicker,CT,3000,10,6500 {$EVTPART1=3000 if ($EVTPART1<3000);"shellies/DEVNAME/color/0/set {\"turn\":\"on\",\"mode\":\"white\",\"temp\":\"$EVTPART1\"}"}\
  rgb:colorpicker,RGB {$EVTPART1=~/(..)(..)(..)/;if($1 ne $2 || $2 ne $3){"shellies/DEVNAME/color/0/set {\"turn\":\"on\",\"mode\":\"color\",\"gain\":\"100\",\"red\":".hex($1).",\"green\":".hex($2).",\"blue\":".hex($3)."}"}else{"shellies/shellybulb-3CC533/color/0/set {\"turn\":\"on\",\"mode\":\"white\",\"brightness\":".int(hex($1)/2.55)."}"}}
deletereading -q DEVICE status_.*
attr DEVICE readingList shellies/DEVNAME/color/0/status:.* {json2nameValue($EVENT)}
attr DEVICE userReadings ct {ReadingsVal($name,"temp",3000)}, rgb {if(ReadingsVal($name,"mode","") eq "color"){sprintf("%02X%02X%02X", ReadingsVal($name,"red",99), ReadingsVal($name,"green",99), ReadingsVal($name,"blue",99))}else{my $a=sprintf("%02X",ReadingsVal($name,"brightness",0)*2.555);"$a$a$a"}}
attr DEVICE webCmd on:off:pct:ct:rgb
attr DEVICE genericDeviceType light
attr DEVICE icon light_control
attr DEVICE model A_15_shellybulb

Beta-User

Moin Georg,

Danke für die Aktualisierung.

Um das nochmal aufzugreifen:
Zitat von: Beta-User am 02 Mai 2019, 15:49:55
Für das template (das ansonsten für mich ok aussieht, aber von deinem list abweicht) bzw. das dortige rgb würde ich jetzt die Verwendung eines einschränkenden Triggers vorschlagen (die werden zusammen aktualisiert, von daher reicht eines als trigger):
userReadings rgb:red {sprintf("%02X%02X%02X", ReadingsVal($name,"red",99), ReadingsVal($name,"green",99), ReadingsVal($name,"blue",99))}
Kannst du mal testen, ob die Einschränkung der trigger so paßt:
attr DEVICE userReadings ct:temp {ReadingsVal($name,"temp",3000)}, rgb:(mode|red|brightness) {if(ReadingsVal($name,"mode","") eq "color"){sprintf("%02X%02X%02X", ReadingsVal($name,"red",99), ReadingsVal($name,"green",99), ReadingsVal($name,"blue",99))}else{my $a=sprintf("%02X",ReadingsVal($name,"brightness",0)*2.555);"$a$a$a"}}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

gvzdus

Nee, das klappt nicht. Hier nochmal ein Versuch (siehe Zeitstempel der userReadings):
Internals:
   CFGFN     
   CID        shellybulb_3CC533
   DEF        shellybulb_3CC533
   DEVICETOPIC MQTT2_shellybulb_3CC533
   FUUID      5ccc76ea-f33f-8d06-0279-a2cddb67dbab22f3
   IODev      MQTT2_FHEM_Server
   LASTInputDev MQTT2_FHEM_Server
   MQTT2_FHEM_Server_MSGCNT 1685
   MQTT2_FHEM_Server_TIME 2019-05-04 08:42:56
   MSGCNT     1685
   NAME       MQTT2_shellybulb_3CC533
   NR         219
   STATE      ct
   TYPE       MQTT2_DEVICE
   OLDREADINGS:
   READINGS:
     2019-05-03 19:54:10   announce_fw_ver 20190402-134156/v1.4.9@9be72c7e
     2019-05-03 19:54:10   announce_id     shellybulb-3CC533
     2019-05-03 19:54:10   announce_ip     192.168.0.5
     2019-05-03 19:54:10   announce_mac    DE4F223CC533
     2019-05-03 19:54:10   announce_new_fw false
     2019-05-04 08:42:56   blue            0
     2019-05-04 08:42:56   brightness      0
     2019-05-04 08:42:28   color_0         on
     2019-05-04 08:41:26   ct              3000
     2019-05-04 08:42:56   effect          0
     2019-05-04 08:42:56   gain            100
     2019-05-04 08:42:56   green           0
     2019-05-04 08:42:56   ison            true
     2019-05-04 08:42:56   mode            white
     2019-05-03 19:54:10   online          true
     2019-05-04 08:42:56   red             28
     2019-05-04 08:41:26   rgb             001E00
     2019-05-04 08:42:28   state           ct
     2019-05-04 08:42:56   temp            6500
     2019-05-04 08:42:56   white           0
Attributes:
   IODev      MQTT2_FHEM_Server
   alexaName  Licht Kinderzimmer
   genericDeviceType light
   icon       light_control
   model      A_15_shellybulb
   readingList shellies/shellybulb-3CC533/color/0/status:.* {json2nameValue($EVENT)}
shellybulb_3CC533:shellies/shellybulb-3CC533/color/0:.* color_0
shellybulb_3CC533:shellies/shellybulb-3CC533/online:.* online
shellybulb_3CC533:shellies/announce:.* { json2nameValue($EVENT, 'announce_', $JSONMAP) }
   room       MQTT2_DEVICE
   setList    off:noArg shellies/shellybulb-3CC533/color/0/command off
  on:noArg shellies/shellybulb-3CC533/color/0/command on
  pct:colorpicker,BRI,0,1,100 shellies/shellybulb-3CC533/color/0/set {"turn":"on","gain":"$EVTPART1","brightness":"$EVTPART1"}
  ct:colorpicker,CT,3000,10,6500 {$EVTPART1=3000 if ($EVTPART1<3000);"shellies/shellybulb-3CC533/color/0/set {\"turn\":\"on\",\"mode\":\"white\",\"temp\":\"$EVTPART1\"}"}
  rgb:colorpicker,RGB {$EVTPART1=~/(..)(..)(..)/;if($1 ne $2 || $2 ne $3){"shellies/shellybulb-3CC533/color/0/set {\"turn\":\"on\",\"mode\":\"color\",\"gain\":\"100\",\"red\":".hex($1).",\"green\":".hex($2).",\"blue\":".hex($3)."}"}else{"shellies/shellybulb-3CC533/color/0/set {\"turn\":\"on\",\"mode\":\"white\",\"brightness\":".int(hex($1)/2.55)."}"}}
   userReadings ct:temp {ReadingsVal($name,"temp",3000)}, rgb:(mode|red|green|blue|brightness) {if(ReadingsVal($name,"mode","") eq "color"){sprintf("%02X%02X%02X", ReadingsVal($name,"red",99), ReadingsVal($name,"green",99), ReadingsVal($name,"blue",99))}else{my $a=sprintf("%02X",ReadingsVal($name,"brightness",0)*2.555);"$a$a$a"}}
   webCmd     on:off:pct:ct:rgb

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

gvzdus

ct:.* {ReadingsVal($name,"temp",3000)}, rgb:.* {if(ReadingsVal($name,"mode","") eq "color"){sprintf("%02X%02X%02X", ReadingsVal($name,"red",99), ReadingsVal($name,"green",99), ReadingsVal($name,"blue",99))}else{my $a=sprintf("%02X",ReadingsVal($name,"brightness",0)*2.555);"$a$a$a"}}

funktioniert, Updates kommen rein.

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

gvzdus

ct:temp.* {ReadingsVal($name,"temp",3000)}, rgb:(mode|brightness|red).* {if(ReadingsVal($name,"mode","") eq "color"){sprintf("%02X%02X%02X", ReadingsVal($name,"red",99), ReadingsVal($name,"green",99), ReadingsVal($name,"blue",99))}else{my $a=sprintf("%02X",ReadingsVal($name,"brightness",0)*2.555);"$a$a$a"}}

aktualisiert auch.

Beta-User

 :) Sehr schön. Kannst du jetzt noch checken, ob du in der 2. reges alles brauchst? Oder ob wir kürzen können...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

gvzdus

Egal, was man ändert, der Shelly published immer den gesamten Parametervektor. Insofern reicht auch:
ct:temp.* {ReadingsVal($name,"temp",3000)}, rgb:temp.* {if(ReadingsVal($name,"mode","") eq "color"){sprintf("%02X%02X%02X", ReadingsVal($name,"red",99), ReadingsVal($name,"green",99), ReadingsVal($name,"blue",99))}else{my $a=sprintf("%02X",ReadingsVal($name,"brightness",0)*2.555);"$a$a$a"}}
Aber mal angenommen, jeder hat wie ich eine Bitcoin-Schürfschleuder in Form des Raspberry Pi 3: Bringen diese Pattern so viel?

Beta-User

Es bringt bei besser konzipierten firmwares korrekte Zeitstempel und korrekte Darstellungen. So jedenfalls bei den MiLights mit der sidoh-firmware  :) .
Von daher werde ich die letzte Version, die 2. regex dann wohl nur mit blue, einchecken, oder?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

gvzdus

Gerne. Mich reizt ja auch, die set-Terme noch zu verkürzen - aber das geht dann zulasten der Leserlichkeit...

87insane

#313
Thema Shelly1PM:

Hallo nochmal - ich habe nun zwar gefudelt aber es ist einfacher so als ich dachte. Um der Sache mit der Interpretation von FHEM aus dem Weg zu gehen aber trotzdem on/offline Status und Webinterface zu bekommen, gleichzeitig mit Alexa Steuerung habe ich mal ein wenig angepasst.

Das Template muss nur wie folgt aussehen:
# shelly1pm using original firmware.
name:A_10b_shelly1pm
filter:TYPE=MQTT2_DEVICE
par:DEVNAME;Shelly1 name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,shellies/([^/]*)/, ? $1 : undef }
attr DEVICE setList\
  relay0:on,off,toggle shellies/DEVNAME/relay/0/command $EVTPART1
attr DEVICE readingList \
  shellies/DEVNAME/relay/0:.* state\
  shellies/DEVNAME/relay/0:.* relay0\
  shellies/DEVNAME/input/0:.* input0\
  shellies/DEVNAME/online:.* online\
  shellies/DEVNAME/announce:.* { json2nameValue($EVENT) }\
  shellies/DEVNAME/relay/0/power:.* relay_0_power\
  shellies/DEVNAME/temperature:.* temperature\
  shellies/DEVNAME/overtemperature:.* overtemperature\
  shellies/DEVNAME/relay/0/energy:.* relay_0_energy\
  shellies/DEVNAME/longpush/0:.* longpush_0\
  shellies/announce:.* { json2nameValue($EVENT) }
attr DEVICE devStateIcon true:10px-kreis-gruen false:10px-kreis-rot on:on:relay0+off off:off:relay0+on
attr DEVICE genericDeviceType switch
attr DEVICE homebridgeMapping On=state,valueOff=relay0+off,valueOn=relay0+on,cmdOff=relay0+off,cmdOn=relay0+on
attr DEVICE stateFormat <a href="http://ip" target="_blank">\
online\
</a>\
relay0\
Aktuell: relay_0_power W / Temperatur: temperature °C
attr DEVICE webCmd :relay0
deletereading -q DEVICE [^(associatedWith)]*
attr DEVICE model A_10b_shelly1pm


Entscheidend ist hier das HomebridgeMapping. So wird Alexa mitgeteilt, dass on/off hier eben andere Befehle sind. Fhem interpretiert nun state nicht mehr wegen on/off anders und es geht.
Die on/off Readings in setList können also rauß. Hinzu habe ich mal attr DEVICE genericDeviceType switch hinzugefügt da dies zum Gerät passt. Einen Alexa Namen würde ich an dieser Stelle nicht im Template vergeben sondern manuell über den User machen lassen. Da jeder andere Namen nutzt um seine Geräte an zu sprechen.... Deckenlicht, Deckenlampe usw.....

@Beta-User: Was sagst du - Kannst du es einchecken?
PS: Anbei ein Bild wie es nun bei mir aussieht. Denke so kann man damit arbeiten :) (Den Rechtschreibfehler bei Temperatur habe ich im Template natürlich nicht drin gelassen)

Beta-User

Zitat von: 87insane am 04 Mai 2019, 13:25:18
@Beta-User: Was sagst du - Kannst du es einchecken?
Ich habe vorhin erst eine etwas andere Fassung eingecheckt ??? ::) . Sollte die IP im Klartext anzeigen, mit etwas Glück ist es sogar klickbar (ich glaube aber nicht daran).

Das "Problem" mit deinem Vorschlag ist, dass manche Attribute erst verfügbar sind, wenn das Umfeld paßt (genericType habe ich eben mal erfolglos bei mir gesucht...). Das kann ich so also nicht einchecken, weil es mit einiger Sicherheit Fehler wirft.

Neulich gab es an anderer Stelle eine Diskussion, ob es Sinn machen würde, sowas wie "sprachsteurungs-spezifische" Zusatztemplates zu generieren, die dann intern erst das Basistemplate verwenden, und dann die Zusätze so machen, dass homebridge usw. damit klarkommen. Das würde aber in diesem Rahmen zu weit führen, und ich kann/will das auch nicht intensiver begleiten. Bitte daher ggf. das mal suchen (3-6 Wochen zurück, Stichwort template).

Ansonsten: Perl lernen ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files