mit ISG web über Modifikation des Webservers
Über das ISG web können per Webbrowser die Daten der Anlage angezeigt werden. Die Einbindung in Loxone kann über HTTP Eingangs- und Ausgangsverbinder erfolgen und Daten von der Webseite augeslesen und verändert werden. Die Abfrage von Werten wie z.B. Temperatur funktioniert über virtuelle HTTP Eingänge recht gut, aber leider nicht die Abfrage des Zustandes der Pumpen. Diese werden auf der Webseite nämlich nur angezeigt, wenn sie an sind, siehe https://www.loxforum.com/forum/german/software-konfiguration-programm-und-visualisierung/136267-problem-mit-virtuellem-http-eingang
Die Idee ist daher, den Webserver um zusätzliche Webseiten zu erweitern, wo die Parameter "Loxone freundlich" zum Parsen aufbereitet sind. Ein genauerer Blick auf das innere des ISG web zeigt eine Micro SD-Karte auf der linken Seite:
Es handelt sich bei mir um eine 2GB Micro SD-Karte von Transcend. Diese ist im EXT3 Format formattiert und lässt sich auf einem Linux System, wie z.B. einem Raspberry PI per USB-Stick einbinden und auslesen. Die ausführbaren Dateien sind sogar binärkompatibel mit dem Raspberry. Getestet habe ich es mit dem Tool htpdate, welches auf der SD-Karte vorhanden ist und die Uhrzeit per HTTP aus dem Internet holt. Die Tools, um die Daten aus der Anlage per CAN-Bus auszulesen können natürlich nicht ausgeführt werden, weil der Raspberry PI diese Schnittstelle nicht bietet. Theoretisch könnte man auch einen SSH Server hinzufügen und dann die nachfolgend beschriebenen Schritte bequem per Remote Verbindung durchführen, ohne die SD-Karte häufig aus- und einzubauen zu müssen.
Auf meinem ISG web aus dem Jahr 2015 befinden sich zwei unterschiedliche Version der Software: die Version 8.5.6 aus 2016 liegt im Verzeichnis /rel_a und eine ältere Version 8.5.0 im Verzeichnis /rel_b. Der Webserver des ISG web verwendet PHP, SQLlite und die Webseiten liegen im Verzeichnis /rel_a/web. Der Aufruf erfolgt immer über die PHP Seite /index.php, die als / aufgerufen werden kann. Die Hauptseite des ISG web wird beim Aufruf ohne weitere Parameter angezeigt und die einzelnen Menüs durch ein Ergänzung aufgerufen. Das Menü Info, Anlage wird z.B. über /?s1,0 aufgerufen. Der interne Ablauf beim Aufruf der PHP Seite /index.php ist immer gleich. Zunächst werden über ein JSON Template die Parameter für den eigenen spezifischen Anlagentyp aus einer internen DB ausgelesen und dann die spezifischen Parameter für das anzuzeigende Untermenü bzw. die Hauptseite herausgezogen. Diese werden dann per CAN-Bus aus der Anlage ausgelesen bzw. regelmäßig abgefragt. Bei diesem Punkt habe ich die Funktionsweise noch nicht genau verstanden. Dann werden die Header der anzuzeigenden Webeite, Menüs aufgebaut und die anzuzeigenden Parameter visualisiert. Dies geschieht über verschiedene Templates (PHP Seiten ptxx.php) von denen eines in die aufzubauende Webseite eingefügt wird. Am Ende wird noch ein Footer angezeigt.
Um die Daten gezielt vom MS auszulesen zu lassen und kein Problem mit der fehlenden Information über ausgeschaltete Pumpen zu haben, habe ich die Datei /index.php nach /params2.php kopiert. Da ich die ursprünglich vorhandenen Dateien nicht modifiziert habe, stehen die Webseiten noch genauso zur Verfügung, wie vorher. In der neuen PHP Seite /params2.php habe ich die Teile für die Visualisierung gelöscht und statt dessen die PHP Variablen für die Parameter und Werte, die für diese Webseite aus der internen Datenbank und der Anlage kommen, ausgegeben. Um etwas Ladezeit zu sparen, habe ich die Include-Datei _inc/header.inc, welche den Header der Webseite aufbaut und dann CSS Style-Sheets und etliche JQuery Objekte nachläd, ebenfalls noch angepasst. Dafür habe ich eine verkürzte Version der ursprünglichen Datei unter dem Namen head2.inc gespeichert.
Letztendlich werden nur 2 Dateien zum Webserver hinzugefügt:
params2.php im Verzeichnis /rel_a/www/:
params2.php
<?php
// Session starten
session_start();
// Kodierung
header("Content-Type: text/html; charset=utf-8");
// Standartvariablen
include_once('stablevalues.php');
// Logout + Login + Session abgleich
include_once('auth.php');
// Kopf der Seite einbinden
include_once('_inc/head2.inc');
// ISG Objekt laden
include_once('isg_object.php');
// ISG Objekt anlegen
$isg = new isg;
// ISG Object vorbereiten
$isg->start();
// Werte aufbereiten
$isg->get_values();
//Anzeige der Anlagenparameter und Werte
print "<PRE>";
print "\n ISG ga = ";
print_r($isg->ga); //getarray
print "\n ISG pt = ";
print_r($isg->pt); //seitentyp
print "\n ISG at = ";
print_r($isg->at); //Anlagentyp
print "\n ISG pm = ";
print_r($isg->pm); // portmapper array
print "</PRE>";
// ENDE
?>
</body>
</html>
head2.inc im Verzeichnis /rel_a/www/_inc/. Diese Datei ist die verkürzte Form der vorhandenen header.inc Datei. Die Meta Daten sind nicht wirklich erforderlich und eigentlich handelt es sich auch nicht um eine XML-Datei. Hier besteht vielleicht noch eine Optimierungsmöglichkeit.
head2.inc
<?php
echo "<"."?xml version=\"1.0\"?".">\n";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
<head>
<title><?=($marke?'TECALOR':'STIEBEL ELTRON')?> Reglersteuerung</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="imagetoolbar" content="no" />
<meta name="content-language" content="de" />
<meta name="robots" content="noindex,nofollow" />
<meta name="keywords" content="" />
<meta name="description" content="" />
<link rel="shortcut icon" href="./pics/<?=($marke?'tec_':'')?>brlogo.ico">
</head>
<body>
Hier noch ein paar Code-Schnipsel, wie man die SD-Karte auf einem Raspberry PI einbindet und modifiziert:
Raspberry CMDs
sudo mkdir /media/ISGweb
sudo mount -v -t ext3 /dev/sda1 /media/ISGweb/
sudo cp params2.php /media/ISGweb/rel_a/www/
sudo cp _inc/head2.inc /media/ISGweb/rel_a/www/_inc/
sudo umount /media/ISGweb
Die o.a. Befehle gehen davon aus, dass die modifizierten Dateien im aktuellen Verzeichnis liegen (ACHTUNG: UNIX-Format mit LF am Ende!). Wenn die SD-Karte nicht als Device /dev/sda1 eingelesen wurde, dann kann man mit dmesg feststellen, welches Device man verwenden muss.
ACHTUNG: Die original SD-Karte von Stiebel-Eltron sollte auf keinen Fall direkt modifiziert werden!!! Aus Sicherheitsgründen sollte immer mit einer Kopie gearbeitet werden. Eine SD-Karte kann z.B. unter OS-X mit dem Tool "Apple PI Baker" geklont werden. Da die Daten auf der SD-Karte persönliche Daten, wie z.B. den individuellen Portalschlüssel enthalten und das Copyright bei Stiebel-Eltron liegt, kann ich im Problemfall nicht helfen.
Nach der Installation der modifizierten SD-Karte können die Daten im JSON Format angezeigt und damit vom MS sehr einfach ausgelesen werden. Testen kann man dies mit einem Webbrowser und dem Aufruf von /params2.php bzw. /params2.php/?s1,0 Hier ein Beispiel, wie die Seite für den Menüpunkt "Info", "Anlage" bei einer WPC 05 cool aussieht (Webseite /index.php/?s1,0):
und so sieht die Antwort für die gleichen Parameter bei der Abfrage über /params2.php/?s1,0 aus. Die Parameter und Werte kommen dabei aus dem Array ISG→pm. Jeder Parameter wird mit spezifischer webID, Namen, Wert und teilw. auch Minimal- bzw. Maximalwerten dargestellt. Ein Parsen ist sehr einfach über die webID möglich und erlaubt auch die Verwendung von anderen Sprachen im ISG web. Parameter von Komponenten, wie z.B. dem Raumregler FE7, den ich nicht habe, sind mit einem Wert von "-" dargestellt.
params2.php/?s1,0
Zum Abruf der Parameter legt man für jede Webseite mit Parametern, die abgerufen werden soll, einen virtuellen HTTP Eingang an, z.B.: http://<ip-adresse-der-wp>/params2.php?s=1,0. Bei der URL muss man natürlich die IP-Adresse des eigenen ISG web angeben. Als Abfrageintervall empfehle ich keine kleineren Werte als 5 Sekunden, da der Abruf der Seite knapp 1s dauert. Die gleiche Seite mit aufbereiteten Werten und Menüs dauert bei mir bis zu 1,4s. Als Timeout empfehle ich mind. 4000ms, falls sich der Abruf der Webseiten mal länger dauert oder ein Paket im Netz verloren geht. Ich habe derzeit ein Abfrageintervall von 15s und ein Timeout von 4000ms eingestellt.
Die einzelnen Werte lassen sich dann über HTTP Eingangsverbinder gezielt abrufen. Diese werden unterhalb des virtuellen HTTP Eingangs für jeden Parameter einzeln erstellt. Nachfolgend ist dies für einen Parameter exemplarisch dargestellt:
Eigenschaft | Wert |
---|---|
Bezeichnung | Isttemperatur FEK |
Befehlserkennung | [webID] => 442\n\i[value] => \i\v |
Validierung verwenden | kann angekreuzt werden |
Minimaler Wert | 0 |
Maximaler Wert | 50 |
Einheit | <v.1> °C |
Wichtig ist, dass die Befehlserkennung mit den enthaltenen Leerzeichen exakt erfolgt!
Der vorher problematische Abruf des Status der Pumpen lässt sich jetzt sehr einfach über die webID 485 realisieren. Diese liefert ein Bit-Array mit dem Zustand der einzelnen Pumpen, Ventile und des Schützes zurück. Hier ist die Antwort der Abfrage über /params2.php/?2,0 angegeben, welche die Parameter für das Menü "Diagnose", "Anlage" liefert (Beispiel wieder von einer WPF 05 cool) anzeigt:
Diagnose, Anlage
Der zurückgelieferte Wert von z.B. 65 für die WebID 485 muss binär dekodiert werden (es gibt im Loxwiki eine Anleitung für einen 16-Bit Binärdekoder von Christian Fenzl, siehe Eine 16 bit Zahl in einzelne Bits zerlegen). Danke nochmal dafür!
Die Bedeutung der einzelnen Bits B0 (niederwertigstes Bit 0) bis B14 (höchstwertigstes Bit 14) sind in den Namen der Child-Objekte beschrieben. Der Wert 65 is binär 00000000 01000001, was bedeutet, dass B0=Heizkreispumpe und B6=Quellenpumpe an sind und die übrigen aus oder nicht vorhanden sind.
Das Objekt mit der WebID 471 scheint von der WPM 3i nicht unterstützt zu werden. Im Handbuch für Modbus/TCP finden sich entsprechende Hinweise.
Leider stimmen die WebIDs nicht mit den Nummern der Modbus/TCP Objekte überein, aber durch die enthaltenen Namen der Objekte sollte eine Zuordnung einfach sein.
Geschrieben werden die Werte über die im ISG web bereits vorhandene Webseite /save.php, die auch beim Verändern von Werten über das Menü des ISG web verwendet wird. Hierfür legt man zunächst einen virtuellen Ausgangsverbinder mit der URL http://<ip-adresse-wp> an, wobei die IP-Adresse des eigenen ISG web verwndet wird. Darunter werden virtuelle Ausgang Befehle erstellt. Die Einstellung der Komforttemperatur wird z.B. über die Variable "val16" gesteuert. Dies entspricht der WebID für diesen Parameter und er kann über die Hauptseite /params.php mit Hinweisen angezeigt werden. Die folgenden Werte sind für den Baustein anzugeben:
Eigenschaft | Wert |
---|---|
Befehl bei EIN | /save.php |
HTTP Erweiterung bei EIN | Content-Type: application/x-www-form-urlencoded |
HTTP POST Befehl bei EIN | data=%5B%7B%22name%22%3A%22val16%22%2C%22value%22%3A%22<v.1>%22%7D%5D |
HTTP Methode bei EIN | POST |
Der Haken "als Digitalausgang verwenden" darf nicht gesetzt sein. Wenn z.B. eine Temperatur von 21.7 °C gesetzt werden soll, dann enthält der HTTP POST Befehl die Zeichenfolge data=[{"name":"val16","value":"21.7"}] im URL Encoded Format. Ich habe den Parameter und den Wert fett hervorgehoben. Für Werte, die nicht mit einer Nachkommastelle, sondern z.B. ganzzahlig oder mit zwei Nachkommastellen angegeben werden sollen, ist dies entsprechend anzupassen.
Sobald ich eine halbwegs brauchbare Zusammenstellung von Parametern habe, werde ich diese hier noch posten. Da die verschiedenen Lüftungsanlagen und Wärmepumpen unterschiedliche Parameter unterstützen, sieht die Einbindung je nach Anlagentyp in LoxConfig am Ende unterschiedlich aus, aber die Modifikation des ISG web ist für alle Anlagen gleich. Das Prinzip, wie die Werte über die webID ausgelesen und über diese auch geschrieben werden können, ist ebenfalls für alle Anlagen gleich. Als Sprache kann auch eine andere Sprache als Deutsch eingestellt werden, weil das Parsen über die WebID und den zugehörigen Wert erfolgt und nicht über den Namen des Parameters.
Fazit: Eine Integration der Stiebel-Eltron Anlage ist über diesen Weg relativ einfach möglich und man kann nach meiner Ansicht alle Werte, die das Webinterface des ISG web anzeigt auslesen und schreiben, sofern die Parameter nicht Read-Only sind. Da die zusätzliche PHP Webseite nicht spezifisch für eine bestimmte Anlage snd, sollte es möglich sein, alle Anlagen, die das ISG web unterstützt, in die Loxone Hausautomation einzubinden. Es wird ein ISG web benötigt, aber es ist keine Erweiterung wie Modbus/TCP oder KNX IP notwendig. Ein Wartungsvertrag ist ebenfalls nicht erforderlich, da man i.d.R. einen Remote-Zugang zum Smart-Home über VPN bereits realisiert hat. Die statistischen Auswertungen der Werte können über den MS, ggf. einen Loxberry wesentlich besser und individueller erfolgen, als das, was Stiebel Eltron über das Portal mit dem Wartungsvertrag anbietet. Ich bin vom Portal ziemlich enttäuscht worden. Eine Alarmierung im Störungsfall ist über Loxone ebenfalls problemlos möglich.
P.S.: es gibt beim ISG web die folgenden undokumentierten Webseiten:
/reboot.php - startet das ISG neu
/henry_tre.php - eine Möglichkeit zum Hochladen von Dateien zum ISG web, welche möglicherweise von Stiebel-Eltron für Updates verwendet wird. Es ist wohl ein Paketformat erforderlich, wo angegeben wird, wohin die Dateien kopiert werden. Temporär werden diese in den Ordner /update kopiert.