Skip to end of metadata
Go to start of metadata

Ü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.

ACHTUNGDie 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
<?xml version="1.0"?>
<!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>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/brlogo.ico">  
</head>
<body>
<PRE>
 ISG ga = Array
(
    [0] => 1
    [1] => 0
)

 ISG pt = 4
 ISG at = WPM_3_I
 ISG pm = Array
(
    [0] => stdClass Object
        (
            [webID] => 440
            [infoNr] => 20067
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => -
            [minValue] => 0
            [maxValue] => 0
            [name] => ISTTEMPERATUR FE7
            [info] => 
            [steps] => 1
        )

    [1] => stdClass Object
        (
            [webID] => 441
            [infoNr] => 20069
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => -
            [minValue] => 0
            [maxValue] => 0
            [name] => SOLLTEMPERATUR FE7
            [info] => 
            [steps] => 1
        )

    [2] => stdClass Object
        (
            [webID] => 442
            [infoNr] => 20068
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 22.6
            [minValue] => 0
            [maxValue] => 0
            [name] => ISTTEMPERATUR FEK
            [info] => 
            [steps] => 1
        )

    [3] => stdClass Object
        (
            [webID] => 443
            [infoNr] => 20070
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 21.9
            [minValue] => 0
            [maxValue] => 0
            [name] => SOLLTEMPERATUR FEK
            [info] => 
            [steps] => 1
        )

    [4] => stdClass Object
        (
            [webID] => 444
            [infoNr] => 1694
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => %
            [value] => 32.3
            [minValue] => 0
            [maxValue] => 0
            [name] => RAUMFEUCHTE
            [info] => 
            [steps] => 1
        )

    [5] => stdClass Object
        (
            [webID] => 29
            [infoNr] => 612
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 5.2
            [minValue] => -40
            [maxValue] => 30
            [name] => TAUPUNKTTEMPERATUR
            [info] => 
            [steps] => 1
        )

    [6] => stdClass Object
        (
            [webID] => 27
            [infoNr] => 12
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 6.4
            [minValue] => -60
            [maxValue] => 80
            [name] => AUSSENTEMPERATUR
            [info] => 
            [steps] => 1
        )

    [7] => stdClass Object
        (
            [webID] => 116
            [infoNr] => 714
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 27.8
            [minValue] => 0
            [maxValue] => 40
            [name] => ISTTEMPERATUR HK 1
            [info] => 
            [steps] => 1
        )

    [8] => stdClass Object
        (
            [webID] => 32
            [infoNr] => 4
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 28.4
            [minValue] => 0
            [maxValue] => 65
            [name] => SOLLTEMPERATUR HK 1
            [info] => 
            [steps] => 1
        )

    [9] => stdClass Object
        (
            [webID] => 33
            [infoNr] => 15
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => -
            [minValue] => 0
            [maxValue] => 90
            [name] => ISTTEMPERATUR HK 2
            [info] => 
            [steps] => 1
        )

    [10] => stdClass Object
        (
            [webID] => 34
            [infoNr] => 4
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => -
            [minValue] => 0
            [maxValue] => 65
            [name] => SOLLTEMPERATUR HK 2
            [info] => 
            [steps] => 1
        )

    [11] => stdClass Object
        (
            [webID] => 434
            [infoNr] => 1697
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 38.2
            [minValue] => 0
            [maxValue] => 0
            [name] => VORLAUFISTTEMPERATUR WP
            [info] => 
            [steps] => 1
        )

    [12] => stdClass Object
        (
            [webID] => 437
            [infoNr] => 1696
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 38.8
            [minValue] => 0
            [maxValue] => 0
            [name] => VORLAUFISTTEMPERATUR NHZ
            [info] => 
            [steps] => 1
        )

    [13] => stdClass Object
        (
            [webID] => 445
            [infoNr] => 1698
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => -
            [minValue] => 0
            [maxValue] => 0
            [name] => VORLAUFISTTEMPERATUR
            [info] => 
            [steps] => 1
        )

    [14] => stdClass Object
        (
            [webID] => 31
            [infoNr] => 22
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 28.7
            [minValue] => 0
            [maxValue] => 90
            [name] => RUECKLAUFISTTEMPERATUR
            [info] => 
            [steps] => 1
        )

    [15] => stdClass Object
        (
            [webID] => 118
            [infoNr] => 120
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 27.8
            [minValue] => 0
            [maxValue] => 90
            [name] => PUFFERISTTEMPERATUR
            [info] => 
            [steps] => 1
        )

    [16] => stdClass Object
        (
            [webID] => 36
            [infoNr] => 469
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 28.5
            [minValue] => 0
            [maxValue] => 0
            [name] => PUFFERSOLLTEMPERATUR
            [info] => 
            [steps] => 1
        )

    [17] => stdClass Object
        (
            [webID] => 435
            [infoNr] => 1652
            [webType] => 7
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.01
            [unit] => bar
            [value] => 1.41
            [minValue] => 0
            [maxValue] => 0
            [name] => HEIZUNGSDRUCK
            [info] => 
            [steps] => 2
        )

    [18] => stdClass Object
        (
            [webID] => 438
            [infoNr] => 1651
            [webType] => 7
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.01
            [unit] => l/min
            [value] => 0
            [minValue] => 0
            [maxValue] => 0
            [name] => VOLUMENSTROM
            [info] => 
            [steps] => 2
        )

    [19] => stdClass Object
        (
            [webID] => 45
            [infoNr] => 2560
            [webType] => 2
            [readOnly] => 2
            [presentation] => 5
            [step] => 0.1
            [unit] => °C
            [value] => 4
            [minValue] => -10
            [maxValue] => 10
            [name] => ANLAGENFROST
            [info] => Gültige Werte: Eingabe zwischen<br />-10 °C und 10 °C
            [steps] => 1
        )

    [20] => stdClass Object
        (
            [webID] => 24
            [infoNr] => 14
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 43
            [minValue] => 10
            [maxValue] => 65
            [name] => ISTTEMPERATUR 
            [info] => 
            [steps] => 1
        )

    [21] => stdClass Object
        (
            [webID] => 30
            [infoNr] => 3
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 45
            [minValue] => 10
            [maxValue] => 65
            [name] => SOLLTEMPERATUR 
            [info] => 
            [steps] => 1
        )

    [22] => stdClass Object
        (
            [webID] => 438
            [infoNr] => 1651
            [webType] => 7
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.01
            [unit] => l/min
            [value] => 0
            [minValue] => 0
            [maxValue] => 0
            [name] => VOLUMENSTROM
            [info] => 
            [steps] => 2
        )

    [23] => stdClass Object
        (
            [webID] => 39
            [infoNr] => 468
            [webType] => 2
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.1
            [unit] => °C
            [value] => 9.2
            [minValue] => 0
            [maxValue] => 0
            [name] => QUELLENTEMPERATUR
            [info] => 
            [steps] => 1
        )

    [24] => stdClass Object
        (
            [webID] => 439
            [infoNr] => 1653
            [webType] => 7
            [readOnly] => 1
            [presentation] => 2
            [step] => 0.01
            [unit] => bar
            [value] => 1.46
            [minValue] => 0
            [maxValue] => 0
            [name] => QUELLENDRUCK
            [info] => 
            [steps] => 2
        )

)
</PRE></body>
</html>

          

 

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:

