MQTT2 für Worx Landroid Mähroboter

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

Vorheriges Thema - Nächstes Thema

Otto123

Hallo Rasenmäher User,

es gibt für den LANDROID von Axel Mohnen ein Modul was irgendwann in diesem Thread entstanden ist.
Angeregt und mit Hilfe von diesem Beitrag habe ich eine Alternative gebaut.

Die alte Beschreibung hier ist mittlerweile obsolete.
Es gibt zur Einrichtung jetzt einen Wiki Artikel.

__________________________________________________

Zur Vorbereitung braucht man ein Tool welches als Windows oder Linux Version zur Verfügung steht. Windows Version V0.0.24 - Net.zip hat bei mir funktioniert. Man startet das Tool, trägt seinen Cloudzugang ein und erhält folgende Informationen:
  • Broker Server Adresse
  • Board ID z.B. bei den 2019 Modellen PRM100
  • Mac zwölf stellig
  • SSL Zertifikat AWS.p12 - liegt nach der Anmeldung im gleichen Pfad wie das Tool
Das Zertifikat von Windows auf den FHEM Server bringen (Pfad anpassen):
scp "D:\mqtt\WorxLandroidDeskApp\AWS.p12" pi@raspib3:
Ab jetzt sind alle Befehle zeilenweise für die FHEM Kommandozeile oder Blockweise für die Raw Definition!
Auch hier wieder den Pfad anpassen, wenn man nicht den Pfad /home/pi für das Zertifikate verwendet hat.

"openssl pkcs12 -in /home/pi/AWS.p12 -nokeys -passin pass: -out aws.cer -clcerts"
"openssl pkcs12 -in /home/pi/AWS.p12 -nodes -passin pass: -out aws.key -nocerts"
"chmod 0600 aws.*"
Das Template ist seit heute im SVN, wer ein halbwegs aktuelles FHEM hat kann das Template aktualisieren:
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }Bitte auf Erfolg und Fehlermeldungen prüfen.

Jetzt in FHEM den Connector zum Broker herstellen und testen. Die entsprechenden Daten eintragen!
define MQTT_Worx MQTT2_CLIENT <broker-server-adresse>:8883
attr MQTT_Worx SSL 1
attr MQTT_Worx autocreate simple
{my $uuid=substr(genUUID(),0,36);;fhem("attr MQTT_Worx clientId android-$uuid")}
attr MQTT_Worx keepaliveTimeout 600
attr MQTT_Worx mqttVersion 3.1.1
attr MQTT_Worx msgAfterConnect <BoardID>/<MAC>/commandIn {}
attr MQTT_Worx sslargs SSL_version:TLSv12 SSL_cert_file:aws.cer SSL_key_file:aws.key SSL_use_cert:1
attr MQTT_Worx subscriptions <BoardID>/<MAC>/commandOut
Hat man alles richtig gemacht, geht der state des Devices MQTT_Worx sofort auf opened.
Die erste Übertragung sollte automatisch ein neues MQTT_DEVICE erstellen.

Hinweis: Die clientID darf nicht mehrfach gleichzeitig zur Anmeldung verwendet werden, das führt binnen sekunden zur Sperre des Accounts für 24h. Ein echter Umzug der Definition in eine andere Instanz ist kein Problem. Die Anzahl der gleichzeitigen Verbindungen mit unterschiedlicher clientID ist scheinbar nicht limitiert.
Die clientID muss diese Form haben: android-ab345678-cd12-ef56-ab90-cd3456789012
Was dem Vorsatz android- plus einer 32 stelligen GUID (durch 4 Bindestriche eine Gesamtlänge von 36 Zeichen) entspricht.

Auf dieses Device wird jetzt das Template angewendet und damit konfiguriert.
set MQTT2_.*:FILTER=IODev=MQTT_Worx attrTemplate worx_landroidDie erfolgreiche Anwendung des Templates erzeugt ein Reading AttrTemplateVersion und ein Attribute model worx_landroid_mover.
Das Template übersetzt eine Reihe Readings in sprechende Namen und erzeugt vor allem mit der setList alle notwendigen Steuerbefehle für den mower.
Sollte die Befehlszeile nicht funktionieren, kann man das Template auch im set Befehl auswählen: worx_landroid

