Vitoconnect - Verbesserte Version

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

Vorheriges Thema - Nächstes Thema

stefanru

Danke, das schaue ich mir auf jeden fall mal an.

Schönes Wochenende,
Stefan

jemu75

Hallo Stefan,

ich wollte nochmal ein kurzes Feedback geben. Bei mir sind heute zeitweise nochmal Fehler im log aufgetaucht.

2025.02.07 10:41:52 1: vitodens - unbekannter Fehler: Bitte den Entwickler informieren! 2025.02.07 10:41:52 1: vitodens - statusCode: 400 errorType: DEVICE_COMMUNICATION_ERROR message: error: 2025.02.07 10:43:53 1: PERL WARNING: Use of uninitialized value $a[1] in subtraction (-) at ./FHEM/99_Utils.pm line 21. 2025.02.07 10:43:53 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.

Hast du einen Tipp, wie ich dem Problem noch besser auf den Grund gehen kann?

Grüße
Jens  :)

Schlimbo

Hallo Stefan,

vielen Dank noch mal für die Überarbeitung des Moduls und das einchecken ins SVN.

Das Passwort und APIkey Löschen hat noch nicht funktioniert, da $kName nicht gesetzt wird.
Ich habe es bei mir jetzt mal abgeändert, so funktioniert es:
#####################################################################################################################
# verschlüsselte Werte löschen
#####################################################################################################################
sub DeleteKeyValue {
    my ($hash,$kName) = @_;    # Übergabe-Parameter
    my $name = $hash->{NAME};

    Log3( $name, 5,$name." - called function Delete()" );

    my $index = $hash->{TYPE}."_".$hash->{NAME}."_passwd";
    setKeyValue( $index, undef );
    my $index = $hash->{TYPE}."_".$hash->{NAME}."_apiKey";
    setKeyValue( $index, undef );

    return;
}

Was mir noch aufgefallen ist (war glaube ich auch schon bei dem alten Modul):
Das Reading heating.controller.serial.value hat bei mir nur eine reihe an Replacement Character.
heating.controller.serial.value  ����������������in der resource_**.json sieht es so aus:
    {
      "feature": "heating.controller.serial",
      "gatewayId": "********",
      "deviceId": "0",
      "timestamp": "2025-02-05T13:08:27.006Z",
      "isEnabled": true,
      "isReady": true,
      "apiVersion": 1,
      "uri": "https://api.viessmann.com/iot/v2/features/installations/******/gateways/*******1/devices/0/features/heating.controller.serial",
      "properties": {
        "value": {
          "type": "string",
          "value": "����������������"
        }
      },
      "commands": {}
    },
Scheint als schon von der API so zu kommen, Ist das bei euch auch so?

Viele Grüße
Schlimbo

Schlimbo

In der Viessmann API Doku habe ich gerade gesehen, dass es auch eine Datenbank der Fehlercodes gibt:
https://documentation.viessmann.com/service-documents/v3#service-documents_List_Errors_From_Database

eine komplette Liste kann mit
https://api.viessmann.com/service-documents/v3/error-database?materialNumber=7733738&countryCode=DE&languageCode=de
abgerufen werden.

oder nur einen einzelnen error code mit:
https://api.viessmann.com/service-documents/v3/error-database?materialNumber=7733738&errorCode=c2&countryCode=DE&languageCode=de

Die materialNumber sind die ersten 7 Stellen der Seriennummer (device.serial).

Über das Modul bekommt man im Reading "device.messages.errors.raw.entries" den Fehler Code z.b.:
"customer, a0, warning, 2025-02-03T17:25:19.000Z"

Es wäre super, wenn das Modul bei vorhandenem "Error-Code" die Fehlermeldungen in Klartext anzeigen könnte.


stefanru

