Viessmann VitoConnect API

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

Vorheriges Thema - Nächstes Thema

Frini

Datei habe ich erstellt.
Hier mal die Eingaben:

pi@raspberrypi:/opt/fhem $ php -f test.php
-bash: /usr/bin/php: /usr/bin/php^M: bad interpreter: No such file or directory



pi@raspberrypi:/opt/fhem $ sudo php -f test.php
sudo: unable to execute /usr/bin/php: No such file or directory


pi@raspberrypi:/opt/fhem $ php -v
-bash: /usr/bin/php: /usr/bin/php^M: bad interpreter: No such file or directory



pi@raspberrypi:/opt/fhem $ sudo php -v
sudo: unable to execute /usr/bin/php: No such file or directory


Also ich habe kein Verzeichnis usr/bin

onkeloki

hast du php überhaupt installiert?
entweder:
which php

bzw hast du eine auto vervollständigung auf php? ..
also tippe ph und dann 2mal schnell TAB-Taste..

das verzeichnis  /usr/bin/ hat man immer sonst würde sehr viel nicht gehen, ist ja quasi der "programme" ordner ..
php da drin ist eigentlich eine verknüpfung (symbolische link)

ls -la /usr/bin/

oder mal mit sudo proboeren

Frini

ph mit doppelt tab ergibt:
pi@raspberrypi:/opt/fhem $ ph
phar          phar.phar     php           phpdismod     phpquery
phar7.0       phar.phar7.0  php7.0        phpenmod

Ich habe es geschafft.
mit dem aufruf php7.0 viessmann.php kann ich unter putty auf die Heizung zugreifen  ;D
pi@raspberrypi:/opt/fhem $ php7.0 viessmann.php
.#!/usr/bin/php
Installation=XXXXXXXXXXX
Gateway=XXXXXXXXXXXXXXXXXX
Aussentemperatur=8.7
Kesseltemperatur=32.5
supply_temperatur=32.5
PHP Notice:  Undefined index: value in /opt/fhem/viessmann.php on line 66
room_temperatur=
Solltemperatur_normal=20
Solltemperatur_reduziert=16
Speicher-Solltemperatur=55
Speicher-Isttemperatur=47.7
Betriebsart=dhwAndHeating
Brennerzustand=ok
ErrorCode=0
Programmstatus=normal
Heizkurve_Niveau=0
Heizkurve_Steigung=0.8
Brenner=1

Habe jetzt das at in fhem auf
+*00:02:00 {systemCommand('php7.0 /opt/fhem/viessmann.php','dum.Vitodens rawData')} abgeändert und siehe da, es funktioniert.
Verstehen tue ich das nicht.

renardfm

Super.. dann viel Spass damit.   ;D

Frini

Danke.
Bin schon dabei.
Ich habe meine FBH mit einem Mischer eingebunden. Habe also 2 Heizkreise in der Steuerung.

Falls es noch nicht bekann ist,
die 0 hinter .circuits.0.operating bezieht sich auf den HK1

$resource = getResource($access_token, "https://api.viessmann-platform.io/operational-data/installations/$installation/gateways/$gw/devices/0/features/heating.circuits.0.operating.programs.normal");

eine 1 würde sich auf den HK2 beziehen
$resource = getResource($access_token, "https://api.viessmann-platform.io/operational-data/installations/$installation/gateways/$gw/devices/0/features/heating.circuits.1.operating.programs.normal");

Jetzt einmal beobachten und dann mal gucken, ob ich eine manuelle Aufheizung des Warmwassers hinkriege.

Frini

Hallo,
ich war etwas fleißig und wollte mein vorläufiges Ergebnis mit Euch teilen.
Ich habe die php-Datei von renardfm weiter aufgebaut und an meine Situation (Vitodens 333f, Heizkreis 1 ohne Mischer, Heizkreis 2 mit Mischer, Warmwasserbereitun, keine Raumaufschaltung) angepasst.
Die Userreadings habe ich wie folgt abgeändert:
vicare_Aussentemperatur {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /Aussentemperatur=(\d+\.\d)/; return $1},
vicare_Kesseltemperatur {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /Kesseltemperatur=(\d+\.?\d?)/; return $1},
vicare_Brennerzustand {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /Brennerzustand=(ok|False)/; return $1},
vicare_Brenner {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /Brenner=(\d+)/; return $1},
Warmwasser-Isttemperatur {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /WW-Isttemperatur=(\d+\.?\d?)/; return $1},
Warmwasser-Solltemperatur {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /WW-Solltemperatur=(\d+\.?\d?)/; return $1},
HK1_Programmstatus {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK1-Programmstatus=(normal|standby|reduced)/; return $1},
HK1_Betriebsart {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK1-Betriebsart=(dhwAndHeating|forcedReduced|forcedNormal|dhw)/; return $1},
HK1_Heizkurve_Niveau {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK1-Heizkurve_Niveau=(\d+)/; return $1},
HK1_Heizkurve_Steigung {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK1-Heizkurve_Steigung=(\d+\.\d)/; return $1},
HK1_Vorlauftemperatur {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK1-Vorlauftemperatur=(\d+\.?\d?)/; return $1},
HK1_Solltemperatur-normal {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK1-Solltemperatur_normal=(\d+\.?\d?)/; return $1},
HK1_Solltemperatur-reduziert {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK1-Solltemperatur_reduziert=(\d+\.?\d?)/; return $1},
HK1_Solltemperatur-eco {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK1-Solltemperatur_eco=(\d+\.?\d?)/; return $1},
HK1_Solltemperatur-comfort {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK1-Solltemperatur_comfort=(\d+\.?\d?)/; return $1},
HK2_Programmstatus {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK2-Programmstatus=(normal|standby|reduced)/; return $1},
HK2_Betriebsart {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK2-Betriebsart=(dhwAndHeating|forcedReduced|forcedNormal|dhw)/; return $1},
HK2_Heizkurve_Niveau {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK2-Heizkurve_Niveau=(\d+)/; return $1},
HK2_Heizkurve_Steigung {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK2-Heizkurve_Steigung=(\d+\.\d)/; return $1},
HK2_Vorlauftemperatur {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK2-Vorlauftemperatur=(\d+\.?\d?)/; return $1},
HK2_Solltemperatur-normal {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK2-Solltemperatur_normal=(\d+\.?\d?)/; return $1},
HK2_Solltemperatur-reduziert {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK2-Solltemperatur_reduziert=(\d+\.?\d?)/; return $1},
HK2_Solltemperatur-eco {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK2-Solltemperatur_eco=(\d+\.?\d?)/; return $1},
HK2_Solltemperatur-comfort {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK2-Solltemperatur_comfort=(\d+\.?\d?)/; return $1},
Speichertemperatur_gerundet {sprintf("%.0f",ReadingsVal("dum.Vitodens","vicare_Warmwasser-Isttemperatur",0))},
state {my $v= ReadingsVal("dum.Vitodens","rawData","0"); $v=~ /HK1-Programmstatus=(normal|standby)/; return $1}


Die Brennerstarts tracke ich mit dem Modul HourCounter, um das Verhalten der Heizung jetzt in der beginnenden Heizperiode zu verstehen. Da die Heizung erst seit einem Monat in unserem Haus wohnt, starte ich quasi jetzt mit der Optimierung.

Folgende Werte vermisse ich noch:
Rücklauftemperatur der Heizkreise
Gasverbrauch (Könnte man anhand der Brennerleistung, und Brennerbetriebszeit errechnen)
Wochenplan Heizrkreise
Wochenplan Warmwasser
Brennerleistung
Warmwasserzirkulation

Folgende Variablen habe ich noch gefunden, welche vielleicht zu meinen fehlenden Werten passen könnten.
const HEATING_GAS_CONSUMPTION_DHW="heating.gas.consumption.dhw";
const HEATING_DWH_TEMPERATURE_OUTLET="heating.dhw.sensors.temperature.outlet";
const HEATING_DWH_SCHEDULE="heating.dhw.schedule";

Am Wochenende versuche ich dann mal den Post von thetrueavatar (Ersteller der API) umzusetzen
Eine Steuerung folgender Werte ist später mein Ziel:
manuelle Wasseraufbereitung (forcednormal)
Setzen der Solltemperatur-normal bei beiden Heizkreisen auf 22°C
Starten der Warmwasserzirkulation
Urlaubsmodus der Heizung aktivieren
Setzen der Betriebsart (dhwAndHeating|dhw)


Eine vielleicht blöde Frage hätte ich noch, welche Variante ist besser? Alles in eine PHP (Lösung von renardfm) zu packen oder mittels phar Archiv (Französische Lösung) zu arbeiten?

Ich bin tierisch froh, dass ich soweit gekommen bin. Ich hatte die Hoffnung schon aufgegeben, die Vitodens mit FHEM zu koppeln, da ich nicht bereit bin auf die 5 Jahres-Garantie zu verzichten.

Ich wünsche einen schönen Arbeitstag








thetrueavatar

Helllo,
I'm struggling with the viessmann service to get my hot storage water temperature.
I have been using the "heating.dhw.sensors.temperature.hotWaterStorage" feature but I have got a 404 meaning no data. However, data is still available with the old SOAP service used by Vitotrol Plus.
Can you tell me how do you get your hot storage water temperature ? I have got a Vitodens 300+ Vitocelle 100B.

