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
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
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 :) .
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
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.
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
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 }
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.
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};".
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. :-)
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....