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
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
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.
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
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
Hat noch jemand eine Idee wie man den Adapter automatisch neu verbinden kann??
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.