Ich erhalte bei meiner Testfunktion die Fehlermeldung:
Undefined subroutine &main::set_Reading_Begin called at (eval 2402) line 1.
Ich habe mir diese Testfunktion erstellt, da ich in einer größeren Funktion die Fehlermeldung erhalten habe, nachdem ich von fhem("setreading......") umstellen wollte auf set_Reading.
laut Wiki sollte es gehen. https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Setzen_mehrerer_Readings_des_eigenen_DOIF-Devices_in_einem_Eventblock (https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Setzen_mehrerer_Readings_des_eigenen_DOIF-Devices_in_einem_Eventblock)
FHEM habe ich gerade zur Sicherheit frisch aktualisiert mit dem selben Ergebniss.
define DOIF_Test DOIF ([+60] )\
{\
set_Reading_Begin();;\
set_Reading_Update("test",0);;\
set_Reading_End(1);;\
}
attr DOIF_Test DbLogExclude .*
# CFGFN
# DEF ([+60] )
#{
#set_Reading_Begin();
# set_Reading_Update("test",0);
#set_Reading_End(1);
#}
# FUUID 648960ef-f33f-ae17-9d66-5d843dba2376ac41
# MODEL FHEM
# NAME DOIF_Test
# NOTIFYDEV global
# NR 485
# NTFY_ORDER 50-DOIF_Test
# STATE cmd_1
# TYPE DOIF
# VERSION 27616 2023-05-25 17:55:36
# eventCount 8
# READINGS:
# 2023-06-14 08:45:15 cmd 1
# 2023-06-14 08:45:15 cmd_event set_cmd_1
# 2023-06-14 08:45:15 cmd_nr 1
# 2023-06-14 08:45:15 error { set_Reading_Begin(); set_Reading_Update("test",0); set_Reading_End(1); }: Undefined subroutine &main::set_Reading_Begin called at (eval 2787) line 1.
#
# 2023-06-14 08:45:12 mode enabled
# 2023-06-14 08:45:15 state cmd_1
# 2023-06-14 08:46:12 timer_01_c01 14.06.2023 08:47:12
# Regex:
# accu:
# bar:
# barAvg:
# collect:
# attr:
# cmdState:
# waitdel:
# condition:
# 0 ::DOIF_time_once($hash,0,$wday)
# days:
# do:
# 0:
# 0 { set_Reading_Begin(); set_Reading_Update("test",0); set_Reading_End(1); }
# 1:
# helper:
# NOTIFYDEV global
# event timer_1
# globalinit 1
# last_timer 1
# sleeptimer -1
# timerdev
# timerevent timer_1
# triggerDev
# DOIF_eventa:
# cmd_nr: 1
# cmd: 1
# cmd_event: set_cmd_1
# error: { set_Reading_Begin(); set_Reading_Update("test",0); set_Reading_End(1); }: Undefined subroutine &main::set_Reading_Begin called at (eval 2787) line 1.
#
# cmd_1
# DOIF_eventas:
# cmd_nr: 1
# cmd: 1
# cmd_event: set_cmd_1
# error: { set_Reading_Begin(); set_Reading_Update("test",0); set_Reading_End(1); }: Undefined subroutine &main::set_Reading_Begin called at (eval 2787) line 1.
#
# state: cmd_1
# timerevents:
# timer_1
# timereventsState:
# timer_1
# triggerEvents:
# timer_1
# triggerEventsState:
# timer_1
# interval:
# intervalfunc:
# localtime:
# 0 1686725232
# realtime:
# 0 08:47:12
# time:
# 0 +60
# timeCond:
# 0 0
# timer:
# 0 0
# timers:
# 0 0
# triggertime:
# 1686725232:
# localtime 1686725232
# hash:
# uiState:
# uiTable:
#
setstate DOIF_Test cmd_1
setstate DOIF_Test 2023-06-14 08:45:15 cmd 1
setstate DOIF_Test 2023-06-14 08:45:15 cmd_event set_cmd_1
setstate DOIF_Test 2023-06-14 08:45:15 cmd_nr 1
setstate DOIF_Test 2023-06-14 08:45:15 error { set_Reading_Begin();; set_Reading_Update("test",0);; set_Reading_End(1);; }: Undefined subroutine &main::set_Reading_Begin called at (eval 2787) line 1.\
setstate DOIF_Test 2023-06-14 08:45:12 mode enabled
setstate DOIF_Test 2023-06-14 08:45:15 state cmd_1
setstate DOIF_Test 2023-06-14 08:46:12 timer_01_c01 14.06.2023 08:47:12
Aufgrund deiner Definition befindest du dich im DOIF-FHEM-Modus, siehe Internal:
MODEL FHEM
Die genannten DOIF-Funktionen gibt es nur im DOIF-Perlmodus. Der Aufbau der Definition ist da anders als im FHEM-Modus.
Bereits mit dem Beginn der Definition "DOIF (..." bist du schon im FHEM-Modus. Im Perl-Modus definiert man Ereignisblöcke, diese werden mit geschweiften Klammern definiert, siehe Doku zum Perl-Modus.
hm?
([+60] )
{
set_Reading_Begin();
set_Reading_Update("test",0);
set_Reading_End(1);
}
ich dachte mit {} arbeite ich im Perlmodus? Andere Perl Befehle und if funktionieren doch so auch?
Zitat von: andi11 am 14 Juni 2023, 08:56:47hm?
([+60] )
{
set_Reading_Begin();
set_Reading_Update("test",0);
set_Reading_End(1);
}
ich dachte mit {} arbeite ich im Perlmodus? Andere Perl Befehle und if funktionieren doch so auch?
Nein, du hast eine Bedingung in runden Klammern und einen Ausführungsblock in Perl in geschweiften Klammern - das ist noch kein Perl-Modus. Der Perlmodus hat keine Bedingungen in runden Klammern.
Das wäre eine Definition im Perl-Modus:
{
[+60];
set_Reading_Begin();
set_Reading_Update("test",0);
set_Reading_End(1);
}
Für ein Reading ist das übrigens das Gleiche wie:
{
[+60];
set_Reading("test",0,1);
}