Bleibt der Connector MQTT_Worx auf disconnected -> die Zertifikate prüfen:
{qx(ls -lha /opt/fhem/aws.*)}Das Ergebnis sollte so aussehen:
-rw------- 1 fhem dialout 1.4K Jun  9 13:27 /opt/fhem/aws.cer
-rw------- 1 fhem dialout 1.8K Jun  9 13:27 /opt/fhem/aws.key

Man kann auch in die Dateien reinschauen und genauer prüfen:
{qx(openssl rsa -in aws.key -check|grep 'RSA key ok')}
{qx(openssl x509 -in aws.cer -noout -text|grep Issuer -A7)}
Beim ersten Befehl sollte einfach die Zeile RSA key ok kommen, beim Zweiten ein paar Infos über das zertifikat:
ZitatIssuer: OU = Amazon Web Services O=Amazon.com Inc. L=Seattle ST=Washington C=US
        Validity
            Not Before: Apr 30 15:33:19 2019 GMT
            Not After : Dec 31 23:59:59 2049 GMT
        Subject: CN = AWS IoT Certificate
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)

Viele Spass beim Testen

Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Hi Otto,

das liest sich sehr gut!

Vielleicht noch ein paar Optimierungsoptionen - im Sinne eines Angebots:
- in der desc sollten wir auf diesen Thread verweisen und kurz erläutern, dass man etwas Vorbereitung braucht.

- soweit ich das verstanden habe, braucht jeder Mower auch seinen eigenen Broker-Zugang (=MQTT2_CLIENT), für alles zusammen brauchen wir eigentlich drei Parameter (Server (Broker)-IP, BoardID und die MAC)?
Dann könnte man über ein "deviceloses" attrTemplate - anzuwenden von einem beliebigen MQTT2_DEVICE aus - alles auf einen Rutsch machen, indem man die (ggf. fehlenden) Sachen anfragt und auch das IO-Device direkt mit anlegt (indem man prüft, ob die IP-Adresse als DEF schon irgendwo vorhanden ist); hinterher ein "show (NEW_DEV|NEW_IO)".

Das ist dann aber wirklich "Kür"...

Sonst: Hut ab!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Das mit dem desc mache ich!
Das mit dem eigenen Broker ist eine interessante Frage ;) Ich weiß nicht wie viele den Zweitmäher eingebunden haben?
Ich bin da unsicher mit dem eigenen Broker Zugang, eigentlich ist der Broker Zugang erstmal nur ein Account. Unter dem kann man mehrere Mäher (Geräte?) registrieren.
Eventuell braucht man also die Topics gar nicht im Detail? Schau ich mir mal noch an.

attrTemplate direkt als "Setup" zu verwenden - da hab ich auch schon so ein bisschen drüber nachgedacht :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Das mit dem account dürfte richtig sein, kann also sein, dass das nicht 100% zielführend ist. Man könnte es aber abfragen, die 8883 scheint ja gesetzt zu sein. Ungetestet:
par:RADIO_CREATE_IO;Also create a MQTT2_CLIENT device: Enter IP address;{ undef }
par:RADIO_USE_EXISTING_IO;Use existing IO for Port 8883;{my @devices=devspec2array("TYPE=MQTT2_CLIENT:FILTER=DEF~:8883");;return 1 if $devices[0];;return undef}

Das mit den Parametern und option-Zweigen (und wann man ggf. escapen muß) ist vermutlich am einfachsten über die Sprachsteuerungstemplates bzw. deren Ansteuerung bei mehrkanaligen zu verstehen (siehe auch als Einstieg den changelog von heute morgen, da habe ich das für den 2.5-er Shelly dazugebastelt).

Es gibt (wenige) templates, die weitere Devices bauen oder bestehende andere verändern, aber "show" wäre vermutlich auch bei den mehrkanaligen noch so ein Thema, das ich mal angehen könnte, und das FHEMWEB-Umbiegen findet sich z.B. so: { fhem "trigger $FW_wname JS:location.href='$FW_ME?detail=IODEVNAME'" if($cl && $cl->{TYPE} eq "FHEMWEB") }
Sollte leicht auf show anzupassen sein...

