Roomba Staubsaugerroboter

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

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

Das sind keine "Parameter". Sondern Attribute.

Und ja: Das ist in der verwendeten Version so gewollt. Habe ich zwar inzwischen wieder herausgeworfen, weil es sich als nicht praktikabel herausgestellt hat.

LG

pah

marboj

Ok. Danke für die Antwort. Gibt es denn eine aktuellere Version?
meine FHEM-Konfiguration: Raspberry Pi4, BT-Dongle, CUL868, CeeBee II

Prof. Dr. Peter Henning

Ich habe jetzt unterschiedliche Firmware-Versionen in beiden Robotern :-(

Die ältere Firmware hat noch, so wie es sein soll, die Werte sqft und mssnM im Hash cleanMissionStatus - mit den jeweils aktuellen Daten für die gegenwärtige Mission.

Die neuere Firmware hat die Werte auch im Hash - aber die Daten stehen fest auf 0.

Das ist ganz klar ein Fehler der Firmware, denn in bbrun gehören sie nun einmal nicht, das ist eben für den Gesamtverlauf bestimmt.

Es würde mich interessieren, ob die beim i7 auch noch vorhanden, aber fest auf 0 sind.

LG

pah



hapege

Hi,

beim I7 ist "mssM" im hash "cleanMissionStatus" vorhanden, aber immer "0".
sqft fehlt im hash "cleanMissionStatus", weshalb es in der sub "mission" zu einer Fehlermeldung kommt, die ich so abfange:


  if(defined($evtptr->{'sqft'})) {
  my $sqm   = int($evtptr->{'sqft'}*10/10.7639)/10);
  main::Log 1,"[RoombaUtils] sqft is defined with value $sqm ";
  $retptr->{"cmArea"}      = $sqm." m²";
  }


Ich berechne gerade

  • die Laufzeit der mission aus "mssnStrtTm" (einfach die Differenz bilden aus mssnStrtTm und aktueller Zweit) sowie
  • die Fläche über "sqft" aus bbrun (Differenz nachher minus vorher)

Klappt zumindest.

Beste Grüße,

Hermann

PS: Ich arbeite gerade an der Möglichkeit, die Schedules des I7 zu setzen bzw si zu de-/aktivieren - hakelt noch ein wenig ;-)
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

Stefan_Hvr

#334
Zitat von: delMar am 06 Februar 2021, 14:51:30
Ich nun wieder mit der Raum-Sache:
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
Hallo Martin,
danke, das klappt. Zwei Fragen:
1.) Sind Umlaute tatsächlich ein Problem in 2021 oder nennst Du die Küche aus anderen Gründen Kueche? erledigt: room_label und Name in der App sind unabhängig voneinander. Kann in der App ruhig Küche heissen
edit 2.) Flur hinten habe ich versucht mit Flur%20hinten zu erstellen. Leider erfolglos. Muss ich den ind er App umbenennen? erledigt: room_label und Name in der App sind unabhängig voneinander.

Ein Hinweis: nachdem ich Küche in Kueche in der App umbenannt habe hat sich lastCommand_user_pmapv_id auf das aktuelle Datum/Zeit geändert, womit dann das starten der Raumreinigung aus FHEM nicht mehr funktioniert, bis es in den Attributen angepasst wird.
könnte man die aktuelle Version der Karte nicht abfragen und übernehmen?
Grüße Stefan
Viele Grüße aus Hannover
EnOcean, Zigbee, Shelly MQTT, Homebridge, Fritzbox, Harmonyhub, Alexa, Worx MQTT, Sonos MQTT, Tahoma, Telegram, Vorwerk,IRoomba MQTT, Buderus Km200,
seit 08/2019 Hausautomation mit FHEM

hapege

Hi Stefan ;-)

Du könntest Dir ein notify anlegen, welches das reading "Schedule1UserPMapvID" bei Änderung ins entsprechende Attribut schreibt. Generisch ist schwierig, weil Du das Attribut ja selbst erstellst und benennst. Und wenn Du mehrere Stockwerke = mehrere Maps hast, dann gibt es mehrere Attribute, und es ist nicht klar welche UserPMapvID in welches Attribut geschrieben werden muss (die Reihenfolge sprich Nummerierung der Schedules in "cleanSchedule2" ändert die app leider immer wieder mal).

Beste Grüße,

Hermann
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

hapege

Hallo,

Thema "app und fehm können nciht gleichzeitig auf den Roomba zugreifen": Ich war bisher der Meinung, und so hat sich das auch bei mir verhalten, dass fhem sich nicht mit dem Roomba verbinden kann solange die App aktiv ist. Zumindest kam bei mir immer ein Connection refused der httpUtils. Nach einer kleinen Diskussion mit Stefan_Hvr (bei dem ein paralleler Zugriff klappt) habe ich folgendes gemacht:

  • ein zweites Device (Smartphone) per App mit dem Roomba gekoppelt
  • einmal ProgHold (bzw "sSchedHold" via RoombaUtils) auf true und wieder auf false gesetzt
und Voila - App und fhem verbinden sich parallel mit dem Roomba, ein Start in fhem wird sofort in der App auch angezeigt, kein Connection refused mehr etc.
Evtl. war das vorher nur ein Problem bei mir, aber ich dachte das könnte auch für andere von Interesse sein.

Beste Grüße,

Hermann
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

hapege

#337
Und nochmal hallo,

ich habe eine Routine gebastelt, die die Schedules im I7 setzen kann (man möge dem Laien die eine oder andere Unelegantheit im Code verzeihen ;-) ):

sub setschedI7 ($$$){
  #my $cmd = 'delta {"state":{"cleanSchedule2":
  #  [{"enabled": true, "type": 0,
  #  "start": {"day": [2, 4, 6], "hour": 11, "min": 0},
  #  "cmd": {"command": "start", "ordered": 1, "pmap_id": "z....g",
  #  "regions": [{"region_id": "10", "type": "rid"},
  #  {"region_id": "6", "type": "rid"},
  #  {"region_id": "5", "type": "rid"},
  #  {"region_id": "8", "type": "rid"}],
  #  "user_pmapv_id": "2....7"}}]}}
  #
  my ($name,$which,$data) = @_;
  my @time;
  my @hour;
  my @min;
  my @days;
  my @daysnum;
  my @pMapId;
  my @userPmapvId;
  my $cmdpre = 'delta {"state": {"cleanSchedule2": [';
  my $cmdpost = ']}}';
  my @cmdsched="";
  my @cmdregs="";
  my @enabled = "";
  my @setenable = split(' ',$data);
  my $numofsched =  main::ReadingsVal($name,"NumOfSchedules","0");
  my @numofreg;
  my $cmd = $cmdpre;
  for (my $i=1; $i<=$numofsched; $i++) {
    if ($i==$which or $which=="all") {
    $enabled[$i] = $setenable[1];
    #main::Log 1,"[RoombaUtils] Schedule $i is $enabled[$i] with which $which";
    }
    else {
    $enabled[$i] = yesnotobool(main::ReadingsVal($name,"Schedule".$i."Enabled",undef));
    #main::Log 1,"[RoombaUtils] Schedule $i is $enabled[$i] with which $which";
    }
    @time = split(":",main::ReadingsVal($name,"Schedule".$i."Time",undef));
    $hour[$i] = $time[0];
    $min[$i] = $time[1];
    # strip leading zero, otherwise Roomba won't accept
    $min[$i] =~ s/^0//g;
    $days[$i] = main::ReadingsVal($name,"Schedule".$i."WeekDays",undef);
    $days[$i] =~ s/So/0/g;
    $days[$i] =~ s/Mo/1/g;
    $days[$i] =~ s/Di/2/g;
    $days[$i] =~ s/Mi/3/g;
    $days[$i] =~ s/Do/4/g;
    $days[$i] =~ s/Fr/5/g;
    $days[$i] =~ s/Sa/6/g;
    $pMapId[$i] = main::ReadingsVal($name,"Schedule".$i."PMapID",undef);
    $userPmapvId[$i] = main::ReadingsVal($name,"Schedule".$i."UserPMapvID",undef);
    #main::Log 1,"[RoombaUtils] Schedule $i, hour: $hour[$i], min: $min[$i], days: $days[$i], pMapID: $pMapId[$i], UserpMapvID: $userPmapvId[$i]";
    $numofreg[$i] = main::ReadingsVal($name,"Schedule".$i."NumOfRegions",undef);
    $cmdregs[$i]="";
    for ( my $j=1; $j<=$numofreg[$i]; $j++) {
      $cmdregs[$i] = $cmdregs[$i].'{"region_id": "'.main::ReadingsVal($name,"Schedule".$i."Region".$j,undef).'", "type": "rid"}';
      if ( $j < $numofreg[$i] ) {$cmdregs[$i] = $cmdregs[$i].', '}
    }
    $cmdsched[$i] = "";
    $cmdsched[$i] = '{"enabled": '.$enabled[$i].', "type": 0, "start": {"day": ['.$days[$i].'], "hour": '.$hour[$i].', "min": '.$min[$i].'}, "cmd": {"command": "start", "ordered": 1, "pmap_id": "'.$pMapId[$i].'", "regions": ['.$cmdregs[$i].'], "user_pmapv_id": "'.$userPmapvId[$i].'"}}';
    $cmd = $cmd.$cmdsched[$i];
    if ( $i < $numofsched ) {$cmd = $cmd.', '}
   
  }

  $cmd = $cmd.$cmdpost;
  main::Log 1,"[RoombaUtils] Command: $cmd";
  #return;
  return $cmd; 
}



