Vitoconnect - Verbesserte Version

Begonnen von stefanru, 14 Dezember 2024, 23:32:17

Vorheriges Thema - Nächstes Thema

JWRu

@stefanru
Vielen Dank für die schnelle Reaktion!
Kein Problem - es ist nicht eilig. Ich kann damit gut leben.
ZBox; RasPi 3B; RasPi Zero W; Homematic; Z-Wave; EnOcean, Shelly; DuoFern; Oregon-Sensoren; TFA-Sensoren; Steuerung Viessmann-Heizung; Arduinos für Strom-, Wasser-, Gaszähler, Rauchmelder und FI-Schutzschalter

stefanru

@JWRu

Ich habe eine neue Version des Moduls erstellt, die das Verhalten bei einem set-Befehl im Fehlerfall deutlich verbessert:

Fehlerbehandlung beim set:
401 EXPIRED TOKEN Wenn beim Senden ein 401 mit EXPIRED TOKEN zurückkommt, wird automatisch ein neues Token angefordert. Sollte jedoch auch das Token-Refresh fehlschlagen, wird der Vorgang abgebrochen – der set-Befehl gilt dann als verloren. Ich denke, in diesem Fall ist die Verbindung oder das Backend wirklich gestört, und ein weiteres Wiederholen macht keinen Sinn.

Andere Fehler (z. B. Netzwerkprobleme) Tritt ein anderer Fehler auf, wird der set-Befehl nach 10 Sekunden erneut versucht. Um Endlosschleifen zu vermeiden, habe ich ein Retry-Limit von 20 Versuchen eingebaut. Nach dem 20. Fehlversuch wird der Vorgang abgebrochen und ein entsprechender Hinweis ins Log und ins Reading Aktion_Status geschrieben.

Die Version läuft bei mir stabil und ist soweit getestet. Der Fehlerfall mit EXPIRED TOKEN konnte bisher nicht reproduziert werden – tritt ja auch eher selten auf.

Im Fehlerfall wird jeder Wiederholungsversuch sauber geloggt und im Reading dokumentiert.

Die Version liegt im Anhang. Ich freue mich über ausführliche Tests und Rückmeldungen!

Gruß,
Stefan

JWRu

@stefanru
Das ging aber schnell!
Bin zur Zeit unterwegs und kann leider erst Ende nächster Woche testen.
ZBox; RasPi 3B; RasPi Zero W; Homematic; Z-Wave; EnOcean, Shelly; DuoFern; Oregon-Sensoren; TFA-Sensoren; Steuerung Viessmann-Heizung; Arduinos für Strom-, Wasser-, Gaszähler, Rauchmelder und FI-Schutzschalter

stefanru

Alles gut, vielleicht will ja noch jemand testen. Ich beobachte es auch.

Gruß,
Stefan

stefanru

Hi,

bisher hatte es keine Seiteneffekte bei mir also habe ich es mal eingechecked.
Toll wäre wenn jemand es mal live beobachten könnte und bescheid geben dass es auch wirklich funktioniert.
Zu sehen sollte sein:
Log3($name,1,$name.",vitoconnect_action: set ".$name." ".$opt." ".@args.", Fehler bei Befehlsausfuehrung ($retry_count/20): ".$err." :: ".$msg);
und danach dass es doch klappt mit:
Log3($name,3,$name.",vitoconnect_action: set name:".$name." opt:".$opt." text:".$Text.", korrekt ausgefuehrt");

Eingechecked ist:
"0.9.1"  => "11.09.2025  In case of set action when token is expired get new token and try again",

Gruß,
Stefan

stefanru

Hi,
sorry die 0.9.1 hat ein Bug und führt zum Absturz wenn ein anderer Fehler als 401 Token auftaucht.

Z.B. 400 DEVICE_COMMUNICATION_ERROR
genau beim Set, dann gibt es:
2025.09.15 13:37:13 1: VitoCal250AH,vitoconnect_action: set VitoCal250AH heating.dhw.temperature.main.value 1, Fehler bei Befehlsausfuehrung (1/20):  :: {
  "viErrorId": "00-dee581216f6467334683afff8c49c9c2-36c8a91d4ecc8b12-00",
  "statusCode": 400,
  "errorType": "DEVICE_COMMUNICATION_ERROR",
  "message": "Device communication error",
  "extendedPayload": {
    "httpStatusCode": "NotFound",
    "code": "404",
    "reason": "GATEWAY_OFFLINE"
  }
}
Not a HASH reference at ./FHEM/98_vitoconnect.pm line 3818.

Und FHEM restartet.

Ich fixe es gerade und versuche heute Abend noch einen neue Version einzuchecken.

Gruß,
Stefan

stefanru

Hi,

neue Version mit Bugfix ist soeben eingechecked:
"0.9.2"  => "15.09.2025  Fix Not a HASH reference at ./FHEM/98_vitoconnect.pm line 3818 when set action error"

Läuft bei mir unauffällig.
Leider kann ich das Verhalten im Fehlerfall beim vitoconnect_action nur sehen wenn es auch einen Fehler gibt.

