Roomba Staubsaugerroboter

Begonnen von Prof. Dr. Peter Henning, 10 September 2020, 16:40:34

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

#180
OK, das mit dem Neustart an der clean-Taste werde ich gerne mal probieren. Ich habe eine neue Version des Hilfsmoduls, die ich hier mal anhänge. Sie setzt während des Reinigungsvorgangs das disconnectAfter-Attribut hoch, funktioniert bei mir über die letzte Woche hinweg sehr gut.

LG

pah

FSausF

So, neuer Tag, neues Glück:
Gestern Abend die neue RoombaUtils eingespielt und die Attribute für die Kartenausgabe wieder gesetzt, um die Feldforschung auf eigener Krume zu unterstützen.

Ergebnis:

  • Heinzelmann rumpelt auf fhem-Kommando los. Schon mal gut.
  • Nach dem Docken ist der letzte Status "Aufgabe beendet, wird geladen.". Die Readings für Karte und Kartenliste werden nicht automatisch aktualisiert.
  • Mit ein, zwei Mal anschubsen (aktualisieren der Anzeige) wechselt der Status auf "wird geladen" und das Reading für die Karte kommt. Danke für die Sache mit der IP-Adresse.
  • Die Karte (frisch angefangen) sieht gut aus. Das Reading für die Kartenliste fehlt, und kommt auch nicht, wenn ich es via Maplist anfordere.
Also nur teilweise erfolgreich.
Ich lasse das Mapping noch mal ein Paar Tage mitlaufen und schaue, ob es sich irgendwie eingroovt.

Aber die wesentliche Funktion (Roomba reagiert auf fhem und bollert los) ist zunächst mal gegeben.
Ich berichte über die Stabilität.

P.S.: Hatte ich eigentlich erwähnt, dass mein Roomba-Täterä ein einfacher 960er mit aktueller Firmware ist, keine hochgezüchtete i-Series?

Prof. Dr. Peter Henning

Das sind leider unzureichende Informationen.
- Wie sind die Attributwerte für das Mapping?
- Was sagt das Log dazu?
- Was ist der Wert des Readings cmMap?

Evtl. mal probieren, in der FHEM-Kommadozeile einzugeben

{roomba::finalizemap($defs{"<hier Devicename>"})}

LG

pah

delMar

Hallo,

das Modul läuft soweit zu meiner vollsten Zufriedenheit.
Super timing, dass hier genau dann damit begonnen wurde, als ich mir das Teil gekauft hab :-)

Ich hab versucht, bei meinem i7 das Mapping zu nutzen.
Bisher sind durch set maplist keine dafür spezifischen Readings (cmMap?) aufgetaucht.
Auch im Log ist darauf keine Reaktion zu sehen.
Entweder ich mach was falsch, oder der i7 benötigt etwas extra. Firmware ist 3.12.x

Beim Ausführen von

{roomba::finalizemap($defs{"iRobotRoomba"})}

kommt im Log

2021.02.05 10:20:06 1: [RoombaUtils] Finalization of map for device iRobotRoomba not possible, path undefined


Welcher path ist denn damit gemeint?

Das sind die Attribute, die ich am MQTT-Device gesetzt hab:


attr iRobotRoomba LOG_dir /tmp
attr iRobotRoomba SVG_collect SVG_Roomba.xml
attr iRobotRoomba SVG_color1 green:lightgreen
attr iRobotRoomba SVG_color2 orange:yellow
attr iRobotRoomba SVG_color3 red:pink
attr iRobotRoomba SVG_color4 blue:lightblue.
attr iRobotRoomba SVG_final SVG_Roomba.svg
attr iRobotRoomba SVG_room SVG_EG.svg


Mein Anliegen ist eindeutig als low-prio zu deklarieren, ich bin gern bereit, hier aktiv mitzuhelfen.

Danke
schöne Grüße
Martin
Maintainer von: ZoneMinder, TA_CMI_JSON, ONKYO_AVR, DENON_AVR, CanOverEthernet, IPCAM.

Vielgenutzte Module sind die größte Motivation für Entwickler.
Bitte zumindest 'attr global sendStatistics onUpdate' setzen.
Denn: ohne 'sendStatistics' keine Zahlen.

Prof. Dr. Peter Henning

Der Pfad ist das Array, in welchem die Punkte einer Mission aufgesammelt werden.

OK, fragen wir mal die Details ab.

1. Werden während einer Reinigungsmission regelmäßig die Readings
Zitatposition
positionCount
positionTheta
upgedated?   

2. Was ergibt der Befehl
{Dumper($defs{'<hier Devicename>'}->{helper})}
Vor, während und nach einer Reinigungsmission?

