[gelöst] Perlmodus Undefined subroutine &main::set_Reading_Begin

Begonnen von andi11, 14 Juni 2023, 08:46:50

Vorheriges Thema - Nächstes Thema

andi11

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

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


Damian

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.

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

andi11

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?

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#4
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);
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF