added zone lock functionality for tablet-ui thermostat

This commit is contained in:
Philipp Wo 2020-02-07 14:26:15 +01:00
parent 66a5c525a9
commit ba14eee4b1
1 changed files with 55 additions and 39 deletions

View File

@ -239,14 +239,17 @@ sub TadoAPI_Set(@) {
if( $value >= 1 ) {
my ($temperature, $humidity, $desiredTemp, $currentHeatingPower, $overlay ) = TadoAPI_GetZoneReadingsById($hash, $value);
my $zoneName = TadoAPI_GetZoneNameById($hash, $value);
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "Temperatur_" . $zoneName, $temperature);
readingsBulkUpdate($hash, "Luftfeuchtigkeit_" . $zoneName, $humidity);
readingsBulkUpdate($hash, "Heizleistung_" . $zoneName, $currentHeatingPower);
readingsBulkUpdate($hash, "OverlayType_" . $zoneName, $overlay);
readingsBulkUpdate($hash, "DesiredTemp_" . $zoneName, $desiredTemp);
readingsEndUpdate($hash, 1);
$message = "OK";
if(defined($zoneName)){
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "Temperatur_" . $zoneName, $temperature);
readingsBulkUpdate($hash, "Luftfeuchtigkeit_" . $zoneName, $humidity);
readingsBulkUpdate($hash, "Heizleistung_" . $zoneName, $currentHeatingPower);
readingsBulkUpdate($hash, "OverlayType_" . $zoneName, $overlay);
readingsBulkUpdate($hash, "DesiredTemp_" . $zoneName, $desiredTemp);
readingsEndUpdate($hash, 1);
$message = "OK";
}
} else {
return "Wrong ZoneID";
}
@ -356,8 +359,8 @@ sub TadoAPI_Get(@) {
$message = "You have $zonecount Zones in Home " . $attr{$name}{homeID} . ".\n";
my @devArr = TadoAPI_GetTadoDevices($hash);
for (my $i=0; $i < @devArr; $i++){
my $zoneid = $devArr[$i]->{'id'};
$message .= "Zone ID $zoneid: " . TadoAPI_GetZoneNameById($hash, $zoneid) . "\n";
my $zoneID = $devArr[$i]->{'id'};
$message .= "Zone ID $zoneID: " . TadoAPI_GetZoneNameById($hash, $zoneID) . "\n";
}
$message .= "See Logfile for more Info";
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
@ -600,6 +603,8 @@ sub TadoAPI_SetZoneOverlayById(@){
my $dt = time();
$dt += $duration if defined($duration);
delete($hash->{helper}{LockedZones}{$zoneID});
# remove overlay
if($setting eq "remove"){
$method = "DELETE";
@ -637,10 +642,9 @@ sub TadoAPI_SetZoneOverlayById(@){
},
};
}
}
# infinite temperature overlay
}
elsif($setting > 0){
# timed overlay
# set timed overlay
if(defined($duration) && $duration > 0){
$method = "PUT";
$myjson = {
@ -659,6 +663,8 @@ sub TadoAPI_SetZoneOverlayById(@){
}
};
Log3 $name, 3, "TadoAPI $name" . ": " . "Set Timer Overlay for Zone $zoneID with $duration seconds expire.";
# seet lock for this zone
$hash->{helper}{LockedZones}{$zoneID}="locked";
}
else{
# infinite setting
@ -704,11 +710,11 @@ sub TadoAPI_SetAllOverlays(@){
my @zones = TadoAPI_GetTadoDevices($hash);
for (my $i=0; $i < @zones; $i++) {
my $zoneid = $zones[$i]->{'id'};
my $zoneID = $zones[$i]->{'id'};
if(defined($duration) && $duration > 0){
TadoAPI_SetZoneOverlayById($hash, $zoneid, $setting, $duration);
TadoAPI_SetZoneOverlayById($hash, $zoneID, $setting, $duration);
}else{
TadoAPI_SetZoneOverlayById($hash, $zoneid, $setting);
TadoAPI_SetZoneOverlayById($hash, $zoneID, $setting);
}
}
}
@ -719,9 +725,9 @@ sub TadoAPI_GetAllZoneOverlays(@){
my @zones = TadoAPI_GetTadoDevices($hash);
foreach my $zone ( @zones ){
my $zoneId = $zone->{'id'};
my $zoneID = $zone->{'id'};
my $zoneName = TadoAPI_ReplaceUmlaute($zone->{'name'});
my ($temperature, $humidity, $desiredTemp, $currentHeatingPower, $overlay ) = TadoAPI_GetZoneReadingsById($hash, $zoneId);
my ($temperature, $humidity, $desiredTemp, $currentHeatingPower, $overlay ) = TadoAPI_GetZoneReadingsById($hash, $zoneID);
readingsSingleUpdate($hash, "OverlayType_" . $zoneName, $overlay, 1);
}
}
@ -810,11 +816,11 @@ sub TadoAPI_UpdateAllZoneReadingsCallback($){
}else{
readingsBeginUpdate($hash);
foreach my $zone ( @$decoded_data ){
my $zoneid = $zone->{'id'};
my $zoneID = $zone->{'id'};
my $zoneName = TadoAPI_ReplaceUmlaute($zone->{'name'});
Log3 $name, 5, "TadoAPI $name" . ": " . "Set Reading Update for Zone $zoneid ";
Log3 $name, 5, "TadoAPI $name" . ": " . "Set Reading Update for Zone $zoneID ";
my ($temperature, $humidity, $desiredTemp, $currentHeatingPower, $overlay ) = TadoAPI_GetZoneReadingsById($hash, $zoneid);
my ($temperature, $humidity, $desiredTemp, $currentHeatingPower, $overlay ) = TadoAPI_GetZoneReadingsById($hash, $zoneID);
# updates zone readings
readingsBulkUpdate($hash, "Temperatur_" . $zoneName, $temperature);
@ -844,7 +850,7 @@ sub Tado_UpdateZoneOverlayCallback($)
my ($param, $err, $data) = @_;
my $hash = $param->{hash};
my $name = $hash->{NAME};
my $zoneId = $param->{zoneID};
my $zoneID = $param->{zoneID};
my $setting = $param->{setting};
if($err ne "")
@ -856,21 +862,30 @@ sub Tado_UpdateZoneOverlayCallback($)
elsif($data ne "")
{
Log3 $name, 5, "url ".$param->{url}." returned: $data";
Log3 $name, 3, "TadoAPI $name" . ": " . "set (async) Overlay for Zone $zoneId to: $setting";
Log3 $name, 3, "TadoAPI $name" . ": " . "set (async) Overlay for Zone $zoneID to: $setting";
}
# finaly update readings
my ($temperature, $humidity, $desiredTemp, $currentHeatingPower, $overlay ) = TadoAPI_GetZoneReadingsById($hash, $zoneId);
my $zoneName = TadoAPI_GetZoneNameById($hash, $zoneId);
my ($temperature, $humidity, $desiredTemp, $currentHeatingPower, $overlay ) = TadoAPI_GetZoneReadingsById($hash, $zoneID);
my $zoneName = TadoAPI_GetZoneNameById($hash, $zoneID);
if(defined($zoneName)){
# updates zone readings
readingsBeginUpdate($hash);
# readingsBulkUpdate($hash, "Temperatur_" . $zoneName, $temperature);
# readingsBulkUpdate($hash, "Luftfeuchtigkeit_" . $zoneName, $humidity);
# readingsBulkUpdate($hash, "Heizleistung_" . $zoneName, $currentHeatingPower);
readingsBulkUpdate($hash, "OverlayType_" . $zoneName, $overlay);
readingsBulkUpdate($hash, "DesiredTemp_" . $zoneName, $desiredTemp);
# updates zone readings
readingsBeginUpdate($hash);
# readingsBulkUpdate($hash, "Temperatur_" . $zoneName, $temperature);
# readingsBulkUpdate($hash, "Luftfeuchtigkeit_" . $zoneName, $humidity);
# readingsBulkUpdate($hash, "Heizleistung_" . $zoneName, $currentHeatingPower);
readingsBulkUpdate($hash, "OverlayType_" . $zoneName, $overlay);
readingsBulkUpdate($hash, "DesiredTemp_" . $zoneName, $desiredTemp);
readingsEndUpdate( $hash, 1 );
# lock zone if timed overlay
if(exists($hash->{helper}->{LockedZones}{$zoneID})){
readingsBulkUpdate($hash, "Zone" . $zoneID . "Lock", "timer");
readingsEndUpdate( $hash, 1 );
} else{
readingsEndUpdate( $hash, 1 );
readingsDelete($hash, "Zone" . $zoneID . "Lock");
}
}
}
sub TadoAPI_LogInfoCallback($){
@ -1003,9 +1018,9 @@ sub TadoAPI_GetZoneInfo(@) {
# zones
my @devArr = TadoAPI_GetTadoDevices($hash);
for (my $i=0; $i < @devArr; $i++) {
my $zoneid = $devArr[$i]->{'id'};
my $URL=$QueryURL . qq{/$homeID/zones/$zoneid/state};
my $infotext = "ZoneID $zoneid (" . TadoAPI_GetZoneNameById($hash, $zoneid) . ") Status";
my $zoneID = $devArr[$i]->{'id'};
my $URL=$QueryURL . qq{/$homeID/zones/$zoneID/state};
my $infotext = "ZoneID $zoneID (" . TadoAPI_GetZoneNameById($hash, $zoneID) . ") Status";
my $request = {
url => $URL,
header => { "Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}" },
@ -1065,10 +1080,11 @@ sub TadoAPI_ReplaceUmlaute(@) {
return $string;
}
# helper sub for fhem tablet-ui thermostat widget: set timedZoneOverlay <zoneId> <duration> <setting>
# helper sub for fhem tablet-ui thermostat widget: set timedZoneOverlay <zoneID> <duration> <setting>
sub TadoAPI_SetTimedZoneOverlay(@){
my ($hash, $zoneid, $duration, $setting) = @_;
TadoAPI_SetZoneOverlayById($hash, $zoneid, $setting, $duration);
my ($hash, $zoneID, $duration, $setting) = @_;
my $name = $hash->{NAME};
TadoAPI_SetZoneOverlayById($hash, $zoneID, $setting, $duration);
}