MQTT2 für Xiaomi Vacuum Sauger

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

Vorheriges Thema - Nächstes Thema

meier81

Zitat von: Otto123 am 07 November 2022, 21:19:40
Der Originalcode:    my $ip = (split q{ },$load)[1] || ReadingsVal($NAME,'ip4',(split q{_}, InternalVal($NAME,ReadingsVal($NAME,'IODev','').'_CONN','') )[-2] || return 'error no ip');in $load wird entweder ein Wort (segments|release|ip) oder ip 192.168.4.1 übergeben.
Im letzten Fall wird ip auf den Übergabewert gesetzt, existiert der nicht
wird ReadingsVal($NAME,'ip4', gelesen, ist das Reading leer
wird InternalVal() gelesen, wenn der nicht existiert
wird eine Fehlermeldung zurück gegeben.

Was soll bei Deiner Variante anders laufen, für den Fall das schon ip4 gefüllt ist? Der Code muss doch bei Dir auch funktionieren wenn keine MQTT2 Server da ist, denn das erste ReadingsVal() greift doch, ob Du das ein zweites mal hinschreibst ist doch egal. :-[ ich versteh das nicht :'(
Hat da einer ne Idee?

Also das hat bei mir auch ohne Probleme funktioniert, da weiß ich auch nicht was hier nicht gehen sollte. Direkt nach dem anlegen ging der Link zur valetudo-Oberfläche schon, also war die IP ja schon da. Dann Template ausgewählt, Staubsauger neu gestartet und einen Moment gewartet, alles da  ;)
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

meier81

Bezüglich meiner Frage wegen der Umrechnung der noch im raw-Format vorliegenden Werte, hab gerade gesehen du machst das in der Utils bei "sub valetudo_r", das müsste man doch hier mit einbauen können?
Hätte es ja auch probiert, bin hier allerdings nicht ganz so fit (leider).
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

Otto123

Hallo Markus,

diese Zeiten habe ich nicht als Umrechnung eingebaut. Aus meiner Sicht stehen da sekunden drin (ich hatte irgendwo mal was von Minuten gelesen - kann aber eigentlich nicht sein)
Ich finde aus Automatisierungssicht, sind die Sekunden da ganz brauchbar. Da muss man nicht alles erst vor oder zurück rechnen.

Man könnte ne extra Anzeige bauen {strftime("%H:%M:%S",gmtime( ReadingsVal() ) )}

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

meier81

Zitat von: Otto123 am 07 November 2022, 21:36:59
Hallo Markus,

diese Zeiten habe ich nicht als Umrechnung eingebaut. Aus meiner Sicht stehen da sekunden drin (ich hatte irgendwo mal was von Minuten gelesen - kann aber eigentlich nicht sein)
Ich finde aus Automatisierungssicht, sind die Sekunden da ganz brauchbar. Da muss man nicht alles erst vor oder zurück rechnen.

Man könnte ne extra Anzeige bauen {strftime("%H:%M:%S",gmtime( ReadingsVal() ) )}

Gruß Otto

Kann ich natürlich nachvollziehen, gibt aber bestimmt auch einige die vielleicht die readings einfach nur in der Oberfläche anzeigen lassen wollen, die freuen sich natürlich wenn da schon der fertige Wert drin steht.
Cool wäre es wenn man ein Attribut setzen könnte, z.B. "timeformat", hier kann man dann auswählen zwischen "rawtime" oder "HH:MM:SS".
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

drhirn

Zitat von: Otto123 am 07 November 2022, 21:19:40Was soll bei Deiner Variante anders laufen, für den Fall das schon ip4 gefüllt ist? Der Code muss doch bei Dir auch funktionieren wenn keine MQTT2 Server da ist, denn das erste ReadingsVal() greift doch, ob Du das ein zweites mal hinschreibst ist doch egal. :-[ ich versteh das nicht :'(

Ja, ich doch auch nicht. Und ich hab langsam echt Angst, dass ihr mich für komplett bescheuert haltet. Aber ich hab's gerade nochmal durchgespielt.

FHEM Update, Device komplett gelöscht und gewartet, bis es neu angelegt wird. Sieht dann so aus (gilt auch für den zweiten Fall):

defmod MQTT2_staubi MQTT2_DEVICE staubi
attr MQTT2_staubi readingList valetudo/staubi/WifiConfigurationCapability/signal:.* signal
attr MQTT2_staubi room MQTT2_DEVICE

setstate MQTT2_staubi 2022-11-08 18:13:46 IODev Mosquitto
setstate MQTT2_staubi 2022-11-08 18:13:46 associatedWith MQTT2_fhem_test
setstate MQTT2_staubi 2022-11-08 18:14:16 signal -45


Dann hab ich das Template valetudo angewendet. Ergebnis war, dass ich kein Reading valetudo_release hatte, aber im Broker eine Message error = no ip. Reading ip4 ist aber da.

defmod MQTT2_staubi MQTT2_DEVICE staubi
attr MQTT2_staubi alias staubi
attr MQTT2_staubi devStateIcon docked:rc_PLAY:start (moving|cleaning):rc_PLAY@blue:pause (idle|paused):rc_PAUSE@red:start returning:refresh:pause
attr MQTT2_staubi devicetopic valetudo/staubi
attr MQTT2_staubi event-on-change-reading .*
attr MQTT2_staubi icon vacuum_top
attr MQTT2_staubi model valetudoV2
attr MQTT2_staubi readingList $DEVICETOPIC/\x24state:.* _state\
  $DEVICETOPIC/.*/[a-zA-Z\-_]+:.* { $TOPIC =~ m,$DEVICETOPIC\/(.*)\/([a-zA-Z\-_]+),;; valetudo_r($NAME,$1,$2,$EVENT) }
attr MQTT2_staubi room MQTT2_DEVICE
attr MQTT2_staubi 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:min,low,medium,high,max $DEVICETOPIC/FanSpeedControlCapability/preset/set $EVTPART1\
  locate:PERFORM   $DEVICETOPIC/LocateCapability/locate/set $EVTPART1\
  x_raw_payload:textField { valetudo_c($NAME,$EVENT) }\
  delete:zones,locations {fhem("deletereading $NAME .$EVTPART1");;;;return undef}\
  zoneNew:textField { valetudo_z($NAME,$EVENT) }\
  zoneRename:textField { valetudo_z($NAME,$EVENT) }\
  get:segments,release,ip { valetudo_g($NAME,$EVENT) }
attr MQTT2_staubi setStateList operation clean_segment clean_zone goto fanSpeed waterUsage locate x_raw_payload
attr MQTT2_staubi stateFormat cleanerState\
<a href="http://ip4" target="_blank">cleanerState</a>
attr MQTT2_staubi timestamp-on-change-reading .*

setstate MQTT2_staubi cleanerState\
<a href="http://10.168.1.63" target="_blank">cleanerState</a>
setstate MQTT2_staubi 2022-11-08 18:13:46 IODev Mosquitto
setstate MQTT2_staubi 2022-11-08 18:13:46 associatedWith MQTT2_fhem_test
setstate MQTT2_staubi 2022-11-08 18:15:06 attrTemplateVersion 20221101
setstate MQTT2_staubi 2022-11-08 18:15:06 get set release
setstate MQTT2_staubi 2022-11-08 18:15:06 ip4 10.168.1.63
setstate MQTT2_staubi 2022-11-08 18:14:16 signal -45


Also alles nochmal gelöscht und der von mir oben erwähnte Zeile
|| ReadingsVal($NAME,'ip4',undef)
hinzugefügt und den Lösch- und Wieder-Download-Code im Template gelöscht. Dann FHEM neu gestartet und gewartet, bis das Device angelegt wird. Sah genau gleich aus wie oben.
Template angewendet und siehe da:

defmod MQTT2_staubi MQTT2_DEVICE staubi
attr MQTT2_staubi alias staubi
attr MQTT2_staubi devStateIcon docked:rc_PLAY:start (moving|cleaning):rc_PLAY@blue:pause (idle|paused):rc_PAUSE@red:start returning:refresh:pause
attr MQTT2_staubi devicetopic valetudo/staubi
attr MQTT2_staubi event-on-change-reading .*
attr MQTT2_staubi icon vacuum_top
attr MQTT2_staubi model valetudoV2
attr MQTT2_staubi readingList $DEVICETOPIC/\x24state:.* _state\
  $DEVICETOPIC/.*/[a-zA-Z\-_]+:.* { $TOPIC =~ m,$DEVICETOPIC\/(.*)\/([a-zA-Z\-_]+),;; valetudo_r($NAME,$1,$2,$EVENT) }
attr MQTT2_staubi room MQTT2_DEVICE
attr MQTT2_staubi 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:min,low,medium,high,max $DEVICETOPIC/FanSpeedControlCapability/preset/set $EVTPART1\
  locate:PERFORM   $DEVICETOPIC/LocateCapability/locate/set $EVTPART1\
  x_raw_payload:textField { valetudo_c($NAME,$EVENT) }\
  delete:zones,locations {fhem("deletereading $NAME .$EVTPART1");;;;return undef}\
  zoneNew:textField { valetudo_z($NAME,$EVENT) }\
  zoneRename:textField { valetudo_z($NAME,$EVENT) }\
  get:segments,release,ip { valetudo_g($NAME,$EVENT) }
attr MQTT2_staubi setStateList operation clean_segment clean_zone goto fanSpeed waterUsage locate x_raw_payload
attr MQTT2_staubi stateFormat cleanerState\
<a href="http://ip4" target="_blank">cleanerState</a>
attr MQTT2_staubi timestamp-on-change-reading .*

setstate MQTT2_staubi cleanerState\
<a href="http://10.168.1.63" target="_blank">cleanerState</a>
setstate MQTT2_staubi 2022-11-08 18:19:16 IODev Mosquitto
setstate MQTT2_staubi 2022-11-08 18:19:16 associatedWith MQTT2_fhem_test
setstate MQTT2_staubi 2022-11-08 18:19:37 attrTemplateVersion 20221101
setstate MQTT2_staubi 2022-11-08 18:19:37 ip4 10.168.1.63
setstate MQTT2_staubi 2022-11-08 18:19:16 signal -45
setstate MQTT2_staubi 2022-11-08 18:19:37 valetudo_release 2022.11.0


Und dann, dann hatte ich eine Erkenntnis: Da scheint in meiner beanstandeten Zeile was mit den Klammern nicht zu stimmen. Die erste ist die Original-Zeile, die zweite die von mir geänderte.

my $ip = (split q{ },$load)[1] || ReadingsVal($NAME,'ip4',(split q{_}, InternalVal($NAME,ReadingsVal($NAME,'IODev','').'_CONN','') )[-2] || return 'error no ip');
my $ip = (split q{ },$load)[1] || ReadingsVal($NAME,'ip4',(split q{_}, InternalVal($NAME,ReadingsVal($NAME,'IODev','').'_CONN','') )[-2]) || return 'error no ip';

Mit der zweiten Zeile funktioniert's bei mir wie's soll. Aber da sind so viele Klammern, dass ich mir nicht sicher bin, ob das so stimmt ;)

Otto123

womit Du sowas von Recht hast! --> Bugfix folgt ;)
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

