BOTVAC: Unterschied zwischen den Versionen
(→SET) |
Trelle (Diskussion | Beiträge) K (→Datenbasis) |
||
(55 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Infobox Modul | {{Infobox Modul | ||
|ModPurpose= | |ModPurpose=Steuerung eines NEATO oder VORWERK Saugroboters | ||
|ModType=d | |ModType=d | ||
|ModForumArea=Sonstige Systeme | |||
|ModForumArea= | |ModTechName=70_BOTVAC.pm | ||
|ModTechName= | |ModOwner=Vuffiraa ({{Link2FU|1028|Forum}}/[[Benutzer Diskussion:Vuffiraa|Wiki]]) | ||
|ModOwner= | |||
}} | }} | ||
[[BOTVAC]] | Mit dem [[BOTVAC]]-Modul können VORWERK und NEATO Saugroboter gesteuert werden. | ||
== Allgemeines == | == 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 === | === 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. | |||
:<code>{"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}</code> | |||
: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 | *findMe | ||
** | **Löst die Suchfunktion des Saugroboters aus. Dabei wird ein Ton wiedergegeben und die LEDs blinken. | ||
*password | *password | ||
**Setzt das Passwort für den NEATO/VORWERK-Zugang. | |||
*pause | *pause | ||
** | **Pausiert die Reinigung | ||
*pauseToBase | *pauseToBase | ||
**Beendet eine Reinigung und fährt zur Basis zurück | **Beendet eine Reinigung und fährt zur Basis zurück | ||
*reloadMaps | *reloadMaps | ||
**Lädt die letzte Karte vom Neato-Server, die erstellt wurde. Das passiert normalerweise automatisch, ist aber z.B. beim Neustart von | **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 | *resume | ||
**Setzt Reinigung fort | **Setzt eine Reinigung fort. | ||
*schedule | *schedule | ||
**Die möglichen Argumente sind 'on' und 'off' zum An- und Abschalten der Zeitsteuerung. | **Die möglichen Argumente sind 'on' und 'off' zum An- und Abschalten der Zeitsteuerung. | ||
*sendToBase | *sendToBase | ||
**Fährt zur Basis zurück | **Fährt zur Basis zurück | ||
*setBoundaries | *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: | |||
::<code>set <name> setBoundariesOnFloorplan_0 Bad</code> | |||
::<code>set <name> setBoundariesOnFloorplan_0 Bad,Kueche</code> | |||
::<code>set <name> setBoundariesOnFloorplan_0 {"type":"polyline","vertices":[[0.710,0.6217],[0.710,0.6923]], "name":"Bad","color":"#E54B1C","enabled":true}</code> | |||
*setRobot | *setRobot | ||
**Legt den zu steuernden Roboter fest | **Legt den zu steuernden Roboter fest, wenn mehr als ein Saugroboter unter dem selben Zugang bei NEATO/VORWERK registriert ist. | ||
*startCleaning | *startCleaning | ||
** Startet die | **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 | *startSpot | ||
**Startet die Spot-Reinigung | **Startet die Spot-Reinigung von der aktuellen Position. | ||
*statusRequest | *statusRequest | ||
**Bewirkst eine Aktualisierung aller Readings. | |||
*stop | *stop | ||
** | **Stoppt die Reinigung. | ||
*syncRobots | *syncRobots | ||
**Synchronisiert die Roboterdaten. Das ist nützlich, wenn man mehrere Geräte unter einem | **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 | *batteryPercent | ||
**Gibt den aktuellen Stand der Akkuladung des Saugroboters. | |||
*statistics | |||
**Liefert eine Übersicht der relevanten Parameter je vorhandener Map, siehe [[#Map Statistik|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 | *dockHasBeenSeen | ||
**stellt sich erst eine Weile nach Beginn einer Reinigung auf "1".Und nur in diesem Zustand klappt das Zurücksenden. | **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 == | == Grundkonfiguration == | ||
=== Definition in FHEM === | |||
define <name> BOTVAC <email> [<vendor>] [<poll-interval>] | |||
set <name> password <password> | |||
=== Icons === | === Icons === | ||
https://forum.fhem.de/index.php/topic,51713.msg539375.html#msg539375 | https://forum.fhem.de/index.php/topic,51713.msg539375.html#msg539375 | ||
Zeile 78: | Zeile 199: | ||
die Datei reinkopieren, dann "set WEB rereadicons" und anschließend normal als Icon auswählen. | die Datei reinkopieren, dann "set WEB rereadicons" und anschließend normal als Icon auswählen. | ||
Inzwischen ist das Icon wohl im SVN eingecheckt. | Inzwischen ist das Icon wohl im SVN eingecheckt. | ||
== Probleme == | == 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. | 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. | 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 | Ansonsten bleibt noch die Registrierungsschlüssel im FHEM-Gerät zu löschen. Das geht über die Kommandozeile in FHEM: | ||
- | :<code>deletereading <device> accessToken</code> | ||
- | :<code>deletereading <device> secretKey</code> | ||
== 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: | |||
<code>http(s)://<ip>:<port>/fhem/BOTVAC/<device>/map</code> | |||
Eine Weblink-Definition sieht so aus: | |||
<code>define <device>Wl weblink htmlCode { FHEM::BOTVAC::ShowMap("<device>"[,"<width>"[,"<height>"]]) }</code> | |||
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 [[TelegramBot|Telegram]] versenden === | |||
<code>set <TelegramBot> cmdSend {ReadingsVal('<BOTVAC>', '.map_cache', '')}</code> | |||
=== Alle Maps in einem Reading anzeigen === | |||
Beschrieben im {{Link2Forum|Topic=51713|Message=933448|LinkText=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 | |||
<pre> | |||
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 (defined ($::defs{VR300}{Helper}{'.MAP_CACHE'})) {\ | |||
my $map = $::defs{VR300}{Helper}{'.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 | |||
</pre> | |||
Mit dem nachstehenden Befehl kann die letzte Karte nachträglich gespeichert werden. | |||
<code>set loadMap cmd_1</code> | |||
userReading im BOTVAC-Gerät zur Anzeige der letzten Karten. | |||
<pre> | |||
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};;\ | |||
FHEM::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;;\ | |||
} | |||
</pre> | |||
Ü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 [https://developers.neatorobotics.com/api/beehive 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>} | |||
Die letzte geladene Karte ist gespeichert unter | |||
$defs{<name>}{Helper}{'.MAP_CACHE'} | |||
=== Weblink-Definition === | |||
Um die Statistik extern einbinden zu können, kann sie per Weblink eingebunden werden. | |||
define <device>StatsWl weblink htmlCode { FHEM::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 | |||
[[Datei:BOTVAC_Testfläche_6_qm.png|200px|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: | |||
[[Datei:BOTVAC_MapStatistik.png|800px]] | |||
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. | |||
[[Datei:BOTVAC VR300 Standbyverbrauch.png|800px]] | |||
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 <code>batteryTotalCharges</code> 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 | |||
[[Kategorie:Saugroboter]] |
Aktuelle Version vom 22. April 2021, 09:07 Uhr
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
- Startet oder stoppt die Reinigungsaktivitäten:.
- 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.
- 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.
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
- kann einen dieser Werte annehmen:
- 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!
- kann einen dieser Werte annehmen:
- stateId
- kann einen dieser Werte annehmen:
- 0 - Invalid
- 1 - Idle
- 2 - Busy
- 3 - Paused
- 4 - Error
- kann einen dieser Werte annehmen:
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 { FHEM::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 (defined ($::defs{VR300}{Helper}{'.MAP_CACHE'})) {\ my $map = $::defs{VR300}{Helper}{'.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};;\ FHEM::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>}
Die letzte geladene Karte ist gespeichert unter
$defs{<name>}{Helper}{'.MAP_CACHE'}
Weblink-Definition
Um die Statistik extern einbinden zu können, kann sie per Weblink eingebunden werden.
define <device>StatsWl weblink htmlCode { FHEM::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
- Robot: VR300,neuer Akku 8 Ladezyklen, Startladung 97-98%, gereinigter Filter, turbo 11 und eco 9 Fahrten.
Ergebnis
20 Fahrten ergeben folgende Übersicht:
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.
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