2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-15 04:20:56 +00:00

mqtt2.template: (and other) changes to jsonMap in tasmota lights

git-svn-id: https://svn.fhem.de/fhem/trunk@25757 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
Beta-User 2022-02-28 19:08:25 +00:00
parent 2befeb672f
commit 3c3e7e4a4f
3 changed files with 105 additions and 159 deletions

View File

@ -1029,13 +1029,22 @@ name:tasmota_basic_state_power1
filter:TYPE=MQTT2_DEVICE
desc:Applies to Sonoff Basic, S20 using POWER1-topic for relay state <br>NOTE: The format the device is sending data will also be changed to lowercase!<br>NOTE: This template is intended to configure also channel one of multi-channel tasmota devices
order:A_01a
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: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:CALLSPEECHRECOGN;Set this to 0 to not set any speech recogn. related attributes;{ 1 }
par:ICON;ICON as set, defaults to hue_filled_outlet;{ AttrVal("DEVICE","icon","hue_filled_outlet") }
par:JSONMAPTYPE;Set this to suitable type, one of 1 (default), 2 (rgbw), 3 (rgbcct), 4 (pure dimmer);{ 1 }
par:ICON;ICON as set, defaults to hue_filled_outlet;{ AttrVal('DEVICE','icon','hue_filled_outlet') }
attr DEVICE icon ICON
attr DEVICE jsonMap POWER1:0 POWER2:0 POWER3:0 POWER4:0 Dimmer:0 Channel_0:0 Channel_1:0 Channel_2:0 Channel_3:0 Channel_4:0 HSBColor:0 Color:0
option:{ JSONMAPTYPE == 1 }
attr DEVICE jsonMap POWER1:0 POWER2:0 POWER3:0 POWER4:0 Dimmer:0 Channel_0:0 Channel_1:0 Channel_2:0 Channel_3:0 Channel_4:0 Channel_5:0 HSBColor:0 Color:0
option:{ JSONMAPTYPE == 2 }
attr DEVICE jsonMap POWER1:0 POWER2:0 POWER3:0 POWER4:0 Dimmer:pct Channel_0:0 Channel_1:0 Channel_2:0 Channel_3:0 Channel_4:0 Channel_5:0 HSBColor:0 Color:rgb
option:{ JSONMAPTYPE == 3 }
attr DEVICE jsonMap POWER1:0 POWER2:0 POWER3:0 POWER4:0 Dimmer:pct Channel_0:0 Channel_1:0 Channel_2:0 Channel_3:0 HSBColor:0 Channel_5:0 Color:rgb Channel_4:white
option:{ JSONMAPTYPE == 4 }
attr DEVICE jsonMap POWER1:0 POWER2:0 POWER3:0 POWER4:0 Dimmer:pct Channel_0:0 Channel_1:0 Channel_2:0 Channel_3:0 Channel_4:0 Channel_5:0 HSBColor:0 Color:0
option:global
set DEVICE attrTemplate tasmota_set_lowercase_texts_and_state1
attr DEVICE setList \
off:noArg CMNDTOPIC/POWER1 0\
@ -1171,15 +1180,13 @@ name:tasmota_plug_with_rgbw_split
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:plug with seperate RGBW LED flashed with Tasmota. <br>NOTE: a second device will be created for the rgb device.<br>Tested with Tasmota V. 7.1.2 and Maxcio YX-DE02 Plug using template: {"NAME":"Maxcio YX-DE04","GPIO":[255,17,255,21,56,40,0,0,37,38,39,255,255],"FLAG":1,"BASE":18}
order:A_01c1a
set DEVICE attrTemplate tasmota_basic_state_power1 CALLSPEECHRECOGN=0
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 }
set DEVICE attrTemplate tasmota_basic_state_power1 CALLSPEECHRECOGN=0 JSONMAPTYPE=2
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 comment Mains channel for DEVICE, see also DEVICE_CH2 for rgb LED
attr DEVICE devStateIcon {my $onl = ReadingsVal($name,"LWT","false") eq "Online"?"10px-kreis-gruen":"10px-kreis-rot"; my $light = ReadingsVal($name,"state","off");"<a href=\"http://".ReadingsVal($name,"IPAddress","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a> uptime: ".ReadingsVal($name,"Uptime",undef)}
attr DEVICE jsonMap POWER1:0 Dimmer:0 Channel_1:0 Channel_2:0 Channel_3:0 HSBColor:0 POWER2:0
setreading DEVICE associatedWith DEVICE_CH2
deletereading -q DEVICE (?!associatedWith|IODev).*
copy DEVICE DEVICE_CH2
deleteattr DEVICE_CH2 stateFormat
attr DEVICE_CH2 comment RGBW channel for DEVICE
@ -1188,7 +1195,7 @@ attr DEVICE_CH2 setList \
off:noArg CMNDTOPIC/POWER2 0\
on:noArg CMNDTOPIC/POWER2 1\
toggle:noArg CMNDTOPIC/POWER2 2\
Color:colorpicker,RGB CMNDTOPIC/COLOR\
rgb:colorpicker,RGB CMNDTOPIC/COLOR\
pct:colorpicker,BRI,0,5,100 CMNDTOPIC/DIMMER\
white:colorpicker,BRI,0,5,100 { "CMNDTOPIC/COLOR ". sprintf("000000%02X",$EVTPART1*2.55) }\
dimup:noArg { my $num=int((ReadingsNum($NAME,'pct',0)+4)/10)*10+10; return qq {CMNDTOPIC/Dimmer $num}; }\
@ -1197,16 +1204,16 @@ attr DEVICE_CH2 readingList \
STATTOPIC/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }\
STATTOPIC/POWER2:.* state
attr DEVICE_CH2 jsonMap POWER2:0 Dimmer:pct Channel_4:white Channel_1:0 Channel_2:0 Channel_3:0 HSBColor:0 POWER1:0 Heap:0 LedTable:0 LoadAvg:0 MqttCount:0 SaveData:0 Scheme:0 SetOption26:0 Sleep:0 SleepMode:0 Speed:0 StateText1:0 StateText2:0 StateText3:0 StateText4:0 Time:0 Uptime:0 UptimeSec:0 Wifi_SSId:0 Wifi_RSSI:0 Wifi_LinkCount:0 Wifi_Downtime:0 Wifi_Channel:0 Wifi_BSSId:0 Wifi_AP:0 ANALOG_A0:0 SetOption26:0 Sleep:0 SleepMode:0 Speed:0 StateText1:0 StateText2:0 StateText3:0 StateText4:0 Time:0 Uptime:0 UptimeSec:0 Wifi_SSId:0 Wifi_RSSI:0 Wifi_LinkCount:0 Wifi_Downtime:0 Wifi_Channel:0 Wifi_BSSId:0 Wifi_AP:0 ANALOG_A0:0
attr DEVICE_CH2 webCmd pct:white:Color
attr DEVICE_CH2 webCmd pct:white:rgb
attr DEVICE_CH2 webCmdLabel Helligkeit\
:Weiss\
:Farbe:
attr DEVICE_CH2 devStateIcon {Color::devStateIcon($name,"rgb","Color","pct","state")}
attr DEVICE_CH2 devStateIcon {Color::devStateIcon($name,'rgb','rgb','pct','state')}
attr DEVICE_CH2 setStateList on off toggle
deletereading -q DEVICE_CH2 (?!associatedWith|IODev).*
set DEVICE,DEVICE_CH2 attrTemplate speechcontrol_type_switch
attr DEVICE,DEVICE_CH2 model tasmota_plug_with_rgbw_split
setreading DEVICE,DEVICE_CH2 attrTemplateVersion 20210903
setreading DEVICE,DEVICE_CH2 attrTemplateVersion 20220228
#tasmota device with Infrared-circuit
name:tasmota_ir
@ -1991,38 +1998,34 @@ name:tasmota_rgb_led_controller
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
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
order:A_05a
set DEVICE attrTemplate tasmota_basic_state_power1
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:ICON;ICON as set, defaults to light_control;{ AttrVal("DEVICE","icon","light_control") }
attr DEVICE icon ICON
set DEVICE attrTemplate tasmota_basic_state_power1 CALLSPEECHRECOGN=0 JSONMAPTYPE=2 \ICON=ICON
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:ICON;ICON as set, defaults to light_control;{ AttrVal('DEVICE','icon','light_control') }
attr DEVICE setList\
off:noArg CMNDTOPIC/POWER1 0\
on:noArg CMNDTOPIC/POWER1 1\
toggle:noArg CMNDTOPIC/POWER1 2\
rgb:colorpicker,RGB CMNDTOPIC/COLOR\
pct:colorpicker,BRI,0,5,100 CMNDTOPIC/DIMMER
deletereading -q DEVICE (?!associatedWith|IODev).*
attr DEVICE autocreate 0
attr DEVICE devStateIcon {Color::devStateIcon($name,"rgb","rgb","pct","state")}
attr DEVICE devStateIcon {Color::devStateIcon($name,'rgb','rgb','pct','state')}
attr DEVICE webCmd rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:toggle:on:off
attr DEVICE jsonMap POWER1:0 POWER2:0 POWER3:0 POWER4:0 Dimmer:pct Channel_0:0 Channel_1:0 Channel_2:0 Channel_3:0 Channel_4:0 HSBColor:0 Color:rgb
set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model tasmota_rgb_led_controller
setreading DEVICE attrTemplateVersion 20220225
setreading DEVICE attrTemplateVersion 20220228
name:tasmota_rgbw_led
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Tasmota RGBW bulb or RGBW LED controller
order:A_05a1
set DEVICE attrTemplate tasmota_basic_state_power1
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:ICON;ICON as set, defaults to light_control;{ AttrVal("DEVICE","icon","light_control") }
attr DEVICE icon ICON
deletereading -q DEVICE (?!associatedWith|IODev).*
set DEVICE attrTemplate tasmota_basic_state_power1 CALLSPEECHRECOGN=0 \JSONMAPTYPE=JSONMAPTYPE \ICON=ICON
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:JSONMAPTYPE;Set to suitable type, 2 (rgbw);{ 2 }
par:ICON;ICON as set, defaults to light_control;{ AttrVal('DEVICE','icon','light_control') }
attr DEVICE setList\
off:noArg CMNDTOPIC/POWER1 0\
on:noArg CMNDTOPIC/POWER1 1\
@ -2031,7 +2034,7 @@ attr DEVICE setList\
pct:colorpicker,BRI,0,5,100 CMNDTOPIC/DIMMER\
dimup:noArg { my $num=int((ReadingsNum($NAME,'pct',0)+4)/10)*10+10; return qq {CMNDTOPIC/Dimmer $num}; }\
dimdown:noArg { my $num=int((ReadingsNum($NAME,'pct',0)+7)/10)*10-10; return qq {CMNDTOPIC/Dimmer $num}; }\
white:colorpicker,BRI,0,5,100 { "CMNDTOPIC/COLOR ". sprintf("000000%02X",$EVTPART1*2.55) }\
white:colorpicker,BRI,0,5,100 { 'CMNDTOPIC/COLOR '. sprintf("000000%02X",$EVTPART1*2.55) }\
saturation:colorpicker,BRI,0,1,100 CMNDTOPIC/HSBCOLOR2\
Speed:colorpicker,BRI,0,1,20 CMNDTOPIC/SPEED\
Fade:uzsuSelect,ON,OFF CMNDTOPIC/FADE $EVTPART1\
@ -2043,59 +2046,54 @@ attr DEVICE readingList \
TELETOPIC/INFO.:.* { $EVENT =~ m,^..Info[1-3]..(.+).$, ? json2nameValue($1,'',$JSONMAP) : json2nameValue($EVENT,'',$JSONMAP) }\
TELETOPIC/UPTIME:.* { json2nameValue($EVENT,'',$JSONMAP) }\
STATTOPIC/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }\
STATTOPIC/RESULT:.* { $EVENT =~ m,HSBColor...(\d+)\,(\d+)\,(\d+), ? $2 eq ReadingsVal($NAME,"saturation","unknown") ? return : { "saturation"=>$2 } : return }\
STATTOPIC/RESULT:.* { $EVENT =~ m,HSBColor...(\d+)\,(\d+)\,(\d+), ? $2 eq ReadingsVal($NAME,'saturation','unknown') ? return : { saturation=>$2 } : return }\
STATTOPIC/POWER1:.* state
attr DEVICE jsonMap POWER1:0 Dimmer:pct Channel_4:white Channel_1:0 Channel_2:0 Channel_3:0 HSBColor:0 Color:rgb
attr DEVICE webCmd pct:white:rgb
attr DEVICE webCmdLabel Helligkeit\
:Weiss\
:Farbe:
attr DEVICE devStateIcon {Color::devStateIcon($name,"rgb","rgb","pct","state")}
attr DEVICE devStateIcon {Color::devStateIcon($name,'rgb','rgb','pct','state')}
attr DEVICE setStateList on off toggle
set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model tasmota_rgbw_led
setreading DEVICE attrTemplateVersion 20220225
setreading DEVICE attrTemplateVersion 20220228
name:tasmota_rgbcct_light
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Tasmota RGBW bulb with CT option like LSC Smart Connect Candle 400lm RGBW
order:A_05a2
set DEVICE attrTemplate tasmota_basic_state_power1
set DEVICE attrTemplate tasmota_rgbw_led
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: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 }
set DEVICE attrTemplate tasmota_rgbw_led JSONMAPTYPE=3
attr DEVICE setList\
off:noArg CMNDTOPIC/POWER1 0\
on:noArg CMNDTOPIC/POWER1 1\
toggle:noArg CMNDTOPIC/POWER1 2\
Color:colorpicker,RGB CMNDTOPIC/COLOR\
rgb:colorpicker,RGB CMNDTOPIC/COLOR\
pct:colorpicker,BRI,0,5,100 CMNDTOPIC/DIMMER\
dimup:noArg { my $num=int((ReadingsNum($NAME,'pct',0)+4)/10)*10+10; return qq {CMNDTOPIC/Dimmer $num}; }\
dimdown:noArg { my $num=int((ReadingsNum($NAME,'pct',0)+7)/10)*10-10; return qq {CMNDTOPIC/Dimmer $num}; }\
white:colorpicker,BRI,0,5,100 { "CMNDTOPIC/COLOR ". sprintf("000000%02X",$EVTPART1*2.55) }\
CT:colorpicker,CT,153,5,500 CMNDTOPIC/CT
attr DEVICE jsonMap POWER1:0 Dimmer:pct Channel_4:white Channel_1:0 Channel_2:0 Channel_3:0 HSBColor:0 Channel_5:0
attr DEVICE webCmd pct:white:Color:CT
attr DEVICE webCmd pct:white:rgb:CT
attr DEVICE webCmdLabel Helligkeit\
:Weiss\
:Farbe\
:Temp
set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model tasmota_rgbcct_led
setreading DEVICE attrTemplateVersion 20200522 or prior
setreading DEVICE attrTemplateVersion 20220228
name:tasmota_cct_led
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Tasmota CCT bulb or CCT LED controller
order:A_05a3
set DEVICE attrTemplate tasmota_basic_state_power1
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:ICON;ICON as set, defaults to light_control;{ AttrVal("DEVICE","icon","light_control") }
attr DEVICE icon ICON
deletereading -q DEVICE (?!associatedWith|IODev).*
set DEVICE attrTemplate tasmota_basic_state_power1 JSONMAPTYPE=4 \ICON=ICON
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:ICON;ICON as set, defaults to light_control;{ AttrVal('DEVICE','icon','light_control') }
attr DEVICE setList\
off:noArg CMNDTOPIC/POWER1 0\
on:noArg CMNDTOPIC/POWER1 1\
@ -2112,25 +2110,23 @@ attr DEVICE readingList \
TELETOPIC/UPTIME:.* { json2nameValue($EVENT,'',$JSONMAP) }\
STATTOPIC/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }\
STATTOPIC/POWER1:.* state
attr DEVICE jsonMap POWER1:0 Dimmer:pct Channel_4:0 Channel_1:0 Channel_2:0 Channel_3:0 HSBColor:0
attr DEVICE webCmd pct:CT
attr DEVICE devStateIcon {Color::devStateIcon($name,"dimmer",'',"pct","state")}
attr DEVICE devStateIcon {Color::devStateIcon($name,'dimmer','','pct','state')}
attr DEVICE setStateList on off toggle
set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model tasmota_cct_led
setreading DEVICE attrTemplateVersion 20210515
setreading DEVICE attrTemplateVersion 20220228
#source post: https://forum.fhem.de/index.php/topic,105364.0.html
name:tasmota_TuyaMCU_dimmer
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Tasmota controller, suitable for devices using the "Tuya MCU Module" to control a dimmer.<br>See instructions in https://github.com/arendst/Tasmota/wiki/TuyaMCU-Configurations#dimmer and <a href="https://forum.fhem.de/index.php/topic,105364.msg992975.html#msg992975">Forum Thread</a>
order:A_05b
set DEVICE attrTemplate tasmota_basic_state_power1
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:ICON;ICON as set, defaults to light_control;{ AttrVal("DEVICE","icon","light_control") }
attr DEVICE icon ICON
set DEVICE attrTemplate tasmota_basic_state_power1 JSONMAPTYPE=4 \ICON=ICON
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:ICON;ICON as set, defaults to light_control;{ AttrVal('DEVICE','icon','light_control') }
attr DEVICE setList\
off:noArg CMNDTOPIC/POWER1 0\
on:noArg CMNDTOPIC/POWER1 1\
@ -2140,12 +2136,11 @@ deletereading -q DEVICE (?!associatedWith|IODev).*
attr DEVICE autocreate 0
attr DEVICE devStateIcon off:light_light_dim_00:on on:light_light_dim_90:off
attr DEVICE webCmd pct
attr DEVICE jsonMap POWER1:0 Dimmer:pct Channel_4:white Channel_1:0 Channel_2:0 Channel_3:0 HSBColor:0 Color:rgb
attr DEVICE comment After applying the template, the device to be controlled needs further configuration. For the necessary steps see <a href="https://github.com/arendst/Tasmota/wiki/TuyaMCU-Configurations#dimmer">Tasmota wiki</a> instructions.
farewell:template has been applied successfully. Now it's recommended to do some configruation, see <a href="https://github.com/arendst/Tasmota/wiki/TuyaMCU-Configurations#dimmer">Tasmota wiki</a> instructions.
set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model tasmota_TuyaMCU_dimmer
setreading DEVICE attrTemplateVersion 20220225
setreading DEVICE attrTemplateVersion 20220228
# tasmota battery powered window sensor MC400A
# contributed by OppiM, source post https://forum.fhem.de/index.php/topic,94495.msg1084052.html#msg1084052

