deebot
Wichtig
Das Plugin benötigt Python 3.14 oder neuer, auch wenn SmartHomeNG selbst ältere Python-Versionen unterstützt. Unter einer älteren Version lädt SmartHomeNG das Plugin nicht und meldet das im Log.
Das Plugin liest den Zustand eines Ecovacs Deebot Saugroboters und steuert ihn: Start, Pause, Stopp, Rückkehr zur Ladestation, Orten, Saugstufe, Wassermenge und die Reinigung einzelner Räume. Liefert das Gerät eine Karte, gibt das Plugin sie samt Position des Roboters als SVG aus.
Es nutzt die Bibliothek deebot-client, die auch die
Home Assistant Integration für Ecovacs verwendet. Unterstützt werden die Geräteklassen, für die diese
Bibliothek eine Definition enthält, darunter der Deebot N20 Pro Plus (Klassen qhe2o2, gwtll7,
p0l0af) und die Deebot Ozmo 920/950 (Klassen yna5xi, vi829v, 9rft3c, eazo2f). Für die
Ozmo 960 enthält die Bibliothek keine eigene Definition. Ältere Geräte haben teils weniger Funktionen
(z.B. keine Station); die zugehörigen Items bleiben dann unverändert.
Das Plugin ersetzt das veraltete Plugin deebot_ozmo. Dessen Konfiguration lässt sich nicht
übernehmen: deebot_ozmo bindet Items über Structs ein, dieses Plugin über das Attribut deebot.
Wichtig
Die Verbindung läuft ausschließlich über die Ecovacs Cloud. Das Plugin braucht dafür die Zugangsdaten des Ecovacs Kontos; im lokalen Netz kann es den Roboter nicht direkt ansprechen.
Voraussetzungen
Python 3.14 oder neuer (Voraussetzung von
deebot-clientab Version 18.7.0).Ein Ecovacs Konto, in dem der Roboter eingerichtet ist.
Konfiguration
Die Informationen zur Konfiguration des Plugins sind unter Plugin ‚deebot‘ Konfiguration beschrieben.
deebot:
plugin_name: deebot
account: 'me@example.org'
password: 'secret'
country: DE
Eigene Raumnamen und mehrere Karten
Die Räume tragen die Namen aus der Ecovacs App, unbenannte Räume heißen Default. Über den Parameter
room_names lassen sich eigene Namen vergeben, ohne sie in der App pflegen zu müssen. Sie haben Vorrang vor
den Namen aus der App und erscheinen im Item rooms, im Web Interface und im Widget.
Ein Roboter kann mehrere Karten speichern, etwa eine je Stockwerk. Das Plugin zeigt immer die Karte, die der
Roboter gerade verwendet, und deren Räume. Da Raum-IDs nur innerhalb einer Karte sicher eindeutig sind, lassen
sich die Einstellungen je Karte angeben. Welche Karten gespeichert sind, zeigt das Item maps
([{'id': '10', 'name': 'EG', 'active': True, 'built': True}, ...]); jeder Eintrag in rooms nennt im
Feld map die Karte, zu der der Raum gehört.
Beide Parameter sind Listen von Einträgen. Raum-IDs und Karten stehen dabei als Werte, nicht als Schlüssel, weil SmartHomeNG beim Einlesen der Konfiguration Schlüssel verwirft, die mit einer Ziffer beginnen.
Die Karte gibt man mit map über ihren Namen aus der Ecovacs App (z.B. EG) oder über ihre ID an. Passt
ein Wert sowohl auf die ID einer Karte als auch auf den Namen einer anderen, gilt die ID. Namen greifen erst,
sobald der Roboter die Kartenliste gemeldet hat (Item maps); bis dahin und für Karten ohne Namen bleibt nur
die ID.
deebot:
plugin_name: deebot
account: 'me@example.org'
password: 'secret'
country: DE
room_names:
- {map: EG, room: 3, name: Küche}
- {map: EG, room: 4, name: Flur}
- {map: DG, room: 3, name: Bad}
room_preselect:
- {map: EG, room: 3}
- {map: EG, room: 4}
Ein Eintrag ohne map gilt für alle Karten, ein Eintrag mit map geht ihm vor. Räume ohne Eintrag
behalten den Namen aus der App. Die in room_preselect aufgeführten Räume sind im smartVISU Widget
vorausgewählt (Feld preselect in rooms); select: false hebt eine allgemeine Vorauswahl für eine
einzelne Karte wieder auf. Nach dem Start einer Raumreinigung stellt das Widget die Vorauswahl wieder her.
Fehlerhafte Einträge verhindern den Start des Plugins: unbekannte Schlüssel, ein fehlendes room (bzw.
name bei room_names) oder eine Raum-ID, die keine Zahl ist.
Bestätigung einer neuen Installation
Meldet sich eine Installation zum ersten Mal an, verlangt Ecovacs eine Bestätigung per E-Mail. Das Plugin
weist im Log darauf hin (Ecovacs requires a verification) und zeigt im Web Interface den Status
verification_required mit zwei Bedienelementen: Code anfordern lässt Ecovacs einen Code an die
E-Mail-Adresse des Kontos schicken; diesen trägt man in das Feld ein und schickt ihn mit Bestätigen ab.
Danach verbindet sich das Plugin von selbst und speichert das Token.
Dafür legt das Plugin die Datei var/deebot/<instanz>.json an, die nur der Besitzer lesen kann (Rechte
600). Darin stehen eine zufällige Geräte-ID dieser Installation und das Anmelde-Token von Ecovacs. Geht die
Datei verloren, verlangt Ecovacs eine neue Bestätigung.
Items
Items werden über das Attribut deebot verbunden; sein Wert legt fest, welchen Zustand das Item zeigt bzw.
welche Funktion es auslöst. Unterstützt der Roboter eine Funktion nicht, bleibt das Item unverändert. Nimmt der
Roboter einen geschriebenen Wert nicht an, steht das im Log, und das Item erhält wieder den letzten Wert des
Roboters.
Zustand
Attributwert |
Typ |
Bedeutung |
|---|---|---|
state |
str |
|
active |
bool |
|
battery |
num |
Akkustand in % |
available |
bool |
Roboter ist über die Cloud erreichbar |
error_code |
num |
Fehlercode, 0 = kein Fehler |
error_text |
str |
Fehlerbeschreibung |
station_state |
str |
Zustand der Station: |
Einstellungen (lesen und schreiben)
Attributwert |
Typ |
Bedeutung |
|---|---|---|
fan_speed |
str |
Saugstufe, soweit der Roboter sie anbietet: |
water_amount |
str |
Wassermenge, soweit der Roboter sie anbietet: |
Steuerung (schreiben)
Die Steuer-Items sind vom Typ bool, nur cmd_clean_rooms ist eine list. Setzt man True bzw. eine
Liste von Raum-IDs, sendet das Plugin den Befehl und setzt das Item anschließend auf False bzw. []
zurück. False und eine leere Liste lösen nichts aus.
Attributwert |
Befehl |
|---|---|
cmd_start |
Automatische Reinigung starten (bei pausiertem Roboter: fortsetzen) |
cmd_pause |
Reinigung pausieren |
cmd_resume |
Reinigung fortsetzen |
cmd_stop |
Reinigung beenden |
cmd_dock |
Zurück zur Ladestation |
cmd_locate |
Ton abspielen, um den Roboter zu finden |
cmd_empty_dustbin |
Staubbehälter in der Station entleeren |
cmd_clean_rooms |
Die geschriebenen Räume einmal reinigen, z.B. |
Statistik und Verschleißteile
Attributwert |
Typ |
Bedeutung |
|---|---|---|
clean_area |
num |
Fläche der aktuellen bzw. letzten Reinigung in m² |
clean_time |
num |
Dauer der aktuellen bzw. letzten Reinigung in Sekunden |
total_area |
num |
Gesamtfläche |
total_time |
num |
Gesamtdauer |
total_cleanings |
num |
Anzahl aller Reinigungen |
lifespan_<teil> |
num |
Restlebensdauer in %, z.B. |
clean_area und clean_time stimmen mit der Anzeige der Ecovacs App überein (m² bzw. Sekunden). Die
Einheiten von total_area und total_time sind nicht geprüft; das Plugin gibt die Werte so weiter, wie die
Bibliothek sie liefert. Welche lifespan_*-Werte ein Roboter meldet, hängt vom Modell ab; alle möglichen
Namen stehen in plugin.yaml.
Position und Karte
Attributwert |
Typ |
Bedeutung |
|---|---|---|
position |
dict |
Position des Roboters: |
charger_position |
dict |
Position der Ladestation im selben Format |
rooms |
list |
Räume der aktuellen Karte: |
maps |
list |
Gespeicherte Karten: |
map_svg |
str |
Karte mit Räumen, Spur und Roboter als SVG |
Die Karte hat keinen Hintergrund. Boden (Klasse .u, #edf3fb), Räume (.r0 bis .r5) und Umrisse
(.o) färbt das Stylesheet am Ende der SVG; die Reinigungsspur ist ein einzelner weißer Pfad. Der Parameter
map_css wird an dieses Stylesheet angehängt und überschreibt so die Standardfarben; er darf kein <
enthalten. Der Standardwert .u{fill: transparent} macht den Boden durchsichtig, damit sich die Karte in den
Hintergrund des Themes einfügt; ein leerer Wert lässt die Farben des Roboters unverändert. Weitere Regeln lassen
sich einfach anhängen:
map_css: '.u{fill: transparent} .o path{stroke: #9a9a9a} path[stroke="#fff"]{stroke: rgba(255,255,255,0.35)}'
Das Beispiel hellt außerdem die Umrisse auf und dimmt die weiße Reinigungsspur. Die Spur macht den größten Teil
der SVG aus; mit map_trace: False entfällt sie, und die Karte wird deutlich kleiner.
map_svg wird höchstens alle drei Sekunden neu erzeugt und kann einige hundert Kilobyte groß werden. Das Item
gehört deshalb nur dorthin, wo es gebraucht wird, und sollte keinen Cache nutzen. enable_map: False schaltet
die Kartenerzeugung ganz ab.
Item Structs
Für jede der obigen Gruppen gibt es ein Struct (deebot.status, deebot.settings,
deebot.control, deebot.statistics, deebot.lifespan, deebot.map); deebot.all
fasst alle zusammen:
saugroboter:
struct: deebot.all
Bei mehreren Robotern (eine Plugin-Instanz je Roboter) lautet das Attribut deebot@<instanz>; die Structs
übernehmen den Instanznamen über deebot@instance.
Plugin-Funktion
sh.deebot.clean_rooms(rooms, count=1)Reinigt die Räume mit den angegebenen IDs (siehe Item
rooms) incountDurchgängen; das Itemcmd_clean_roomsreinigt immer genau einmal. LiefertFalse, wenn das Plugin nicht läuft; Fehler beim Senden landen im Log.
Web Interface
Das Web Interface zeigt Verbindungsstatus, Gerät, aktuelle Werte, die Karte und die verbundenen Items. Steht eine Bestätigung aus, enthält es außerdem das Eingabefeld für den Code (siehe oben).
smartVISU Widgets
Das Plugin bringt zwei smartVISU-Widgets mit (sv_widgets/deebot.html, deebot.js). Beide erwarten die
Items des Structs deebot.all unter einem gemeinsamen Basis-Item, im Beispiel oben saugroboter.
deebot.panel(id, base, parts, map_page, map_popup)Zeigt Zustand und Akkustand, Buttons (je nach Zustand Start, Pause oder Fortsetzen, dazu Stopp, zur Station und Orten), Saugstufe, Wassermenge, die letzte Reinigung, Verschleißteile und eine Raumauswahl. Der Button Räume reinigen schreibt die ausgewählten Räume in das Item
cmd_clean_rooms.partslegt fest, welche Verschleißteile erscheinen (Standard:['brush', 'side_brush', 'filter', 'round_mop']),map_pageist die smartVISU-Seite mit der Karte (leer: kein Link). Mitmap_popup=truebekommt das Panel einen Button Karte, der die Karte in einem Popup öffnet.deebot.map(id, base)Zeigt die Karte aus dem Item
map_svg. Die Karte ist groß und ändert sich während einer Reinigung alle paar Sekunden. Da smartVISU alle Items der geöffneten Seite abonniert, auch die eines geschlossenen Popups, wird die Karte übertragen, solange die Seite offen ist. Wer das vermeiden will, legt die Karte auf eine eigene Seite und verlinkt sie übermap_page.
{{ deebot.panel('', 'saugroboter', ['brush', 'side_brush', 'filter', 'round_mop'], '', true) }}
Die Auswahllisten für Saugstufe (quiet, normal, max, max_plus) und Wassermenge (low,
medium, high) zeigt basic.select von smartVISU immer vollständig an. Werte, die ein Roboter nicht
kennt, lehnt das Plugin mit einer Meldung im Log ab, und das Item kehrt zum Wert des Roboters zurück.