Hi,
bin gerade in Urlaub. Schaue mir das alles an wenn ich zurück bin. Fehlercodes könnte ich nachschlagen und abspeichern.
Könnte man auch in einem ErrorLast Reading speichern so dass der letzte Fehler erhalten bleibt.
Die Steuerzeichen habe ich in meinem json nicht gesehen.
Über den Communication Error muss ich mal Nachdenke und Nachlesen. Kann es sein dass du wirklich kurzzeitig die Verbindung verlierst?

Viele Grüße,
Stefan

JWRu

#110
Ich wollte hier mal ein großes Dankeschön an stefanru für die Weiterentwicklung des Moduls loswerden.
Ich habe ein Update gemacht (hat problemlos geklappt) und auf Raw Readings umgestellt. Das hat ein wenig Arbeit gemacht, die sich aber gelohnt hat.

Eine Geschichte ist aber geblieben (liegt sicher nicht am vitoconnect-Modul):
Ich habe eine Vitodens 200-W Gas-Brennwertheizung mit einem Vitoconnect OPTO2 Kommunikationsmodul.
Das Reading "heating.boiler.temperature.value" liefert immer mal wieder unsinnige Werte (> 6000 !). Das war auch in der alten vitoconnect-Version schon so.
Ich habe das Problem vor einiger Zeit mal im Viessmann-Forum gepostet, aber nie eine Antwort erhalten.
Mein Workaround ist ein userReading, das nur die plausiblen Werte verwendet.
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

Hi,

erstmal vielen Dank für den tollen Input. Ich werde versuchen, alles umzusetzen.

@jemu75:
Ich habe im Viessmann-Forum gesehen, dass es eventuell noch erweiterte Infos zum Fehler geben kann.
Da ich es bei mir nicht nachstellen kann und so nicht nachschauen kann, wo die Infos versteckt sind, schreibe ich nun im Fehlerfall ins FHEM-Log-Verzeichnis eine Datei vitoconnect_[serial].err. In diese Datei wird das ganze Antwort-JSON gedumpt. Es wäre super, wenn du mir bei deinem nächsten Fehler diese Datei zukommen lassen könntest.

@Schlimbo:
Vielen Dank für das korrigierte DeleteKeyValues.
Ich habe es übernommen und nach vitoconnect_DeleteKeyValues umbenannt, sodass es zum Modul passt.
Die Serial bei dir sieht echt komisch aus.
Bei mir kommt sie sauber zurück. Das scheint ein Problem bei deiner Anlage zu sein.

{ "feature": "heating.controller.serial", "gatewayId": "7637415075136238", "deviceId": "0", "timestamp": "2025-02-05T13:16:30.394Z", "isEnabled": true, "isReady": true, "apiVersion": 1, "uri": "https://api.viessmann.com/iot/v2/features/installations/2772216/gateways/7637415075136238/devices/0/features/heating.controller.serial", "properties": { "value": { "type": "string", "value": "7659552411XXXXXX" } }, "commands": {} }

Da müsstest du wahrscheinlich wirklich Viessmann fragen, warum deine Serial nicht korrekt in der API gemeldet wird.

Das mit der Error-Datenbank ist super interessant und ich habe schon mal damit gespielt.
Bei meinem Vitoladens funktioniert es wunderbar.
Meine neuere VoitCal 250 hat aber leider noch keine Dokumente im System:

{ "viErrorId": "req-86cd5590ec9f4aaebf19e82c60487aa6", "statusCode": 404, "errorType": "RESOURCE_NOT_FOUND", "message": "Required resource of type ServiceDocument was not found", "extendedPayload": { "resourceType": "ServiceDocument", "errorType": "DOCUMENT_MISSING" } }

Ich werde die Fehlerauflösung bei Gelegenheit einbauen.

@JWRu:
Solch einen Fehler habe ich bei mir nicht. Könnte es sein, dass dein Sensor ein Problem hat und manchmal wirklich falsche Werte liefert?
Ich könnte natürlich solche Ausreißer im Modul behandeln. Damit würde man falsche Messwerte oder fehlerhafte Sensoren aber auch verstecken.
Gibt es bei anderen Verwendern des Moduls auch Ausreißer bei Sensorwerten?


