Viessmann VitoConnect API

Begonnen von ritschi, 22 März 2018, 06:53:24

Vorheriges Thema - Nächstes Thema

renardfm

In meiner angehängten viessmann.php werden die Starts ausgegeben.. bzw Brenner=0, Brenner=1 ... leider nicht die Stufe..


Zitat von: renardfm am 15 September 2018, 22:38:57
Ich versuche mal meinen Weg darzustellen - mit dem ich wieder (bis auf die Abgastemperatur und Speicher/ Heizungspumpe) alle Werte zur Verfügung habe.

1. php-Skript bearbeiten (User und Passwort der Vicare-App) eintragen. PHP Skript siehe Anhang. Ist die Basisversion aus dem Jeedom Forum.
2. php-Skript in den fhem-Ordner einfügen (oder copy& paste mit "sudo nano viessmann.php" in eine neue Daten einfügen)
3. viessmann.php ausführbar machen (sudo chmod +x viessmann.php)
4. fhem user zuweisen! (sudo chown fhem viessmann.php)
5. jetzt kann man diese datei mal über Kommandozeile/ssh testweise ausführen "sudo php viessmann.php" ... oder "sudo php /opt/fhem/viessmann.php"
    Man sollte jetzt einige Rückgabewerte bekommen.

Verknüpfung mit FHEM:
1. Dummy anlegen (bei mir Vicare300c, da ich einen Vitoladens300c) habe.
2. mittels at-Befehl in gewünschtem Interval die php-Datei ausführen lassen.
    Hier gab es für mich eine kleine Hürde. Wir brauchen ja die Ausgabe des perl-Skriptes. Diese Strings sollen in einen Dummy geschrieben werden. Damit lässt sich dann weiterarbeiten.
    Der Aufruf der PHP-Datei MIT Rückgabewerte über die Perl-Funktion system() läuft blocking. D.h. FHEM reagiert in der Zeit nicht.. ziemlich blöd.
    die non-blocking qx() funktion liefert aber keinen Rückgabewert, bzw. der steht dann nur im FHEM-Logfile, und da habe ich es nicht extrahieren können.
    Die Lösung ist mittels fhem-Funktion "systemCommand". Man muss das Modul noch in myUtils.pm kopieren.
    Damit habe ich dann also in fhem erstellt:
            define fetchVicare at +*00:02:00 {systemCommand('/opt/fhem/viessmann.php','Vicare300c rawData')}
    Die Rückgabewerte der php-Datei werden in das Reading "rawData" des Dummys "Vicare300x" geschrieben. Das ergibt dann so einen Inhalt:
rawData
Installation=xxx\Gateway=xxx\Aussentemperatur=15.3\Kesseltemperatur=57\supply_temperatur=57\room_temperatur=20\Solltemperatur_normal=22\Solltemperatur_reduziert=17\Speicher-Solltemperatur=58\Speicher-Isttemperatur=57.8\Betriebsart=dhw\Brennerzustand=ok\ErrorCode=0\Programmstatus=standby\Heizkurve_Niveau=4\Heizkurve_Steigung=1.4\Brenner=0\

3. Damit man einzelne Readings bekommt muss man das Attribut userReadings mit z.B. folgendem Inhalt anlegen
vicare_aussentemperatur {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Aussentemperatur=(\d+\.\d)/; return $1}, vicare_Kesseltemperatur {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Kesseltemperatur=(\d+\.?\d?)/; return $1}, vicare_Speicher-Isttemperatur {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Speicher-Isttemperatur=(\d+\.?\d?)/; return $1}, vicare_Speicher-Solltemperatur {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Speicher-Solltemperatur=(\d+\.?\d?)/; return $1}, vicare_Programmstatus {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Programmstatus=(normal|standby|reduced)/; return $1}, state {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Programmstatus=(normal|standby)/; return $1}, vicare_Solltemperatur-normal {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Solltemperatur_normal=(\d+\.?\d?)/; return $1}, vicare_Betriebsart {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Betriebsart=(dhw|forcedReduced|forcedNormal|dhwAndHeating)/; return $1}, vicare_Heizkurve_Niveau {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Heizkurve_Niveau=(\d+)/; return $1}, vicare_Heizkurve_Steigung {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Heizkurve_Steigung=(\d+\.\d)/; return $1}, Speichertemperatur_gerundet {sprintf("%.0f",ReadingsVal("Vicare300c","vicare_Speicher-Isttemperatur",0))}, vicare_Brenner {my $v= ReadingsVal("Vicare300c","rawData","0"); $v=~ /Brenner=(\d+)/; return $1}
4. Jetzt noch das Attribut stateFormat setzen mit Inhalt:
Speicher: vicare_Speicher-Isttemperatur °C,
Status: vicare_Programmstatus,
Flamme: vicare_Brenner


... jetzt lassen sich auch wieder schöne DOIFs und Plots generieren...

demnächst schreibe ich noch etwas zu den bash-Skripten, mit denen man die verschiedenen Modi und Temperaturen der Heizung mittels FHEM steuern kann.
Ich möchte damit versuchsweise meine Heizkurve selbständig adaptieren lassen, da man diese auch auslesen und verändern kann. Es ist ja quasi über Soll-Ist Temperatur-Deltas und Aktorpositionen erfassbar, ob die Vorlauftemperatur ausreicht oder zu gering/hoch ist. In Kombination mit der Aussentemperatur kann der Algorithmus dann entscheiden, ob Niveau, Steigung oder beides angepasst wird. Weiterhin soll die Wettervorhersage und Abwesenheit berücksichtigt werden...


btw. client-ID und client-Secret ist wohl immer gleich (das ließ sich über mitm-Attack rausfinden. Ich konnte es nicht nachvollziehen, musste die Werte aber auch nicht ändern.) Es reicht im php-Skript User und Passwort am Anfang zwischen die '' zu ergänzen.


edit: ich finde den Foren-Eintrag zur systemCommand Funktion nicht mehr , die man in die myUtils.pm kopieren muss.
    Hier der Auszug. Das stammt nicht von mir!!
sub systemCommand($;$) {

    my ($command, $reading) = @_;
$command = encode_base64($command,"");
$reading //= 0;
$reading = encode_base64($reading,"");
$command .= "|".$reading;
    my $hash = $defs{$command};
   
    Log3 "SystemCommand", 4, "Sub systemCommand - START: $command";   
BlockingKill($hash->{helper}{RUNNING_PID}) if(defined($hash->{helper}{RUNNING_PID}));
    $hash->{helper}{RUNNING_PID} = BlockingCall("systemCommand_Run", $command, "systemCommand_Done", 60, "systemCommand_Aborted", $hash) unless(exists($hash->{helper}{RUNNING_PID}));
    Log3 "SystemCommand", 4, "Sub systemCommand - START BLOCKING CALL - $command";
}

sub systemCommand_Run($) {

    my ($string) = @_;
    my ( $command, $reading ) = split("\\|", $string);
    my $result;
   
    Log3 "SystemCommand", 4, "Sub systemCommand - BEGIN SystemCommand: $command";
my $cmd = decode_base64($command);
$result = qx($cmd);
Log3 "SystemCommand", 4, "Sub systemCommand - END SystemCommand: $command, Result: $result";   
    if (!$result) {
$result = 0;
}
    $result = encode_base64($result,"");
    return "$command|$reading|$result";
}

sub systemCommand_Done($) {

    my ($string) = @_;
    my @a = split("\\|",$string);
    my $hash = $defs{$a[0]};
    my $name = $hash->{NAME};
    my $reading = $a[1];
my $result = $a[2];   
   
    delete($hash->{helper}{RUNNING_PID});
   
    Log3 "SystemCommand", 3, "Sub systemCommand_Done - $name) - Der Helper ist disabled. Daher wird hier abgebrochen" if($hash->{helper}{DISABLED});
    return if($hash->{helper}{DISABLED});
   
    $reading = decode_base64($reading);
if ($reading) {
if ((split(" ",$reading)) == 2 && $defs{(split(" ",$reading))[0]}) {
$result = decode_base64($result);
# add slashes at the end of lines for valid multiline readings
$result =~ s/\n/\\/g;
# $result =~ /(Sender:\s)(\+\d*)\s/;
fhem "setreading " . (split("\\|",$reading))[0] . " " . (split("\\|",$reading))[1] . " " . $result;
Log3 "SystemCommand", 4, "Sub systemCommand_Done - Result: $result, Reading: $reading";
} else {
Log3 "SystemCommand", 3, "Sub systemCommand_Done ERROR - device reading '$reading' not valid or device does not exist. Use setreading syntax like 'Device MyReading'";
}
} elsif ($result) {
Log3 "SystemCommand", 4, "Sub systemCommand_Done INFO - existing system command result has been ignored because you did not specify a device reading.";
}
       
}

sub systemCommand_Aborted($) {

    my ($hash) = @_;
    my $name = $hash->{NAME};

    delete($hash->{helper}{RUNNING_PID});
    Log3 "SystemCommand", 3, "Sub systemCommand_Aborted - $name - The BlockingCall Process terminated unexpectedly. Timedout.";
}


Frini

#76
Hallo,
ich zähle die Rückmeldung aus der PHP vicare_Brenner mit HourCounter und schreibe mir nachts um 23:59 via at die CountsPerDay in ein Reading im  Hauptdummy. So habe ich die aktuellen Brennerstarts pro Tag und die GesamtBrennerstarts im Log und kann diese im Plot visualisieren.

Ich habe leider auch noch keine Möglichkeit gefunden die Modulation zu finden und ähnlich auch die Pumpenleistung. Wird aber mit geffeature auch nicht von der Heizung übermittelt. Ich denke, da müssen wir auf Viessmann warten. Die werden hoffentlich im 4. Quartal die Vicare App updaten. Ich hoffe wirklich, dass da neue Funktionen dazukommen.
Warmwassereinmalladung wäre für mich wirklich hilfreich, genau wie die Verbräuche/Brennerleistung.

Ich habe es übrigens geschafft die Schedules auszulesen. Allerdings bin ich bisher zu blöd diese Ausgabe so aufzubereiten, dass ich damit Readings in FHEM füllen kann.
"mon":[{"start":"05:00","end":"07:00","mode":"normal","position":0},{"start":"05:00","end":"07:00","mode":"normal","position":1},{"start":"05:00","end":"07:00","mode":"normal","position":2}],"tue":[{"start":"05:00","end":"07:00","mode":"normal","position":0}],"wen":[{"start":"05:00","end":"07:00","mode":"normal","position":0}],"thu":[{"start":"05:00","end":"07:00","mode":"normal","position":0},{"start":"11:00","end":"13:00","mode":"normal","position":1},{"start":"16:00","end":"22:00","mode":"normal","position":2}],"fri":[{"start":"05:00","end":"07:00","mode":"normal","position":0}],"sat":[{"start":"05:00","end":"07:00","mode":"normal","position":0}],"sun":[{"start":"05:00","end":"07:00","mode":"normal","position":0}],

Ich möchte im ersten Step die Zeitpläne visualieren und dann darüber Abfragen laufen lassen.

onkeloki

Zitat von: renardfm am 05 Oktober 2018, 11:12:03
In meiner angehängten viessmann.php werden die Starts ausgegeben.. bzw Brenner=0, Brenner=1 ... leider nicht die Stufe..

Brenner=1 und Brenner=0 bekomme ich auch.
ich suche
BrennerStarts 15080
BrennerStartsDayStart 15080.00
BrennerStartsLastDay0
BrennerStartsToday 0.00

wenn man mit dem optischen sensor direkt an den kessel geht kann das fhem viessmann modul die brennerstarts auslesen
ich glaube die vicare api kann das nicht (gibt es in der offiziellen app auch nicht)

Brenner=1 und Brenner=0... bedeutet glaube ich nur ob die heizung generell an oder aus ist
ich glaube der wechsel während des betriebes nicht von 1 auf 0.. (ich teste das mal)

renardfm

Ok..
Ja das Brenner=1 .. an und Brenner=0 .. aus habe ich so gemacht um zu sehen wie die Taktung ist. War ein wenig kniffelig, da der Datentyp Boolean ist. Die Vicare App hat leider einige Werte nicht, egal ob sie angezeigt werden oder nicht. Ich hoffe da kommt demnächst noch was.


Frini

Ich hab mich mal vor die Heizung gesetzt und beobachtet Brenner =1 ist der Brennerzustand also an oder aus. Mit dem HiurCounter kannst du dir die Readings selber erzeugen. Klar wäre das schöner direkt aus der Heizung. Aber mal gucken. Viessmann hat für Q4 2018 und Q1 2019 weitere Funktionen für die App zugesagt.

Habt ihr eine Idee, wie man eine Einmalladung für das Warmwasser generieren könnte?

onkeloki

jop habe mir gerade auch einen notify gebaut der triggert wenn sich brenner ändert.
ich gucke mir mal
an, danke..
ich würde jetzt auch ein file log erzeugen und dann ein plot .. da kann man glaube ich auch die summe von mehreren einträgen anzeigen lassen

Frini

So sieht das bei mir aktuell aus.
Das erste ist nen TemperaturenPlot um die Anlage näher kennen zu lernen. Ist ja noch neu und muss noch eingestellt/ optimiert werden.
Das zweite sind die Brennerstars pro Tag.


onkeloki

kannst du mir sagen wie du das zweite chart realisiert hast?
das erste sieht bei mir ganz ähnlich aus habe noch einen rücklauf und einen  innen temparatur sensor

Frini

