diff --git a/fhem/FHEM/lib/AttrTemplate/mqtt2.template b/fhem/FHEM/lib/AttrTemplate/mqtt2.template
index b2d2dcf4a..2e7c4cc56 100644
--- a/fhem/FHEM/lib/AttrTemplate/mqtt2.template
+++ b/fhem/FHEM/lib/AttrTemplate/mqtt2.template
@@ -2355,6 +2355,48 @@ set DEVICE attrTemplate speechcontrol_type_thermostat
option:global
setreading DEVICE attrTemplateVersion 20210811
+# Thermostat Beca Wifi
+name:WThermostatBeca
+filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
+desc: First version for WThermostat Beca.
Not yet tested...
see Forum Thread. Might also be ok for original firmware from https://github.com/klausahrenberg/WThermostatBeca
+order:E_05a
+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 hm-tc-it-wm-w-eu;{ AttrVal("DEVICE","icon","hm-tc-it-wm-w-eu") }
+par:CALLSPEECHRECOGN;Set this to 0 to not set any speech recogn. related attributes;{ 1 }
+par:WPNAME;weekprofile attr value, defaults to device name;{ AttrVal('DEVICE','weekprofile','DEVICE') }
+{ Svn_GetFile("contrib/AttrTemplate/99_attrT_z2m_thermostat_Utils.pm", "FHEM/99_attrT_z2m_thermostat_Utils.pm", sub(){ CommandReload(undef, "99_attrT_z2m_thermostat_Utils.pm") }) }
+attr DEVICE icon ICON
+attr DEVICE userattr weekprofile
+attr DEVICE weekprofile WPNAME
+attr DEVICE devStateIcon \
+LWT\
+\
+state
+attr DEVICE setStateList on off weekprofile
+attr DEVICE readingList TELETOPIC/LWT:.* LWT\
+ devices/network:.* { json2nameValue($EVENT,'d_network_',$JSONMAP) }\
+ devices/clock:.* { json2nameValue($EVENT,'d_clock_',$JSONMAP) }\
+ devices/thermostat:.* { json2nameValue($EVENT,'d_thermostat_',$JSONMAP) }\
+ devices/logging:.* { json2nameValue($EVENT,'d_log_',$JSONMAP) }\
+ STATTOPIC/things/network/properties:.* { json2nameValue($EVENT,'net_',$JSONMAP) }\
+ STATTOPIC/things/thermostat/properties:.* { json2nameValue($EVENT,'',$JSONMAP) }\
+ STATTOPIC/things/logging/properties:.* { json2nameValue($EVENT,'log_',$JSONMAP) }\
+ STATTOPIC/things/clock/properties:.* { json2nameValue($EVENT,'clock_',$JSONMAP) }
+attr DEVICE setList on CMNDTOPIC/things/thermostat/properties/deviceOn true\
+ off CMNDTOPIC/things/thermostat/properties/deviceOn false\
+ desired-temp:slider,5.0,0.5,35.0,1 CMNDTOPIC/things/thermostat/properties/targetTemperature $EVTPART1\
+ mode:heat,auto CMNDTOPIC/things/thermostat/properties/mode $EVTPART1\
+ weekprofile { FHEM::attrT_z2m_thermostat_Utils::z2t_send_Beca_weekprofile($NAME, $EVTPART1, $EVTPART2, 'CMNDTOPIC/things/thermostat/schedules') }\
+ x_send_mcucommand:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(CMNDTOPIC/things/thermostat/mcucommand $payload)}
+attr DEVICE getList desired-temp:noArg desired-temp CMNDTOPIC/things/thermostat/properties
+attr DEVICE jsonMap targetTemperature:desired-temp
+set DEVICE attrTemplate speechcontrol_type_thermostat
+deletereading -q DEVICE (?!associatedWith|IODev).*
+setreading DEVICE attrTemplateVersion 20211005
+
+
###########################################
# SHELLY
#
@@ -3536,20 +3578,20 @@ desc:To configure a boiler device for use with an EMS-ESP is a open-source system to communicate with EMS (Energy Management System) based boilers, thermostats and other modules from manufacturers like Bosch, Buderus, Nefit, Junkers and Sieger, see project page. First version, to contribute see Forum Thread.
-order:E_02a1
-par:BASE_ID;base topic set, default is "home";{ AttrVal("DEVICE","readingList","") =~ m,([^/:]+)/, ? $1 : "home" }
-par:DEV_ID;ID topic set, default is "ems-esp";{ AttrVal("DEVICE","readingList","") =~ m,[^/:]+/([^/]+), ? $1 : "ems-esp" }
-par:ICON;ICON as set, defaults to sani_boiler_temp;{ AttrVal("DEVICE","icon","sani_boiler_temp") }
-attr DEVICE icon ICON
-modify DEVICE DEV_ID
-attr DEVICE bridgeRegexp \
- BASE_ID/DEV_ID/(sensors|sm_data|hp_data|thermostat_data).*:.* "ems_esp_$1"\
- BASE_ID/DEV_ID/(boiler_data|tapwater_active|heating_active|mixing_data|shower_data).*:.* "ems_esp_boiler"
-attr DEVICE userReadings formatedUptime:uptime.* {my $m = ReadingsVal($name,"uptime",0)/60;; return sprintf "0 000 00:%02d", $m if $m < 60;; my $h = $m / 60;; $m %= 60;; return sprintf "0 000 %02d:%02d", $h, $m if $h < 24;; my $d = $h / 24;; $h %= 24;; return sprintf "0 %03d %02d:%02d", $d, $h, $m if $d <365;; my $y = $d / 365;; $d %= 365;; return sprintf "%d %03d %02d:%02d", $y, $d, $h, $m}
-attr DEVICE readingList BASE_ID/DEV_ID/start:.* LWT\
- BASE_ID/DEV_ID/heartbeat:.* { json2nameValue($EVENT,'',$JSONMAP) }
-attr DEVICE stateFormat Interface: \
-LWT\
-Signal: \
-rssid %\
-
Uptime: formatedUptime\
-
IPAddress : IP
-attr DEVICE setList restart:noArg BASE_ID/DEV_ID/restart
-attr DEVICE devStateIcon online:it_net offline:it_net@red 2.1:lan_rs485 2.0:lan_rs485@red
-attr DEVICE autocreate 1
-attr DEVICE webCmd restart
-attr DEVICE model ems-esp_heater_device_outdated
-setreading DEVICE attrTemplateVersion 20200522 or prior
-
-name:ems-esp_boiler_outdated
-filter:TYPE=MQTT2_DEVICE
-desc:To configure a boiler device for use with an EMS-ESP
.Forum Thread
-order:E_02b1
-par:BASEPATH;base topic set in the ESP including "ems-esp";{ AttrVal("DEVICE","readingList","") =~ m,([^:]*ems-esp)/boiler_data:, ? "$1" : undef }
-attr DEVICE readingList BASEPATH/boiler_data { json2nameValue($EVENT,'',$JSONMAP) }\
- BASEPATH/shower_data:.* { json2nameValue($EVENT,'',$JSONMAP) }\
- BASEPATH/mixing_data:.* { json2nameValue($EVENT,'',$JSONMAP) }\
- BASEPATH/tapwater_active:.* tapwater_active\
- BASEPATH/heating_active:.* heating_active
-attr DEVICE stateFormat { my $h=ReadingsNum($name,"heating_active",0); my $t=ReadingsNum($name,"tapwater_active",0); !$h && !$t ? "idle" : ($h && !$t ? "heating" : "tapwater")}
-attr DEVICE devStateIcon idle:sani_heating heating:sani_heating@red tapwater:sani_water_hot@red
-attr DEVICE setList wWComfort:select,hot,intelligent BASEPATH/boiler_cmd { "cmd":"comfort", "data": "$EVTPART1" }
-attr DEVICE webCmd wWComfort
-attr DEVICE eventMap hot:Hot intelligent:Eco
-attr DEVICE model ems-esp_boiler_outdated
-setreading DEVICE attrTemplateVersion 20200529
-
-#ems-esp thermostat device
-name:ems-esp_thermostat_read-only_outdated
-filter:TYPE=MQTT2_DEVICE
-desc:To configure a simple read-only thermostat (e.g. CT200) for use with an EMS-ESP.
Forum Thread
-order:E_02c1
-par:BASEPATH;base topic set in the ESP including "ems-esp";{ AttrVal("DEVICE","readingList","") =~ m,([^:]*ems-esp)/thermostat_data:, ? "$1" : undef }
-par:ICON;ICON as set, defaults to temp_control;{ AttrVal("DEVICE","icon","temp_control") }
-attr DEVICE icon ICON
-attr DEVICE devStateIcon auto:time_automatic manual:time_manual_mode
-attr DEVICE jsonMap hc1_mode:mode hc1_seltemp:desired-temp hc1_daytemp:daytemp hc1_nighttemp:nighttemp hc1_holidayttemp:holidaytemp
-attr DEVICE readingList BASEPATH/thermostat_data:.* { json2nameValue($EVENT, '', $JSONMAP) }
-attr DEVICE stateFormat mode\
-desired-temp °C
-attr DEVICE webCmd :
-attr DEVICE model ems-esp_thermostat_read-only_outdated
-setreading DEVICE attrTemplateVersion 20200522 or prior
-
-name:ems-esp_thermostat_simple_outdated
-filter:TYPE=MQTT2_DEVICE
-desc:To configure a simple thermostat (e.g. RC300) for use with an EMS-ESP.
Forum Thread
-order:E_02ca
-par:BASEPATH;base topic set in the ESP including "ems-esp";{ AttrVal("DEVICE","readingList","") =~ m,([^:]*ems-esp)/thermostat_data:, ? "$1" : undef }
-par:ICON;ICON as set, defaults to temp_control;{ AttrVal("DEVICE","icon","temp_control") }
-attr DEVICE icon ICON
-attr DEVICE devStateIcon set.auto:edit_settings:mode+manual set.manual:edit_settings:mode+auto auto:time_automatic:mode+manual manual:time_manual_mode:mode+auto set.*°C:edit_settings
-attr DEVICE jsonMap hc1_mode:mode hc1_seltemp:desired-temp hc1_daytemp:daytemp hc1_nighttemp:nighttemp hc1_holidayttemp:holidaytemp
-attr DEVICE readingList BASEPATH/thermostat_data:.* { json2nameValue($EVENT, '', $JSONMAP) }
-attr DEVICE setList mode:uzsuSelectRadio,auto,manual BASEPATH/thermostat_cmd_mode1 $EVTPART1\
- desired-temp:slider,15.0,0.5,30.0,1 BASEPATH/thermostat_cmd_temp1 $EVTPART1
-attr DEVICE setStateList on off
-attr DEVICE stateFormat mode\
-desired-temp °C
-attr DEVICE webCmd mode:desired-temp
-set DEVICE attrTemplate speechcontrol_type_thermostat
-attr DEVICE model ems-esp_thermostat_simple_outdated
-setreading DEVICE attrTemplateVersion 20200522 or prior
-
-name:ems-esp_thermostat_RC35_type_outdated
-filter:TYPE=MQTT2_DEVICE
-desc:To configure a thermostat comparable to RC35 for use with an EMS-ESP
.Forum Thread
-order:E_02ca1
-par:BASEPATH;base topic set in the ESP including "ems-esp";{ AttrVal("DEVICE","readingList","") =~ m,([^:]*ems-esp)/thermostat_data:, ? "$1" : undef }
-set DEVICE attrTemplate ems-esp_thermostat_simple
-attr DEVICE setList mode:uzsuSelectRadio,auto,manual BASEPATH/thermostat_cmd_mode1 $EVTPART1\
- desired-temp:slider,15.0,0.5,30.0,1 BASEPATH/thermostat_cmd_temp1 $EVTPART1\
- daytemp:slider,15.0,0.5,30.0,1 BASEPATH/thermostat_cmd_daytemp1 $EVTPART1\
- nighttemp:slider,15.0,0.5,30.0,1 BASEPATH/thermostat_cmd_nighttemp1 $EVTPART1\
- holidaytemp:slider,15.0,0.5,30.0,1 BASEPATH/thermostat_cmd_holidayttemp1 $EVTPART1
-set DEVICE attrTemplate speechcontrol_type_thermostat
-attr DEVICE model ems-esp_thermostat_RC35_type_outdated
-setreading DEVICE attrTemplateVersion 20200522 or prior
-
-
###############
#ESP Milight Hub
#use this with Chris Mullins ESP-Milight-Hub. for further details visit https://github.com/sidoh/esp8266_milight_hub
diff --git a/fhem/contrib/AttrTemplate/99_attrT_z2m_thermostat_Utils.pm b/fhem/contrib/AttrTemplate/99_attrT_z2m_thermostat_Utils.pm
index 500ecbbc2..b485279be 100644
--- a/fhem/contrib/AttrTemplate/99_attrT_z2m_thermostat_Utils.pm
+++ b/fhem/contrib/AttrTemplate/99_attrT_z2m_thermostat_Utils.pm
@@ -8,6 +8,8 @@ use strict;
use warnings;
use JSON qw(decode_json);
use Carp qw(carp);
+use Scalar::Util qw(looks_like_number);
+
#use POSIX qw(strftime);
#use List::Util qw( min max );
#use Scalar::Util qw(looks_like_number);
@@ -32,6 +34,7 @@ BEGIN {
json2nameValue
defs
Log3
+ IsWe
)
);
}
@@ -104,6 +107,50 @@ sub z2t_send_weekprofile {
return;
}
+
+sub z2t_send_Beca_weekprofile {
+ my $name = shift // carp q[No device name provided!] && return;
+ my $wp_name = shift // carp q[No weekprofile device name provided!] && return;
+ my $wp_profile = shift // carp q[No weekprofile profile name provided!] && return;
+ my $topic = shift // carp q[No topic to send to provided!] && return;
+
+ my $hash = $defs{$name};
+
+ my $wp_profile_data = CommandGet(undef,"$wp_name profile_data $wp_profile 0");
+ if ($wp_profile_data =~ m{(profile.*not.found|usage..profile_data..name)}xms ) {
+ Log3( $hash, 3, "[$name] weekprofile $wp_name: no profile named \"$wp_profile\" available" );
+ return;
+ }
+
+ my @D = qw(Sun Mon Tue Wed Thu Fri Sat); # eqals to my @D = ("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
+ my $payload;
+ my @days = (0,1,6);
+ my $decoded;
+ if ( !eval { $decoded = decode_json($wp_profile_data) ; 1 } ) {
+ Log3($name, 1, "JSON decoding error in $wp_profile provided by $wp_name: $@");
+ return;
+ }
+
+ for my $i (@days) {
+ my $sd = $i == 0 ? 'u' : $i == 6 ? 'a' : 'w';
+
+ for my $j (0..5) {
+ my $time = $decoded->{$D[$i]}{'time'}[$j];
+ last if !defined $time;
+ my $tmp = $decoded->{$D[$i]}{'temp'}[$j];
+ my $k = $j+1;
+ next if !looks_like_number($tmp);
+ $payload .= defined $payload ? ',' : '{';
+ $payload .= qq("${sd}${k}h":"$time","${sd}${k}t":$tmp);
+ }
+ }
+ Log3($hash,3,"$payload");
+ return if !defined $payload;
+ $payload .='}';
+ readingsSingleUpdate( $hash, 'weekprofile', "$wp_name $wp_profile",1);
+ return qq{$topic $payload};
+}
+
1;
__END__