Neues Modul: BOTVAC (für Neato BotVac Connected)

Begonnen von vuffiraa, 02 April 2016, 22:12:29

Vorheriges Thema - Nächstes Thema

Ellert

#555
Der aktuelle Quelltext steht im Wiki https://wiki.fhem.de/wiki/BOTVAC#Alle_Maps_in_einem_Reading_anzeigen.

Ohne Veränderungen im BOTVAC-Modul können die letzten Karten mit den folgenden Definitionen angezeigt werden.

Die Dateien werden im Ordner ./www/images/maps/ abgelegt, daher muss dieser Ordner angelegt werden.
Der Name VR300 der BOTVAC-Definition muss angepasst werden.
Es werden die letzten 20 Dateien gespeichert. Nach einer Fahrt wird eine neue Datei angelegt und die 21. Datei gelöscht.
Die Karten können beschnitten werden.
Auslöser für den Vorgang ist ein Event auf das Reading map_id., für das Reading AMap ist es map_loaded.
Die Definitionen können über Raw definition importiert werden.

DOIF zur Verwaltung der Karten Dateien

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

attr loadMap setList cmd_1



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

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

attr VR300 userReadings AMap:map_loaded.* {\
my $sz = 350;;\
my $ret = '<html><style>';;\
$ret .= ' .botvacur img {position:relative;; margin-left: -75px;; margin-top: -85px;; margin-right: -75px;;margin-bottom: -65px;; width: '.$sz.'px;; height: '.$sz.'px;;}';;\
$ret .= ' .botvacur div {text-align: center;; overflow: hidden }';;\
$ret .= '</style>';;\
$ret .= "<table class='botvacur' >";;\
for (my $i=0;;$i<5;;$i++) {\
   $ret .= "<tr>";;\
   for (my $k=0;;$k<4;;$k++) {\
      my $fn = $defs{$name}{helper}{MAPS}[$i*4+$k]{id};;\
      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).":&emsp;;$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.

Siehe auch https://wiki.fhem.de/wiki/BOTVAC#Alle_Maps_in_einem_Reading_anzeigen

the ratman

speichern tut er schon mal - das mit dem anzeigen als userreading wird aber lustig - neato scheint im gegensatz zu vorwerk auch bei deiner methode auf dicke, fette ränder mit blauen hintergrund zu bestehen.
schade -  dein bildchen hätte mir jetzt echt gefallen!
→do↑p!dnʇs↓shit←

Ellert

#557

the ratman

jo, nur hab ich clip aufgeben bei z.b. readingsgroups.  vor allem, weil ich bilder meistens in % breite in einer tablle, auch mit %, fahre um mit einer rg alle auflösungen abzudecken. und was bei diversen browsern da raus kommt, will ich lieber nicht mehr sehen *g*.
wenn du da auch mal mit spaß haben willst und irgendwo n win10 rumliegen hast ... app: kiosk sp browser - das ist n beschnittener ie, da kommen dir die tränen bei solchen spielchen.
leider ist das noch der beste unter den kostenlosen win-kiosk-browsern.

wurscht - stell ich hinten an, bis wer ein modul für imagemagick schreibt *lach*
→do↑p!dnʇs↓shit←

Ellert

Ich habe die Definitionen angepasst, jetzt sollte die erzeugte Karte ohne Seiten reload angezeigt werden.

the ratman

scheinbar stimmen die fehlermeldungen nicht so 100%.

hatte eben den fehler "maint_brush_overload" gemeint ist damit wohl, dass die bürste sich nicht dreht (in dem konkreten fall, weil sie einen schnürsenkel verspeist hatte *g*)
kanns sein, dass da ein paar der meldungen nicht richtig oder - was weiß ich - veraltet sind? weil ein "Brush Stuck!" hätte ich z.b. nicht bekommen.
→do↑p!dnʇs↓shit←

Schlimbo

#561
Ich habe mir für die Fehlermeldung ein Sub erstellt um die Texte für TTS aufzubereiten, immer wenn ein Fehler aufgetreten ist habe ich den Text aus der APP mit aufgenommen. Ist noch nicht komplett, aber wir könnten das ja gemeinsam noch vervollständigen und die klartext Meldungen in das Modul mit aufnehmen.

sub BOTVAC_GetErrorText($) {
    my ($error) = @_;
    my $errors = {
      # 'batt_base_connect_fail'       => ' ',
      # 'batt_base_no_power'           => ' ',
      # 'batt_low'                     => ' ',
      # 'batt_on_base'                 => ' ',
      # 'clean_tilt_on_start'          => ' ',
        'dustbin_full'                 => 'Bitte Schmutzfangbehälter und Filter leeren.',
        'dustbin_missing'              => 'Bitte Schmutzfangbehälter wieder einsetzen.',
        'gen_picked_up'                => 'Meine Räder haben keinen Bodenkontakt mehr, bitte hilf mir und stelle mich wieder auf meine Räder',
      # 'hw_fail'                      => ' ',
      # 'hw_tof_sensor_disconnected'   => ' ',
      # 'lds_bad_packets'              => ' ',
      # 'lds_deck_debris'              => ' ',
      # 'lds_disconnected'             => ' ',
      # 'lds_jammed'                   => ' ',
      # 'lds_missed_packets'           => ' ',
        'maint_brush_stuck'            => 'Meine Bürste klemmt. Bitte von Schmutz befreien.',
        'maint_brush_overload'         => 'Meine Bürste ist überladen. Bitte von Schmutz befreien.',
        'maint_bumper_stuck'           => 'Mein Puffer klemmt. Bitte freimachen.',
        'maint_customer_support_qa'    => 'Bitte kontaktieren Sie den Kundendienst.',
        'maint_left_drop_stuck'        => 'Bitte linkes Sturzsensorfenster reinigen.',
        'maint_left_wheel_stuck'       => 'Mein linkes Rad klemmt fest. Bitte von Schmutz befreien.',
        'maint_right_drop_stuck'       => 'Bitte rechtes Sturzsensorfenster reinigen.',
        'maint_right_wheel_stuck'      => 'Mein rechtes Rad klemmt fest. Bitte von Schmutz befreien.',
      # 'maint_vacuum_slip'            => ' ',
      # 'maint_vacuum_stuck'           => ' ',
      # 'nav_backdrop_frontbump'       => ' ',
      # 'nav_backdrop_leftbump'        => ' ',
      # 'nav_backdrop_wheelextended'   => ' ',
      # 'nav_mag_sensor'               => ' ',
      # 'nav_no_exit'                  => ' ',
      # 'nav_no_movement'              => ' ',
        'nav_no_path'                  => 'Bitte Weg freimachen.',
        'nav_path_problem'             => 'Ich stecke fest. Bitte befreien Sie mich. Heben Sie mich hoch und setzen Sie mich weniger als 60 cm entfernt wieder ab, damit ich meinen Standort wiederfinden kann.',
      # 'nav_rightdrop_leftbump'       => ' ',
      # 'nav_robot_falling'            => ' ',
        'nav_start_not_cleaned'        => 'Zur Ladestation zurückbringen.',
      # 'nav_undocking_failed'         => ' ',
      # 'not_on_charge_base'           => ' ',
        'swup_success'                 => 'Softwareaktualisierung abgeschlossen',
      ############# MAP Errors #################################
      # 'ui_error_navigation_backdrop_leftbump'          => ' ',
      # 'ui_error_navigation_falling'                    => ' ',
      # 'ui_error_navigation_backdrop_frontbump'         => ' ',
      # 'ui_error_navigation_backdrop_wheelextended'     => ' ',
      # 'ui_error_navigation_rightdrop_leftbump'         => ' ',
      # 'ui_error_navigation_pathproblems_returninghome' => ' ',
      # 'ui_error_navigation_noprogress'                 => ' ',
      # 'ui_error_brush_stuck'                           => ' ',
      # 'ui_error_vacuum_stuck'                          => ' ',
        'UI_ERROR_NAVIGATION_PathProblems_ReturningHome' => 'Ich weiß nicht mehr wo ich bin, Bitte bringe mich zu meiner Ladestation zurück und starte die Reinigung neu'
    };

    if (defined( $errors->{$error})) {
        return $errors->{$error};
    } else {
        return $error;
    }
}


Gruß Schlimbo

the ratman

hey, supi, thx!
genau nach sowas hab ich jetzt gesucht. ich hab jetzt ähnliches angefangen ... ich mach ne sprachausgabe anhand der fehler in nem doif *g*.
ich dacht ja eigentlich, die fehler wären alle im botvac-modul abgebildet, aber so gehts natürlich auch.
→do↑p!dnʇs↓shit←

vuffiraa

Mir war auch schon aufgefallen, dass die Fehlermeldungen nicht mehr richtig passen. Da scheint etwas geändert worden zu sein.
Alle Meldungen, die hier gefunden werden, kann ich ins Modul übernehmen. Außerdem kann ich versuchen, die komplette Liste aus der App zu kriegen.
Ich habe gerade nur das Problem, dass letzte Woche das Display meines Laptops aufgegeben hat. Mal sehen, ob ich den Vorgänger wieder reaktivieren kann...
FHEM 5.8 auf Cubietruck, Raspi B+

Weinzierl KNX IP BAOS 770, Homematic, EnOcean

the ratman

also ich brauchs eigentlich ned wirklich. mir reichts, wenn ich die "originalen" meldungen kenn, da selbige sowieso auf meine ganz eigene art übersetzt werden. sprich: ob ich orginale oder deine umwandel, ist auch schon egal *g*

aber doppelt hält ja besser - nur als bestätigung - folgendes hab ich bis jetzt sicher:

dustbin_full <-- klar, oder *g*
dustbin_missing <-- wenn der müllbehälter fehlt. lustiger weise aber erst beim 2. oder 3. mal piepsen. kann das wer bestätigen? kommt da vorher noch was anders?
maint_brush_overload <-- bei aufgewickeltem schnürsenkel
Docking <-- er fährt zur ladestation zurück. da das von dir ist, nehm ich an, der hinterlegte original befehl stimmt wohl noch.
→do↑p!dnʇs↓shit←

Ellert

#565
Für den VR300 gibt es seit heute ein Update.

Firmware: 4.4.1-113

Beschreibung https://support.vorwerk.com/hc/de/articles/360000796445-Saugroboter-Was-ist-neu-

@vuffiraa
Unter anderem kann man die Töne abschalten, wenn das über FHEM steuerbar wäre, dann könnte man einen stillen Modus für den Nachtbetrieb (vom Betriebsgeräusch abgesehen) realisieren.

Würdest Du dafür einen Setter einbauen? Das wäre über den neuen Service preferences:basic-2 realisierbar.

Edit: Versionsnummer korrigiert.

vuffiraa

Zitat von: Ellert am 21 Mai 2019, 20:20:00
Für den VR300 gibt es seit heute ein Update.

Firmware: 4.4.1-133

Beschreibung https://support.vorwerk.com/hc/de/articles/360000796445-Saugroboter-Was-ist-neu-

@vuffiraa
Unter anderem kann man die Töne abschalten, wenn das über FHEM steuerbar wäre, dann könnte man einen stillen Modus für den Nachtbetrieb (vom Betriebsgeräusch abgesehen) realisieren.

Würdest Du dafür einen Setter einbauen? Das wäre über den neuen Service preferences:basic-2 realisierbar.

Da ich diese Woche tatsächlich meinen Rechner repariert wieder bekommen habe, kann ich mich wieder besser ums Modul kümmern  :)

Ich würde auch mal versuchen, deine letzten Bemerkungen ins Modul einfließen zu lassen. Ansonsten ist bei Neato der Service preferences:basic-2 leider nicht genauer beschrieben, da müssen wir etwas mehr ausprobieren.

Kennst du dich vielleicht etwas mit Postman aus? Dann könnte ich dir vorab eine Collection zum Testen exportieren.
FHEM 5.8 auf Cubietruck, Raspi B+

Weinzierl KNX IP BAOS 770, Homematic, EnOcean

Ellert

#567
Ich habe folgenden Vorschlag eingebaut

-Einen Setter pollingMode 0|1 damit kann das Polling unterbunden werden, wie beim Attribut disable, aber ohne "Last unsaved structural changes" zu setzen.
-Die beim VR300 zugänglichen Einstellungen (die müssen komplett übertragen werden).

set <name> pollingMode <1|0>
set polling on by 1 (default) or off by 0 like attribut disable.

set <name> robotSounds <true|false>
set sounds on by true or off false.

set <name> dirtbinAlertReminderInterval <30|60|90|120|150>
set alert intervall in minutes.

set <name> filterChangeReminderInterval <43200|86400|129600>
set alert intervall in minutes(1, 2 or 3 month).

set <name> brushChangeReminderInterval <172800|216000|259200|302400|345600>
set alert intervall in minutes(4, 5, 6, 7 or 8 month).

basic-2 ist basic-1 erweitert um robotSounds <true|false>

Nein, Postman kenne ich mich nicht aus? Von WEB-Programmierung habe ich eigentlich keine Ahnung, ich habe das Modul als Vorlage genommen und versucht logisch zu erweitern.

Ellert

#568
Mir ist noch aufgefallen, dass für den Setter setBoundariesOnFloorplan die Angabe einer kommagetrennten Liste über das Frontend nicht möglich ist. Der Setter müsste um das Widget multiple-strict ergänzt werden.

        my $BoundariesList  = @names ? "multiple-strict,".join(",", @names) : "textField";

Wenn Du im Attribut boundaries alternativ auch einen Zeilenumbruch zur Trennung der Polylines zulassen würdest, wäre das Attribut etwas übersichtlicher, weil eine Polyline am Anfang einer Zeile beginnt.

the ratman

servus,

könntest du bitte die hardgecodeten styles bei den weblink stats raus machen? (hoffe, die sind von dir und nicht vom weblinks-autor)
ist ein horror, diese weblinks brauchbar an mein (und warscheinlich jedes andere) design anzupassen. nicht mal !important hilf da weiter *g*.

im speziellen gehts da um<style> .botvac tbody {border-top: 1px solid gray; border-bottom: 1px solid gray;} .botvac th, .botvac td {text-align: center; padding-right: 1em;} .botvac caption {text-align: left; padding-bottom: 1em; margin-bottom: 1em;}</style>und<meta charset="utf-8">ist wohl auch ned wirklich nötig.
→do↑p!dnʇs↓shit←