MQTT2 für Xiaomi Vacuum Sauger

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

Vorheriges Thema - Nächstes Thema

drhirn

Zitat von: Otto123 am 18 Oktober 2022, 15:29:57
vielleicht  ??? aber man kann sie auch per RestAPI holen ;)

Haha, ja. Hab ich in der Sekunde, in der deine Antwort kam, auch gedacht ;D

SalvadoreXXL

Zitat von: Otto123 am 18 Oktober 2022, 15:25:25
Da bräuchte ich mal die Ausgabe von
{my $NAME='MQTT2_valetudo_ImpressionableDecimalWasp';;ReadingsVal($NAME,'.segments',q{})}


{"1":"Kinderzimmer","2":"Kueche","3":"Bad","4":"Wohnzimmer","5":"Schlafzimmer","6":"Flur"}

SalvadoreXXL

Zitat von: Otto123 am 18 Oktober 2022, 15:25:25
Da fehlt die ID :(
Edit: Moment! Da fehlt die Anpassung in der 99_valetudoUtils!!! Hier steht der Devicename und nicht der Topic!
Siehe Antwort #211

Hab die beiden Änderungen von drhirn drin. Hab nochmals in die Valetudoutils nochmal reingeschaut. Änderung war wieder weg, obwohl FHEM gestoppt war und kein Fehler beim Speichern kam.  Hab anschließend nochmal geschaut und die Änderung war drin. Jetzt nicht mehr. Ich seh hier so langsam nicht mehr durch mit den ganzen Änderungen ...

Kannst du mir mal beide Dateien komplett hier anhängen?

drhirn

Sobald du das Template auf das Device anwendest, wird die 99_valetudoUtils.pm wieder mit der aus dem SVN überschrieben. Das ist fies.
Aber nachdem Otto123 die Änderung von mir eingecheckt hat, müsste die inzwischen richtig sein.
https://svn.fhem.de/trac/export/26554/trunk/fhem/contrib/AttrTemplate/99_valetudoUtils.pm (zum Download)
https://svn.fhem.de/trac/browser/trunk/fhem/contrib/AttrTemplate/99_valetudoUtils.pm (zum Ansehen)

Otto123

Oder in der FHEM Kommandozeile holen:
{ $data{f}='99_valetudoUtils.pm';;{ Svn_GetFile("contrib/AttrTemplate/$data{f}", "FHEM/$data{f}", sub(){CommandReload(undef, $data{f})}) } }
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

SalvadoreXXL

Zitat von: Otto123 am 18 Oktober 2022, 16:27:09
Oder in der FHEM Kommandozeile holen:
{ $data{f}='99_valetudoUtils.pm';;{ Svn_GetFile("contrib/AttrTemplate/$data{f}", "FHEM/$data{f}", sub(){CommandReload(undef, $data{f})}) } }

Ausgeführt, D9 gelöscht und wieder anlegen lassen. Nach knapp 10 Minuten waren die Segmente da. Mein D9 hat jetzt auf clean_seqment reagiert. Hab leider keine Zeit zu weiteren Tests jetzt. Melde mich später nochmal.

Danke vorerst!

Gruß aus dem Leipziger Norden!

Otto123

Zitat von: drhirn am 18 Oktober 2022, 15:06:52
Da wäre ein Patch für mqtt2.template. Die IP wird jetzt als Parameter abgefragt und ein Reading "ip4" gesetzt (das ja ein readingsList dann auch verwendet wird). Damit kann sich die 99_valetudoUtils.pm die Fähigkeiten des Roboters richtig holen.

Die Segmente werde nur an MQTT gesendet, wenn der Roboter der Meinung ist, er will jetzt ein Update der Map schicken. Hier hab ich nachgefragt. Man könnte die ja aber auch über das API holen. Bzw. ist das in der 99_valetudoUtils.pm eh schon so halb vorbereitet wenn ich das richtig sehe. Das fertig zu machen, übersteigt aber leider meine Kompetenz.

**edit**
Ich darf darauf hinweisen, dass auch dieser Patch nur ein Vorschlag ist. Keine Ahnung, ob das alles so passt oder ob man's anders/besser lösen kann.
Was hältst Du von der Variante?
Index: contrib/AttrTemplate/99_valetudoUtils.pm
===================================================================
--- contrib/AttrTemplate/99_valetudoUtils.pm    (Revision 26554)
+++ contrib/AttrTemplate/99_valetudoUtils.pm    (Arbeitskopie)
@@ -120,9 +120,10 @@
sub valetudo_f {
     my $NAME = shift;   # Devicename of the robot
     my $substr = shift; # requested Feature like GoToLocation or MapSegmentation
-    my $ip = ReadingsVal($NAME,'ip4',(split ',',ReadingsVal($NAME,'ips','error'))[0]);
+    # my $ip = ReadingsVal($NAME,'ip4',(split ',',ReadingsVal($NAME,'ips','error'))[0]);
+    my $ip = ( split '_', InternalVal($NAME,ReadingsVal($NAME,'IODev','').'_CONN','error') )[1] ;
     my $string = GetHttpFile($ip, '/api/v2/robot/capabilities');
-    index($string, $substr) == -1 ? '0':'1';
+    index($string, $substr) == -1 ? 0:1;
}
#######
# add a line to multiline Attribute setList or regList
Nur Änderung in der Utils, keine Änderung im Template.

Das Internal <IODev>_CONN muss ja zu dem Zeitpunkt da sein, sonst gäbe es das Device nicht. 8)
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

drhirn

