MQTT2 für Worx Landroid Mähroboter

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

Vorheriges Thema - Nächstes Thema

rudolfkoenig

Merkwuerdig.
Ich habe mit folgender Definition gestartet (bis auf die Zertifikate alles uebernommen):

defmod MQTT_Worx MQTT2_CLIENT a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com:8883
attr MQTT_Worx SSL 1
attr MQTT_Worx clientId android-62378444-f33f-fe1c-601e-9d01fc947796
attr MQTT_Worx disable 1
attr MQTT_Worx maxNrConnects 1
attr MQTT_Worx keepaliveTimeout 600
attr MQTT_Worx mqttVersion 3.1.1
attr MQTT_Worx msgAfterConnect DB510/MAC/commandIn {}
attr MQTT_Worx sslargs SSL_version:TLSv12 SSL_cert_file:certs/server-cert.pem SSL_key_file:certs/server-key.pem SSL_use_cert:1
attr MQTT_Worx subscriptions DB510/MAC/commandOut
attr MQTT_Worx verbose 5


und nach dem Start "attr MQTT_Worx disable 0" gesetzt.
Im Log steht:


2023.02.24 20:14:34 5: HttpUtils url=https://a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com:8883/ NonBlocking via https
2023.02.24 20:14:34 4: IP: a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com -> 18.200.140.213
2023.02.24 20:14:34 5: MQTT_Worx: sending CONNECT (16)8(0)(4)MQTT(4)(2)(2)X(0),android-62378444-f33f-fe1c-601e-9d01fc947796
2023.02.24 20:14:34 5: DevIo_SimpleWrite MQTT_Worx: 103800044d51545404020258002c616e64726f69642d36323337383434342d663333662d666531632d363031652d396430316663393437373936
2023.02.24 20:14:34 1: a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com:8883 reappeared (MQTT_Worx)
2023.02.24 20:14:35 1: a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com:8883 disconnected, waiting to reappear (MQTT_Worx)
2023.02.24 20:14:35 2: maxNrConnects (1) reached, no more reconnect attemtps

frober

Ich habe noch das wss: vor der Url.
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

Danke, damit konnte ich es nachstellen.
Hab den Kode angepasst.

frober

Zitat von: rudolfkoenig am 24 Februar 2023, 21:14:41
Danke, damit konnte ich es nachstellen.
Hab den Kode angepasst.

Danke auch.
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...

pillepalle12

Hallo zusammen,

ich habe meinen Roboter aus dem Winterschlaf geholt und wollte gerade die FHEM Anbindung testen und der MQTT Server geht immer auf "disconnected"...

habe die letzten paar Seiten des Threads gelesen, bin aber nicht dahinter gekommen, ob es jetzt wieder funktionieren sollte oder wie ich vorgehen kann um meine (in der letzten Saison funktionierende) Config zu reparieren.

Könnt Ihr mir einen Tipp geben wie der aktuelle Stand ist?

Vielen, vielen Dank

frober

Aktuell funktioniert es nicht, hatte auch noch keine Zeit danach zu schauen.
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...

Ralli

Gruß,
Ralli

Proxmox 8.2 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.7.20240601) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

remo

Hallo.
Ich bin ebenfalls ein ,,Betroffener".
Kann ich mich in irgend einer Weise der Lösungsfindung anschließen bzw. Unterstützung anbieten?

frober

#428
Hallo Rudi,

Ich habe mich eingelesen komme aber noch nicht zurecht, da ich eine POST Anfrage senden muss.
Ich hänge hier meinen aktuellen Stand an.

myUtils habe ich benutzt, da die Authentifizierung über MQTT2_Client alleine nicht funktionieren wird.
Soweit ich bisher durchgeblickt habe, Anfrage an Url1, Token an Url2 und dann erst connect zum MQTTServer (Url3).

Ich habe das Bsp aus dem Wiki HttpUtils benutzt und etwas für mich angepasst. Bekomme jedoch Syntaxfehler und finde diese nicht. Vielleicht sehen ich auch vor lauter Wald die Bäume nicht.
Nachtrag: Möglich, dass sich nicht sichtbare Zeichen durch das Kopieren aus dem Wiki eingeschlichen haben. Mit Notepad++, wie ich das sonst auch tue, habe ich aber keine gefunden.

Aus ioBroker habe ich mir den Header extrahiert und die POST Daten mit einer Leerzeile als Json (mit toJSON() konvertiert) daran gehängt. Im Json musste ich das @ nachträglich escapen.
Kann das so funktionieren?

Header:
url: "https://id.eu.worx.com/oauth/token"
method: "post"
headers:
accept: "application/json"
"content-type": "application/json"
"user-agent": "fhem "
"accept-language": "de-de"

data:
client_id: "android-xxxxxx"
username: "xxx@xxx.de"
password: "xxxxxx"
scope: "*"
grant_type: "password"



SyntaxError aus MyUtils:
syntax error at ./FHEM/99_myUtils_Landroid.pm line 36, near "callback"
Global symbol "$param" requires explicit package name (did you forget to declare "my $param"?)
at ./FHEM/99_myUtils_Landroid.pm line 39. syntax error at ./FHEM/99_myUtils_Landroid.pm line 40, near "}"

Can't redeclare "my" in "my" at ./FHEM/99_myUtils_Landroid.pm line 45, near "my" syntax error at ./FHEM/99_myUtils_Landroid.pm line 67, near "}"


myUtils:
package main;

use strict;
use warnings;
use HttpUtils;

sub
myUtils_Logdatei_Initialize {
  my $hash = shift;
  return;
}

sub connectWorx
{
    my $hash = 'WorxTest';
    #my $def = shift;
    #my $name = $hash->{NAME};
    my $param = {
                    url        => "https://id.eu.worx.com/oauth/token",
                    timeout    => 5,
                    hash       => $hash,
                    method     => "POST",
                    header     => "User-Agent: android\r\nAccept: application/json\r\ncontent-type: application/json\r\naccept-language: de-de\r\n\r\nclient_id:\u0022android-xxxxxx\u0022,username:xxxx\@xxxx.de,password:xxxxx,scope:\u0022*\u0022,grant_type:\u0022password\u0022,"
                    callback   => \&X_ParseHttpResponse
                };

    HttpUtils_NonblockingGet($param);
}

sub X_ParseHttpResponse
{
    my $param = shift;
    my $err = shift;
    my $data = shift;
    my $hash = $param->{hash};
    my $name = 'Landroid';

    if($err ne "")                                                                                                      # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
    {
        Log3 $name, 3, "error while requesting ".$param->{url}." - $err";                                               # Eintrag fürs Log
        #readingsSingleUpdate($hash, "fullResponse", "ERROR", 0);                                                        # Readings erzeugen
    }

    elsif($data ne "")                                                                                                  # wenn die Abfrage erfolgreich war ($data enth? die Ergebnisdaten des HTTP Aufrufes)
    {
        Log3 $name, 3, "url ".$param->{url}." returned: $data";                                                         # Eintrag fürs Log

        # An dieser Stelle die Antwort parsen / verarbeiten mit $data

        #readingsSingleUpdate($hash, "fullResponse", $data, 0);                                                          # Readings erzeugen
    }

    # Damit ist die Abfrage zuende.
    # Evtl. einen InternalTimer neu schedulen
}

1;


Danke und Grüße
Bernd
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...

Ralli

Zitat von: frober am 10 März 2023, 20:40:37

SyntaxError aus MyUtils:
syntax error at ./FHEM/99_myUtils_Landroid.pm line 36, near "callback"
Global symbol "$param" requires explicit package name (did you forget to declare "my $param"?)
at ./FHEM/99_myUtils_Landroid.pm line 39. syntax error at ./FHEM/99_myUtils_Landroid.pm line 40, near "}"

Can't redeclare "my" in "my" at ./FHEM/99_myUtils_Landroid.pm line 45, near "my" syntax error at ./FHEM/99_myUtils_Landroid.pm line 67, near "}"


myUtils:
sub connectWorx
{
...
    my $param = {
                    url        => "https://id.eu.worx.com/oauth/token",
                    timeout    => 5,
                    hash       => $hash,
                    method     => "POST",
                    header     => "User-Agent: android\r\nAccept: application/json\r\ncontent-type: application/json\r\naccept-language: de-de\r\n\r\nclient_id:\u0022android-xxxxxx\u0022,username:xxxx\@xxxx.de,password:xxxxx,scope:\u0022*\u0022,grant_type:\u0022password\u0022,"
                    callback   => \&X_ParseHttpResponse
                };

...


Das erste was mir sofort ins Auge fällt ist die Variablendefinition. Wenn du einen Hash mit Keys und Values definieren willst, dann musst du das mit


my %param = ...


machen.

Vielen Dank für deinen Code und deine Tests.
Gruß,
Ralli

Proxmox 8.2 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.7.20240601) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

frober

Zitat von: Ralli am 11 März 2023, 07:34:21
Das erste was mir sofort ins Auge fällt ist die Variablendefinition. Wenn du einen Hash mit Keys und Values definieren willst, dann musst du das mit


my %param = ...


machen.

Vielen Dank für deinen Code und deine Tests.

Der Code ist vermutlich von Rudi und stammt von hier
https://wiki.fhem.de/wiki/HttpUtils
Ist eigentlich ein Bsp. für Modulentwickler.

Ich habe nur die Daten für den Header zusammen gestellt.

Es muss auch klar sein, das ist nur die erste Treppenstufe...
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

Ich habe mir gerade HttpUtils angesehen, da fehlt application/json beim MIMETyp.
Daher kommt evtl schon ein Teil der Syntaxfehler.

Daher war auch die Frage an Rudi gestellt:
Geht das überhaupt (also mit POST und Json) aktuell mit HttpUtils?
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 mir gerade HttpUtils angesehen, da fehlt application/json beim MIMETyp.
Finde ich nicht wirklich relevant.
Dieser hash wird fuer DateinamenEndung => Content-Type Zuordnung verwendet, und die Anzahl der JSON Dateien(!) die FHEM ausliefern muss, ist bisher begrenzt.
Welche Endungen haben JSON-Dateien im Normalfall?

ZitatGeht das überhaupt (also mit POST und Json) aktuell mit HttpUtils?
Klar geht das, man muss im HttpUtils_NonblockingGet ein header definieren mit einem Content-Type Eintrag.

frober

#433
Zitat von: rudolfkoenig am 11 März 2023, 11:38:53
Welche Endungen haben JSON-Dateien im Normalfall?
*.json  würde ich Mal behaupten

Zitat
Klar geht das, man muss im HttpUtils_NonblockingGet ein header definieren mit einem Content-Type Eintrag.

Habe ich hier, auch wenn es noch fehlerbehaftet ist.
https://forum.fhem.de/index.php/topic,111959.msg1267678.html#msg1267678
Ich möchte damit erstmal ein Connect und sehen was zurück kommt. Daher habe ich einiges aus kommentiert.

Nachtrag: meine Json Syntax stimmt nicht nicht, schaue ich mir heute Abend nochmal an.
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

So, die Sub funktioniert aktuell, nur der Server beschwert sich über fehlende/falsche Daten.  :(
Die Syntaxfehler kamen nur von einem Komma, das ich vergessen hatte.  :o

Die cliend_id habe ich aktuell vom ioBroker übernommen.

package main;

use strict;
use warnings;
use HttpUtils;

sub
myUtils_Logdatei_Initialize {
  my $hash = shift;
  return;
}


sub connectWorx
{

    my $hash = 'WorxTest';
    #my $def = shift;
    #my $name = $hash->{NAME};
    my $param = {
                    url        => "https://id.eu.worx.com/oauth/token",
                    timeout    => 5,
                    hash       => $hash,
                    method     => "POST",
                    header     => "User-Agent: android\r\nAccept: application/json\r\ncontent-type: application/json\r\naccept-language: de-de",
    data       => '"{\n    client_id: \"150da4d2-bb44-433b-9429-3773adc70a2a\",\n    username: \"xxx@xxx.de\",\n    password: \"xxxxxx\",\n    scope: \"*\",\n    grant_type: \"password\",\n}"',
                    callback   => \&X_ParseHttpResponse
                };


    HttpUtils_NonblockingGet($param);
}

sub X_ParseHttpResponse
{
    my $param = shift;
    my $err = shift;
    my $data = shift;
    my $hash = $param->{hash};
    my $name = 'Landroid';


    if($err ne "")                                                                                                      # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
    {
Log3 $name, 3, "error while requesting ".$param->{url}." - $err";                                               # Eintrag fürs Log
        #readingsSingleUpdate($hash, "fullResponse", "ERROR", 0);                                                        # Readings erzeugen
    }

    elsif($data ne "")                                                                                                  # wenn die Abfrage erfolgreich war ($data enth? die Ergebnisdaten des HTTP Aufrufes)
    {

        Log3 $name, 3, "url ".$param->{url}." returned: $data";                                                         # Eintrag fürs Log

        # An dieser Stelle die Antwort parsen / verarbeiten mit $data

        #readingsSingleUpdate($hash, "fullResponse", $data, 0);                                                          # Readings erzeugen
    }

    # Damit ist die Abfrage zuende.
    # Evtl. einen InternalTimer neu schedulen
}

1;


Das Json habe ich online konvertiert und getestet, sollte vom Syntax her passen.

Antwort vom Server:
2023-03-11 18:12:12 url https://id.eu.worx.com/oauth/token returned: {"error":"invalid_request","error_description":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.","hint":"Check the `grant_type` parameter","message":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed."}
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...