(Das ganze ist jetzt aber der Kurs für Fortgeschrittene und angehende Maintainer ;) !)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

deeb

Hallo Otto123,

klingt ja gut, werde ich auch installieren.
Eine praktische Frage hätte ich aber vorab noch.
In dem Modul von Axel Mohnen wird meiner Meinung nach nicht die wöchentliche Mähzeit angezeigt, die man von den normalen Werten ausgehend prozentual verringern oder erhöhen kann.
Wenn man in der Android-App den Wert auf -100% stellt, bleibt der Landroid in der Ladestation.  Das ist für mich wichtig, weil ich für die Ladestation eine Überdachung/Garage gebaut habe. Dadurch registriert der Landroid mit seinen Regensensor aber nicht, wenn es "draussen" regnet. Das bedeutet, er fährt zur geplanten Mähzeit - auch bei strömenden Regen - los, merkt das es regnet und dreht entlang des Begrenzungsdrahtes noch eine Ehrenrunde, bevor er regennass dann wieder in seine Garage fährt.
Dies alles könnte man mit Fhem vermeiden, sofern man für seinen Rasen die aktuellen Wetterdaten hat.
In dem von dir genannten Windows-Tool wird dieser Wert (Erhöhung/Verringerung der wöchentlichen Mähzeit) angezeigt/ausgewertet. Auch bei deiner MQTT-Verbindung?

deeb

Otto123

#5
Hallo deeb,

sagen wir mal so: Diese Anbindung macht weiter nichts, als die Anmeldung und mqtt subscription bei dem worx Cloud Service. Wie dieses benannten Tool DeskApp auch.
Wir müssen nur rausfinden welches Wert im json das ist ;D
{
  "cfg":{"id":0,
    "lg":"it",
    "tm":"08:56:42",
    "dt":"11/06/2020",
    "sc":{"m":1,"p":0,"d":[
      ["00:00",0,0],
      ["00:00",0,1],
      ["00:00",0,0],
      ["09:00",60,1],
      ["00:00",0,1],
      ["00:00",0,0],
      ["00:00",0,0]]},
    "cmd":0,
    "mz":[0,0,0,0],
    "mzv":[0,0,0,0,0,0,0,0,0,0],
    "rd":0,
    "sn":"20193019840123456789"},
  "dat":{
    "mac":"980123456789",
    "fw":3.08,
    "bt":{"t":15.2,"v":20.09,"p":98,"nr":151,"c":1,"m":1},
    "dmp":[-11.2,-1.1,11.6],
    "st":{"b":10412,"d":172552,"wt":11014,"bl":69},
    "ls":1,
    "le":0,
    "lz":0,
    "rsi":-91,
    "lk":1,"act":1,"tr":0,"conn":"wifi"}
}

Ich vermute einer von denen? Was steht da bei Dir?
Zitat"mz":[0,0,0,0],
    "mzv":[0,0,0,0,0,0,0,0,0,0],
[/s]

Ach nein, jetzt verstehe ich: Es ist die mowerTimeCorrection ("sc":{.."p":0})! Die ist implementiert, sogar mit Slider, und lässt sich auch von FHEM setzen!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

Zitat von: deeb am 11 Juni 2020, 00:32:16
In dem Modul von Axel Mohnen wird meiner Meinung nach nicht die wöchentliche Mähzeit angezeigt, die man von den normalen Werten ausgehend prozentual verringern oder erhöhen kann.
Ich bin jetzt nicht sicher wie das mit der wöchentlichen Mähzeit ist. Aber im Modul von Axel wird auch
mowTimeExtend nn
angezeigt.

Die wöchentliche Zeit ergibt sich doch aus der Summe der einzelnen Tageszeiten? Wobei das ja nur potentielle Zeiten sind wo er fahren könnte. Was er dann wirklich fährt (gefahren ist), gibt die App doch nur über den Zähler aus. Und mit -100 verhindert Du doch nicht das er nicht fährt? Das machst Du primär doch mit den täglichen Zeiten. Wenn Du die einfachst löscht fährt er nicht mehr.

