Roomba steuern mit FHEM

Es gibt für die neueren Roomba mit WLAN Anbindung ein FHEM Modul Namens Roomba980. Ich habe dieses einige Zeit benutzt, aber leider funktioniert es nicht immer zuverlässig. Es geht gerne mal die Verbindung zum Roomba verloren. Das geschah bei mir auch wieder einmal vor ein paar Wochen und es ist mir bisher nicht gelungen, das ganze wieder zum laufen zu bringen. Ich hatte dazu auch im Forum (siehe Link oben) nachgefragt, aber es gibt dort auch seit einigen Wochen vom Entwickler keine Antwort mehr.

Ich hatte schon vorher, als mein Roomba980 noch neu war und es dieses Modul noch nicht gab, eine Steuerung mit Hilfe von HTTPMOD, Dorita980 und Rest980 eingerichtet und habe das ganze jetzt wieder so getan. Wie das funktioniert, möchte ich hier kurz erklären.

Bei mir läuft das Ganze auf ein Raspberry PI 4 Model B mit 4GB Speicher unter Raspbian GNU/Linux Buster (10). Wer ein anderes System verwendet muss u.U. einige Anpassungen vornehmen.

Ich setzte voraus, dass FHEM bereits installiert und funktionstüchtig ist und node.js und npm auch bereits installiert sind.

Zunächst holen wir uns rest980 und installieren es (Ich habe das im FHEM home Verzeichnis getan):

git clone https://github.com/koalazak/rest980.git
cd rest980
npm install

Dann müssen wir uns für die Einrichtung von rest980 die Logindaten des Irobot hohlen. Da in dem rest980 das dorita980 bereits enthalten ist, müssen wir uns das nicht extra hohlen. Wir können sofort das entsprechende Modul dafür verwenden. Wir stehen noch immer im rest980 Verzeichnis:

npm run getpassword <IP Robot IP>

Einfach den Anweisungen folgen, dann sollte das auch funktionieren. Das ganze sollte in etwa so aussehen:

npm run getpassword 192.168.1.1

> rest980@2.1.0 getpassword /opt/fhem/rest980
> node ./node_modules/dorita980/bin/getpassword.js "192.168.1.1"

Make sure your robot is on the Home Base and powered on (green lights on). Then press and hold the HOME button on your robot until it plays a series of tones (about 2 seconds). Release the button and your robot will flash WIFI light.
Then press any key here...

{ ver: '2',
  hostname: 'Roomba-xxxxxxxxxxxxx',
  robotname: 'Dorita',
  ip: '192.168.1.103',
  mac: '12:12:12:12:12:12',
  sw: 'v2.0.0-34',
  sku: 'R98----',
  nc: 0,
  proto: 'mqtt',
  blid: 'xxxxxxxxxxxxx' <---- username/blid
}
Password=> :1:1486937829:gktkDoYpWaDxCfGh <= Yes, all this string.
Use this credentials in dorita980 lib :)

Mit diesen Daten müssen wir dann rest980 konfigurieren. Hierzu editieren wir config/default.json. Die sollte dann etwa so aus sehen:

{
  "port": 3000,
  "blid": "xxxxxxxxxxxxx",
  "password": ":1:1486937829:gktkDoYpWaDxCfGh",
  "robotIP": "192.168.1.1,
  "firmwareVersion": 2,
  "enableLocal": "yes",
  "enableCloud": "yes",
  "keepAlive": "yes",
  "basicAuthUser": null,
  "basicAuthPass": null,
  "sslKeyFile": null,
  "sslCertFile": null
}

Für jede SW Version ab 2 muss die firmwareVersion auf 2 gestellt werden.

Nun haben wir bereits ein rest980 das funktionieren sollte. Das können wir testen, indem wir im rest980 Verzeichnis ein

npm start

ausführen. Wenn alles funktioniert erhält man diese Ausgabe:

> rest980@2.1.0 start /opt/fhem/rest980
> node ./bin/www

Jeden request den man nun an die rest API schickt, kann man dann hier in der console sehen.

Wir richten nun das FHEM device ein. Das sieht so aus:

define Roomba HTTPMOD http://localhost:3000/api/local/info/state 120
attr Roomba userattr reading01JSON requestData requestHeader1 requestHeader2 set01Name set01NoArg:0,1 set01URL set02Name set02NoArg:0,1 set02URL
attr Roomba enableControlSet 0
attr Roomba event-on-change-reading cleanMissionStatus_phase
attr Roomba extractAllJSON 1
attr Roomba requestHeader1 Content-Type: application/json
attr Roomba requestHeader2 Accept: */*
attr Roomba set01Name start
attr Roomba set01NoArg 1
attr Roomba set01URL http://localhost:3000/api/local/action/start
attr Roomba set02Name dock
attr Roomba set02NoArg 1
attr Roomba set02URL http://localhost:3000/api/local/action/dock
attr Roomba stateFormat {sprintf("%s, Battery at %d%%", ReadingsVal($name,"cleanMissionStatus_phase",0),ReadingsVal($name,"batPct",0))}

Mit der define Anweisung wird das Device erzeugt und von der rest api der aktuelle Status alle 120 Sekunden ausgelesen. Mit dem stateFormat legen wir fast, das in der Statuszeile des Roomba dann der aktuelle Status und der Batteriezustand angezeigt wird.

Wenn das Device so konfiguriert ist, sollte man dann auch die ersten Readings bekommen. Die Ausgabe in der console des rest980 sollte etwa so aussehen:

> rest980@2.1.0 start /opt/fhem/rest980
> node ./bin/www

GET /api/local/info/state 200 120.717 ms - 2395

Nun kann man auch bereits testen, ob das ganze funktioniert. Dazu einfach oben im Device set Roomba start auswählen, oder diesen Befehl im input Bereich eingeben. Schon sollte der Roomba los rollen. Mit set Roomba dock hohlen wir ihn wieder zurück. In der console wehen wir dann:

> rest980@2.1.0 start /opt/fhem/rest980
> node ./bin/www

GET /api/local/info/state 200 120.717 ms - 2395
GET /api/local/action/start 200 2.438 ms - 2395
GET /api/local/action/dock 200 2.486 ms - 2395

Wenn wir jetzt noch wollen, daß die rest980 API nach jedem Systemstart zur Verfügung steht, sollten wir uns dafür eine service Konfiguration einrichten. Dazu erzeugen wir eine Datei /etc/systemd/system/rest980.service mit folgendem Inhalt:

[Unit]
Description=Rest980 Interface to Dorita980
Wants=network.target
After=fhem.service
Requires=fhem.service

[Service]
Type=simple
User=fhem
Group=dialout
WorkingDirectory=/opt/fhem/rest980
ExecStart= /usr/bin/npm start
ExecStop= /usr/bin/npm stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

Damit lässt sich der service dann starten und stoppen. Jetzt können wir das testen und aktivieren:

systemctl daemon-reload
systemctl start rest980
systemctl status rest980
● rest980.service - Rest980 Interface to Dorita980
   Loaded: loaded (/etc/systemd/system/rest980.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-09-11 20:00:35 CEST; 10s ago
 Main PID: 9116 (node)
    Tasks: 19 (limit: 4915)
   CGroup: /system.slice/rest980.service
           ├─9116 npm
           ├─9127 sh -c node ./bin/www
           └─9128 node ./bin/www

Sep 11 20:00:35 raspfhem systemd[1]: Started Rest980 Interface to Dorita980.
Sep 11 20:00:36 raspfhem npm[9116]: > rest980@2.1.0 start /opt/fhem/rest980
Sep 11 20:00:36 raspfhem npm[9116]: > node ./bin/www
systemctl enable rest980
Created symlink /etc/systemd/system/multi-user.target.wants/rest980.service → /etc/systemd/system/rest980.service.

Damit wäre das Device jetzt bereit.

Ich verwende es zum Beispiel dafür, den Roomba zu starten, wenn der letzte das Haus verlassen hat. Der Roomba selbst hat keinen Schedule. Ich möchte nicht, daß der herumrattert, wenn jemand zu Hause ist. Wenn die FHEM erkannt hat, daß sich für längere Zeit niemand im Haus befindet, reinigt der Roomba dann selbständig 2 mal pro Woche.
Da sich das Dock des Roomba bei mir an einer schlecht einsehbaren Stelle befindet, habe ich in der TabletUI auch eine Anzeige zum Zustand der Roomba und ob der Behälter voll ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.