Frini

Hi,
it could be a difference between an internal water storage and an external storage. My Vitodens 33 has an internal and I get the temperature with the below one.

Maybe something like "heating.circuits.dhw.sensors.temperature.hotWaterStorage" or "heating.circuits.0.sensors temperature.hotWaterStorage" works?

Is there a possibility to get a list of which temperatures can be requested? I am searching for te return temperature of the heating circuits.


thetrueavatar

#68
I have tried both feature but still get a 404.  :-\
Well since available data depends of the installation, what I usually do is to call the getFeatures() on my installation with my API. So that I receive a json which contains 84 feature for me. I'm using an xml editor that can display json to see what are the interesting values. I have added some screenshot so you see how does it looks. I have removed all the feature without properties(and so value) and so siren boilerplate data(links,rel)  that as no interest for us

However, by decompiling ViCare app I have see they have embedded "demo" json sample. One file per feature. I'm not sure that it's an exhaustive list of all the "feature" available.
I will add it to the github resources directory https://github.com/thetrueavatar/Viessmann-API
I will have a look to see if there is an external hot storage feature. That sould explain why some people can get their hot storage temperature while I don't

Frini

Ich habe jetzt in der Mittagspause versucht mir einmal das Heizprogramm (Schedule) heraus zu ziehen. Scheitere aber kläglich mit der Fehlermeldung string to Array conversion

[///Heizkreis1Schedule
$resource = getResource($access_token, "https://api.viessmann-platform.io/operational-data/installations/$installation/gateways/$gw/devices/0/features/heating.circuits.0.circulation.schedule");
debug_msg("resource: $resource", $debug);
//echo $resource;
$schedule = strval(json_decode($resource, true)["properties"]["entries"]["value"]);
echo "HK1-Heizkurve_Scheduletest2=$schedule\n";code]

Wenn ich das richtig verstanden habe, müsste der Schedule als Array hinterlegt sein. Hat es schon jemand geschafft?

mawi

#70
Hallo ,
könntet Ihr bitte euren entsprechenden Passagen der fhem.cfg und den 99_MyUtils  posten?
Event Monitor zeigt bei mir zwar das die Werte kommen ich kann sie jedoch nicht wirklich verwerten.
LG

Frini

#71
Hallo,
ich habe mal das Ergebnis von der GetFeature() Abfrage angehangen. Auf die Werte reduziert, wo properties und values ausgefüllt waren.
Ich habe leider nichts zur Brennerleistung, CirculationPump gefunden  :(
@thetrueavatar:
I have attached the GetFeature result. Do you think, there will be a possibility to set the schedules via php?
Hopes, that Viessmann will add more functions to the api. I am missing the burner modulation or power or pump time. With the old Vitrotol Plus this should work.

thetrueavatar

Zitat von: Frini am 01 Oktober 2018, 09:31:03
Hallo,
ich habe mal das Ergebnis von der GetFeature() Abfrage angehangen. Auf die Werte reduziert, wo properties und values ausgefüllt waren.
Ich habe leider nichts zur Brennerleistung, CirculationPump gefunden  :(
@thetrueavatar:
I have attached the GetFeature result. Do you think, there will be a possibility to set the schedules via php?
Hopes, that Viessmann will add more functions to the api. I am missing the burner modulation or power or pump time. With the old Vitrotol Plus this should work.
It's indeed possible to write and get schedule through the getJsonrawData and setJsonRawData.
Here is how to get hot water,circulation and heating schedule:

<?php
include __DIR__.'/bootstrap.php';
use 
Viessmann\API\ViessmannAPI;
echo 
"Get Hot Water schedule " $viessmannApi->getRawJsonData(ViessmannApi::HEATING_DWH_SCHEDULE). "\n";
echo 
"Get circulation schedule " $viessmannApi->getRawJsonData("heating.circuits.0.circulation.schedule"). "\n";
echo 
"Get Heating schedule " $viessmannApi->getRawJsonData("heating.circuits.0.heating.schedule");

For updating schedule you should find in the actions part of the json the data to provide to the setRawJsonData. I will add heating.circuits.0.circulation.schedule and heating.circuits.0.heating.schedule as constant.

Frini

Oh great. I see the schedule now on my raspberry.
Now I have to learn, how I can transfer the array into a readingsgroup. I just wanna see the schedules for information.  :D Thank you very much.

Do you have seen an entry about the "party mode"? I haven't found it in my getfeature() list. This should be very nice, for an manual hotwater  loading.

onkeloki

hat mittlerweile jemand was zu brennerstarts gefunden?
könnte man ggf heating.burner  (liefert 1 oder 0) zählen (wie oft sich der wert ändert) um daraus die brennerstarts ab leiten