MQTT2 für Xiaomi Vacuum Sauger

Begonnen von Otto123, 12 Mai 2021, 12:53:37

Vorheriges Thema - Nächstes Thema

drhirn

Ach so meintest du das mit "mehreren Segmenten". Kannst ja auch die Umlaute weglassen.

Che007

Ja mit ue statt ü geht es.

Bleibt bei mir noch übrig, ggf. Karte einbinden und als webCmd clean_segment direkt auszuwählen.

drhirn

Dazu hab ich I can't believe it's not Valetudo genommen und dessen Karte (base64-codiert) dann als Reading eingebunden:

$DEVICETOPIC/MapData/map:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),; {"map"=>"<html><div style='width: 600px; height: 300px;'><img src='".$EVENT."'></div></html>"} }

Bezüglich clean_segement kann ich dir leider nicht helfen. Aber vielleicht findest du hier etwas brauchbares: https://wiki.fhem.de/wiki/FHEMWEB/Widgets

laberlaib

Zitat von: drhirn am 28 Juni 2022, 10:29:49
Kannst du mal ein RAW-Listing deines Roboters schicken bitte? Und vom MQTT2_SERVER auch?
Jetzt klappts.

Ich wollte, bevor ich hier weiter ein Fass aufmache, nochmal was testen und habe mir in die setList einfach mal was Hardcodiertes eingetragen. Also statt "$DEVICETOPIC/xxx" direkt "valetudo/saugerl10/xxx" und dann hats geklappt, der Sauger hats angenommen und zählt auch die Nachrichten hoch.
Und es klappt nun sogar alles - also auch die dynamischen, per Funktion gebauten clean-segement-Befehle.

Hat der Sauger wohl ein wenig gebraucht um sich daran zu gewöhnen, dass MQTT ihn nun kontrolliert - ist halt auch nur ein Mensch.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

drhirn

Oder das Attribut devicetopic war einfach nicht richtig ;)

laberlaib

Alle funktionieren nun, alle! Ich hab nur einen Hardcodierten drin, die anderen ja gelassen.
Und die readingList greift ja auf das gleiche Attribut zu.
Whatever ...

attr MQTT2_valetudo_LopsidedTriflingVulture devicetopic valetudo/saugerl10
[...]
attr MQTT2_valetudo_LopsidedTriflingVulture setList pause:noArg $DEVICETOPIC/BasicControlCapability/operation/set PAUSE\
  start:noArg $DEVICETOPIC/BasicControlCapability/operation/set START\
  stop:noArg $DEVICETOPIC/BasicControlCapability/operation/set STOP\
  charge:noArg $DEVICETOPIC/BasicControlCapability/operation/set HOME\
  fanSpeed:off,min,low,medium,high,turbo,max $DEVICETOPIC/FanSpeedControlCapability/preset/set $EVTPART1\
  waterUsage:off,min,low,medium,high,turbo,max $DEVICETOPIC/WaterUsageControlCapability/preset/set $EVTPART1\
  locate:PERFORM   $DEVICETOPIC/LocateCapability/locate/set $EVTPART1\
  x_raw_payload:textField { valetudo_c($NAME,$EVENT) }\
  clean_segment:{'multiple-strict,'.valetudo_w($name,'segments')} { valetudo_c($NAME,$EVENT) }\
  test:noArg valetudo/saugerl10/LocateCapability/locate/set PERFOM


Aber wenn einem hier immer so schnell geholfen wird, dann kommt der arme Roboter halt auch nicht immer hinterher :)
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

laberlaib

#171
Edit: Gelöst: in dem Hash steht ja die cmd-Bezeichnung und die hatte ich ja zum testen geändert in clean_segment2!

Ich mache mit folgendem die Reihenfolge der Segmente bei einer freien Auswahl sortierbar.

Da eine sinnvolle Reihenfolge der Segmente transitiv ist und damit immer gleich zu optimieren, egal, welche Segmente gewählt wurden, wollte ich das möglich machen.
Ich habe dazu ein Userattribut angelegt, in welchem man kammasepariert die Reihenfolge der Segemente als IDs angeben kann:

attr MQTT2_valetudo_LopsidedTriflingVulture userattr segmentorder
attr MQTT2_valetudo_LopsidedTriflingVulture segmentorder 1,2,3,4,5,6,7,8,9,10,11,12,13