(Zur Kontrolle wird das delta command via "main::Log 1,"[RoombaUtils] Command: $cmd";" ins Log geschrieben).

Dazu musste ich meine sub schedule2 erweitern, um die Regions auslesen zu können:

sub schedule2($$$){
  #-- getting events of the type
  # {"state":{"reported":{"cleanSchedule2": [{"enabled": true, "type": 0,
  #  "start": {"day": [2, 4, 6], "hour": 11, "min": 0},
  #  "cmd": {"command": "start", "ordered": 1, "pmap_id": "z...g",
  #  "regions": [{"region_id": "10", "type": "rid"}, {"region_id": "6", "type": "rid"},
  #  {"region_id": "5", "type": "rid"}, {"region_id": "8", "type": "rid"}],
  #  "user_pmapv_id": "2...7"}}]}}}
  #my ($dec) = @_;
  my ($name,$evtptr,$retptr) = @_;
  my @weekdays = ("So","Mo","Di","Mi","Do","Fr","Sa");
  my @enabled;
  my @starthour;
  my @startmin;
  my @startday;
  my @userpmapvid;
  my @pmapid;
  my @region;
  my $nsched;
  my $nreg;
  my %answer = ();
  my $oldnreg;
  my $oldnsched = main::ReadingsVal($name,"NumOfSchedules","");
  for (my $i = 0; $i<14; $i++){
    # j is needed since @startday does somehow not work with $i...
    my $j = $i;
    $nsched = $i+1;
   
    $enabled[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'enabled'};

    # if schedules are no longer present in app or roomba, delete them in fhem, too
    if(!defined($enabled[$i])) {
      $retptr->{"NumOfSchedules"} = $i;
    for (my $k = $i; $k < $oldnsched; $k++) {
    main::Log 1,"[RoombaUtils] deleting old schedule ID $k, oldnsched No was $oldnsched";
    my $hash = $main::defs{$name};
    my $todel = $k+1;
    main::readingsDelete($hash, "Schedule".$todel."Enabled");
    main::readingsDelete($hash, "Schedule".$todel."Time");
    main::readingsDelete($hash, "Schedule".$todel."UserPMapvID");
    main::readingsDelete($hash, "Schedule".$todel."PMapID");
    main::readingsDelete($hash, "Schedule".$todel."WeekDays");
      }
      last;
    }

    $retptr->{"Schedule".$nsched."Enabled"} = booltoyesno($enabled[$i]) if(defined($enabled[$i]));

    $starthour[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'start'}->{'hour'};
    $startmin[$i] = sprintf("%02d", $evtptr->{'cleanSchedule2'}->[$i]->{'start'}->{'min'});
    $retptr->{"Schedule".$nsched."Time"} = $starthour[$i].":".$startmin[$i] if(defined($starthour[$i]));

    $userpmapvid[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'cmd'}->{'user_pmapv_id'};
    $retptr->{"Schedule".$nsched."UserPMapvID"} = $userpmapvid[$i] if(defined($userpmapvid[$i]));

    $pmapid[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'cmd'}->{'pmap_id'};
    $retptr->{"Schedule".$nsched."PMapID"} = $pmapid[$i] if(defined($pmapid[$i]));
   
    @startday = @{$evtptr->{'cleanSchedule2'}->[$j]->{'start'}->{'day'}};
    for (@startday) {s/0/So/g;s/1/Mo/g;s/2/Di/g;s/3/Mi/g;s/4/Do/g;s/5/Fr/g;s/6/Sa/g;}
    $retptr->{"Schedule".$nsched."WeekDays"} = join(", ",@startday);

$oldnreg = main::ReadingsVal($name,"Schedule".$nsched."NumOfRegions","1");
for (my $m = 0; $m < 10; $m++) {
          $nreg = $m + 1;
  $region[$i][$m] = $evtptr->{'cleanSchedule2'}->[$i]->{'cmd'}->{'regions'}->[$m]->{'region_id'};
  $retptr->{"Schedule".$nsched."Region".$nreg} = $region[$i][$m] if(defined($region[$i][$m]));

      if(!defined($region[$i][$m])) {
        $retptr->{"Schedule".$nsched."NumOfRegions"} = $m;
        for (my $k = $m; $k < $oldnreg; $k++) {
          main::Log 1,"[RoombaUtils] deleting old region ID $k, oldnreg No was $oldnreg";
          my $hash = $main::defs{$name};
          my $todel = $k+1;
          main::readingsDelete($hash, "Schedule".$nsched."Region".$todel);
        }
      last;
      }
}
  }
  return
}