EigenschaftWert
BezeichnungIsttemperatur FEK
Befehlserkennung[webID] => 442\n\i[value] => \i\v
Validierung verwendenkann angekreuzt werden
Minimaler Wert0
Maximaler Wert50
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
 ISG ga = Array
(
    [0] => 2
    [1] => 0
)

 ISG pt = 4
 ISG at = WPM_3_I
 ISG pm = Array
(
    [0] => stdClass Object
        (
            [webID] => 471
            [infoNr] => 49742
            [webType] => 6
            [readOnly] => 1
            [presentation] => 2
            [step] => 0
            [unit] => 
            [value] => -
            [minValue] => 0
            [maxValue] => 0
            [options] => Array
                (
                    [0] => stdClass Object
                        (
                            [id] => B0
                            [name] => HK 1 PUMPE
                        )

                    [1] => stdClass Object
                        (
                            [id] => B1
                            [name] => HK 2 PUMPE
                        )

                    [2] => stdClass Object
                        (
                            [id] => B2
                            [name] => AUFHEIZPROGRAMM
                        )

                    [3] => stdClass Object
                        (
                            [id] => B3
                            [name] => NHZ STUFEN
                        )

                    [4] => stdClass Object
                        (
                            [id] => B4
                            [name] => HEIZBETRIEB
                        )

                    [5] => stdClass Object
                        (
                            [id] => B5
                            [name] => WARMWASSERBETRIEB
                        )

                    [6] => stdClass Object
                        (
                            [id] => B6
                            [name] => VERDICHTER
                        )

                    [7] => stdClass Object
                        (
                            [id] => B7
                            [name] => SOMMERBETRIEB
                        )

                    [8] => stdClass Object
                        (
                            [id] => B8
                            [name] => KUEHLBETRIEB
                        )

                    [9] => stdClass Object
                        (
                            [id] => B9
                            [name] => ABTAUBETRIEB
                        )

                    [10] => stdClass Object
                        (
                            [id] => B10
                            [name] => SILENTMODE 1
                        )

                    [11] => stdClass Object
                        (
                            [id] => B11
                            [name] => SILENTMODE 2
                        )

                )

            [name] => BETRIEBSSTATUS
            [info] => 
        )

    [1] => stdClass Object
        (
            [webID] => 488
            [infoNr] => 116
            [webType] => 6
            [readOnly] => 1
            [presentation] => 2
            [step] => 0
            [unit] => 
            [value] => 0
            [minValue] => 0
            [maxValue] => 0
            [options] => Array
                (
                    [0] => stdClass Object
                        (
                            [id] => B0
                            [name] => EVU SPERRE
                        )

                )

            [name] => EVU SPERRE
            [info] => 
        )

    [2] => stdClass Object
        (
            [webID] => 485
            [infoNr] => 20062
            [webType] => 6
            [readOnly] => 1
            [presentation] => 2
            [step] => 1
            [unit] => 
            [value] => 65
            [minValue] => 0
            [maxValue] => 0
            [options] => Array
                (
                    [0] => stdClass Object
                        (
                            [id] => B0
                            [name] => HEIZKREISPUMPE
                        )

                    [1] => stdClass Object
                        (
                            [id] => B1
                            [name] => MISCHERPUMPE
                        )

                    [2] => stdClass Object
                        (
                            [id] => B2
                            [name] => MISCHER AUF
                        )

                    [3] => stdClass Object
                        (
                            [id] => B3
                            [name] => MISCHER ZU
                        )

                    [4] => stdClass Object
                        (
                            [id] => B4
                            [name] => NHZ 1
                        )

                    [5] => stdClass Object
                        (
                            [id] => B5
                            [name] => NHZ 2
                        )

                    [6] => stdClass Object
                        (
                            [id] => B6
                            [name] => QUELLENPUMPE
                        )

                    [7] => stdClass Object
                        (
                            [id] => B7
                            [name] => PUFFELADEPUMPE
                        )

                    [8] => stdClass Object
                        (
                            [id] => B9
                            [name] => WARMWASSERVENTIL
                        )

                    [9] => stdClass Object
                        (
                            [id] => B13
                            [name] => KUEHLBETRIEB
                        )

                    [10] => stdClass Object
                        (
                            [id] => B14
                            [name] => VERDICHTERSCHUETZ
                        )

                )

            [name] => STATUS
            [info] => 
        )

    [3] => stdClass Object
        (
            [webID] => 481
            [infoNr] => 1640
            [webType] => 6
            [readOnly] => 1
            [presentation] => 2
            [step] => 1
            [unit] => min
            [value] => 0
            [minValue] => 0
            [maxValue] => 0
            [name] => RESTSTILLSTAND
            [info] => 
        )

)

 

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:

