Hauptmenü

Logikproblem

Begonnen von Superposchi, 23 März 2021, 09:30:07

Vorheriges Thema - Nächstes Thema

Superposchi

Hallo,

ich habe mir einen einfachen Counter gebastelt in dem ich prüfe ob ein selbst erstelltes Reading eines Devices zu einem bestimmten Zeitpunkt einen bestimmten Wert aufweist. Bei 0 soll er das Reading auf 1 setzen, bei 1 auf 2 setzen und bei 2 auf drei setzen. Klappt alles hervorragend solange ich für den Zeitpunkt eine Zeitspanne von mehr als 15 Minuten angebe. Stelle ich es auf eine fixe Uhrzeit ein klappt es auf einmal nicht mehr.

Warum macht es einen Unterschied ob die Uhrzeit fix oder als Zeitspanne angegeben ist?

Hier das List vom DOIF wie es funktioniert, also mit Zeitspanne:
Internals:
   .FhemMetaInternals 1
   DEF        (([02:00-02:29]) and ([?Saugroboter:counter] eq "0"))
(setreading Saugroboter counter 1)
DOELSEIF (([01:30-01:59]) and ([?Saugroboter:counter] eq "1"))
(setreading Saugroboter counter 2)
DOELSEIF (([01:00-01:29]) and ([?Saugroboter:counter] eq "2"))
(setreading Saugroboter counter 3)
   FUUID      5fe98de0-f33f-793a-66fb-730b1a5167487477
   FVERSION   98_DOIF.pm:0.238100/2021-02-23
   MODEL      FHEM
   NAME       Steuerung_Saugroboter_Counter
   NOTIFYDEV  global
   NR         152
   NTFY_ORDER 50-Steuerung_Saugroboter_Counter
   STATE      initialized
   TYPE       DOIF
   VERSION    23810 2021-02-23 20:14:35
   .attraggr:
   .attrminint:
   READINGS:
     2021-03-23 09:21:08   cmd             0
     2021-03-23 09:21:08   mode            enabled
     2021-03-23 09:21:08   state           initialized
     2021-03-23 09:21:08   timer_01_c01    24.03.2021 02:00:00
     2021-03-23 09:21:08   timer_02_c01    24.03.2021 02:29:00
     2021-03-23 09:21:08   timer_03_c02    24.03.2021 01:30:00
     2021-03-23 09:21:08   timer_04_c02    24.03.2021 01:59:00
     2021-03-23 09:21:08   timer_05_c03    24.03.2021 01:00:00
     2021-03-23 09:21:08   timer_06_c03    24.03.2021 01:29:00
   Regex:
     accu:
   attr:
     cmdState:
     wait:
       0:
         60
       1:
         60
       2:
         60
     waitdel:
   condition:
     0          (::DOIF_time($hash,0,1,$wday,$hms)) and (::ReadingValDoIf($hash,'Saugroboter','counter') eq "0")
     1          (::DOIF_time($hash,2,3,$wday,$hms)) and (::ReadingValDoIf($hash,'Saugroboter','counter') eq "1")
     2          (::DOIF_time($hash,4,5,$wday,$hms)) and (::ReadingValDoIf($hash,'Saugroboter','counter') eq "2")
   days:
   do:
     0:
       0          setreading Saugroboter counter 1
     1:
       0          setreading Saugroboter counter 2
     2:
       0          setreading Saugroboter counter 3
     3:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     globalinit 1
     last_timer 6
     sleeptimer -1
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
   intervalfunc:
   localtime:
     0          1616547600
     1          1616549340
     2          1616545800
     3          1616547540
     4          1616544000
     5          1616545740
   realtime:
     0          02:00:00
     1          02:29:00
     2          01:30:00
     3          01:59:00
     4          01:00:00
     5          01:29:00
   time:
     0          02:00:00
     1          02:29:00
     2          01:30:00
     3          01:59:00
     4          01:00:00
     5          01:29:00
   timeCond:
     0          0
     1          0
     2          1
     3          1
     4          2
     5          2
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   timers:
     0           0  1
     1           2  3
     2           4  5
   triggertime:
     1616544000:
       localtime  1616544000
       hash:
     1616545740:
       localtime  1616545740
       hash:
     1616545800:
       localtime  1616545800
       hash:
     1616547540:
       localtime  1616547540
       hash:
     1616547600:
       localtime  1616547600
       hash:
     1616549340:
       localtime  1616549340
       hash:
   uiState:
   uiTable:
Attributes:
   alias      Steuerung Counter
   group      Saugroboter
   room       Steuerung->Sonstiges
   verbose    4
   wait       60:60:60


