Hallo zusammen,
möchte an dieser Stelle vielleicht schnell einen Input geben, wie ich über Symcon mit DS kommuniziere. Ob es der beste Weg ist, naja, ich denke mal nicht, aber viele Wege führen nach Rom.
Ich habe ein „Function“ File geschrieben (Danke auch an Kollegen, welcher mir geholfen hat!)
<?php
//Devices
$dsserver = new dsserver('IP DS Server', 'Port', 'Auth');
define ("DS_ROOM_CHEF", 7);
define ("DS_SCENE_ROOM_OFF", 0);
define ("DS_SCENE_ROOM_SCENE2", 17);
define ("DS_GROUP_GRAY", 'gray');
class dsserver {
private $host = null;
private $port = null;
private $curl_handle = null;
private $token = null;
private $sessionToken = null;
public function __construct($host, $port, $token) {
$this->host = $host;
$this->port = $port;
$this->token = $token;
$this->curl_handle=curl_init();
curl_setopt($this->curl_handle, CURLOPT_CONNECTTIMEOUT,5);
curl_setopt($this->curl_handle, CURLOPT_RETURNTRANSFER,true);
curl_setopt($this->curl_handle, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($this->curl_handle, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($this->curl_handle, CURLOPT_FAILONERROR, true);
$this->authenticate();
}
// clean up the mess
public function __destruct() {
curl_close($this->curl_handle);
}
public function callScene($scene, $room, $groupname) {
$url = 'https://'.$this->host.':'.$this->port.'/json/zone/callScene?id='.$room.'&sceneNumber='.$scene.'&groupName='.$groupname;
$this->invokeDsCall($url);
}
public function getstate($dsid) {
$url = 'https://'.$this->host.':'.$this->port.'/json/device/getState?dsid='.$dsid;
//return $this->invokeDsCall($url);
$result=$this->invokeDsCall($url);
return $result->result->isOn;
}
public function turnOn($dsid) {
$url = 'https://'.$this->host.':'.$this->port.'/json/device/turnOn?dsid='.$dsid;
//return $this->invokeDsCall($url);
$result=$this->invokeDsCall($url);
return $result->ok;
}
public function turnOff($dsid) {
$url = 'https://'.$this->host.':'.$this->port.'/json/device/turnOff?dsid='.$dsid;
//return $this->invokeDsCall($url);
$result=$this->invokeDsCall($url);
return $result->ok;
}
public function Apartment($call) {
$url = 'https://'.$this->host.':'.$this->port.'/json/apartment/'.$call;
//return $this->invokeDsCall($url);
return $this->invokeDsCall($url);
//return $result->result->consumption;
}
public function CircuitPowerConsumption($id) {
$url = 'https://'.$this->host.':'.$this->port.'/json/circuit/getConsumption?id='.$id;
$result=$this->invokeDsCall($url);
return $result->result->consumption;
//return $this->invokeDsCall($url);
//return $this->invokeDsCall($url);
//return $result->result->consumption;
}
//https://192.168.0.30/json/circuit/getConsumption?id=3504175fe000001000001913
/**
* Authentifizierung mit ds server, holt sessiontoken
*/
private function authenticate() {
$this->sessionToken = null;
$url = 'https://'.$this->host.':'.$this->port.'/json/system/loginApplication?loginToken='.urlencode($this->token);
$result = $this->invokeDsCall($url);
$this->sessionToken = $result->result->token;
}
/*
* ruft eine Remote-Funktion mittels json interface beim DS Server auf
* dekodiert das Ergebnis und gibt es als Objekt zurück
*/
private function invokeDsCall($url) {
// wenn es ein session Token gibt, verwende es; gibt es nicht beim 1. Aufruf (Funktion authenticate())
if (isset($this->sessionToken) && $this->sessionToken != null) {
$url = $url.'&token='.$this->sessionToken;
}
curl_setopt($this->curl_handle, CURLOPT_URL,$url);
$fileContent = curl_exec($this->curl_handle);
$error = curl_error($this->curl_handle);
if ($error != null) echo "ERROR: $error, url: $url
";
return json_decode($fileContent, false);
}
}
Mit diesem File kann ich einschalten/ausschalten, Stimmungen aufrufen, Strom auslesen usw.
Im Symcon habe ich ein Dummy Modul erstellt mit den Variablen dsid und eStatus (für Effektiv Status)
Wenn wir uns nun z.B. einschalten ansehen, dann schalte ich nicht das Licht direkt ein, sondern rufe via DS Server eine Stimmung auf.
Über getState Frage ich aber nach, ob es wirklich eingeschalten ist und update den eStatus für die Visualisierung im Dashboard.
<?php
$dsid = GetValueString(43396 /*[Räume\OG Essen\OG Essen Tisch\dsid]*/ );
include('c:\scripts\ds\dsDevice.php');
$dsserver->callScene(0,3,'yellow'); //public function callScene($scene, $room, $groupname) Essen Licht
$result=$dsserver->getstate($dsid);
SetValueBoolean(24326 /*[Räume\OG Essen\OG Essen Tisch\eStatus]*/ , $result);
?>
Grundsätzlich ist es das.
Zusätzlich frage ich Geräte, welche mir wichtig sind alle 1-4h ab, ob sie eingeschalten oder ausgeschalten sind, einfach damit der Sync da ist, zwischen manuellem Schalter und Symcon.
Zusätzlich verwende ich für manche Taster den geposteten Workaround über den Sceneresponder, damit per Tastendruck Symcon Funktionen über DS aufrufen kann. Ich habe festgestellt, dass das System so schneller reagiert, als wenn ich eine Stimmung über den Sceneresponder autonom aufrufe (subjektiver Eindruck).
Nun gut, hoffe ich konnte einen kleinen Mehrwert liefern!
Freue mich aber auf alle Updates im DS Bereich!
Gruss