diff --git a/fhem/FHEM/lib/AttrTemplate/mqtt2.template b/fhem/FHEM/lib/AttrTemplate/mqtt2.template
index 51c11adc1..02f43e374 100644
--- a/fhem/FHEM/lib/AttrTemplate/mqtt2.template
+++ b/fhem/FHEM/lib/AttrTemplate/mqtt2.template
@@ -389,21 +389,21 @@ attr DEVICE model L_14_aqara_cube
name:A_01a_tasmota_basic_state_power1
filter:TYPE=MQTT2_DEVICE
desc:Applies to Sonoff Basic, S20 using POWER1-topic for relay state
NOTE: The format the device is sending data will also be changed to lowercase!
NOTE: This template is intended to configure also channel one of multi-channel tasmota devices
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
+par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
+par:STATTOPIC;ack topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}stat$3" : undef }
attr DEVICE stateFormat POWER1
-#attr DEVICE userReadings state:POWER1:.* { lc(ReadingsVal($name,"POWER1","")) }
-#attr DEVICE eventMap { dev=>{'^(.*)POWER(.?): OFF$'=>'$1POWER$2: off', '^(.*)POWER(.?): ON$'=>'$1POWER$2: on'} }
-set DEVICE attrTemplate A_01z_tasmota_set_lowercase_texts_and_state1
+set DEVICE attrTemplate A_01z_tasmota_set_lowercase_texts_and_state1_nF
attr DEVICE setList \
- off:noArg cmnd/DEVNAME/POWER1 0\
- on:noArg cmnd/DEVNAME/POWER1 1\
- toggle:noArg cmnd/DEVNAME/POWER1 2
+ off:noArg CMNDTOPIC/POWER1 0\
+ on:noArg CMNDTOPIC/POWER1 1\
+ toggle:noArg CMNDTOPIC/POWER1 2
attr DEVICE readingList \
- tele/DEVNAME/LWT:.* LWT\
- tele/DEVNAME/STATE:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/SENSOR:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/INFO.:.* { json2nameValue($EVENT) }\
- stat/DEVNAME/RESULT:.* { json2nameValue($EVENT) }
+ TELETOPIC/LWT:.* LWT\
+ TELETOPIC/STATE:.* { json2nameValue($EVENT) }\
+ TELETOPIC/SENSOR:.* { json2nameValue($EVENT) }\
+ TELETOPIC/INFO.:.* { json2nameValue($EVENT) }\
+ STATTOPIC/RESULT:.* { json2nameValue($EVENT) }
deletereading -q DEVICE (?!associatedWith).*
attr DEVICE setStateList on off toggle
attr DEVICE autocreate 0
@@ -416,30 +416,33 @@ desc:Applies to Sonoff 1 Channel devices using POWER-topic for relay state
N
set DEVICE attrTemplate A_01a_tasmota_basic_state_power1
name:A_01x_tasmota_clear_readings_reset_readingsList_and_reboot
-filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
+filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc: replaces the readingList with defaults, clears the readingList and reboots to get all readings
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
+par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
+par:STATTOPIC;ack topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}stat$3" : undef }
+#par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
par:IO_DEV;Currently used IO;{ AttrVal("DEVICE","IODev","")}
attr DEVICE readingList \
- tele/DEVNAME/LWT:.* LWT\
- tele/DEVNAME/STATE:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/SENSOR:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/INFO.:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/UPTIME:.* { json2nameValue($EVENT) }\
- stat/DEVNAME/RESULT:.* { json2nameValue($EVENT) }
+ TELETOPIC/LWT:.* LWT\
+ TELETOPIC/STATE:.* { json2nameValue($EVENT) }\
+ TELETOPIC/SENSOR:.* { json2nameValue($EVENT) }\
+ TELETOPIC/INFO.:.* { json2nameValue($EVENT) }\
+ TELETOPIC/UPTIME:.* { json2nameValue($EVENT) }\
+ STATTOPIC/RESULT:.* { json2nameValue($EVENT) }
deletereading -q DEVICE (?!associatedWith).*
-set IO_DEV publish cmnd/DEVNAME/Restart 1
+set IO_DEV publish CMNDTOPIC/Restart 1
attr DEVICE autocreate 0
name:A_01x_tasmota_prefix_clearing_and_reboot
filter:TYPE=MQTT2_DEVICE::FILTER=readingList=.*(tele|cmnd).*
desc:Applies to all tasmota devices
NOTE: This template will delete some readings and clear the readingList from prefix use when expanding json.
When applying the template the tasmota device is rebooted to get all readings
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
par:IO_DEV;Currently used IO;{ AttrVal("DEVICE","IODev","")}
par:READINGLISTCLEARED;cleared from prefixes;{ AttrVal("DEVICE","readingList","") =~ s/, '[^_]+[_]'/, ''/g, ? $1 : undef }
attr DEVICE readingList READINGLISTCLEARED
deletereading -q DEVICE (?!associatedWith).*
-set IO_DEV publish cmnd/DEVNAME/Restart 1
+set IO_DEV publish CMNDTOPIC/Restart 1
attr DEVICE autocreate 0
# tasmota device with one relay, one motion sensor via switch
@@ -447,11 +450,11 @@ name:A_01b_tasmota_1ch+motion+SI7021
desc:tasmota device with one relay, one motion sensor via switch and one SI7021 combined temperature and humidity sensor.
Configures a single device including all readings
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
set DEVICE attrTemplate A_01a_tasmota_basic_state_power1
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
attr DEVICE setList \
- off:noArg cmnd/DEVNAME/POWER1 0\
- on:noArg cmnd/DEVNAME/POWER1 1\
- toggle:noArg cmnd/DEVNAME/POWER1 2
+ off:noArg CMNDTOPIC/POWER1 0\
+ on:noArg CMNDTOPIC/POWER1 1\
+ toggle:noArg CMNDTOPIC/POWER1 2
attr DEVICE stateFormat {\
ReadingsVal($name, "POWER1", "off") . " "\
ReadingsVal($name, "POWER2", "off") . " "\
@@ -485,19 +488,20 @@ attr DEVICE model A_01c_tasmota_POW
name:A_01d_tasmota_ir
desc:Demonstrates multiple options how to configure tasmota devices as IR remote control extension.
Forum Thread
Tasmota IRremote Commands
Simple IR-circuit
set irsend
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
+par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
par:POWERCMD;needed command to be sent like in example dec '{"protocol":"NEC","bits":32,"data":551489775}' (without '');{ undef }
par:VOLUMEUPCMD;needed command to be sent like in example raw '0,926,844,958,832,1798,868,902,848,900,870,900,852,908,918,958,794,934,874,928,1738,934,856,1764' (without '');{ undef }
par:MULTIPLE1CMD;needed command to be sent like in example hex '{"Protocol":"NEC","Bits":32,"Data":0x8166817E}' (without '');{ undef }
par:MULTIPLE2CMD;needed command to be sent like in example hex '{"Protocol":"NEC","Bits":32,"Data":0x8166817E}' (without '');{ undef }
attr DEVICE setList \
- power:noArg cmnd/DEVNAME/IRsend POWERCMD\
- volumeup:noArg cmnd/DEVNAME/IRsend VOLUMEUPCMD\
- 11:noArg cmnd/DEVNAME/Backlog IRsend MULTIPLE1CMD;cmnd/DEVNAME/delay 8;cmnd/DEVNAME/IRsend MULTIPLE2CMD\
- irsend:textField cmnd/DEVNAME/irsend {"Protocol":"$EVTPART1","Bits":$EVTPART2,"Data":"0x$EVTPART3"}
+ power:noArg CMNDTOPIC/IRsend POWERCMD\
+ volumeup:noArg CMNDTOPIC/IRsend VOLUMEUPCMD\
+ 11:noArg CMNDTOPIC/Backlog IRsend MULTIPLE1CMD;CMNDTOPIC/delay 8;CMNDTOPIC/IRsend MULTIPLE2CMD\
+ irsend:textField CMNDTOPIC/irsend {"Protocol":"$EVTPART1","Bits":$EVTPART2,"Data":"0x$EVTPART3"}
attr DEVICE readingList \
- tele/DEVNAME/INFO.:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/RESULT:.* { $EVENT =~ m,..IrReceived....Protocol...([A-Za-z0-9]+)...Bits..([\d]+)..Data...([A-Za-z0-9]+)..., ? {"$1_$2"=>$3} : json2nameValue($EVENT) }
+ TELETOPIC/INFO.:.* { json2nameValue($EVENT) }\
+ TELETOPIC/RESULT:.* { $EVENT =~ m,..IrReceived....Protocol...([A-Za-z0-9]+)...Bits..([\d]+)..Data...([A-Za-z0-9]+)..., ? {"$1_$2"=>$3} : json2nameValue($EVENT) }
attr DEVICE stateFormat state\
\
IPAddress
@@ -505,26 +509,53 @@ attr DEVICE event-on-change-reading .*
attr DEVICE icon IR
attr DEVICE model A_01d_tasmota_ir
+#tasmota device with rf-circuit
+name:A_01d_tasmota_rf
+desc:Demonstrates multiple options how to configure tasmota devices as rf remote control extension.
Forum Thread
NOTE: still widely untested...
+filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
+par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
+#par:POWERCMD;needed command to be sent like in example dec '{"protocol":"NEC","bits":32,"data":551489775}' (without '');{ undef }
+#par:VOLUMEUPCMD;needed command to be sent like in example raw '0,926,844,958,832,1798,868,902,848,900,870,900,852,908,918,958,794,934,874,928,1738,934,856,1764' (without '');{ undef }
+#par:MULTIPLE1CMD;needed command to be sent like in example hex '{"Protocol":"NEC","Bits":32,"Data":0x8166817E}' (without '');{ undef }
+#par:MULTIPLE2CMD;needed command to be sent like in example hex '{"Protocol":"NEC","Bits":32,"Data":0x8166817E}' (without '');{ undef }
+attr DEVICE setList \
+ power:noArg CMNDTOPIC/RFsend POWERCMD\
+ volumeup:noArg CMNDTOPIC/RFsend VOLUMEUPCMD\
+ rfsend:textField CMNDTOPIC/RFsend {"Protocol":"$EVTPART1","Bits":$EVTPART2,"Data":"0x$EVTPART3"}
+attr DEVICE readingList \
+ TELETOPIC/INFO.:.* { json2nameValue($EVENT) }\
+# TELETOPIC/RESULT:.* /SmartHome/Interface/Bridge/tele/RESULT:.* { $EVENT =~ m,..RfReceived....Sync..([A-Za-z0-9]+)..Low..([\d]+)..High..([\d]+)..Data...([A-Za-z0-9]+)...RfKey...([^"]+)..., ? {'$1_$2_$3'=>"$4"} : json2nameValue($EVENT) }\
+ TELETOPIC/RESULT:.* { $EVENT =~ m,..RfReceived....Sync..([A-Za-z0-9]+)..Low..([\d]+)..High..([\d]+)..Data...([A-Za-z0-9]+)...RfKey...([^"]+)..., ? {"json_raw"=>$EVENT} : undef }\
+ TELETOPIC/RESULT:.* { $EVENT =~ m,..RfReceived....Sync..([A-Za-z0-9]+)..Low..([\d]+)..High..([\d]+)..Data...([A-Za-z0-9]+)...RfKey...([^"]+)..., ? {"Data"=>"$4"} : undef }
+attr DEVICE stateFormat state\
+
\
+IPAddress
+attr DEVICE event-on-change-reading .*
+attr DEVICE model A_01d_tasmota_rf
+
# tasmota 2ch as one FHEM device.
name:A_02a_tasmota_2ch_unified
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
desc:Configures a single device including all readings
set DEVICE attrTemplate A_01a_tasmota_basic_state_power1
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
+par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
+par:STATTOPIC;ack topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}stat$3" : undef }
attr DEVICE setList \
- POWER1:on,off,toggle cmnd/DEVNAME/POWER1 $EVTPART1\
- POWER2:on,off,toggle cmnd/DEVNAME/POWER2 $EVTPART1
+ POWER1:on,off,toggle CMNDTOPIC/POWER1 $EVTPART1\
+ POWER2:on,off,toggle CMNDTOPIC/POWER2 $EVTPART1
attr DEVICE webCmd POWER1 on:POWER1 off:POWER2 on:POWER2 off
attr DEVICE devStateIcon Online:10px-kreis-gruen Offline:10px-kreis-rot 1.on:on:POWER1+off 1.off:off:POWER1+on 2.on:on:POWER2+off 2.off:off:POWER2+on
attr DEVICE readingList \
- tele/DEVNAME/LWT:.* LWT\
- tele/DEVNAME/STATE:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/SENSOR:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/INFO.:.* { json2nameValue($EVENT) }\
- stat/DEVNAME/RESULT:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/UPTIME:.* { json2nameValue($EVENT) }\
- stat/DEVNAME/POWER1:.* POWER1\
- stat/DEVNAME/POWER2:.* POWER2
+ TELETOPIC/LWT:.* LWT\
+ TELETOPIC/STATE:.* { json2nameValue($EVENT) }\
+ TELETOPIC/SENSOR:.* { json2nameValue($EVENT) }\
+ TELETOPIC/INFO.:.* { json2nameValue($EVENT) }\
+ STATTOPIC/RESULT:.* { json2nameValue($EVENT) }\
+ TELETOPIC/UPTIME:.* { json2nameValue($EVENT) }\
+ STATTOPIC/POWER1:.* POWER1\
+ STATTOPIC/POWER2:.* POWER2
attr DEVICE stateFormat LWT\
1:POWER1\
2:POWER2\
@@ -538,8 +569,7 @@ name:A_02_tasmota_2channel_split
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
desc:sonoff 2 channel device flashed with Tasmota.
NOTE: a second device will be created for the second channel
set DEVICE attrTemplate A_01a_tasmota_basic_state_power1
-#par:COMMAND;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\btele(/.*)?/LWT:, ? "${1}cmnd$2" : undef }
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
attr DEVICE comment Channel 1 for DEVICE, see also DEVICE_CH2
copy DEVICE DEVICE_CH2
attr DEVICE_CH2 stateFormat POWER2
@@ -547,9 +577,9 @@ attr DEVICE_CH2 stateFormat POWER2
attr DEVICE_CH2 comment Channel 2 for DEVICE
setreading DEVICE_CH2 associatedWith DEVICE
attr DEVICE_CH2 setList \
- off:noArg cmnd/DEVNAME/POWER2 0\
- on:noArg cmnd/DEVNAME/POWER2 1\
- toggle:noArg cmnd/DEVNAME/POWER2 2
+ off:noArg CMNDTOPIC/POWER2 0\
+ on:noArg CMNDTOPIC/POWER2 1\
+ toggle:noArg CMNDTOPIC/POWER2 2
attr DEVICE_CH2 setStateList on off toggle
attr DEVICE model A_02_tasmota_2channel_split
attr DEVICE_CH2 model A_02_tasmota_2channel_split
@@ -559,34 +589,34 @@ attr DEVICE_CH2 model A_02_tasmota_2channel_split
name:A_02b_tasmota_2ch_shutter_invert_1
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
desc:Configures a dual chanel tasmota device as shutter; needs a special firmware version to operate.
Forum Thread
NOTE: This template will configure the shutter in ROLLO style with pct 0% = open shutter. Use template A_02b_tasmota_2ch_shutter_invert_0, if you need a Homematic-style device pct 100% = open.
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
par:IO_DEV;Currently used IO;{ AttrVal("DEVICE","IODev","")}
set DEVICE attrTemplate A_01z_tasmota_set_lowercase_texts_and_state1
-set IO_DEV publish cmnd/DEVNAME/Backlog LedState 2; SetOption80 1; SetOption14 1; SetOption81 1; switchmode1 3; switchmode2 3; SaveData 1;
-set IO_DEV publish cmnd/DEVNAME/Restart 1
-defmod configure_DEVICEattrTemplate_at at +00:00:20 set IO_DEV publish cmnd/DEVNAME/Backlog SHUTTEROPENDURATION 20;; SHUTTERCLOSEDURATION 20;; SHUTTERINVERT 1;; GROUPTOPIC Rollos;; SaveData 1;;
+set IO_DEV publish CMNDTOPIC/Backlog LedState 2; SetOption80 1; SetOption14 1; SetOption81 1; switchmode1 3; switchmode2 3; SaveData 1;
+set IO_DEV publish CMNDTOPIC/Restart 1
+defmod configure_DEVICEattrTemplate_at at +00:00:20 set IO_DEV publish CMNDTOPIC/Backlog SHUTTEROPENDURATION 20;; SHUTTERCLOSEDURATION 20;; SHUTTERINVERT 1;; GROUPTOPIC Rollos;; SaveData 1;;
attr DEVICE setList \
- close:noArg cmnd/DEVNAME/SHUTTERCLOSE\
- open:noArg cmnd/DEVNAME/SHUTTEROPEN\
- half:noArg cmnd/DEVNAME/SHUTTERPOSITION 50\
- pct:slider,0,1,100 cmnd/DEVNAME/SHUTTERPOSITION $EVTPART1\
- stop:noArg cmnd/DEVNAME/SHUTTERSTOP\
- resetClose:noArg cmnd/DEVNAME/SHUTTERSETCLOSE\
- x_configuration cmnd/DEVNAME/$EVTPART1 $EVTPART2
+ close:noArg CMNDTOPIC/SHUTTERCLOSE\
+ open:noArg CMNDTOPIC/SHUTTEROPEN\
+ half:noArg CMNDTOPIC/SHUTTERPOSITION 50\
+ pct:slider,0,1,100 CMNDTOPIC/SHUTTERPOSITION $EVTPART1\
+ stop:noArg CMNDTOPIC/SHUTTERSTOP\
+ resetClose:noArg CMNDTOPIC/SHUTTERSETCLOSE\
+ x_configuration CMNDTOPIC/$EVTPART1 $EVTPART2
attr DEVICE readingList \
- tele/DEVNAME/LWT:.* LWT\
- stat/DEVNAME/RESULT:.* { json2nameValue($EVENT) }\
- stat/DEVNAME/POWER1:.* POWER1\
- stat/DEVNAME/POWER1:on {{'state' => 'opening'}}\
- stat/DEVNAME/POWER2:.* POWER2\
- stat/DEVNAME/POWER2:on {{'state' => 'closing'}}\
- stat/DEVNAME/SHUTTER1:.* state\
- stat/DEVNAME/SHUTTER1:.* pct\
- tele/DEVNAME/RESULT:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/STATE:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/SENSOR:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/INFO.:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/UPTIME:.* { json2nameValue($EVENT) }
+ TELETOPIC/LWT:.* LWT\
+ STATTOPIC/RESULT:.* { json2nameValue($EVENT) }\
+ STATTOPIC/POWER1:.* POWER1\
+ STATTOPIC/POWER1:on {{'state' => 'opening'}}\
+ STATTOPIC/POWER2:.* POWER2\
+ STATTOPIC/POWER2:on {{'state' => 'closing'}}\
+ STATTOPIC/SHUTTER1:.* state\
+ STATTOPIC/SHUTTER1:.* pct\
+ TELETOPIC/RESULT:.* { json2nameValue($EVENT) }\
+ TELETOPIC/STATE:.* { json2nameValue($EVENT) }\
+ TELETOPIC/SENSOR:.* { json2nameValue($EVENT) }\
+ TELETOPIC/INFO.:.* { json2nameValue($EVENT) }\
+ TELETOPIC/UPTIME:.* { json2nameValue($EVENT) }
attr DEVICE devStateIcon opening:fts_shutter_up@red closing:fts_shutter_down@red Online:10px-kreis-gruen Offline:10px-kreis-rot 100:fts_shutter_100 0:fts_shutter_10 9\d.*:fts_shutter_90 8\d.*:fts_shutter_80 7\d.*:fts_shutter_70 6\d.*:fts_shutter_60 5\d.*:fts_shutter_50 4\d.*:fts_shutter_40 3\d.*:fts_shutter_30 2\d.*:fts_shutter_20 1\d.*:fts_shutter_10 \b\d\b.*:fts_shutter_10 set_.*:fts_shutter_updown
attr DEVICE cmdIcon open:fts_shutter_up close:fts_shutter_down stop:fts_shutter_manual half:fts_shutter_50
attr DEVICE webCmd :open:close:half:stop:pct
@@ -608,10 +638,10 @@ attr DEVICE model A_02b_tasmota_2ch_shutter_invert_1
name:A_02b_tasmota_2ch_shutter_invert_0
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
desc:Configures a dual chanel tasmota device as shutter; needs a special firmware version to operate.
Forum Thread
NOTE: This template will configure the shutter in Homematic-style with pct 100% = open. For ROLLO style device with pct 0% = open shutter. Use template A_02b_tasmota_2ch_shutter_invert_1 instead.
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
par:IO_DEV;Currently used IO;{ AttrVal("DEVICE","IODev","")}
set DEVICE attrTemplate A_02b_tasmota_2ch_shutter_invert_1
-defmod configure_DEVICEattrTemplate_at at +00:00:20 set IO_DEV publish cmnd/DEVNAME/Backlog SHUTTEROPENDURATION 20;; SHUTTERCLOSEDURATION 20;; SHUTTERINVERT 0;; GROUPTOPIC Rollos;; SaveData 1;;
+defmod configure_DEVICEattrTemplate_at at +00:00:20 set IO_DEV publish CMNDTOPIC/Backlog SHUTTEROPENDURATION 20;; SHUTTERCLOSEDURATION 20;; SHUTTERINVERT 0;; GROUPTOPIC Rollos;; SaveData 1;;
attr DEVICE devStateIcon opening:fts_shutter_up@red closing:fts_shutter_down@red Online:10px-kreis-gruen Offline:10px-kreis-rot 100:fts_shutter_10 0:fts_shutter_100 9\d.*:fts_shutter_10 8\d.*:fts_shutter_20 7\d.*:fts_shutter_30 6\d.*:fts_shutter_40 5\d.*:fts_shutter_50 4\d.*:fts_shutter_60 3\d.*:fts_shutter_70 2\d.*:fts_shutter_80 1\d.*:fts_shutter_90 \b\d\b.*:fts_shutter_90
attr DEVICE model A_02b_tasmota_2ch_shutter_invert_0
@@ -620,25 +650,26 @@ name:A_04b_tasmota_4ch_unified_icon
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
desc:Configures a single device including all readings
NOTE: Clicking on icons will issue a corresponding toggle command
set DEVICE attrTemplate A_01a_tasmota_basic_state_power1
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
+par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
+par:STATTOPIC;ack topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}stat$3" : undef }
attr DEVICE setList \
- POWER1:on,off,toggle cmnd/DEVNAME/POWER1 $EVTPART1\
- POWER2:on,off,toggle cmnd/DEVNAME/POWER2 $EVTPART1\
- POWER3:on,off,toggle cmnd/DEVNAME/POWER3 $EVTPART1\
- POWER4:on,off,toggle cmnd/DEVNAME/POWER4 $EVTPART1
+ POWER1:on,off,toggle CMNDTOPIC/POWER1 $EVTPART1\
+ POWER2:on,off,toggle CMNDTOPIC/POWER2 $EVTPART1\
+ POWER3:on,off,toggle CMNDTOPIC/POWER3 $EVTPART1\
+ POWER4:on,off,toggle CMNDTOPIC/POWER4 $EVTPART1
attr DEVICE devStateIcon Online:10px-kreis-gruen Offline:10px-kreis-rot 1.on:on:POWER1+off 1.off:off:POWER1+on 2.on:on:POWER2+off 2.off:off:POWER2+on 3.on:on:POWER3+off 3.off:off:POWER3+on 4.on:on:POWER4+off 4.off:off:POWER4+on
-#attr DEVICE userReadings state:POWER.*:.* { lc(ReadingsVal($name,"POWER1","") . " " . ReadingsVal($name,"POWER2","") . " " . ReadingsVal($name,"POWER3","") . " " . ReadingsVal($name,"POWER4","")) }
attr DEVICE readingList \
- tele/DEVNAME/LWT:.* LWT\
- tele/DEVNAME/STATE:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/SENSOR:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/INFO.:.* { json2nameValue($EVENT) }\
- stat/DEVNAME/RESULT:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/UPTIME:.* { json2nameValue($EVENT) }\
- stat/DEVNAME/POWER1:.* POWER1\
- stat/DEVNAME/POWER2:.* POWER2\
- stat/DEVNAME/POWER3:.* POWER3\
- stat/DEVNAME/POWER4:.* POWER4
+ TELETOPIC/LWT:.* LWT\
+ TELETOPIC/STATE:.* { json2nameValue($EVENT) }\
+ TELETOPIC/SENSOR:.* { json2nameValue($EVENT) }\
+ TELETOPIC/INFO.:.* { json2nameValue($EVENT) }\
+ STATTOPIC/RESULT:.* { json2nameValue($EVENT) }\
+ TELETOPIC/UPTIME:.* { json2nameValue($EVENT) }\
+ STATTOPIC/POWER1:.* POWER1\
+ STATTOPIC/POWER2:.* POWER2\
+ STATTOPIC/POWER3:.* POWER3\
+ STATTOPIC/POWER4:.* POWER4
attr DEVICE stateFormat LWT\
1:POWER1\
2:POWER2\
@@ -654,19 +685,20 @@ name:A_04a_tasmota_4ch_unified_basic_text
desc:Configures a single device
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
set DEVICE attrTemplate A_01a_tasmota_basic_state_power1
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
-#attr DEVICE userReadings state:POWER.*:.* { lc(ReadingsVal($name,"POWER1","") . " " . ReadingsVal($name,"POWER2","") . " " . ReadingsVal($name,"POWER3","") . " " . ReadingsVal($name,"POWER4","")) }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
+par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
+par:STATTOPIC;ack topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}stat$3" : undef }
attr DEVICE readingList \
- tele/DEVNAME/LWT:.* LWT\
- tele/DEVNAME/STATE:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/SENSOR:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/INFO.:.* { json2nameValue($EVENT) }\
- stat/DEVNAME/RESULT:.* { json2nameValue($EVENT) }
+ TELETOPIC/LWT:.* LWT\
+ TELETOPIC/STATE:.* { json2nameValue($EVENT) }\
+ TELETOPIC/SENSOR:.* { json2nameValue($EVENT) }\
+ TELETOPIC/INFO.:.* { json2nameValue($EVENT) }\
+ STATTOPIC/RESULT:.* { json2nameValue($EVENT) }
attr DEVICE setList \
- POWER1:on,off,toggle cmnd/DEVNAME/POWER1 $EVTPART1\
- POWER2:on,off,toggle cmnd/DEVNAME/POWER2 $EVTPART1\
- POWER3:on,off,toggle cmnd/DEVNAME/POWER3 $EVTPART1\
- POWER4:on,off,toggle cmnd/DEVNAME/POWER4 $EVTPART1
+ POWER1:on,off,toggle CMNDTOPIC/POWER1 $EVTPART1\
+ POWER2:on,off,toggle CMNDTOPIC/POWER2 $EVTPART1\
+ POWER3:on,off,toggle CMNDTOPIC/POWER3 $EVTPART1\
+ POWER4:on,off,toggle CMNDTOPIC/POWER4 $EVTPART1
attr DEVICE setStateList on off toggle
attr DEVICE stateFormat P1: POWER1 P2: POWER2 P3: POWER3 P4: POWER4
attr DEVICE webCmd POWER1 toggle:POWER2 toggle:POWER3 toggle:POWER4 toggle
@@ -677,18 +709,20 @@ name:A_05a_tasmota_rgb_led_controller
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
desc:Tasmota RGB controller tested with RGB variant of Magichome, arilux LC-01 ,etc... -> https://github.com/arendst/Sonoff-Tasmota/wiki/MagicHome-LED-strip-controller
set DEVICE attrTemplate A_01a_tasmota_basic_state_power1
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
+par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
+par:STATTOPIC;ack topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}stat$3" : undef }
attr DEVICE setList\
- off:noArg cmnd/DEVNAME/POWER1 0\
- on:noArg cmnd/DEVNAME/POWER1 1\
- toggle:noArg cmnd/DEVNAME/POWER1 2\
- Color:colorpicker,RGB cmnd/DEVNAME/COLOR
+ off:noArg CMNDTOPIC/POWER1 0\
+ on:noArg CMNDTOPIC/POWER1 1\
+ toggle:noArg CMNDTOPIC/POWER1 2\
+ Color:colorpicker,RGB CMNDTOPIC/COLOR
attr DEVICE readingList \
- tele/DEVNAME/LWT:.* LWT\
- stat/DEVNAME/POWER:.* POWER\
- tele/DEVNAME/STATE:.* { json2nameValue($EVENT) }\
- stat/DEVNAME/RESULT:.* { json2nameValue($EVENT) }\
- tele/DEVNAME/INFO.:.* { json2nameValue($EVENT) }
+ TELETOPIC/LWT:.* LWT\
+ STATTOPIC/POWER:.* POWER\
+ TELETOPIC/STATE:.* { json2nameValue($EVENT) }\
+ STATTOPIC/RESULT:.* { json2nameValue($EVENT) }\
+ TELETOPIC/INFO.:.* { json2nameValue($EVENT) }
deletereading -q DEVICE (?!associatedWith).*
attr DEVICE autocreate 0
attr DEVICE devStateIcon {Color::devStateIcon($name,"rgb","Color","state")}
@@ -700,24 +734,24 @@ attr DEVICE model A_05a_tasmota_rgb_led_controller
name:A_01z_tasmota_set_lowercase_texts_and_state1
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
desc:Applies to all tasmota devices
NOTE: This template will change ON, OFF etc. sent from tasmota side to lowercase.
After applying the template you might consider to delete or change stateFormat, eventMap and/or userReadings attribute values
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
par:IO_DEV;Currently used IO;{ AttrVal("DEVICE","IODev","")}
-set IO_DEV publish cmnd/DEVNAME/Backlog StateText1 off; StateText2 on; StateText3 toggle; StateText4 hold; SetOption26 1; SaveData 1
+set IO_DEV publish CMNDTOPIC/Backlog StateText1 off; StateText2 on; StateText3 toggle; StateText4 hold; SetOption26 1; SaveData 1
name:A_01z_tasmota_set_uppercase_texts_and_state1
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
desc:Applies to all tasmota devices
NOTE: This template will change on, off etc. sent from tasmota side to uppercase. NOTE: this template only exists for compability reasons to older MQTT implementations; not recommended for other user groups
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
par:IO_DEV;Currently used IO;{ AttrVal("DEVICE","IODev","")}
-set IO_DEV publish cmnd/DEVNAME/Backlog StateText1 OFF; StateText2 ON; StateText3 TOGGLE; StateText4 HOLD; SetOption26 1
+set IO_DEV publish CMNDTOPIC/Backlog StateText1 OFF; StateText2 ON; StateText3 TOGGLE; StateText4 HOLD; SetOption26 1
attr DEVICE userReadings state:POWER1:.* { lc(ReadingsVal($name,"POWER1","")) }
name:A_01z_tasmota_set_power1_state_to_power
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd).*
desc:Applies to single relay tasmota devices
NOTE: this template only exists for compability reasons to other HA solutions; not recommended for usage in FHEM context
-par:DEVNAME;ESP's name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,tele/([^/]*)/, ? $1 : undef }
+par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
par:IO_DEV;Currently used IO;{ AttrVal("DEVICE","IODev","")}
-set IO_DEV publish cmnd/DEVNAME/SetOption26 0
+set IO_DEV publish CMNDTOPIC/SetOption26 0
attr DEVICE userReadings state:POWER:.* { lc(ReadingsVal($name,"POWER","")) }