In der sub "readings" sieht der Aufruf so aus:

  if( $evt =~ /cleanSchedule(2?)/){
    #main::Log 1,"[RoombaUtils] schedule event ".$evt;
    #-- older devices
    if( !defined($1) || $1 ne "2" ){
      my %cleans = %{$staterep->{'cleanSchedule'}};
      schedule($name,\%cleans,\%ret);
    #-- for i7
    }elsif( defined($1) && $1 eq "2" ){
      my %cleana = %{$staterep};
      schedule2($name,\%cleana,\%ret);
    }
  }


@pah: Sorry, die Übergabeparameter entsprechen nicht Deinem letzten Zwischenstand, da ich mir nicht sicher bin ob Du die Nomenklatur so beibehältst - ich kann das gerne noch anpassen.

Via setlist kann ich nun einzelne oder alle Schedules (de)aktivieren - was sich auch sofort in der App zeigt:

SetScheduleAll:true,false {roomba::setschedI7($NAME,"all",$EVENT)}
SetSchedule1:true,false {roomba::setschedI7($NAME,"1",$EVENT)}
SetSchedule2:true,false {roomba::setschedI7($NAME,"2",$EVENT)}


Geht evtl auch eleganter als für jeden Schedule eine Set, aber mir ist nix anderes eingefallen...

Verbesserungsvorschläge und Kommentare sind gerne willkommen!

Beste Grüße,

Hermann
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

FSausF

Hallo Leute,

hat außer mir noch jemand das Problem, dass sein 960er seit dem neuen Firmware-Update (15.06.2021) nicht mehr mit fhem sprechen mag?
Vorher gut drei Monate alles paletti.

Es scheitert auf SSL-Ebene. (HttpUtils: https://192.168.2.47:8883/: Can't connect(2) to https://192.168.2.47:8883:  SSL wants a read first
)
Der Stunt aus dem Wiki von wegen [ssl_delfault_sect] rockt scheinbar nicht.
Der Versuch,
- Debian aktualisiert.
- Roombautils frisch geklont.
- fhem aktualisiert.
- debian neu gestartet.
- Roomba resetted.
hat es nicht gebracht.
Es bleibt dabei.

Der Versuch des gettpassword endet immerhin damit, dass auf dieser Ebene die Credentials (IP, BLID, Password) zurückkommen.
Also scheint die Verbindung grundsätzlich zu stehen.

