Statusabgleich zwischen Digitalstrom und IP-Symcon

Hallo,

ich möchte hier gerne eine Möglichkeit aufzeigen, wie man den Statusabgleich zwischen Digitalstrom und IP-Symcon erreichen kann.
Achtung es wird kompliziert und aufwändig, ist aber aus meiner Sicht ein Weg, der eine bessere Integration ermöglicht.
Im ersten Schritt sieht man den Status der Devices, und kann sie schalten und dimmen. Was ich derzeit noch nicht hinbekomme, ist eine Anzeige des Dimmwertes, wenn dieser am Device direkt geändert wurde.

Ich nutze für den Abgleich eine weitere Serverinstanz, nämlich openHAB. Dies wurde hier im Forum schon einige male angesprochen. Es basiert auf Java und ist OpenSource. Derzeit finde ich aber die Konfiguration von openHAB noch nicht so komfortabel und IP-Symcon bietet das wesentlich schönere Webinterface. Also habe ich mir gedacht, verbinde beide Systeme miteinander, und nutze die vielen „Bindings“ (so heissen bei openHAB die HW Anbindungen) der anderen Welt.

Nur damit hier kein falscher Eindruck entsteht, ich habe gerade erst ein Update auf unlimited gekauft, plane also in keinster Weise einen Wechsel zu openHAB, und bin mit denen auch nicht sonst wie verbandelt.

So nun mein Weg:
Ich habe einen openHAB Server zusätzlich zu meinem IP-Symcon Server aufgesetzt. Dort habe ich das Digitalstrom Bindung nach Anleitung eingerichtet. Der Server läuft auf meinem IPS Server, also gleicher Hardware.

Die Links dazu

  • openHAB installieren: Link
  • Digitalstrom Binding: Link

Im openHAB Designer habe ich nun folgendes angelegt:
Eine Datei mit den Items:


Dimmer OG_Arbeitszimmer_Decke_Licht_58007     "Licht Arbeitszimmer Decke"		(OG_Arbeitszimmer, Light, Digitalstrom)     	{digitalstrom="dsid:3504175fe000000000011b3b"}
Switch OG_Arbeitszimmer_Decke_Licht_22352     "Licht Arbeitszimmer Decke"		(OG_Arbeitszimmer, Light, Digitalstrom)     	{digitalstrom="dsid:3504175fe000000000011b3b"}

Hier habe ich die gelbe Klemme als Dimmer und Switch angelegt. Bei der Namensgebung habe ich etwas Logik verwendet, dann lassen sich die leichter wieder finden. Ergänzt werden die Namen von der zugehörigen IPS-ID der jeweiligen Variablen.

Jetzt wird noch eine Rule in openHAB definiert, immer wenn sich der Status einer Variablen ändert. Dazu eine neue .rule im Verzeichnis rules anlegen:


rule OG_Arbeitszimmer_Decke_Licht
when 
  Item OG_Arbeitszimmer_Decke_Licht_22352  received update
then
  sendHttpGetRequest("http://192.168.114.221/user/openHAB/digitalstrom.php?method=set_value_integer&item="+OG_Arbeitszimmer_Decke_Licht_58007.name+"&state="+OG_Arbeitszimmer_Decke_Licht_58007.state)
  sendHttpGetRequest("http://192.168.114.221/user/openHAB/digitalstrom.php?method=set_value_boolean&item="+OG_Arbeitszimmer_Decke_Licht_22352.name+"&state="+OG_Arbeitszimmer_Decke_Licht_22352.state)
end

In IPS, wie man im Bild sieht, habe ich eine Dummy-Instanz angelegt, die den gleichen Namen hat, wie in openHAB die Variable bis zur ID (ohne Unterstrich). Unter der Instanz habe ich jeweils eine Variable für den Status (Boolean mit Profil Switch) und eine für die Intensität (Integer mit Profil Intensity. 100) angelegt.

Den beiden Variablen in IPS habe ich nun noch ein Aktionsscript zugefügt:


<?

if($_IPS['SENDER'] == "WebFront")
{
   SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
   $array = IPS_GetObject($_IPS['VARIABLE']);
   $parent = IPS_GetName($array['ParentID']);
	$string = $parent."_".$_IPS['VARIABLE'];
	$string_value = (string)$_IPS['VALUE'];
	//WFC_SendPopup(35142 /*[WebFront]*/, "String", $string );
	
	if ($_IPS['VALUE'] == true)
	{
		doPostRequest($string,"ON");
	}
	elseif ($_IPS['VALUE'] == false)
	{
		doPostRequest($string,"OFF");
	}
	if ($_IPS['VALUE'] >= 0 and $_IPS['VALUE'] <= 100)
	{
		$return = doPostRequest($string,$string_value);
	}
	
}

function doPostRequest($item, $data) {
  $url = "http://192.168.114.221:8080/rest/items/" . $item;

  $options = array(
    'http' => array(
        'header'  => "Content-type: text/plain
",
        'method'  => 'POST',
        'content' => $data  //http_build_query($data),
    ),
  );

  $context  = stream_context_create($options);
  $result = file_get_contents($url, false, $context);

  return $result;
}

?>

Im Verzeichnis /Webfront/User auf dem IPS Server habe ich einen Ordner openHAB angelegt, und dort das Script digitalstrom.php abgelegt:


<?php 

//--------------------
// Einstellungen

$logging   = 0;   //1 oder 0 für Logging in Textdatei
$dateiname ="digitalstrom.txt"; //Name der Logdatei

//------------------------- 



if ($logging)
{
	$datei = fopen($dateiname,"a+");
}





$method = $_GET['method']; 
$item = $_GET['item'];
$state = $_GET['state'];

$time = (date("Y.m.d - H:i",time()));


if ($method == "set_value_integer")  
{ 
    if ($logging)
    {
    	    fwrite($datei, $time." - Methode: ".$method."
");
    	    fwrite($datei, $time." - Item: ".$item."
");
    	    fwrite($datei, $time." - Wert: ".$state."
");
    }
    $id = preg_split ("#_#", $item);
    $count = count($id);
    //echo print_r($id)."
";
    $id_int = intval($id[$count-1]);
    $state_int = intval($state);
    
    $return = SetValueInteger($id_int,$state_int);
    if ($return == false & $logging)
    {
    	    $error = implode(";",error_get_last());
    	    fwrite($datei, $time." - Fehler beim schreiben der Variable: ".$error." 
");
    }
    else 
    {
    	    fwrite($datei, $time." - Variable erfolgreich aktualisiert
");
    }


}
else if ($method == "set_value_boolean")  
{ 
    if ($logging)
    {
    	    fwrite($datei, $time." - Methode: ".$method."
");
    	    fwrite($datei, $time." - Item: ".$item."
");
    	    fwrite($datei, $time." - Wert: ".$state."
");
    }
    $id = preg_split ("#_#", $item);
    $count = count($id);
    //echo print_r($id)."
";
    $id_int = intval($id[$count-1]);
    if ($logging)
    {
    	    fwrite($datei, $time." - IPS-ID: ".$id_int."
");
    }
    
    if($state == "ON" OR $state == "on" OR $state == 100) {
        $state_bool = true;
    } elseif ($state == "OFF" OR $state == "off"OR $state == 0) {
        $state_bool = false;
    }
    
    $return = SetValueBoolean($id_int,$state_bool);
    //echo $return."
";
    if ($return == false & $logging)
    {
    	    $error = implode(";",error_get_last());
    	    fwrite($datei, $time." - Fehler beim schreiben der Variable: ".$error." 
");
    }
    else 
    {
    	    fwrite($datei, $time." - Variable erfolgreich aktualisiert
");
    }


}
else if ($logging)
{
    fwrite($datei, $time." - Falsche Methode: ".$method. "
");	
}

if ($logging)
{
	fwrite($datei, "
");
	fclose($datei);
}


?>

Zur Fehlersuche kann man im obigen Script ein Logins einschalten, dann sieht man was aus dem openHAB Server übergeben wird.

So:
um das ganze jetzt zu übernehmen sind die oben genannten Schritte umzusetzen. In der openHAB Rule ist die IP Adresse des IPS Servers anzupassen. und im IPS Actionsscript ist die IP Adress des openHAB Servers in der Funktion einzutragen.

Dann sollte es laufen.

Derzeit geht das ganze bei mir für die gelben Klemmen. Man kann aus IPS schalten und dimmen, und mit lokaler Bedienung an der Klemme werden die Variablen in IPS aktualisiert. Hierbei wird nur leider der tatsächliche Wert des Dimmers nicht aktualisiert, aber man sieht „an“ oder „aus“. Bei der Bedienung aus IPS wird der Wert korrekt angezeigt und umgesetzt.

Was ich noch nicht getestet und umgesetzt habe ist der Aufruf von Szenen, sollte aber über das von mir genutzte REST Interface von openHAB auch gehen.

Im nächsten Schritt werde ich mich nun mal um meine grauen Klemmen (Rolladen) kümmern.

Vielleicht mag ja jemand mal ausprobieren, für Fragen stehe ich auf jeden Fall zur Verfügung. Für Vorschläge, Verbesserungen und weitere Ideen bin ich natürlich auch dankbar.

Gruß
Christian

Das wäre genau das richtige für mein aktuelles Problem. Ich möchte ein 1-wire Relaisboard über einen digitalSTROM-Taster steuern. Nur leider bekommt IP-Symcon ja nicht mit wenn der Taster gedrückt wird:mad:.
Da ich ein absoluter Neuling bei IP-Symcon bin (naja, immerhin habe ich es geschafft die Solarüberschussladung für mein Elektroauto hinzubekommen) und das andere System überhaupt nicht kenne, ist die oben beschriebene Lösung für mich definitiv zu kompliziert.
Weiß jemand wann und ob zu erwarten ist das IP-Symcon selbständig die Tasterbetätigung mitbekommt?