MQTT2 für Worx Landroid Mähroboter

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

Vorheriges Thema - Nächstes Thema

frober

#480
Habe gerade die Antwort bekommen.
Es geht über MQTT over https mit ALPN 'mqtt' und die Credentials in der Url oder über Websocket und Header (hier muss an den Endpunkt noch ein /mqtt).

Er hat mir ein Teil seines Codes mitgesendet, den muss ich mir noch anschauen...

@Rudi habe dir eine Mail gesendet, sollten nach einem erfolgreichen Connect keine Daten kommen, liegt es daran, dass mein Mäher noch schläft. Connect hat aber bei der DeskApp auch so funktioniert.
Im Laufe der nächsten Woche sollte er Online sein...
Ich kann ich dir gerne die Codezeilen zukommen lassen (C# und dotnet).

Wo wird das Protokoll 'wss-custom-auth'
bei WSS angegeben? Das gehört anscheinend doch nicht in den Header!?
Raspi 3b mit Raspbian Buster 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

Den MQTT Abschnitt im Developer-Guide habe ich auch gesehen token-signature ist wohl der letzte Teil vom access_token. Sind token-key-name und token-value die ersten beiden?
 
Ansonsten habe ich den iobroker Connector angeschaut, und jetzt ist mein Kopf fuer heute voll :)
Und wuesste gerne, wo updateCustomAuthHeaders definiert ist, in aws-iot-device-sdk-js-v2-main ist es nicht.

frober

#482
Zitat von: rudolfkoenig am 01 April 2023, 19:51:27Den MQTT Abschnitt im Developer-Guide habe ich auch gesehen token-signature ist wohl der letzte Teil vom access_token. Sind token-key-name und token-value die ersten beiden?
token-key-name = jwt
token-value = die beiden ersten mit Punkt verbunden
jwt: $token[0].".".$token[1]
ZitatUnd wuesste gerne, wo updateCustomAuthHeaders definiert ist, in aws-iot-device-sdk-js-v2-main ist es nicht.
updateCustomAuthHeaders habe ich auch nicht gefunden, theoretisch müsste das in der SDK sein.
Ein Token refresh erfolgt ähnlich wie die Neuanforderung. Anstelle User/Passwort wird der refresch_token gesendet. Damit erhält man einen neuen Token. Server disconnet und neuer Connect mit neuem Token. Mehr sollte es nicht sein.

data: JSON.stringify({
                client_id: this.clouds[this.config.server].clientId,
                scope: "user:profile mower:firmware mower:view mower:pair user:manage mower:update mower:activity_log user:certificate data:products mower:unpair mower:warranty mobile:notifications mower:lawn",
                refresh_token: this.session.refresh_token,
                grant_type: "refresh_token",
            }),

Die Tage habe ich Besuch, das Testen deines Workarounds kann etwas dauern.
Raspi 3b mit Raspbian Buster 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

Ich lade mal meinen aktuellen Stand hoch.
Die HTTP Aufrufe (auth, userinfo, deviceinfo) funktionieren, eine MQTT-Verbindung kann ich aber weder per wss noch per direktes MQTT herstellen.

Ich habe versucht die Konfiguration in das Hilfsmodul LandroidUtils.pm zu packen (siehe Anhang), damit ist die Definition wie folgt:
define MQTT2_Worx MQTT2_CLIENT XX
attr MQTT2_Worx connectFn {use LandroidUtils;;Landroid_connect($NAME,"worx")}
attr MQTT2_Worx username YYY
wobei username gesetzt werden muss, und auch das Passwort per "set MQTT2_Worx password ZZZ".

Ich habe vom iobroker die Cloud-Adressen der 4 Anbieter kopiert, d.h. statt XX wird die vom userinfo mitgelieferte Gegenstelle verwendet, nicht wundern.

Dank deviceinfo kriegt man eine Liste aller mit diesem Account verbundenen Geraete, diese werden automatisch angelegt (autocreate), und die im Paket erhaltenen Readings (bis auf auto_schedule und last_status) gesetzt.

Wenn man wss:XX statt XX schreibt, dann wird websocket versucht (wie geschrieben, geht auch nicht).
Nach der Verbindung klappt die Gegenseite ohne Details zu, die Aufgabe ist rauszufinden, wieso.
Zum Verwenden ist die aktuelle Version von MQTT2_CLIENT.pm noetig.

frober

Hallo Rudi,

