all zoneIDs dynamic, reduced code

This commit is contained in:
Philipp Wo 2019-11-22 21:57:40 +01:00
parent a90835fae2
commit 7d4444ce58
1 changed files with 164 additions and 232 deletions

View File

@ -280,7 +280,7 @@ sub TadoAPI_Get(@) {
$cmd eq "getZoneDevices" and do {
Log3 $name, 3, "TadoAPI $name" . ": " . "processing ($cmd)";
my @devArr = TadoAPI_RequestTadoDevices($hash);
my @devArr = TadoAPI_GetTadoDevices($hash);
my $devicecount = 0;
$message = "Tado-Device(s):\n";
for (my $i=0; $i < @devArr; $i++){
@ -304,9 +304,9 @@ sub TadoAPI_Get(@) {
TadoAPI_GetZoneInfo($hash);
my $zonecount = TadoAPI_GetZoneCount($hash);
$message = "You have $zonecount Zones in Home " . $attr{$name}{homeID} . ".\n";
my @zoneArr = TadoAPI_RequestTadoDevices($hash);
for (my $i=0; $i < @zoneArr; $i++){
my $zoneid = $zoneArr[$i]->{'id'};
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";
}
$message .= "See Logfile for more Info";
@ -608,10 +608,10 @@ sub TadoAPI_SetAllOverlays(@){
my $method = "";
my $myjson ="";
my @zoneArr = TadoAPI_RequestTadoDevices($hash);
my @devArr = TadoAPI_GetTadoDevices($hash);
for (my $i=0; $i < @zoneArr; $i++) {
my $zoneid = $zoneArr[$i]->{'id'};
for (my $i=0; $i < @devArr; $i++) {
my $zoneid = $devArr[$i]->{'id'};
TadoAPI_SetZoneOverlayById($hash, $zoneid, $setting);
}
}
@ -654,46 +654,6 @@ sub TadoAPI_UpdateFn(@){
}
}
sub TadoAPI_GetGeoById(@){
my ($hash, $mobileID) = @_;
my $name = $hash->{NAME};
my $homeID = $attr{$name}{homeID};
my $URL=$QueryURL.qq{/$homeID/mobileDevices/$mobileID/settings};
my $TokenData = TadoAPI_LoadToken($hash);
if(defined($TokenData)){
my $param = {
url => $URL,
header => {"Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}"},
method => 'GET',
timeout => 4,
hash => $hash,
};
#Log3 $name, 5, 'Blocking GET: ' . Dumper($param);
my ($err, $data) = HttpUtils_BlockingGet($param);
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "TadoAPI_GetGeoById: Error while requesting ".$param->{url}." - $err";
}
elsif($data ne "")
{
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval { decode_json($data) };
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "TadoAPI_GetGeoById: decode_json failed, invalid json. error:$@\n";
}else{
my $setting = $decoded_data->{'geoTrackingEnabled'};
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "Geolocation_" . $mobileID, $setting);
readingsEndUpdate( $hash, 1 );
return $setting;
}
}
}
return undef;
}
########################################################################################################################################################################
# Callback Subs
########################################################################################################################################################################
@ -914,7 +874,7 @@ sub TadoAPI_GetZoneInfo(@) {
url => $URL,
header => { "Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}" },
method => 'GET',
timeout => 4,
timeout => 8,
infotext => "HomeInfos",
hash => $hash,
callback => \&TadoAPI_LogInfoCallback
@ -923,7 +883,7 @@ sub TadoAPI_GetZoneInfo(@) {
HttpUtils_NonblockingGet($request);
# TadoDevicesInfo
$URL = $QueryURL.qq{/$homeID/zones};
$URL = $QueryURL . qq{/$homeID/zones};
$request = {
url => $URL,
header => { "Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}" },
@ -954,7 +914,7 @@ sub TadoAPI_GetZoneInfo(@) {
my @mobDev = TadoAPI_GetMobileDevices($hash);
for (my $i=0; $i < @mobDev; $i++) {
my $mobileID = $mobDev[$i]->{'id'};
$URL=$QueryURL.qq{/$homeID/mobileDevices/$mobileID/settings};
$URL=$QueryURL . qq{/$homeID/mobileDevices/$mobileID/settings};
$request = {
url => $URL,
header => { "Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}" },
@ -969,10 +929,10 @@ sub TadoAPI_GetZoneInfo(@) {
}
# zones
my @zoneArr = TadoAPI_RequestTadoDevices($hash);
for (my $i=0; $i < @zoneArr; $i++) {
my $zoneid = $zoneArr[$i]->{'id'};
my $URL=$QueryURL.qq{/$homeID/zones/$zoneid/state};
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 $request = {
url => $URL,
@ -994,7 +954,7 @@ sub TadoAPI_SetGeoById(@){
my ($hash, $mobileID, $geo) = @_;
my $name = $hash->{NAME};
my $homeID = $attr{$name}{homeID};
my $URL=$QueryURL.qq{/$homeID/mobileDevices/$mobileID/settings};
my $URL=$QueryURL . qq{/$homeID/mobileDevices/$mobileID/settings};
my $TokenData = TadoAPI_LoadToken($hash);
if(defined($TokenData)){
@ -1024,140 +984,9 @@ sub TadoAPI_SetGeoById(@){
#######################################################################################################
# API Requests
###############
sub TadoAPI_RequestTadoDevices(@) {
# returns array with zonenames and zone devices
my ($hash) = @_;
my $name = $hash->{NAME};
my $homeID = $attr{$name}{homeID};
my $URL=$QueryURL.qq{/$homeID/zones};
my $TokenData = TadoAPI_LoadToken($hash);
if(defined($TokenData)){
my $param = {
url => $URL,
header => {"Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}"},
method => 'GET',
timeout => 5,
hash => $hash
};
#Log3 $name, 5, 'Blocking GET: ' . Dumper($param);
my ($err, $data) = HttpUtils_BlockingGet($param);
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "RequestTadoDevices: Error while requesting ".$param->{url}." - $err";
}
elsif($data ne "")
{
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval { decode_json($data) };
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "RequestTadoDevices: decode_json failed, invalid json. error:$@\n";
}else{
if(ref($decoded_data) eq 'ARRAY'){
my @devices = ();
foreach my $dev (@$decoded_data){
push @devices, $dev;
}
return @devices;
}
}
}
}
return undef;
}
# sub TadoAPI_ZoneStateRequest(@) {
# # returns array with state of all zones
# my ($hash) = @_;
# my $name = $hash->{NAME};
# my $homeID = $attr{$name}{homeID};
# my @zones = ();
# my $TokenData = TadoAPI_LoadToken($hash);
# if(defined($TokenData))
# {
# for (my $i=1; $i <= TadoAPI_GetZoneCount($hash); $i++) {
# my $URL=$QueryURL.qq{/$homeID/zones/$i/state};
# my $param = {
# url => $URL,
# header => {"Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}"},
# method => 'GET',
# timeout => 5,
# hash => $hash,
# zoneID => $i
# };
# #Log3 $name, 5, 'Blocking GET: ' . Dumper($param);
# my ($err, $data) = HttpUtils_BlockingGet($param);
# if($err ne "")
# {
# Log3 $name, 3, "TadoAPI $name" . ": " . "ZoneRequest: Error while requesting ".$param->{url}." - $err";
# }
# elsif($data ne "")
# {
# Log3 $name, 5, "url ".$param->{url}." returned: $data";
# my $decoded_data = eval { decode_json($data) };
# if ($@){
# Log3 $name, 3, "TadoAPI $name" . ": " . "RequestZones: Zone $i decode_json failed, invalid json. error:$@\n";
# }else{
# # pushes zone i to array
# push @zones, $decoded_data;
# }
# }
# }
# return @zones;
# }
# }
sub TadoAPI_GetMobileDevices(@) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $homeID = $attr{$name}{homeID};
my $URL=$QueryURL . qq{/$homeID/mobileDevices};
my $TokenData = TadoAPI_LoadToken($hash);
if(defined($TokenData)){
my $param = {
url => $URL,
header => {"Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}"},
method => 'GET',
timeout => 2,
hash => $hash
};
#Log3 $name, 5, 'Blocking GET: ' . Dumper($param);
my ($err, $data) = HttpUtils_BlockingGet($param);
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "GetMobileDevices: Error while requesting ".$param->{url}." - $err";
}
elsif($data ne "")
{
my @devices = ();
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval { decode_json($data) };
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "GetMobileDevices: decode_json failed, invalid json. error:$@\n";
}else{
if(ref($decoded_data) eq 'ARRAY'){
foreach my $item( @$decoded_data ) {
push @devices, $item;
}
return @devices;
}elsif(ref($decoded_data) eq 'HASH'){
Log3 $name, 3, "TadoAPI $name" . ": " . "GetMobileDevices: " . $decoded_data->{'errors'}->[0]->{'code'} if (exists($decoded_data->{'errors'}));
}
}
}
}
return undef;
}
######################################
############ Helpers #################
@ -1210,6 +1039,93 @@ sub TadoAPI_GetHomeId(@){
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 $TokenData = TadoAPI_LoadToken($hash);
if(defined($TokenData)){
my $param = {
url => $URL,
header => {"Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}"},
method => 'GET',
timeout => 4,
hash => $hash,
};
#Log3 $name, 5, 'Blocking GET: ' . Dumper($param);
my ($err, $data) = HttpUtils_BlockingGet($param);
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "TadoAPI_GetGeoById: Error while requesting ".$param->{url}." - $err";
}
elsif($data ne "")
{
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval { decode_json($data) };
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "TadoAPI_GetGeoById: decode_json failed, invalid json. error:$@\n";
}else{
my $setting = $decoded_data->{'geoTrackingEnabled'};
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "Geolocation_" . $mobileID, $setting);
readingsEndUpdate( $hash, 1 );
return $setting;
}
}
}
return undef;
}
sub TadoAPI_GetMobileDevices(@) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $homeID = $attr{$name}{homeID};
my $URL=$QueryURL . qq{/$homeID/mobileDevices};
my $TokenData = TadoAPI_LoadToken($hash);
if(defined($TokenData)){
my $param = {
url => $URL,
header => {"Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}"},
method => 'GET',
timeout => 2,
hash => $hash
};
#Log3 $name, 5, 'Blocking GET: ' . Dumper($param);
my ($err, $data) = HttpUtils_BlockingGet($param);
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "GetMobileDevices: Error while requesting ".$param->{url}." - $err";
}
elsif($data ne "")
{
my @devices = ();
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval { decode_json($data) };
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "GetMobileDevices: decode_json failed, invalid json. error:$@\n";
}else{
if(ref($decoded_data) eq 'ARRAY'){
foreach my $item( @$decoded_data ) {
push @devices, $item;
}
# default case
return @devices;
}elsif(ref($decoded_data) eq 'HASH'){
Log3 $name, 3, "TadoAPI $name" . ": " . "GetMobileDevices: " . $decoded_data->{'errors'}->[0]->{'code'} if (exists($decoded_data->{'errors'}));
}
}
}
}
return undef;
}
sub TadoAPI_GetZoneCount(@) {
my ($hash) = @_;
my $name = $hash->{NAME};
@ -1260,43 +1176,13 @@ sub TadoAPI_GetZoneCount(@) {
sub TadoAPI_GetZoneNameById(@) {
my ($hash, $zoneID) = @_;
my $name = $hash->{NAME};
my $homeID = $attr{$name}{homeID};
my $URL=$QueryURL.qq{/$homeID/zones};
my $TokenData = TadoAPI_LoadToken($hash);
my @devArr = TadoAPI_GetTadoDevices($hash);
my $zoneName = undef;
if(defined($TokenData)){
my $param = {
url => $URL,
header => {"Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}"},
method => 'GET',
timeout => 2,
hash => $hash
};
#Log3 $name, 5, 'Blocking GET: ' . Dumper($param);
my ($err, $data) = HttpUtils_BlockingGet($param);
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "GetZoneCount: Error while requesting ".$param->{url}." - $err";
}
elsif($data ne "")
{
my @devices = ();
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval { decode_json($data) };
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "GetZoneCount: decode_json failed, invalid json. error:$@\n";
}else{
if(ref($decoded_data) eq 'ARRAY'){
my $zoneName = TadoAPI_ReplaceUmlaute(@$decoded_data[$zoneID - 1]->{'name'});
$zoneName = encode("UTF-8", $zoneName);
return $zoneName;
}elsif(ref($decoded_data) eq 'HASH'){
Log3 $name, 3, "TadoAPI $name" . ": " . "GetZoneCount: " . $decoded_data->{'errors'}->[0]->{'code'} if (exists($decoded_data->{'errors'}));
}
}
foreach my $zone ( @devArr ){
if ($zone->{'id'} == $zoneID){
$zoneName = TadoAPI_ReplaceUmlaute($zone->{'name'});
return $zoneName;
}
}
return undef;
@ -1319,7 +1205,7 @@ sub TadoAPI_GetZoneReadingsById(@){
url => $URL,
header => {"Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}"},
method => 'GET',
timeout => 3,
timeout => 5,
hash => $hash
};
@ -1345,15 +1231,16 @@ sub TadoAPI_GetZoneReadingsById(@){
if (!defined $overlay) {$overlay = "no overlay"};
my $zoneName = TadoAPI_GetZoneNameById($hash, $zoneID);
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 );
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 );
}
return ($temperature, $humidity, $desiredTemp, $currentHeatingPower, $overlay );
}
}
@ -1361,6 +1248,51 @@ sub TadoAPI_GetZoneReadingsById(@){
return undef;
}
sub TadoAPI_GetTadoDevices(@) {
# returns array with zonenames and zone devices
my ($hash) = @_;
my $name = $hash->{NAME};
my $homeID = $attr{$name}{homeID};
my $URL=$QueryURL . qq{/$homeID/zones};
my $TokenData = TadoAPI_LoadToken($hash);
if(defined($TokenData)){
my $param = {
url => $URL,
header => {"Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}"},
method => 'GET',
timeout => 5,
hash => $hash
};
#Log3 $name, 5, 'Blocking GET: ' . Dumper($param);
my ($err, $data) = HttpUtils_BlockingGet($param);
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "RequestTadoDevices: Error while requesting ".$param->{url}." - $err";
}
elsif($data ne "")
{
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval { decode_json($data) };
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "RequestTadoDevices: decode_json failed, invalid json. error:$@\n";
}else{
if(ref($decoded_data) eq 'ARRAY'){
my @devices = ();
foreach my $dev (@$decoded_data){
push @devices, $dev;
}
return @devices;
}
}
}
}
return undef;
}
######################################################
# storePW & readPW Code geklaut aus 96_SIP.pm :)
######################################################