Eine neue Version des Moduls liegt im GIT und wenn kein Einspruch kommt für morgen auch im SVN.

Viele Grüße,
Stefan

cnkru

Hallo, hier nur eine kurze Info zur Fehlermeldung meiner Anlage VC-222 - vermutlich wegen Wartungsarbeiten bei Viessmann.
Die ViCare App zeigte zur selben Zeit ebenfalls keine Infos an
Meldung dort: Ihre Anlage hat ein Problem ...
Ein Ping auf die Anlage zeigte an, dass diese im Netz ansprechbar war...
Am Display der Anlage war alles in Ordnung (Meldung Okay ...)

Hier kurz der Auszug aus dem LOG - weil unbekannter Fehler gemeldet werden sollte ...
Logfile FHEM alle 20 Minuten VIessmann Logs
...
2025.02.16 15:03:35 2: Viessmann Ereignis Stromverbrauch_Total/Jahr: 55.4,292.6.
2025.02.16 15:03:35 2: Viessmann Ereignis Gasverbrauch_aktuelle_Woche: 59.2.
2025.02.16 15:03:35 2: Viessmann Ereignis Gasverbrauch_aktueller_Monat: 147.6.
2025.02.16 15:03:35 2: Viessmann Ereignis Gasverbrauch_aktuelles_Jahr: 401.
2025.02.16 15:03:35 2: Viessmann Ereignis Gasverbrauch_total_akt_Monat: 147.6.
2025.02.16 15:03:35 2: Viessmann Ereignis Stromverbrauch_aktuelles_Jahr: 55.4.
...
Dann Fehlermeldung
2025.02.16 15:23:36 1: Viessmann - unbekannter Fehler: Bitte den Entwickler informieren!
2025.02.16 15:23:36 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at /opt/fhem/FHEM/98_vitoconnect.pm line 3756.
2025.02.16 15:23:36 1: Viessmann - statusCode: 400 errorType: DEVICE_COMMUNICATION_ERROR message:  error:
...
2025.02.16 15:43:37 1: Viessmann - unbekannter Fehler: Bitte den Entwickler informieren!
2025.02.16 15:43:37 1: Viessmann - statusCode: 400 errorType: DEVICE_COMMUNICATION_ERROR message:  error:
Neustart FHEM
2025.02.16 15:47:38 1: Viessmann - unbekannter Fehler: Bitte den Entwickler informieren!
2025.02.16 15:47:38 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at /opt/fhem/FHEM/98_vitoconnect.pm line 3756.
2025.02.16 15:47:38 1: Viessmann - statusCode: 400 errorType: DEVICE_COMMUNICATION_ERROR message:  error:
...
2025.02.16 16:07:38 1: Viessmann - unbekannter Fehler: Bitte den Entwickler informieren!
2025.02.16 16:07:38 1: Viessmann - statusCode: 400 errorType: DEVICE_COMMUNICATION_ERROR message:  error:
...
2025.02.16 16:27:39 1: Viessmann - unbekannter Fehler: Bitte den Entwickler informieren!
2025.02.16 16:27:39 1: Viessmann - statusCode: 400 errorType: DEVICE_COMMUNICATION_ERROR message:  error:
usw.
ab 17:07 ist die Anlage wieder erreichbar

LG Carsten
RPi4, Razberry, ZWAVE (Thermostate, Dimmer, Schalter, Multisensor), Milight-LED, Wifi (IPCAM, Fritz!DECT, Sonoff), alexa, Hombridge, Velux-Rollos, Viessman-API, iobroker, SENEC

stefanru

Hi cnkru,

ok, sieht ja aus wie erwartet.
Nur diese Zeile stört mich.
2025.02.16 15:47:38 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at /opt/fhem/FHEM/98_vitoconnect.pm line 3756.

Kannst du mir bitte deine Version des Moduls schicken dann behebe ich diesen Fehler noch falls es nicht schon geschehen ist in den neueren Versionen.

Danke und Gruß,
Stefan

stefanru

Ok ich habe lieber etwas weiter entwickelt.
Ich habe im GIT eine erste Version die die Error Codes mapped.
Diese benötigt aber use HTML::Entities; use HTML::Strip;
Am besten installieren mit:
Für HTML::Entities:
sudo apt-get install libhtml-parser-perl

Für HTML::Strip:
sudo apt-get install libhtml-strip-perl

Muss mich jetzt aber erstmal schlau machen wie ich sowas offiziell ausliefere, da das update bei vielen zum nicht funktionieren des Moduls führen wird da ich neue Abhängigkeiten eingeführt habe.

Wäre schön wenn einige von euch die neue Version aus dem GIT testen könnten.

Gruß,
Stefan


JWRu

#115
ZitatIch könnte natürlich solche Ausreißer im Modul behandeln. Damit würde man falsche Messwerte oder fehlerhafte Sensoren aber auch verstecken.
Ich denke, das ist nicht notwendig - wahrscheinlich eher ein Einzelfall.
Ich habe das mit einem einfachen userReading behoben:
heating.boiler.temperature.value.corrected:heating.boiler.temperature.value.*
{ if(ReadingsNum("$name","heating.boiler.temperature.value",1000)<100) { ReadingsNum("$name","heating.boiler.temperature.value",0) }
  else { ReadingsNum("$name","heating.boiler.temperature.value.corrected",0)} }
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

buec65

aktuelle Version aus dem GIT hab ich mal auf meinem Testsystem laufen
FVERSION 98_vitoconnect.pm:v0.7.5-s29593/2025-01-29

libhtml-parser-perl - war auf meinem System bereits installiert

2025.02.17 10:29:12 0: Server shutdown
2025.02.17 10:29:18 1: Including fhem.cfg
2025.02.17 10:29:21 3: WEB: port 8083 opened
2025.02.17 10:29:22 2: eventTypes: loaded 488 lines from ./log/eventTypes.txt
2025.02.17 10:29:40 3: Vito_300w - Passwort war bereits gespeichert

stefanru

#117
Danke für die Rückmeldungen.

Ich habe die neue Funktionalität nochmal überarbeitet und komme nun ohne die HTML-Libs aus.
Die Error-Texte liefere ich erstmal in Englisch, sonst müsste ich noch UTF-8-Handling einbauen.
Das kann aber noch nachgeliefert werden.

Fehler werden nun in neuen Readings abgelegt:
device.messages.errors.mapped.0.faultCode C2
device.messages.errors.mapped.0.faultCodes.0.cause Compressor power supply fault or phase monitor faulty
device.messages.errors.mapped.0.faultCodes.0.measure Check connections, power supply and phase connection. Check phase monitor.
device.messages.errors.mapped.0.systemCharacteristics Compressor stops.

Diese Readings werden nicht gelöscht, wenn der Fehler behoben ist.
Am Zeitstempel sieht man aber, dass sie alt sind.
device.messages.errors.raw.entries ist dann aber wieder leer.

Was meint ihr? Readings behalten oder lieber auch wieder löschen?

Führt die Abfrage des Error-Codes zu einem 404 bei Viessmann, weil dort keine Dokumente hinterlegt sind, wie z.B. zur Zeit bei meiner Vitocal, schreibe ich dies ins Log.

Ich habe nun eine neue Version des Moduls auf GitHub und werde diese morgen ins SVN übernehmen. Die Änderungen sind:

  "0.7.6"  => "17.02.2025  removed usage of html libraries",
  "0.7.5"  => "16.02.2025  Get mapped error codes and store them in readings",
  "0.7.4"  => "16.02.2025  Removed Unknow attr vitoconnect, small bugfix DeleteKeyValue",
  "0.7.3"  => "16.02.2025  Write *.err file in case of error. Fixed DeleteKeyValue thanks Schlimbo",
  "0.7.2"  => "07.02.2025  Attr logging improved",
  "0.7.1"  => "07.02.2025  Code cleanups",

P.S:
noch zwei weitere
  "0.7.8"  => "17.02.2025  fixed undef warning thanks cnkru",
  "0.7.7"  => "17.02.2025  introduced set clearMappedErrors",

Vorab auch wieder im GIT morgen alles im SVN.

Viele Grüße,
Stefan

Schlimbo

Hi Stefan,

wow das sind super News, vielen Dank für die Erweiterung. :)

Hatte bis jetzt nur eine einzelne Meldung anstehen, wie ist es wenn mehrere Meldungen zur gleichen Zeit vorhanden sind? zum Beispiel:
device.messages.errors.raw.entries: customer, a0, warning, 2025-02-03T17:25:19.000Z, customer, c5, note, 2025-02-03T16:57:36.000ZWerden dann einfach mehrere Readings angelegt?

zu den Readings:
Ich persönlich fände es besser, wenn die Readings nach einem Fehler auch wieder geleert werden, für History Zwecke finde ich ein externes FileLog-Device sinnvoller.

Da ich mir Störmeldungen der Heizung gerne über Alexa ausgeben möchte, wäre ein Attribut um die Sprache einzustellen super.

In den Texten sind noch Markup-Zeichen enthalten "<q>  </q>". Könntest du diese bitte noch encoden?
device.messages.errors.mapped.0.faultCodes.0.measure
No action required.If the message is constantly present: Check connection at terminal X3.7 (feed) first, then at terminal X3.6 (230 V~) (see <q>Cross connect PCB</q>/<q>Luster terminals</q>).

Im Reading "device.messages.errors.raw.entries" ist auch noch eine Meldeklasse mit angegeben.
customer, a0, warning, 2025-02-03T17:25:19.000ZGesehen habe ich bei mir bisher: "note", "warning", "error" oder "criticalError".
Könntest du für diese auch noch ein extra Reading spendieren?

Wenn eine Meldung ansteht habe ich aktuell noch alle 2 Minuten einen Log Eintrag:
2025.02.17 17:02:38.531 3: vitoconnect, vitoconnect_getErrorCode url=https://api.viessmann.com/service-documents/v3/error-database?materialNumber=7733738&errorCode=c5&countryCode=EN&languageCode=en
2025.02.17 17:02:38.783 3: vitoconnect, vitoconnect_getErrorCode: finished ok
2025.02.17 17:04:39.205 3: vitoconnect, vitoconnect_getErrorCode url=https://api.viessmann.com/service-documents/v3/error-database?materialNumber=7733738&errorCode=c5&countryCode=EN&languageCode=en
2025.02.17 17:04:39.454 3: vitoconnect, vitoconnect_getErrorCode: finished ok
2025.02.17 17:06:39.940 3: vitoconnect, vitoconnect_getErrorCode url=https://api.viessmann.com/service-documents/v3/error-database?materialNumber=7733738&errorCode=c5&countryCode=EN&languageCode=en
2025.02.17 17:06:40.265 3: vitoconnect, vitoconnect_getErrorCode: finished ok
2025.02.17 17:08:40.665 3: vitoconnect, vitoconnect_getErrorCode url=https://api.viessmann.com/service-documents/v3/error-database?materialNumber=7733738&errorCode=c5&countryCode=EN&languageCode=en
2025.02.17 17:08:40.928 3: vitoconnect, vitoconnect_getErrorCode: finished ok
2025.02.17 17:10:41.229 3: vitoconnect, vitoconnect_getErrorCode url=https://api.viessmann.com/service-documents/v3/error-database?materialNumber=7733738&errorCode=c5&countryCode=EN&languageCode=en
2025.02.17 17:10:41.527 3: vitoconnect, vitoconnect_getErrorCode: finished ok
2025.02.17 17:12:42.161 3: vitoconnect, vitoconnect_getErrorCode url=https://api.viessmann.com/service-documents/v3/error-database?materialNumber=7733738&errorCode=c5&countryCode=EN&languageCode=en
2025.02.17 17:12:42.428 3: vitoconnect, vitoconnect_getErrorCode: finished ok

