FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Damian am 01 August 2025, 21:43:00

Titel: Fhem/Perl-Funktion "Zählewenn" gesucht (2)
Beitrag von: Damian am 01 August 2025, 21:43:00
Zitat von: Marko1976 am 01 August 2025, 20:23:44
Zitat von: Damian am 01 August 2025, 12:56:39Für eine genauere Analyse poste mal das Event, welches nicht zur Berechnung des Eventreadings führt.
2025-08-01 20:16:13.160 DOIF Hausarbeit_counter checkall
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta days: 0
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta e_Aufgabe_Fiesta_days: 0
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta counter: 1
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta cmd_nr: 2
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta cmd_seqnr: 1
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta cmd: 2.1
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta cmd_event: Aufgabe_Fiesta
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta Alert
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta cmd_nr: 2
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta cmd_seqnr: 2
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta cmd: 2.2
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta cmd_event: Aufgabe_Fiesta
2025-08-01 20:16:13.168 DOIF Aufgabe_Fiesta Alert
2025-08-01 20:17:03.494 DOIF Hausarbeit_counter checkall
2025-08-01 20:17:03.494 DOIF Hausarbeit_counter Hausarbeiten: 4
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld days: 0
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld e_Hausarbeit_Kochfeld_days: 0
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld counter: 1
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld cmd_nr: 2
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld cmd_seqnr: 1
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld cmd: 2.1
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld cmd_event: Hausarbeit_Kochfeld
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld Alert
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld cmd_nr: 2
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld cmd_seqnr: 2
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld cmd: 2.2
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld cmd_event: Hausarbeit_Kochfeld
2025-08-01 20:17:03.503 DOIF Hausarbeit_Kochfeld Alert

List des Rechen-DOIF's:
Internals:
  CFGFN     
  DEF        (["^Hausarbeit.* Alert$"])
    ()
DOELSEIF (["^Aufgabe.* Alert$"])
    ()
  FUUID      688686c7-f33f-7706-90e1-a1f79814bc4c2d1d
  MODEL      FHEM
  NAME      Hausarbeit_counter
  NOTIFYDEV  .*(^Hausarbeit.* Alert$).*,.*(^Aufgabe_.*).*,.*(^Hausarbeit_.*).*,global,.*(^Aufgabe.* Alert$).*
  NR        75618
  NTFY_ORDER 50-Aufgabencounter
  STATE      4 / 0
  TYPE      DOIF
  VERSION    29460 2024-12-29 20:25:48
  eventCount 467
  OLDREADINGS:
  READINGS:
    2025-08-01 20:13:44  Aufgaben        0
    2025-08-01 20:17:03  Hausarbeiten    4
    2025-08-01 20:06:40  cmd            0
    2025-08-01 20:06:40  mode            enabled
    2025-08-01 20:06:40  state          initialized
  Regex:
    accu:
    bar:
    barAvg:
    collect:
    cond:
      :
        0:
          "^Hausarbeit.* Alert$" ^Hausarbeit.* Alert$
        1:
          "^Aufgabe.* Alert$" ^Aufgabe.* Alert$
    event_Readings:
      :
        Aufgaben:
          "^Aufgabe_.*" ^Aufgabe_.*
        Hausarbeiten:
          "^Hausarbeit_.*" ^Hausarbeit_.*
  attr:
    cmdState:
    wait:
    waitdel:
  condition:
    0          ::EventDoIf('^Hausarbeit.* Alert$',$hash,'',0)
    1          ::EventDoIf('^Aufgabe.* Alert$',$hash,'',0)
  do:
    0:
      0         
    1:
      0         
    2:
  event_Readings:
    Aufgaben  ::AggregateDoIf($hash,'#sum:a:','^Aufgabe_.*','counter')
    Hausarbeiten ::AggregateDoIf($hash,'#sum:a:','^Hausarbeit_.*','counter')
  helper:
    NOTIFYDEV  .*(^Hausarbeit.* Alert$).*,.*(^Aufgabe_.*).*,.*(^Hausarbeit_.*).*,global,.*(^Aufgabe.* Alert$).*
    event      checkall
    globalinit 1
    last_timer 0
    sleeptimer -1
    triggerDev Hausarbeit_counter
    triggerEvents:
      checkall
      Hausarbeiten: 4
    triggerEventsState:
      checkall
      Hausarbeiten: 4
  uiState:
  uiTable:
