Hauptmenü

DOIF mit ReadingsAge

Begonnen von R3Pi, 12 Juli 2023, 08:21:38

Vorheriges Thema - Nächstes Thema

R3Pi

Hallo erst mal!

Zu Anfang will ich nur loswerden, dass ich mir alles selbst bei gebracht habe und alles andere als ein Profi bin. Ich konnte schon vieles durch suchen, lesen und versuchen verstehen und anwenden aber jetzt stehe ich auf dem Schlauch.

Zum Problem:
Ich habe meine Heizung per USB auf RS232 Adapter in mein System integriert. Fhem läuft auf einem virtuellem RPi und der Adapter wird durchgereicht. -Soweit, so gut-
Jetzt kommt es aber sporadisch vor, dass der Adapter keine Daten mehr liefert. Dann muss ich ihn in der virtuellen Maschine entkoppeln und neu koppeln. (Bis ich weiß wie ich das automatisieren kann :P )
Um nicht dauernd nachsehen zu müssen ob die Verbindung noch steht habe ich mir gedacht ich mache mir ein DOIF, lese die Zeit seit der letzten Aktualisierung der Werte aus und bei Überschreitung der Dauer sendet mir der Telegram-Messenger eine Nachricht.
Sieht so aus:
define modbus_ausfall DOIF (ReadingsAge("Froeling","Pufferladezustand","") > 180)(set MessageBot message @Patrick_Repolusk Modbus Timeout)
attr modbus_ausfall room Modbus
#   DEF        (ReadingsAge("Froeling","Pufferladezustand","") > 180)(set MessageBot message @Patrick_Repolusk Modbus Timeout)
#   FUUID      649154ad-f33f-e391-e951-2c99465552598d36
#   MODEL      FHEM
#   NAME       modbus_ausfall
#   NOTIFYDEV  global
#   NR         309
#   NTFY_ORDER 50-modbus_ausfall
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    26703 2022-11-14 16:43:41
#   eventCount 7
#   READINGS:
#     2023-07-12 07:59:02   cmd             0
#     2023-07-12 07:59:02   mode            enabled
#     2023-07-12 07:59:02   state           initialized
#   Regex:
#     accu:
#     collect:
#   attr:
#     cmdState:
#     wait:
#     waitdel:
#   condition:
#     0          ReadingsAge("Froeling","Pufferladezustand","") > 180
#   do:
#     0:
#       0          set MessageBot message @Patrick_Repolusk Modbus Timeout
#     1:
#   helper:
#     NOTIFYDEV  global
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#   uiState:
#   uiTable:
#
setstate modbus_ausfall initialized
setstate modbus_ausfall 2023-07-12 07:59:02 cmd 0
setstate modbus_ausfall 2023-07-12 07:59:02 mode enabled
setstate modbus_ausfall 2023-07-12 07:59:02
state initialized


Funktioniert aber nicht. Mit checkall wird aber eine Nachricht gesendet.
Ich hoffe mir kann hier jemand helfen. Vielleicht auch wie man den Adapter automatisch neu verbindet ;)
Danke schon mal
Man kann alles automatisieren, außer das Automatisieren

Damian

Damit das Modul etwas machen kann, braucht es einen Auslöser, also einen Trigger. Den hast du hier aber nicht, denn eine Funktion triggert von sich aus nicht. Trigger werden im DOIF in eckigen Klammern angegeben. Zum Timeout gibt hier ein Beispiel: https://fhem.de/commandref_DE.html#DOIF_do_resetwait
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

RalfRog

Den Trigger löst ggfs. das Reading Pufferladezustand selber aus.
Das Problem wäre im Fehlerzustand aber, dass es keine Events (Trigger) mehr gibt.

Möglicherweise ist es einfacher per AT alle 180 sek. Zu prüfen ob das Reading aktualisiert wurde.
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

Damian

Zitat von: RalfRog am 12 Juli 2023, 10:41:10Den Trigger löst ggfs. das Reading Pufferladezustand selber aus.

ReadingsAge als Trigger gibt es so natürlich nicht, da zum Zeitpunkt der Äderung des Readings ist ja ReadingsAge gleich Null.

Das Problem lässt sich aber leicht mit wait lösen:

DOIF ([Froeling:"^Pufferladezustand"])(set MessageBot message @Patrick_Repolusk Modbus Timeout)

attr wait 180
attr do resetwait

Zyklisches Abfragen nach dem Alter des Readings geht natürlich auch:

DOIF ([+:01] and ReadingsAge("Froeling","Pufferladezustand","") > 180)(set MessageBot message @Patrick_Repolusk Modbus Timeout)

attr do always
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

R3Pi

Zitat von: Damian am 12 Juli 2023, 09:46:26Damit das Modul etwas machen kann, braucht es einen Auslöser, also einen Trigger. Den hast du hier aber nicht, ...

Natürlich!🤦🏻�♂️
Tja, ich komme aus der SPS-Programmierung und vergesse oft, dass es dort zyklische Abarbeitungen gibt..

Zitat von: Damian am 12 Juli 2023, 10:53:13Zyklisches Abfragen nach dem Alter des Readings geht natürlich auch:

DOIF ([+:01] and ReadingsAge("Froeling","Pufferladezustand","") > 180)(set MessageBot message @Patrick_Repolusk Modbus Timeout)

attr do always

So funktioniert es dann.

Danke vielmals
Man kann alles automatisieren, außer das Automatisieren

R3Pi

Hat noch jemand eine Idee wie man den Adapter automatisch neu verbinden kann??
Man kann alles automatisieren, außer das Automatisieren

Damian

Zitat von: R3Pi am 12 Juli 2023, 13:41:54Hat noch jemand eine Idee wie man den Adapter automatisch neu verbinden kann??

Die Frage zum Modbus-Device musst du im entsprechenden Board stellen. Besser aber dort klären warum die Verbindung verloren geht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF