Neue Watering CLASS
<?php/*
//Ref. http://www.dxsdata.com/2016/07/php-class-for-gardena-smart-system-api/
* Ref. http://www.roboter-forum.com/showthread.php?16777-Gardena-Smart-System-Analyse
* Angepasst 25.08.2016 / WiBo
* gardena_waterung.ips.php
*/
// -----------------------------------------------------------------------------
class gardena_wasser
{
var $user_id, $token, $locations;
var $devices = array();
const LOGINURL = "https://sg-api.dss.husqvarnagroup.net/sg-1/sessions";
const LOCATIONSURL = "https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=";
const DEVICESURL = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=";
const CMDURL = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices/|DEVICEID|/abilities/outlet/command?locationId=";
var $CMD_VENTIL_START_01 = array("name" => "manual_override", "parameters" => array("manual_override" => "open","duration" => 1));
var $CMD_VENTIL_START_02 = array("name" => "manual_override", "parameters" => array("manual_override" => "open","duration" => 2));
var $CMD_VENTIL_START_03 = array("name" => "manual_override", "parameters" => array("manual_override" => "open","duration" => 3));
var $CMD_VENTIL_START_04 = array("name" => "manual_override", "parameters" => array("manual_override" => "open","duration" => 4));
var $CMD_VENTIL_START_05 = array("name" => "manual_override", "parameters" => array("manual_override" => "open","duration" => 5));
var $CMD_VENTIL_START_10 = array("name" => "manual_override", "parameters" => array("manual_override" => "open","duration" => 10));
var $CMD_VENTIL_START_15 = array("name" => "manual_override", "parameters" => array("manual_override" => "open","duration" => 15));
var $CMD_VENTIL_START_20 = array("name" => "manual_override", "parameters" => array("manual_override" => "open","duration" => 20));
var $CMD_VENTIL_START_25 = array("name" => "manual_override", "parameters" => array("manual_override" => "open","duration" => 25));
var $CMD_VENTIL_START_30 = array("name" => "manual_override", "parameters" => array("manual_override" => "open","duration" => 30));
var $CMD_VENTIL_START_ON = array("name" => "manual_override");
var $CMD_VENTIL_START_ZU = array("name" => "manual_override", "parameters" => array("manual_override" => "close","duration" => 0));
// -----------------------------------------------------------------------------
const CATEGORY_WATERING = "watering_computer";
// -----------------------------------------------------------------------------
function gardena_wasser($user, $pw)
{
$data = array(
"sessions" => array(
"email" => "$user", "password" => "$pw")
);
$data_string = json_encode($data);
$ch = curl_init(self::LOGINURL);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type:application/json',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);
$data = json_decode($result);
$this -> token = $data -> sessions -> token;
$this -> user_id = $data -> sessions -> user_id;
$this -> loadLocations();
$this -> loadDevices();
}
// -----------------------------------------------------------------------------
function loadLocations()
{
$url = self::LOCATIONSURL . $this -> user_id;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type:application/json',
'X-Session:' . $this -> token)
);
$this -> locations = json_decode(curl_exec($ch)) -> locations;
}
// -----------------------------------------------------------------------------
function loadDevices()
{
foreach($this->locations as $location)
{
$url = self::DEVICESURL . $location -> id;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type:application/json',
'X-Session:' . $this -> token)
);
$this -> devices[$location -> id] = json_decode(curl_exec($ch)) -> devices;
}
}
// -----------------------------------------------------------------------------
/*
* Finds the first occurrence of a certain category type.
* Example: You want to find your only mower, having one or more gardens.
* @param constant $category
*/
function getFirstDeviceOfCategory($category)
{
foreach($this -> devices as $locationId => $devices)
{
foreach($devices as $device)
if ($device -> category == $category)
return $device;
}
}
// -----------------------------------------------------------------------------
function getDeviceLocation($device)
{
foreach($this -> locations as $location)
foreach($location -> devices as $d)
if ($d == $device -> id)
return $location;
}
// -----------------------------------------------------------------------------
function sendCommand($device, $command)
{
$location = $this -> getDeviceLocation($device);
$url = str_replace("|DEVICEID|", $device -> id, self::CMDURL) . $location -> id;
$data_string = json_encode($command);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type:application/json',
'X-Session:' . $this -> token,
'Content-Length: ' . strlen($data_string)
));
$result = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == "204") //success
return true;
return json_encode($result);
}
// -----------------------------------------------------------------------------
function getMowerState($device)
{
foreach ($device -> abilities as $ability)
if ($ability -> name == self::CATEGORY)
foreach($ability -> properties as $property)
if ($property -> name == self::PROPERTY_STATUS)
return $property -> value;
}
// =============================================================================
function getInfo($device, $category_name, $proberty_name)
{
foreach ($device -> abilities as $ability)
if ($ability -> name == $category_name)
foreach($ability -> properties as $property)
if ($property -> name == $proberty_name)
return $property -> value;
}
// =============================================================================
function getDeviceStatusReportFriendly($device)
{
$result = "";
foreach ($device -> status_report_history as $entry)
{
$result .= $entry -> timestamp . " | " . $entry -> source . " | " . $entry -> message . "<br>";
}
return $result;
}
}
?>
Aktions Script
<?php
error_reporting(E_ALL);
include("pass.ips.php");
include("php_gardena_watering_class.ips.php");
$id_wfc_1 = 28992 /*[Webfront Terminal]*/;
$id_wfc_2 = 50755 /*[Webfront iPad Home]*/;
$text_1 = "Robi Schaltaktion";
$text_2 = "Kann wegen Regen nicht raus";
$icon = "Speaker";
$anzeig = 20;
$id_ereig = 56440 /*[Gardena\Watering\Terasse\Ventilstatus auslesen\]*/;
$min_lese = 1;
$id_regen = 57255 /*[Enozean\Multisensor Wetter\0189162E_Eltako FWS61 - über Gateway Wohnen\Regen]*/;
$st_regen = GetValue($id_regen);
$gardena = new gardena_wasser($pw_user_maeher, $pw_pawo_maeher);
$watering = $gardena -> getFirstDeviceOfCategory($gardena::CATEGORY_WATERING);
if( $_IPS['SENDER'] == 'WebFront' OR $_IPS['SENDER'] == 'Execute' )
{
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$switch = $_IPS['VALUE'];
switch ($switch)
{
case 0:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_ZU);
$text_1 = "Robi Nächster Zeitplan";
break;
// Parken ----------------------------------------------------------
case 1:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_01);
$text_1 = "Robi Nächster Zeitplan";
break;
case 2:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_02);
$text_1 = "Robi Zeitplan pausieren";
break;
case 3:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_03);
$text_1 = "Robi Zeitplan fortsetzen";
break;
case 4:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_04);
$text_1 = "Robi - 12 Std. Mähen";
break;
case 5:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_05);
$text_1 = "Robi - 24 Std. Mähen";
break;
case 6:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_06);
$text_1 = "Robi - 3 Tage Mähen";
break;
case 7:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_07);
$text_1 = "Robi Nächster Zeitplan";
break;
case 8:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_08);
$text_1 = "Robi Zeitplan pausieren";
break;
case 9:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_09);
$text_1 = "Robi Zeitplan fortsetzen";
break;
case 10:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_10);
$text_1 = "Robi - 12 Std. Mähen";
break;
case 11:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_15);
$text_1 = "Robi - 24 Std. Mähen";
break;
case 12:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_20);
$text_1 = "Robi - 3 Tage Mähen";
break;
case 13:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_25);
$text_1 = "Robi - 24 Std. Mähen";
break;
case 14:
$result = $gardena -> sendCommand($watering, $gardena -> CMD_VENTIL_START_30);
$text_1 = "Robi - 3 Tage Mähen";
break;
}
IPS_RunScript(56848 /*[Gardena\Watering\Terasse\Ventilstatus auslesen]*/);
IPS_SetEventCyclic($id_ereig, 0, 0, 0, 2, 2, $min_lese);
IPS_SetEventActive($id_ereig, true);
// WFC_SendNotification($id_wfc_1, $text_1, $result, $icon, $anzeig);
}
?>
Und dann noch Statusabfragen
<?php
error_reporting(E_ALL);
include("pass.ips.php");
include("php_gardena_watering_class.ips.php");
$gardena = new gardena_wasser($pw_user_maeher, $pw_pawo_maeher);
$watering = $gardena -> getFirstDeviceOfCategory($gardena::CATEGORY_WATERING);
// -----------------------------------------------------------------------------
$category_name = "outlet";
$ventil_open = 12951 /*[Gardena\Watering\Terasse\Ventil_Open]*/;
$ventil_manual_override = 42078 /*[Gardena\Watering\Terasse\Ventil_Manual_Override]*/;
$ventil_button_manual_override_time = 28038 /*[Gardena\Watering\Terasse\Ventil_Button_Manual_Override_Time]*/;
$proberty_name = "valve_open";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($ventil_open, $status);
$proberty_name = "manual_override";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($ventil_manual_override, $status);
$proberty_name = "button_manual_override_time";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($ventil_button_manual_override_time, $status);
?>
<?php
error_reporting(E_ALL);
include("pass.ips.php");
include("php_gardena_watering_class.ips.php");
$gardena = new gardena_wasser($pw_user_maeher, $pw_pawo_maeher);
$watering = $gardena -> getFirstDeviceOfCategory($gardena::CATEGORY_WATERING);
// -----------------------------------------------------------------------------
$category_name = "device_info";
$id_device_manufaktur = 19045 /*[Gardena\Watering\Terasse\Device_Manufaktur]*/;
$id_device_product = 51995 /*[Gardena\Watering\Terasse\Device_Product]*/;
$id_device_serial_number = 38519 /*[Gardena\Watering\Terasse\Device_Serial_Nr]*/;
$id_device_version = 25273 /*[Gardena\Watering\Terasse\Device_Version]*/;
$id_device_category = 11017 /*[Gardena\Watering\Terasse\Device_Category]*/;
$id_device_last_time_online = 12467 /*[Gardena\Watering\Terasse\Device_last_Time]*/;
$id_device_sgtin = 43199 /*[Gardena\Watering\Terasse\Device_sgtin]*/;
$proberty_name = "manufacturer";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($id_device_manufaktur, $status);
$proberty_name = "product";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($id_device_product, $status);
$proberty_name = "serial_number";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($id_device_serial_number, $status);
$proberty_name = "version";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($id_device_version, $status);
$proberty_name = "category";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($id_device_category, $status);
$proberty_name = "last_time_online";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($id_device_last_time_online, $status);
$proberty_name = "sgtin";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($id_device_sgtin, $status);
// -----------------------------------------------------------------------------
$category_name = "battery";
$id_device_level = 59685 /*[Gardena\Watering\Terasse\Battery_Level]*/;
$battery_status = 14687 /*[Gardena\Watering\Terasse\Battery_Status]*/;
$proberty_name = "level";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($id_device_level, $status);
$proberty_name = "disposable_battery_status";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
if($status == "out_of_operation") {$status = "Leer";}
if($status == "replace_now") {$status = "Erneuern";}
if($status == "low") {$status = "Bald erneuern";}
if($status == "ok") {$status = "OK";}
if($status == "undefined") {$status = "Fehler";}
SetValue($battery_status, $status);
// -----------------------------------------------------------------------------
$category_name = "radio";
$id_device_quality = 10451 /*[Gardena\Watering\Terasse\Radio_Quality]*/;
$connection_status = 43449 /*[Gardena\Watering\Terasse\Radio_Connection_Status]*/;
$signal_status = 31159 /*[Gardena\Watering\Terasse\Radio_Status]*/;
$proberty_name = "quality";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($id_device_quality, $status);
$proberty_name = "connection_status";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($connection_status, $status);
$proberty_name = "state";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($signal_status, $status);
// -----------------------------------------------------------------------------
$category_name = "ambient_temperature";
$temperature = 20880 /*[Gardena\Watering\Terasse\Sensor_Temperatur]*/;
$frost_warning = 26179 /*[Gardena\Watering\Terasse\Sensor_Fostwarnung]*/;
$proberty_name = "temperature";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
SetValue($temperature, $status);
$proberty_name = "frost_warning";
$status = $gardena -> getInfo($watering, $category_name, $proberty_name);
if($status == "no_frost") {$status = "Nein";}
if($status == "frost") {$status = "Ja";}
if($status == "undefined") {$status = "Fehler";}
SetValue($frost_warning, $status);
?>