Hallo,
ich habe folgendes Scenario was ich mir aus einem Internetblog quasi kopiert habe.
Ich habe einen google Kalender in dem ich diverse Events eintrage. Nun sollen gewisse dummys im FHEM bei den EVENTS geschalten werden.
Irgendwie funktioniert das ganze aber nicht, da scheinbar der notofy das nicht aauber übergibt. Ich bekomme im Log folgende Meldungen:
2020.12.23 10:43:00 3: get Kalender_Google_FHEMSSTEUERUNG events limit:count=1 format:custom="$S" filter:uid=="7g7g4rah79kohoa8u200j7k2oagooglecom" : POOLFILTER
2020.12.23 10:43:00 1: ERROR evaluating my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $NAME= $evalSpecials->{'%NAME'};my $SELF= $evalSpecials->{'%SELF'};my $TYPE= $evalSpecials->{'%TYPE'};{ KalenderAktion($EVTPART0, $EVTPART1) }: Can't locate object method "true" via package "POOLFILTER" (perhaps you forgot to load "POOLFILTER"?) at ./FHEM/99_MyUtils.pm line 38.
2020.12.23 10:43:00 3: notify_Kalender_Google_FHEMSSTEUERUNG return value: Can't locate object method "true" via package "POOLFILTER" (perhaps you forgot to load "POOLFILTER"?) at ./FHEM/99_MyUtils.pm line 38.
Hat ggf jemand eine Idee warum er das EVTPart0 und EVTPART1 nicht in der MyUtils auswerten kann?
hier enoch ein list der Devices bzw meine 99_MyUtils.
nternals:
CFGFN
DEF Kalender_Google_FHEMSSTEUERUNG:(start|end):.* { KalenderAktion($EVTPART0, $EVTPART1) }
FUUID 5fe30e6c-f33f-34fb-c2b3-ca6599d9692fe74d
NAME notify_Kalender_Google_FHEMSSTEUERUNG
NR 621
NTFY_ORDER 50-Kalender_Google_FHEMSSTEUERUNG_notify_1
REGEXP Kalender_Google_FHEMSSTEUERUNG:(start|end):.*
STATE 2020-12-23 10:43:00
TRIGGERTIME 1608716580.01071
TYPE notify
Helper:
DBLOG:
state:
DBLogging:
TIME 1608715884.6819
VALUE active
READINGS:
2020-12-23 10:32:48 state active
Attributes:
DbLogExclude .*
alias notify_Kalender_Google_FHEMSSTEUERUNG
room ,SYSTEM->LOGIK->NOTIFY
package main;
use strict;
use warnings;
use POSIX;
sub
MyUtils_Initialize($$)
{
my ($hash) = @_;
}
#
# Kalenderfunktion zur zeitgesteuerten Schaltung von Devices
#
sub
KalenderAktion($$)
{
my ($KalenderEreignis, $KalenderUids) = @_;
my @uids=split(/;/,$KalenderUids);
my $aktion;
my @DeviceList = ("POOLFILTER","BESUCH"); #Einträge im Kalender
my @DeviceNames = ("pool.steuerung.timer.dummy", "duGast"); #?~\bersetzung zum Device
if($KalenderEreignis eq "start:") { $aktion = "on" } else { $aktion = "off" }
#falls mehrere Termine gleichzeitig starten, diese nun durchlaufen
foreach my $uid (@uids)
{
#Summary auslesen und prüfen, ob es sich um ein Device handelt
#my $Device = fhem("get Kalender_Google_FHEMSSTEUERUNG summary $uid");
my $Device = fhem("get Kalender_Google_FHEMSSTEUERUNG events limit:count=1 format:custom=\"\$S\" filter:uid==\"$uid\"");
#falls das Device existiert, so wie es im Kalender steht kann die Schaltung direkt erfolgen
if( defined($defs{$Device}) )
{ fhem("set $Device $aktion"); }
else
{
#wenn ein entsprechendes Device gefunden wird
if (true { /$Device/ } @DeviceList)
{ fhem("set $DeviceNames[ first_index { /$Device/ } @DeviceList ] $aktion"); }
}
}
}
1;
Hi,
zum Ersten der Hinweis: Übergib nicht $EVTPART sondern den kompletten $EVENT! $EVTPART ist uU problematisch.
Zum Zweiten: Die Fehlermeldung liegt primär an diesem Ausdruck if (true { /$Device/ } @DeviceList)
den versteh ich nicht. :-[ Ich kenne dieses Konstrukt in Perl nicht.
Dein finaler FHEM Befehl:
Ich kenne auch die function first_index nicht.
Ich denke auch nicht, dass Du Dein Array @Devicelist an den FHEM Befehl so übergeben kannst.
Du solltest die Perl Befehle einzeln testen, bevor Du es komplett zusammenpackst.
Das Beispiel aus der Doku zum Calendar "Schalte Aktoren an und aus" wolltest Du nicht einfach nachbauen? Das macht doch genau das was Du willst? Das kannst Du auch in die myUtils umsetzen.
https://fhem.de/commandref_DE.html#Calendar
Gruß Otto
Zusaetzlich(!) wuerde mich interessieren, woher die Hypothese kommt, dass notify was nicht uebergeben wuerde.
Aus der Fehlermeldungen kann ich das nicht ableiten.
Drum ist das erste was ich in der Sub mache: Logausgabe was "rein kommt"... ;)
Ebenso Logausgaben aller Variablen/Werte die ich "zusammenbastle" oder auslese...
Und wenn es dann funktioniert kann man die ja wieder auskommentieren...
Gruß, Joachim
danke euch, werd es mal einzeln nachstellen und mit Logausgaben versehen. Denke auch ich werd es direkt im Notify abhandeln und nicht in die S99_MyUtils auslagern. Sehe irgendwie darin momentan keinen Vorteil.
Wo denkst du liegt der Unterschied zu direkt im notify?
Ich sehe keinen Vorteil das direkt im notify zu machen...
...ich (persönlich) finde eine "Auslagerung" in myUtils deutlich "übersichtlicher"...
(und ich kann am "Programm schrauben" ohne ständug die fhem.cfg zu ändern)
Viel Erfolg, Joachim
Noch zu der ursprünglichen Aussage: "notify übergibt nicht ..." (was wahrscheinlich nicht stimmt) noch die Hilfestellung mit fürs Loggen. Das haben wir auch extra mal im Wiki zusammengetragen:
https://wiki.fhem.de/wiki/Notify
Und ich hatte hier (https://heinz-otto.blogspot.com/2019/01/kalender-in-fhem-auf-bestimmte-termine.html)auch mal ein paar Aktionen direkt aus dem Kalender umgesetzt.
Zitat von: Otto123 am 23 Dezember 2020, 11:09:35
Ich kenne auch die function first_index nicht.
Das ist eine perl Standardfunktion aus dem Bereich array-Verarbeitung.
Man kann das schon alles so ähnlich machen wie vom TE per copy&paste versucht. Man sollte das aber nur so machen, wenn man auch versteht, was man da tut und vor allem, wenn man versteht, was der zusammenkopierte Code tut.
Das Problem ist doch hier gar nicht, dass $EVTPARTx nicht übergeben wird, sondern dass versucht wird, mit Methoden zu arbeiten, die es in dem Anwendungsfall schlichtweg nicht gibt. Steht doch auch eindeutig in der Fehlermeldung.
return value: Can't locate object method "true" via package "POOLFILTER" (perhaps you forgot to load "POOLFILTER"?)