overlay for single zone or for all zones now possible; battery state for all tado devices
This commit is contained in:
parent
91a981395e
commit
62d6162f7d
195
98_TadoAPI.pm
195
98_TadoAPI.pm
|
@ -10,15 +10,16 @@
|
|||
# HTTP::Request::Common
|
||||
# HTTP::Headers
|
||||
# LWP::UserAgent::Paranoid
|
||||
# Data::Dumper;
|
||||
# Data::Dumper;
|
||||
# JSON
|
||||
#
|
||||
# BUGS: ---
|
||||
# NOTES: ---
|
||||
# AUTHOR: Philipp Wolfmajer
|
||||
# ORGANIZATION:
|
||||
# VERSION: 1.0
|
||||
# CREATED: 04/12/2019 07:55:44 PM
|
||||
# REVISION: 04/23/2019 05:17:22 PM
|
||||
# REVISION: 11/15/2019 05:17:22 PM
|
||||
#===============================================================================
|
||||
package main;
|
||||
use strict;
|
||||
|
@ -62,11 +63,12 @@ my %sets = (
|
|||
"password" => "",
|
||||
"update" => "noArg",
|
||||
"setGeo" => "",
|
||||
"setOverlay" => ""
|
||||
"setZoneOverlay" => "",
|
||||
"setAllOverlays" => ""
|
||||
);
|
||||
|
||||
my %gets = (
|
||||
"getZoneDevices" => "",
|
||||
"getZoneDevices" => "noArg",
|
||||
"getZoneInfo" => "noArg",
|
||||
"getGeo" => "",
|
||||
#"getXTest" => "noArg",
|
||||
|
@ -172,16 +174,27 @@ sub TadoAPI_Set(@) {
|
|||
TadoAPI_GetGeoById($hash, $value);
|
||||
return undef;
|
||||
|
||||
} elsif( $cmd eq 'setOverlay' ) {
|
||||
} elsif( $cmd eq 'setZoneOverlay' ) {
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "processing ($cmd)" if $debug;
|
||||
return "Need at least two parameters (ID, Setting)" if(@a < 4);
|
||||
if( $a[3] > 10 ) {
|
||||
TadoAPI_SetOverlay($hash, $value, $a[3]);
|
||||
TadoAPI_SetZoneOverlay($hash, $value, $a[3]);
|
||||
} else {
|
||||
TadoAPI_SetOverlay($hash, $value, "off");
|
||||
TadoAPI_SetZoneOverlay($hash, $value, "off");
|
||||
}
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
|
||||
return undef;
|
||||
return undef;
|
||||
|
||||
} elsif( $cmd eq 'setAllOverlays' ) {
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "processing ($cmd)" if $debug;
|
||||
return "Need at least one parameter (Setting)" if(@a < 3);
|
||||
if( $value > 1 ) {
|
||||
TadoAPI_SetAllOverlays($hash, $value);
|
||||
} else {
|
||||
TadoAPI_SetAllOverlays($hash, "off");
|
||||
}
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
|
||||
return undef;
|
||||
|
||||
} elsif( $cmd eq 'refreshToken' ) {
|
||||
Log3 $name, 3, "TadoAPI: set $name: processing ($cmd)";
|
||||
|
@ -261,7 +274,7 @@ sub TadoAPI_Get(@) {
|
|||
$message = "Device List:\n";
|
||||
foreach my $item ( @data ){
|
||||
print "\n";
|
||||
$message =+ $message . $item->{'name'} . ": " . $item->{'id'} . "\n";
|
||||
$message .= $item->{'name'} . ": " . $item->{'id'} . "\n";
|
||||
};
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
|
||||
last;
|
||||
|
@ -276,13 +289,22 @@ sub TadoAPI_Get(@) {
|
|||
|
||||
$cmd eq "getZoneDevices" and do {
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "processing ($cmd)" if $debug;
|
||||
return "ID parameter missing (set getZoneDevices zoneID)" if(@a < 3);
|
||||
TadoAPI_Connect($hash);
|
||||
my ($devcount, $deviceList) = TadoAPI_GetZoneDevicesById($hash, $value);
|
||||
$message= "There are " . $devcount . " Tado-Device(s) in this Zone.\n";
|
||||
foreach my $item ( @$deviceList ){
|
||||
$message =+ $message . $item->{'serialNo'} . " Battery: " . $item->{'batteryState'} . "\n";
|
||||
my @devArr = TadoAPI_RequestTadoDevices($hash);
|
||||
my $devicecount = 0;
|
||||
$message = "Tado-Device(s):\n";
|
||||
for (my $i=0; $i < @devArr; $i++){
|
||||
my $tadodevices = $devArr[$i]->{'devices'};
|
||||
$message .= "ZoneID:" . ($i+1);
|
||||
my $spacer = 0;
|
||||
foreach my $item ( @$tadodevices ){
|
||||
$message .= "\t" if ($spacer > 0);
|
||||
$message .= " " . $item->{'serialNo'} . " Battery: " . $item->{'batteryState'} . "\n";
|
||||
$devicecount++;
|
||||
$spacer++;
|
||||
}
|
||||
}
|
||||
$message .= "There are $devicecount Tado-Device(s) in this HomeID(" . $attr{$name}{homeID} . ")." ;
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
|
||||
last;
|
||||
};
|
||||
|
@ -293,9 +315,9 @@ sub TadoAPI_Get(@) {
|
|||
my $zonecount = TadoAPI_GetZoneCount($hash);
|
||||
$message = "You have $zonecount Zones.\n";
|
||||
for (my $i=1; $i <= $zonecount; $i++) {
|
||||
$message =+ $message . "ZoneID:$i: " . TadoAPI_GetZoneNameById($hash, $i) . "\n";
|
||||
$message .= "Zone ID:$i: " . TadoAPI_GetZoneNameById($hash, $i) . "\n";
|
||||
}
|
||||
$message =+ $message . "See Logfile for more Info";
|
||||
$message .= "See Logfile for more Info";
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
|
||||
last;
|
||||
};
|
||||
|
@ -326,12 +348,11 @@ sub TadoAPI_Undefine($$) {
|
|||
return undef;
|
||||
}
|
||||
|
||||
|
||||
|
||||
sub TadoAPI_callback($$$){
|
||||
my ($param, $err, $data) = @_;
|
||||
my $hash = $param->{hash};
|
||||
my $name = $hash->{NAME};
|
||||
$param = 0 unless defined $param;
|
||||
|
||||
if($param->{code} == 401 || $param->{code} == 400){
|
||||
$apiStatus = 1;
|
||||
|
@ -527,7 +548,7 @@ sub TadoAPI_Update(@){
|
|||
|
||||
######################## tado methods ########################
|
||||
##############################################################
|
||||
sub TadoAPI_SetOverlay(@){
|
||||
sub TadoAPI_SetZoneOverlay(@){
|
||||
my ($hash, $zoneID, $setting) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
my $homeID = $attr{$name}{homeID};
|
||||
|
@ -582,11 +603,6 @@ sub TadoAPI_SetOverlay(@){
|
|||
print "\n Retriving State:\n" if $debug;
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Retriving state:\n" . $res->content if $debug;
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Set Overlay for Zone $zoneID to: $setting";
|
||||
|
||||
# write readings
|
||||
readingsBeginUpdate($hash);
|
||||
readingsBulkUpdate($hash, "OverlayType_" . $zoneName, $message);
|
||||
readingsEndUpdate( $hash, 1 );
|
||||
}else{
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Error in SetOverlay()";
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Status (setOverlay): " . $res->status_line if $debug;
|
||||
|
@ -596,6 +612,71 @@ sub TadoAPI_SetOverlay(@){
|
|||
}
|
||||
}
|
||||
|
||||
sub TadoAPI_SetAllOverlays(@){
|
||||
my ($hash, $setting) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
my $homeID = $attr{$name}{homeID};
|
||||
|
||||
if($apiStatus == 1){
|
||||
TadoAPI_Connect($hash);
|
||||
my $zonecount = TadoAPI_RequestZones($hash);
|
||||
|
||||
my $header = HTTP::Headers->new("Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}");
|
||||
my $ua = LWP::UserAgent::Paranoid->new(ssl_opts => { verify_hostname => 1 },protocols_allowed => ['https','http'],request_timeout => 5,);
|
||||
$ua->default_headers($header);
|
||||
|
||||
my $req = undef;
|
||||
my $res = undef;
|
||||
my $message = "";
|
||||
|
||||
for (my $i=1; $i <= $zonecount; $i++) {
|
||||
my $URL = $QueryURL . qq{/$homeID/zones/$i/overlay};
|
||||
|
||||
if ($setting eq "off"){
|
||||
# Delete overlay
|
||||
$req = HTTP::Request->new( 'DELETE', $URL );
|
||||
$req->content_type('application/json');
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Deleting Overlay (off)" if $debug;
|
||||
$message = "no overlay";
|
||||
}elsif($setting > 10){
|
||||
$req = HTTP::Request->new( 'PUT', $URL );
|
||||
$req->content_type('application/json');
|
||||
$message = {
|
||||
setting => {
|
||||
type => "HEATING",
|
||||
power => "ON",
|
||||
temperature => {
|
||||
celsius => $setting
|
||||
},
|
||||
},
|
||||
termination => {
|
||||
type => "MANUAL"
|
||||
},
|
||||
};
|
||||
my $myjson = encode_json($message);
|
||||
#print Dumper($myjson);
|
||||
$req->content($myjson);
|
||||
|
||||
$message = "MANUAL";
|
||||
}
|
||||
$ua->default_headers($header);
|
||||
$res = $ua->request($req);
|
||||
|
||||
if($res->is_success){
|
||||
print "\n Retriving State:\n" if $debug;
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Retriving state:\n" . $res->content if $debug;
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Set Overlay for Zone $i to: $setting";
|
||||
}else{
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Error in SetOverlay()";
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Status (setOverlay): " . $res->status_line if $debug;
|
||||
}
|
||||
|
||||
}
|
||||
# finaly update readings
|
||||
#TadoAPI_UpdateFn($hash);
|
||||
}
|
||||
}
|
||||
|
||||
sub TadoAPI_UpdateFn(@){
|
||||
my ($hash) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
|
@ -614,12 +695,12 @@ sub TadoAPI_UpdateFn(@){
|
|||
if (!defined $overlay) {$overlay = "no overlay"};
|
||||
|
||||
readingsBeginUpdate($hash);
|
||||
readingsBulkUpdate($hash, "HomeMode_" . encode("UTF-8", $devices[$i]->{'name'}), $zones[$i]->{'tadoMode'});
|
||||
readingsBulkUpdate($hash, "Temperatur_" . encode("UTF-8", $devices[$i]->{'name'}), $zones[$i]->{'sensorDataPoints'}->{'insideTemperature'}->{'celsius'});
|
||||
readingsBulkUpdate($hash, "Luftfeuchtigkeit_" . encode("UTF-8", $devices[$i]->{'name'}), $zones[$i]->{'sensorDataPoints'}->{'humidity'}->{'percentage'});
|
||||
readingsBulkUpdate($hash, "Heizleistung_" . encode("UTF-8", $devices[$i]->{'name'}), $zones[$i]->{'activityDataPoints'}->{'heatingPower'}->{'percentage'});
|
||||
readingsBulkUpdate($hash, "OverlayType_" . encode("UTF-8", $devices[$i]->{'name'}), $overlay);
|
||||
readingsBulkUpdate($hash, "DesiredTemp_" . encode("UTF-8", $devices[$i]->{'name'}), $zones[$i]->{'setting'}->{'temperature'}->{'celsius'});
|
||||
readingsBulkUpdate($hash, "HomeMode_" . TadoAPI_ReplaceUmlaute($devices[$i]->{'name'}), $zones[$i]->{'tadoMode'});
|
||||
readingsBulkUpdate($hash, "Temperatur_" . TadoAPI_ReplaceUmlaute($devices[$i]->{'name'}), $zones[$i]->{'sensorDataPoints'}->{'insideTemperature'}->{'celsius'});
|
||||
readingsBulkUpdate($hash, "Luftfeuchtigkeit_" . TadoAPI_ReplaceUmlaute($devices[$i]->{'name'}), $zones[$i]->{'sensorDataPoints'}->{'humidity'}->{'percentage'});
|
||||
readingsBulkUpdate($hash, "Heizleistung_" . TadoAPI_ReplaceUmlaute($devices[$i]->{'name'}), $zones[$i]->{'activityDataPoints'}->{'heatingPower'}->{'percentage'});
|
||||
readingsBulkUpdate($hash, "OverlayType_" . TadoAPI_ReplaceUmlaute($devices[$i]->{'name'}), $overlay);
|
||||
readingsBulkUpdate($hash, "DesiredTemp_" . TadoAPI_ReplaceUmlaute($devices[$i]->{'name'}), $zones[$i]->{'setting'}->{'temperature'}->{'celsius'});
|
||||
readingsEndUpdate( $hash, 1 );
|
||||
}
|
||||
|
||||
|
@ -654,12 +735,10 @@ return undef;
|
|||
sub TadoAPI_GetGeoById(@){
|
||||
my ($hash, $mobileID) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
my $homeID = $attr{$name}{homeID};
|
||||
|
||||
my $URL=$QueryURL.qq{/$homeID/mobileDevices/$mobileID/settings};
|
||||
my $setting = 0;
|
||||
og3 $name, 3, "TadoAPI $name" . ": " . "query-URL: $URL" if $debug;
|
||||
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "query-URL: $URL" if $debug;
|
||||
TadoAPI_Connect($hash);
|
||||
|
||||
if($apiStatus == 1){
|
||||
|
@ -672,7 +751,7 @@ sub TadoAPI_GetGeoById(@){
|
|||
|
||||
if($res->is_success){
|
||||
my $ResponseData = decode_json($res->content);
|
||||
$setting = $ResponseData->{'geoTrackingEnabled'};
|
||||
my $setting = $ResponseData->{'geoTrackingEnabled'};
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Actual geo setting for $mobileID is: $setting" if $debug;
|
||||
|
||||
readingsBeginUpdate($hash);
|
||||
|
@ -755,8 +834,7 @@ sub TadoAPI_GetZoneInfo(@) {
|
|||
|
||||
if($res->is_success){
|
||||
print "\n";
|
||||
my $zoneName = TadoAPI_GetZoneNameById($hash, $i);
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "Zone $i ($zoneName) Status:\n" . $res->content;
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "ZoneID $i (" . TadoAPI_GetZoneNameById($hash, $i) . ") Status:\n" . $res->content;
|
||||
}else{
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "GetZoneInfo [Authentication Error]". $res->status_line;
|
||||
}
|
||||
|
@ -1004,6 +1082,16 @@ return undef;
|
|||
######################################
|
||||
############ Helpers #################
|
||||
######################################
|
||||
sub TadoAPI_ReplaceUmlaute(@) {
|
||||
my ($string) = @_;
|
||||
my %umlaute = ("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss" );
|
||||
my $umlautkeys = join ("|", keys(%umlaute));
|
||||
|
||||
$string =~ s/($umlautkeys)/$umlaute{$1}/g;
|
||||
return $string;
|
||||
}
|
||||
|
||||
|
||||
sub TadoAPI_GetZoneCount(@) {
|
||||
my ($hash) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
|
@ -1045,7 +1133,9 @@ sub TadoAPI_GetZoneNameById(@) {
|
|||
|
||||
if($Response->is_success){
|
||||
my $ResponseData = decode_json($Response->content);
|
||||
my $zoneName = encode("UTF-8", @$ResponseData[$zoneID - 1]->{'name'});
|
||||
my $zoneName = TadoAPI_ReplaceUmlaute(@$ResponseData[$zoneID - 1]->{'name'});
|
||||
$zoneName = encode("UTF-8", $zoneName);
|
||||
|
||||
return $zoneName;
|
||||
}else{
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "GetZoneNameById: [Authentication Error]". $Response->status_line;
|
||||
|
@ -1053,35 +1143,6 @@ sub TadoAPI_GetZoneNameById(@) {
|
|||
return undef;
|
||||
}
|
||||
|
||||
# todo delete this
|
||||
sub TadoAPI_GetZoneDevicesById(@) {
|
||||
my ($hash, $zoneID) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
my $homeID = $attr{$name}{homeID};
|
||||
my $URL=$QueryURL.qq{/$homeID/zones};
|
||||
|
||||
$header = HTTP::Headers->new("Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}");
|
||||
$UserAgent = LWP::UserAgent::Paranoid->new(ssl_opts => { verify_hostname => 1 },protocols_allowed => ['https','http'],request_timeout => 5,);
|
||||
$UserAgent->default_headers($header);
|
||||
|
||||
$Request = GET($URL);
|
||||
$Response = $UserAgent->request($Request);
|
||||
|
||||
if($Response->is_success){
|
||||
my $devcount = 0;
|
||||
my $ResponseData = decode_json($Response->content);
|
||||
my $zoneDeviceList = @$ResponseData[$zoneID - 1]->{'devices'};
|
||||
|
||||
foreach my $item( @$zoneDeviceList ) {
|
||||
$devcount++;
|
||||
}
|
||||
return ($devcount, $zoneDeviceList);
|
||||
}else{
|
||||
Log3 $name, 3, "TadoAPI $name" . ": " . "GetZoneDevicesById: [Authentication Error]". $Response->status_line;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub TadoAPI_GetZoneTemperatureById(@){
|
||||
my ($hash, $zoneID) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
|
|
Loading…
Reference in New Issue