Gelöst: Template für eigene Devices generieren

Begonnen von Nielsiwilsi, 26 Mai 2020, 20:29:15

Vorheriges Thema - Nächstes Thema

Nielsiwilsi

Hallo,
ist wahrscheinlich schon x-mal gefragt worden, aber ich finde es nicht.

Gibt es irgendwo eine Anleitung (für DUMMIES) wie man sich aus einem MQTT Device ein Template generieren kann um es dann auf andere Device anwenden zu können? Mir geht es nicht drum hier ein fertiges Template zu bekommen, ich möchte das selber können um es später weiter anpassen zu können.

Als Beispiel: Ich habe mir eine Steuerung für unsere dezentrale Lüftung aus drei Shellyrgbw2 gebaut und möchte wenn ich was anpasse, nicht immer bei allen 12 Devices den gleichen Schritt wiederholen.

Danke für eure Hilfe
Niels

Internals:
   CID        mqtt2client
   DEF        mqtt2client
   DEVICETOPIC OG_Kind2_Lueftung_West
   FUUID      5e8645b3-f33f-7cb5-0924-08c32d26345c2219
   IODev      mqtt2_client
   LASTInputDev mqtt2_client
   MSGCNT     56834
   NAME       OG_Kind2_Lueftung_West
   NR         367
   STATE      true
   TYPE       MQTT2_DEVICE
   mqtt2_client_MSGCNT 56834
   mqtt2_client_TIME 2020-05-26 20:10:26
   JSONMAP:
     brightness pct
   OLDREADINGS:
   READINGS:
     2020-05-26 19:57:53   fw_ver          20200309-104453/v1.6.0@43056d58
     2020-05-26 20:10:26   has_timer       false
     2020-05-26 19:57:53   id              shellyrgbw2-F43EBB
     2020-05-26 19:57:53   ip              192.168.1.217
     2020-05-26 20:10:26   ison            true
     2020-05-26 19:57:53   mac             68C63AF43EBB
     2020-05-26 20:10:26   mode            white
     2020-05-26 19:57:53   new_fw          false
     2020-05-26 19:57:53   online          true
     2020-05-26 20:10:26   overpower       false
     2020-05-26 20:10:26   pct             42
     2020-05-26 20:10:26   power           0.00
     2020-05-26 20:10:26   state           on
     2020-05-26 20:10:26   timer_remaining 0
     2020-05-26 19:52:06   x_update        set
Attributes:
   DbLogExclude .*
   DbLogInclude ison,pct,overpower
   IODev      mqtt2_client
   autocreate 0
   devStateIcon true:Ventilator_wind@orange false:Ventilator_fett
   event-on-change-reading .*
   group      Lueftungsteuerung
   jsonMap    brightness:pct
   model      shelly2rgbw_ventilation
   readingList shellies/shellyrgbw2-F43EBB/white/2/status:.* {json2nameValue($EVENT,'',$JSONMAP)}
  shellies/shellyrgbw2-F43EBB/white/2:.* state
  shellies/shellyrgbw2-F43EBB/white/2/set:.* { json2nameValue($EVENT) }
  shellies/shellyrgbw2-F43EBB/online:.* online
  shellies/announce:.* { $EVENT =~ m,..id...shellyrgbw2-F43EBB...mac.*, ? json2nameValue($EVENT) : undef }
   room       Lueftung_new
   setList    off:noArg shellies/shellyrgbw2-F43EBB/white/2/command off
  on:noArg shellies/shellyrgbw2-F43EBB/white/2/command on
  pct:colorpicker,BRI,0,1,100 shellies/shellyrgbw2-F43EBB/white/2/set {"mode":"white","brightness":"$EVTPART1"}
  pct_on:colorpicker,BRI,0,1,100 shellies/shellyrgbw2-F43EBB/white/2/set {"ison":"true","mode":"white","brightness":"$EVTPART1"}
  x_update:noArg shellies/shellyrgbw2-F43EBB/command update_fw
  x_mqttcom shellies/shellyrgbw2-F43EBB/command $EVTPART1
   setStateList on off
   stateFormat ison
   webCmd     pct