Also nach meiner Meinung gibt es keinen funktionalen Unterschied zwischen dem Modul von Axel und der direkten Anbindung - beide können das Gleiche.

Der wesentliche Unterschied ist die einfacherer Anbindung ohne zwei zusätzliche Nodejs Module!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

deeb

Hallo Otto,

wenn ich den Slider in der App auf "-100%"  setze, dann startet der Mäher erst gar nicht bis ich dort wieder einen anderen Wert einstelle.
Das ist praktischer und schneller als die Mähzeiten an allen Tagen zu löschen und später neu einzugeben.
Auch benutze ich es, wenn ich z.B. längere Zeit nicht vor Ort bin und mitbekomme zu Hause ist gerade eine Regenzeit bzw. Dauerregen angesagt.
In bzw. mit FHEM will ich das dann automatisieren mit einen Regensensor. Das ist dann noch verlässlicher.
Wenn ich mit deiner MQTT Erweiterung den Slider setzen (publishen) kann, wäre das genau das was ich dafür brauch.
Ich benutze keinen externen MQTT Server sondern den FHEM MQTT2_SERVER.
Dafür bräuchte man dann nach meinen Verständnis nur ein MQTT2_DEVICE. Hast du das auch mal mit den MQTT2_SERVER probiert?

MfG

kjmEjfu

Wenn du das ganze doch eh über FHEM automatisieren willst, dann kannst du doch auch automatisiert die Mähzeiten löschen (und wieder einstellen). Ist aus meiner Sicht sogar der saubere Weg. Und ob du nun a oder b von deinem notify/DOIF ausführen lässt, ist hinterher doch gleich.
Du könntest dir auch noch einen Dummy basteln, der beim "Einschalten" die Mähzeiten setzt und beim "Ausschalten" die Mähzeiten wieder löscht.
Dafür musst du nicht an die Korrektur der Fahrtzeit ran  ;)
Migriere derzeit zu Home Assistant

eisenhauer1987

Hier mal eine Inspiration wie ich das Thema Regenzeitverzögerung mit dem normalen Landroid Modul angehe. Funktioniert solide seit Anfang März. Kann man sicher auch noch erweitern und die Fahrzeiten speichern und wieder zurückschreiben bei bedarf.

defmod DOIF.Haus.Maehen.Wetter DOIF {if ( [08:50|AT SA] ) \
{\
fhem("set Garten.Wetter update;;");;\
}\
}\
\
{if ( [08:55|AT SA] ) \
{\
my $DAY = ((localtime)[6]);;\
if ( [Garten.Wetter:condition] eq "Leichter Regen" or [Garten.Wetter:condition] eq "Nieselregen" or [Garten.Wetter:condition] eq "Nieselregen möglich" or [Garten.Wetter:condition] eq "Regenschauer" or [Garten.Wetter:condition] eq "Regen" or [Garten.Wetter:condition] eq "Starker Regen" or [Garten.Wetter:condition] eq "Regen möglich" or [Garten.Wetter:condition] eq "Leichter Regen möglich" or [Garten.Wetter:condition] eq "Nebel" or [Garten.Wetter:condition] eq "Spruehregen" )\
{\
fhem("set robbi changeCfgCalendar $DAY,10:00,0,0;; setreading $SELF regen yes;;");;\
}\
else\
{\
if ( $DAY =~ m/(1|3|5)/ )\
{ \
fhem("set robbi changeCfgCalendar $DAY,10:00,180,1;; setreading $SELF regen no;;");;\
}\
else\
{ \
fhem("set robbi changeCfgCalendar $DAY,10:00,180,0;; setreading $SELF regen no;;");;\
}\
}\
}\
}\
\
{if ( [+1800] and [$SELF:regen] eq "yes" and [10:00-19:00|AT SA] and [Haus.Sunrise] eq "on") \
{\
if ( [Garten.Wetter:condition] ne "Leichter Regen" and [Garten.Wetter:condition] ne "Nieselregen" and [Garten.Wetter:condition] ne "Nieselregen möglich" and [Garten.Wetter:condition] ne "Regenschauer" and [Garten.Wetter:condition] ne "Regen" and [Garten.Wetter:condition] ne "Starker Regen" and [Garten.Wetter:condition] ne "Regen möglich" and [Garten.Wetter:condition] ne "Leichter Regen möglich" and [Garten.Wetter:condition] ne "Nebel" and [Garten.Wetter:condition] ne "Spruehregen" )\
{\
my $Hour = ((localtime)[2]) + 1;;\
my $Min = ((localtime)[1]);;\
my $DAY = ((localtime)[6]);;\
fhem("set robbi changeCfgCalendar $DAY,$Hour:$Min,120,0;; setreading $SELF regen no;;");;\
}\
}\
}

