[Gelöst]Fehler im log: ERROR evaluating my $SELF ... & Global symbol "$EVTPART1"

Begonnen von Rocketjumper, 03 April 2020, 22:57:11

Vorheriges Thema - Nächstes Thema

Rocketjumper

Hallo, ich habe folgende Fehlermeldung im Log, aber es funktioniert alles bestens!?  :o

Kann mir jemand bitte helfen?

Folgendes habe ich umgesetzt:
Es werden die Werte vom ROLLO-Modul an Homematic CuxD Geräte übergeben (mit HMCCU) und anders herum, mit Umkehrfunktion. Also 20% Öffnung beim Rollo_Modul sind 80%
bei der Homematic Jalousie.
Soweit klappt alles, außer die Fehlermeldungen im Fhem log.

Am Fhem ROLLO Modul (Hier Rollo_Modul) sind über Relais meine Jalousien angeschlossen - Funktioniert bestens!

Die Werte pct vom ROLLO Modul werden an CuxD (16 Kanal Universalfernbedienung, Typ Jalousie) mit Namen Rollo_CuxD übergeben.

Homematic (Tinymatic APP) nutze ich zwecks schöner Handhabung, vorallem für meine Frau ;)

Gelöst habe ich es mit 2 notify die einmal die Werte von Homematic an Fhem schickt und das andere von Fhem an Homematic. Beide geben die Fehler im log (Hier nur von einem notify).

Mein Notify Name: pct_fhem_zu_hm_ntfy


Rollo_Modul:(pct).* {
my $evt;;
my $div;;
my $min;;
my $erg;;
$evt = "$EVTPART1"
$div = $evt / 100;;
$min = $d - 1;;
$erg = abs($min);;
fhem "set Rollo_CuxD datapoint 1.LEVEL $erg";;
}


Auszug aus der Log:


2020.04.03 21:53:03 1: ROLLO (Rollo_Modul) Unknown command 1, try help.

2020.04.03 21:53:07 1: ERROR evaluating my $SELF='pct_fhem_zu_hm_ntfy';my $EVENT='pct-20';my $EVTPART0='pct-20';my $NAME='Rollo_Modul';my $TYPE='ROLLO';{
my $evt;;
my $div;;
my $min;;
my $erg;;
$evt = "$EVTPART1"
$div = $evt / 100;;
$min = $d - 1;;
$erg = abs($min);;
fhem "set Rollo_CuxD datapoint 1.LEVEL $erg";;
}: Global symbol "$EVTPART1" requires explicit package name (did you forget to declare "my $EVTPART1"?) at (eval 70207) line 2.

flummy1978

Holla,

im notify ist Perl erlaubt -> Keine doppelten ;; notwendig. Die Deklaration zu Begin kannst Du auch kürzer machen, das aber nur so nebenbei.

Dein Fehler entsteht weil es nicht (oder nicht immer) einen $EVTPART1 gibt. Wenn nur ein Wert übertragen wird, wird nur der $EVTPART0 belegt und $EVTPART1 ist undefiniert und löst daher den Fehler aus.

Rollo_Modul:(pct).* {
return undef if (!$EVTPART1);
my ($evt, $div, $min $erg);
$evt = $EVTPART1;
$div = $evt / 100;
$min = $d - 1;
$erg = abs($min);
fhem "set Rollo_CuxD datapoint 1.LEVEL $erg";
}

Sollte also wie gewollt funktionieren (ungetestet) weil er bei einem nicht belegten $EVTPART1 die Funktion abbricht und nicht weiter macht, bis ein neues Event kommt.

Kommen aus dem PCT Wert NUR Zahlen, ist diese Lösung (ungetestet) wohl eleganter:

Rollo_Modul:pct:(\d+) {
my ($evt, $div, $min $erg);
$evt = $EVTPART0;
$div = $evt / 100;
$min = $d - 1;
$erg = abs($min);
fhem "set Rollo_CuxD datapoint 1.LEVEL $erg";
}


Das Notify reagiert nur auf die Zahlen und gibt diese dann weiter .... teste das mal ob es so funktioniert wie gewollt :)

Edith schmeisst das wichtigste hinterher:
Wiki - HM Attribute => Die eigentliche Lösung ist viel einfacher und funktioniert ohne Notify & Perl

Grüße
Andreas

p.s. Da ich meine Sachen immer aus dem Kopf teste, ist das ohne Gewähr und eher als Anhaltspunkt, denn als "copy & paste Vorlage" zu sehen ;)

kadettilac89

Rollo_Modul:(pct).*

