erledigt -> error bei sub Aufruf aus DOIF {perl}"Undefined subroutine &DOIF::lap

Begonnen von diegula, 20 Juni 2021, 12:07:47

Vorheriges Thema - Nächstes Thema

diegula

Servus zusammen,
hoffe jemand kann kurz unterstützen.

Ich habe ein Dummy wessen Readings mir Auskunft über alle im System befindenden Lampen(IKEA via HUE, ESPs + Relais, HM-Schaltaktor) geben soll.
Readings:

  • gesamt Anzahl
  • gesamt an
  • gesamt aus
  • gesamt an ohne timer
  • Namen der an + ohne Timer

Die Readings werden aus einer sub befühlt die in der 99_myUtils.pm ausgelagert ist.

Aufruf der sub erfolgt aus at(jede Minute) und zusätzlich aus einer DOIF(alle Lampen aus/alle Lampen an).

Bei Aufruf der sub aus dem at ist alles ok.
Beim Aufruf aus dem DOIF bekomme ich im DOIF ein error-Reading.

Weiß jemand wo das Problem ist?
Fehlermeldung ist im list vom DOIF im "error"-Reading

Danke im Voraus

Dummy

Internals:
   FUUID      xxx
   NAME       127_info_lmp_sys_dum
   NR         119
   STATE      off
   TYPE       dummy
   .attraggr:
   .attrminint:
   READINGS:
     2021-06-20 12:04:38   allLights       14
     2021-06-20 12:04:38   noTimer         0
     2021-06-20 12:04:38   noTimerName     WithOutTimer-
     2021-06-20 12:04:38   offLights       12
     2021-06-20 12:04:38   onLights        2
     2021-06-13 22:30:28   power           on/off
     2021-06-20 11:44:47   state           off
Attributes:
   DbLogExclude .*
   alias      Licht Status all
   devStateIcon on:general_an@green off:general_aus@red
   icon       FS20.on
   room       Info,Lights,System
   setList    on off


AT

Internals:
   CFGFN     
   COMMAND    {lampenstatus()}
   DEF        +*00:01 {lampenstatus()}
   FUUID      xxx
   NAME       at_lights_status
   NR         27831
   NTM        12:01:38
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      Next: 12:01:38
   TIMESPEC   00:01
   TRIGGERTIME 1624183298.70628
   TRIGGERTIME_FMT 2021-06-20 12:01:38
   TYPE       at
   .attraggr:
   .attreocr:
     .*
   .attrminint:
   Helper:
     DBLOG:
       state:
         logdb:
           TIME       1623969782.32213
           VALUE      Next: 00:01:00
   READINGS:
     2021-06-20 12:00:38   state           Next: 12:01:38
Attributes:
   DbLogExclude .*
   alias      lichter status aktualisieren
   event-on-change-reading .*
   icon       clock
   room       Lights,System


DOIF

Internals:
   .AttrList  disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiState:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
   DEF        {
if ([127_info_lmp_sys_dum:"^on$"]) 
{
fhem_set(".*ikea:FILTER=subType=.*dimmer on");
fhem_set(".*relais_lmp.*esp on");
fhem_set("087_pwr_sw_bad_hm datapoint 2.STATE 1");
set_Exec("reload_status",7,'lampenstatus()');
}
if ([127_info_lmp_sys_dum:"^off$"])
{
fhem_set(".*ikea:FILTER=subType=.*dimmer off");
fhem_set(".*relais_lmp.*esp off");
fhem_set("087_pwr_sw_bad_hm datapoint 2.STATE 0");
set_Exec("reload_status",7,'lampenstatus()');
}
}
   FUUID      xxx
   MODEL      Perl
   NAME       128_info_lmp_sys_doif
   NOTIFYDEV  127_info_lmp_sys_dum,global
   NR         120
   NTFY_ORDER 50-128_info_lmp_sys_doif
   STATE      initialized
   TYPE       DOIF
   VERSION    24570 2021-06-02 22:25:40
   .attraggr:
   .attreocr:
     .*
   .attrminint:
   READINGS:
     2021-06-20 12:01:38   Device          127_info_lmp_sys_dum
     2021-06-20 12:01:38   block_01        executed
     2021-06-20 12:01:38   e_127_info_lmp_sys_dum_events noTimerName: WithOutTimer-
     2021-06-20 11:44:54   error           in lampenstatus(): Undefined subroutine &DOIF::lampenstatus called at (eval 105319) line 1.

     2021-06-20 11:44:05   mode            enabled
     2021-06-20 11:44:05   state           initialized
   Regex:
     accu:
     collect:
     cond:
       127_info_lmp_sys_dum:
         0:
           &STATE     ^127_info_lmp_sys_dum$
   condition:
     0         