Ich schreibe jeden abend um 23:59 die Brennerstarts aus dem CountsperDay Reading in mein Vitodens device namens Brennerstarts Vortag.
Das Reading Brennerstarts wird normal im FileLog mit den anderen Temperaturen gespeichert.

Ich erzeuge ein Filelog nur mit den BrennerstartsVortag.
Folgende Attribute habe ich gesetzt:
fixedrange: month
plotsize: 1400,300

Die Datenlinien werden als bars mit l1fill dargestellt.
Die Skala habe ich auf 30 meine ich begrenzt. Alles darüber möchte ich eh nicht sehen.

Sorry, für die ungenauen Angaben, sitze gerade auf der Arbeit. Kann Dir wenn benötigt heute Abend noch mal den Code schicken.

Aktuell ist es so, dass ich die BrennerstartsVortag zusammen mit den anderen Daten alle 2 Minuten in das Filelog schreibe. Das kann man natürlich auch noch ändern und in einen seperaten Log schreiben.




tnt99

Hallo zusammen,

erst einmal großes Lob für das PHP-API. Es funktioniert sehr gut, aber etwas ganz entscheidendes fehlt mir noch. Ich habe einen Vitoligno, also einen Holzvergaser mit Pufferspeichern.
Ich muss den Brenner starten, wenn die Temperatur der Pufferspeicher unter einen gewissen Wert sinkt.

Daher ist es für mich ganz entscheidend, die IST-Temperatur der Pufferspeicher abzufragen. Weiß jemand, ob - und mit welchem "feature" das möglich ist??


Viele Grüße,

Sebastian

Frini

Ich habe eine getfeature Abfrage ein paar Post weiter vorne hochgeladen.
Das versuch bei Dir auch mal, dann dürftest Du die Adressen sehen, welche in Deiner Heizung verfügbar sind.

thetrueavatar

#86
Zitat von: tnt99 am 08 Oktober 2018, 11:07:11
Hallo zusammen,

erst einmal großes Lob für das PHP-API. Es funktioniert sehr gut, aber etwas ganz entscheidendes fehlt mir noch. Ich habe einen Vitoligno, also einen Holzvergaser mit Pufferspeichern.
Ich muss den Brenner starten, wenn die Temperatur der Pufferspeicher unter einen gewissen Wert sinkt.

Daher ist es für mich ganz entscheidend, die IST-Temperatur der Pufferspeicher abzufragen. Weiß jemand, ob - und mit welchem "feature" das möglich ist??


Viele Grüße,

Sebastian
Hello. Just to tell you I have update the wiki to provide a list of feature that I have found by decompiling ViCare App. Most of them are already use by my API but due to limitation of my device some are not available while testing such as     heating.dhw.sensors.temperature.hotWaterStorage
https://github.com/thetrueavatar/Viessmann-Api/wiki/English

I have also done some update to be able to use different circuit number and deviceId such as show hereby:

<?php
include __DIR__.'/../index.php';
use 
Viessmann\API\ViessmannAPI;
$credentials file(__DIR__."/credentials.properties");
$params = [
    
"user" => trim("$credentials[0]""\n"),
    
"pwd" => trim("$credentials[1]""\n"),
    
"deviceId" => "0",
    
"circuitId"=>"4"
];
$viessmannApi = new ViessmannAPI($params);



<?php
include __DIR__.'/bootstrap.php';
echo 
"Active mode for default circuit: ".$viessmannApi->getActiveMode()."\n";// will use circuit 4 such as defined in bootstrap.php
echo "Active mode for given circuit(1): ".$viessmannApi->getActiveMode(1);//will overwritte bootstrap value by value given on method call(1 here);


tnt99

Hallo Frini und thetrueavatar,

ich habe alle möglichen Features durchprobiert.
Die Liste aus https://github.com/thetrueavatar/Viessmann-Api/wiki/English und getfeature Abfrage von Frini.

Leider habe ich nichts gefunden, was die Pufferspeicher-Temperatur ausgibt :-(

Hat schon mal jemand versucht, einen Paketmitschnitt des Vitoconnect zu machen um zu sehen, welche Daten denn hochgeladen werden?

thetrueavatar

I have done a support request on Viessmann Belgium about missing data. They didn't help me but gave me a interesting information. Deployment in Augustus was of the new service was a mistake. That's why ViCare application wasn't ready to display data of the service. They plan to fix things on version 2.0.5 of the version. My guess is hat they will update service too so that currently missing information are provided. I'm currently unable to get some data(hotstorage water temp, ...) with the new service but data is still available with the very old one use by Vitotrol Plus. I guess we will have to wait...

onkeloki

seit 16:30 geht "getActiveProgram" nicht mehr bei mir