[dss-developer] dS Integration

Freudemann Reto (s) reto.freudemann at students.fhnw.ch
Wed Apr 25 11:24:11 CEST 2012


Besten Dank für die detaillierte Antwort.

Via dem Subsciption-File greifen wir ja auf Javascript-Files zu, wenn wir nun Befehle via Javaskript einelesen, gibt es dann nicht eine Verzögerung? 
Bei ein paar Test die wir durchgeführt haben, hat immer zuerst der interne Programmablauf Priorität und erst nach einer Verzögerung greift das System auf die Befehle des Javaskripts zu.

Besten Dank für Ihre Hilfe!!

Reto Freudemann
Studiengang Systemtechnik
Unterdorfstrasse 7
5082 Kaisten

reto.freudemann at students.fhnw.ch

________________________________________
Von: dss-developer-bounces at forum.digitalstrom.org [dss-developer-bounces at forum.digitalstrom.org] im Auftrag von Aebi Matthias [maebi at futurelab.ch]
Gesendet: Freitag, 13. April 2012 14:51
An: dSS development list
Betreff: Re: [dss-developer] dS Integration

> Okay das bedeudet, das wir auf der Seite des Leitsystem ein JSON Gateway ertsellen müssen.

Nein, das ist nicht zwingend notwendig. Wenn eine TCP/IP basierte Schnittstelle vorhanden ist genügt dies prinzipiell. Dann lassen sich Events und Kommandos von einem dS-Skript aus versenden und Empfangen. Wenn ein Leitsystem aber eine Webservice Schnittstelle (JSON oder XML) anbietet, dann lässt sich die Kommunikation in JavaScript natürlich umso leichter realisieren.

> Wie jedoch sieht denn dieses Skirpt (dS-App) aus?

Es besteht im wesentlichen aus zwei Skripts.

Das eine sorgt dafür, dass die Verbindung zum KNX System jederzeit vorhanden ist (d.h. es wird versucht eine allenfalls abgebrochene Verbindung, z.B. wegen eine Neustarts auf der andern Seite, automatisch wieder herzustellen).

Von KNX -> dS werden in diesem Skript Events von Seite KNX (z.B. Gruppe 1/2/3 wechselt den Wert von 0 zu 1) gelesen (mit socket.receive (...)) und mittels callScene(...); an den dS Teil der Installation weitergeleitet, d.h. die entsprechenden Szenen werden aufgerufen (z.B. Licht im Raum x einschalten).

Umgekehrt werden Statusänderungen die von dS -> KNX propagiert werden müssen, aufgrund von Änderungen von dSS Properties (z.B. "/knx-integration/eventX") die im zweiten Skript gesetzt werden (s.u.) über dieselbe Verbindung an KNX weitergegeben. Dies geschieht indem entsprechende Funktionen sich mittels setListener("/knx-integration/eventX", xHasChanged); für das Setzen eines Property-Wertes registrieren.

Registrierung für das Skript, das gestartet wird sobald der dSS läuft (event-name="running") in data/subscriptions.d/subscription-knx.xml

  <subscription event-name="running" handler-name="javascript">
    <parameter>
      <parameter name="filename">/usr/share/dss/data/knx-connect.js</parameter>
    </parameter>
  </subscription>



Verbindungsaufbau zum andern System in knx-connect.js:

...

var sleepTimeMS = 1000;

function onConnect(state) {
  if(state) {
    print("Connected");
    setProperty("/knx-integration/connected", true);
    sleepTimeMS = 1000;
    readLine();
  } else {
    print("Connection failed");
    setTimeout(sleepTimeMS, doConnect);
    if(sleepTimeMS <= 10000) {
      sleepTimeMS *= 2;
    }
  }
}

...

function doConnect() {
  setProperty("/knx-integration/connected", false);
  socket = new TcpSocket();
  socket.connect("remote.host.com", 8080, onConnect);
}

doConnect();

...

Das zweite Skript registriert sich beim dSS für alle Events, die in Richtung KNX propagiert werden müssen (z.B. für die Szene "ich gehe") und setzt im dSS Properties, die dann im ersten Skript ausgewertet und im Fall einer Änderung mit entsprechenden Befehlen an KNX übermittelt werden (z.B. verschiedene Gruppen auf 0 setzen).

Registrierung für das Skript, das im Fall eines callScene Events aufgerufen wird  (event-name="callScene") in data/subscriptions.d/subscription-knx.xml

  <subscription event-name="callScene" handler-name="javascript">
    <parameter>
      <parameter name="filename">/usr/share/dss/data/knx-scene-propagation.js</parameter>
    </parameter>
  </subscription>

In knx-scene-propagation.js wird dann z.B. aufgrund des "ich gehe" events ein entsprechendes Property gesetzt, das mittels

if(raisedEvent.parameter.sceneID === "999") {
  setProperty("/knx-integration/eventX", true);
}

das entsprechende Property ("/knx-integration/eventX") setzt und damit den Listener im ersten Skript triggert und die Funktion xHasChanged ausführt, die die notwendigen Befehle an KNX überträgt.

Die weiteren Details der beiden Skripts sind installationsspezifisch und für das Grundprinzip nicht weiter von Bedeutung. Ich hoffe das hilft weiter.

Gruss
Matthias Aebi

----------------------------------------------------------------------
futureLAB AG             tel: +41 52 260 22 22
Schwalmenackerstr. 4     fax: +41 52 260 22 23
CH-8400 Winterthur    e-mail: maebi at futurelab.ch
Switzerland          mission: delivering tomorrow's applications today

_______________________________________________
dss-developer mailing list
dss-developer at forum.digitalstrom.org
http://forum.digitalstrom.org/cgi-bin/mailman/listinfo/dss-developer


More information about the dss-developer mailing list