if (::EventDoIf('127_info_lmp_sys_dum',$hash,'^on$',1)) 
{
fhem_set(".*ikea:FILTER=subType=.*dimmer on");
fhem_set(".*relais_lmp.*esp on");
fhem_set("087_pwr_sw_bad_hm datapoint 2.STATE 1");
set_Exec("reload_status",7,'lampenstatus()');
}
if (::EventDoIf('127_info_lmp_sys_dum',$hash,'^off$',1))
{
fhem_set(".*ikea:FILTER=subType=.*dimmer off");
fhem_set(".*relais_lmp.*esp off");
fhem_set("087_pwr_sw_bad_hm datapoint 2.STATE 0");
set_Exec("reload_status",7,'lampenstatus()');
}

   helper:
     DEVFILTER  ^global$|^127_info_lmp_sys_dum$
     NOTIFYDEV  global|127_info_lmp_sys_dum
     event      noTimerName: WithOutTimer-
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev 127_info_lmp_sys_dum
     triggerEvents:
       noTimerName: WithOutTimer-
     triggerEventsState:
       noTimerName: WithOutTimer-
   internals:
   perlblock:
     0          block_01
   ptimer:
     reload_status:
       count      0
       name       reload_status
       sec        7
       subname    lampenstatus()
       time       1624182294.39723
       hash:
   readings:
   trigger:
     all         127_info_lmp_sys_dum
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   alias      DOIF für Lichter Status
   disable    0
   event-on-change-reading .*
   icon       logic
   room       Lights,System


SUB

##############################################
# $Id: myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# hier subs einfügen
sub
lampenstatus()
{
my @geraetIKEA = devspec2array('.*ikea:FILTER=subType=.*dimmer'); #alle IKEA-Lampen def's in arry @gerartIKEA
my @geraetESP = devspec2array('.*relais_lmp.*esp'); #alle ESP-Lampen def's in arry @gerartESP
my @geraetHM = devspec2array('087_pwr_sw_bad_hm'); #alle HM-Lampen def's in arry @gerartHM
my $an = 0; #Zähler aller Lampen die an sind
my $aus = 0; #Zähler aller Lampen die aua sind
my $noTimer = 0; #Zähler aller Lampen die an + keiner Timer läuft
my $noTimerName = "WithOutTimer-"; #alle Namen der Lampen die an + keiner Timer läuft
my $ges =0;#Zähler aller Lampen
foreach ( @geraetIKEA )  #befüllen der Variabeln für IKEA Lampen
{if (ReadingsNum($_,"onoff",0) == 0) {$aus++; $ges++} else {$an++; $ges++;
if (ReadingsNum($_,"timer",0) == 0) {$noTimer++; $noTimerName.=$_} }};
foreach ( @geraetESP )  #befüllen der Variabeln für ESP Lampen
{if (ReadingsVal($_,"pwr","off") eq "off") {$aus++; $ges++} else {$an++; $ges++;
if (ReadingsNum($_,"timer",0) == 0) {$noTimer++; $noTimerName.=$_} }};
foreach ( @geraetHM )  #befüllen der Variabeln für HM Lampen
{if (ReadingsVal($_,"2.STATE","off") eq "off") {$aus++; $ges++} else {$an++; $ges++;
if (ReadingsNum($_,"timer",0) == 0) {$noTimer++; $noTimerName.=$_} }};
#Ergebnisse in dummy schreiben
fhem("setreading 127_info_lmp_sys_dum allLights $ges;
setreading 127_info_lmp_sys_dum onLights $an;
setreading 127_info_lmp_sys_dum offLights $aus;
setreading 127_info_lmp_sys_dum noTimer $noTimer;
setreading 127_info_lmp_sys_dum noTimerName $noTimerName");
}

1;


Fhem auf Raspberry Pi 4 ,  Homematic, CCU2, Fritz!Box, Dblog/mySQL, HUEDevice + Tradfri, ESP's

Damian

Die Subroutine lampenstatus befindet sich nicht im DOIF-Package, sondern im main-Package, daher muss der Aufruf mit ::lampenstatus erfolgen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

diegula

Fhem auf Raspberry Pi 4 ,  Homematic, CCU2, Fritz!Box, Dblog/mySQL, HUEDevice + Tradfri, ESP's