Um die Anzahl an Notify-Definitionen in FHEM zu reduzieren habe ich etwas experimentiert, so dass die Logik nicht mehr direkt über eine Notify erfolgt, sondern direkt in der Programmierung in Perl. Für meine Anwendungsfälle ist dies vollkommen ausreichend.
Hier ein Beispiel aus meiner 31_actions.cfg:
#########################################################################
## Notify für alle Actions
#########################################################################
define Action_notify notify (Action_.*) { dkRouteActions($NAME, $EVENT) }
attr Action_notify group Notifiers
attr Action_notify room System
Dieser Notify sorgt dafür, dann alle Events an die Funktion dkRouteActions geleitet werden.
Die korrespondierende PERL-Datei lautet 99_dkHandleActions.pm
Hier prüft die Funktion dkRouteActions zunächst, ob die Funktion dkAct_AKTIONSNAME vorhanden ist.
Beispiel: heißt das Gerät „Action_Panic“, so muss analog eine Funktion namens „dkAct_Action_Panic“ definiert sein.
#######################################
##
##
## ROUTES
##
##
#######################################
sub dkRouteActions($$) {
my ($device, $event) = @_;
my $action = "dkAct_" . $device;
my $coderef=__PACKAGE__->can($action);
if ($coderef) {
$coderef->($event);
}
}
Aus diese Weise könnt ihr nicht nur die Notify-Definitionen reduzieren, sondern auch die Logik komplett in PERL ausgliedern. Darüber hinaus müsst ihr nicht für jedes neue Gerät einen Notify anlegen, sondern könnt gleich in PERL die Funktion implementieren.
Lasst mich wissen, wie Ihr eure Programmierung optimiert und Overhead reduziert.
Hi danke für diesen Beitrag ich hatten ihn damals so umgesetzt und bis heute keine Probleme mit der Verarbeitung gehabt.
Heute kam es allerdings zu einem Problem.
2017.08.22 21:07:04 1: ERROR evaluating my $EVTPART0=’Tue‘;my $EVENT=’Tue Aug 22 21:07:04 2017′;my $EVTPART1=’Aug‘;my $EVTPART3=’21:07:04′;my $TYPE=’rssFeed‘;my $EVTPART4=’2017′;my $SELF=’Action_notify‘;my $EVTPART2=’22‘;my $NAME=’WEB_myRSS‘;{ dkRouteActions($NAME, $EVENT) }: Can’t call method „dmy“ on an undefined value at ./FHEM/99_dkUtils.pm line 287.
Ich habe ein RSS Feed Objekt das jedes mal ein Event feuert wenn ein neuer Beitrag reinkommt allerdings wird das Event in zu viele Parts geteilt. Das fehlerhafte Parsen in der dkUtils ist nur ein Folgefehler dessen so glaube ich. Was denkst du?
Kannst du mir sagen was hier das Problem ist und ggf. sagen wie ich es beheben kann?
Danke.
Hi,
das Problem hatte ich auch an einer anderen Stelle, da die Parameter nicht übergeben werden.
Hier müsste man dann wohl ever $EVENT komplett übergeben und dann selbst den String zerlegen.
Hoffe das hilft Dir.
Viele Grüße
Dennis
Hallo Dennis,
danke für deine Antwort.
Ja aber genau das wird doch gemacht. Es wird doch eigentlich nur das $event durchgereicht. Mir ist nicht klar wie ich die Funktion umbauen muss. Das das $event nicht schon vorher zerlegt wird.
Gruß S.
Hallo Dennis,
kannst du mir bitte noch einen Hinweis geben wie du das Problem gelöst hast. Muss hierzu die dkRouteActions angepasst werden?`
Danke für deine Hilfe.
Gruß S