EigenschaftWert
Befehl bei EIN/save.php
HTTP Erweiterung bei EINContent-Type: application/x-www-form-urlencoded
HTTP POST Befehl bei EINdata=%5B%7B%22name%22%3A%22val16%22%2C%22value%22%3A%22<v.1>%22%7D%5D
HTTP Methode bei EINPOST

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. 

  • No labels

12 Comments

  1. Vielen Dank, ich brauche in ISGweb (wink)

  2. Wow... Verstehe nicht mal 10% aber ist 100% was ich will... Kudos Jan!

  3. Danke für die Anleitung - TOP!

    • Habe ein ISG plus an meiner LWZ 504.
    • Habe derzeit die Eingangs- und Ausgangsverbinder im Einsatz. Funktioniert bestens!

    => leider ist im ISG Plus serienmäßig kein Modbus/TCP enthalten (02.2018) - ist vermutlich wegen Energiemanagement SG ready nicht möglich

  4. im ISG plus ist mittlerweile eine 8GB microSD verbaut

    alternativ zur Raspi Lösung hätte ich noch folgenden Workaround:

    •  Backup der originalen SD mit Win32DiskImager und neue SD auch damit beschreiben
    •  bearbeiten der SD Kopie mit Linux File Systems für Windows von Paragon Software (mounten der SD unter Windows)
      10-Tage-Testversion
    •  zum Erstellen der Dateien Notepad++ verwenden, Scripting von Webseite kopieren, Bearbeiten - Format Zeilenende → Unix
      und speichern auf beschriebenen Pfaden und Dateinamen.

    Fertig!


  5. Hallo, 


    vielen Dank für diesen Beitrag. Ich bin ähnlich vorgegangen und habe mir jetzt eine Parameters Seite gebaut, auf der die Information als JSON ausgegeben werden, damit ich das für mich parsen kann. 

    Hast du Zugriff auf den Lighttpd Server bekommen? Ich komme da weder an die Verzeichnisse oder Dateien ran. Eine Verbindung über WINSCP ist auch nicht möglich, bei Verbindung über Port21 fragt er nach einem User, aber die Verbindung wird immer abgelehnt. 


    Würde sehr gerne einen SSH Server installieren um Remote auf die Dateien zugreifen zu können. Könntest du dazu ein bisschen Hilfestellung geben?

    1. SSH installieren sollte möglich sein, da die HW binärkompatibel zu Raspberry ist. Ich bin kein Linux-Experte, aber ich denke, dass man neben dem binary nur die Startscripte anpassen muss, um den Server einzubinden.

      Da ein Debugging nicht möglich ist und nach Anpassen der SD-Karte auf einem Mac oder PC die Karte im ISG web installiert werden muss, um es zu testen, kann das natürlich etwas dauern.

  6. Hallo, 


    ich habe mich nun doch dazu durchgerungen das ISG zu kaufen. Funktioniert auch soweit, jedoch bin ich ein wenig enttäuscht das man nicht auf die Prozessdaten zugreifen kann. Sind die irgendwo verfügbar und werden nur im Webinterface nicht angezeigt ? 

    1. Welche Prozessdaten vermisst Du denn?

  7. Zb wird mir im wpm die verdichter Drehzahl und Lüftergeschwindigkeit angezeigt. Das hätte ich gerne

  8. Ich habe mich nun mit den Dateien auf dem ISG beschäftigt und selbst mit meinen nicht allzu hohen Programmierfähigkeiten rausbekommen wie ich die fehlenden Daten anzeigen kann:

    Es gibt im Unterordner /rel_a/etc/config/menus json templates für jeden WP Typ. Wenn man das richtige Template gefunden hat kann man über den "dependency" Parameter Einstellen welche Parameter sowohl aus der normalen Seite als auch auf der veränderten params2 Seite angezeigt wird. 


    Jetzt werde ich mal sehen dass ich die Daten in Loxone bekommen, allerdings nervt gerade bei der Menge an Daten die Einschränkung dass man bei Loxone nicht noch mal Unterkategorien machen kann. So hat man in der Kategorie Heizung einfach ne endlose Liste.

    Eine Frage bleibt, wie bekomme ich die Tageswerte für den Verbrauch am besten ins Loxone? Meine Idee wäre um Kurz vor 24Uhr den Wert irgendwie zu loggen, weiß aber noch nicht genau weiter

  9. Ich habe mein ISGWeb mal auf die Version 10.0.1 upgedated.

    Nun habe ich auch die SG-Ready Energiemanagement Webseiten verfügbar.

    Laut Doku sind die allerdings nur mit ISG Plus in Verbindung mit dem Relaiseingang

    nutzbar. 

    Hat jemand damit Erfahrung gesammelt? Gäbe es auch eine Möglichkeit über ein

    Webkommando das Energiemanagement anzusteuern statt dem physikalischen Eingang des ISG PLUS?

  10. SSH Rootzugang zur ISG Box (Ab Edit 4 geht es richtig los (big grin))

    Vorweg, ich übernehme keinerlei Haftung, wer keine Ahnung hat, sollte die Finger davon lassen!!!!


    Der jetzt kommende Teil, bis Edit 4, zeigt meinen Prozess auf und wird nicht benötigt, aber ist für den ein oder anderen vielleicht von Interesse.


    Wenn ihr lesenden Zugang zur ISG Box haben wollt, ladet euch die shell.php von https://github.com/flozz/p0wny-shell herunter und ladet sie in den rel_b/www ordner rein.

    SD-Karte wieder reinstecken und http://ip-adresse-der-box/shell.php aufrufen, voila ihr seid im komletten system (smile)

    Ich stöber derweil mal im Filesystem rum und versuche den sshd zu starten.


    kleiner Auszug:

    p0wny@shell:/# df -h
    Filesystem                Size      Used Available Use% Mounted on
    /dev/mtdblock1           29.6M     12.8M     16.8M  43% /
    tmpfs                    14.4M    208.0k     14.2M   1% /var/volatile
    tmpfs                    14.4M         0     14.4M   0% /home/root
    /dev/mmcblk0p1          219.4M     43.1M    165.0M  21% /firmware
    tmpfs                    14.4M    208.0k     14.2M   1% /etc/network
    tmpfs                    14.4M    208.0k     14.2M   1% /etc/ppp


    Edit:

    sshd konnte ich starten, komme aber nicht rein mit putty, weil mir natürlich das root Passwort fehlt. Setzen eines ssh Schlüssels geht aber wegen dem read only mount nicht.

    Rootverzeichnis / ist leider read only gemountet, kann so keine Veränderungen vornehmen, muss weiter forschen...


    Edit 2: mit folgendem Befehl kann man rootfs rw mounten

    remount rw /dev/mtdblock1 /



    Edit 3: hier ist zu sehen, dass der sshd nach einem Neustart aktiv ist durch den Eintrag:
    sh /etc/init.d/sshd start
    in rel_b/etc/init.d/start.sh


    Edit 4: da issa (smile) ssh Zugang mit vollen root Rechten

    folgende Zeilen habe ich unter /rel_b/etc/init.d/start.sh hinzugefügt

    #start htpdate daemon
    bin/htpdate -d -t -s servicewelt.stiebel-eltron.de


    #hier kommt mein code


    #script to start sshd with private key access

    remount rw /dev/mtdblock1 /

    cp /firmware/sshd_config /etc/ssh/sshd_config
    mkdir /home/root/.ssh
    chmod -R 700 /home/root
    cp /firmware/root/.ssh/authorized_keys /home/root/.ssh/authorized_keys
    chmod 600 /home/root/.ssh/authorized_keys

    #ssh-start
    sh /etc/init.d/sshd start


    remount ro /dev/mtdblock1 /

    direkt auf de SD-Karte liegen die veränderte sshd_config mit dem Eintrag 

    AuthorizedKeysFile .ssh/authorized_keys

    und unter <SD-Karte>/root/.ssh eine authorized_keys mit meinem privaten ssh Schlüssel


    Viel Spaß bei der Übernahme


    PS: Nach dem ganzen Prozedere, solltet ihr die shell.php wieder löschen ,bzw. benötigt ihr sie mit meiner Anleitung gar nicht (smile)


    PPS: WinSCP geht natürlich auch (wink)