Gott sei Dank. Hab schon angefangen, an mir zu zweifeln ;D

Otto123

bug fix ist eingecheckt und Wunsch ungefähr erfüllt.  8)
Zitat von: meier81 am 07 November 2022, 21:58:59
Cool wäre es wenn man ein Attribut setzen könnte, z.B. "timeformat", hier kann man dann auswählen zwischen "rawtime" oder "HH:MM:SS".

Neue Datei holen
{ $data{f}='99_valetudoUtils.pm';;{ Svn_GetFile("contrib/AttrTemplate/$data{f}", "FHEM/$data{f}", sub(){CommandReload(undef, $data{f})}) } }
Wenn man das Zeitformat von derzeit Sekunden (im Minutenraster) ändern will muss man das Attribute timeformat nachrüsten:
attr a:model=valetudoV2 userattr timeformat
Und in das attr timeformat irgendwas reinschreiben, das wird derzeit nicht weiter beachtet. Es führt aber dazu, dass die Zeiten wie in der valetudo UI gesetzt werden:
time in HH:MM:SS
Consumables 1d 12h 00m
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

meier81

Hi Otto,

vielen Dank für das Nachrüsten der Minutenzeitanzeige.

Kannst du mir mal kurz helfen wo ich das Attribut "timeformat" nachrüsten muss, denke ja das ist kein userattr.