View File

@ -534,7 +534,7 @@ FHEM/98_ModbusAttr.pm StefanStrobel Sonstiges
FHEM/98_ModbusElsnerWS.pm klaus.schauer Sonstiges
FHEM/98_ModbusSET.pm StefanStrobel Sonstiges
FHEM/98_ModbusTrovis5576.pm Reinerlein Heizungssteuerung/Raumklima
FHEM/98_monitoring.pm rudolfkoenig/orphan Automatisierung
FHEM/98_monitoring.pm Beta-User Automatisierung
FHEM/98_notice.pm mfr69bs Sonstiges
FHEM/98_PHC.pm StefanStrobel Sonstiges
FHEM/98_PID20.pm John Automatisierung

View File

@ -320,7 +320,7 @@ sub Define {
$hash->{defaultRoom} = $defaultRoom;
my $language = $h->{language} // shift @{$anon} // lc AttrVal('global','language','en');
$hash->{MODULE_VERSION} = '0.5.15';
$hash->{MODULE_VERSION} = '0.5.16';
$hash->{baseUrl} = $Rhasspy;
initialize_Language($hash, $language) if !defined $hash->{LANGUAGE} || $hash->{LANGUAGE} ne $language;
$hash->{LANGUAGE} = $language;
@ -342,7 +342,6 @@ sub Define {
if ($hash->{useGenericAttrs}) {
addToAttrList(q{genericDeviceType});
#addToAttrList(q{homebridgeMapping});
}
notifyRegexpChanged($hash,'',1);
@ -1404,10 +1403,10 @@ sub initialize_TTS {
my($unnamedParams, $namedParams) = parseParams($values);
if ( InternalVal($keywd,'TYPE','unknown') eq 'AMADDevice' ) {
$hash->{helper}->{TTS}->{config}->{$keywd}->{ttsCommand} //= q{set $DEVICE ttsMsg $message};
my $siteId = $namedParams->{siteId} // shift @{$unnamedParams }// $keywd;
$hash->{helper}->{TTS}->{$siteId} = $keywd;
$hash->{helper}->{TTS}->{config}->{$keywd} = $namedParams;
$hash->{helper}->{TTS}->{config}->{$keywd}->{ttsCommand} //= 'set $DEVICE ttsMsg $message';
}
}
if ( keys %{$hash->{helper}->{TTS}} ) {
@ -1464,7 +1463,8 @@ sub initialize_STT {
if ( !defined $hash->{helper}->{STT}->{config}->{allowed} ) {
delete $hash->{helper}->{STT};
return 'Setting the allowed key in rhasspySTT is mandatory!' ;
disable_msgDialog($hash, ReadingsVal($hash->{NAME}, 'enableMsgDialog', 1), 1 );
return 'Setting the allowed key in rhasspySTT is mandatory!' if $init_done;
}
return;
@ -1512,7 +1512,7 @@ sub initialize_msgDialog {
$hash->{helper}->{msgDialog}->{config}->{msgCommand}
= AttrVal($msgConfig, "$hash->{prefix}MsgCommand", q{msg push \@$recipients $message});
}
return disable_msgDialog($hash, 1, 1)
return disable_msgDialog($hash, 1, 1);
}
@ -1527,19 +1527,18 @@ sub disable_msgDialog {
if ( defined $hash->{helper}->{STT}
&& defined $hash->{helper}->{STT}->{config}
&& defined $hash->{helper}->{STT}->{config}->{AMADCommBridge} ) {
$devsp = qq($hash->{helper}->{STT}->{config}->{AMADCommBridge});
$devsp = 'TYPE=AMADCommBridge';
}
if ($enable) {
$devsp .= $devsp ? ',TYPE=(ROOMMATE|GUEST)' : 'TYPE=(ROOMMATE|GUEST)';
$devsp = $devsp ? 'TYPE=(AMADCommBridge|ROOMMATE|GUEST)' : 'TYPE=(ROOMMATE|GUEST)';
}
if ($hash->{autoTraining}) {
$devsp .= $devsp ? ',global' : 'global';
}
my @ntfdevs = devspec2array($devsp);
if (@ntfdevs) {
setNotifyDev($hash,$devsp);
if ( $devsp && devspec2array($devsp) ) {
delete $hash->{disableNotifyFn};
setNotifyDev($hash,$devsp);
} else {
notifyRegexpChanged($hash,'',1);
}
@ -2228,7 +2227,7 @@ sub getMapping {
my $hash = shift // return;
my $device = shift // return;
my $intent = shift // return;
my $type = shift // $intent; #Beta-User: seems first three parameters are obligatory...?
my $type = shift // $intent;
my $disableLog = shift // 0;
my $subType = $type;
@ -2511,54 +2510,6 @@ sub Notify {
return;
}
=pod
if ($values[0] eq 'all') {
initialize_Language($hash, $hash->{LANGUAGE});
initialize_devicemap($hash);
$hash->{'.needTraining'} = 1;
updateSlots($hash);
return fetchIntents($hash);
if ( $attribute eq 'rhasspyShortcuts' ) {
for ( keys %{ $hash->{helper}{shortcuts} } ) {
delete $hash->{helper}{shortcuts}{$_};
}
if ($command eq 'set') {
return init_shortcuts($hash, $value);
}
}
if ( $attribute eq 'rhasspyIntents' ) {
for ( keys %{ $hash->{helper}{custom} } ) {
delete $hash->{helper}{custom}{$_};
}
if ($command eq 'set') {
return init_custom_intents($hash, $value);
}
}
if ( $attribute eq 'rhasspyTweaks' ) {
for ( keys %{ $hash->{helper}{tweaks} } ) {
delete $hash->{helper}{tweaks}{$_};
}
if ($command eq 'set') {
return initialize_rhasspyTweaks($hash, $value) if $init_done;
}
}
if ( $attribute eq 'languageFile' ) {
if ($command ne 'set') {
delete $hash->{CONFIGFILE};
delete $attr{$name}{languageFile};
delete $hash->{helper}{lng};
$value = undef;
}
return initialize_Language($hash, $hash->{LANGUAGE}, $value);
}
=cut
return if !ReadingsVal($name,'enableMsgDialog',1) || !defined $hash->{helper}->{msgDialog};
my @events = @{deviceEvents($dev_hash, 1)};
@ -2639,31 +2590,7 @@ sub activateVoiceInput {
return IOWrite($hash, 'publish', qq{hermes/hotword/$hotword/detected $json});
}
=pod
#source: https://rhasspy.readthedocs.io/en/latest/reference/#tts_say
hermes/tts/say (JSON)
Generate spoken audio for a sentence using the configured text to speech system
Automatically sends playBytes
playBytes.requestId = say.id
text: string - sentence to speak (required)
lang: string? = null - override language for TTS system
id: string? = null - unique ID for request (copied to sayFinished)
volume: float? = null - volume level to speak with (0 = off, 1 = full volume)
siteId: string = "default" - Hermes site ID
sessionId: string? = null - current session ID
Response(s)
hermes/tts/sayFinished (JSON)
hermes/tts/sayFinished (JSON)
Indicates that the text to speech system has finished speaking
id: string? = null - unique ID for request (copied from say)
siteId: string = "default" - Hermes site ID
Response to hermes/tts/say
=cut
#source: https://rhasspy.readthedocs.io/en/latest/reference/#tts_say
sub sayFinished {
my $hash = shift // return;
my $data = shift // return;
@ -2710,7 +2637,6 @@ sub msgDialog_close {
return if !defined $hash->{helper}{msgDialog}->{$device};;
msgDialog_respond( $hash, $device, $response, 0 );
#delete $hash->{helper}{'.delayed'}->{$device};
delete $hash->{helper}{msgDialog}->{$device};
return;
}
@ -2816,7 +2742,7 @@ sub handleTtsMsgDialog {
sayFinished($hash, $data->{id}, $hash->{siteId});
} elsif (defined $hash->{helper}->{STT}
&& defined $hash->{helper}->{STT}->{config}->{$recipient} ) {
ttsDialog_respond($hash,$recipient,$message);
ttsDialog_respond($hash,$recipient,$message,0);
sayFinished($hash, $data->{id}, $hash->{siteId}); #Beta-User: may be moved to response logic later with timeout...?
}
@ -3024,6 +2950,9 @@ sub analyzeMQTTmessage {
my $siteId = $data->{siteId} // return;
$active = $data->{reason} if $active && defined $data->{reason};
readingsSingleUpdate($hash, "hotwordAwaiting_" . makeReadingName($siteId), $active, 1);
my $ret = handleHotwordGlobal($hash, $active ? 'on' : 'off', $data, $active ? 'on' : 'off');
push @updatedList, $ret if $ret && $defs{$ret};
push @updatedList, $hash->{NAME};
return \@updatedList;
}
@ -3042,7 +2971,7 @@ sub analyzeMQTTmessage {
if ( $topic =~ m{\Ahermes/hotword/([^/]+)/detected}x ) {
my $hotword = $1;
my $siteId = $data->{siteId};
if ( $siteId ) {
if ( 0 && $siteId ) { #Beta-User: deactivated
my $device = ReadingsVal($hash->{NAME}, "siteId2ttsDevice_$siteId",undef);
$device //= $hash->{helper}->{TTS}->{$siteId} if defined $hash->{helper}->{TTS} && defined $hash->{helper}->{TTS}->{$siteId};
if ($device) {
@ -3053,6 +2982,8 @@ sub analyzeMQTTmessage {
return \@updatedList if !$hash->{handleHotword} && !defined $hash->{helper}{hotwords};
my $ret = handleHotwordDetection($hash, $hotword, $data);
push @updatedList, $ret if $ret && $defs{$ret};
$ret = handleHotwordGlobal($hash, $hotword, $data, 'detected');
push @updatedList, $ret if $ret && $defs{$ret};
push @updatedList, $hash->{NAME};
return \@updatedList;
}
@ -3225,7 +3156,7 @@ sub sendSpeakCommand {
return 'speak with explicite params needs siteId and text as arguments!' if !defined $cmd->{siteId} || !defined $cmd->{text};
$sendData->{siteId} = $cmd->{siteId};
$sendData->{init}->{text} = $cmd->{text};
} else { #Beta-User: might need review, as parseParams is used by default...!
} else {
my($unnamedParams, $namedParams) = parseParams($cmd);
if (defined $namedParams->{siteId} && defined $namedParams->{text}) {
@ -3572,6 +3503,25 @@ sub handleHotwordDetection {
return analyzeAndRunCmd($hash, $hash->{NAME}, $command, $hotword, $siteId);
}
sub handleHotwordGlobal {
my $hash = shift // return;
my $hotword = shift // return;
my $data = shift;
my $mode = shift;
return if !defined $hash->{helper}{hotwords} || !defined $hash->{helper}{hotwords}->{global};
my $cmd = $hash->{helper}{hotwords}->{global}->{$mode} // $hash->{helper}{hotwords}->{global}->{default} // return;
my %specials = (
'$VALUE' => $hotword,
'$MODE' => $mode,
'$DEVICE' => $hash->{NAME},
'$ROOM' => $data->{siteId},
'$DATA' => toJSON($data)
);
$cmd = EvalSpecials($cmd, %specials);
return AnalyzeCommandChain($hash, $cmd);
}
# Eingehender Custom-Intent
sub handleCustomIntent {
my $hash = shift // return;
@ -5663,14 +5613,15 @@ i="i am hungry" f="set Stove on" d="Stove" c="would you like roast pork"</code><
</li>
<li>
<a id="RHASSPY-attr-rhasspyHotwords"></a><b>rhasspyHotwords</b>
<p>Define custom reactions as soon as a specific hotword is detected. This does not require any specific configuration on any other FHEM device.<br>
One hotword per line, syntax is either a simple and an extended version.</p>
<p>Define custom reactions as soon as a specific hotword is detected (or with "global": a toggle command is detected). This does not require any specific configuration on any other FHEM device.<br>
One hotword per line, syntax is either a simple and an extended version. The "hotword" <i>global</i> will be treated specially and can be used to also execute custom commands when a <toggle> event is indicated.</p>
Examples:<br>
<p><code>bumblebee_linux = set amplifier2 mute on<br>
porcupine_linux = livingroom="set amplifier mute on" default={Log3($DEVICE,3,"device $DEVICE - room $ROOM - value $VALUE")}</code></p>
<p>First example will execute the command for all incoming messages for the respective hotword, second will decide based on the given <i>siteId</i> keyword; $DEVICE is evaluated to RHASSPY name, $ROOM to siteId and $VALUE to the hotword.<br>
porcupine_linux = livingroom="set amplifier mute on" default={Log3($DEVICE,3,"device $DEVICE - room $ROOM - value $VALUE")}<br>
global = { rhasspyHotword($DEVICE,$VALUE,$DATA,$MODE) }</code></p>
<p>First example will execute the command for all incoming messages for the respective hotword, second will decide based on the given <i>siteId</i> keyword; $DEVICE is evaluated to RHASSPY name, $ROOM to siteId and $VALUE to the hotword. Additionally, in "global key", $DATA will contain entire JSON-$data (as parsed internally, encoded in JSON) and $MODE will be one of <i>on</i>, <i>off</i> or <i>detected</i><br>. You may assign different commands to <i>on</i>, <i>off</i> and <i>detected</i>.
<i>default</i> is optional. If set, this action will be executed for all <i>siteIds</i> without match to other keywords.<br>
Additionally, if either <i>rhasspyHotwords</i> ia set or key <i>handleHotword</i> in <a href="#RHASSPY-define">DEF</a> is activated, the reading <i>hotword</i> will be filled with <i>hotword</i> plus <i>siteId</i> to also allow arbitrary event handling.<br>NOTE: As all hotword messages are sent to a common topic structure, you may need additional measures to distinguish between several <i>RHASSPY</i> instances, e.g. by restricting subscriptions and/or using different entries in this attribute.</p>
Additionally, if either <i>rhasspyHotwords</i> is set or key <i>handleHotword</i> in <a href="#RHASSPY-define">DEF</a> is activated, the reading <i>hotword</i> will be filled with <i>hotword</i> plus <i>siteId</i> to also allow arbitrary event handling.<br>NOTE: As all hotword messages are sent to a common topic structure, you may need additional measures to distinguish between several <i>RHASSPY</i> instances, e.g. by restricting subscriptions and/or using different entries in this attribute.</p>
</li>
<li>
<a id="RHASSPY-attr-rhasspyMsgDialog"></a><b>rhasspyMsgDialog</b>