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...
Sollen wir wirklich dein Token kennen?
Ansonsten: Zeig doch mal deine Steuerung (das DOIF).
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
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.
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.
([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.
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.
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.
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.
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