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 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 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 order:A_01a
par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$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: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: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: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 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 set DEVICE attrTemplate tasmota_set_lowercase_texts_and_state1
attr DEVICE setList \ attr DEVICE setList \
off:noArg CMNDTOPIC/POWER1 0\ off:noArg CMNDTOPIC/POWER1 0\
@ -1171,15 +1180,13 @@ name:tasmota_plug_with_rgbw_split
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).* 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} 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 order:A_01c1a
set DEVICE attrTemplate tasmota_basic_state_power1 CALLSPEECHRECOGN=0 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: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: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: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 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 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 setreading DEVICE associatedWith DEVICE_CH2
deletereading -q DEVICE (?!associatedWith|IODev).*
copy DEVICE DEVICE_CH2 copy DEVICE DEVICE_CH2
deleteattr DEVICE_CH2 stateFormat deleteattr DEVICE_CH2 stateFormat
attr DEVICE_CH2 comment RGBW channel for DEVICE attr DEVICE_CH2 comment RGBW channel for DEVICE
@ -1188,7 +1195,7 @@ attr DEVICE_CH2 setList \
off:noArg CMNDTOPIC/POWER2 0\ off:noArg CMNDTOPIC/POWER2 0\
on:noArg CMNDTOPIC/POWER2 1\ on:noArg CMNDTOPIC/POWER2 1\
toggle:noArg CMNDTOPIC/POWER2 2\ toggle:noArg CMNDTOPIC/POWER2 2\
Color:colorpicker,RGB CMNDTOPIC/COLOR\ rgb:colorpicker,RGB CMNDTOPIC/COLOR\
pct:colorpicker,BRI,0,5,100 CMNDTOPIC/DIMMER\ pct:colorpicker,BRI,0,5,100 CMNDTOPIC/DIMMER\
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) }\
dimup:noArg { my $num=int((ReadingsNum($NAME,'pct',0)+4)/10)*10+10; return qq {CMNDTOPIC/Dimmer $num}; }\ 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/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }\
STATTOPIC/POWER2:.* state 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 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\ attr DEVICE_CH2 webCmdLabel Helligkeit\
:Weiss\ :Weiss\
:Farbe: :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 attr DEVICE_CH2 setStateList on off toggle
deletereading -q DEVICE_CH2 (?!associatedWith|IODev).* deletereading -q DEVICE_CH2 (?!associatedWith|IODev).*
set DEVICE,DEVICE_CH2 attrTemplate speechcontrol_type_switch set DEVICE,DEVICE_CH2 attrTemplate speechcontrol_type_switch
attr DEVICE,DEVICE_CH2 model tasmota_plug_with_rgbw_split 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 #tasmota device with Infrared-circuit
name:tasmota_ir name:tasmota_ir
@ -1991,38 +1998,34 @@ name:tasmota_rgb_led_controller
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).* 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 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 order:A_05a
set DEVICE attrTemplate tasmota_basic_state_power1 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: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: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: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") } par:ICON;ICON as set, defaults to light_control;{ AttrVal('DEVICE','icon','light_control') }
attr DEVICE icon ICON
attr DEVICE setList\ attr DEVICE setList\
off:noArg CMNDTOPIC/POWER1 0\ off:noArg CMNDTOPIC/POWER1 0\
on:noArg CMNDTOPIC/POWER1 1\ on:noArg CMNDTOPIC/POWER1 1\
toggle:noArg CMNDTOPIC/POWER1 2\ toggle:noArg CMNDTOPIC/POWER1 2\
rgb:colorpicker,RGB CMNDTOPIC/COLOR\ rgb:colorpicker,RGB CMNDTOPIC/COLOR\
pct:colorpicker,BRI,0,5,100 CMNDTOPIC/DIMMER pct:colorpicker,BRI,0,5,100 CMNDTOPIC/DIMMER
deletereading -q DEVICE (?!associatedWith|IODev).*
attr DEVICE autocreate 0 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 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 set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model tasmota_rgb_led_controller attr DEVICE model tasmota_rgb_led_controller
setreading DEVICE attrTemplateVersion 20220225 setreading DEVICE attrTemplateVersion 20220228
name:tasmota_rgbw_led name:tasmota_rgbw_led
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).* filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Tasmota RGBW bulb or RGBW LED controller desc:Tasmota RGBW bulb or RGBW LED controller
order:A_05a1 order:A_05a1
set DEVICE attrTemplate tasmota_basic_state_power1 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: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: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: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") } par:JSONMAPTYPE;Set to suitable type, 2 (rgbw);{ 2 }
attr DEVICE icon ICON par:ICON;ICON as set, defaults to light_control;{ AttrVal('DEVICE','icon','light_control') }
deletereading -q DEVICE (?!associatedWith|IODev).*
attr DEVICE setList\ attr DEVICE setList\
off:noArg CMNDTOPIC/POWER1 0\ off:noArg CMNDTOPIC/POWER1 0\
on:noArg CMNDTOPIC/POWER1 1\ on:noArg CMNDTOPIC/POWER1 1\
@ -2031,7 +2034,7 @@ attr DEVICE setList\
pct:colorpicker,BRI,0,5,100 CMNDTOPIC/DIMMER\ 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}; }\ 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}; }\ 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\ saturation:colorpicker,BRI,0,1,100 CMNDTOPIC/HSBCOLOR2\
Speed:colorpicker,BRI,0,1,20 CMNDTOPIC/SPEED\ Speed:colorpicker,BRI,0,1,20 CMNDTOPIC/SPEED\
Fade:uzsuSelect,ON,OFF CMNDTOPIC/FADE $EVTPART1\ 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/INFO.:.* { $EVENT =~ m,^..Info[1-3]..(.+).$, ? json2nameValue($1,'',$JSONMAP) : json2nameValue($EVENT,'',$JSONMAP) }\
TELETOPIC/UPTIME:.* { json2nameValue($EVENT,'',$JSONMAP) }\ TELETOPIC/UPTIME:.* { json2nameValue($EVENT,'',$JSONMAP) }\
STATTOPIC/RESULT:.* { 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 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 webCmd pct:white:rgb
attr DEVICE webCmdLabel Helligkeit\ attr DEVICE webCmdLabel Helligkeit\
:Weiss\ :Weiss\
:Farbe: :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 attr DEVICE setStateList on off toggle
set DEVICE attrTemplate speechcontrol_type_light set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model tasmota_rgbw_led attr DEVICE model tasmota_rgbw_led
setreading DEVICE attrTemplateVersion 20220225 setreading DEVICE attrTemplateVersion 20220228
name:tasmota_rgbcct_light name:tasmota_rgbcct_light
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).* filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Tasmota RGBW bulb with CT option like LSC Smart Connect Candle 400lm RGBW desc:Tasmota RGBW bulb with CT option like LSC Smart Connect Candle 400lm RGBW
order:A_05a2 order:A_05a2
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 }
set DEVICE attrTemplate tasmota_rgbw_led par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal('DEVICE','readingList','') =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef } par:STATTOPIC;ack topic prefix, without trailing /;{ AttrVal('DEVICE','readingList','') =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}stat$3" : undef }
par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef } set DEVICE attrTemplate tasmota_rgbw_led JSONMAPTYPE=3
par:STATTOPIC;ack topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}stat$3" : undef }
attr DEVICE setList\ attr DEVICE setList\
off:noArg CMNDTOPIC/POWER1 0\ off:noArg CMNDTOPIC/POWER1 0\
on:noArg CMNDTOPIC/POWER1 1\ on:noArg CMNDTOPIC/POWER1 1\
toggle:noArg CMNDTOPIC/POWER1 2\ toggle:noArg CMNDTOPIC/POWER1 2\
Color:colorpicker,RGB CMNDTOPIC/COLOR\ rgb:colorpicker,RGB CMNDTOPIC/COLOR\
pct:colorpicker,BRI,0,5,100 CMNDTOPIC/DIMMER\ 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}; }\ 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}; }\ 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) }\
CT:colorpicker,CT,153,5,500 CMNDTOPIC/CT 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:rgb:CT
attr DEVICE webCmd pct:white:Color:CT
attr DEVICE webCmdLabel Helligkeit\ attr DEVICE webCmdLabel Helligkeit\
:Weiss\ :Weiss\
:Farbe\ :Farbe\
:Temp :Temp
set DEVICE attrTemplate speechcontrol_type_light set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model tasmota_rgbcct_led attr DEVICE model tasmota_rgbcct_led
setreading DEVICE attrTemplateVersion 20200522 or prior setreading DEVICE attrTemplateVersion 20220228
name:tasmota_cct_led name:tasmota_cct_led
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).* filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Tasmota CCT bulb or CCT LED controller desc:Tasmota CCT bulb or CCT LED controller
order:A_05a3 order:A_05a3
set DEVICE attrTemplate tasmota_basic_state_power1 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: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: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: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") } par:ICON;ICON as set, defaults to light_control;{ AttrVal('DEVICE','icon','light_control') }
attr DEVICE icon ICON
deletereading -q DEVICE (?!associatedWith|IODev).*
attr DEVICE setList\ attr DEVICE setList\
off:noArg CMNDTOPIC/POWER1 0\ off:noArg CMNDTOPIC/POWER1 0\
on:noArg CMNDTOPIC/POWER1 1\ on:noArg CMNDTOPIC/POWER1 1\
@ -2112,25 +2110,23 @@ attr DEVICE readingList \
TELETOPIC/UPTIME:.* { json2nameValue($EVENT,'',$JSONMAP) }\ TELETOPIC/UPTIME:.* { json2nameValue($EVENT,'',$JSONMAP) }\
STATTOPIC/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }\ STATTOPIC/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }\
STATTOPIC/POWER1:.* state 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 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 attr DEVICE setStateList on off toggle
set DEVICE attrTemplate speechcontrol_type_light set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model tasmota_cct_led 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 #source post: https://forum.fhem.de/index.php/topic,105364.0.html
name:tasmota_TuyaMCU_dimmer name:tasmota_TuyaMCU_dimmer
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).* 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> 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 order:A_05b
set DEVICE attrTemplate tasmota_basic_state_power1 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: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: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: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") } par:ICON;ICON as set, defaults to light_control;{ AttrVal('DEVICE','icon','light_control') }
attr DEVICE icon ICON
attr DEVICE setList\ attr DEVICE setList\
off:noArg CMNDTOPIC/POWER1 0\ off:noArg CMNDTOPIC/POWER1 0\
on:noArg CMNDTOPIC/POWER1 1\ on:noArg CMNDTOPIC/POWER1 1\
@ -2140,12 +2136,11 @@ deletereading -q DEVICE (?!associatedWith|IODev).*
attr DEVICE autocreate 0 attr DEVICE autocreate 0
attr DEVICE devStateIcon off:light_light_dim_00:on on:light_light_dim_90:off attr DEVICE devStateIcon off:light_light_dim_00:on on:light_light_dim_90:off
attr DEVICE webCmd pct 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. 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. 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 set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model tasmota_TuyaMCU_dimmer attr DEVICE model tasmota_TuyaMCU_dimmer
setreading DEVICE attrTemplateVersion 20220225 setreading DEVICE attrTemplateVersion 20220228
# tasmota battery powered window sensor MC400A # tasmota battery powered window sensor MC400A
# contributed by OppiM, source post https://forum.fhem.de/index.php/topic,94495.msg1084052.html#msg1084052 # 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_ModbusElsnerWS.pm klaus.schauer Sonstiges
FHEM/98_ModbusSET.pm StefanStrobel Sonstiges FHEM/98_ModbusSET.pm StefanStrobel Sonstiges
FHEM/98_ModbusTrovis5576.pm Reinerlein Heizungssteuerung/Raumklima 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_notice.pm mfr69bs Sonstiges
FHEM/98_PHC.pm StefanStrobel Sonstiges FHEM/98_PHC.pm StefanStrobel Sonstiges
FHEM/98_PID20.pm John Automatisierung FHEM/98_PID20.pm John Automatisierung

