Staubsaugroboter nur einmal am Tag fahren wenn Residents absent

Begonnen von der-Lolo, 07 Februar 2019, 09:27:52

Vorheriges Thema - Nächstes Thema

der-Lolo

Hallo DOIF Fans,
ich versuche gerade unseren neuen Xiaomi Staubsauger zu automatisieren.
Ich wünsche mir das er die Etage in der er sich befindet saugt wenn kein Roommate mehr im Haus ist.

Das funktioniert auch schon soweit...

Nun ist mir aber aufgefallen das er so auch mehrfach am Tag seine Arbeit aufnimmt. Das würde ich gerne verhindern.
Wenn der Roboter nach getaner Arbeit wieder in seiner Ladeposition steht wird ein Reading (history_0) aktualisiert - das wiederrum hat vorne angestellt einen Timestamp.
Ich würde gerne bevor der Roboter losfährt prüfen ob der aktuelle Datum Stempel neuer ist als der alte und dann die Reinigung nur noch einmal am Tag starten...

Ich habe es gerade mit einem DOIF Reading versucht - das funktioniert leider noch nicht wie ich mir das vorstelle.

lastRun:[Staubsauger:history_0:$EVTPART1]

hier noch ein list des Roboter:
Internals:
   CHANGED   
   DEF        192.168.1.164 4143624244414a666c63487933446f67
   FD         17
   FUUID      5c554c98-f33f-68f5-9273-71a4c3f66c62fefe
   NAME       Staubsauger
   NR         191
   STATE      Charging
   TYPE       XiaomiDevice
   hardware   Linux
   mac        40:31:3C:A3:3D:6E
   model      rockrobo.vacuum.v1
   token      4XXXXXXXXX7
   READINGS:
     2019-02-07 08:46:50   app_bom         A.03.0023
     2019-02-07 08:46:50   app_language    prc
     2019-02-07 08:46:50   app_location    prc
     2019-02-07 08:46:50   app_logserver   awsbj0.fds.api.xiaomi.com
     2019-02-07 08:46:50   app_name        A.03.0023_PRC
     2019-02-07 08:46:50   app_timezone    Asia/Shanghai
     2019-02-07 09:22:11   batteryPercent  82
     2019-02-07 09:22:11   batteryState    ok
     2019-02-07 08:46:50   carpet_high     500
     2019-02-07 08:46:50   carpet_integral 450
     2019-02-07 08:46:50   carpet_low      400
     2019-02-07 08:46:50   carpet_mode     off
     2019-02-07 08:46:50   carpet_stall_time 10
     2019-02-07 09:22:11   cleaning_mode   balanced
     2019-02-07 08:46:49   consumables_filter 95
     2019-02-07 08:46:49   consumables_main_brush 97
     2019-02-07 08:46:49   consumables_sensors 77
     2019-02-07 08:46:49   consumables_side_brush 96
     2019-02-07 03:46:45   device_firmware 3.3.9_003357
     2019-02-07 08:46:50   device_fw_features 101,102
     2019-02-07 03:46:45   device_uptime   0.05
     2019-02-07 09:22:11   dnd             off
     2019-02-07 08:46:49   dnd_enabled     on
     2019-02-07 08:46:49   dnd_end         08:00
     2019-02-07 08:46:49   dnd_start       22:00
     2019-02-07 09:22:11   error           none
     2019-02-07 09:22:11   error_code      None
     2019-02-05 18:58:06   event           relocate_fail
     2019-02-07 09:22:11   fan_power       60
     2019-02-07 09:15:41   history_0       2019-02-07 08:36:04: 42.73m² in 0.64h, finished cleaning
     2019-02-07 09:15:41   history_1       2019-02-06 10:44:04: 0.26m² in 0.00h, not finished
     2019-02-07 09:15:41   history_2       2019-02-06 10:16:12: 0.00m² in 0.00h, not finished
     2019-02-07 09:15:41   history_3       2019-02-06 09:20:11: 43.10m² in 0.66h, finished cleaning
     2019-02-07 09:15:41   history_4       2019-02-06 08:24:44: 54.22m² in 0.77h, finished cleaning
     2019-02-07 09:15:41   history_5       2019-02-05 15:41:32: 21.64m² in 0.32h, not finished
     2019-02-07 09:15:41   history_6       2019-02-05 13:59:27: 43.53m² in 0.66h, finished cleaning
     2019-02-07 09:15:41   history_7       2019-02-04 09:29:24: 54.50m² in 0.80h, finished cleaning
     2019-02-07 09:15:41   history_8       2019-02-04 08:47:06: 43.64m² in 0.64h, finished cleaning
     2019-02-07 09:15:41   history_9       2019-02-03 15:51:56: 54.37m² in 0.78h, finished cleaning
     2019-02-07 09:22:11   in_cleaning     no
     2019-02-07 09:22:11   last_clean_area 42.73
     2019-02-07 09:22:11   last_clean_time 0.64
     2019-02-07 09:15:41   last_timestamp  1549524964
     2019-02-07 09:22:11   map_present     yes
     2019-02-07 03:46:45   serial_number   1387101831408
     2019-02-07 09:22:11   state           Charging
     2019-02-07 03:46:45   timezone        Europe/Berlin
     2019-02-07 09:15:41   total_clean_area 498.84
     2019-02-07 09:15:41   total_clean_time 7.47
     2019-02-07 09:15:41   total_cleans    16
     2019-02-07 08:46:49   volume          90
     2019-02-07 03:46:45   wifi_auth_fail_count 0
     2019-02-07 03:46:45   wifi_conn_fail_count 0
     2019-02-07 03:46:45   wifi_conn_success_count 1
     2019-02-07 03:46:45   wifi_dhcp_fail_count 0
     2019-02-07 03:46:45   wifi_rssi       -59
     2019-02-07 03:46:45   wifi_state      online
   helper:
     ConnectionState connected
     cleanrecord 10
     crypt      Rijndael
     delay      60
     dev        0700
     historydays 10
     id         94e9
     ip         192.168.1.164
     last_read  1549527731
     packetid   1494
     port       54321
     sequence   1
     timers     0
     token      4XXXXXXXXXXXX67
     bm:
       XiaomiDevice_Attr:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        07.02. 07:53:36
         max        2.69412994384766e-05
         tot        2.69412994384766e-05
         mAr:
           set
           Staubsauger
           event-on-change-reading
           state,in_cleaning,history_0
       XiaomiDevice_DbLog_splitFn:
         cnt        7
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        06.02. 09:11:50
         max        6.69956207275391e-05
         tot        0.000347137451171875
         mAr:
           state: Returning to base
           Staubsauger
       XiaomiDevice_Get:
         cnt        43
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        06.02. 10:28:00
         max        0.00829219818115234
         tot        0.0102050304412842
         mAr:
           HASH(0x6f18030)
           Staubsauger
           data
       XiaomiDevice_Read:
         cnt        2206
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        06.02. 17:46:48
         max        0.109988927841187
         tot        30.6588435173035
         mAr:
           HASH(0x6f18030)
       XiaomiDevice_Set:
         cnt        193
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        05.02. 18:58:42
         max        0.0139908790588379
         tot        0.192472696304321
         mAr:
           HASH(0x6f18030)
           Staubsauger
           charge
     day:
     history:
     packet:
       1          wifi_stats
       10         get_carpet_mode
       11         get_fw_features
       12         app_get_locale
       13         get_status
       14         get_status
       15         get_status
       16         wifi_stats
       17         device_info
       18         get_serial_number
       183        app_goto_target
       19         get_timezone
       2          device_info
       20         get_consumable
       21         get_clean_summary
       22         get_dnd_timer
       23         get_timer
       3          get_serial_number
       4          get_timezone
       472        get_status
       5          get_consumable
       6          get_clean_summary
       605        get_status
       650        get_clean_summary
       666        get_status
       669        get_status
       7          get_dnd_timer
       717        get_status
       8          get_timer
       9          get_sound_volume