P.S. Das Reading ist Teil eines Devices für einen Roborock Saugroboter. Hier das List dazu:
Internals:
   .FhemMetaInternals 1
   DEF        192.168.178.158 476c4f6f67484b634f49626178497658
   FD         11
   FUUID      5fc174fc-f33f-793a-c100-0ab0fe1a411fdbc6
   FVERSION   72_XiaomiDevice.pm:0.230210/2020-10-25
   NAME       Saugroboter
   NR         28
   STATE      Status: Docked <br> Letzte Reinigung: 1 Tage
   TYPE       XiaomiDevice
   hardware   Linux
   mac        64:90:C1:14:98:64
   model      roborock.vacuum.a10
   token      476c4f6f67484b634f49626178497658
   .attraggr:
   .attreocr:
     .*
   .attrminint:
   .attrtocr:
     .*
   READINGS:
     2020-12-01 13:44:19   app_bom         A.03.0097
     2020-12-01 13:44:19   app_language    en
     2020-12-01 13:44:19   app_location    de
     2020-12-01 13:44:19   app_logserver   awsde0.fds.api.xiaomi.com
     2020-12-01 13:44:19   app_name        custom_A.03.0097_CE
     2020-12-01 13:44:19   app_timezone    Europe/Berlin
     2020-12-01 13:44:19   app_wifiplan    DE
     2021-03-14 15:45:44   batteryPercent  100
     2020-12-01 14:19:23   batteryState    ok
     2020-12-01 13:44:19   carpet_high     500
     2020-12-01 13:44:19   carpet_integral 450
     2020-12-01 13:44:19   carpet_low      400
     2020-12-01 13:44:19   carpet_mode     on
     2020-12-01 13:44:19   carpet_stall_time 10
     2021-02-02 11:55:50   cleaning_mode   balanced
     2021-03-06 13:12:21   consumables_filter 86
     2021-02-25 16:09:46   consumables_main_brush 93
     2021-03-14 15:28:38   consumables_sensors 73
     2021-03-13 12:28:38   consumables_side_brush 89
     2021-03-23 02:00:00   counter         1
     2020-11-15 16:25:05   current_sound   chinese
     2021-02-28 09:58:26   device_firmware 3.5.8_5690
     2020-12-01 13:44:19   device_fw_features 111,112,113,114,115,116,117,118,119,120,121,122,123,124,125
     2021-03-10 03:28:35   device_uptime   0.06
     2021-03-23 09:00:55   dnd             off
     2020-12-01 13:44:19   dnd_enabled     on
     2020-12-01 13:44:19   dnd_end         09:00
     2020-12-01 13:44:19   dnd_start       20:00
     2020-12-01 14:19:23   error           none
     2020-12-12 14:29:24   error_code      None
     2021-02-27 10:32:13   event           start_with_water_box
     2021-02-02 11:55:50   fan_power       102
     2021-03-14 15:10:44   history_0       2021-03-14 14:24:10: 17.43m² in 0.32h, finished cleaning
     2021-03-14 15:10:44   history_1       2021-03-13 11:23:37: 27.59m² in 0.53h, finished cleaning
     2021-03-14 15:10:44   history_2       2021-03-06 12:33:46: 18.02m² in 0.33h, finished cleaning
     2021-03-14 15:10:44   history_3       2021-02-27 15:47:28: 0.96m² in 0.01h, not finished
     2021-03-14 15:10:44   history_4       2021-02-27 10:32:10: 17.50m² in 0.30h, finished cleaning
     2021-03-14 15:10:44   history_5       2021-02-26 18:52:04: 0.50m² in 0.01h, not finished
     2021-03-14 15:10:44   history_6       2021-02-26 16:56:57: 19.71m² in 0.40h, finished cleaning
     2021-03-14 15:10:44   history_7       2021-02-26 10:58:10: 20.82m² in 0.35h, finished cleaning
     2021-03-14 15:10:44   history_8       2021-02-25 15:13:33: 30.65m² in 0.52h, finished cleaning
     2021-03-14 15:10:44   history_9       2021-02-21 17:00:58: 30.86m² in 0.54h, finished cleaning
     2021-03-14 14:44:14   in_cleaning     no
     2021-03-14 15:10:44   in_fresh_state  yes
     2021-03-14 15:10:44   in_returning    no
     2020-12-01 14:19:23   lab_status      yes
     2021-03-14 14:44:14   last_clean_area 17.43
     2021-03-14 14:44:14   last_clean_time 0.32
     2021-03-14 15:10:44   last_timestamp  1615728250
     2021-02-21 17:36:02   lock_status     off
     2020-11-15 16:25:29   log_upload_status 9
     2020-12-01 14:19:23   map_present     yes
     2021-03-14 14:50:44   mop_forbidden_enable no
     2020-11-30 14:36:08   serial_number   XXXXXXXXXXXX
     2021-03-14 15:45:44   state           Docked
     2020-11-30 14:36:08   timezone        Europe/Berlin
     2021-03-14 15:10:44   total_clean_area 1115.90
     2021-03-14 15:10:44   total_clean_time 20.08
     2021-03-14 15:10:44   total_cleans    83
     2021-03-14 15:28:38   volume          70
     2021-03-14 14:50:44   water_box_carriage_status no
     2021-02-02 11:55:50   water_box_mode  high
     2021-03-14 14:50:44   water_box_status no
     2020-11-30 22:32:46   wifi_auth_fail_count 0
     2020-11-30 22:32:46   wifi_conn_fail_count 0
     2020-11-30 22:32:46   wifi_conn_success_count 1
     2020-11-30 22:32:46   wifi_dhcp_fail_count 0
     2021-03-22 03:28:35   wifi_rssi       -45
     2021-02-21 20:57:42   wifi_state      online
   helper:
     ConnectionState connected
     cleanrecord 10
     crypt      AES
     delay      60
     dev        132a
     historydays 10
     id         9c81
     ip         XXXXXXXXXXX
     last_read  1616487955
     packetid   9798
     port       54321
     sequence   -3
     timers     0
     token      XXXXXXXXX
     day:
       2585       1614361924
       2589       1613923258
       2590       1613664130
       2591       1613577858
     history:
       2585       3
       2589       7
       2590       8
       2591       9
     packet:
       2586       get_clean_record4
       9795       get_status
       9796       get_status
       9797       get_status
