Das Script in den Ordner HCL-ZWave legen , parametrieren und 1xhändisch ausführen.
Bei manuellen Aufruf des Skriptes wird die Datenstruktur in Symcon automatisch angelegt und ein Scripttimer für die zyklische Abfrage aktiviert. Bei Erweiterungen bzw. Veränderungen auf der Seite HCL einfach die entsprechende Konfiguration erneuern und nochmals von Hand auslösen.
Alle Statusdaten werden nur geschrieben, wenn deren Zustand sich ändert.
Alle Funktionen sind im Script dokumentiert.
Übersicht:
//Konfiguration
$ip = "xxx.xxx.xxx.xxx"; // IP HCL
$user_pw = "c3ltY29uOnN5bWNvbg=="; // Zugangsdaten HCL user:pw base64
$json = "";
$ScriptName = "HCL-Status lesen";
$TimerInterval = 1; //Abfrageintervall-Aktualisierung - Angabe in Sekunden
Datenstruktur
In meine Script werden die einzelnen Z-Wave Geräte funktionell in 4 Gruppen abgelegt.
// Anlegen Menüstrucktur
$CatID_Handsender = CreateCategoryByName($parentID,"Handsender",100);
$CatID_Schalter = CreateCategoryByName($parentID,"Schalter",200);
$CatID_Sensoren = CreateCategoryByName($parentID,"Sensoren",300);
$CatID_Steckdosen = CreateCategoryByName($parentID,"Steckdosen",400);
Aufbereitung der Daten:
Die einzelnen Z-Wave Gerät müssen entsprechend ihrer Datenstruktur ein bis mehrfach aufgerufen werden. Entscheiden ist hier die Fibaro . Die Abarbeitung erfolgt in einer forech Schleife
// Aufbereitung der Daten
foreach ($json as $i) {
switch ($i->id) {
//Bsp. Fibaro Double Switch
case '91':
hcl_switch($CatID_Schalter,"Schalter 1.1 Wohnzimmer Licht",1,$i);
break;
91 - HCL ID
hcl_switch(<Menü Ordner> , , , $i)
Script HCL-Status lesen
<?
/* HCL Status lesen via Rest-API TE 19.01.2020 Version 1.1
Script ruft in eingestellten Timerintervall Stus alle Geräte vom HCL ab
Script in den Ordner HCL-Zwave legen , parametroeren und und einmal händisch ausführen.
Bei Änderunge oder Erweiterung Script nochmals händisch ausführen
Script erstellt Strucktur selbsständig
versionshistorie:
Version 1 - TE 19.01.2020 HCL Status lesen via Rest-API
--> Sensor - Fibaro Motion Sensor FGMS-001, Schalter - Fibaro Double Switch FGS-213/223, Steckdose mit Energiemessung - Fibaro Wall Plug FGWPE/F-102 ,AEOTEC SmartSwitch A 647729
Version 1.1- TE 15.02.2020 HCL Status lesen via Rest-API
--> Taster- Fibaro FGBP-101-8 , Wassersensor -CyrusSmarthome Flood Sensor A691411
*/
//Konfiguration
$ip = "xxx.xxx.xxx.xxx"; // IP HCL
$user_pw = "c3ltY29uOnN5bWNvbg=="; // Zugangsdaten HCL user:pw base64
$json = "";
$ScriptName = "HCL-Status lesen";
$TimerInterval = 1; //Abfrageintervall-Aktualisierung - Angabe in Sekunden
//-----------------------------------------------------------------------------------------------------
// übergeordnete Instanz identifizieren
$parentID = IPS_GetParent($_IPS['SELF']);
//Installer
if ($IPS_SENDER == "Execute")
{
//Script umbennen und Timer setzen
IPS_SetHidden($IPS_SELF, true);
IPS_SetName($IPS_SELF, $ScriptName);
IPS_SetScriptTimer($IPS_SELF,$TimerInterval); //Scripttimer auf gewünschen Intervall setzen
// Variablenprofile anlegen
if (!IPS_VariableProfileExists('HCL_Button'))
{
IPS_CreateVariableProfile('HCL_Button',1);
IPS_SetVariableProfileAssociation('HCL_Button', 0, 'Taster nicht betätigt', '' , 0xFFFFFF);
IPS_SetVariableProfileAssociation('HCL_Button', 1, 'Taster 1x betätigt', '' , 0x32cd32);
IPS_SetVariableProfileAssociation('HCL_Button', 2, 'Taster 2x betätigt', '' , 0x32cd32);
IPS_SetVariableProfileAssociation('HCL_Button', 3, 'Taster 3x betätigt', '' , 0x32cd32);
IPS_SetVariableProfileAssociation('HCL_Button', 4, 'Taster 4x betätigt', '' , 0x32cd32);
IPS_SetVariableProfileAssociation('HCL_Button', 5, 'Taster 5x betätigt', '' , 0x32cd32);
IPS_SetVariableProfileAssociation('HCL_Button', 6, 'Taster gedrückt gehalten', '' , 0x32cd32);
echo "Profil HCL_Button erzeugt:".PHP_EOL;
}
if (!IPS_VariableProfileExists('HCL_Battery'))
{
IPS_CreateVariableProfile('HCL_Battery',0);
IPS_SetVariableProfileAssociation('HCL_Battery', 0, 'Batterie OK', '' , 0x00FF00);
IPS_SetVariableProfileAssociation('HCL_Battery', 1, 'Batterie leer', '' , 0xFF0000);
IPS_SetVariableProfileIcon('HCL_Battery','Battery');
echo "Profil HCL_Battery erzeugt:".PHP_EOL;
}
if (!IPS_VariableProfileExists('HCL_Floodsensor'))
{
IPS_CreateVariableProfile('HCL_Floodsensor',0);
IPS_SetVariableProfileAssociation('HCL_Floodsensor', 0, 'OK', '' , 0x00FF00);
IPS_SetVariableProfileAssociation('HCL_Floodsensor', 1, 'Wasserschaden', '' , 0xFF0000);
IPS_SetVariableProfileIcon('HCL_Floodsensor','Fog');
echo "Profil HCL_Floodsensor erzeugt:".PHP_EOL;
}
}
// Anlegen Menüstrucktur
$CatID_Handsender = CreateCategoryByName($parentID,"Handsender",100);
$CatID_Schalter = CreateCategoryByName($parentID,"Schalter",200);
$CatID_Sensoren = CreateCategoryByName($parentID,"Sensoren",300);
$CatID_Steckdosen = CreateCategoryByName($parentID,"Steckdosen",400);
// Variablen anlegen
$errorID = CreateVariableByName($parentID, "Error Counter HCL", 1,"",2);
// Funktion HCL Devices lesen
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "http://".$ip."/api/devices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTP_VERSION => "HTTP/1.1",
CURLOPT_HTTPHEADER => array("authorization: Basic ".$user_pw),
));
$response = curl_exec($curl);
$json = json_decode($response); //Dekodierung nach Json
curl_close($curl);
// Kommunikationsstörung zum HCL
if ($json == "")
{
SetValue ($errorID, (GetValue($errorID)+1));
IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Kommunikationsstörung HCL - Missing Datenpackage");
IPS_SetScriptTimer($IPS_SELF,0); //Scripttimer pausieren
Sleep (10);
IPS_SetScriptTimer($IPS_SELF,$TimerInterval); //Scripttimer auf gewünschen Intervall setzen
exit;
}
// Aufbereitung der Daten
foreach ($json as $i) {
switch ($i->id) {
//Bsp. Fibaro Button
case '104':
hcl_button($CatID_Handsender,"Taster orange",1,$i);
break;
//Bsp. Fibaro Double Switch
case '91':
hcl_switch($CatID_Schalter,"Schalter 1.1 Wohnzimmer Licht",1,$i);
break;
case '92':
hcl_switch($CatID_Schalter,"Schalter 1.2 WZ-Vitrine Licht",2,$i);
break;
//Bsp. Fibaro Motion Sensor
case '117':
hcl_motion($CatID_Sensoren,"Auge 1",1,$i);
break;
case '118':
hcl_temperature($CatID_Sensoren,"Auge 1",1,$i);
break;
case '119':
hcl_lumintensity($CatID_Sensoren,"Auge 1",1,$i);
break;
//Bsp. Cyrus Wassersensor
case '134':
hcl_flood($CatID_Sensoren,"Wassersensor 1",51,$i);
break;
//Bsp. Fibaro Steckdose mit Energiemessung
case '96':
hcl_switch($CatID_Steckdosen,"Stecker 1",1,$i);
break;
default:
break;
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*Taster- Fibaro FGBP-101-8 */
function hcl_button($parent,$name,$pos,$index)
{
global $json;
$InsID = CreateInstanzByName($parent,$name,"{485D0419-BE97-4548-AA9C-C083EB82E61E}",$pos);
//Wert id
$id0 = CreateVariableByName($InsID, "ID-HCL", 1,"",5);
$state0 = $index->id;
if (GetValue($id0)<> $state0) {SetValue ($id0,$state0);}
//Wert Status
$id1 = CreateVariableByName($InsID, "Status", 0,"HCL_Button",10);
/*Wert wird direkt über HCL beschrieben (Virtuelles Modul + Graph.Szene)*/
//Wert Batterielevel %
$id2 = CreateVariableByName($InsID, "Batterielevel", 1,"~Intensity.100",11);
$state2 = $index->properties->batteryLevel;
if (GetValue($id2)<> $state2) {SetValue ($id2,$state2);}
//Wert Batterielevel
$id3 = CreateVariableByName($InsID, "Batterie", 0,"HCL_Battery",12);
$state3 = $index->properties->batteryLowNotification;
if($state3 == "false") {$state3 = 1;} else {$state3=0;}
if (GetValue($id3) <> $state3) {SetValue ($id3, $state3);}
};
/*Wassersensor -CyrusSmarthome Flood Sensor A691411 */
function hcl_flood($parent,$name,$pos,$index)
{
global $json;
$InsID = CreateInstanzByName($parent,$name,"{485D0419-BE97-4548-AA9C-C083EB82E61E}",$pos);
//Wert id
$id0 = CreateVariableByName($InsID, "ID-HCL", 1,"",5);
$state0 = $index->id;
if (GetValue($id0)<> $state0) {SetValue ($id0,$state0);}
//Wert Status
$id1 = CreateVariableByName($InsID, "Status", 0,"HCL_Floodsensor",10);
$state1 = $index->properties->value;
if($state1 == "false") {$state1 = 0;} else {$state1=1;}
if (GetValue($id1) <> $state1) {SetValue ($id1, $state1);}
//Wert Batterielevel %
$id2 = CreateVariableByName($InsID, "Batterielevel", 1,"~Intensity.100",11);
$state2 = $index->properties->batteryLevel;
if (GetValue($id2)<> $state2) {SetValue ($id2,$state2);}
//Wert Batterielevel
$id3 = CreateVariableByName($InsID, "Batterie", 0,"HCL_Battery",12);
$state3 = $index->properties->batteryLowNotification;
if($state3 == "false") {$state3 = 1;} else {$state3=0;}
if (GetValue($id3) <> $state3) {SetValue ($id3, $state3);}
};
/*Bewegungssensor - Fibaro Motion Sensor FGMS-001 */
function hcl_motion($parent,$name,$pos,$index)
{
global $json;
$InsID = CreateInstanzByName($parent,$name,"{485D0419-BE97-4548-AA9C-C083EB82E61E}",$pos);
//Wert id
$id0 = CreateVariableByName($InsID, "ID-HCL", 1,"",5);
$state0 = $index->id;
if (GetValue($id0)<> $state0) {SetValue ($id0,$state0);}
//Wert Status
$id1 = CreateVariableByName($InsID, "Status", 0,"~Switch",10);
$state1 = $index->properties->value;
if($state1 == "false") {$state1 = 0;} else {$state1=1;}
if (GetValue($id1) <> $state1) {SetValue ($id1, $state1);}
//Wert Batterielevel %
$id2 = CreateVariableByName($InsID, "Batterielevel", 1,"~Intensity.100",11);
$state2 = $index->properties->batteryLevel;
if (GetValue($id2)<> $state2) {SetValue ($id2,$state2);}
//Wert Batterielevel
$id3 = CreateVariableByName($InsID, "Batterie", 0,"HCL_Battery",12);
$state3 = $index->properties->batteryLowNotification;
if($state3 == "false") {$state3 = 1;} else {$state3=0;}
if (GetValue($id3) <> $state3) {SetValue ($id3, $state3);}
};
/*Temperatursensor - Fibaro Motion Sensor FGMS-001 */
function hcl_temperature($parent,$name,$pos,$index)
{
global $json;
$InsID = CreateInstanzByName($parent,$name,"{485D0419-BE97-4548-AA9C-C083EB82E61E}",$pos);
//Wert Temperatur
$id1 = CreateVariableByName($InsID, "Temperatur", 2,"~Temperature",12);
$state1 = $index->properties->value;
if (GetValue($id1) <> $state1) {SetValue ($id1, $state1);}
};
/*Lichtstärkesensor - Fibaro Motion Sensor FGMS-001 */
function hcl_lumintensity($parent,$name,$pos,$index)
{
global $json;
$InsID = CreateInstanzByName($parent,$name,"{485D0419-BE97-4548-AA9C-C083EB82E61E}",$pos);
//Wert Temperatur
$id1 = CreateVariableByName($InsID, "Beleuchtungsstärke", 2,"~Illumination.F",13);
$state1 = $index->properties->value;
if (GetValue($id1) <> $state1) {SetValue ($id1, $state1);}
};
/*Schalter - Fibaro Double Switch FGS-213/223 */
/*Steckdose mit Energiemessung - Fibaro ,AEOTEC SmartSwitch A 647729 */
function hcl_switch($parent,$name,$pos,$index)
{
global $json;
$InsID = CreateInstanzByName($parent,$name,"{485D0419-BE97-4548-AA9C-C083EB82E61E}",$pos);
//Wert id
$id0 = CreateVariableByName($InsID, "ID-HCL", 1,"",5);
$state0 = $index->id;
if (GetValue($id0)<> $state0) {SetValue ($id0,$state0);}
//Wert Status
$id1 = CreateVariableByName($InsID, "Status", 0,"~Switch",10);
$state1 = $index->properties->value;
if($state1 == "false") {$state1 = 0;} else {$state1=1;}
if (GetValue($id1) <> $state1) {SetValue ($id1, $state1);}
//Wert Verbrauch
$id2 = CreateVariableByName($InsID, "Verbrauch", 2,"~Electricity",11);
$state2 = $index->properties->energy;
if (GetValue($id2)<> $state2) {SetValue ($id2,$state2);}
//Wert Leistung
$id3 = CreateVariableByName($InsID, "Leistung", 2,"~Watt.3680",12);
$state3 = $index->properties->power;
if (GetValue($id3) <> $state3) {SetValue ($id3,$state3);}
};
function CreateEventIDByName($id, $name, $type)
{
$eid = @IPS_GetEventIDByName($name, $id);
if($eid===false) {
$eid = IPS_CreateEvent($type);
IPS_SetParent($eid, $id);
IPS_SetName($eid, $name);
}
return $eid;
}
function CreateLinkByName($id, $name, $link, $pos)
{
global $IPS_SELF;
$vid = @IPS_GetLinkIDByName($name, $id);
if($vid === false)
{
$vid = IPS_CreateLink();
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetInfo($vid, "");
IPS_SetPosition($vid,$pos);
IPS_SetLinkTargetID($vid, $link); // Link verknüpfen
}
return $vid;
}
function CreateCategoryByName($id, $name, $pos)
{
global $IPS_SELF;
$vid = @IPS_GetCategoryIDByName($name, $id);
if($vid === false)
{
$vid = IPS_CreateCategory();
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetInfo($vid, "");
IPS_SetPosition($vid,$pos);
}
return $vid;
}
function CreateInstanzByName($id, $name, $type, $pos)
{
global $IPS_SELF;
$vid = @IPS_GetInstanceIDByName($name, $id);
if($vid === false)
{
$vid = IPS_CreateInstance($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetInfo($vid, "");
IPS_SetPosition($vid,$pos);
}
return $vid;
}
function CreateVariableByName($id, $name, $type, $profile = "", $pos)
{
global $IPS_SELF;
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid === false)
{
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetInfo($vid, "");
if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
IPS_SetPosition($vid,$pos);
}
return $vid;
}
function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
{
global $IPS_SELF,$ScriptID;
$ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
if ($ScriptID == 0){
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $ScriptNAME);
IPS_SetParent($ScriptID, $ParentID);
IPS_SetInfo($ScriptID, "");
$ScriptPath = $ScriptID.".ips.php"; //Skriptdatei
IPS_SetScriptFile($ScriptID, $ScriptPath);
IPS_SetHidden($ScriptID, true);
IPS_SetScriptContent($ScriptID, $ScriptTEXT);
}
return $ScriptID;
}
//Funktion extract_unit
function extract_unit($string, $start, $end)
{
$pos = stripos($string, $start);
$str = substr($string, $pos);
$str_two = substr($str, strlen($start));
$second_pos = stripos($str_two, $end);
$str_three = substr($str_two, 0, $second_pos);
$unit = trim($str_three);
return $unit;
}