deeb

Hallo kjmEjfu,

ich fahre gern zweigleisig.
Meine in FHME integrierten Geräte (u.a. FritzDect200, Gardena IrrigationControl, Landroid, Medion-Alarmanalagen Melder) möchte ich auch weiterhin auch mal ohne FHEM (d.h. mit einem eigenen WEB-interface) bedienen können. Habe da schon mal schlechte Erfahrung im Urlaub gemacht. Nach einem Programmierfehler (Codeblock wurde nur bei Abwesenheit angesprungen) wurde ich in Minutentakt mit SMS bombadiert  Hatte nur noch die Möglichkeit den Raspi und damit auch FHEM aus der Ferne ganz abzuschalten.
Nun bin ich mir nicht ganz sicher ob der von dir vorgeschlagene Weg nicht auch die auf den ACS Server hinterlegten Mähzeiten löscht.

MfG

deeb

deeb

Hallo Eisenhauer 1987,

Danke !!!!!! Hört sich gut an. Muss ich mir aber mal intensiver anschauen.
Ich habe so etwas ähnliches schon für die Steuerung meiner Poolpumpe realisiert (aber etwas aufwendiger und nicht so elegant).
Bei hohen Aussentemperaturen arbeitet die Umwälzfilterpumpe länger.

Woher bekommst du die Wetterdaten? Aus dem Internet. Sind die den verlässlich?
Gut, man könnte vorsichtshalber den Landroid bei angekündigten Regen den ganzen Tag in der Garage lassen.
Aber wenn der Regen nun früher, später oder gar nicht kommt, wird nicht gemäht oder der Mäher bearbeitet der Rasen bei Regen.

MfG
deeb

eisenhauer1987

#12
Ja, das Wetter ist aus dem Internet und für dieses Vorhaben bei mir ausreichend verlässlich. Bei Regen oder möglichen Regen wird das Mähen deaktiviert, dann alle 30 Min das Wetter geprüft. Wenn das Wetter wieder gut ist, wird der Mäher mit einer Stunde Verzögerung zur aktuellen Uhrzeit aktiviert.

Das ist natürlich variabel auf den örtlichen Gegebenheiten anpassbar.

Otto123

#13
Zitat von: deeb am 11 Juni 2020, 11:51:59
Ich benutze keinen externen MQTT Server sondern den FHEM MQTT2_SERVER.
Dafür bräuchte man dann nach meinen Verständnis nur ein MQTT2_DEVICE. Hast du das auch mal mit den MQTT2_SERVER probiert?
Du liegst völlig daneben!
Der MQTT Server in diesem Fall ist der Cloud Server bei Amazon - der von Landroid Worx sowieso für Deinen Rasenmäher genutzt wird.
Ich nehme den MQTT2_Client um diesen Server einzubinden. Mit nur einem MQTT2_Device kannst Du keinen fremden "MQTT IO" in FHEM anbinden.

Wenn Du allerdings eine Lösung hast wie wir den Rasenmäher "Cloudfree" an den MQTT2_Server anknüppern - wären wir die Größten :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

deeb

Hallo Otto,

Danke für den Hinweis. Mache gerade meine ersten Schritte mit MQTT.
Brauch noch mal Unterstützung.
Wohin auf den RASPI müsste ich den Standardmäßig das Zertifikat (die Datei AWS.p12) kopieren?

Wünsche noch einen schönen abend nach Leipzig

deeb