[ERLEDIGT] DOIF: Wert für zeit X überschnitten

Begonnen von M.Piet, 18 März 2024, 14:12:37

Vorheriges Thema - Nächstes Thema

M.Piet

Moin,

ich möchte erreichen:
Eine Telegram bekommen, wenn die Abgastemperatur "test_Temp" für 5 Minuten über 300°C ist. Ebenso eine Nachricht, wenn "test_temp" wieder unter 300°C ist.

Einen Dummy bauen, der auf ON gesetzt wird, wenn die Temperatur auf 300C° oder höher ist,
Dann einen Watchdog gebaut, der den eben genannten Dummy für 5 Minuten triggert, und mir dann die Nachricht sendet.
Dann ein Notify, was mit direkt eine Nachricht schickt, wenn die Temperatur wieder unter 300°C fällt.

Ich frage mich grad, ob das auch ein wenig smarter mit einem DOIF geht. Kann man bei einem einzelnen DOIF ein Schwellwert (<300°C) und eine Zeit (5 Minuten) kombinieren?

Danke schön. :)

rabehd

Schwellwert triggert und im Zweig wird mit wait 5 min warten.
Wait wird abgebrochen, wenn der Trigger nicht mehr gültig ist.
Auch funktionierende Lösungen kann man hinterfragen.

Per

#2
DOIF ([sensor] > 300) ()
(send telegram high)
DOELSEIF ([$SELF:cmd_seqnr] == 2 and [sensor] < 300)(send telegram low)

attr wait 0,300:0

M.Piet

Oh, ich wusste, dass ich zu kompliziert gedacht habe. :)
Ich danke euch. Werde ich testen. :)

M.Piet

#4
Zitat von: Per am 18 März 2024, 14:56:37DOIF ([sensor] > 300) ()
(send telegram high)
DOELSEIF ([$SELF:cmd_seqnr] == 2 and [sensor] < 300)(send telegram low)

attr wait 0,300:0

Ich habe dein Beispiel mit einem Dummy zum testen umgesetzt.

Ich habe 2 Probleme, die ich nicht lösen kann:

Steigt der Wert über 300, wird sofort (und ohne Verzögerung) die Nachricht geschickt. Die Nachricht soll ja nur gesendet werden, wenn nach 5 Minuten der Wert höher als 300 ist.
Das DOELSEIF greift nicht, wenn der Wert wieder unter 300 fällt.

Danke für deine Hilfe. :)

Internals:
  CFGFN     
  DEF        ([TestDummy2:state] > 300) (set TelegramBot message @123456 TEST HIGH) DOELSEIF ([$SELF:cmd_seqnr] == 2 and [TestDummy2:state] < 300)(set TelegramBot message @123456 TEST LOW)
  FUUID      65f96cdf-f33f-8a41-328e-eb6ea7b381a1d973
  MODEL      FHEM
  NAME      Temperaturwarnung_DOIF_Telegram
  NOTIFYDEV  Temperaturwarnung_DOIF_Telegram,TestDummy2,global
  NR        487
  NTFY_ORDER 50-Temperaturwarnung_DOIF_Telegram
  STATE      initialized
  TYPE      DOIF
  VERSION    27740 2023-07-10 09:31:11
  eventCount 1
  READINGS:
    2024-03-19 11:45:52  cmd            0
    2024-03-19 11:45:52  mode            enabled
    2024-03-19 11:45:52  state          initialized
  Regex:
    accu:
    bar:
    barAvg:
    collect:
    cond:
      Temperaturwarnung_DOIF_Telegram:
        1:
          cmd_seqnr  ^Temperaturwarnung_DOIF_Telegram$:^cmd_seqnr:
      TestDummy2:
        0:
          state      ^TestDummy2$:^state:
        1:
          state      ^TestDummy2$:^state:
  attr:
    wait:
      0:
        0
        300
      1:
        0
  condition:
    0          ::ReadingValDoIf($hash,'TestDummy2','state') > 300
    1          ::ReadingValDoIf($hash,'Temperaturwarnung_DOIF_Telegram','cmd_seqnr') == 2 and ::ReadingValDoIf($hash,'TestDummy2','state') < 300
  do:
    0:
      0          set TelegramBot message @123456 TEST HIGH
    1:
      0          set TelegramBot message @123456 TEST LOW
    2:
  helper:
    NOTIFYDEV  Temperaturwarnung_DOIF_Telegram,TestDummy2,global
    globalinit 1
    last_timer 0
    sleeptimer -1
  readings:
    all        TestDummy2:state Temperaturwarnung_DOIF_Telegram:cmd_seqnr
  uiState:
  uiTable:
Attributes:
  room      Dummy
  wait      0,300:0




rabehd

Zitat von: M.Piet am 19 März 2024, 11:47:43Steigt der Wert über 300, wird sofort (und ohne Verzögerung) die Nachricht geschickt.
Klar, weil Du nicht alles kopiert hast oder nicht nachgedacht hast.
Deine Definition arbeitet korrekt.
Auch funktionierende Lösungen kann man hinterfragen.

Per

Wait muss 300,0:0 sein, hatte ich falsch.

rabehd

Auch funktionierende Lösungen kann man hinterfragen.

M.Piet

Zitat von: Per am 19 März 2024, 13:05:59Wait muss 300,0:0 sein, hatte ich falsch.
Ahhh. Danke. Nun geht es. Jetzt ergibt die Doku zu Wait auch einen Sinn für mich.

Aber mein zweites Problem habe ich noch.
Der DOELSEIF greif nicht, wenn der Wert unter 300 geht. Der DOIF bleibt bei "cmd_1" und welchelt nicht zu "cmd_2"
DOELSEIF ([$SELF:cmd_seqnr] == 2 and [TestDummy2:state] < 300)(set TelegramBot message @123456 TEST LOW)

rabehd

Zitat von: M.Piet am 19 März 2024, 13:23:50[$SELF:cmd_seqnr] == 2
Da ich damit hier nichts anfangen kann, würde ich hier eine Ursache vermuten.
Mein Lösungsversuch wäre ohne das.
Auch funktionierende Lösungen kann man hinterfragen.

M.Piet

Hallo Zusammen,

ich habe es letztendlich dank eurer Hilfe hinbekommen. Es funktioniert genauso wie es soll.

Schwellwert: 300
Zeit: 120

([DS18B20_DBDE84000003:cleanTemp] > 300) (set TelegramBot message @1234 Achtung! Abgastemperatur Holzvergaser zu hoch! Aktueller Wert [DS18B20_DBDE84000003:cleanTemp]°C) DOELSEIF ([DS18B20_DBDE84000003:cleanTemp] < 300) (set TelegramBot message @1234 Abgastemperatur Holzvergaser wieder normal)

Attr wait=120:0

holle75

Oh, @M.Piet, rein Interessehalber: welchen Holzvergaser hast du und wie zufrieden bist du mit ihm?