Gruß Markus
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

rudolfkoenig

Zitat{ $data{f}='99_valetudoUtils.pm';;{ Svn_GetFile("contrib/AttrTemplate/$data{f}", "FHEM/$data{f}", sub(){CommandReload(undef, $data{f})}) } }

Statt den globalen Hash fuer sowas zu missbrauchen empfehle ich eine lokale Variable:
{ my $f='99_valetudoUtils.pm';;{ Svn_GetFile("contrib/AttrTemplate/$f", "FHEM/$f", sub(){CommandReload(undef, $f)}) } }

Otto123

#325
Zitat von: meier81 am 09 November 2022, 10:05:16
Kannst du mir mal kurz helfen wo ich das Attribut "timeformat" nachrüsten muss, denke ja das ist kein userattr.
wie soll ich das anders beschreiben? 2 Schritte:
Codezeile steht oben um ein userattr einzutragen (das devspec realisiert es für alle valetudoV2 Geräte).
dann dieses attr wie jedes andere Attribute auch mit irgendetwas beschreiben, von mir aus mit willi.
Ist das attr nicht vorhanden (leer) dann werden sekunden ausgegeben.

Ich hatte vor, das Format wirklich aus diesem Attribute zu lesen, aber das sind dann schon zwei. Und welchen Formatsyntax sollte man dann nehmen?
strfmtime arbeitet mit posix syntax und realisiert Datumsangaben. Ginge hilfsweise für HH:MM:SS
Beides sind aber Zeitdauern, das passt nicht. Deswegen habe ich es erstmal so gemacht, bis mir was besseres einfällt.
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