Deine ungünstige Definition ist die Ursache für die Meldungen. Deine Bedingung trifft für 2 Events zu ...
Event Rollo_Modul:pct 20 ----<<<< event vom Reading      pct
Event Rolo_Modul pct-20 ---<<<< event vom Reading        state      (diese sind idR. ohne EVTPART1)

Warum fragst du mit (pct).* das Event ab? Woher hast du diese Art zu definieren?
Standard Definition "Rollo_Modul:pct:.*" würde dieses Problem sicher nicht verursachen

Da 2 Events verarbeittet werden funktioniert es, eines löst die gewollte Aktion aus, das zweite den Eintrag im Log

Regex wie flummy1978 vorschlägt schadet aber auch nicht, dann ist sichergestellt, dass nur Zahlen verarbeitet werden.

Rocketjumper

Danke flummy1978 und kadettilac89! Es hat geklappt!

Habe die Notfies angepasst und gekürzt.

Dieses hatte nix an dem Fehlereintrag im Log geändert:

return undef if (!$EVTPART1);


Die Lösung war, was kadettilac89 geschrieben hat.

Rollo_Modul:pct:.* {
return undef if (!$EVTPART1);
my ($evt, $div, $min $erg);
$evt = $EVTPART1;
$div = $evt / 100;
$min = $d - 1;
$erg = abs($min);
fhem "set Rollo_CuxD datapoint 1.LEVEL $erg";
}


Anstatt meine "Rollo_Modul:(pct).*" wo die Bedingung für 2 Events zutrafen:

Warum ich das gemacht habe ist eine gute Frage, ich denke es war ein Flüchtigkeitsfehler den ich immer überlesen habe...

Den Tipp von flummy1978 "Wiki - HM Attribute => Die eigentliche Lösung ist viel einfacher und funktioniert ohne Notify & Perl" werde ich mal testen.
Das müsste dann ja auch mit den CuxD erzeugten "HM-LC-Bl1-FM" Geräten funktionieren?!

Danke euch, vorallem auch für die schnellen Antworten!

Gruß Basti

kadettilac89

Zitat von: Rocketjumper am 04 April 2020, 22:36:38
Dieses hatte nix an dem Fehlereintrag im Log geändert:

return undef if (!$EVTPART1);


Der Vollständigkeit halber etwas Klugscheißermodus :) ... damit kann man es nicht abfangen da der Fehler auftritt sobald du eine nicht vorhandene Variable abfragst ...

Wenn du es abfangen willst ...  z. B. mit no strict ... vielleicht kommt jemand über die Suche hier her und ist an einer Lösung interessiert.

my $T_EVTPART1 = "";
{
no strict; #no warning - "$EVTPART1" requires explicit package name

if(defined($EVTPART1)){ #no warning - "Use of uninitialized value $T_EVTPART1"
$T_EVTPART1 = $EVTPART1;
}

use strict;
}

Log 1, "ne: event: .$EVENT., Part0: .$EVTPART0. Part1: .$T_EVTPART1.";


Hatte eine Diskussion vor ein paar Tagen. Ich habe BEWUSST mit einem ggf. nicht gesetztem EVTPART1 gearbeitet. In meinem Post dazu gibt es mehrere weiterführende Links dazu ...

https://forum.fhem.de/index.php/topic,109580.0.html

flummy1978

Zitat von: kadettilac89 am 05 April 2020, 08:34:31
Der Vollständigkeit halber etwas Klugscheißermodus :) ... damit kann man es nicht abfangen da der Fehler auftritt sobald du eine nicht vorhandene Variable abfragst ...

Wenn du es abfangen willst ...  z. B. mit no strict ... vielleicht kommt jemand über die Suche hier her und ist an einer Lösung interessiert.

Danke kadettilac89, den Klugscheissermodus nehme ich gern an und lese dort auch ein wenig ;)

Bin ja wie ich überall immer mal wieder erwähne selbst ziemlicher Anfänger und lerne auch gern ...

Grüße
Andreas

DeeSPe

Man kann, statt die vorgegebenen $EVTPART Variablen zu benutzen, $EVENT auch selbst mit split aufteilen.
Dann läuft man auch nicht in diese Falle.

Z.B.:
Rollo_Modul:pct.* {
my ($reading,$value) = split(/:/,$EVENT);
return if (!$value);
......


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Rocketjumper

Danke euch für die Tipps!

Was DeeSPe schreibt, habe ich gleich an einer anderen Stelle probiert und funktioniert bestens! Danke! :)