Dann habe ich folgende 99_valetudoUtils.pm genommen:
# $Id: 99_valetudoUtils.pm 25558 2022-01-25 11:32:05Z Otto123 $

Und eine Sortierung der gewählten Segmente so in sub valetudo_c eingebaut (ab ca. Zeile 160):

for ( @rooms ) { push @ids, {reverse %{$decoded} }->{$_} } #das ist noch Orginal
my $segmentorder = AttrVal($NAME, "segmentorder",undef);
if (defined($segmentorder))  {
     my @segmentorder = split ",", $segmentorder;
     my @idsorderd;
     foreach (@segmentorder) {
     if ($_ ~~ @ids) {push @idsorderd, $_;}
     @ids =  @idsorderd;
}
#Ab hier wieder original
my %Hcmd = ( clean_segment => {action =>'start_segment_action',segment_ids => \@ids,iterations => 1,customOrder => 'true' } );
$ret = $devicetopic.'/MapSegmentationCapability/clean/set '.toJSON $Hcmd{$cmd};

Ich trenne also die sortierten IDs und geh das so entstandene Array von Anfang zum Ende durch. Jedes Mal, wenn ich etwas treffe, kommt das in ein neues Array (idsorderd), welches danach ids wird, welches weiterverarbeitet wird.

---------------------------- Überholt --------------------------------
Jetzt wollte ich etwas zurück geben und zack, irgend was klappt nicht:
[...]
In meinen Log-Ausgaben für die Arrays passt alles; $ret ist aber immer NULL.

Hier nochmal alles zusammen als sub valetudo_l
sub valetudo_l {
    my $NAME = shift;
    my ($cmd,$load) = split q{ }, shift, 2;
    my $ret = 'error';
    my $devicetopic = AttrVal($NAME,'devicetopic',"valetudo/$NAME");

    # x_raw_payload like
    # /MapSegmentationCapability/clean/set {"segment_ids":["6"],"iterations":1,"customOrder":true}
    if ($cmd eq 'x_raw_payload') { $ret=$devicetopic.$load }

    # this part return an array of segment id's according to selected Names from segments (simple json)
    if ($cmd eq 'clean_segment2') {

        my @rooms = split ',', $load;
        my $json = ReadingsVal($NAME,'segments',q{});
        my $decoded = decode_j($json);
        my @ids;
my @idsorderd;
        for ( @rooms ) { push @ids, {reverse %{$decoded} }->{$_} }
foreach (@ids){Log3 "test", 3, "ids Orignal ".$_;}
Log3 "test", 3, "ids original slash " .\@ids;
my $segmentorder = AttrVal($NAME, "segmentorder",undef);
Log3 "test", 3, "segmentorder " .$segmentorder;
if (defined($segmentorder))  {

  my @segmentorder = split ",", $segmentorder;
        my $sortedload = "";
my @idsorderd;
    foreach (@segmentorder) {

    if ($_ ~~ @ids) {
push @idsorderd, $_;
Log3 "test", 3, "segmentorderdefined " .$_;
}
    }
foreach (@idsorderd){Log3 "test", 3, "idsorder ".$_;}
Log3 "test", 3, "asd1 " .@idsorderd;
@ids =  @idsorderd;
    foreach (@ids){Log3 "test", 3, "ids2 ".$_;}
}
Log3 "test", 3, "ids slash " .\@ids;

        my %Hcmd = ( clean_segment => {action =>'start_segment_action',segment_ids => \@ids,iterations => 1,customOrder => 'true' } );
#my %Hcmd = ( clean_segment => {segment_ids => \@ids,iterations => 1,customOrder => 'true' } );
        $ret = $devicetopic.'/MapSegmentationCapability/clean/set '.toJSON $Hcmd{$cmd};
Log3(undef, 1, $ret);
    }

    # this part return the zone/location id according to the selected Name from presets (zones/locations) (more complex json)
    if ($cmd eq 'clean_zone') {
        my $json = ReadingsVal($NAME,'.zonesPresets',q{});
        my $decoded = decode_j($json);
        for (keys %{$decoded}) {
            if ( $decoded->{$_}->{'name'} eq $load ) {$ret = $devicetopic.'/ZoneCleaningCapability/start/set '.$_ }
        }
    }
    if ($cmd eq 'goto') {
        my $json = ReadingsVal($NAME,'.locationsPresets',q{});
        my $decoded = decode_j($json);
        for (keys %{$decoded}) {
            if ( $decoded->{$_}->{'name'} eq $load ) {$ret = $devicetopic.'/GoToLocationCapability/go/set '.$_ }
        }
    }

    # this part is for study purpose to read the full json segments with the REST API
    # this part return an array of segment id's according to selected Names from json_segments (complex json)
    if ($cmd eq 'clean_segment_j') {
        $cmd = 'clean_segment';             # only during Test
        my @rooms = split ',', $load;
        my $json = ReadingsVal($NAME,'json_segments',q{});
        my $decoded = decode_j($json);
        my @array=@{$decoded};
        my %t;
        for (@array) { $t{$_->{'name'}} = $_->{'id'} }
        my @ids;
        for ( @rooms ) {push @ids, $t{$_}}
        my %Hcmd = ( clean_segment => {segment_ids => \@ids,iterations => 1,customOrder => 'true' } );
        $ret = $devicetopic.'/MapSegmentationCapability/clean/set '.toJSON $Hcmd{$cmd};
Log3(undef, 1, $ret);

    }
    #return $ret
Log3 "test", 3, $ret;
}


und die Zeile um die SetList zu erweitern:
clean_segment2:{'multiple-strict,'.valetudo_w($name,'segments')} { valetudo_l($NAME,$EVENT) }\

Ich muss vielleicht mal raus...
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

Otto123

#172
Hallo,

ich habe jetzt ein bisschen gelesen und recherchiert und bin zu folgendem ToDo gekommen:

  • Den Hinweis (war ein Fehler von mir) werde ich einarbeiten.
  • Den Hinweis sollte eigentlich das Template bei der Anwendung erledigen. Dort werden die Fähigkeiten des Roboters abgefragt und die setList entsprechend geschrieben. Hat das nicht funktioniert?
  • Die Änderung in der neuen valetudo Version (ab 2022.05.1) bedeuten: die Erstellung und Speicherung von Zonen und GoTo Punkten fällt weg. Interaktiv funktioniert aber eine Zonenreinigung. Man kann die (vorhandenen) Koordinaten aber weiter verwenden? Ich muss mir das anschauen, bedeutet man bräuchte in Zukunft so etwas wie Zonen eintragen. Eigentlich blöd - man sollte den Gen 1 dann lieber mit der alten Version belassen?
  • Ich muss die neue valetudo Version installieren und testen  ::)
    Edit: Ok ausprobiert, er macht das Update schrittweise: -> 05.00 -> 05.01 -> 06.00
    Ab 05.1. gibt es ein neues Feature was in der Oberfläche die gerade ausgewählten Zonenkoordinaten als json String zeigt. Damit kann man irgendwie arbeiten ;)
    Allerdings hat sich offenbar der mqtt Topic dafür geändert und ich weiß noch nicht wie. Über die Rest API geht es.

Die sortierte Abarbeitung hatte ich auch schon mal im Visier, allerdings hat es damals, wenn ich mich richtig erinnere, nichts gebracht, da der Roboter (valetudo Version ?) seinen eigenen Kopf hatte :)
Ich probiere das aus und übernehme die Lösung von laberlaib  gern.

Ich denke ich sollte dann diesen Thread schließen und einen neuen auf machen.

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

laberlaib

Zitat von: Otto123 am 11 Juli 2022, 14:02:46
Die sortierte Abarbeitung hatte ich auch schon mal im Visier, allerdings hat es damals, wenn ich mich richtig erinnere, nichts gebracht, da der Roboter (valetudo Version ?) seinen eigenen Kopf hatte :)
Ich probiere das aus und übernehme die Lösung von laberlaib  gern.
Ehrlichweise habe ich bisher nur die Übergabe angesehen und mich auf das "customorder" im JSON verlassen. Probiert habe ich es noch nicht, da ich für die Hauptkombination aus Segmenten sowieso einen direkten Befehlt gebaut habe und das andere eher nice2have ist.
Zitat von: Otto123 am 11 Juli 2022, 14:02:46
Ich denke ich sollte dann diesen Thread schließen und einen neuen auf machen.

Danke kommt noch hier rein: Danke.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

SalvadoreXXL

#174
Hi,

ich hole den Threat nochmal hoch  :)

Ich habe günstig einen Dreame D9 geschossen und gleich mit Valetudo versorgt. Funktionier auch soweit OK mit der App, nur hier im FHEM krieg ich das nicht gebacken. Ich beziehe mich nur auf das aktuelle Valetudo-Template.

Zuerst habe ich ohne Haken bei Home Assistant (im Valetudo) probiert. Nach Auswahl des Templates hatte ich alle Funktionen soweit in FHEm zur Auswahl. Strat/Stop funktionierte. Die Auswahl bei Clean_Segment wurde auch wie in der App richtig angezeigt, nur bewirkt das nichts. Mein Robby reagiert nicht. Vieleicht kann mir ja jemand helfen, da ich nicht so firm bin mit MQTT. Hier mal ein list:

Internals:
   CFGFN     
   CID        valetudo_ImpressionableDecimalWasp
   DEF        valetudo_ImpressionableDecimalWasp
   FUUID      634ab913-f33f-ac49-8ff6-cc75bdd4b0b257df
   IODev      m2s
   LASTInputDev m2s
   MSGCNT     518
   NAME       MQTT2_valetudo_ImpressionableDecimalWasp
   NR         238
   STATE      set_waterUsage
   TYPE       MQTT2_DEVICE
   eventCount 483
   m2s_CONN   m2s_192.168.11.6_51124
   m2s_MSGCNT 518
   m2s_TIME   2022-10-15 21:02:23
   OLDREADINGS:
   READINGS:
     2022-10-15 15:43:47   IODev           m2s
     2022-10-15 18:28:20   Robby_sensor_WifiConfigurationCapability_attributes_frequency 2.4ghz
     2022-10-15 18:28:20   Robby_sensor_WifiConfigurationCapability_attributes_ips_1 192.168.xx.x
     2022-10-15 21:02:23   Robby_sensor_WifiConfigurationCapability_attributes_signal -27
     2022-10-15 18:28:20   Robby_sensor_WifiConfigurationCapability_attributes_ssid Devils Home
     2022-10-15 21:02:23   Robby_sensor_WifiConfigurationCapability_state -27
     2022-10-15 19:23:56   area            0
     2022-10-15 19:29:13   batteryPercent  100
     2022-10-15 19:25:21   cleanerState    docked
     2022-10-15 19:25:23   map-data-hass   �PNG
.....
    2022-10-15 19:23:29   operation       START
     2022-10-15 21:02:23   signal          -27
     2022-10-15 19:23:29   start           set
     2022-10-15 21:02:54   state           set_waterUsage
     2022-10-15 19:29:13   state_battery_level 100
     2022-10-15 19:23:29   state_fan_speed medium
     2022-10-15 19:25:21   state_state     docked
     2022-10-15 19:23:55   time            0
Attributes:
   alias      Robby
   devicetopic valetudo/Robby
   event-on-change-reading .*
   icon       vacuum_top
   model      valetudoV2
   readingList $DEVICETOPIC/\x24state:.* _state
  $DEVICETOPIC/(Att.*|Basic.*|Consum.*|Curr.*|Loc.*|Wifi.*)/[a-zA-Z\-_]+:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),; $1 eq 'ips'? {"ip4"=> (split ',',$EVENT)[0]}:{"$1"=>$EVENT} }
  $DEVICETOPIC/BatteryStateAttribute/level:.* batteryPercent
  $DEVICETOPIC/BatteryStateAttribute/status:.* batteryState
  $DEVICETOPIC/FanSpeedControlCapability/preset:.* fanSpeed
  $DEVICETOPIC/GoToLocationCapability/presets:.* .locationsPresets
  $DEVICETOPIC/GoToLocationCapability/go:.* {}
  $DEVICETOPIC/MapData/map-data:.* {}
  $DEVICETOPIC/MapData/segments:.* .segments
  $DEVICETOPIC/StatusStateAttribute/status:.* { {"state"=>$EVENT,"cleanerState"=>$EVENT} }
  $DEVICETOPIC/StatusStateAttribute/detail:.* stateDetail
  $DEVICETOPIC/StatusStateAttribute/error:.* stateError
  $DEVICETOPIC/WaterUsageControlCapability/preset:.* waterUsage
  $DEVICETOPIC/ZoneCleaningCapability/presets:.* .zonesPresets
  $DEVICETOPIC/ZoneCleaningCapability/start:.* {}