Zitat von: Otto123 am 18 Oktober 2022, 20:29:35
Was hältst Du von der Variante?
Deine Idee ist weniger Aufwand für den User und in der Umsetzung. Also, nicht, dass er nötig wäre, aber meinen Segen hast du ;)

SalvadoreXXL

So, vielen Dank ihr Beiden! Funktioniert jetzt wie gewollt. Der WAF steigt jetzt enorm, wenn Frauchen das selbst mit ein paar Knöpfen bedienen kann  :) Sie mag die App nicht so ...
Paar Kleinigkeiten noch an der Oberfläche und ich bin zufrieden.
:)

drhirn

#234
Zitat von: Otto123 am 18 Oktober 2022, 20:29:35
Nur Änderung in der Utils, keine Änderung im Template.

Andererseits, das Template ändern sollten wir sowieso. Es kam ja ein neues Topic dazu. Und Readings wieder löschen, die extra gesetzt wurden (attrTemplateVersion), ist jetzt auch eher unvorteilhaft ;)

*edit*
Patch angehängt

Otto123

Moin,

ja da hast Du Recht. Die Änderungshäufigkeit des Templates will ich gering halten. Und im Template stehen noch ein paar Änderungen an, da brauch ich noch etwas. Ich würde gerne sowas wie ein setup setter machen, der u.a. auch die Zonen abspeichern kann, was valetudo ja nicht mehr macht.

Zumal es ja derzeit so ist: Die Anwendung des Templates verursacht Fehler die darin liegen, dass die Utils das neue Verhalten von Valetudo nicht berücksichtigt.

Welches Topic meinst Du kam hinzu?

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

drhirn

Ja, versteh ich.

Das Topic: OperationModeControlCapability/preset
Fehlt leider noch in der valetudo-Doku. Bei der ganz neuen Valetudo-Version kann man da einstellen, ob der Roboter im Modus "saugen", "saugen und wischen" oder nur "wischen" laufen soll.

Otto123

ja ok den habe ich auch gesehen. Ich war mir nicht sicher ob der nur Ergebnis meiner Versuche war. Ich habe da jetzt sogar in Summe 3 in meiner Readinglist
valetudo/ClumsyQuirkyCattle/MapSegmentationCapability/clean:.* { json2nameValue($EVENT) }
valetudo/ClumsyQuirkyCattle/OperationModeControlCapability/preset:.* preset
valetudo/ClumsyQuirkyCattle/StatusStateAttribute/error_description:.* error_description
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

drhirn

#238
Den ersten hab ich (noch) nicht. Aber stimmt, den dritten hab ich vergessen.
StatusStateAttribute/error liefert inzwischen ein JSON. Z.B. {"severity":{"kind":"none","level":"none"},"subsystem":"none","message":""}. Ist die Frage, ob man das aufdröseln will.
Und dann gäbe es noch die von "I can't believe it's not valetudo". Da könnte man sich überlegen, ob man die nicht einfach einbaut, aber standardmäßig nichts anzeigen lässt.

Ich persönlich finde übrigens eine Select-Liste bei clean_segment schöner als extra noch ein Pop-Up (multiple-strict).
Edit: Wusste zu diesem Zeitpunkt nicht, dass man auch mehrere Segmente gleichzeitig saugen kann. Deswegen macht multiple-strict Sinn.

Meine produktive readingsList hab ich händisch zusammen gebaut. Vielleicht findet sich darin ja noch ein bisschen Inspiration:

attr Staubi readingList $DEVICETOPIC/StatusStateAttribute/status:.* state\
$DEVICETOPIC/WifiConfigurationCapability/signal:.* wifiSignal\
$DEVICETOPIC/WifiConfigurationCapability/ssid:.* wifiSSID\
$DEVICETOPIC/WifiConfigurationCapability/frequency:.* wifiFrequency\
$DEVICETOPIC/BatteryStateAttribute/level:.* batteryLevel\
$DEVICETOPIC/BatteryStateAttribute/status:.* batteryState\
$DEVICETOPIC/StatusStateAttribute/detail:.* stateDetail\
$DEVICETOPIC/StatusStateAttribute/error:.* stateError\
$DEVICETOPIC/AttachmentStateAttribute/[a-zA-Z\-_]+:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),;; {"$1"=>$EVENT} }\
$DEVICETOPIC/CurrentStatisticsCapability/time:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),;; {"cleaningTime"=>($EVENT / 60)." min"} }\
$DEVICETOPIC/MapData/segments:.* .segments\
$DEVICETOPIC/MapData/map:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),;; {"map"=>"<html><div style='width: 300px;; height: 600px;;'><img src='".$EVENT."'></div></html>"} }\
$DEVICETOPIC/FanSpeedControlCapability/preset:.* fanSpeed\
$DEVICETOPIC/WaterUsageControlCapability/preset:.* waterUsage\
$DEVICETOPIC/LocateCapability/locate:.* locate\
$DEVICETOPIC/CurrentStatisticsCapability/area:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),; {"cleanedArea"=>sprintf("%.2f",($EVENT / 10000))." m2"} }\
$DEVICETOPIC/ConsumableMonitoringCapability/[a-zA-Z\-_]+:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),;; {"consumable-$1"=>Time::Seconds->new($EVENT)->pretty} }
$DEVICETOPIC/MapSegmentationCapability/clean/set:.* {}
$DEVICETOPIC/ZoneCleaningCapability/start/set:.* {}

drhirn

Zitat von: Otto123 am 18 Oktober 2022, 20:29:35
Das Internal <IODev>_CONN muss ja zu dem Zeitpunkt da sein, sonst gäbe es das Device nicht. 8)

Ich hab das Internal nirgends. Wo finde ich das?