Attributes:
   event-on-change-reading .*
   group      Reinigung
   icon       vacuum_top
   room       Wohnung->Wohnzimmer
   stateFormat Status: state <br> Letzte Reinigung: counter Tage
   subType    VacuumCleaner
   timestamp-on-change-reading .*
   verbose    4

Per

Wo ist das Listing vom DOIF, wie es nicht funktioniert?

Superposchi

Gibt es nicht, da ich es nicht mehr habe. Kann ja keine zwei Devices mit gleicher Aufgabe gleichzeitig betreiben, das stört sich ja.

Sany

So wie das DOIF im Moment ist würde ich sagen, falls das Reading counter einmal 0 ist läuft das DOIF ab bis das Reading counter 3 ist und dann passiert NIE wieder was. Das würde 3 Tage dauern.
wofür die 60sec waits?
wer ausser dem DOIF selbst kann noch das reading counter schreiben?
was hast Du damit vor (ich kann es mir aus dem DOIF einfach nicht vorstellen)

warum das aber nur mit Zeiträumen gehen soll kann ich nicht sagen, ergibt sich vielleicht wenn mehr bekannt ist.

Gruß
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Superposchi

Hintergrund ist ein Tageszähler für den Saugrobotor.
Der Saugroboter wird immer gestartet wenn keine zu Hause ist und der Counter ungleich Null ist. Gleichzeitig wird er beim losfahren auf Null gesetzt. Das verhindert, dass der Saugroboter mehrfach am Tag fährt wenn mehrfach keiner zu Hause ist.

Das Doif ist dafür da, dass der Counter bis max 3 gezählt werden soll, weil dann eine Erinnerung ausgegeben werden soll, dass der Saugroboter trotz Anwesenheit fahren muss. Für den Fall, das zb im Urlaub oder jetzt im Homeoffice stetig jemand zu Hause ist und der Roboter so nicht zum automatischen Fahren kommt.

Hab es aber inzwischen mit einer richtigen Addition gelöst bei der der aktuelle Stand zu einer festen Uhrzeit ausgelesen und um 1 erhöht wiedergeschrieben wird solange er kleiner 3 ist.

Sany

na wenns läuft ist ja gut. Warum es mit Zeiten nicht funktioniert hat kann man so nicht sagen, ohne die Def dazu gesehen zu haben. [02:30] triggert eigentlich um 2:30 Uhr....
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Per

Zitat von: Superposchi am 25 März 2021, 16:55:58Hab es aber inzwischen mit einer richtigen Addition gelöst bei der der aktuelle Stand zu einer festen Uhrzeit ausgelesen und um 1 erhöht wiedergeschrieben wird solange er kleiner 3 ist.
Du kannst auch das Alter des Readings auslesen. Und wenn es größer als ein bestimmter Wert ist...