Hallo zusammen,
ich laufe mit meinem ersten DOIF direkt auf ein Problem, zu welchem ich bisher keine Lösung gefunden habe.
Problemstellung:
Wenn mein Ölbrenner die Fehlermeldung (ServiceCode) "548" liefert soll die Störung zurückgesetzt werden.
Hierzu habe ich folgendes DOIF definiert:
define di_gb125_svc DOIF { if ([":^serviceCodeNumber",0] == 548) {\
fhem_set "EMS_Bridge clearError";;\
set_Exec("timer",15,fhem_set "EMS_Bridge idle");;\
}\
}
attr di_gb125_svc DOIF_Readings serviceCode:([EMS_Boiler:serviceCode]),\
serviceCodeNumber:([EMS_Boiler:serviceCodeNumber]),\
flameCurr:([EMS_Boiler:flameCurr])
attr di_gb125_svc group GB125
attr di_gb125_svc loglevel 4
attr di_gb125_svc room GB125,Heizung (EMSbus),Heizung (Verbrauch)
attr di_gb125_svc stateFormat serviceCode/serviceCodeNumber (flameCurr)
attr di_gb125_svc verbose 5
# DEF { if ([":^serviceCodeNumber",0] == 548) {
# fhem_set "EMS_Bridge clearError";
# set_Exec("timer",15,fhem_set "EMS_Bridge idle");
# }
#}
# FUUID 65436bc4-f33f-6054-b2c7-39ac2a979f93ad9c
# MODEL Perl
# NAME di_gb125_svc
# NOTIFYDEV EMS_Boiler,.*().*,global
# NR 59544
# NTFY_ORDER 50-di_gb125_svc
# STATE 6L/548 (0)
# TYPE DOIF
# VERSION 27740 2023-07-10 09:31:11
# eventCount 33
# DOIF_Readings:
# flameCurr (::ReadingValDoIf($hash,'EMS_Boiler','flameCurr'))
# serviceCode (::ReadingValDoIf($hash,'EMS_Boiler','serviceCode'))
# serviceCodeNumber (::ReadingValDoIf($hash,'EMS_Boiler','serviceCodeNumber'))
# OLDREADINGS:
# READINGS:
# 2023-11-03 13:22:50 Device EMS_Boiler
# 2023-11-03 13:22:50 block_01 executed
# 2023-11-03 13:23:05 error in Please define EMS_Bridge first: Can't locate object method "EMS_Bridge" via package "first" (perhaps you forgot to load "first"?) at (eval 3520417) line 1.
#
# 2023-11-03 13:22:50 flameCurr 0
# 2023-11-03 08:36:07 mode enabled
# 2023-11-03 13:22:50 serviceCode 6L
# 2023-11-03 13:22:50 serviceCodeNumber 548
# 2023-11-03 08:36:07 state initialized
# Regex:
# DOIF_Readings:
# EMS_Boiler:
# flameCurr:
# flameCurr ^EMS_Boiler$:^flameCurr:
# serviceCode:
# serviceCode ^EMS_Boiler$:^serviceCode:
# serviceCodeNumber:
# serviceCodeNumber ^EMS_Boiler$:^serviceCodeNumber:
# accu:
# bar:
# barAvg:
# collect:
# cond:
# :
# 0:
# ":^serviceCodeNumber" :^serviceCodeNumber
# condition:
# 0 if (::EventDoIf('',$hash,'^serviceCodeNumber',0,'[^\:]*: (.*)','','0') == 548) {
# fhem_set "EMS_Bridge clearError";
# set_Exec("timer",15,fhem_set "EMS_Bridge idle");
# }
#
# helper:
# NOTIFYDEV EMS_Boiler,.*().*,global
# event serviceCodeNumber: 548
# globalinit 1
# last_timer 0
# sleeptimer -1
# triggerDev di_gb125_svc
# triggerEvents:
# serviceCode: 6L
# flameCurr: 0
# serviceCodeNumber: 548
# timer_timer: 03.11.2023 13:23:05
# triggerEventsState:
# serviceCode: 6L
# flameCurr: 0
# serviceCodeNumber: 548
# internals:
# perlblock:
# 0 block_01
# ptimer:
# timer:
# count 0
# name timer
# sec 15
# subname Please define EMS_Bridge first
# time 1699014185.45546
# hash:
# readings:
# trigger:
# uiState:
# uiTable:
#
setstate di_gb125_svc 6L/548 (0)
setstate di_gb125_svc 2023-11-03 13:22:50 Device EMS_Boiler
setstate di_gb125_svc 2023-11-03 13:22:50 block_01 executed
setstate di_gb125_svc 2023-11-03 13:23:05 error in Please define EMS_Bridge first: Can't locate object method "EMS_Bridge" via package "first" (perhaps you forgot to load "first"?) at (eval 3520417) line 1.\
setstate di_gb125_svc 2023-11-03 13:22:50 flameCurr 0
setstate di_gb125_svc 2023-11-03 08:36:07 mode enabled
setstate di_gb125_svc 2023-11-03 13:22:50 serviceCode 6L
setstate di_gb125_svc 2023-11-03 13:22:50 serviceCodeNumber 548
setstate di_gb125_svc 2023-11-03 08:36:07 state initialized
Das Device "EMS_Bridge" hat die setList "idle,clearWarning,clearError" und lässt sich via WebInterface setzen.
Das DEF habe ich nach bestem Wissen aus der Beschreibung abgeleitet.
Allerdings ist mir nicht klar warum ich die Warnung
Can't locate object method "EMS_Bridge" via package "first"
erhalte.
(Die Semikolon im DEF-Block hat mir der FHEM Export verdoppelt).
Wo liegt mein Fehler?
Hmm, kann der Fehler daran liegen dass es sich bei "EMS_Bridge" um einen Alias für das MQTT-Device "MQTT2_ems_esp" handelt?
Kannst du den set Befehl in der Befehlszeile fehlerfrei absenden?
Und warum hast du einen sooo globalen Eventfilter definiert? Das erzeugt unnötig Last. Dabei ist das doch nur ein Gerät/Device, was abgefragt wird.
Zitat von: SusisStrolch am 03 November 2023, 13:40:39Problemstellung:
Wenn mein Ölbrenner die Fehlermeldung (ServiceCode) "548" liefert soll die Störung zurückgesetzt werden.
Das klingt nach einem simplen notify.
Warum braucht man dafür ein DOIF?
Zitat von: Per am 03 November 2023, 14:00:26Kannst du den set Befehl in der Befehlszeile fehlerfrei absenden?
Nope - daher kam ich ja drauf dass ich den Alias anstatt des Devicenamens verwendet habe...
ZitatUnd warum hast du einen sooo globalen Eventfilter definiert? Das erzeugt unnötig Last. Dabei ist das doch nur ein Gerät/Device, was abgefragt wird.
Versuchsaufbau, 1. Iteration
Zitat von: betateilchen am 03 November 2023, 15:20:48Zitat von: SusisStrolch am 03 November 2023, 13:40:39Problemstellung:
Wenn mein Ölbrenner die Fehlermeldung (ServiceCode) "548" liefert soll die Störung zurückgesetzt werden.
Das klingt nach einem simplen notify.
Warum braucht man dafür ein DOIF?
Weil ich das DOIF mal ausprobieren wollte...
Aber wenn es schon in der Kommandozeile nicht geht, kann doch DOIF nicht schuld sein.
Kommandozeile habe ich doch erst probiert nachdem diese Fehlermeldung aufgetreten ist..