Bei einem reload des Moduls oder einem FHEM Neustart  bekomme ich folgenden Log Eintrag:
2025.02.17 21:40:53.214 1: PERL WARNING: Prototype mismatch: sub main::decode_json ($;$$) vs ($) at /usr/local/lib/perl5/5.36.3/Exporter.pm line 63.
Viele Grüße
Schlimbo

stefanru

Zitat von: Schlimbo am 17 Februar 2025, 21:53:32Hatte bis jetzt nur eine einzelne Meldung anstehen, wie ist es wenn mehrere Meldungen zur gleichen Zeit vorhanden sind? zum Beispiel:
device.messages.errors.raw.entries: customer, a0, warning, 2025-02-03T17:25:19.000Z, customer, c5, note, 2025-02-03T16:57:36.000ZWerden dann einfach mehrere Readings angelegt?
Ja genau dafür sind die Nummer (hier zwei mal 0), laut Antwort kann es zu einem faultCode auch mehrere causes und measures geben, ob das wirklich so ist werden wir sehen müssen.
Mit allem kann ich aber mit den beiden Zählern umgehen.
device.messages.errors.mapped.0.faultCodes.0.measure

Zitat von: Schlimbo am 17 Februar 2025, 21:53:32zu den Readings:
Ich persönlich fände es besser, wenn die Readings nach einem Fehler auch wieder geleert werden, für History Zwecke finde ich ein externes FileLog-Device sinnvoller.
Ja das macht Sinn und werde ich so einbauen.

Zitat von: Schlimbo am 17 Februar 2025, 21:53:32Da ich mir Störmeldungen der Heizung gerne über Alexa ausgeben möchte, wäre ein Attribut um die Sprache einzustellen super.
Mit der Spräche habe ich das Umlaut Problem und muss UTF8 einbauen. Ich schaue mal was das für Abhängigkeiten nach sich zieht.

Zitat von: Schlimbo am 17 Februar 2025, 21:53:32In den Texten sind noch Markup-Zeichen enthalten "<q>  </q>". Könntest du diese bitte noch encoden?
Hatte bei mir nur <p>, werde <q> auch entfernen. Ich hoffe es kommt nicht noch mehr vor.
Sonst brauche ich doch die HTML lib.

Zitat von: Schlimbo am 17 Februar 2025, 21:53:32Im Reading "device.messages.errors.raw.entries" ist auch noch eine Meldeklasse mit angegeben.
customer, a0, warning, 2025-02-03T17:25:19.000ZGesehen habe ich bei mir bisher: "note", "warning", "error" oder "criticalError".
Könntest du für diese auch noch ein extra Reading spendieren?
Klar mache ich.

Zitat von: Schlimbo am 17 Februar 2025, 21:53:32Wenn eine Meldung ansteht habe ich aktuell noch alle 2 Minuten einen Log Eintrag:
Ok setze ich von Verbose 3 auf 4 oder 5.

Zitat von: Schlimbo am 17 Februar 2025, 21:53:32Bei einem reload des Moduls oder einem FHEM Neustart  bekomme ich folgenden Log Eintrag:
2025.02.17 21:40:53.214 1: PERL WARNING: Prototype mismatch: sub main::decode_json ($;$$) vs ($) at /usr/local/lib/perl5/5.36.3/Exporter.pm line 63.
Hmm, das habe ich bei mir nicht.
War das bei dir schon immer?
Ich schaue mal in der History ob ich an den Imports was geändert habe.
Ich verwende:
use JSON;
use JSON::XS qw( decode_json );

Eventuell habe ich XS eingeführt wegen der Performance, obs wirklich einen unterschied macht sei mal dahin gestellt.


Nochmals vielen Dank für dein Feedback, ist sehr hilfreich.
Ich versuche alles umzusetzen, wird aber ein paar Tage dauern da ich gerade keine Zeit habe.

Viele Grüße
Stefan