Devolo Magic 2 und UBUS?

Begonnen von gestein, 14 September 2021, 15:26:32

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

ich habe alle Geräte auf verbose=5, aber sehr gesprächig sind sie nicht ;)

Das "UBUS_Test_221" habe ich zuerst auf "disable" und dann auf "enable" gesetzt.
Hier die log-Einträge:
2022.01.11 09:26:05.020 1 : password Keystore handle for Device (UBUS_Test_221) - No password in file
2022.01.11 09:26:08.147 1 : UBUS (UBUS_Test_221) - decode_json error: ':' expected, at character offset 92 (before "},"InterferenceMitig...") at ./FHEM/72_UBUS_CLIENT.pm line 522.

Dann ist die sessionID=0.

Aber auf einmal geht es und die Readings werden upgedatet (nur die Änderungen) - das passt soweit sehr gut.
Nach ca. 8 Minuten hören die log-Einträge aber leider auf, dann kommen keine Einträge mehr.
Wenn ich dann beim "UBUS_Test_221" wieder "disable"/"enable" mache, geht es wieder.

Hier werden die Mac-Adressen als Teil der Readings-Namen verwendet und als Trennzeichen ein "_".
Wäre es möglich kein Trennzeichen zu verwenden, wäre leichter lesbar.

lg, Gerhard

p.s.: Anscheinend muss man ath1 verwenden.

xenos1984

Zitat von: gestein am 11 Januar 2022, 11:57:18
ich habe alle Geräte auf verbose=5, aber sehr gesprächig sind sie nicht ;)
Das wundert mich - eigentlich sollte dann sämtliche Kommunikation im Log auftauchen.
Zitat
Aber auf einmal geht es und die Readings werden upgedatet (nur die Änderungen) - das passt soweit sehr gut.
Nach ca. 8 Minuten hören die log-Einträge aber leider auf, dann kommen keine Einträge mehr.
Wenn ich dann beim "UBUS_Test_221" wieder "disable"/"enable" mache, geht es wieder.
Den automatischen Neu-Login bei abgelaufener Session muss ich noch in das physikalische Modul einbauen, damit sollte das behoben werden.
Zitat
Hier werden die Mac-Adressen als Teil der Readings-Namen verwendet und als Trennzeichen ein "_".
Wäre es möglich kein Trennzeichen zu verwenden, wäre leichter lesbar.
Möglich ist alles ;) In der JSON-Antwort kommen offenbar als Key die Mac-Adressen mit Doppelpunkt als Trennzeichen vor. Wenn man keine eigene Auswertungsfunktion benutzt, werden diese Keys mit makeReadingName in gültige Reading-Namen umgewandelt und das ersetzt eben u.a. Doppelpunkt durch Unterstrich. Um andere Namen zu erhalten, musst du in UBUS_CALL das Attribut readings setzen, z.B. auf:

{FHEM::UBUS_CALL::DefaultReadings($RAW =~ s/([a-fA-F0-9]):([a-fA-F0-9]):([a-fA-F0-9]):([a-fA-F0-9]):([a-fA-F0-9]):([a-fA-F0-9])/$1$2$3$4$5$6/r)}

gestein

Du hast recht. Entschuldige bitte.
Im Webbrowser werden nicht alle log-Einträge angezeigt.
Im log-File per "tail -f ..." natürlich schon. Da sind alle JSON-Daten zu sehen.

Ich habe im UBUS_CALL das Attribut readings wie angegeben gesetzt, aber die Namen werden trotzdem mit "_" dargestellt.

Einen Vorschlag noch:
Könntest Du ein fixes Reading in den UBUS_CALL jedesmal mit updaten (Änderung der ReadingsTime).
So könnte man abfragen, ob die Daten abgefragt werden.
Aber wahrscheinlich wird das obsolet, wenn mal alles klappt.

Danke, lg, Gerhard

xenos1984

Zitat von: gestein am 11 Januar 2022, 13:04:20
Ich habe im UBUS_CALL das Attribut readings wie angegeben gesetzt, aber die Namen werden trotzdem mit "_" dargestellt.
Da war noch ein Tippfehler in der Regex:

{FHEM::UBUS_CALL::DefaultReadings($RAW =~ s/([a-fA-F0-9][a-fA-F0-9]):([a-fA-F0-9][a-fA-F0-9]):([a-fA-F0-9][a-fA-F0-9]):([a-fA-F0-9][a-fA-F0-9]):([a-fA-F0-9][a-fA-F0-9]):([a-fA-F0-9][a-fA-F0-9])/$1$2$3$4$5$6/r)}

Zitat
Einen Vorschlag noch:
Könntest Du ein fixes Reading in den UBUS_CALL jedesmal mit updaten (Änderung der ReadingsTime).
So könnte man abfragen, ob die Daten abgefragt werden.
Aber wahrscheinlich wird das obsolet, wenn mal alles klappt.
Baue ich auch noch ein (z.B. den Fehlercode).

gestein

Ich habe zwar keine Ahnung, was das Regex genau macht, aber nun ändert er die erste Readingsgruppe, alle anderen sind wieder mit "_".
Also so in etwa:
clients_04D6AAA0EA16_disconnected_time
clients_04D6AAA0EA16_radio
clients_04D6AAA0EA16_ssid
clients_04D6AAA0EA16_vendor_description
clients_04D6AAA0EA16_vendor_name
clients_12_9E_F3_02_2F_BA_disconnected_time
clients_12_9E_F3_02_2F_BA_radio
clients_12_9E_F3_02_2F_BA_ssid
clients_12_9E_F3_02_2F_BA_vendor_name
clients_50_14_79_04_27_22_disconnected_time
clients_50_14_79_04_27_22_radio
clients_50_14_79_04_27_22_ssid
clients_50_14_79_04_27_22_vendor_description
clients_50_14_79_04_27_22_vendor_name
clients_68_C6_3A_FA_DE_63_disconnected_time
clients_68_C6_3A_FA_DE_63_radio
clients_68_C6_3A_FA_DE_63_ssid
clients_68_C6_3A_FA_DE_63_vendor_description
clients_68_C6_3A_FA_DE_63_vendor_name


lg, Gerhard

xenos1984

Zitat von: gestein am 11 Januar 2022, 15:18:25
Ich habe zwar keine Ahnung, was das Regex genau macht, aber nun ändert er die erste Readingsgruppe, alle anderen sind wieder mit "_".
Ah, da fehlt noch ein g am Ende:

{FHEM::UBUS_CALL::DefaultReadings($RAW =~ s/([a-fA-F0-9][a-fA-F0-9]):([a-fA-F0-9][a-fA-F0-9]):([a-fA-F0-9][a-fA-F0-9]):([a-fA-F0-9][a-fA-F0-9]):([a-fA-F0-9][a-fA-F0-9]):([a-fA-F0-9][a-fA-F0-9])/$1$2$3$4$5$6/rg)}

gestein

Passt. Danke!
Dann freue ich mich auf die nächste Version  ;)

gestein

Hallo,

ich habe mir heute die neue Version runtergeladen und installiert.
https://forum.fhem.de/index.php/topic,122404.msg1204498.html#msg1204498
Nach einem Restart konnte sich der Client nicht mehr verbinden.

Heute Abend habe ich beim Client wieder "disable/enable" gesetzt und dann ging es wieder.
Von alleine ist es leider nicht gestartet.
Ich konnte auch erst am Abend "verbose 5" einstellen.
Die log-Einträge schicke ich Dir wieder per pm.

Nach kurzer Zeit kam dann ein "unexpected session" und der Client ging auf "disconnected".
Von alleine kommt er auch nicht mehr raus.

lg, Gerhard

xenos1984

Hallo Gerhard,

das sieht ungewöhnlich aus...

Also, die ersten Einträge (bis 13:43) sprechen von einem Timeout. Da scheint irgendwie die Verbindung zum Gerät nicht innerhalb der notwendigen Zeit zu antworten. Davon bekommt mein Modul aber nur das Symptom mit und kann da selbst nichts machen, da dürfte auch das Update keinen Einfluss haben. War das auch schon mit der alten Version der Fall?

Interessanter sind die anderen Einträge...

Auf "list" antwortet der Devolo scheinbar u.a. mit einem Eintrag {"unknown"} - das ist kein gültiges JSON, und da beschwert sich decode_json zu Recht. Gültige Einträge haben entweder die Form ["unknown"] (Array) oder {"key":"value"} (Objekt). Das, was der Devolo da antwortet, kann decode_json nicht verarbeiten.

Außerdem mag der Devolo offenbar das Überprüfen, ob die aktuelle Session noch gültig ist, ebenfalls nicht. Da kommt ein "Access denied" zurück und keine Session-Nummer. Und ohne die funktionieren auch die weiteren Abfragen nicht mehr.

Von den genannten Punkten kann ich versuchen, den letzten dadurch zu beheben, dass ich das regelmäßige Prüfen der Session abschaltbar mache. Dann müsste man aber anders erkennen, falls die Session abgelaufen sein sollte. Das mit dem Verbinden nach Neustart sehe ich mir auch noch mal an, das könnte aber ein Nebeneffekt nach dem Aktualisieren sein. (Bei mir läuft das Modul sofort an.)

Bei ungültigem JSON weiß ich mir leider auch nicht zu helfen, weil hier das Gerät sich nicht an den Standard hält und nicht das schickt, was der Standard verspricht...

gestein

Hallo,

Danke für die Infos. Das muss ich mir in Ruhe anschauen.

Wegen dem Restart nach ,,disconnect" habe ich mir mal ein notify gemacht:
defmod n_UBUS notify UBUS_unconnected_clients:disconnected {
my $IODev=InternalVal("$NAME","IODev","");
fhem("set ".$IODev->{NAME}." disable;; sleep 4;; set ".$IODev->{NAME}." enable");
}


Lg, Gerhard

xenos1984

Ich habe noch einen Workaround für das ungültige JSON eingebaut - kannst du noch mal die Version im Anhang testen? Damit sollte der UBUS_CLIENT als Readings die unterstützten Funktionsaufrufe anzeigen.

gestein

Cool, das probiere ich heute Abend gleich mal.
lg, Gerhard

gestein

Hallo,

leider hatte ich ziemlich viel um die Ohren in letzter Zeit, daher kann ich mich jetzt erst wieder melden.^

Danke für die neue Version.
Die Funktionsaufrufe erscheinen nun im UBUS_CLIENT.

Leider gibt das UBUS_CALL-Device für die Wifi-Verbindungen nach ein paar Mal verbinden auf und bekommt dann die Antwort:
2022.03.21 16:18:00.068 5 : UBUS (devolo_697_GD) - sent: {"jsonrpc":"2.0","params":["28acb7fa0eb8d8a27da99079c1bb5945","network.info","clients",{"device":"ath1"}],"method":"call","id":"devolo_697_GD_ath:call:12"}
2022-03-21 16:18:00.121 UBUS_CALL devolo_697_GD_ath updating
2022.03.21 16:18:01.266 5 : UBUS (devolo_697_GD) - received: {"jsonrpc":"2.0","id":"devolo_697_GD_ath:call:12","error":{"code":-32002,"message":"Access denied"}}
2022.03.21 16:18:01.267 5 : devolo_697_GD: dispatch {"jsonrpc":"2.0","id":"devolo_697_GD_ath:call:12","error":{"code":-32002,"message":"Access denied"}}


Es wird aber nirgendwo ein Status auf "Fehler" oder error-Reading gesetzt.
Damit kann man auf den Fehler auch niicht reagieren.

Wenn man dann wieder disabel/enable beim UBUS_CLIENT macht, dann geht es wieder ein paar Mal.

Soll ich Dir ein log als pm schicken?

Danke, lg, Gerhard


xenos1984

Hier eine geänderte UBUS_CALL Version, die im Fehlerfall das Reading state auf "Error -32002: Access denied" setzen sollte.

gestein

Hallo,

vielen Dank.
Nun bin ich mal beim Testen ;-)
Das Reading state wird aber nicht nur auf "Error -32002: Access denied" gesetzt, sondern auch auf "disconnect".
Wobei ich noch nicht rausgefunden habe, wann was kommt.

Eine Bitte noch:
wäre es möglich im Device UBUS_CLIENT und/oder im UBUS_CALL ein Reading mit der IP-Addresse zu setzen?
Ansonsten muss man sich die umständlich aus der Def oder dem Internal url des UBUS_CALL extrahieren.

Danke, lg, Gerhard