2.

Was steht in den Dateien
ZitatSVG_Roomba.xml
SVG_EG.svg

Das mit dem Reinigen einzelner Räume werde ich irgendwann einbauen - und hoffe, meine beiden Roboter auch dazu zu bewegen. Prinzipiell sollte es möglich sein, per API die Kiste an einen bestimmten Ort zu bewegen und die virtuelle Raumbegrenzung in FHEM einzubauen.

LG

pah

delMar

Zitat von: Prof. Dr. Peter Henning am 05 Februar 2021, 14:33:54
1. Werden während einer Reinigungsmission regelmäßig die Readingsupgedated?   
Grundsätzlich ja. Bei mir sind das aber

state_reported_pose_point_x
state_reported_pose_point_y
state_reported_pose_theta

Und ich denke, da liegt auch schon die Ursache des Problems.
Ich bin so frei und schau mir mal selber den Code soweit durch, dass ich vielleicht selber etwas experimentiere, bevor ich mehr deiner Zeit beanspruche

Zitat von: Prof. Dr. Peter Henning am 05 Februar 2021, 14:33:54
2. Was ergibt der Befehl
{Dumper($defs{'<hier Devicename>'}->{helper})}
Vor, während und nach einer Reinigungsmission?
Undef

Zitat von: Prof. Dr. Peter Henning am 05 Februar 2021, 14:33:54
Was steht in den Dateien
Nix. Wahrscheinlich ein Folgefehler der vorigen zwei Fragen.

Danke, ich geb Bescheid, wenn ich entweder was Lösen konnte, oder feststecke.
Maintainer von: ZoneMinder, TA_CMI_JSON, ONKYO_AVR, DENON_AVR, CanOverEthernet, IPCAM.

Vielgenutzte Module sind die größte Motivation für Entwickler.
Bitte zumindest 'attr global sendStatistics onUpdate' setzen.
Denn: ohne 'sendStatistics' keine Zahlen.

Prof. Dr. Peter Henning

state_reported_pose_point_x
state_reported_pose_point_y
state_reported_pose_theta

Kann eigentlich nur vorkommen, wenn die readingList nicht richtig gesetzt wird. Sonst würde das durch das Unterprogramm pose() abgefangen.
sub pose($$){
  my ($name,$evt) = @_;
 
  my $hash = $main::defs{$name};
 
  #-- getting events of the type
  # {"state":{"reported":{"pose":{"theta":0,"point":{"x":311,"y":-21}}}}}    <============== Hier ein Beispiel für den JSON-Code, der hiermit abgefangen wird
  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'};
 
  if($hash->{helper}{initmap}==1){
    $hash->{helper}{startx} = $px;
    $hash->{helper}{starty} = $py;
    $hash->{helper}{initmap}=0;
  }
  $px -= $hash->{helper}{startx};
  $py -= $hash->{helper}{starty};
 
  my $dir = main::AttrVal($name,"startdir","north");
  my ($pxp,$pyp);
  if($dir eq "north"){
    $pxp = -$py;
    $pyp =  $px;
  }elsif($dir eq "east"){
    $pxp = $px;
    $pyp = $py;
  }elsif($dir eq "south"){
    $pxp =  $py;
    $pyp = -$px;
  }elsif($dir eq "west"){
    $pxp = -$px;
    $pyp = -$py;
  }else{
    main::Log 1,"[RoombaUtils] invalid start direction $dir";
  }

  #-- Reduction not useful
  push(@{$hash->{helper}{theta}},$theta);
  push(@{$hash->{helper}{path}},$pxp,$pyp);
  my $count = $hash->{helper}{pcount};
  $count++;
  $hash->{helper}{pcount}=$count;
   
  my %ret   = ("positionTheta",$theta,"positionCount",$count,"position","(".$pxp.",".$pyp.")");
  return {%ret};
}

Klar ist auch, dass dann kein Pfad existiert, wenn das nicht abgefangen wird.


Undef

Kann nicht sein, wenn das Device existiert


LG

pah

thoweiss

Hallo an alle Roombauser,

seit gestern tut "Horst" (Roomba e5) hier seinen Dienst.

Würde die Anbindung an FHEM beim e5 über MQTT auch funktionieren?

Allerdings hat der e5 keine Kartennavigation und brummt zufällig durch die Bude.

Gruß,
Thorsten

delMar

Zitat
Kann eigentlich nur vorkommen, wenn die readingList nicht richtig gesetzt wird. Sonst würde das durch das Unterprogramm pose() abgefangen.
Und da haben wir auch schon die Lösung. Ich dachte, die Methode reading() ist nur dazu da, ungewollte Readings zu entfernen.  Ich hatte folgenden Wert für readingList gesetzt.

$DEVICETOPIC:.* { json2nameValue($EVENT) }

Aber ja, es steht grundsätzlich im Wiki. Dass das für die Mapping funktion essentiell ist, war mir nicht klar.

Und das undef kam daher, weil es {helper} tatsächlich nicht gab.

Nun funktioniert alles. Ohne Änderung. Perfekt.
Danke.

Zitat von: thoweiss am 06 Februar 2021, 09:33:28
Würde die Anbindung an FHEM beim e5 über MQTT auch funktionieren?
Indem der e5 App-Steuerung hat, würde ich schon annehmen, dass das funktioniert.
Maintainer von: ZoneMinder, TA_CMI_JSON, ONKYO_AVR, DENON_AVR, CanOverEthernet, IPCAM.

Vielgenutzte Module sind die größte Motivation für Entwickler.
Bitte zumindest 'attr global sendStatistics onUpdate' setzen.
Denn: ohne 'sendStatistics' keine Zahlen.

delMar

Ich nun wieder mit der Raum-Sache:

Das %room-Hash aus 99_RombaUtils ist mit folgenden Ergänzungen nicht mehr nötig, da alle Daten hiermit aus Attributen kommen.
Um das Erstellen der Attribute zu vereinfachen, kann man zu RoombaUtils folgende Methoden hinzufügen:
(und auch die Methode cleanRoom hat sich geändert, da die Werte ja nun nicht mehr aus dem %rooms Hash kommen)

sub cleanRoom($$$) {
  my ($name,$levelName,$evt) = @_;
  my $hash = $main::defs{$name};

  my @evts = split(' ',$evt);

  my $pmapId = main::AttrVal($name, 'floor_'.$levelName.'_pMapId', '');
  my $userPmapvId = main::AttrVal($name, 'floor_'.$levelName.'_userPmapvId', '');

  my $regionString = '"regions": [';
  my $nrRegions = @evts;

  for(my $regIdx = 1; $regIdx < $nrRegions; $regIdx++){
    my $regionName = $evts[$regIdx];
    my $regionId = main::AttrVal($name, 'room_'.$regionName.'_id', '');
    my $regionType = main::AttrVal($name, 'room_'.$regionName.'_type', '');

    $regionString = $regionString.'{"region_id": "'.$regionId.'", "type": "'.$regionType.'"}';
    if ($regIdx +1 < $nrRegions) {
      $regionString = $regionString.',';
    }
  }
  $regionString = $regionString.']';

  my $cmdString = '{"command": "start", "pmap_id": "'.$pmapId.'", '.$regionString.', "user_pmapv_id": "'.$userPmapvId.'", "ordered": 1, "time": '.time().', "
initiator": "localApp"}';
  main::Log 1,"============>cleanRoom: $cmdString";
  my $cmd = 'cmd '.$cmdString;
  return $cmd;
}

sub createFloor($$) {
  my ($name, $evt) = @_;
  my $hash = $main::defs{$name};

  my @evts = split(' ',$evt);
  my $floorName = main::makeReadingName($evts[1]);
  my $pMapId = $evts[2];
  my $userPmapvId = $evts[3];

  my $attrName = 'floor_'.$floorName.'_label';
  main::addToDevAttrList($name, $attrName);
  $main::attr{$name}{$attrName} = $evts[1];

  $attrName = 'floor_'.$floorName.'_pMapId';
  main::addToDevAttrList($name, $attrName);
  $main::attr{$name}{$attrName} = $pMapId;

  $attrName = 'floor_'.$floorName.'_userPmapvId';
  main::addToDevAttrList($name, $attrName);
  $main::attr{$name}{$attrName} = $userPmapvId;
}

sub createRoom($$) {
  my ($name, $evt) = @_;
  my $hash = $main::defs{$name};

  my @evts = split(' ',$evt);
  my $roomName = main::makeReadingName($evts[1]);
  my $floor = $evts[2];
  my $roomId = $evts[3];
  my $roomType = $evts[4];

  my $attrName = 'room_'.$roomName.'_label';
  main::addToDevAttrList($name, $attrName);
  $main::attr{$name}{$attrName} = $evts[1];

  $attrName = 'room_'.$roomName.'_floor';
  main::addToDevAttrList($name, $attrName);
  $main::attr{$name}{$attrName} = $floor;

  $attrName = 'room_'.$roomName.'_id';
  main::addToDevAttrList($name, $attrName);
  $main::attr{$name}{$attrName} = $roomId;

  $attrName = 'room_'.$roomName.'_type';
  main::addToDevAttrList($name, $attrName);
  $main::attr{$name}{$attrName} = $roomType;
}