Aber set RoombaFeger connect tut nix. Im Protokoll steht dann weiter:
2021.06.17 19:18:19 5: HttpUtils url=https://192.168.2.47:8883/ NonBlocking via https
2021.06.17 19:18:19 4: IP: 192.168.2.47 -> 192.168.2.47
2021.06.17 19:18:22 4: HttpUtils: https://192.168.2.47:8883/: Can't connect(2) to https://192.168.2.47:8883:  SSL wants a read first

Wie kriege ich das Ding aus Sicht fhem wieder zum Leben?

MQTT-Device komplett löschen und neu machen?

Habt Ihr eine schicke Idee dazu?

Prof. Dr. Peter Henning

Das Problem scheint hier der http-Timeout zu sein.
Auf meine Bitte hin hat Rudi König beim MQTT2_CLIENT das Attribut connectTimeout eingebaut - das habe ich bei mir auf 6 gesetzt, damit läuft es wieder.
   
LG

pah

FSausF

Zitat von: Prof. Dr. Peter Henning am 17 Juni 2021, 21:05:33
Das Problem scheint hier der http-Timeout zu sein.
Auf meine Bitte hin hat Rudi König beim MQTT2_CLIENT das Attribut connectTimeout eingebaut - das habe ich bei mir auf 6 gesetzt, damit läuft es wieder.
Super, Danke, das scheint zu gehen.
Ich hatte das nicht weiter in Erwägung gezogen, denn bislang war das "normale" verhalten, dass der Client auf den Connect reagiert, aber nach Disconnectafter (seconds) wieder weghört.
Wie jetzt allerdings das Firmware-Update des Roomba (in Zusammenhang mit einem nicht gepatchten fhem, das bis zum Tag des Roomba-Updates klaglos tat) zu genau diesem Problem führte, kann ich als Laie nicht mal mutmaßen.
Hat ein Paar Versuche gebraucht, bis der Python connect wieder zu Stande kam.
Danach dachte ich, iRobot hätte mal wieder irgendwie am SSL gespielt oder so...

Vielleicht hilft's, wenn ich Samstags Lavendel auf die Docking Station des Roomba lege.
Das ist ähnlich mystisch, aber zumindest physisch greifbar!

Danke einstweilen!

Cerex

Hallo zusammen,

auch mir hat das Update mit dem connectTimeout geholfen! Danke dafür :)

Allerdings scheitere ich gerade an der setList aus dem Wiki (https://wiki.fhem.de/wiki/Roomba#Komfortfunktionen_f.C3.BCr_set-Befehle). Einen Befehl bekomme ich hinzugefügt (ausführen funktioniert), allerdings nicht die gesamte Liste. Versuche ich das, bekomme ich immer einen
syntax error at (eval 3192) line 1, at EOF
wobei das eval von Ausführung zu Ausführung trotz gleichem Code variiert (immer mehr, nicht weniger).

Was mache ich da falsch? Copy/past Fehler kann ich ausschließen, eigentlich auch falsch kopierte Sonderzeichen...

Danke und Gruß!

Außerdem cmPhaseE (battery %) noch in der Status

delMar

Zitat von: Cerex am 21 Juni 2021, 18:13:31
Allerdings scheitere ich gerade an der setList aus dem Wiki (https://wiki.fhem.de/wiki/Roomba#Komfortfunktionen_f.C3.BCr_set-Befehle). Einen Befehl bekomme ich hinzugefügt (ausführen funktioniert), allerdings nicht die gesamte Liste. Versuche ich das, bekomme ich immer einen
syntax error at (eval 3192) line 1, at EOF
wobei das eval von Ausführung zu Ausführung trotz gleichem Code variiert (immer mehr, nicht weniger).
Kannst du hier mal reinposten, was du unter setList reinschreibst? Das kann nämlich unendlich viele Gründe haben.
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.

Otto123

Zitat von: Cerex am 21 Juni 2021, 18:13:31
Was mache ich da falsch? Copy/past Fehler kann ich ausschließen, eigentlich auch falsch kopierte Sonderzeichen...
Der Code in der Stelle im Wiki ist für die Raw Definition und nicht für den DEF Editor. https://wiki.fhem.de/wiki/Import_von_Code_Snippets

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Cerex

Danke für die schnelle Antwort, Otto. Nutze ich (fast ausschließlich), allerdings in dem Fall ohne Erfolg, siehe Anhang. Stehe auf dem Schlauch..