Attributes:
   DbLogExclude .*
   event-on-change-reading state,in_cleaning,history_0
   room       01-Schlafzimmer
   stateFormat state
   subType    VacuumCleaner


Hat jemand eine Idee wie ich nach erfolgter reinigung den Datumsstempel des Readings history_0 ablegen und am nächsten tag auf < aktuelles Datum prüfen kann..?

1000 Dank vorab...

Christoph Morrison

Sollen wir wirklich dein Token kennen?

Ansonsten: Zeig doch mal deine Steuerung (das DOIF).

der-Lolo

Ups, Danke Dir - warum steht der da auch zweimal drin..?

ein list - wobei es aber bisher nur eine Zeile ist das DOIF Reading lastRun wird leider nicht gefüllt.



Internals:
   DEF        ([Eichenheim:residentsTotalRoommatesAbsent:d] > 2 )
(set Staubsauger start, msg push @rr_Michael Der Staubsauger ist losgefahren)

   FUUID      5c59298b-f33f-68f5-6c42-521086888c5c4c5d
   MODEL      FHEM
   NAME       DRmodeSwitch
   NR         193
   NTFY_ORDER 50-DRmodeSwitch
   STATE      initialized
   TYPE       DOIF
   Helper:
     DBLOG:
       cmd:
         DbLog:
           TIME       1549529987.72233
           VALUE      0
       cmd_event:
         DbLog:
           TIME       1549524965.04366
           VALUE      set_cmd_1
       cmd_nr:
         DbLog:
           TIME       1549524965.04366
           VALUE      1
       error:
         DbLog:
           TIME       1549524965.04366
           VALUE       ELSE (set Staubsauger start, msg push @rr_Michael Der Staubsauger ist losgefahren)
       mode:
         DbLog:
           TIME       1549529987.72233
           VALUE      enabled
       state:
         DbLog:
           TIME       1549529987.72233
           VALUE      initialized
       wait_timer:
         DbLog:
           TIME       1549530086.61449
           VALUE      no timer
       warning:
         DbLog:
           TIME       1549396800.01479
           VALUE      condition c01
   READINGS:
     2019-02-07 10:01:21   Device          Eichenheim
     2019-02-07 09:59:47   cmd             0
     2019-02-07 08:35:56   lastRun         
     2019-02-07 09:59:47   mode            enabled
     2019-02-07 09:59:47   state           initialized
     2019-02-07 10:01:26   wait_timer      no timer
   Regex:
   attr:
     cmdState:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Eichenheim','residentsTotalRoommatesAbsent','','d') > 2
   devices:
     0           Eichenheim
     all         Eichenheim
   do:
     0:
       0          set Staubsauger start, msg push @rr_Michael Der Staubsauger ist losgefahren
     1:
   helper:
     event      durTimerPresence_cr: 87,durTimerPresence: 01:27:04
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev Eichenheim
     bm:
       DOIF_Attr:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        07.02. 10:01:26
         max        0.0106949806213379
         tot        0.0106949806213379
         mAr:
           del
           DRmodeSwitch
           wait
       DOIF_Get:
         cnt        3
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        07.02. 10:01:22
         max        2.19345092773438e-05
         tot        5.41210174560547e-05
         mAr:
           HASH(0x7050f30)
           DRmodeSwitch
           ?
       DOIF_Notify:
         cnt        180
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        07.02. 10:00:21
         max        0.000428915023803711
         tot        0.00861239433288574
         mAr:
           HASH(0x7050f30)
           HASH(0x4f1ad40)
       DOIF_Set:
         cnt        10
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        07.02. 10:01:26
         max        8.60691070556641e-05
         tot        0.000616550445556641
         mAr:
           HASH(0x7050f30)
           DRmodeSwitch
           ?
     triggerEvents:
       durTimerPresence_cr: 87
       durTimerPresence: 01:27:04
     triggerEventsState:
       durTimerPresence_cr: 87
       durTimerPresence: 01:27:04
   internals:
   itimer:
   readings:
     0           Eichenheim:residentsTotalRoommatesAbsent
     all         Eichenheim:residentsTotalRoommatesAbsent
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings lastRun:[Staubsauger:$EVTPART1]
   room       01-Schlafzimmer

eisenhauer1987

Hi,

ich setze einfach im Staubsauger ein eigenes Reading names dayclean wenn der Staubsauger gefahren ist, in etwa so:


([XiaomiRobot:state] eq "Charging")
(setreading XiaomiRobot dayclean true)


Jeden Tag um 01:00 wird das wieder auf false gesetzt. Mein allgemeines Präsenz DOIF prüft dann ob abwesend und dieses Reading false oder true ist und startet bei bedarf den Sauger.



Christoph Morrison

DOIF kennt $EVTPARTn nicht, allerdings steht in last_timestamp von Staubsauger die letzte Startzeit (in UTC, d.h. du musst entweder UTC benutzen (Hint: gmtime in Perl ) oder halt entsprechend eine Stunde + ggf. DST dazu rechnen).

Alternativ könntest du dir in Staubsauger auch ein userReadings machen, das bei jedem Start ein last_run_day oder so anlegt und darauf prüfst du dann im DOIF.

Per

([roommate] = "absent") (set Staubi run)
DOELSEIF ([08:00])

8 Uhr ist willkürlich gewählt, damit er im Urlaub oder so nicht um Mitternacht losrödelt.

Christoph Morrison

#6
Zitat von: Per am 07 Februar 2019, 12:10:44
([roommate] = "absent") (set Staubi run)
DOELSEIF ([08:00])