setList erhält entsprechend folgende neuen Einträge:

createFloor {roomba::createFloor($NAME, $EVENT)}
createRoom {roomba::createRoom($NAME, $EVENT)}


Dann legt man die Etagen an. zB mit

set device createFloor <Etagenname> <pMapId> <userPmapvId>
set device createFloor Erdgeschoss 5yyyyyyyxxxxxxxxw 2xxxxxTyyyyy4


Dadurch werden pro Etage folgende Attribute angelegt

floor_EG_label       EG
floor_EG_pMapId     5yyyyyyyxxxxxxxxw
floor_EG_userPmapvId 2xxxxxTyyyyy4


Räume werden so angelegt:

set device createRoom <Raumname> <Etagenname> <Raum-ID> <Raum-Typ>
set device createRoom Kueche EG 7 rid


Dadurch erhält man folgende Attribute pro Raum

room_Kueche_floor EG
room_Kueche_id 7
room_Kueche_label Kueche
room_Kueche_type rid

Im Attributnamen ist nur der Name des Raums drin, nicht jener der Etage. Wer also zwei WCs besitzt, muss verschiedene Raumnamen vergeben (zB WC_EG, WC_OG), weil der zweite Aufruf von createRoom sonst die Werte des ersten Raumes überschreibt.

Ganz wichtig: unbedingt "Save config" klicken, auch wenn kein Fragezeichen angezeigt wird. Die gesetzten Attribute gehen sonst bei einem Neustart verloren.
Ein Bug in main::addToDevAttrList?


Mit dieser Änderung sind alle Variablen aus 99_RoombaUtils verschwunden und somit sollten diese Methoden eigentlich stabil sein.
Ständiger Wartungsaufwand und FHEM Restarts bei Änderungen sind also nicht mehr nötig.

schöne Grüße
Martin
Maintainer von: ZoneMinder, TA_CMI_JSON, ONKYO_AVR, DENON_AVR, CanOverEthernet, IPCAM.

Vielgenutzte Module sind die größte Motivation für Entwickler.
Bitte zumindest 'attr global sendStatistics onUpdate' setzen.
Denn: ohne 'sendStatistics' keine Zahlen.

Prof. Dr. Peter Henning

Ich denk mal drüber nach...

ZitatAber ja, es steht grundsätzlich im Wiki.
Wieso "grundsätzlich" ? Ich würde sagen "wörtlich".

LG

pah

loetmeister

Zitat von: thoweiss am 06 Februar 2021, 09:33:28
Würde die Anbindung an FHEM beim e5 über MQTT auch funktionieren?
Hi,

ja, hab auch einen Roomba E5 (E5158) und die Einrichtung funktioniert wie im Wiki beschrieben. Bloß die "Komfortfunktionen für Readings" funktionieren nicht alle, ich musste 99_RoombaUtils.pm etwas anpassen. Kann ich dir gerne schicken. Oder du lässt es bei dem readingList $DEVICETOPIC:.* { json2nameValue($EVENT) } mit allen MQTT readings.
Siehe https://forum.fhem.de/index.php/topic,114166.msg1119270.html#msg1119270 und folgende.

Gruß,
Thomas

delMar

Zitat von: Prof. Dr. Peter Henning am 06 Februar 2021, 19:00:45
Wieso "grundsätzlich" ? Ich würde sagen "wörtlich".

Ich denke, meine Wahrnehmung wurde durch den Begriff "Komfortfunktion" verfälscht, da ich erstmal gern alle Readings sehen wollte.
Ein Satz wie "Die Funktion readings() ist außerdem zum Erstellen der Reinigungskarten nötig" hätte sogar mir die Augen geöffnet  ;D

schöne Grüße
Martin
Maintainer von: ZoneMinder, TA_CMI_JSON, ONKYO_AVR, DENON_AVR, CanOverEthernet, IPCAM.

Vielgenutzte Module sind die größte Motivation für Entwickler.
Bitte zumindest 'attr global sendStatistics onUpdate' setzen.
Denn: ohne 'sendStatistics' keine Zahlen.

Prof. Dr. Peter Henning

Zitatich musste 99_RoombaUtils.pm etwas anpassen
Wie?

LG

pah

thoweiss

Zitat von: loetmeister am 06 Februar 2021, 20:16:08
Hi,

ja, hab auch einen Roomba E5 (E5158) und die Einrichtung funktioniert wie im Wiki beschrieben.
Gruß,
Thomas

Dann erde ich mich damit einmal beschäftigen, Fuktioniert die Steuerung über fhem auch parallel mit der Roomba App.


Gruß,
Thorsten