Otto123

Hi,

hier gibt es etwas https://wiki.fhem.de/wiki/AttrTemplate da sind auch noch Links.

Ob es das ist was Du suchst? Generieren ist glaube ich so wie: Raw Definition und dann Editieren ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Genau...

Hier hattest du ja schon ein vorhandenes als Grundlage genommen, oder? Dann sollte es noch einfacher sein: Einfach das kopieren, unter anderem Namen in das richtige Verzeichnis packen und vorher die Anpassungen machen...

(Bei "contributing..." gibt es auch noch eine Mini-Anleitung, die etwas spezieller für MQTT2_DEVICE ist).

Sonst bitte einfach konkrete Fragen stellen :) .
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

Nielsiwilsi

Danke Super!

Soweit hats schon mal geklappt. :-)

Gibt es noch eine Möglichkeit den Channel zu extrahieren, damit alles generischer wird und als par:CHANNEL.... oä. einzufügen?
Dafür reichen meine Programmierkenntnisse nicht aus.

siehe hier:   shellies/DEVNAME/white/2:.


#contributed by user Nielsiwilsi
name:shelly2rgbw_4_pluggit
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*shellies.*
desc:shelly2rgbw configured for ch2 to control pluggit iconvent
order:A_17a
par:DEVNAME;name of this shelly;{ AttrVal("DEVICE","readingList","") =~ m,shellies/([^/]*)/, ? $1 : undef }
attr DEVICE readingList shellies/DEVNAME/white/2/status:.* {json2nameValue($EVENT,'',$JSONMAP)}\
  shellies/DEVNAME/white/2:.* state\
  shellies/DEVNAME/white/2/set:.* { json2nameValue($EVENT) }\
  shellies/DEVNAME/online:.* online\
  shellies/announce:.* { $EVENT =~ m,..id...DEVNAME...mac.*, ? json2nameValue($EVENT) : undef }
attr DEVICE setList off:noArg shellies/DEVNAME/white/2/command off\
  on:noArg shellies/DEVNAME/white/2/command on\
  pct:colorpicker,BRI,0,1,100 shellies/DEVNAME/white/2/set {"mode":"white","brightness":"$EVTPART1"}\
  pct_on:colorpicker,BRI,0,1,100 shellies/DEVNAME/white/2/set {"ison":"true","mode":"white","brightness":"$EVTPART1"}\
  x_update:noArg shellies/DEVNAME/command update_fw\
  x_mqttcom shellies/DEVNAME/command $EVTPART1
deletereading -q DEVICE .*
deleteattr DEVICE comment
deleteattr DEVICE icon
attr DEVICE webCmd pct
attr DEVICE jsonMap brightness:pct
attr DEVICE model shelly2rgbw_4_pluggit
attr DEVICE autocreate 0
attr DEVICE setStateList on off
attr DEVICE DbLogExclude .*
attr DEVICE DbLogInclude ison,pct,overpower
attr DEVICE devStateIcon true:Ventilator_wind@orange false:Ventilator_fett
attr DEVICE event-on-change-reading .*
attr DEVICE group Lueftungsteuerung
attr DEVICE model shelly2rgbw_4_pluggit
attr DEVICE stateFormat ison
set DEVICE x_mqttcom announce
set DEVICE x_update

Beta-User

So ganz weiß ich nicht, worauf du raus willst. Da du vermutlich alle Channels sowieso getrennt haben willst, ist die Variante "split" als Basis vermutlich einfacher, siehe als Beispiel shelly2rgbw_4w_split. Das legt gleich alle Kanäle als einzelne Devices 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

Nielsiwilsi

also meine Idee war es die Konfiguration aller Lüftungs-devices als bulk zu aktualisieren, um nichts zu vergessen und überall einheitlich die attr gesetzt zu haben.
Der Unterschied ist nur der Davice-Name und das MQTT Topic.

Kann ich irgendwo diese String-Zerteilung nachlesen und lernen?
par:DEVNAME;name of this shelly;{ AttrVal("DEVICE","readingList","") =~ m,shellies/([^/]*)/, ? $1 : undef }

ich würde versuchen so was zu bauen:
par:CHANNELNO;channel of this shelly;{ AttrVal("DEVICE","readingList","") =~ m,shellies/shellyrgbw2-661598/white/([^/]*)/, ? $1 : undef }


So schwer ist das glaub ich aber nicht. Nur muss "shellyrgbw2-661598" geplatzhaltert werden.

VG
Niels

Beta-User

Das ist "normales regex" => regexr.com/ und andere...
([^/]*) beduetet eigentlich nur= beliebig viele Zeichen, die kein "/" sind. Ist "eigentlich" nur eine MQTT-Spezialität, um Topic-Elemente erkennen zu können, weil da der Trenner eben "/" ist...
Noch besser ist m.e. ([^/]+), wenn man das als "wildcard" verwendet und die "capture group" nicht braucht, ergibt sich:par:CHANNELNO;channel of this shelly;{ AttrVal("DEVICE","readingList","") =~ m,shellies/[^/]+/white/([^/]+)/, ? $1 : undef }
Oder eben die Angabe, dass es mind. eine Zahl sein muß:
par:CHANNELNO;channel of this shelly;{ AttrVal("DEVICE","readingList","") =~ m,shellies/[^/]+/white/(\d+)/, ? $1 : undef }
par:CHANNELNO;channel of this shelly;{ AttrVal("DEVICE","readingList","") =~ m,shellies/[^/]+/white/([0-9]+)/, ? $1 : undef }
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

Nielsiwilsi

Vielen Dank es geht.
Allerdings sind mir die unterstichenen Codeteile nicht klar, was die machen.

par:CHANNELNO;channel of this shelly;{ AttrVal("DEVICE","readingList","") =~ m,shellies/[^/]+/white/([0-9]+)/, ? $1 : undef }

Außerdem hat regexr.com mehrere Ergebnisse geliefert und erst in der 3. Möglichkeit die richtige Channelnummer.

Beta-User

Das mit den Channels würde ich anders lösen: einfach weitere defines/defmod in das attrTemplate aufnehmen (so mache ich das bei praktisch allen "Mehrkanalern", bei denen die Kanalnummer noch nicht bekannt ist).

Ansonsten ist "=~" das Zeichen für regex, "m" für "match", also reine Suche, die "," sind das Begrenzungszeichen für den regex-Ausdruck, und "xyz ? a : b;" ist nichts anderes als ein verkürztes "if (xyz) {a} else {b};".
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

Nielsiwilsi

Danke. Ich melde das Thema hiermit als gelöst.

Mit deiner Erklärung kann ich jetzt was anfangen.
Ich werde aber bei meiner Lösung erst mal bleiben. Ich hab unterschiedliche Device Namen da die Lüfter in verschieden Räumen sind. evtl muss ich mir da noch mal was überlegen. Aber zur Zeit funktioniert es wie es soll. Und darauf kommts an. :-)

Danke noch mal. :-)

Beta-User

Na ja, kommt drauf an, wie die Ausgangslage ist. Wenn du schon ein bzw. mehrere Device/s hast, bei denen es jeweils nur einen "Treffer" geben kann, ist deine Lösung sicher ok, ggf. müßte man sich ansehen, wie man die regex "geschärft" bekommt. Sonst einfach undef zurückgeben, dann bekommst du ein Dialogfeld und mußt dann "nur" wissen, was du eintragen mußt.

Wenn es darum geht, die Attribute irgendwie "in Line" zu halten, könnte auch archetype was sein, was du dir ansehen könntest (bitte keine Fragen dazu an mich, kenne das auch nur vom Hörensagen).

Ansonsten gibt's ja auch rename, die vergebenen Kanal-Namen sind ja nichts unveränderliches....
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