Roomba: Unterschied zwischen den Versionen

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
K (Link auf Modellreihenvergleich der iRobot-Geräte; Syntaxhighlight für zwei Textpassagen)
Zeile 1: Zeile 1:
=Allgemeines=
==Allgemeines==
Die Reinigungsroboter Roomba und Braava von iRobot können via [[MQTT]] an FHEM gekoppelt werden. Dazu werden die Module [[MQTT2_CLIENT]] und [[MQTT2_DEVICE]] benötigt
Die Reinigungsroboter Roomba und Braava von iRobot können via [[MQTT]] an FHEM gekoppelt werden. Dazu werden die Module [[MQTT2_CLIENT]] und [[MQTT2_DEVICE]] benötigt
* Diskussion siehe hier {{Link2Forum|Topic=114166|LinkText=Hier in diesen Forumsthread}}
* Diskussion siehe hier {{Link2Forum|Topic=114166|LinkText=Hier in diesen Forumsthread}}
'''Achtung: Work in progress '''
'''Achtung: Work in progress '''
== Produkte ==
 
Siehe [http://www.irobot.de/Haushaltsroboter/staubsaugen Produktübersicht]
=== Produkte ===
== Getestet mit der nachfolgenden Anleitung ==
{{Randnotiz|RNTyp=Info|RNText=Eine recht vollständige Übersicht über die iRobot Modellreihen, die Unterschiede sowie technische Details hat Olaf Schmitz auf seiner Website [https://www.staubsauger-berater.de/staubsauger-vergleich/irobot-roomba-vergleich-uebersicht/ staubsauger-berater.de] zusammengestellt}}
Details über die diversen Geräte gibt auf der [http://www.irobot.de/Haushaltsroboter/staubsaugen Produktübersichtsseite] des Herstellers.
 
=== Getestet mit der nachfolgenden Anleitung ===
*Roomba 960
*Roomba 960
*Roomba 966
*Roomba 966
*Roomba E5
*Roomba E5
*Roomba I7
*Roomba i7
*Braava Jet
*Braava Jet
= Einbindung in FHEM =
 
== Einbindung in FHEM ==
Die Roboter haben eine ungewöhnliche Software, diese enthält nämlich einen MQTT-Server (früher MQTT-Broker). Man kann sie also nicht als MQTT-Device bei einem MQTT-Server anmelden, sondern muss ein MQTT-Device schaffen, das sich bei dem internen MQTT-Server anmeldet.
Die Roboter haben eine ungewöhnliche Software, diese enthält nämlich einen MQTT-Server (früher MQTT-Broker). Man kann sie also nicht als MQTT-Device bei einem MQTT-Server anmelden, sondern muss ein MQTT-Device schaffen, das sich bei dem internen MQTT-Server anmeldet.
== Vorbereitung ==
 
=== Vorbereitung ===
Melden Sie den Roboter im WLAN an. Idealerweise lassen Sie ihm eine feste IP-Adresse im WLAN zuweisen. Derzeit ist es noch nicht möglich, den ersten fogenden Schritt innerhalb von FHEM zu tun. Gebraucht wird dazu noch eine externe Anwendung, dafür gibt es nachfolgend zwei Alternativen.
Melden Sie den Roboter im WLAN an. Idealerweise lassen Sie ihm eine feste IP-Adresse im WLAN zuweisen. Derzeit ist es noch nicht möglich, den ersten fogenden Schritt innerhalb von FHEM zu tun. Gebraucht wird dazu noch eine externe Anwendung, dafür gibt es nachfolgend zwei Alternativen.
=== Python ===
 
Gehen Sie zur Anwendung [https://github.com/NickWaterton/Roomba980-Python Roomba980 ]. Installieren Sie diese nach dort zu findender Anleitung.
==== Python ====
Gehen Sie zur Anwendung [https://github.com/NickWaterton/Roomba980-Python Roomba980 ]. Installieren Sie diese nach dort zu findender Anleitung.
  pip install paho-mqtt
  pip install paho-mqtt
  pip install pillow
  pip install pillow
  pip install six
  pip install six
  pip install git+https://github.com/NickWaterton/Roomba980-Python.git  
  pip install <nowiki>git+https://github.com/NickWaterton/Roomba980-Python.git </nowiki>
Versetzen Sie den Roboter danach in den Anlernzustand. Welche Buttons auf dem Roboter dabei gedrückt werden müssen, entnehmen Sie bitte der Anleitung des Roboters. Während dieser Anlernzustand andauert, starten Sie bitte das Programm
Versetzen Sie den Roboter danach in den Anlernzustand. Welche Buttons auf dem Roboter dabei gedrückt werden müssen, entnehmen Sie bitte der Anleitung des Roboters. Während dieser Anlernzustand andauert, starten Sie bitte das Programm
  python3 ~/Roomba980-Python/roomba/getpasswd.py
  python3 ~/Roomba980-Python/roomba/getpasswd.py
Zeile 53: Zeile 59:
  Use these credentials in roomba.py
  Use these credentials in roomba.py
Die fettgedruckten Strings sind IP-Adresse, blid und Passwort und sollten gut aufbewahrt werden.
Die fettgedruckten Strings sind IP-Adresse, blid und Passwort und sollten gut aufbewahrt werden.
=== JavaScript mit node.js ===
==== JavaScript mit node.js ====
  git clone https://github.com/koalazak/dorita980.git
  git <nowiki>clone https://github.com/koalazak/dorita980.git</nowiki>
  cd dorita980
  cd dorita980
  npm install
  npm install
  npm run getpassword 192.168.0.XX
  npm run getpassword 192.168.0.XX
Die Antwort ist nahezu identisch mit der oben beschriebenen Methode.
Die Antwort ist nahezu identisch mit der oben beschriebenen Methode.
==Einrichten eines MQTT Client==
 
===Einrichten eines MQTT Client===
Definieren Sie in FHEM  
Definieren Sie in FHEM  
  define RoombaFegerClient MQTT2_CLIENT '''192.168.0.XX''':8883
  define RoombaFegerClient MQTT2_CLIENT '''192.168.0.XX''':8883
Zeile 80: Zeile 87:
     '''CipherString = DEFAULT:@SECLEVEL=1'''
     '''CipherString = DEFAULT:@SECLEVEL=1'''
vornehmen.
vornehmen.
== Einrichten eines MQTT Device==
 
=== Einrichten eines MQTT Device===
Definieren Sie in FHEM
Definieren Sie in FHEM
  define RoombaFeger MQTT2_DEVICE '''3###########0'''
  define RoombaFeger MQTT2_DEVICE '''3###########0'''
Zeile 94: Zeile 102:


[[File:roomba1.png]]
[[File:roomba1.png]]
== Komfortfunktionen für Readings ==
=== Komfortfunktionen für Readings ===
Das so erzeugte MQTT-Device hat eine Vielzahl von Readings, die gar nicht alle benötigt werden. Diese kann man vermeiden und durch eigene Readings ersetzen, indem der Attributwert auf
Das so erzeugte MQTT-Device hat eine Vielzahl von Readings, die gar nicht alle benötigt werden. Diese kann man vermeiden und durch eigene Readings ersetzen, indem der Attributwert auf
  attr RoombaFeger readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
  attr RoombaFeger readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
  attr RoombaFeger stateFormat cmPhaseE (battery %)
  attr RoombaFeger stateFormat cmPhaseE (battery %)
geändert wird. Dazu muss natürlich in einem Package '''roomba''' die Funktion '''reading()''' definiert werden, die je nach einlaufenden Daten entsprechende Readings erzeugt. Beispiel:
geändert wird. Dazu muss natürlich in einem Package '''roomba''' die Funktion '''reading()''' definiert werden, die je nach einlaufenden Daten entsprechende Readings erzeugt. Beispiel:
<syntaxhighlight lang="perl">
  package roomba;
  package roomba;
  ...
  ...
Zeile 127: Zeile 136:
   return {%ret};
   return {%ret};
  }
  }
</syntaxhighlight>
Mit dieser Funktion werden die Readings ''positionTheta'' und ''position'' erzeugt. Weitere Beispiele dafür, die einen komfortablen Satz von Readings erzeugen, finden Sie in FHEM, und zwar im Ordner fhem/contrib/Roomba in der Datei 99_RoombaUtils.pm. Wenn Sie diese Datei in den Ordner fhem/FHEM kopieren, wird sie beim Systemstart automatisch geladen und stellt dieses Package zur Verfügung. Achtung: Bei Verwendung dieser Datei müssen ggf. noch Perl-Module nachinstalliert werden.
Mit dieser Funktion werden die Readings ''positionTheta'' und ''position'' erzeugt. Weitere Beispiele dafür, die einen komfortablen Satz von Readings erzeugen, finden Sie in FHEM, und zwar im Ordner fhem/contrib/Roomba in der Datei 99_RoombaUtils.pm. Wenn Sie diese Datei in den Ordner fhem/FHEM kopieren, wird sie beim Systemstart automatisch geladen und stellt dieses Package zur Verfügung. Achtung: Bei Verwendung dieser Datei müssen ggf. noch Perl-Module nachinstalliert werden.
== Komfortfunktionen für set-Befehle ==
 
=== Komfortfunktionen für set-Befehle ===
Die Eingabe von Konfigurationsdaten (z.B. ob Kantenreinigung erfolgen soll) oder Zeitplänen ist zwar prinzipiell mit dem "nackten" MQTT-Device auch möglich, aber nicht sehr komfortabel. Mit der Abänderung des Attributwertes auf
Die Eingabe von Konfigurationsdaten (z.B. ob Kantenreinigung erfolgen soll) oder Zeitplänen ist zwar prinzipiell mit dem "nackten" MQTT-Device auch möglich, aber nicht sehr komfortabel. Mit der Abänderung des Attributwertes auf
  attr RoombaFeger setList start:noArg {roomba::command($NAME,"start",$EVENT)} \
  attr RoombaFeger setList start:noArg {roomba::command($NAME,"start",$EVENT)} \
Zeile 153: Zeile 164:
   mapdel {roomba::setting($NAME,"local:cmMapList={delmap('$NAME','$EVENT')}",$EVENT)}  
   mapdel {roomba::setting($NAME,"local:cmMapList={delmap('$NAME','$EVENT')}",$EVENT)}  
und den dazu in 99_RoombaUtils.pm zur Verfügung gestellten Funktionen geht das sehr viel einfacher.
und den dazu in 99_RoombaUtils.pm zur Verfügung gestellten Funktionen geht das sehr viel einfacher.
== Reinigungskarten ==
 
=== Reinigungskarten ===
'''Achtung, dieser Bereich ist noch in Arbeit'''
'''Achtung, dieser Bereich ist noch in Arbeit'''


Bei der Anzeige, welche Bereiche der Roboter gereinigt hat, kann man sich natürlich auf die Cloud von iRobot verlassen. Allerdings geht das auch innerhalb von FHEM.  
Bei der Anzeige, welche Bereiche der Roboter gereinigt hat, kann man sich natürlich auf die Cloud von iRobot verlassen. Allerdings geht das auch innerhalb von FHEM.  
===Abschalten der Kartenfunktion in FHEM===
====Abschalten der Kartenfunktion in FHEM====
Zum kompletten Abschalten der Pfadfunktionen in FHEM muss ein User-Attribut gesetzt werden
Zum kompletten Abschalten der Pfadfunktionen in FHEM muss ein User-Attribut gesetzt werden
  attr Roombafeger userattr noMap:true,false
  attr Roombafeger userattr noMap:true,false
  attr RoombaFeger noMap true
  attr RoombaFeger noMap true
===Nutzung der Kartenfunktion in FHEM===
====Nutzung der Kartenfunktion in FHEM====
Was ist dafür nötig? Zunächst eine Bilddatei im SVG-Format. Beispielsweise kann diese leer sein und nur einen Bildraum von 12x8 Metern definieren
Was ist dafür nötig? Zunächst eine Bilddatei im SVG-Format. Beispielsweise kann diese leer sein und nur einen Bildraum von 12x8 Metern definieren
<syntaxhighlight lang="html">
  <?xml version="1.0" encoding="UTF-8"?>
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
Zeile 179: Zeile 192:
     </g>
     </g>
  </svg>
  </svg>
</syntaxhighlight>
Diese Datei, z.B. habe sie den Namen ''SVG_EG.svg'', muss in den Ordner ''fhem/www/images'' und wird dem MQTT2-Device mit dem Attribut  
Diese Datei, z.B. habe sie den Namen ''SVG_EG.svg'', muss in den Ordner ''fhem/www/images'' und wird dem MQTT2-Device mit dem Attribut  
  attr Roombafeger userattr startdir:north,west,south,east startx starty LOG_dir SVG_dir SVG_room SVG_collect SVG_final SVG_color1 SVG_color2 SVG_color3 SVG_color4
  attr Roombafeger userattr startdir:north,west,south,east startx starty LOG_dir SVG_dir SVG_room SVG_collect SVG_final SVG_color1 SVG_color2 SVG_color3 SVG_color4

Version vom 5. März 2021, 15:45 Uhr

Allgemeines

Die Reinigungsroboter Roomba und Braava von iRobot können via MQTT an FHEM gekoppelt werden. Dazu werden die Module MQTT2_CLIENT und MQTT2_DEVICE benötigt

Achtung: Work in progress

Produkte

Info green.pngEine recht vollständige Übersicht über die iRobot Modellreihen, die Unterschiede sowie technische Details hat Olaf Schmitz auf seiner Website staubsauger-berater.de zusammengestellt

Details über die diversen Geräte gibt auf der Produktübersichtsseite des Herstellers.

Getestet mit der nachfolgenden Anleitung

  • Roomba 960
  • Roomba 966
  • Roomba E5
  • Roomba i7
  • Braava Jet

Einbindung in FHEM

Die Roboter haben eine ungewöhnliche Software, diese enthält nämlich einen MQTT-Server (früher MQTT-Broker). Man kann sie also nicht als MQTT-Device bei einem MQTT-Server anmelden, sondern muss ein MQTT-Device schaffen, das sich bei dem internen MQTT-Server anmeldet.

Vorbereitung

Melden Sie den Roboter im WLAN an. Idealerweise lassen Sie ihm eine feste IP-Adresse im WLAN zuweisen. Derzeit ist es noch nicht möglich, den ersten fogenden Schritt innerhalb von FHEM zu tun. Gebraucht wird dazu noch eine externe Anwendung, dafür gibt es nachfolgend zwei Alternativen.

Python

Gehen Sie zur Anwendung Roomba980 . Installieren Sie diese nach dort zu findender Anleitung.

pip install paho-mqtt
pip install pillow
pip install six
pip install git+https://github.com/NickWaterton/Roomba980-Python.git 

Versetzen Sie den Roboter danach in den Anlernzustand. Welche Buttons auf dem Roboter dabei gedrückt werden müssen, entnehmen Sie bitte der Anleitung des Roboters. Während dieser Anlernzustand andauert, starten Sie bitte das Programm

python3 ~/Roomba980-Python/roomba/getpasswd.py

Das Ergebnis ist ein längerer Text ähnlich dem folgenden:

Received: {
"robotname": "Feger", 
"sku": "R981040", 
"nc": 0, 
"ver": "3", 
"proto": "mqtt", 
"ip": "192.168.0.xx", 
"hostname": "Roomba-31xxxxxxxxxx0", 
"sw": "v2.4.8-44", 
"mac": "70:66:xxxxxxxxxxx:6F", 
"cap": {
  "carpetBoost": 1, 
  "pp": 1, 
  "langOta": 1, 
  "binFullDetect": 1, 
  "ota": 2, 
  "maps": 1, 
  "pose": 1, 
  "eco": 1, 
  "multiPass": 2, 
  "edge": 1, 
  "svcConf": 1
}
}
Roomba (Feger) IP address is: 192.168.0.XX
blid is: 3###########0
Password=> :######################A <= Yes, all this string.
Use these credentials in roomba.py

Die fettgedruckten Strings sind IP-Adresse, blid und Passwort und sollten gut aufbewahrt werden.

JavaScript mit node.js

git clone https://github.com/koalazak/dorita980.git
cd dorita980
npm install
npm run getpassword 192.168.0.XX

Die Antwort ist nahezu identisch mit der oben beschriebenen Methode.

Einrichten eines MQTT Client

Definieren Sie in FHEM

define RoombaFegerClient MQTT2_CLIENT 192.168.0.XX:8883
attr RoombaFegerClient 
attr RoombaFegerClient    SSL        1
attr RoombaFegerClient    autocreate no
attr RoombaFegerClient    clientId   3###########0
attr RoombaFegerClient    disconnectAfter 5
attr RoombaFegerClient    mqttVersion 3.1.1
attr RoombaFegerClient    sslargs    SSL_version:SSLv23
attr RoombaFegerClient    username   31###########0

Ersetzen Sie bei den Attributwerten die IP-Adresse die clientId und den username durch den blid-String aus dem vorangehenden Schritt. Führen Sie dann mit dem aus dem vorangehenden Schritt notierten Passwort aus

set RoombaFegerClient password :######################A

Sie sollten jetzt schon in der Lage sein, sich durch

set RoombaFegerClient connect

mit dem Roboter zu verbinden, der Status des Client wechselt dabei für 5 Sekunden auf den Wert "connected". Klappt dies nicht, bitte bei diesem Client das Attribut verbose auf 5 setzen. Wenn Sie im Log eine Nachricht sehen, dass die SSL-Verbindung verweigert wurde, müssen Sie noch in der Datei \etc\ssl\openssl.conf in der passenden Sektion den fett markierten Eintrag vornehmen

 [ssl_default_sect]
   MinProtocol = TLSv1.2
   CipherString = DEFAULT:@SECLEVEL=1

vornehmen.

Einrichten eines MQTT Device

Definieren Sie in FHEM

define RoombaFeger MQTT2_DEVICE 3###########0
attr RoombaFeger IODev RoombaFegerClient
attr RoombaFeger devicetopic 3###########0
attr RoombaFeger readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }
attr RoombaFeger setList start cmd {"command": "start", "time": 1, "initiator": "localApp"} \
 dock cmd  {"command": "dock", "time": 1, "initiator": "localApp"} \
 resume cmd  {"command": "resume", "time": 1, "initiator": "localApp"} \
 pause cmd  {"command": "pause", "time": 1, "initiator": "localApp"}

wobei natürlich wieder die oben erhaltene blid für die fett hervorgehobenen Strings eingesetzt wird. Sie erhalten dadurch ein Device, dass Sie mit FHEM-Kommandos starten und anhalten können. Wenn der Roboter läuft, meldet er eine Vielzahl von Daten an FHEM - und nicht alle davon sind informativ.

Roomba1.png

Komfortfunktionen für Readings

Das so erzeugte MQTT-Device hat eine Vielzahl von Readings, die gar nicht alle benötigt werden. Diese kann man vermeiden und durch eigene Readings ersetzen, indem der Attributwert auf

attr RoombaFeger readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
attr RoombaFeger stateFormat cmPhaseE (battery %)

geändert wird. Dazu muss natürlich in einem Package roomba die Funktion reading() definiert werden, die je nach einlaufenden Daten entsprechende Readings erzeugt. Beispiel:

 package roomba;
 ...
 sub reading($$){
  my ($name,$evt) = @_;
  
  if( $evt =~ /state....reported....pose/){
    return pose($name,$evt);
  }else{
    my ($evt) = @_;
    main::Log 1,"[RoombaUtils] uncaught event ".$evt
      if( $evt ne "$name" );
    return
  }
 }
 ...
 sub pose($$){
  my ($name,$evt) = @_;
  my $hash = $main::defs{$name};
  
  #-- getting events of the type
  my $dec   = decode_json($evt);
  my $theta = $dec->{'state'}->{'reported'}->{'pose'}->{'theta'};
  my $px    = $dec->{'state'}->{'reported'}->{'pose'}->{'point'}->{'x'};
  my $py    = $dec->{'state'}->{'reported'}->{'pose'}->{'point'}->{'y'};
  ... 
  my %ret   = ("positionTheta",$theta,"position","(".$px.",".$py.")");
  return {%ret};
 }

Mit dieser Funktion werden die Readings positionTheta und position erzeugt. Weitere Beispiele dafür, die einen komfortablen Satz von Readings erzeugen, finden Sie in FHEM, und zwar im Ordner fhem/contrib/Roomba in der Datei 99_RoombaUtils.pm. Wenn Sie diese Datei in den Ordner fhem/FHEM kopieren, wird sie beim Systemstart automatisch geladen und stellt dieses Package zur Verfügung. Achtung: Bei Verwendung dieser Datei müssen ggf. noch Perl-Module nachinstalliert werden.

Komfortfunktionen für set-Befehle

Die Eingabe von Konfigurationsdaten (z.B. ob Kantenreinigung erfolgen soll) oder Zeitplänen ist zwar prinzipiell mit dem "nackten" MQTT-Device auch möglich, aber nicht sehr komfortabel. Mit der Abänderung des Attributwertes auf

attr RoombaFeger setList start:noArg {roomba::command($NAME,"start",$EVENT)} \
 stop:noArg {roomba::command($NAME,"stop",$EVENT)} \ 
 dock:noArg {roomba::command($NAME,"dock",$EVENT)} \
 resume:noArg {roomba::command($NAME,"resume",$EVENT)} \
 pause:noArg {roomba::command($NAME,"pause",$EVENT)} \
 CarpetBoost:true,false {roomba::setting($NAME,"carpetBoost",$EVENT)} \
 TwoPass:true,false {roomba::setting($NAME,"twoPass",$EVENT)} \
 NoAutoPasses:true,false {roomba::setting($NAME,"noAutoPasses",$EVENT)} \
 NoPP:true,false {roomba::setting($NAME,"noPP",$EVENT)} \
 VacHigh:true,false {roomba::setting($NAME,"vacHigh",$EVENT)} \
 BinPause:true,false {roomba::setting($NAME,"binPause",$EVENT)} \
 OpenOnly:true,false {roomba::setting($NAME,"openOnly",$EVENT)} \
 ProgHold:true,false {roomba::setting($NAME,"schedHold",$EVENT)} \
 ProgSun:time {roomba::setsched($NAME,0,$EVENT)} \
 ProgMon:time {roomba::setsched($NAME,1,$EVENT)} \
 ProgTue:time {roomba::setsched($NAME,2,$EVENT)} \
 ProgWed:time {roomba::setsched($NAME,3,$EVENT)} \
 ProgThu:time {roomba::setsched($NAME,4,$EVENT)} \
 ProgFri:time {roomba::setsched($NAME,5,$EVENT)} \
 ProgSat:time {roomba::setsched($NAME,6,$EVENT)} \
 maplist:noArg {roomba::setting($NAME,"local:cmMapList={listmaps('$NAME')}",$EVENT)} \
 mapdel {roomba::setting($NAME,"local:cmMapList={delmap('$NAME','$EVENT')}",$EVENT)} 

und den dazu in 99_RoombaUtils.pm zur Verfügung gestellten Funktionen geht das sehr viel einfacher.

Reinigungskarten

Achtung, dieser Bereich ist noch in Arbeit

Bei der Anzeige, welche Bereiche der Roboter gereinigt hat, kann man sich natürlich auf die Cloud von iRobot verlassen. Allerdings geht das auch innerhalb von FHEM.

Abschalten der Kartenfunktion in FHEM

Zum kompletten Abschalten der Pfadfunktionen in FHEM muss ein User-Attribut gesetzt werden

attr Roombafeger userattr noMap:true,false
attr RoombaFeger noMap true

Nutzung der Kartenfunktion in FHEM

Was ist dafür nötig? Zunächst eine Bilddatei im SVG-Format. Beispielsweise kann diese leer sein und nur einen Bildraum von 12x8 Metern definieren

 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="800" viewBox="-30 -30 1200 800">
 </svg>
Oder - wie im folgenden Beispiel - die Innenkante des Wohnzimmers enthalten:
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="800" viewBox="-30 -30 1200 800">
    <g transform="translate(1130 560) scale(1 -1)">
        ...
        <!-- Innenkante Wohnzimmer -->
        <polyline stroke="black" fill="none"
            points="0 0 0 534 -401 534 -401 491 -471 491 -471 296 -495 296 -495 350 -713 350 -713 333 -759 333 -897 195 -936 195 -936 146 -780 -10 -780 -160 -496 -160 -496 0 0 0"/>
        ...
    </g>
 </svg>

Diese Datei, z.B. habe sie den Namen SVG_EG.svg, muss in den Ordner fhem/www/images und wird dem MQTT2-Device mit dem Attribut

attr Roombafeger userattr startdir:north,west,south,east startx starty LOG_dir SVG_dir SVG_room SVG_collect SVG_final SVG_color1 SVG_color2 SVG_color3 SVG_color4
attr RoombaFeger SVG_room SVG_EG.svg

bekannt gemacht. Desweiteren bekommt das Device Attribute, die auf dieser Karte den Startpunkt des Roboters bekannt machen - in Zentimetern vom linken Rand und vom oberen Rand der Karte. Die Startrichtung ist wie bei einer Landkart einzugeben: Norden ist immer, auch wenn der Reinigungsbereich komplett anders ausgerichtet ist. Also z.B. für einen Start an der rechten Seite des obigen Wohnzimmers

attr RoombaFeger startdir west
attr Roombafeger startx 1080
attr RoombaFeger starty 500

Die Map-Funktionen in 99_RoombaUtils fügen einer Zwischendatei (Collect-Datei) jedesmal, wenn ein Reinigungsvorgang abgeschlossen wird, einen neuen Pfad hinzu. Gleichzeitig wird aus der obigen Datei und dieser Collect-Datei eine neue SVG-Grafik erzeugt, die alle bisherigen Pfade enthält und sogar interaktiv ist. Auf der Linken Seite dieser Datei gibt es eine Liste aller bisherigen Durchläufe, in der man per Mausklick jeden einzelnen Durchlauf auswählen und hervorheben kann. Wie diese Dateien heißn, wird ebenfalls bekannt gemacht, z.B.

attr RoombaFeger SVG_collect SVG_RoombaFeger.xml
attr RoombaFeger SVG_final SVG_RoombaFeger.svg

Ferner benötigen wir noch vier Doppel-Farbspezifikationen für Konvexe Hülle, Schwerpunkt, Startpunkt und den Pfad selber. Die erste Farbe sollte dabei etwas kräftiger sein, als die zweite

attr RoombaFeger SVG_color1 green:lightgreen
attr RoombaFeger SVG_color2 orange:yellow
attr RoombaFeger SVG_color3 red:pink
attr RoombaFeger SVG_color4 blue:lightblue.

Wie das dann aussieht, kann man auf der nachstehenden Grafik sehen. Rot/Pink ist der Startpunkt, Orange/Gelb ist der Schwerpunkt, Grün/Hellgrün sind die konvexen Hüllen und Blau/Hellblau die Pfade. Die interaktive Liste ist auf der linken Seite zu finden.

Die Komfortfunktionen in 99_RoombaUtils.pm stellen auch zwei Kommandos zur Verfügung, mit denen die Karten verwaltet werden können. Das Kommando

set Roombafeger maplist

erstellt ein Reading maplist, mit dem die in der Karte existierenden Durchläufe angezeigt werden. Das Kommando

set RoombaFeger mapdel <nummer>

löscht aus den angegebenen Durchlauf aus der Collect-Datei (Achtung, dabei kommt es zu einer Neunummerierung der Einträge). Roomba2.png