valetudo_ImpressionableDecimalWasp:valetudo/Robby/hass/Robby_sensor_WifiConfigurationCapability:.* { json2nameValue($EVENT, 'Robby_sensor_WifiConfigurationCapability_', $JSONMAP) }
valetudo_ImpressionableDecimalWasp:valetudo/Robby/hass/Robby_vacuum/state:.* { json2nameValue($EVENT, 'state_', $JSONMAP) }
valetudo_ImpressionableDecimalWasp:valetudo/Robby/MapData/map-data-hass:.* map-data-hass
   room       MQTT2_DEVICE,Zentral
   setList    pause:noArg $DEVICETOPIC/BasicControlCapability/operation/set PAUSE
  start:noArg $DEVICETOPIC/BasicControlCapability/operation/set START
  stop:noArg $DEVICETOPIC/BasicControlCapability/operation/set STOP
  charge:noArg $DEVICETOPIC/BasicControlCapability/operation/set HOME
  clean_zone:{valetudo_w($name,'zones')} { valetudo_c($NAME,$EVENT) }
  fanSpeed:off,min,low,medium,high,turbo,max $DEVICETOPIC/FanSpeedControlCapability/preset/set $EVTPART1
  waterUsage:off,min,low,medium,high,turbo,max $DEVICETOPIC/WaterUsageControlCapability/preset/set $EVTPART1
  locate:PERFORM   $DEVICETOPIC/LocateCapability/locate/set $EVTPART1
  x_raw_payload:textField { valetudo_c($NAME,$EVENT) }
   setStateList operation clean_segment clean_zone goto fanSpeed waterUsage locate x_raw_payload
   stateFormat <a href="http://ip4" target="_blank">state</a>
   timestamp-on-change-reading .*

Otto123

#175
Zitat von: SalvadoreXXL am 15 Oktober 2022, 21:25:18
Die Auswahl bei Clean_Segment wurde auch wie in der App richtig angezeigt, nur bewirkt das nichts. Mein Robby reagiert nicht. Vieleicht kann mir ja jean helfen, da ich nicht so firm bin mit MQTT. Hier mal ein list:
Bitte die lists in Codetags hier steht wie es geht.

Irgendwie ging das in einer Firmware nicht mehr und die Doku stimmte nicht, hab ich irgendwie aus dem Auge verloren.

Ich schau mir das an ;)

Edit: ist nach wie vor das Problem, irgendwie reagiert cleansegment auf die dokumentierten Topics und payloads nicht mehr
https://valetudo.cloud/pages/integrations/mqtt.html#segmentcleaningmapsegmentationcapability

Ich habe irgendwie keine Idee was ich versuchen kann.

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


Otto123

Moin,

ich war jetzt mit ein paar publish Versuchen erfolgreich: für Segment und Zone Cleaning

Das muss ich prüfen wo Fehler in den Utils stecken und muss die neuen Dinge in den Code einbauen.

@SalvadoreXXL naja in dem Link wird ja genau der Effekt beschrieben den ich auch hatte: per Rest geht und per MQTT nicht. Beschrieben ist aber, das MQTT genauso wie Rest gehen soll. Es gibt auch die Beschreibung wie man an die Koordinaten für die Zone kommt: https://github.com/Hypfer/Valetudo/releases/tag/2022.05.1

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

TomLee

Darf ich hier mal fragen ob der ganze MQTT-Verkehr mit einer neueren Version wie Valetudo 2022.02.0 immer noch alle 30 Sekunden übertragen werden ?
Hatte gestern ein kleines Problem mit meinem FHEM und dabei das erste mal  ::) festgestellt das meine RasPi 3+ zu dem Zeitpunkt dann immer auf bis zu fast 60 Prozent CPU Auslastung kommt.

Otto123

30 sec ja, aber es sieht so aus als ob nur noch wirkliche Änderungen übertragen werden.
Er steht im Dock und ich bekomme alle 30 sec nur die WiFi Signalstärke.

Ich glaube das stand auch so irgendwo im Changelog.
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