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;
Die Subroutine lampenstatus befindet sich nicht im DOIF-Package, sondern im main-Package, daher muss der Aufruf mit ::lampenstatus erfolgen.