Roborock S50 mit Valetudo in openHAB

Posted by quark007 | Posted in Uncategorized | Posted on 15-03-2020-05-2008

0

Nach langem Zögern habe ich mich doch entschieden meinen Robi mit einer Custom-Firmware füttern. Insbesondere die Xiaomi App hat mich mit den ganzen Verbindungen nach China genervt.

Schon länger hatte ich die Dustcloud entdeckt, jedoch nie zum Laufen bekommen. Bei der Suche dazu, bin ich über Valetudo gestolpert. Nach viel lesen dazu, habe ich mich entschieden es zu probieren.

Die Anleitung basiert auf einem Linux System. Zum Glück habe ich gerade mein altes Netbook mit Linux Mint aufgesetzt.

Installation

Die Anleitung dazu ist nicht sonderlich ausführlich aber voll ausreichend.

Direkt anschließend habe ich wie in den FAQ beschrieben noch die Sprachdatei installiert (das geht aber auch über die Valetudo WebUI).

Der Web über die WebUI funktioniert, war mir aber nicht bequem genug. Im Wiki gibt’s auch einen Artikel zur Homeassistant Integration. So habe ich den Robi direkt in openHAB eingebunden. Die thing Definition sieht bei mir so aus (eigens aus den MQTT-Nachrichten erstellt):

Thing topic valetudo "MQTT Roborock S50" @ "Indoor" {
Channels:
Type string : state "Status" [ stateTopic="valetudo/rockrobo/state", transformationPattern="JSONPATH:$.state" ]
Type number : battery "Battery" [ stateTopic="valetudo/rockrobo/state", transformationPattern="JSONPATH:$.battery_level" ]
Type string : speed "Fan Speed" [ stateTopic="valetudo/rockrobo/state", commandTopic="valetudo/rockrobo/set_fan_speed", transformationPattern="JSONPATH:$.fan_speed" ]
Type number : cleanTime "Clean Time" [ stateTopic="valetudo/rockrobo/attributes", transformationPattern="JSONPATH:$.cleanTime" ]
Type number : cleanArea "Clean Area" [ stateTopic="valetudo/rockrobo/attributes", transformationPattern="JSONPATH:$.cleanArea" ]
Type number : cleanCount "Clean Count" [ stateTopic="valetudo/rockrobo/attributes", transformationPattern="JSONPATH:$.cleanCount" ]
Type number : wareMain "Verschleiss Hauptbürste" [ stateTopic="valetudo/rockrobo/attributes", transformationPattern="JSONPATH:$.mainBrush" ]
Type number : wareSide "Verschleiss Seitbürste" [ stateTopic="valetudo/rockrobo/attributes", transformationPattern="JSONPATH:$.sideBrush" ]
Type number : wareFilter "Verschleiss Filter" [ stateTopic="valetudo/rockrobo/attributes", transformationPattern="JSONPATH:$.filter" ]
Type number : wareSensor "Verschleiss Sensoren" [ stateTopic="valetudo/rockrobo/attributes", transformationPattern="JSONPATH:$.sensor" ]
Type string : state2 "Status 2" [ stateTopic="valetudo/rockrobo/attributes", transformationPattern="JSONPATH:$.state" ]
Type string : lastRun "LastRun" [ stateTopic="valetudo/rockrobo/attributes" ]
Type string : command "Command" [ stateTopic="valetudo/rockrobo/state", commandTopic="valetudo/rockrobo/command", transformationPattern="JSONPATH:$.state" ]
}

Die Items habe ich wie folgt definiert:

Group valetudo "Roborock S50"

String mqtt_vale_state "Status [MAP(valetudo_status.map):%s]" <roborock> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:state", channel="mqtt:topic:mosquitto:valetudo:state2" }
Number mqtt_vale_battery "Batterie [%s]" <battery> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:battery" }
String mqtt_vale_speed "Saugstufe [MAP(valetudo_speed.map):%s]" <heating> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:speed" }

Number mqtt_vale_cleanTime "Gesamt Laufzeit [%.1f h]" <time> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:cleanTime" }
Number mqtt_vale_cleanArea "Gesamt Fläche [%d m²]" <text> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:cleanArea" }
Number mqtt_vale_cleanCount "Gesamt Vorgänge [%d]" <text> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:cleanCount" }
Number mqtt_vale_WareMainBrush "Restlaufzeit Hauptbürste [%d h]" <text> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:wareMain" }
Number mqtt_vale_WareSideBrush "Restlaufzeit Seitenbürste [%d h]" <text> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:wareSide" }
Number mqtt_vale_WareFilter "Restlaufzeit Filter [%d h]" <text> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:wareFilter" }
Number mqtt_vale_WareSensors "Restlaufzeit Sensoren [%d h]" <text> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:wareSensor" }
String mqtt_vale_state2 "Status2 [MAP(valetudo_status.map):%s]" <roborock> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:state2" }

String mqtt_vale_lastrunstats "LastRunStatsCache" { channel="mqtt:topic:mosquitto:valetudo:lastRun" }
Number mqtt_vale_LastStart "Letzte Reinigung Start [%d]" <time> (valetudo,mqtt)
DateTime mqtt_vale_LastStartTime "Letzte Reinigung Start [%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM]" <time> (valetudo,mqtt)
Number mqtt_vale_LastEnd "Letzte Reinigung Ende [%d]" <time> (valetudo,mqtt)
DateTime mqtt_vale_LastEndTime "Letzte Reinigung Ende [%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM]" <time> (valetudo,mqtt)
Number mqtt_vale_LastDuration "Letzte Reinigung Dauer [JS(timeConvert2.js):%s]" <time> (valetudo,mqtt)
Number mqtt_vale_LastArea "Letzte Reinigung Fläche [%.1f m²]" <text> (valetudo,mqtt)
String mqtt_vale_LastState "Letzte Reinigung Beendet [%s]" <text> (valetudo,mqtt)
String mqtt_vale_SendCommand "Valetudo Command Item []" <movecontrol> (valetudo,mqtt) { channel="mqtt:topic:mosquitto:valetudo:command" }

Ohne Map ist doch doof

Das Problem mit der Karte ist aber geblieben: die gibt es nur über die WebUI. Da die Map Daten auch über mqtt übertragen werden, kann man von einem extra Server eine PNG Karte erstellen lassen. Das Projekt dazu nennt sich ICantBelieveItsNotValetudo.

Nach clonen, installieren und konfigurieren lief alles auf Anhieb. Nun noch den Server als Dienst registrieren:

Die Datei /lib/systemd/system/valetudo-map.service erstellen und folgenden Inhalt einfügen:

[Unit]
Description=valetudo map service
Documentation=https://github.com/weweave/landroid-bridge
After=network.target

[Service]
ExecStart=/usr/bin/node /root/ICantBelieveItsNotValetudo/app.js
WorkingDirectory=/root/ICantBelieveItsNotValetudo
Restart=on-failure
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=valetudo-map
#User=pi
#Group=username
Environment=NODE_ENV=production PORT=3003

[Install]
WantedBy=multi-user.target

Anschließend mit

systemctl daemon-reload

registrieren und mit

systemtl enable valetudo-map

zum Autostart hinzufügen. Jetzt ist unter der Adresse

http://[IP]/api/lib/image

das Bild abzurufen und mit der URL in die openHAB Sitemap integrieren:

Image url="http://[IP]:3003/api/map/image"label="Roborock Map" refresh=5000

Write a comment