View File

@ -320,7 +320,7 @@ sub Define {
$hash->{defaultRoom} = $defaultRoom; $hash->{defaultRoom} = $defaultRoom;
my $language = $h->{language} // shift @{$anon} // lc AttrVal('global','language','en'); 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; $hash->{baseUrl} = $Rhasspy;
initialize_Language($hash, $language) if !defined $hash->{LANGUAGE} || $hash->{LANGUAGE} ne $language; initialize_Language($hash, $language) if !defined $hash->{LANGUAGE} || $hash->{LANGUAGE} ne $language;
$hash->{LANGUAGE} = $language; $hash->{LANGUAGE} = $language;
@ -342,7 +342,6 @@ sub Define {
if ($hash->{useGenericAttrs}) { if ($hash->{useGenericAttrs}) {
addToAttrList(q{genericDeviceType}); addToAttrList(q{genericDeviceType});
#addToAttrList(q{homebridgeMapping});
} }
notifyRegexpChanged($hash,'',1); notifyRegexpChanged($hash,'',1);
@ -1404,10 +1403,10 @@ sub initialize_TTS {
my($unnamedParams, $namedParams) = parseParams($values); my($unnamedParams, $namedParams) = parseParams($values);
if ( InternalVal($keywd,'TYPE','unknown') eq 'AMADDevice' ) { 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; my $siteId = $namedParams->{siteId} // shift @{$unnamedParams }// $keywd;
$hash->{helper}->{TTS}->{$siteId} = $keywd; $hash->{helper}->{TTS}->{$siteId} = $keywd;
$hash->{helper}->{TTS}->{config}->{$keywd} = $namedParams; $hash->{helper}->{TTS}->{config}->{$keywd} = $namedParams;
$hash->{helper}->{TTS}->{config}->{$keywd}->{ttsCommand} //= 'set $DEVICE ttsMsg $message';
} }
} }
if ( keys %{$hash->{helper}->{TTS}} ) { if ( keys %{$hash->{helper}->{TTS}} ) {
@ -1464,7 +1463,8 @@ sub initialize_STT {
if ( !defined $hash->{helper}->{STT}->{config}->{allowed} ) { if ( !defined $hash->{helper}->{STT}->{config}->{allowed} ) {
delete $hash->{helper}->{STT}; 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; return;
@ -1512,7 +1512,7 @@ sub initialize_msgDialog {
$hash->{helper}->{msgDialog}->{config}->{msgCommand} $hash->{helper}->{msgDialog}->{config}->{msgCommand}
= AttrVal($msgConfig, "$hash->{prefix}MsgCommand", q{msg push \@$recipients $message}); = 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} if ( defined $hash->{helper}->{STT}
&& defined $hash->{helper}->{STT}->{config} && defined $hash->{helper}->{STT}->{config}
&& defined $hash->{helper}->{STT}->{config}->{AMADCommBridge} ) { && defined $hash->{helper}->{STT}->{config}->{AMADCommBridge} ) {
$devsp = qq($hash->{helper}->{STT}->{config}->{AMADCommBridge}); $devsp = 'TYPE=AMADCommBridge';
} }
if ($enable) { if ($enable) {
$devsp .= $devsp ? ',TYPE=(ROOMMATE|GUEST)' : 'TYPE=(ROOMMATE|GUEST)'; $devsp = $devsp ? 'TYPE=(AMADCommBridge|ROOMMATE|GUEST)' : 'TYPE=(ROOMMATE|GUEST)';
} }
if ($hash->{autoTraining}) { if ($hash->{autoTraining}) {
$devsp .= $devsp ? ',global' : 'global'; $devsp .= $devsp ? ',global' : 'global';
} }
my @ntfdevs = devspec2array($devsp); if ( $devsp && devspec2array($devsp) ) {
if (@ntfdevs) {
setNotifyDev($hash,$devsp);
delete $hash->{disableNotifyFn}; delete $hash->{disableNotifyFn};
setNotifyDev($hash,$devsp);
} else { } else {
notifyRegexpChanged($hash,'',1); notifyRegexpChanged($hash,'',1);
} }
@ -2228,7 +2227,7 @@ sub getMapping {
my $hash = shift // return; my $hash = shift // return;
my $device = shift // return; my $device = shift // return;
my $intent = 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 $disableLog = shift // 0;
my $subType = $type; my $subType = $type;
@ -2511,54 +2510,6 @@ sub Notify {
return; 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}; return if !ReadingsVal($name,'enableMsgDialog',1) || !defined $hash->{helper}->{msgDialog};
my @events = @{deviceEvents($dev_hash, 1)}; my @events = @{deviceEvents($dev_hash, 1)};
@ -2639,31 +2590,7 @@ sub activateVoiceInput {
return IOWrite($hash, 'publish', qq{hermes/hotword/$hotword/detected $json}); return IOWrite($hash, 'publish', qq{hermes/hotword/$hotword/detected $json});
} }
=pod #source: https://rhasspy.readthedocs.io/en/latest/reference/#tts_say
#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
sub sayFinished { sub sayFinished {
my $hash = shift // return; my $hash = shift // return;
my $data = shift // return; my $data = shift // return;
@ -2710,7 +2637,6 @@ sub msgDialog_close {
return if !defined $hash->{helper}{msgDialog}->{$device};; return if !defined $hash->{helper}{msgDialog}->{$device};;
msgDialog_respond( $hash, $device, $response, 0 ); msgDialog_respond( $hash, $device, $response, 0 );
#delete $hash->{helper}{'.delayed'}->{$device};
delete $hash->{helper}{msgDialog}->{$device}; delete $hash->{helper}{msgDialog}->{$device};
return; return;
} }
@ -2816,7 +2742,7 @@ sub handleTtsMsgDialog {
sayFinished($hash, $data->{id}, $hash->{siteId}); sayFinished($hash, $data->{id}, $hash->{siteId});
} elsif (defined $hash->{helper}->{STT} } elsif (defined $hash->{helper}->{STT}
&& defined $hash->{helper}->{STT}->{config}->{$recipient} ) { && 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...? 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; my $siteId = $data->{siteId} // return;
$active = $data->{reason} if $active && defined $data->{reason}; $active = $data->{reason} if $active && defined $data->{reason};
readingsSingleUpdate($hash, "hotwordAwaiting_" . makeReadingName($siteId), $active, 1); 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}; push @updatedList, $hash->{NAME};
return \@updatedList; return \@updatedList;
} }
@ -3042,7 +2971,7 @@ sub analyzeMQTTmessage {
if ( $topic =~ m{\Ahermes/hotword/([^/]+)/detected}x ) { if ( $topic =~ m{\Ahermes/hotword/([^/]+)/detected}x ) {
my $hotword = $1; my $hotword = $1;
my $siteId = $data->{siteId}; my $siteId = $data->{siteId};
if ( $siteId ) { if ( 0 && $siteId ) { #Beta-User: deactivated
my $device = ReadingsVal($hash->{NAME}, "siteId2ttsDevice_$siteId",undef); my $device = ReadingsVal($hash->{NAME}, "siteId2ttsDevice_$siteId",undef);
$device //= $hash->{helper}->{TTS}->{$siteId} if defined $hash->{helper}->{TTS} && defined $hash->{helper}->{TTS}->{$siteId}; $device //= $hash->{helper}->{TTS}->{$siteId} if defined $hash->{helper}->{TTS} && defined $hash->{helper}->{TTS}->{$siteId};
if ($device) { if ($device) {
@ -3053,6 +2982,8 @@ sub analyzeMQTTmessage {
return \@updatedList if !$hash->{handleHotword} && !defined $hash->{helper}{hotwords}; return \@updatedList if !$hash->{handleHotword} && !defined $hash->{helper}{hotwords};
my $ret = handleHotwordDetection($hash, $hotword, $data); my $ret = handleHotwordDetection($hash, $hotword, $data);
push @updatedList, $ret if $ret && $defs{$ret}; push @updatedList, $ret if $ret && $defs{$ret};
$ret = handleHotwordGlobal($hash, $hotword, $data, 'detected');
push @updatedList, $ret if $ret && $defs{$ret};
push @updatedList, $hash->{NAME}; push @updatedList, $hash->{NAME};
return \@updatedList; 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}; return 'speak with explicite params needs siteId and text as arguments!' if !defined $cmd->{siteId} || !defined $cmd->{text};
$sendData->{siteId} = $cmd->{siteId}; $sendData->{siteId} = $cmd->{siteId};
$sendData->{init}->{text} = $cmd->{text}; $sendData->{init}->{text} = $cmd->{text};
} else { #Beta-User: might need review, as parseParams is used by default...! } else {
my($unnamedParams, $namedParams) = parseParams($cmd); my($unnamedParams, $namedParams) = parseParams($cmd);
if (defined $namedParams->{siteId} && defined $namedParams->{text}) { if (defined $namedParams->{siteId} && defined $namedParams->{text}) {
@ -3572,6 +3503,25 @@ sub handleHotwordDetection {
return analyzeAndRunCmd($hash, $hash->{NAME}, $command, $hotword, $siteId); 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 # Eingehender Custom-Intent
sub handleCustomIntent { sub handleCustomIntent {
my $hash = shift // return; 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>
<li> <li>
<a id="RHASSPY-attr-rhasspyHotwords"></a><b>rhasspyHotwords</b> <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> <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.</p> 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> Examples:<br>
<p><code>bumblebee_linux = set amplifier2 mute on<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> porcupine_linux = livingroom="set amplifier mute on" default={Log3($DEVICE,3,"device $DEVICE - room $ROOM - value $VALUE")}<br>
<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> 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> <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>
<li> <li>
<a id="RHASSPY-attr-rhasspyMsgDialog"></a><b>rhasspyMsgDialog</b> <a id="RHASSPY-attr-rhasspyMsgDialog"></a><b>rhasspyMsgDialog</b>