Attributes:
  alias      Zähler für Hausarbeiten
  do        always
  event-on-change-reading .*
  event_Readings Hausarbeiten:[#sum:a:"^Hausarbeit_.*":counter],
Aufgaben:[#sum:a:"^Aufgabe_.*":counter],
  room      Dummy
  stateFormat Hausarbeiten / Aufgaben
  timestamp-on-change-reading .*
  verbose    5

Ich habe in dem DOIF in dem gerechnet wird noch die zweite Gruppe (Aufgabe) hinzugefügt und sowohl für die Hausarbeiten als auch die Aufgabe jeweils ein Event ausgelöst wie es auch von der automatik passieren würde. Interessanterweise funktoniert es bei den Hausarbeiten mit dem Checkall, bei den Aufgaben nicht mal das.
Habe auch noch mal ein aktualisiertes List des Rechen-DOIF's angehangen.

Vielleicht kann ja hier jemand was daraus herauslesen.

So wie ich das commandref zu den eventReadings verstehe, erfolgt die Berechnung automatisch sobald eines der überwachten Devices/Readings sich ändert, egal was im DEF steht oder ob das DOIF irgendwie getriggert wird.


Warum reagieren die anderen DOIF-Devices auf Checkall DOIF-Device Hausarbeit_counter? Hier gibt es offenbar Abhängigkeiten, die ich nicht kenne.

Ich habe Folgendes definiert:


defmod Aufgabe_Fiesta dummy

setstate Aufgabe_Fiesta 2025-08-01 21:25:59 counter 2

und

defmod aggregat DOIF (["^Aufgabe_.*"])
attr aggregat event-on-change-reading .*
attr aggregat event_Readings Hausarbeiten:[#sum:a:"^Hausarbeit_.*":counter],\
Aufgaben:[#sum:a:"^Aufgabe_.*":counter],

setstate aggregat cmd_2
setstate aggregat 2025-08-01 21:25:59 Aufgaben 2
setstate aggregat 2025-08-01 21:25:59 Device Aufgabe_Fiesta
setstate aggregat 2025-08-01 21:24:36 Hausarbeiten 0
setstate aggregat 2025-08-01 21:30:14 cmd 2
setstate aggregat 2025-08-01 21:30:14 cmd_event aggregat
setstate aggregat 2025-08-01 21:30:14 cmd_nr 2
setstate aggregat 2025-08-01 21:24:36 mode enabled
setstate aggregat 2025-08-01 21:30:14 state cmd_2


Ein "setreading Aufgabe_Fiesta counter 2" führt zum obigen Ergebnis. Es funktioniert bei mir, wie programmiert.

Übrigens .* kann man sich am Ende einer Regex-Angabe im DOIF sparen.

PS. Offtopic-Posts werden in diesem Thread von mir sofort gelöscht.
Titel: Aw: Fhem/Perl-Funktion "Zählewenn" gesucht (2)
Beitrag von: Marko1976 am 01 August 2025, 23:29:26
Zitat von: Damian am 01 August 2025, 21:43:00Offtopic-Posts werden in diesem Thread von mir sofort gelöscht.
Dafür wäre ich dankbar, das verhindert jede Menge Ärger. Die zwei verfolgen mich regelrecht und tauchen früher oder später in allen meinen Beiträgen auf.

Zitat von: Damian am 01 August 2025, 21:43:00defmod Aufgabe_Fiesta dummy
Da habe ich ehrlich gesagt ein Problem mit, da von der Definition als DOIF andere Sachen abhängen. Es wird ja z.B. abhängig vom Reading days der Fall und damit der STATE unterschieden. Mir ist nicht bekannt, dass etwas ähnliches mit einem Dummy funktionieren würde ohne wieder ein zusätzliches notify zu nutzen.

Was mich wundert ist der Punkt, dass mein Counter-Device, was ja per eventReading lediglich die Summe aller counter-Readings der Hausarbeiten/Aufgaben-Devices berechnen soll, diese Berechnung nicht durchführt bzw. nur ausführt wenn das DEF aktualisiert wird. Ein solches Verhalten habe ich ehrlich gesagt noch nie gesehen.
Ist es falsch, dass die Berechnung bei Änderung einer der einzelnen Quellen reagiert? Ich habe es immer so verstanden, dass wenn sich irgendein überwachtes Reading ändert, das eventReading automatisch neu berechnet wird.

Hier mal zur Vollständigkeit ein List eines der Auslöser-DOIF's (sind alle gleich, bis auf den Punkt, dass einige statt mit Hausarbeit_... mit Aufgabe_... benannt sind. Funktionsschema ist aber bei allen gleich):
Internals:
  DEF        ## Kein Alarm
([Aufgabe_Fiesta:days] > 0)
    (setreading Aufgabe_Fiesta days [settings_hausarbeit:array_autocheck_marion]) (setreading Aufgabe_Fiesta counter 0)

## Alarm
DOELSEIF ([Aufgabe_Fiesta:days] eq 0)
    (setreading Aufgabe_Fiesta counter 1) (set Hausarbeit_counter checkall)

## Überfällig
DOELSEIF ([Aufgabe_Fiesta:days] < [settings_hausarbeit:array_autocheck_marion_overdue])
    (setreading Aufgabe_Fiesta counter 1)
  FUUID      687b7cb5-f33f-7706-71d4-0827295c0b1526b5
  FVERSION  98_DOIF.pm:0.294600/2024-12-29
  MODEL      FHEM
  NAME      Aufgabe_Fiesta
  NOTIFYDEV  global,settings_hausarbeit,Aufgabe_Fiesta
  NR        569
  NTFY_ORDER 50-Hausarbeit_Fiesta
  STATE      Alert
  TYPE      DOIF
  VERSION    29460 2024-12-29 20:25:48
  eventCount 38
  READINGS:
    2025-08-01 20:41:48  cmd            2.2
    2025-08-01 20:41:48  cmd_event      Aufgabe_Fiesta
    2025-08-01 20:41:48  cmd_nr          2
    2025-08-01 20:41:48  cmd_seqnr      2
    2025-08-01 20:41:48  counter        1
    2025-08-01 20:41:48  days            0
    2025-08-01 20:41:48  e_Aufgabe_Fiesta_days 0
    2025-08-01 19:47:31  mode            enabled
    2025-08-01 20:41:48  state          Alert
  Regex:
    accu:
    bar:
    barAvg:
    collect:
    cond:
      Aufgabe_Fiesta:
        0:
          days      ^Aufgabe_Fiesta$:^days:
        1:
          days      ^Aufgabe_Fiesta$:^days:
        2:
          days      ^Aufgabe_Fiesta$:^days:
      settings_hausarbeit:
        2:
          array_autocheck_marion_overdue ^settings_hausarbeit$:^array_autocheck_marion_overdue:
  attr:
    cmdState:
      0:
        None
      1:
        Alert
      2:
        Priority
    wait:
    waitdel:
  condition:
    0          ::ReadingValDoIf($hash,'Aufgabe_Fiesta','days') > 0
    1          ::ReadingValDoIf($hash,'Aufgabe_Fiesta','days') eq 0
    2          ::ReadingValDoIf($hash,'Aufgabe_Fiesta','days') < ::ReadingValDoIf($hash,'settings_hausarbeit','array_autocheck_marion_overdue')
  do:
    0:
      0          setreading Aufgabe_Fiesta days [settings_hausarbeit:array_autocheck_marion]
      1          setreading Aufgabe_Fiesta counter 0
    1:
      0          setreading Aufgabe_Fiesta counter 1
      1          set Hausarbeit_counter checkall
    2:
      0          setreading Aufgabe_Fiesta counter 1
    3:
  helper:
    NOTIFYDEV  global,settings_hausarbeit,Aufgabe_Fiesta
    event      days: 0
    globalinit 1
    last_timer 0
    sleeptimer -1
    timerdev  Aufgabe_Fiesta
    timerevent days: 0
    triggerDev Aufgabe_Fiesta
    timerevents:
      days: 0
      e_Aufgabe_Fiesta_days: 0
      counter: 1
      cmd_nr: 2
      cmd_seqnr: 1
      cmd: 2.1
      cmd_event: Aufgabe_Fiesta
      Alert
      cmd_nr: 2
      cmd_seqnr: 2
      cmd: 2.2
      cmd_event: Aufgabe_Fiesta
      Alert
    timereventsState:
      days: 0
      e_Aufgabe_Fiesta_days: 0
      counter: 1
      cmd_nr: 2
      cmd_seqnr: 1
      cmd: 2.1
      cmd_event: Aufgabe_Fiesta
      Alert
      cmd_nr: 2
      cmd_seqnr: 2
      cmd: 2.2
      cmd_event: Aufgabe_Fiesta
      Alert
    triggerEvents:
      days: 0
      e_Aufgabe_Fiesta_days: 0
      counter: 1
      cmd_nr: 2
      cmd_seqnr: 1
      cmd: 2.1
      cmd_event: Aufgabe_Fiesta
      Alert
      cmd_nr: 2
      cmd_seqnr: 2
      cmd: 2.2
      cmd_event: Aufgabe_Fiesta
      Alert
    triggerEventsState:
      days: 0
      e_Aufgabe_Fiesta_days: 0
      counter: 1
      cmd_nr: 2
      cmd_seqnr: 1
      cmd: 2.1
      cmd_event: Aufgabe_Fiesta
      Alert
      cmd_nr: 2
      cmd_seqnr: 2
      cmd: 2.2
      cmd_event: Aufgabe_Fiesta
      Alert
  internals:
  readings:
    all        Aufgabe_Fiesta:days settings_hausarbeit:array_autocheck_marion_overdue
  trigger:
  uiState:
  uiTable:
Attributes:
  alias      Wartung Fiesta
  cmdState  None|Alert|Priority
  group      Aufgaben
  room      Steuerung->Hausarbeiten
  verbose    0


Ich kann ehrlicherweise auch nie auseinanderhalten ob es sich um ein Fhem-DOIF handelt oder ein Perl-DOIF bzw. wann das Device dazwischen wechselt. Hatte schon häufiger Probleme das die Perl-Variante nicht funktionierte und es dann als neues Fhem-DOIF-Device lief. Gibt es da eine eindeutige Erkennbarkeit?
Titel: Aw: Fhem/Perl-Funktion "Zählewenn" gesucht (2)
Beitrag von: Damian am 02 August 2025, 00:09:05
Ich gehe davon aus, dass du dir Schleifen/Rekursionen eingebaut hast. So etwas wird vom FHEM-System unterbunden bevor es zu einer Endlosschleife wird.

([Aufgabe_Fiesta:days] > 0)
    (setreading Aufgabe_Fiesta days [settings_hausarbeit:array_autocheck_marion]) (setreading Aufgabe_Fiesta counter 0)


Hier reagierst du auf ein Reading "days", welches du selbst setzt - das kann nicht gutgehen. So etwas kann auch über mehrere DOIF passieren:

DOIF1 triggert DOIF2 triggert DOIF1

Das musst du verhindern. Ob man in einem dummy ein counter-Reading setzt oder in einem DOIF ist hier unerheblich. Wichtig ist nur, dass es immer nur in eine Richtung geht und keine Schleife entsteht, sprich dein Hausarbeit_counter-Device darf auf andere DOIF-Devices reagieren, diese dürfen aber nicht direkt oder indirekt auf Änderungen von Hausarbeit_counter-Device regieren.

In welchem DOIF-Modus sich ein DOIF-Device befindet siehst du am Internal Model, die Syntax ist unterschiedlich und in der Dokumentation genau beschrieben.

Du kannst dein Hausarbeit_counter-Device erst mal mit einem dummy-Device testen und dann Schritt für Schritt das Problem einkreisen. Dass es grundsätzlich funktioniert habe ich bei mir ja gezeigt.