Siemens Webserver ozw672, Skript, DbLog in mysql Server

Begonnen von Lanhydrock, 27 Januar 2015, 09:45:07

Vorheriges Thema - Nächstes Thema

Lanhydrock

Vielleicht kann es der eine oder andere als Basis für seine Installation gebrauchen: ein Skript, das bestimmte Parameter vom Siemens Webserver ozw672 per Web API abfragt und in einen SQL Server loggt.

Wir rufen es per cron alle x Minuten auf und erhalten so die wesentlichen Parameter (Temperaturen, Statuswerte,...) in der mysql-DbLog-Datenbank, die in FHEM dann fürs Plotten genutzt werden können.

Da wir die Siemens Web API (noch?) nicht im Detail kennen, ist unklar, ob sich die ParameterIDs pro Installation unterscheiden; was aber vermutlich der Fall ist. - Um diese für Eure Installation herauszufinden, loggt Euch per Browser auf Eurem Webserver ein, wechselt links im Menutree zu Eurer Brennwert-Therme (oder anderer angekoppelten Siemens Regelung) und klickt Euch in den Bereich, der den zu bestimmenden Parameter beinhaltet. Sodann den Quellcode der Seite aufrufen und dort steht dann im entsprechenden Bereich die ID des Datenpunkts (Bsp: "dp1960" für die Aussentemperatur beim "Home > 1 Domostar GBK 25 SH > Diagnose Verbraucher" - Achtung: Ihr sucht nicht die dp_linenumber, sondern die Datenpunkt-ID dpXXXX). Diese entsprechend im Skript im Array @parameterlist ändern, mit den Bezeichnungen und für DbLog gewünschten Variablen-Namen versehen und für andere Datenpunkte ergänzen.

Die im Skript angegebenen Perl-Module LWP, JSON, HTTP, ... müssen natürlich installiert sein (Stichwort: cpan). Es müssen entsprechende User auf dem ozw672 und auf dem sql Server vorhanden sein.

Wir loggen in die DbLog Tabelle history, ggfs. bei Euch auf current anpassen je nach Eurer Installation; zudem könnt Ihr natürlich den SQL Befehl ausdehnen, wenn Ihr bspw. den parameterlongtext mitloggen wollt (was wir nicht tun, um die Größe der Datenbank in Grenzen zu halten). Wenn Ihr das Debugging auf 5 stellt, seht Ihr in der Konsole auch das JSON Array, das zurück kommt. Dort gäbe es auch bspw. die Einheiten des Datenpunktes (°C,...), falls beim Logging gewünscht.

Der Zugriff auf die Web API scheint per Session abgesichert, daher findet das Skript mit den Userdetails zuerst eine korrekte SessionID, um danach dann die einzelnen Parameter abzufragen (Credits an Günter).

Das Skript ist sicher noch optimierbar, Stichwort: Fehlerbehandlung, läuft aber bei uns zu unserer Zufriedenheit.


#!/usr/bin/perl

use strict;
use warnings;

use LWP::UserAgent;
use JSON;
use HTTP::Request::Common qw(POST GET);
use Encode qw(encode);
use DBI;
use Time::Piece;

# Beware: we disable the SSL certificate check for this script.
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0;

# Debugging: off=0, medium=3, extensive=5
my $debuglevel=0;

# Define ozw672 server details.
my ($ozw672host,$ozw672username,$ozw672password)=('192.168.178.1','myusername','mypassword');

# Define DbLog mysql server details.
my ($dbloghost,$dblogport,$dblogname,$dblogusername,$dblogpassword)=('192.168.178.2',3306,'mydblogdatabase','myotherusername','myotherpassword');
# Define texts for logging.
my ($type,$device)=('ozw672','mygascondensingboilername');

# Define all parameters to be logged each script's iteration.
# @parameterlist[x][$parameterid,$parameterlongtext,$parametershorttext,$data]
# which corresponds for FHEM's DbLog with:
# @parameterlist[x][$parameterid,$parameterlongtext,READING            ,VALUE]
# $parameterlist[x][3] will be populated by the script, thus here undefined in each line (the last value is missing).
my @parameterlist=(
[1898,"Status Kessel","statusKessel"],
[1960,"Aussentemperatur","tempAussen"],
[1964,"Aussentemperatur gemischt","tempAussenGemischt"],
[1910,"Kesseltemperatur-Sollwert","tempKesselSoll"],
[1915,"Rücklauftemperatur-Istwert","tempKesselRuecklaufIst"],
[1996,"Trinkwassertemperatur-Istwert Oben (B3)","tempTWWIst"],
);

# We substitute the text for the burner's status with an integer, so plots are easier.
# Define which parameter holds the burner's status.
my $parameterstatuskessel=1898;
my @statuskesselmatrix=(
["Aus",0],
["Nachlauf aktiv",5],
["Freigegeben für TWW",10],
["Freigegeben für HK",20],
["In Teillastbetrieb für TWW",40],
["In Teillastbetrieb für HK",50],
["In Betrieb für Trinkwasser",90],
["In Betrieb für Heizkreis",100],
);

sub trim() {
my $str = $_[0];
$str =~ s/^\s+|\s+$//g;
return $str;
};

print "DEBUG ozw672: *** Script starting ***\n" if($debuglevel>0);

my $ua=LWP::UserAgent->new;
my $request=HTTP::Request->new(GET=>'https://'.$ozw672host.'/api/auth/login.json?user='.$ozw672username.'&pwd='.$ozw672password);
my $response=$ua->request($request);
my $decoded=decode_json($response->content);
my $success=$decoded->{'Result'}{'Success'};
my $sessionid=$decoded->{'SessionId'};

print "DEBUG ozw672: ".$response->content."\n" if($debuglevel>4);
print "DEBUG ozw672: ".$success."\n" if($debuglevel>4);

my $i=0;
my $j=0;
my $parameterid;
my $dataValue;
my $rightnow;

my $dblogdb = DBI->connect("DBI:mysql:database=$dblogname;host=$dbloghost;port=$dblogport","$dblogusername","$dblogpassword");
my $dblogquery = $dblogdb->prepare('SELECT * FROM current');
$dblogquery->execute() or die $dblogquery->err_str;

while (defined($parameterlist[$i][0])) {
$parameterid=$parameterlist[$i][0];
$request=HTTP::Request->new(GET=>'https://'.$ozw672host.'/api/menutree/read_datapoint.json?SessionId='.$sessionid.'&Id='.$parameterid);
$response=$ua->request($request);
$decoded=JSON->new->utf8->decode($response->content);
$success=$decoded->{'Result'}{'Success'};
$dataValue=encode('UTF-8', $decoded->{'Data'}{'Value'});
$parameterlist[$i][3]=&trim($dataValue);

if ($parameterlist[$i][0]==$parameterstatuskessel) {
$j=0;
while (defined($statuskesselmatrix[$j][0])) {
if ($statuskesselmatrix[$j][0] eq $parameterlist[$i][3]) {
$parameterlist[$i][3]=$statuskesselmatrix[$j][1];
print "DEBUG ozw672: Substituting text of statusKessel\n" if($debuglevel>0);
};
$j++;
}
}

print "DEBUG ozw672: ".$response->content."\n" if($debuglevel>4);
print "DEBUG ozw672: ".$success."\n" if($debuglevel>4);
print "DEBUG ozw672: ".$parameterlist[$i][2]."=".$parameterlist[$i][3]."\n" if($debuglevel>0);

$rightnow=localtime->strftime('%Y-%m-%d %H:%M:%S');
$dblogquery = "INSERT INTO history (TIMESTAMP,DEVICE,TYPE,EVENT,READING,VALUE,UNIT) VALUES ('$rightnow','$device','$type','$parameterlist[$i][2]: $parameterlist[$i][3]','$parameterlist[$i][2]','$parameterlist[$i][3]','');";
$dblogdb->do($dblogquery);
print $dblogquery."\n" if($debuglevel>4);


$i++;
}

$dblogdb->disconnect();
print "DEBUG ozw672: *** Script ended ***\n\n" if($debuglevel>0);


Stichworte: ozw672, (vllt auch analog ozw772 ?), Siemens Webserver, OEM Webserver, Interdomo Domostar, Brötje Ecotherm WGB-S, Elco Thision L, Viessmann Vitotwin, Siemens Regelung

[EDIT, 20.02.2015: So, geht dank Stefan nun auch direkt in FHEM: lest hier und hier]
- FHEMs in VM @ Mac mini & RPi, fhem2fhem
- Homematic, 1wire, Hue & Lightify & Tradfri & Xiaomi & Oblo via zigbee2mqtt/Conbee II, Rademacher DuoFern, Roto i8 & Hunter Ventile via HM-LC-Sw4-DR
- Interdomo GBK (via Siemens ozw672; dank HTTPMOD, lest Post #33765)
- homebridge(-fhem), Grafana, DBLog

pappn

Auch wenn es nicht viele FHEM user mit OZW672 zu geben scheint; hulzer hat das skript in ein Modul gepackt. Damit gibt es eine zusätzliche alternative. => 99_OZW672.pm

Von meiner Seite aus auf jeden Fall ein großes Danke an Lanhydrock und hulzer. Ihr habt mir sehr geholfen.

Pappn
"When all else fails, read the instructions."

CUL868, RFXTFX433 und CCU3
FS20, S300TH, UNIRoll, Homematic IP, OZW672, diverse HOMEEASY, IT kompatible und China Zeugs

pappn

#2
Auslesen der Werte klappt stabil und zuverlässig.
Allerdings wollte ich auch Einstellungen der Heizung direkt aus FHEM heraus ändern, ohne den Weg über das WebInterface des OZW672 gehen zu müssen. Nach einigem Probieren habe ich den richtigen URL Aufruf ermittelt und per HTTPMOD set definiert.

attr ozw672 set01Name Trinkwasserbetrieb
attr ozw672 set01Map 0:Aus,1:Ein
attr ozw672 set01URL https://192.168.178.42/api/menutree/write_datapoint.json?SessionId=$sid&Id=898&Type=Enumeration&Value=$val
attr ozw672 set02Name Heizkreisbetriebsart
attr ozw672 set02Map 1:Automatik,2:Reduziert
attr ozw672 set02URL https://192.168.178.42/api/menutree/write_datapoint.json?SessionId=$sid&Id=860&Type=Enumeration&Value=$val

Das Umschalten der Betriebsarten klappt damit zuverlässig direkt aus FHEM.
set ozw672 Trinkwasserbetrieb Aus
Vielleicht hilft die Info ja jemandem weiter.

Pappn
"When all else fails, read the instructions."

CUL868, RFXTFX433 und CCU3
FS20, S300TH, UNIRoll, Homematic IP, OZW672, diverse HOMEEASY, IT kompatible und China Zeugs

simone

@lanhyrock
Danke fuers teilen

@pappn
Danke fuer die info, habe mir heute den ozw672 bestellt und bin gespannt. Darf ich fragen Mit welchem Kabel du deine Heizung verbunden hast? Ich konnte kein spezielles lpb kabel finden.

mit welcher version laeuft bei dir der ozw672?

Ich moechte im ersten schritt das skript verwenden um die daten in eine db zu schreiben, da ich aktuell kein fhem im einsatz habe.

Gruss simone

pappn

Der OZW672 läuft mit Firmware 5.20. Version 6.00 ist gerade rausgekommen. Ich weiß noch nicht, ob ich die draufspiele.

Die Heizung ist per geschirmten Telefonkabel, wie es in der Hausinstallation verwendet wird, an den OZW angeschlossen. In Prinzip brauchst du nur ein Kabel mit 2 Adern. Der OZW ist dann per LAN Kabel über einen WLAN Repeater ins Netz integriert.

Pappn
"When all else fails, read the instructions."

CUL868, RFXTFX433 und CCU3
FS20, S300TH, UNIRoll, Homematic IP, OZW672, diverse HOMEEASY, IT kompatible und China Zeugs

simone

Danke dann sollte ein knx kabel auch funktionieren, irgendwo hatte ich gelesen 1,5 qmm und ueber google habe ich kein spezielles LPB Kabel gefunden

Mein ozw672 ist auch gekommen mit der version 5.2, werde dann vorerst auch nicht updaten.

Ich habe heute die Einheit in der Heizung angeschaut und auch Bezeichnungen  mit CL+ und CL- gefunden leider fehlt der passende stecker.

Hast du auch ein broetje heizung? Kennst du zufaellig die Bezeichnung des Steckers oder hast du es aussen an der servicebuchse angeschlossen?

Gruss simone

Ronimo

pappn,

Ich habe deinen URL getestet und das functionier für enum typen. Aber wenn ich den temperatuur setze wollen gibt es ein error. "Data type not supported" ( "Result": { "Success": "false", "Error": { "Txt": "datatype not supported", "Nr": "8" } } } ).
Ich habe schon viele typen versucht (Real, Int, Short, Long, ...) aber immer den selben error.

Wissen sie was den Type variablen sein sollte fur die Temperatur?

Fielen dank und entschuldigung für mein schlechtes deutsch.

pappn

Zitat von: Ronimo am 03 Januar 2016, 15:43:39
Wissen sie was den Type variablen sein sollte fur die Temperatur?

Das Deutsch ist doch völlig ausreichend. Keine Sorge.
Der Typ sollte zuerst über ein "get" des Datenpunktes abgefragt werden. Als Ergebnis wird auch der VariablenTyp angezeigt.

Beispiel:
Abfrage der Raumtemperatur Komfortsollwert Heizkreis 1 = DataPoint 861
https://xxx.xxx.xxx.xxx/api/menutree/read_datapoint.json?SessionId=$sid&Id=861 Result:
{
"Data":
{

"Type": "Numeric",
"Value": "       21.0",
"Unit": "°C"

},
    "Result":
{
"Success": "true"
    }
}

=> DataTyp = "Numeric"

Resulting URL für set ist dann:
https://xxx.xxx.xxx.xxx/api/menutree/write_datapoint.json?SessionId=$sid&Id=861&Type=Numeric&Value=$val

Hope this helps....
"When all else fails, read the instructions."

CUL868, RFXTFX433 und CCU3
FS20, S300TH, UNIRoll, Homematic IP, OZW672, diverse HOMEEASY, IT kompatible und China Zeugs

pappn

Zitat von: simone am 02 Januar 2016, 14:16:17
Ich habe heute die Einheit in der Heizung angeschaut und auch Bezeichnungen  mit CL+ und CL- gefunden leider fehlt der passende stecker.

Hast du auch ein broetje heizung? Kennst du zufaellig die Bezeichnung des Steckers oder hast du es aussen an der servicebuchse angeschlossen?
Der Anschluß kann über CL+/Cl- (BSB) oder MB/DB (LPB) erfolgen. Ich habe den OZW an MB/DB also LPB angeschlossen. An diesem Anschluß war auch bereits ein Anschlußstecker vorhanden, den ich nutzen konnte. Es gibt mehrere CL+/CL- Anschlüsse, die aber teilweise für Raumgeräte vorgesehen sind. Ob der OZW an einem dieser Raumgeräte Anschlüsse vollständig funktioniert, kann ich nicht sagen. Bei mir ist nur einer als BSB ausgewiesen.
Ich habe eine Brötje Novocondens BOB20. Die genaue Belegung aller Kontakte der ISR Steuerung findest du im Installationshandbuch der Heizung, das dir dein Heizungsbauer sicher dagelassen hat.
"When all else fails, read the instructions."

CUL868, RFXTFX433 und CCU3
FS20, S300TH, UNIRoll, Homematic IP, OZW672, diverse HOMEEASY, IT kompatible und China Zeugs

simone

Hi,

bei mir hat das anschliessen an eine broetje ecotherm auch mit dem passenden Stecker geklappt.

Falls es jemand hilft

Broetje stecker raumgeraet ISR - 627528

Werde jetzt das skript testen

Danke




leuschman

Hallo,

ich versuche mein OZW672 über FHEM zeitlich zu synchronisieren.
Dabei muss ich Datum und Uhrzeit im Datentyp "DateTime" an das OZW übertragen.
Wenn ich den Datentyp abfrage, erhalte ich entsprechend auch das Value vom Parameter:

http://192.168.178.5/api/menutree/read_datapoint.json?SessionId=1fc6d9da-7b5b-4555-895e-5b76996dfed1&Id=7


Antwort:
{
"Data":
{

"Type": "DateTime",
"Value": "19. April 2016 17:06",
"Unit": ""

},
    "Result":
{
"Success": "true"
    }
}


Versuche ich nun mit gleichem Value zurück zu schreiben misslingt dies:

http://192.168.178.5/api/menutree/write_datapoint.json?SessionId=1fc6d9da-7b5b-4555-895e-5b76996dfed1&Id=7&Type=DateTime&Value=19.%20April%202016%2017:32


Antwort:

{
    "Result": {
"Success": "false",
"Error": {
"Txt": "value not valid",
"Nr": "9"
}
}
}


Irgend welche Ideen, wie das Datum und Uhrzeitformat aussehen muss?

Gruss
Leuschman




rabbur

Vielen Dank an Lanhydrock für sein API Script! Dies hat mir sehr geholfen.

Jetzt fehlt mir noch ein zu /api/menutree/write_datapoint analoger Write-Aufruf für *Kollektorstartfunktion* und *Kollektorstartfunktion Gradient". Im Web API gibt es eine Checkbox, ob die Funktion eingeschalten ist oder nicht, und falls ein, so wird der Gradient gesetzt. Die json API Abfrage liefert zwar ein Type Numeric, man kann aber den Gradienten mit der write_datapoint Funktion nicht setzen (der Returnwert ist zwar 200 Success, wird aber nicht übernommen).

http://192.168.86.11/api/menutree/read_datapoint.json?SessionId=3d2ea638-9e49-4f3e-9f09-04e4e688a6b1&Id=532

{
"Data":
{

"Type": "Numeric",
"Value": "         5",
"Unit": "min\/°C"

},

            "Result":

{
"Success": "true"
                    }
}


Hintergrund: Ich habe Röhrenkollektoren. Im Sommer benötige ich die Kollektorstart Funktion. Diese tut aber auch schlechtes, weil sie unnötig die Pumpen anwirft und Wärme aus dem Tank in die Panels transferiert.  Genauer: Ich habe zwei Felder, eines mit Flach- und eines mit Röhrenkollektoren. Im Sommer, wenn der 4000 Liter Speicher > 70 ° ist und die Flachkollektoren am Mittag stärker besonnt werden,  liefert der Temperatursensor nichts schlaues. Womöglich läuft das Wasser trotz Rücklaufventilen ein wenig rückwärts und die Vorlauftemperatur geht gegen 100°, ohne das die Pumpen anspringen. Mit der Kollektorstartfunktion kann das Problem ein wenig behoben werden. Leider scheint diese Funktion aber auch am Morgen und spät Abends noch die Pumpen anzuwerfen, so dass ich die Funktion um 11 Uhr in Betrieb nehme und um 17 Uhr abschalte, resp. je Monat modifiziere. Ansonsten kann man recht viel Energie verlieren, weil mit dem Anschalten warmes Wasser hinaufgepumpt wird.

