timer overlay support added

This commit is contained in:
Philipp Wo 2019-11-25 22:02:47 +01:00
parent 841eebaa69
commit 37291b0358
1 changed files with 80 additions and 24 deletions

View File

@ -27,6 +27,7 @@ use utf8;
use HTTP::Request::Common qw (POST GET PUT);
use HTTP::Headers;
use JSON;
use POSIX qw(strftime);
####DEFAULTS############
my $client_id='public-api-preview';
@ -186,10 +187,12 @@ sub TadoAPI_Set(@) {
if( $a[3] eq "off" ) {
TadoAPI_SetZoneOverlayById($hash, $value, "off");
} elsif (defined($a[4])) {
TadoAPI_SetZoneOverlayById($hash, $value, $a[3], $a[4]);
} elsif ($a[3] >= 0) {
TadoAPI_SetZoneOverlayById($hash, $value, $a[3]);
}
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
Log3 $name, 4, "TadoAPI $name" . ": " . "$cmd finished";
} elsif( $cmd eq 'setAllOverlays' ) {
Log3 $name, 5, "TadoAPI $name" . ": " . "processing ($cmd)";
@ -199,7 +202,7 @@ sub TadoAPI_Set(@) {
} elsif ($value >= 0) {
TadoAPI_SetAllOverlays($hash, $value);
}
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
Log3 $name, 4, "TadoAPI $name" . ": " . "$cmd finished\n";
} elsif( $cmd eq 'refreshToken' ) {
Log3 $name, 3, "TadoAPI: set $name: processing ($cmd)";
@ -271,7 +274,6 @@ sub TadoAPI_Get(@) {
if($cmd =~ /\Qget\E/) {
COMMAND_HANDLER: {
$cmd eq "getGeo" and do {
return "Need at least one parameter (mobileID)" if(@a < 3);
return "Wrong MobileID" if (length($value) < 6);
@ -398,7 +400,7 @@ sub TadoAPI_LoadToken(@){
open(TOKENFILE, '<', $tokenFileName) or die("ERROR: $!");
$Token = decode_json(<TOKENFILE>)};
if($@ || $tokenLifeTime < gettimeofday()){
Log3 $name, 5, "TadoAPI $name" . ": " . "Error while loading: $@ ,requesting new one";
Log3 $name, 5, "TadoAPI $name" . ": " . "Error while loading: $@ ,requesting new one" if $@;
Log3 $name, 5, "TadoAPI $name" . ": " . "Token is expired, requesting new one" if $tokenLifeTime < gettimeofday();
$Token = TadoAPI_NewTokenRequest($hash);
}else{
@ -556,7 +558,7 @@ sub TadoAPI_Update(@){
##############################################################
sub TadoAPI_SetZoneOverlayById(@){
my ($hash, $zoneID, $setting) = @_;
my ($hash, $zoneID, $setting, $duration) = @_;
my $name = $hash->{NAME};
my $homeID = $attr{$name}{homeID};
my $URL = $QueryURL . qq{/$homeID/zones/$zoneID/overlay};
@ -564,42 +566,93 @@ sub TadoAPI_SetZoneOverlayById(@){
if(defined($TokenData)){
my $method = "";
my $myjson ="";
my $myjson =undef;
Log3 $name, 5, "TadoAPI $name" . ": SetOverlay for Zone $zoneID (Setting: " . $setting . ") - " . "query-URL: $URL";
if ($setting eq "off"){
$method = "DELETE";
Log3 $name, 3, "TadoAPI $name" . ": " . "Deleting Overlay for Zone $zoneID";
}elsif($setting == 0){
$method = "PUT";
$myjson = {
setting => {
my $dt = time();
$dt += $duration;
# remove overlay
if($setting eq "off"){
$method = "DELETE";
Log3 $name, 3, "TadoAPI $name" . ": " . "Deleting Overlay for Zone $zoneID";
}
# turn heating of
elsif($setting == 0){
# turn off for timer
if(defined($duration) && $duration > 0){
$method = "PUT";
$myjson = {
type => "MANUAL",
setting => {
type => "HEATING",
power => "OFF",
power => "OFF"
},
termination => {
type => "MANUAL"
termination => {
type => "TIMER",
durationInSeconds => $duration,
expiry => strftime('%Y-%m-%dT%H:%M:%SZ', gmtime($dt))
}
};
Log3 $name, 3, "TadoAPI $name" . ": " . "Timer Overlay for Zone $zoneID . Power off for: $duration seconds";
}
# infinite off
else{
$method = "PUT";
$myjson = {
setting => {
type => "HEATING",
power => "OFF",
},
termination => {
type => "MANUAL"
},
};
$myjson = encode_json($myjson);
}elsif($setting > 0){
$method = "PUT";
$myjson = {
setting => {
}
}
# infinite temperature overlay
elsif($setting > 0){
# timed overlay
if(defined($duration) && $duration > 0){
$method = "PUT";
$myjson = {
type => "MANUAL",
setting => {
type => "HEATING",
power => "ON",
temperature => {
celsius => $setting
}
},
termination => {
type => "TIMER",
durationInSeconds => $duration,
expiry => strftime('%Y-%m-%dT%H:%M:%SZ', gmtime($dt)),
}
};
Log3 $name, 3, "TadoAPI $name" . ": " . "Timer Overlay for Zone $zoneID . Duration: $duration Exire";
}
else{
# infinite setting
$method = "PUT";
$myjson = {
setting => {
type => "HEATING",
power => "ON",
temperature => {
celsius => $setting
},
},
termination => {
termination => {
type => "MANUAL"
},
};
$myjson = encode_json($myjson);
}
}
$myjson = encode_json($myjson) if (defined($myjson));
my $request = {
url => $URL,
header => { "Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}" },
@ -1434,7 +1487,7 @@ sub TadoAPI_readPassword($)
</li>
<li>
<code>set &lt;name&gt; setZoneOverlay &lt;zoneID&gt; &lt;setting&gt;</code><br>
<code>set &lt;name&gt; setZoneOverlay &lt;zoneID&gt; &lt;setting&gt; [&lt;duration&gt;]</code><br>
Setting: off delete overlay; 0 heating power off; &gt; 1 sets desired temperature to given value (overlay)
</li>
@ -1452,6 +1505,9 @@ sub TadoAPI_readPassword($)
<li>homeID<br>
Home ID that will be used for <b>API </b> querys.
</li>
<li>updateIntervall<br>
Intervall that is used for <b>API </b> querys in seconds.
</li>
</ul>
<br>
</ul>