Sollte euch etwas auffallen oder ihr seht dass die Retries funktionieren, bitte melden.

Gruß,
Stefan




JWRu

Die neue Version läuft bei mir seit einer Woche fast problemlos.
Einzige Ausnahme: Der Modus "forcedReduced" funktioniert anscheinend nicht mehr.
Es scheint aber, dass die API den wohl nicht mehr unterstützt - in der ViCare-App wird der Modus auch nicht angeboten.

2025.09.27 07:22:58 3: Heizung_Vitoconnect, vitoconnect_action url=https://api.viessmann-climatesolutions.com/iot/v2/features/installations/XXXXXXX/gateways/XXXXXXXXXXXXXXXXX/devices/0/features/heating.circuits.0.operating.modes.active/commands/setMode
2025.09.27 07:22:58 3: Heizung_Vitoconnect, vitoconnect_action data={"mode":"forcedReduced"}
2025.09.27 07:22:58 1: Heizung_Vitoconnect,vitoconnect_action: set Heizung_Vitoconnect heating.circuits.0.operating.modes.active.value 1, Fehler bei Befehlsausfuehrung (20/20):  :: {
  "viErrorId": "00-13429b4541784847d389395df3e3ae19-729cfb6a88e66030-00",
  "statusCode": 400,
  "errorType": "DEVICE_COMMUNICATION_ERROR",
  "message": "Device communication error",
  "extendedPayload": {
    "httpStatusCode": "BadRequest",
    "code": "400",
    "reason": "VALIDATION_ERROR",
    "details": "The parameter mode=\"forcedReduced\" does not meet the constraints {\"type\":\"string\",\"enum\":[\"dhw\",\"dhwAndHeating\",\"standby\"]}: Value 'forcedReduced' is not within allowed values: dhw, dhwAndHeating, standby"
  }
}
2025.09.27 07:22:58 1: Heizung_Vitoconnect - vitoconnect_action: Abbruch nach 20 Fehlversuchen

ZBox; RasPi 3B; RasPi Zero W; Homematic; Z-Wave; EnOcean, Shelly; DuoFern; Oregon-Sensoren; TFA-Sensoren; Steuerung Viessmann-Heizung; Arduinos für Strom-, Wasser-, Gaszähler, Rauchmelder und FI-Schutzschalter

stefanru

#308
Hi,

super danke für die Rückmeldung.
Was genau hat forceReduced gemacht und wofür verwendest du es?
Ich habe auch nur Heating und Standby.
In den Reduced Mode wechsle ich per Zeit/Kalender Steuerung.

Ja die API hat sich ganz schön geändert, bekomme einige neue Readings, habe mich aber noch nicht wirklich damit beschäftigt.
Habe mal nach deiner Anfrage gesucht ich sehe:
    {
      "feature": "heating.circuits.0.operating.programs.reducedHeating",
      "gatewayId": "7736172146035226",
      "deviceId": "0",
      "timestamp": "2025-06-24T02:33:53.250Z",
      "isEnabled": true,
      "isReady": true,
      "apiVersion": 1,
      "uri": "https://api.viessmann.com/iot/v2/features/installations/2772216/gateways/7736172146035226/devices/0/features/heating.circuits.0.operating.programs.reducedHeating",
      "properties": {
        "active": {
          "type": "boolean",
          "value": false
        },
        "demand": {
          "type": "string",
          "value": "heating"
        },
        "temperature": {
          "type": "number",
          "value": 20,
          "unit": "celsius"
        }
      },
      "commands": {
        "activate": {
          "uri": "https://api.viessmann.com/iot/v2/features/installations/2772216/gateways/7736172146035226/devices/0/features/heating.circuits.0.operating.programs.reducedHeating/commands/activate",
          "name": "activate",
          "isExecutable": false,
          "params": {
            "temperature": {
              "type": "number",
              "required": false,
              "constraints": {
                "min": 3,
                "max": 37,
                "stepping": 1
              }
            }
          }
        },
        "setTemperature": {
          "uri": "https://api.viessmann.com/iot/v2/features/installations/2772216/gateways/7736172146035226/devices/0/features/heating.circuits.0.operating.programs.reducedHeating/commands/setTemperature",
          "name": "setTemperature",
          "isExecutable": true,
          "params": {
            "targetTemperature": {
              "type": "number",
              "required": true,
              "constraints": {
                "min": 3,
                "max": 37,
                "stepping": 1
              }
            }
          }
        },
        "deactivate": {
          "uri": "https://api.viessmann.com/iot/v2/features/installations/2772216/gateways/7736172146035226/devices/0/features/heating.circuits.0.operating.programs.reducedHeating/commands/deactivate",
          "name": "deactivate",
          "isExecutable": false,
          "params": {}
        }
      }
    },

Hierüber sollte es schaltbar sein.
Kannst du mal in deinem resource_[serial].json schauen ob du das auch hast?