meier81

Hi Otto,

sorry das ich so doof gefragt hatte, ich dachte nur ich hätte da bei mir was falsch gemacht.

Hab jetzt bei mir das wie folgt im MQTT2_DEVICE stehen
attr EG_fl_HW_Saugroboter userattr timeformat Minuten

sollte so ja dann richtig sein. Ich werde ihn jetzt mal auf die Reise schicken und schauen ob sich die Zeiten dann in das Minutenformat ändern, zur Zeit stehen dort noch die Sekunden. Ich berichte wieder.
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

Otto123

falsch! :o
So wars gedacht!   ;)
attr EG_fl_HW_Saugroboter userattr timeformat
attr EG_fl_HW_Saugroboter timeformat Minuten


Das unnötige Attribute Minuten kannst Du wieder löschen  :D
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

meier81

Zitat von: Otto123 am 09 November 2022, 12:29:58
falsch! :o
So wars gedacht!   ;)
attr EG_fl_HW_Saugroboter userattr timeformat
attr EG_fl_HW_Saugroboter timeformat Minuten


Das unnötige Attribute Minuten kannst Du wieder löschen  :D

Ha, dann war ich beim ersten Versuch doch eigentlich richtig, hatte dann nur attr EG_fl_HW_Saugroboter timeformat Minuten nicht so gemacht.  ;)

Danke dir für deine Geduld  ;D
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

meier81

Hallo Otto,

jetzt konnte ich die ganzen Sachen mal ausgiebig testen. Leider habe ich noch einen Fehler bei der Umrechnung der Saugzeit (reading time) gefunden.

Habe mal nachgeschaut und deine Utils dementsprechend angepasst, hab dir mal meine Änderungen hier eingestellt, vielleicht willst du sie ja übernehmen.

Zum einen hab ich noch ein sub eingefügt und das Originale vom Namen geändert und die Sekunden gelöscht (gibt jetzt einen für dhm und einen für hms):

sub valetudo_dhm{
  my $s = shift;

  my $d = int($s/86400);
  $s -= $d*86400;
  my $h = int($s/3600);
  $s -= $h*3600;
  my $m = int($s/60);

  return ($d,$h,$m);
}

sub valetudo_hms{
  my $s = shift;

  my $h = int($s/3600);
  $s -= $h*3600;
  my $m = int($s/60);
  $s -= $m*60;

  return ($h,$m,$s);
}


Dann für die Consumables die Zeile angepasst (valetudo_dhms --> valetudo_dhm geändert):

{return ($TMF ne '') ? {"$value"=>sprintf "%dd %02dh %02dm",valetudo_dhm($EVENT)}:

und die Zeile für die Saugzeit noch angepasst (valetudo_dhms --> valetudo_hms geändert, zudem die Anzeige geändert bzw. korrigiert):

($value eq 'time' and $TMF ne '') ? {"$value"=>sprintf "%02dh %02dm %02ds",valetudo_hms($EVENT)}:

Hab das eben soweit alles durchgetestet, funktioniert und passt alles einwandfrei.

Gruß Markus
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices