BOTVAC

Aus FHEMWiki
BOTVAC
Zweck / Funktion
Steuerung eines NEATO oder VORWERK Saugroboters
Allgemein
Typ Gerätemodul
Details
Dokumentation EN / DE
Support (Forum) Sonstige Systeme
Modulname 70_BOTVAC.pm
Ersteller Vuffiraa (Forum /Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Mit dem BOTVAC-Modul können VORWERK und NEATO Saugroboter gesteuert werden.

Allgemeines

Funktionsumfang

Aktuell ist folgender Funktionsumfang vorhanden:

Status

Der Modulstatus wird aus den Readings action, error und stateId gemischt. Folgende Statusmeldung werden im Modul angezeigt:

  • Unkown
  • Invalid
  • Idle
  • einen Arbeitsmodus:
    • House Cleaning
    • Spot Cleaning
    • Manual Cleaning
    • Docking
    • User Menu Active
    • Suspended Cleaning
    • Updating
    • Copying Logs
    • Recovering Location
    • IEC Test
    • Map cleaning
    • Exploring map (creating a persistent map)
    • Acquiring Persistent Map IDs
    • Creating & Uploading Map
    • Suspended Exploration
  • Paused: <angehaltener Arbeitsmodus>
  • einen Fehlertext:
    • Dust Bin Is Full!
    • I'm Recovering My Location!
    • Picked Up!
    • Brush Stuck!
    • I'm Stuck!
    • Dust Bin Has Been Emptied!
    • Dust Bin Is Missing!
    • Please Clear My Path!

Attribute

actionInterval
Poll-Interval für den aktiven Betrieb (Busy/Paused)
boundaries
Hindernniseinträge (Boundaries) werden durch Leerzeichen getrennt im JSON-Format angegeben, z.B.
{"type":"polyline","vertices":[[0.710,0.6217],[0.710,0.6923]],"name":"Bad","color":"#E54B1C","enabled":true} {"type":"polyline","vertices":[[0.7139,0.4101],[0.7135,0.4282],[0.4326,0.3322],[0.4326,0.2533],[0.3931,0.2533],[0.3931,0.3426],[0.7452,0.4637],[0.7617,0.4196]],"name":"Kueche","color":"#000000","enabled":true}
Weitere Informationen sind auf der Herstellerseite zu finden: https://developers.neatorobotics.com/api/robot-remote-protocol/maps
Der Wert des Parameters "name" kann in der Hindernisliste bei "setBoundariesOnFloorplan_<floor plan>" benutzt werden. Außerdem ist es möglich, mehr als ein Hindernis mit dem selben Namen zu speichern. Das Kommando "setBoundariesOnFloorplan_<floor plan> <name>" setzt alle Hindernisse mit diesem Namen.

Set

  • dismissCurrentAlert
    • Zurücksetzen einer anstehenden Warnmeldung
  • findMe
    • Löst die Suchfunktion des Saugroboters aus. Dabei wird ein Ton wiedergegeben und die LEDs blinken.
  • password
    • Setzt das Passwort für den NEATO/VORWERK-Zugang.
  • pause
    • Pausiert die Reinigung
  • pauseToBase
    • Beendet eine Reinigung und fährt zur Basis zurück
  • reloadMaps
    • Lädt die letzte Karte vom Neato-Server, die erstellt wurde. Das passiert normalerweise automatisch, ist aber z.B. beim Neustart von FHEM sinnvoll. **Diese Funktion wird vom VR200 nicht unterstützt.
  • resume
    • Setzt eine Reinigung fort.
  • schedule
    • Die möglichen Argumente sind 'on' und 'off' zum An- und Abschalten der Zeitsteuerung.
  • sendToBase
    • Fährt zur Basis zurück
  • setBoundaries
    • Setzt Hindernisse oder No-Go-Linien im entsprechenden Grundriss.
    • Der Parameter kann entweder ein Name, der vorher per Attribute "boundaries" definiert wurde, oder alternativ eine JSON-Zeichenkette sein. (Eine Liste von Namen (mit Komma getrennt) ist auch möglich.)
    • Beschreibung der Syntax unter https://developers.neatorobotics.com/api/robot-remote-protocol/maps
    • Beispiele:
set <name> setBoundariesOnFloorplan_0 Bad
set <name> setBoundariesOnFloorplan_0 Bad,Kueche
set <name> setBoundariesOnFloorplan_0 {"type":"polyline","vertices":[[0.710,0.6217],[0.710,0.6923]], "name":"Bad","color":"#E54B1C","enabled":true}
  • setRobot
    • Legt den zu steuernden Roboter fest, wenn mehr als ein Saugroboter unter dem selben Zugang bei NEATO/VORWERK registriert ist.
  • startCleaning
    • Startet eine neue Reinigung.
    • Falls der Saugroboter Hindernisse/No-Go-Linien/Zonen unterstützt, können weitere Parameter angegeben werden:
      • house - Reinigung ohne gespeicherte Karte
      • map - Reinigung mit gespeicherter Karte
      • zone - Reinigung in einer bestimmten Zone, siehe set nextCleaningZone
  • startManual
    • Startet den manuellen Reinigungsmodus.
    • Dieser Modus öffnet eine direkte Verbindung zum Saugroboter per Websocket. Deshalb müssen die FHEM-Installation und der Saugroboter im gleichen LAN angemeldet sein. Außerdem ist weiterhin eine Verbindung zum Internet nötig, da die Initialisierung der Websocket-Verbindung durch einen Fernzugriff über einen Server von NEATO/VORWERK angestoßen wird.
    • Hinweis: Der Saugroboter beendet den manuellen Reinigungsmodus, wenn er für 30 Sekunden keine Nachricht über die Websocken-Verbindung erhält. Die Wegsacket-Verbindung selber wird dabei aber nicht automatisch geschlossen.
  • startSpot
    • Startet die Spot-Reinigung von der aktuellen Position.
  • statusRequest
    • Bewirkst eine Aktualisierung aller Readings.
  • stop
    • Stoppt die Reinigung.
  • syncRobots
    • Synchronisiert die Roboterdaten. Das ist nützlich, wenn man mehrere Geräte unter einem NEATO- bzw. VORWERK-Zugang verwaltet und dort Geräte entfernt oder hinzugefügt hat.
  • wsCommand
    • Startet oder stoppt die Reinigungsaktivitäten:.
      • eco-on
      • eco-off
      • turbo-on
      • turbo-off
      • brush-on
      • brush-off
      • vacuum-on
      • vacuum-off
  • wsCombo
    • Bestimmt das Verhalten des Saugroboters. Für eine kontinuierliche Bewegung müssen die Kommandos mit einer Frequenz < 1Hz gesendet werden, ansonsten stoppt der Saugroboter die Bewegung.
      • forward - Bewegung vorwärts.
      • back - Bewegung rückwärts. Aufgrund der fehlenden Sensoren an der Rückseite des Saugroboters stoppt die Bewegung nach ca. 30 cm.
      • arc-left - Bewegung 45° im Bogen vorwärts gegen den Uhrzeigersinn.
      • arc-right - Bewegung 45° im Bogen vorwärts im Uhrzeigersinn..
      • pivot-left - Drehung 90° gegen den Uhrzeigersinn.
      • pivot-right - Drehung 90° im Uhrzeigersinn.
      • stop - Hält die Bewegung sofort an.

Die nächsten Kommandos werden zum Saugertyp passend angeboten. Dadurch sind die Startbefehle für die Reinigung parameterlos. Einzige Ausnahme beim D7 ist set <name> startCleaning <house|map|zone> Wenn keine entsprechenden Einträge definiert sind, werden die Werte der letzten Reinigung aus dem Reading übernommen.

  • nextCleaningMode
    • wird bei Starten der nächsten Reinigung verwendet, je nach Model: eco,turbo
  • nextCleaningModifier
    • wird bei Starten der nächsten Reinigung verwendet, je nach Model: normal,double
  • nextCleaningNavigationMode
    • wird bei Starten der nächsten Reinigung verwendet, je nach Model: normal,extra care,deep
    • Hinweis: Der Navigationsmodus kann nur auf "deep" gestellt werden, wenn der Reinigungsmodus "turbo" ist.
  • nextCleaningSpotHeight
    • wird bei Starten der nächsten Reinigung verwendet (cm): 100,200,300,400
  • nextCleaningSpotWidth
    • wird bei Starten der nächsten Reinigung verwendet (cm): 100,200,300,400
    • Die Kombination aus Höhe und Breite muss kein Quadrat sein, der Bereich ist von 100 - 400 cm, in 1 cm Schritten einstellbar. Rechtecke von z.B. 152x244 sind also möglich.
  • nextCleaningZone
    • Je nach Model kann die ID der Reinigungszone für die nächste Reinigung gesetzt werden.

Get

  • batteryPercent
    • Gibt den aktuellen Stand der Akkuladung des Saugroboters.
  • statistics
    • Liefert eine Übersicht der relevanten Parameter je vorhandener Map, siehe Map Statistik.

Readings

  • action
    • kann einen dieser Werte annehmen:
      • 0 - Invalid
      • 1 - House Cleaning
      • 2 - Spot Cleaning
      • 3 - Manual Cleaning
      • 4 - Docking
      • 5 - User Menu Active
      • 6 - Suspended Cleaning
      • 7 - Updating
      • 8 - Copying Logs
      • 9 - Recovering Location
      • 10 - IEC Test
      • 11 - Map cleaning
      • 12 - Exploring map (creating a persistent map)
      • 13 - Acquiring Persistent Map IDs
      • 14 - Creating & Uploading Map
      • 15 - Suspended Exploration
  • dockHasBeenSeen
    • stellt sich erst eine Weile nach Beginn einer Reinigung auf "1". Und nur in diesem Zustand klappt das Zurücksenden.
  • error
    • kann einen dieser Werte annehmen:
      • ui_alert_invalid - Ok
      • ui_alert_dust_bin_full - Dust Bin Is Full!
      • ui_alert_recovering_location - I'm Recovering My Location!
      • ui_error_picked_up - Picked Up!
      • ui_error_brush_stuck - Brush Stuck!
      • ui_error_stuck - I'm Stuck!
      • ui_error_dust_bin_emptied - Dust Bin Has Been Emptied!
      • ui_error_dust_bin_missing - Dust Bin Is Missing!
      • ui_error_navigation_falling - Please Clear My Path!
      • ui_error_navigation_noprogress - Please Clear My Path!
  • stateId
    • kann einen dieser Werte annehmen:
      • 0 - Invalid
      • 1 - Idle
      • 2 - Busy
      • 3 - Paused
      • 4 - Error

Grundkonfiguration

Definition in FHEM

define <name> BOTVAC <email> [<vendor>] [<poll-interval>]
set <name> password <password>

Icons

https://forum.fhem.de/index.php/topic,51713.msg539375.html#msg539375

die Datei reinkopieren, dann "set WEB rereadicons" und anschließend normal als Icon auswählen. Inzwischen ist das Icon wohl im SVN eingecheckt.

Probleme

Falls der Sauger mit der App neu konfiguriert werden musste

Du hast nach der Neuinstallation der App auch deinen VR/NEATO neu registriert. Fhem lädt aber noch die Daten aus der alten Registrierung. Wähle mal im Gerät unter Set 'syncRobots' aus. Wenn es danach bei Set auch eine Funktion 'setRobot' gibt, hast du wirklich  den VR neu registriert. Dann einfach über dieses Set den VR wechseln. Ansonsten bleibt noch die Registrierungsschlüssel im FHEM-Gerät zu löschen. Das geht über die Kommandozeile in FHEM:

deletereading <device> accessToken
deletereading <device> secretKey

Maps

Map per weblink einbinden

Die Karte der letzten Reinigung kann man z.B. per URL oder per Weblink in Fhem einbinden.

Der relative URL-Pfad ist: http(s)://<ip>:<port>/fhem/BOTVAC/<device>/map

Eine Weblink-Definition sieht so aus:

define <device>Wl weblink htmlCode { BOTVAC::ShowMap("<device>"[,"<width>"[,"<height>"]]) }

Die Definitionen für Breite und Höhe sind optional, wenn sie benutzt werden, dann geht entweder nur Breite oder Breite und Höhe. (https://forum.fhem.de/index.php/topic,51713.msg548498.html#msg548498)

Map per Telegram versenden

set <TelegramBot> cmdSend {ReadingsVal('<BOTVAC>', '.map_cache', )}

Alle Maps in einem Reading anzeigen

Beschrieben im Forenthread

Die Dateien werden im Ordner ./www/images/maps/ abgelegt, daher muss dieser Ordner angelegt werden. Der Name VR300 der BOTVAC-Definition muss angepasst werden.

Es werden die letzten 20 Dateien gespeichert. Nach einer Fahrt wird eine neue Datei angelegt und die 21. Datei gelöscht. Die Karten können beschnitten werden.

Auslöser für den Vorgang ist ein Event auf das Reading map_id, für das Reading AMap ist es map_loaded. Die Definitionen können über Raw definition importiert werden.

DOIF zur Verwaltung der Karten Dateien

defmod loadMap DOIF subs {\
  sub mapDel ($) {\
    my ($fp) =@_;;\
    my $ret = "";;\
    my @fl = sort {$b cmp $a} <$fp*.png>;;\
    Log 1, $fp;;\
    for (my $i=20;;$i<@fl;;$i++){\
      my $er = ::FileDelete($fl[$i]);;\
      $ret .= $er?"$er\n":"$fl[$i]\n";;\
    }\
    return $ret;;\
  }\
  sub mapSave {\
    my $fp = './www/images/maps/';;\
    my $fh;;\
    my $fn = ReadingsVal("VR300", "map_id", "none");;\
    $fn =~ s/://g;;\
    if (my $map = ReadingsVal("VR300", ".map_cache", "")) {\
      open($fh, '>', $fp.$fn.'.png') or die "$SELF can't open > $fp.$fn.'.png': $!";;\
      print $fh $map;;\
      close $fh;;\
      my $ret = mapDel($fp)."\n";;\
      Log3("$SELF", 1, $ret) if($ret);; \
      ::readingsSingleUpdate($::defs{VR300},"map_loaded",1,1);;\
    }\
    return undef;;  \
  }\
}\
{\
  my $dum = ([VR300:"^map_id"] or [$SELF:state] eq "cmd_1");;\
  set_Exec("$SELF_1", 3, "mapSave");;\
  \
}\

attr loadMap setList cmd_1

Mit dem nachstehenden Befehl kann die letzte Karte nachträglich gespeichert werden.

set loadMap cmd_1

userReading im BOTVAC-Gerät zur Anzeige der letzten Karten.

attr VR300 userReadings AMap:map_loaded.* {\
my $sz = 350;;\
my $ret = '<html><style>';;\
$ret .= ' .botvacur img {position:relative;; margin-left: -75px;; margin-top: -85px;; margin-right: -75px;;margin-bottom: -65px;; width: '.$sz.'px;; height: '.$sz.'px;;}';;\
$ret .= ' .botvacur div {text-align: center;; overflow: hidden }';;\
$ret .= '</style>';;\
$ret .= "<table class='botvacur' >";;\
for (my $i=0;;$i<5;;$i++) {\
   $ret .= "<tr>";;\
   for (my $k=0;;$k<4;;$k++) {\
      my $fn = $defs{$name}{helper}{MAPS}[$i*4+$k]{id};;\
      BOTVAC::GetTimeFromString($defs{$name}{helper}{MAPS}[$i*4+$k]->{generated_at}) =~ /(.*):\d\d$/;;\
      my $md = $1;;\
      $fn =~ s/://g;;\
      $ret .= "<td><div ><img src='./fhem/www/images/maps/$fn.png' alt='$fn'></div><div> ".($i*4+$k+1).": ;$md</div></td>" if (-e "./www/images/maps/$fn.png");;\
   }\
   $ret .= "</tr>";;\
}\
$ret .= "</table></html>";;\
return $ret;;\
}

Über den Vergleich der Schleifenvariablen $i < x, $k < y können die anzuzeigenden Spalten und Zeilen festgelegt werden. $sz legt die Kartengröße fest. Über die Angaben für margin können die Karten global beschnitten werden.

Map Statistik

Durch einen Vergleich der zu erwartenden Laufzeit und Fläche mit einer Akkuladung und den vom Hersteller spezifizierten Werten kann die verbliebene Akkuleistung beurteilt werden. Dazu sollten einige Testläufe unter angenäherten Laborbedingungen durch geführt werden. Die ideale Fläche ist ein glatter rechtwinkliger Boden (kein Teppich, Auslegeware usw,), ohne Hindernisse, Nischen und ein gereinigter Filter.

Datenbasis

Die Daten stammen aus der Beehive API, wie unter Maps/Index beschrieben. In FHEM sind die Daten im Gerätehash verfügbar unter:

 $defs{<name>}{helper}{MAPS}{<MapNr. [0..19]>}{<Bezeichner gem. API>}

Weblink-Definition

Um die Statistik extern einbinden zu können, kann sie per Weblink eingebunden werden.

 define <device>StatsWl weblink htmlCode { BOTVAC::ShowStatistics("<device>") }

Berechnungsmodel

Es werden die Bezeichner aus der Beehive API verwendet.

Erwartungswert Fläche (qm)

 expected_area = cleaned_area / ( run_charge_at_start - run_charge_at_end )

Erwartungswert Laufzeit (min)

 expected_time = ( end_at - start_at - time_in_suspended_cleaning - time_in_error - time_in_pause ) / ( run_charge_at_start - run_charge_at_end )

Beispiel

Vorwerk gibt für den VR300(VR220) folgende Werte an:

  • Akku: 84 Wh, nach 800 Ladezyklen 70%
  • Fläche: eco, 120 qm; turbo (normal), 90 qm
  • Laufzeit: eco, 90 min; turbo (normal), 60 min
  • Leistung: eco, 65 W; turbo (normal), 85 W

Versuchsbedingungen

  • Messung: Zwischenstecker mit Leistungsmessung (Homematic HM-ES-PMSW1-PL-DN-R1) am Eingang der Ladestation.
  • Fläche: 5,9 qm, Bodenfliesen

Testfläche

  • Robot: VR300,neuer Akku 8 Ladezyklen, Startladung 97-98%, gereinigter Filter, turbo 11 und eco 9 Fahrten.

Ergebnis

20 Fahrten ergeben folgende Übersicht:

BOTVAC MapStatistik.png

Die aus den Testfahrten berechneten Erwartungswerte für die Fläche und Laufzeit liegen in der Nähe der spezifizierten Werte.

  • Für den Mode eco liegt der Erwartungswert für die gereinigte Fläche bei 117 qm zu 120 qm.
  • Für den Mode eco liegt der Erwartungswert für die Laufzeit bei 92 min zu 90 min.
  • Für den Mode turbo liegt der Erwartungswert für die gereinigte Fläche bei 76 qm zu 90 qm.
  • Für den Mode turbo liegt der Erwartungswert für die Laufzeit bei 66 min zu 60 min.

Die spezifizierten Werte werden nur theoretisch erreicht, da nur 75% - 85% der Akkukapazität zum Reinigen zur Verfügung steht, denn der Saugroboter kann nicht gestartet werden, wenn der Ladezustand des Akkus unter 25% liegt oder er hört auf zu reinigen, wenn der Ladezustand auf 15% abgesunken ist.

Wird der Versuch nach 800 Ladezyklen wiederholt, sollten die Erwartungswerte auf 70% gesunken sein.

Abnutzung des Akkus im Standby

Im Standbybetrieb bleibt die WLAN-Verbindung bestehen. Mit einer Steckdose zur Leistungsmessung kann die im Standby benötigte Leistung und Energie ermittelt werden, hier als Grafik. BOTVAC VR300 Standbyverbrauch.png

Aus einer Messung über 24 Stunden ergeben sich folgende Werte.

Benötigte Energie

 75,6 Wh

Bei einer Nennkapazität des Akkus von 84 Wh bedeuten 75,6 Wh täglicher Energiebedarf fast eine Akkuladung. Vorwerk gibt an, das der Akku nach 800 Ladezyklen die Nennkapazität auf 70% gesunken ist, das allein wird durch 3 Jahre Standbybetrieb erreicht.

Das Reading batteryTotalCharges ist auch ein Maß für die Abnutzung des Akkus. Das Reading wird durch das Nachladen des Akkus zum Ladungserhalt hochgezählt, nach einer gemessenen Ladungsmenge von ca. 150 Wh und 2 Tagen im Standby an der Ladestation. Bei Betrachtung des Zählers werden die 800 Ladezyklen durch ca. 4 1/2 Jahren Standbybetrieb erreicht.

Durchschnittliche Leistung

 75,6 Wh / 24 h = 3,2 W