IsExecutable ist bei activate und deactivate auf false. Deshalb biete ich es nicht an.
Müsste man mal schauen was die API sagt wenn man es trotzdem ausführen will?

Gruß,
Stefan

wolfgang12

Hi,

ich hatte das vitoconnect Modul seit Jahren mit meiner Gasheizung laufen und habe es jetzt auch für die neue VitoCal 250A Wärmepumpe im Einsatz, Vielen Dank schonmal für die tolle Arbeit !

Da ich jetzt auch ViCare Thermostate und -Raumsensoren im Einsatz habe, würde ich deren Werte (Temperaturen, Ventilpositionen, etc.) auch gerne als Readings sehen. Im Viessmann API scheint es dafür auch DataPoints zu geben, z.B. trv.valve.position, trv.temperature, device.sensors.temperature, device.sensors.humidity. Da scheint u.a. einiges unter dem Stichwort DevPortalEuDataActRead hinzugekommen zu sein.
Wäre es möglich, die Werte zu den ViCare Raumsensoren und -Thermostaten in vitoconnect als Readings aufzunehmen ?

Besten Dank & Viele Grüße,

Wolfgang

stefanru

Hi Wolfgang,

wie hast du das Modul denn eingestellt?
Wenn du nichts eingestellt hast verwendest du ein fixes Mappings der Endpoints auf sprechende Namen die der ursprüngliche Entwickler eingebaut hat.
Wir könnten dieses Mapping erweitern, der einfachere Weg ist für dich aber einfach raw readings zu nehmen.
Dabei werden dir alle Endpoints angezeigt die von der API geliefert werden. Direkt auch im Format das in der Viessmann Hilfe angegeben wird.
Setze hierzu:
vitoconnect_raw_readings auf 1
ZitatErstellt Readings mit einfachen JSON-Namen wie 'heating.circuits.0.heating.curve.slope' anstelle von deutschen Bezeichnern (altes Mapping), Mapping-Attributen oder Übersetzungen.
Wenn raw Readings verwendet werden, werden die Setter dynamisch erstellt, die den raw Readings entsprechen.
Diese Einstellung wird empfohlen, um die Daten so dynamisch wie möglich von der API zu erhalten.
stateFormat oder userReadings können verwendet werden, um wichtige Readings mit einem lesbaren Namen anzuzeigen.
Wenn vitoconnect_raw_readings gesetzt ist, wird kein Mapping verwendet.

Gruß,
Stefan

wolfgang12

Hallo Stefan,

erstmal vielen Dank für das schnelle Feedback !

Ich habe jetzt mal raw_readings auf 1 gesetzt und aktualisiert, trotzdem kommen keine neuen Readings für die Thermostate und Sensoren, scheint noch nicht wirklich aktiv zu sein. Ich lasse das jetzt mal so, vielleicht kommt da ja noch was im Rahmen des EU Data Act. In der ViCare App sieht mal die Werte zumindest teilweise. Das war mir nicht klar, dass mit raw_readings automatisch alle verfügbaren Datenpunkte als Readings geliefert werden.

Viele Grüße - Wolfgang

stefanru

Hi Wolfgang,
das ist aber schade.

Du kannst mal noch eine Sache machen.
Ruf mal ein set <Gerät> logResponceOnce auf.
Das kannst du direkt im Gerät machen.
Danach findest du im FHEM Log Ordner eine Datei Namens:
resource_<Seriennummer>.json
Das ist das komplette Json das geliefert wird und das Modul dann in Readings wandelt.
Wenn du in dem Json nach deinen Endpunkten suchst diese aber nicht findest dann werden sie ganz sicher nicht geliefert.
Laut Developer Seite sollten sie aber tatsächlich geliefert werden.
Vielleicht kommen sie noch, da tut sich gerade viel an der API.
Auch ich habe einige Endpunkte mehr bekommen.

Gruß,
Stefan

wolfgang12

Hi Stefan,

danke für den Tip, da ist aber auch nichts passendes dabei. Vielleicht kommt es ja noch wie Du sagst, denke mal da ist viel Bewegung durch den EU Data Act, wo Viessmann ja eigentlich alles liefern müssen was sie speichern.

Werde das mal beobachten.

Viele Grüße - Wolfgang

JWRu

ZitatWas genau hat forceReduced gemacht und wofür verwendest du es?
Ich habe forcedReduced für längere Abwesenheiten genutzt als Alternative zum Ferienprogramm, da ich aus FHEM außer der Heizung dann noch andere Dinge ein- bzw. ausschalte. Dann musste ich An- und Abreisedatum nur an einer Stelle eingeben.
Das stammt aber noch aus der Zeit, als es in Vitoconnect noch nicht so komfortabel ging.
ZBox; RasPi 3B; RasPi Zero W; Homematic; Z-Wave; EnOcean, Shelly; DuoFern; Oregon-Sensoren; TFA-Sensoren; Steuerung Viessmann-Heizung; Arduinos für Strom-, Wasser-, Gaszähler, Rauchmelder und FI-Schutzschalter