FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: SusisStrolch am 03 November 2023, 13:40:39

Titel: DOIF - Can't locate object method "EMS_Bridge" via package "first"
Beitrag von: SusisStrolch am 03 November 2023, 13:40:39
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?

Titel: Aw: DOIF - Can't locate object method "EMS_Bridge" via package "first"
Beitrag von: SusisStrolch am 03 November 2023, 13:56:55
Hmm, kann der Fehler daran liegen dass es sich bei "EMS_Bridge" um einen Alias für das MQTT-Device "MQTT2_ems_esp" handelt?
Titel: Aw: DOIF - Can't locate object method "EMS_Bridge" via package "first"
Beitrag von: Per am 03 November 2023, 14:00:26
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.
Titel: Aw: DOIF - Can't locate object method "EMS_Bridge" via package "first"
Beitrag von: betateilchen am 03 November 2023, 15:20:48
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?
Titel: Aw: DOIF - Can't locate object method "EMS_Bridge" via package "first"
Beitrag von: SusisStrolch am 03 November 2023, 17:14:36
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
Titel: Aw: DOIF - Can't locate object method "EMS_Bridge" via package "first"
Beitrag von: SusisStrolch am 03 November 2023, 17:17:46
Zitat von: betateilchen am 03 November 2023, 15:20:48
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?
Weil ich das DOIF mal ausprobieren wollte...
Titel: Aw: DOIF - Can't locate object method "EMS_Bridge" via package "first"
Beitrag von: Per am 03 November 2023, 17:34:43
Aber wenn es schon in der Kommandozeile nicht geht, kann doch DOIF nicht schuld sein.
Titel: Aw: DOIF - Can't locate object method "EMS_Bridge" via package "first"
Beitrag von: SusisStrolch am 03 November 2023, 18:52:11
Kommandozeile habe ich doch erst probiert nachdem diese Fehlermeldung aufgetreten ist..