wow, hätte ich jetzt nicht erwartet. Allein die Einbindung deines Workarounds fand ich schon super.

Ich habe heute kurz getestet, bekommst du einen Token?
Ich musste 'data=> toJSON(...' nacharbeiten, d.h. alles in eine Zeile, ohne unnötige Leerzeichen etc.
data => toJSON({client_id=>"150da4d2-bb44-433b-9429-3773adc70a2a", username=>$usr, password=>$pwd, scope=>"*", grant_type=>"password"})
Der Server ist hier zickig, was ich bei meinen ersten Versuchen gemerkt habe. Deswegen hatte ich den Json-String auch vorerst direkt rein geschrieben.

Ich vermute das beim https die Substitution beim Token verkehrt ist.

Im Log bein Connect hängt nach den Token noch das Passwort, stört evtl auch und der User in der Url ist vermutlich auch nicht der Anmeldename. In der DeskApp ist hier einfach 'da' und beim ioBroker wird als username 'ioBroker' übergeben.

Könnte noch nicht weiter testen ..
Raspi 3b mit Raspbian Buster 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

ZitatIch habe heute kurz getestet, bekommst du einen Token?
Mit der angehaengter Datei und MQTT2_Client.pm aus SVN?
Welchen "Step" meinst Du?

Die 3 Webcalls (auth, userinfo, deviceinfo) klappen, ich kann dank deviceInfo die Details deines Geraetes anschauen.

frober

#486
Zitat von: rudolfkoenig am 03 April 2023, 20:12:53
ZitatIch habe heute kurz getestet, bekommst du einen Token?
Mit der angehaengter Datei und MQTT2_Client.pm aus SVN?
Welchen "Step" meinst Du?

Die 3 Webcalls (auth, userinfo, deviceinfo) klappen, ich kann dank deviceInfo die Details deines Geraetes anschauen.

Nein, war heute Morgen mit den Daten per Mail.

D.h. du hast API Zugriff?
Da wäre ein Test mit der userID bzw. von /User/me die ID (k.a. wie man die übergibt) und den gelieferten Endpunkt noch interessant.
Morgen Abend sollte ich etwas Zeit zum Testen haben ..
Raspi 3b mit Raspbian Buster 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

#487
Hallo Rudi,

ich bin den Code durchgegangen und habe nun gesehen, dass du mein Geschriebenes schon umgesetzt, bzw. den komplette Code von ioBroker nachgebaut hast. Wow, kann ich da nur sagen.

Nun habe ich kurz getestet, leider sperrt der Server bei 3-4 Fehlversuchen ( für 24h ?):
2023.04.04 11:01:36 5: MQTT2_Worx: discarding DISCONNECT (224)(0)Irgendwo habe ich gelesen, wenn man 3x keine Daten abruft wird man temp. gesperrt.

Da ich gesperrt werde, vermute ich mal, dass wir nah dran sind.
Hattest du die Meldung/Sperre auch?

In der Url (https) habe ich den User ausgetauscht. Nach meinen Infos ist es der Gleiche wie bei clientID, also aktuell ioBroker.
Falls ich einen Connect hinbekomme, teste ich, ob als User auch Fhem o.ä. funktioniert...

Zitat2023.04.04 10:12:41 5: MQTT2_Worx: sending CONNECT (16)(227)(11)(0)(4)MQTT(4)(194)(2)X(0)<WX/USER/xxx/iobroker/xxx(5)(142)iobroker?x-amz-customauthorizer-signature=xxx&jwt=xxx(0)(9)Passwort!

Am Ende wird hier das Passwort mit gesendet, keine Ahnung ob das stört.

Edit: für Websocket, wäre wss-custom-auth nicht hier zu setzten?
anstatt
Sec-WebSocket-Protocol: mqttfolgendes
Sec-WebSocket-Protocol: wss-custom-auth
P:S.: wo lag nun die Lösung für den API connect, warum hat es bei mir nicht funktioniert?
Raspi 3b mit Raspbian Buster 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

Für die die auch testen möchten...

Zeile 203 -206 sieht nun so aus:
Zitatmy $userName = "iobroker".
                   "?x-amz-customauthorizer-name=com-worxlandroid-customer".
                   "&x-amz-customauthorizer-signature=$token[2]".
                   "&jwt=$token[0].$token[1]";
Raspi 3b mit Raspbian Buster 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...

rippi46

Hallo,

wollte auch einmal testen, leider kommt beim laden der 00_MQTT2_ClIENT.pm
folgende fehlermeldung
ERROR:
Too many arguments for main::MQTT2_CLIENT_feedTheList at ./FHEM/00_MQTT2_CLIENT.pm line 544, near "1)"

und beim laden der LandroidUtils.pm
Too many arguments for main::MQTT2_CLIENT_connect at ./FHEM/LandroidUtils.pm line 225, near "1)"
Fehlt noch irgendein Modul?


Gruß rippi
FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

frober

Zitat von: rippi46 am 04 April 2023, 14:23:54Hallo,

wollte auch einmal testen, leider kommt beim laden der 00_MQTT2_ClIENT.pm
folgende fehlermeldung
ERROR:
Too many arguments for main::MQTT2_CLIENT_feedTheList at ./FHEM/00_MQTT2_CLIENT.pm line 544, near "1)"

und beim laden der LandroidUtils.pm
Too many arguments for main::MQTT2_CLIENT_connect at ./FHEM/LandroidUtils.pm line 225, near "1)"
Fehlt noch irgendein Modul?


Gruß rippi


Hast du kein komplettes Update gemacht?
Evtl. fehlt noch HttpUtils.pm
Das wurde davor schon überarbeitet.
Raspi 3b mit Raspbian Buster 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

ZitatToo many arguments for main::MQTT2_CLIENT_feedTheList at ./FHEM/00_MQTT2_CLIENT.pm line 544, near "1)"
Diese Version von MQTT2_CLIENT ist _sehr_ alt.
Benoetigt wird eine vom 3.April.

ZitatEdit: für Websocket, wäre wss-custom-auth nicht hier zu setzten?
Soweit ich sehe, ist "wss-custom-auth" nur ein Hinweis an die drunterliegende MQTT/Websocket Bibliothek, die x-amz-* HTTP Header zu setzen, bzw. beim Fehlen der noetigen Tokens sich zu beschweren. Fuer die Anderen: wir reden hier von der iobroker Implementation.

ZitatP:S.: wo lag nun die Lösung für den API connect, warum hat es bei mir nicht funktioniert?
Welchen "API connect" meinst Du?
- auth abholen hast Du schon hingekriegt.
- userinfo und deviceinfo hast Du nicht probiert, die funktionieren genauso wie auth
- MQTT-Connect funktioniert bei mir nicht, weder mit deinem "iobroker Patch", noch mit einem leeren Passwort. Die Leitung wird einfach zugemacht, ich kriege nicht mal ein DISCONNECT.

rippi46

Hallo

ein Connect bekomme ich mit
define MQTT2_Worx MQTT2_CLIENT XX
attr MQTT2_Worx connectFn {use LandroidUtils;;Landroid_connect($NAME,"worx")}
attr MQTT2_Worx username YYY

auch nicht hin, aber es wir bei mir ein Mqtt-Device angelegt, das alle Daten von meinem Landroid enthält.
Steuern kann ich ihn aber nicht.


Gruß rippi



FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

rudolfkoenig


frober

#494
Zitat von: rudolfkoenig am 05 April 2023, 12:13:33
ZitatP:S.: wo lag nun die Lösung für den API connect, warum hat es bei mir nicht funktioniert?
Welchen "API connect" meinst Du?
- auth abholen hast Du schon hingekriegt.
- userinfo und deviceinfo hast Du nicht probiert, die funktionieren genauso wie auth
- MQTT-Connect funktioniert bei mir nicht, weder mit deinem "iobroker Patch", noch mit einem leeren Passwort. Die Leitung wird einfach zugemacht, ich kriege nicht mal ein DISCONNECT.

Das stimmt nicht ganz, habe es nur nicht geschrieben.

Diesen Endpoint hatte ich eh versucht
.../api/v2/user/me

habe auch auch diesen getestet, bekam jeweils eine 403
.../api/v2/product-items?status=1&gps_status=1
Soweit ich es gesehen habe, unterscheidet sich die Anfrage nur im Endpoint.
Deshalb meine Frage.

MQTT funktioniert noch nicht und ich müsste noch bis heute Abend gesperrt sein. Wenn du es während der Sperre probiert hast, verlängert sich sich diese vermutlich.

Was meinst du mit leeren Passwort?
Für der Token wird es ja benötigt, nur nicht beim MQTT connect.

Raspi 3b mit Raspbian Buster 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...