Beschreibung zur Erstellung des Rückkanals mit 1.16

Vorwort:
In dS, vor dem Update zu 1.16, hatte man einen Rückkanal nur für Raum- und Bereichsklemmen. Genauer genommen berechnete man, ob eine Lampe brennt, anhand der Raumstimmungen. Seit 1.16 kennt der dSS den Status jeder Klemme. Früher empfahl ich ausschliesslich Bereichs- und Raumklemmen zu verwenden. Seit dem Update empfehle ich, wenn möglich Geräteklemmen (ohne lokal Priorität) zu verwenden. Eine Geräteklemme reagiert schneller auf ein lokales Signal vom Taster. Zudem funktioniert die Lampe weiterhin, wenn ein dsM defekt wäre.

Schalten über Scenen, Status über pollen
Der dS Konfigurator erstellt für eine Geräte Klemme typischer Weise eine Instanz mit 2 Variablen. Im Falle einer ds Light (z.B. GE-KM200) eine Boolean Variable und einer Integer mit Werten 0-255. Aus diesen Variablen könnte man die Geräte schalten oder dimmen. Ich empfehle dies jedoch nicht. Durch diese Standard Variablen werden Geräte Befehle abgeschickt. Gerätebefehle werden in dS sehr langsam ausgeführt. Entsprechend empfehle ich eine eigene Boolean Variable zu erstellen. An dieser Variable hängt man ein php Skript an, welche die entsprechende Szene, welche man im dSS programmierte, absendet. Im Post Beschreibung der Berechnung des Rückkanals habe ich dies einmal beschrieben. Dies ermöglicht aus Ip-Symcon innert etwa einer Sekunde eine Lampe ein- oder auszuschalten. Im Falle eines Rollladens erzeuge ich eine Integer Variable mit den Ausprägungen 0,1,2 (zum Profil dazu Stop, öffnen, Schliessen). Natürlich noch ein Integer, um Zwischenstellen anfahren zu können. Daneben noch eine boolean Variable, damit ich auch in IPS-Studio, eine Toggle-Variable verwenden kann. Bei mir ist false im Profil geschlossen, und true offen. Der Stop Befehl oder Zustand ist auf offen.
Etwas komplizierter ist der Rückkanal.
Zuerst muss man einen Websocket erstellen mit ws://192.168.1.111:8090/api/v1/apartment/notifications (die IP-Adresse angepasst). Dann erstellt man eine Register Variable mit Referenz zu diesem websocket. Als Ziel gibt man ein php-Skript mit folgendem Inhalt
if ($_IPS[‚VALUE‘]==’{„type“:1,„target“:„event“,„arguments“:[{„type“:„apartmentStatusChanged“}]} '){include("/var/lib/symcon/scripts/12345.ips.php");
}

Im obigen Web-socket muss man mit folgendem Befehl

WSC_SendMessage( 11111, ‚{„protocol“:„json“,„version“:„1“}‘ );

die Benachrichtigungen aktivieren.

Das Skript 12345 ist das eigentliche pollen Skript. Im obigen web-socket kommt einzig die Nachricht, dass eine Klemme sich geändert hat, an. Man weiss nicht, welche Klemme geändert wurde. Entsprechend muss man jede Geräte Klemme ständig pollen. Wenn Sie beispielsweise «Gehen» betätigen oder sämtliche Rolläden im Haus gleichzeitig hinunter lassen, wird obiger Befehl zum Pollen mehrfach ausgeführt. Das kann zu einer überlastung (Verzug) in IP-Symcon führen. Im Post Retour Kanal gemäss 1.16 zeigte ich, wie man eine Abfrage in IP-Symcon zum dSS tätigt. Traurigerweise ist die Info in der json Info bei einer geschalteten und einer gedimmten Lampe unterschiedlich. Der Befehl für eine geschaltete Lampe ist:

$Call2 = „/api/v1/apartment/status?includeAll=true“;

$arrContextOptions=array(
„ssl“=>array(
„verify_peer“=>false,
„verify_peer_name“=>false,
),
);

$sessionToken = fdSLogin();

$ist2=fdSGetJson($Call2, $sessionToken);
$ist2=json_decode($ist2,true);

$ist2=$ist2[‚data‘][‚included‘][‚dsDevices‘];

$rpc = new JSONRPC(‚http://xxxx@mail.com:password@192.168.1.111:3777/api/‘);

foreach ($ist2 as $value)
{
switch ($value[„id“])
{

    case "302ab89f43f0000000000580001170e000": /*Geschaltete Lampe. Gilt auch für SW-ZWS200*/ 
        if (array_key_exists('outputs',$value['attributes']['functionBlocks']['0'])==true){
            $rpc->SetValue(11111, 
            boolval($value['attributes']['functionBlocks']['0']['outputs']['0']['level']));
            $rpc->SetValue(22222, 
            intval(round($value['attributes']['functionBlocks']['0']['outputs']['0']['value']*2.55,0)));
            SetValue(33333, GetValue(11111));}
    break;

    }
}

Im obigen php ist nur der mittlere Teil des Codes von Retour Kanal gemäss 1.16 angegeben. Für jede Geräte Klemme muss der dsuid „302ab89f43f0000000000580001170e000“ angegeben werden. Die äussere if array_key_exists. Abfrage ist nötig, damit kein Fehler angezeigt wird, sollte eine Klemme gerade nicht im System sein. (z.B. die Ständerlampe wurde ausgezogen oder ein dsM ist gerade Defekt). Die Referenz 11111 bezieht sich auf die Status Variable, welcher der ds-Configurator in IP-Symcon erzeugt hat. 22222 «Intensity» und 33333 meine Variable, aus welcher in die Lampe schalte. Im Falle einer gedimmten Variable ist der mittlere Teil:
Im Falle einer gedimmten Variable wäre der mittlere Teil:

$rpc->SetValue(22222,
intval(round($value[‚attributes‘][‚functionBlocks‘][‚0‘][‚outputs‘][‚0‘][‚value‘]*2.55,0)));
$rpc->SetValue(11111,
(GetValue(22222)>0));

Im Falle einer Rolladens ist mein Code:

    case "3035abd7f800000000000f000008829a00": /*Esszimmer Rollladen*/
        $x=intval(round($value['attributes']['functionBlocks']['0']['outputs']['0']['targetValue']*2.55,0));
        $y=2+($x==0)*2-($x==255)*2;
        $z=($x==0)*2+($x==255)*1;
        $rpc->SetValue(58351, $y);
        $rpc->SetValue(38983, $x);
        SetValue(43348, $z );      
        SetValue(37953, $x );
        SetValue(52436, ($x>0) );
    break;

Im Falle einer SW-UMR200:

        $rpc->SetValue(11111, 
        boolval($value['attributes']['functionBlocks']['0']['outputs']['0']['level']));
        $rpc->SetValue(22222, 
        GetValue(11111)*255); 

Im Falle einer SW-KL200 für einen Klima Gerät (elektrischer Heizkörper im Bad):

        $rpc->SetValue(222222, 
        intval(round($value['attributes']['functionBlocks']['0']['outputs']['0']['value'],0)));
        $rpc->SetValue(111111, 
        (GetValue(22222)==2));

Im Falle eines Schnurdimmers SW-SSL200-JS

            $rpc->SetValue(22222, 
            intval(round($value['attributes']['functionBlocks']['0']['outputs']['0']['value']*2.55,0)));
            $rpc->SetValue(111111, 
            ($value['attributes']['functionBlocks']['0']['outputs']['0']['value']>=50));

Ich habe leider keine Jalousien mit Winkeleinstellung