Das flummy1978 noch vorgeschlagen hat mit:
ZitatEdith schmeisst das wichtigste hinterher:
Wiki - HM Attribute => Die eigentliche Lösung ist viel einfacher und funktioniert ohne Notify & Perl
hat und wird wohl leider bei mir nicht funktioneren, da die Funktion "HomeMatic Type Blind" soweit ich gelesen habe nur mit CUL/CUN/HMLAN und mit direkt verbundenen Geräten klappt.
In meinem Fall habe ich parallel zu Fhem noch Debmatic (HMCCU), mit dort CuxD erzeugten Geräten, am laufen.
Bitte korregiert mich, wenn ich falsch liege.

Falls noch jemand eine "schönere" Lösung hat, bin ich sehr daran interessiert. ;-)

Gruß Basti

flummy1978

Zitat von: Rocketjumper am 06 April 2020, 21:42:13
Was DeeSPe schreibt, habe ich gleich an einer anderen Stelle probiert und funktioniert bestens! Danke! :)

Genau das hab ich mir gedacht, als ich das gelesen hatte. Wieder was gelernt ... Allerdings ist mir im gleichen Augenblick auch klar geworden:

return undef if (!$EVTPART1);
Kann am Fehler nichts ändern, weil er "undef" zurückgibt und dementsprechend der Fehler ja genauso zutrifft wie er vorher auch schon getan hat. Deswegen auch Deine korrekte Schlussfolgerung dass das nicht geht. Durch den Vorschlag von DeeSPe bin ich aber drauf gekommen dass,
return  if (!$EVTPART1);
funktionieren müsste, weil er dann den Teil abbricht, weil EVTPART1 eben nicht vorhanden ist. Edith sagt: Funktioniert nicht siehe unten

Das mit der HMCCU hatte ich bei meinem Edith Vorschlag leider komplett unterschlagen. Da geht das (wohl gar)  nicht.

Das einzige was mir sonst alternativ einfallen würde (um Notifys und damit auch Geräte in Fhem zu sparen) wäre hier eventmap zu benutzen. Das müsste effektiv die gleiche Auswirkung haben - ist aber jetzt auch eher so ein Vorschlag ins Blaue...
Wenn Du Lust hast zu testen, bietet es sich an, wenn nicht funktioniert es ja auch so wie es ist ;)

Viele Grüße
Andreas

kadettilac89

Zitat von: kadettilac89 am 05 April 2020, 08:34:31
Hatte eine Diskussion vor ein paar Tagen. Ich habe BEWUSST mit einem ggf. nicht gesetztem EVTPART1 gearbeitet. In meinem Post dazu gibt es mehrere weiterführende Links dazu

https://forum.fhem.de/index.php/topic,109580.0.html

... aus dem oben gelinkten Post ein Link ...

Aussasge rudolfkoening



Zitat von: rudolfkoenig am 01 April 2013, 11:38:54
Ich sehe hier nur die Symptome, aber nicht die Ursache, deswegen rate ich mal: das Regexp der Notify trifft auf Nachrichten zu, die manchmal keinen zweiten Argument haben.

Ich sehe 3 Moeglichkeiten:
- $EVENT selbst zu splitten ($EVTPARTx ist eh was fuer Anfaenger :)
- das regexp so modifizieren, dass dieser Parameter immer vorhanden ist, d.h. evtl. mehrere notifys
- no strict 'vars' vor dem ersten Aufruf von $EVTPART1 einbauen.

Split von $EVENT von DeeSPe eingebracht
Anpassung Regexp und no strict von mir ...

Zitat von: flummy1978 am 07 April 2020, 00:43:07

return  if (!$EVTPART1);
funktionieren müsste, weil er dann den Teil abbricht, weil EVTPART1 eben nicht vorhanden ist.

erfolgreich getestet? basierend auf welcher Annahme? Ich zweifle daran, lass mich aber gerne überzeugen.

Ich kenne aktuell keine andere als die 3 von Rudolf genannten Möglichkeiten, sollte es mit einem Einzeiger abzufangen sein  .... her damit. Ggf. als Abschluss dieser mehr OT-Diskussion.

flummy1978

Zitat von: kadettilac89 am 07 April 2020, 08:22:03
return  if (!$EVTPART1);

erfolgreich getestet? basierend auf welcher Annahme? Ich zweifle daran, lass mich aber gerne überzeugen.

Nein, kadettilac. Du hast vollkommen Recht: Meine "Vermutung" (War zu dem Zeitpunkt ohne Zugriff auf mein Fhem / Perl) war wie Du erwähnst, falsch. Das funktioniert nicht und ergbit den gleichen Fehler wie oben auch schon.

Somit bleiben nur die Möglichkeiten von oben...