PS: Das obige Script benötige ich, um die Rückkühltemperatur abends um 20 Uhr gemäss der Wettervorhersage vom nächsten Tag zu modizfizieren (Sonnenstunden und UV-Index). Auch stelle ich die Pumpen immer wieder ab und an, weil die Pumpen sonst die halbe Nacht lang kontinuierlich laufen. Ein Intervall bei der Rückkühlung spart aber viel Strom und erreicht das Ziel genauso. Ich kann dies bei Interesse gerne mal erläutern. http://www.asdfg-it.ch/Fluh86/heute/

Für  eine API Aufruf bin ich also sehr dankbar!
Rainer

BKSolo

Ich habe erfolgreich den ozw672 Web-Server, der verbunden mit einem Wärmepumpenregler RVS61.843 ist, in Fhem integriert.

Dank den Beiträgen von Stefan Strobel und Lanhydrock ging es sehr gut.

Kann, wenn gewünscht, die Fhem Config weitergeben.  Hatte nur geringe Anpassungen vorgenommen und LogFile und SVG-Plots erstellt.





Raspberry PI 2/3 - CUL-433(V3) - CUL-868 (V3) - Jeelink 868 - 433 S/E Eigenbau
TX29DTH-IT - FHT80B - FHT80TF - FS20KSE
FHEMobile 3.7r803 - Fhem2Fhem - Alpha2 - OZW672 - TelegramBot

rdeckard

Hallo Zusammen
Auch wenn ich nichts mit FHEM zu tun habe, möchte ich mich für diese tollen Infos hier bezüglich API mit einem OZW672 Webserver bedanken!

Ich habe heute den OZW672 erhalten und von einem Heizungsmonteur mit meiner Elco Wärmepumpe (Siemens RVS-Steuerung) verbinden lassen. (Hätte es vermutlich auch selber machen können.)
Es funktioniert alles einwandfrei und ich konnte bereits meine ersten Tests mit dem API durchführen. Ich verwende PHP, weil ich daraus später ein Logikbaustein für meine Visu (Edomi) erstellen möchte.

Kleine Frage, die vielleicht der eine oder andere OZW672-Besitzer beantworten kann:
Kann man die Firmware des OZW672 auch downgraden?

Mein Exemplar hat noch die Firmware 6.0 und seit Juli ist ja Version 7.0 draussen. Ich habe die Firmware-Files und das Update-Tool runtergeladen und mich in die Anleitungen eingelesen. Alles kein grosses Problem. Nur ein kleiner Hinweis hat mich dann stutzig gemacht:
Achtung, betrifft OZW672 an Wärmepumpen, Kessel und Regler (OEM spezifisch, nicht Siemens Standard):
Unter Umständen wird ein Erzeuger resp. dessen Regler nach dem Update auf Version 7 nicht mehr unterstützt. Bevor Sie ein Update auf Version 7 durchführen, nehmen Sie bitte Kontakt mit dem betreffenden Gerätehersteller auf, um die Kompatibilität sicherzustellen.


Und in der aktuellen Kompatibilitätsliste ist meine Steuerung (RVS61.843/540) nicht mehr aufgeführt. Nur welche mit RVS61.843/109.
Falls ich auf Version 7.0 upgrade und es geht nicht, muss ich natürlich wieder auf v6.0 downgraden können. Ich vermute, dass es geht, aber ich hatte schon Geräte, bei denen dies dann nicht mehr möglich war. Und das wäre dann natürlich weniger gut. :-\

Danke und Gruss

rdeckard

Möchte nochmals nachfragen.

Weiss niemand, ob man die Firmware des OZW672 Webservers im Notfall downgraden kann? (von Version 7 auf 6)