8 Uhr ist willkürlich gewählt, damit er im Urlaub oder so nicht um Mitternacht losrödelt.

Wieso schränkst du die Fahrtzeiten dann nicht einfach in der IF-Bedingung ein? So ungefähr:
[?08:00-18:00] and [roommate] eq "absent
Fähr los sobald roommate auf absent geht, aber nur zwischen 08:00 und 18:00

Außerdem könntest du deinen Urlaub in eine holidays-Datei / einen Kalender schreiben und den dann noch abfragen.

der-Lolo

Nein, ich muss den Tag wenn schon gesaugt wurde blockieren - wir kommen zu unregelmässig manchmal auch nur kurz wieder nach hause und verschwinden wieder... present absent schaltet also unter umständen mehrfach pro tag. Das mit dem userreading ist eine möglichkeit - daran werde ich mich versuchen...

Danke allen fürs mitdenken.

Per

Zitat von: der-Lolo am 07 Februar 2019, 15:36:35
Nein, ich muss den Tag wenn schon gesaugt wurde blockieren
Das macht mein Vorschlag. Zumindest, solange du nicht do always aktivierst.

MadMax-FHEM

#9
Zitat von: eisenhauer1987 am 07 Februar 2019, 10:06:36
Hi,

ich setze einfach im Staubsauger ein eigenes Reading names dayclean wenn der Staubsauger gefahren ist, in etwa so:


([XiaomiRobot:state] eq "Charging")
(setreading XiaomiRobot dayclean true)


Jeden Tag um 01:00 wird das wieder auf false gesetzt. Mein allgemeines Präsenz DOIF prüft dann ob abwesend und dieses Reading false oder true ist und startet bei bedarf den Sauger.

Sowas macht der Sauger doch selber: total_cleans

Wird am Ende jeden Reinigungsvorhanges gesetzt...
(ich habe noch ein timestamp-on-change-reading dafür gesetzt, ist aber glaube ich unnötig)

EDIT: mittels ReadingsAge entscheide ich dann, ob es nötig ist loszulegen ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)