MQTT2 für Worx Landroid Mähroboter

Begonnen von Otto123, 09 Juni 2020, 13:55:43

Vorheriges Thema - Nächstes Thema

rudolfkoenig

Zitat{ $defs{MQTT2_Worx}{header} =  { Hdr1=>"Val1", Hdr2=>"Val2"} }; set MQTT2_Worx disconnect; set MQTT2_Worx connect
Ich hoffe Du hast das nicht so gesetzt, Hdr1, usw war nur als Beispiel gedacht :)

MQTT2_CLIENT over WebSocket war noch nicht soweit: mosquitto wollte mit FHEM ueber Websocket nicht reden.

Da ich keine Doku gefunden habe, und auch die mosquitto debug-Ausgabe nichts verraet, protokollierte ich eine Verbindung mit einem JavaScript MQTT-WebSocket Client mit strace, das war etwas muehselig. Ergebnis:  MQTT CONNECT wird erst beantwortet, wenn das HTTP Header Sec-WebSocket-Protocol:mqtt gesetzt ist. Es mussten auch ein paar weitere Kleinigkeiten geaendert werden, jetzt scheint es aber zu tun, auch mit wss:

Es gibt jetzt auch ein httpHeader Attribut, ist aber fuer "plain" ws: bzw. wss: nicht notwendig.
Fuer wss-custom-auth oder andere merkwuerdige Loesungen mag es aber nuetzlich sein.

Ralli

#406
Vielen Dank, Rudi.

Das ist mit Sicherheit ein Puzzle-Teil, aber ich fürchte, @Otto, dass wir das Problem konkret mit Worx/Landroid alleine so nicht gelöst bekommen. Wenn ich mit meinen rudimentären Kenntnissen den Code https://github.com/iobroker-community-adapters/ioBroker.worx/blob/master/main.js ansehe, sind noch mehrere Dinge nötig, um das wieder zum Fliegen zu bringen.

Es fängt damit an, dass m.E. grds. über einen API-Request nach User-Login die erforderlichen Informationen abgeholt werden, mit denen dann schlussendlich die eigentliche MQTT-Verbindung hergestellt wird.

Es beginnt in Zeile 121 bzw 145 mit dem Login, da bekommt der Client dann auch zunächst den Token. Ab Zeile 267 fragt er in der Folge per API-Zugriff die DeviceList ab (mittels zuvor erhaltenem Token) und ab Zeile 483 dann die dazugehörigen Details, um dann ab Zeile 715 bzw. 724 die eigentliche Verbindung zum Broker herzustellen.

Insofern fürchte ich, muss in FHEM vor dem Herstellen der MQTT-Client-Verbindung dieses Verhalten durch vorgelagerte Funktion(en) nachgebaut werden. Selbst wenn sich die Details des Roboters und der Infrastruktur, die zum Herstellen der MQTT-Verbindung bzw. zur Definition des Devices wichtig sind, nicht allzu häufig ändern dürften, muss aber auf jeden Fall der Token alle 3600 Sekunden erneuert werden - und dass geht nur über API-Zugriff nach Login.

@Rudi: wäre es ein Ansatz, über das neu eingebaute Attribut httpHeader key:value auch Perl-Funktionen à la key:{value} zu ermöglichen, um darüber den jeweils gültigen/erneuerten Token mitzugeben?

Das kann ich persönlich leider nicht umsetzen.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

frober

#407
Zitat von: rudolfkoenig am 18 Februar 2023, 23:13:30
Ich hoffe Du hast das nicht so gesetzt, Hdr1, usw war nur als Beispiel gedacht :)

Leider doch  ::)
Für mich ist das Neuland, was müsste anstelle Hdr1/2 angegeben werden?

Die Frage ist wohl untergegangen: ist das auto reconnect abschaltbar?
Der Server hat bisher, bei zu vielen Anfragen den Client für 24h gesperrt. Bei unseren Versuche ist dies schnell erreicht.

Die Auth erfolgt über die API, das ist richtig. Der per Mail gesendete Link mit dem Token geht direkt wieder an die API. Da er nur 10Min gültig ist, kann ich ihn teilen:
https://app.worxlandroid.com/login?code=def50200473b1d0d1935d6d9d6075e4a40efc5de52902f7a2d5d75b26dd18751114ca238495eb3dbe84362f111ace033807c1aae83f261cc724f58dc33397493303696234fa29804a381a80629f794b5fe3f605f240b0a58e6aeefc4222d95ae1874e3bdd4d937d226b2f90424378e7f06217c415f52ef76f24b6dd26639a17329cea5d75508ace6695ec7aa4e44e3d3f2d727f2437388a784686d6d0dd5ee7f73f905ffcec12e630370f5031c6a2b6bea1e6a05dfc2a05370cea6b8f9d5f3c846812fca245ceaaa80ae51f6bf2bd6b30c9f6c86fa0f8edc025e9d5167d3e2c35103319d172dc9575c2e77b87ee84ce041490c62d7acc2c368a017d65912a0362c9afa4ea39eb69d191fa672a165e2c725c24b0207a41215254ba1530b6c24f33b4d9a22565a3c28e15a55c9e81b2ebac2a3453c0429b5cf7d53f1c56ad11151a299969bf1a59a3d0b850d8be34e814416c5775d980e35731a95e424542255fa5cc780fdfb455058913aaf3692ac9d0afa8cafb2db051f8ed61e743b5f549874e26aa2a97e83b97d2f8743922eeb304f3650fbb03fe9fc67fda2033c50f8b7d62bb124c6caa27b5afa860d708bd07d7a85c248c72ed82c729ed09461590c033b66ed5376c9a45a2bcfda3f840708ddfd5b9b7924296bf94d3b675e28156830dd9e9f1c90bac3e70d9256863331ec5aa4b4ca5c246d9339fa9d34e46d82bb20a4af5596a8b0c7acc6f90f02792e1f332b38b2aafc984c0dfc41c362988636c6a18e822f9b16a7fa910e8bd465497011837b16b59144289766fcc5a0f5cda3765d3a0dbda4daaf956ffb6188b0fd06e35641763f8346fc58dd2de8cd9f067c850163233985aeca890832b7fc4fdbc89e3128ffa2cd2c2b53e&state=wFrsjjVORAT8Hpk7b5zPG7bZFe8-XkXhr43
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

frober

Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

rudolfkoenig

ZitatFür mich ist das Neuland, was müsste anstelle Hdr1/2 angegeben werden?
Ich fuerchte das "Ob und wenn ja was" ist eure Aufgabe rauszufinden, ich fuehle mich nur fuer den Unterbau zustaendig.

Die Frage ist wohl untergegangen: ist das auto reconnect abschaltbar?

Mit dem Attribut disabled.
Oder wenn die Gegenseite per MQTT CONNACK Message ein Authentifizierungsfehler meldet.

frober

#410
Zitat von: rudolfkoenig am 19 Februar 2023, 10:49:01

Mit dem Attribut disabled.
Oder wenn die Gegenseite per MQTT CONNACK Message ein Authentifizierungsfehler meldet.

disable ist klar, verwende ich schon.
Ist halt nervig, nach jedem Versuch direkt wieder disable zu setzten und wenn man zu langsam ist, sind schon wieder 2-3 reconnect passiert.
Ist es nicht möglich ein attr autoconnect ja/nein einzuführen? Das wäre für solche 'Experimente' hilfreich.

Entweder wird CONNACK nicht gesendet oder es funktioniert nicht. Mein Log war in einem Tag 56MB groß nur durch fehlerhafte Auth. Alle x sec ein reconnect.

Nachtrag: deaktiviert disable nur das reconnect, d.h. kann ich mit gesetztem disable trotzdem testen?
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Ralli

#411
Als Workaround, bis eine Lösung mit FHEM alleine gefunden wurde, habe ich ioBroker mit dem Worx-Adapter sowie dem mqtt-Adapter (MQTT Broker/Client) angezapft.

- Den Worx-Adapter im ioBroker entsprechend konfigurieren
- Den MQTT Broker/Client im ioBroker entweder als Broker konfigurieren (Alt. 1) oder
- Den MQTT Broker/Client im ioBroker als Client für einen bereits im Netz befindlichen anderen Broker konfigurieren (Alt. 2)

Ich selbst nutze Alternative 2.

1)
Auf dem ioBroker ist die MQTT-Instanz in den MQTT-Einstellungen entsprechend zu konfigurieren:

Prefix für alle Topics: bei mir leer

Maske zum Bekanntgeben eigener States:
worx.0.HIER_DIE_SERIENNUMMER_VOM_LANDROID.areas.*,worx.0.HIER_DIE_SERIENNUMMER_VOM_LANDROID.calendar.*,worx.0.HIER_DIE_SERIENNUMMER_VOM_LANDROID.modules.*,worx.0.HIER_DIE_SERIENNUMMER_VOM_LANDROID.mower.*,worx.0.HIER_DIE_SERIENNUMMER_VOM_LANDROID.product.*

Haken bei "Eigene States beim Verbinden publizieren" setzen
Haken bei "Nur bei Änderungen publizieren" setzen
Haken bei "Sende auch Zustände (ack=true)" setzen

2)
In FHEM den entsprechenden MQTT-Client für den genutzten Broker unter Ziff. 1 definieren.

Da ich selbst einen zentralen MQTT-Server bereits nutze und den auch in FHEM bereits eingebunden habe, habe ich in der dazugehörigen Bridge-Konfiguration in dortigem bridgeRegexp-Attribut folgende Erweiterung vorgenommen:


worx/[0-9]+/([0-9]+)/.* "Landroid_$1"


3)
Nach Neustart der MQTT-Instanz auf dem ioBroker sollte dann in FHEM automatisch ein Device nach dem Schema "MQTT2_Landroid_HIER_DIE_SERIENNUMMER_VOM_LANDROID" angelegt werden.

Die automatisch angelegten und gefüllten Attribute wie folgt ersetzen:


attr MQTT2_Landroid_HIER_DIE_SERIENNUMMER_VOM_LANDROID devicetopic worx/0/HIER_DIE_SERIENNUMMER_VOM_LANDROID
attr MQTT2_Landroid_HIER_DIE_SERIENNUMMER_VOM_LANDROID readingList $DEVICETOPIC/rawMqtt/.* {}\
$DEVICETOPIC/.* { $TOPIC =~ s/$DEVICETOPIC\///;; $TOPIC =~ s/^mower\/|^product\/|^areas\///;; $TOPIC =~ s/\//_/g;; return if $TOPIC =~ m{firmware_available_all|activityLog|accessories};; { "$TOPIC"=>$EVENT }}
attr MQTT2_Landroid_HIER_DIE_SERIENNUMMER_VOM_LANDROID room MQTT2_DEVICE
attr MQTT2_Landroid_HIER_DIE_SERIENNUMMER_VOM_LANDROID setList startMower:noArg $DEVICETOPIC/mower/state true\
stopMower:noArg $DEVICETOPIC/mower/state false\
pauseMower:noArg $DEVICETOPIC/mower/pause true\
startBorderCut:noArg $DEVICETOPIC/mower/edgecut true\
torqueSetting:slider,-50,1,50 $DEVICETOPIC/mower/torque $EVTPART1\
PartyMode:on,off { my %hash = ( 'on' => 'true', 'off' => 'false');; qq($DEVICETOPIC/mower/partyModus $hash{$EVTPART1})}\
mowerRainDelay:slider,0,30,1440 $DEVICETOPIC/mower/waitRain $EVTPART1\
setOneTime:slider,10,10,720 $DEVICETOPIC/mower/oneTimeWorkTime $EVTPART1\
startOneTime:noArg $DEVICETOPIC/mower/oneTimeStart true\
mowerTimeCorrection:slider,-100,1,100 $DEVICETOPIC/mower/mowTimeExtend $EVTPART1
attr MQTT2_Landroid_HIER_DIE_SERIENNUMMER_VOM_LANDROID userReadings statusTxt:status.* {my %stateCodes = (\
0 => "Idle",\
1 => "Home",\
2 => "Start sequence",\
3 => "Leaving home",\
4 => "Follow wire",\
5 => "Searching home",\
6 => "Searching wire",\
7 => "Mowing",\
8 => "Lifted",\
9 => "Trapped",\
10 => "Blade blocked",\
11 => "Debug",\
12 => "Remote control",\
30 => "Going home",\
31 => "Zone Training",\
32 => "Edge cutting",\
33 => "Searching zone",\
34 => "Pause"\
);; $stateCodes{ReadingsVal($name,"status","0")}},\
errorTxt:error.* { my %errorCodes = (\
0 => "No error",\
1 => "Trapped",\
2 => "Lifted",\
3 => "Wire missing",\
4 => "Outside wire",\
5 => "Raining",\
6 => "Close door to mow",\
7 => "Close door to go home",\
8 => "Blade motor blocked",\
9 => "Wheel motor blocked",\
10 => "Trapped timeout",\
11 => "Upside down",\
12 => "Battery low",\
13 => "Reverse wire",\
14 => "Charge error",\
15 => "Timeout finding home",\
16 => "Mower locked",\
17 => "Battery temp out of range"\
);; $errorCodes{ReadingsVal($name,"error","0")}}


Mit diesem Workaround sollten zumindest die aktuellen Daten weiterhin in FHEM ankommen und auch eine Steuerung mit fast gleichem Funktionsumfang wie bei der bisherigen MQTT-Variante möglich sein.

Ist mit Sicherheit noch hübscher zu machen und ggf. gibt's auch noch den einen oder anderen Fehler in der Setlist, aber es ist ein Anfang.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

rudolfkoenig

ZitatIst es nicht möglich ein attr autoconnect ja/nein einzuführen? Das wäre für solche 'Experimente' hilfreich.

Neu:
ZitatmaxNrConnects <number>
maximum number of established connections. Useful when experimenting with public server, where repeatedly failing connection attempts lead to temporary suspension of the account.
The counter is increased after the TCP connection is established, before the MQTT handshake. Reset the counter with the modify or defmod command.

Ralli

Vielen Dank Rudi.

Zitat von: Ralli am 19 Februar 2023, 07:18:56
@Rudi: wäre es ein Ansatz, über das neu eingebaute Attribut httpHeader key:value auch Perl-Funktionen à la key:{value} zu ermöglichen, um darüber den jeweils gültigen/erneuerten Token mitzugeben?
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

frober

Zitat von: rudolfkoenig am 20 Februar 2023, 10:49:10
Neu:

Super, danke Rudi.

@Ralli, im Moment ist es schwierig zu verstehen was nötig ist für die Auth. IoBroker verwendet das SDK von AWS. Vielleicht hilft das Trace von der DeskApp, wenn diese wieder funktioniert. Aber den Ansatz über die myUtils habe ich auch im Sinn...ich denke aber, das ist erstmal unabhängig vom Client. Erst muss der Connect zur API stehen.
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

rudolfkoenig

Zitat@Rudi: wäre es ein Ansatz, über das neu eingebaute Attribut httpHeader key:value auch Perl-Funktionen à la key:{value} zu ermöglichen, um darüber den jeweils gültigen/erneuerten Token mitzugeben?

Man soll die Jugend beim Experimentieren nicht aufhalten :)
attr m2c httpHeader TimeNow:{TimeNow()}

erzeugt ab sofort die zusaetzliche HTTP Header Zeile
TimeNow: 2023-02-20 13:20:40

Ralli

Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

frober

Zitat von: rudolfkoenig am 20 Februar 2023, 10:49:10
maxNrConnects <number>
maximum number of established connections. Useful when experimenting with public server, where repeatedly failing connection attempts lead to temporary suspension of the account.
The counter is increased after the TCP connection is established, before the MQTT handshake. Reset the counter with the modify or defmod command.

Hallo Rudi,

leider bin ich heute erst dazu gekommen.
Ich habe maxNrConnects 1 gesetzt, leider ohne Auswirkung. Sobald ich disable deaktiviere läuft das Log voll.

LG
Bernd

P.S. Fhem heute aktualisiert
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

rudolfkoenig

Kannst Du bitte ein Teil des Logs (bis die Wiederholung erkennbar ist) hier anhaengen?

frober

Zitat von: rudolfkoenig am 24 Februar 2023, 19:05:27
Kannst Du bitte ein Teil des Logs (bis die Wiederholung erkennbar ist) hier anhaengen?

Hier habe ich nur disable deaktiviert, ohne set connect.
Die Config wurde seit dem letzten Test nicht verändert, ich habe nur das neue Attr gesetzt.

2023.02.24 18:22:05 5: HttpUtils url=https://iot.eu-west-1.worxlandroid.com:8883/ NonBlocking via https
2023.02.24 18:22:05 5: HttpUtils url=https://iot.eu-west-1.worxlandroid.com:8883/ NonBlocking via https
2023.02.24 18:22:05 4: IP: iot.eu-west-1.worxlandroid.com -> 34.243.173.148
2023.02.24 18:22:05 4: IP: iot.eu-west-1.worxlandroid.com -> 34.243.173.148
2023.02.24 18:22:05 4: HttpUtils: iot.eu-west-1.worxlandroid.com: Verbindungsaufbau abgelehnt (111)
2023.02.24 18:22:05 4: HttpUtils: iot.eu-west-1.worxlandroid.com: Verbindungsaufbau abgelehnt (111)
2023.02.24 18:22:11 5: HttpUtils url=https://iot.eu-west-1.worxlandroid.com:8883/ NonBlocking via https
2023.02.24 18:22:11 4: IP: iot.eu-west-1.worxlandroid.com -> 34.248.97.122
2023.02.24 18:22:11 4: HttpUtils: iot.eu-west-1.worxlandroid.com: Verbindungsaufbau abgelehnt (111)
2023.02.24 18:22:16 5: HttpUtils url=https://iot.eu-west-1.worxlandroid.com:8883/ NonBlocking via https
2023.02.24 18:22:16 4: IP: iot.eu-west-1.worxlandroid.com -> 34.248.97.122
2023.02.24 18:22:16 4: HttpUtils: iot.eu-west-1.worxlandroid.com: Verbindungsaufbau abgelehnt (111)
2023.02.24 18:22:21 5: HttpUtils url=https://iot.eu-west-1.worxlandroid.com:8883/ NonBlocking via https
2023.02.24 18:22:21 4: IP: iot.eu-west-1.worxlandroid.com -> 34.248.97.122
2023.02.24 18:22:21 4: HttpUtils: iot.eu-west-1.worxlandroid.com: Verbindungsaufbau abgelehnt (111)
2023.02.24 18:22:26 5: HttpUtils url=https://iot.eu-west-1.worxlandroid.com:8883/ NonBlocking via https
2023.02.24 18:22:26 4: IP: iot.eu-west-1.worxlandroid.com -> 34.248.97.122
2023.02.24 18:22:26 4: HttpUtils: iot.eu-west-1.worxlandroid.com: Verbindungsaufbau abgelehnt (111)
2023.02.24 18:22:32 5: HttpUtils url=https://iot.eu-west-1.worxlandroid.com:8883/ NonBlocking via https
2023.02.24 18:22:32 4: IP: iot.eu-west-1.worxlandroid.com -> 34.248.97.122
2023.02.24 18:22:32 4: HttpUtils: iot.eu-west-1.worxlandroid.com: Verbindungsaufbau abgelehnt (111)


Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...