Hallo,
ich hatte mal rumgespielt: Ein Dummy-Device angelegt, welcher mir eine Perlsub aurufen sollte. Leider ging das dermaßen daneben, dass fhem komplett abgestürzt ist und auch nach dem booten hing. Jetzt traue ich mich nicht mehr ran.
Geht das überhaupt? Wenn ja, könnte jemand bitte mal ein Beispiel posten eines Dummy-Device? Perfekt wäre ein Device, bei welchem man einen String oder Number in ein Feld eingibt und nach Enter diese Eingabe als Variable an die Sub übergeben wird.
Grüße
Anbei ein Beispiel:
define Dummie dummy
attr Dummie readingList Mein-Wert
attr Dummie setList Mein-Wert
attr Dummie userReadings Mein-Ergebnis {return ReadingsNum("Dummie", "Mein-Wert", 0) * 100}
Grüße Jörg
kannst Du Dich mal bitte für EINEN Benutzernamen entscheiden?
Und dann nochmal so beschreiben, was Du tun willst, dass man das auch versteht?
Verschoben, da im Ausgangspost nicht eine Zeile Perl zu finden war, die man besprechen könnte...
AnBad ist mein richtiges Profil.
Ich will mit einem FHEM dummydevice eine Perl-Sub aufrufen und dabei eine Variable an die Sub übermitteln. Die Variable soll durch ein user input eingegeben werden können.
Zitat von: JoWiemann am 20 Januar 2023, 13:30:34
Anbei ein Beispiel:
define Dummie dummy
attr Dummie readingList Mein-Wert
attr Dummie setList Mein-Wert
attr Dummie userReadings Mein-Ergebnis {return ReadingsNum("Dummie", "Mein-Wert", 0) * 100}
Grüße Jörg
Was ist daran unklar?
Ok, Danke, ich verstehe.
Jetzt müsste ich über eine Doif bei Änderung des Readings "Mein Wert" die Perl-Sub aufrufen.
Ich fragte mich, und dachte, man könnte die Perl-Sub auch direkt durch den Dummy aufrufen, also ohne Umweg über eine Doif.
Zitat von: AnBad am 21 Januar 2023, 10:23:18
Ok, Danke, ich verstehe.
Jetzt müsste ich über eine Doif bei Änderung des Readings "Mein Wert" die Perl-Sub aufrufen.
Ich fragte mich, und dachte, man könnte die Perl-Sub auch direkt durch den Dummy aufrufen, also ohne Umweg über eine Doif.
Genau das macht der gezeigte dummy ohne das DOIF-Midul zu bemühen...Scheint also nicht klar gewesen zu sein....
Nee, das verstehe ich nicht. Der Dummy ruft doch keine Perl-Sub auf? Der Dummy legt zwar ein Userreading an und benutzt Perl-Code zur Berechnung, aber eine Perl-Sub ruft er nicht auf?
OK, man könnte vlt eine Sub im Perlcode des Userreading aufrufen? Man müsste dann einen Returnwert in der Sub benennen, der dann an den Dummy zurückgeben wird. Ist es so zu verstehen?
ReadingsNum("Dummie", "Mein-Wert", 0)
IST eine perl-sub.........halt direkt in der fhem.pl
sub ReadingsNum($$$;$);
Ich werde das mal ausprobieren.
Vielen Dank soweit!!!
Hi,
habe es probiert. Und es hat FHEM wieder zum kompletten Absturz gebracht. Mag sein, dass kein Event vorlag oder ähnliches. Ich glaube, ich lasse jetzt davon lieber die Finger..
Internals:
FUUID 63cbad07-f33f-cecb-e863-9d5406a0cde90407
NAME Logging_Energy
NR 236
STATE ???
TYPE dummy
READINGS:
2023-01-21 10:28:14 Messungname rasp41
Attributes:
DbLogExclude .*
alias Start/Stopp Logging Engergy
devStateIcon {return ReadingsVal("Logging_Energy", "Messungname", "Fehler")}
group Logging Energy
readingList Messungname
setList Messungname
userReadings Messungname {return ReadingsVal("Logging_Energy", "Messungname", "Fehler"); sub_Strommesser_V23_01_19("$DEVICE", "$EVENT", "dummy");}
Das kann auch nicht funktionieren - Dein dummy hat aber auch wenig bis nichts mit dem zu tun, was man hier im Thread die ganze Zeit versucht, zu erklären.
Was soll das userReading bewirken?
Wieso denkst Du, dass nach einem return noch irgendein Code ausgeführt wird?
Das devStateIcon wird nicht funktionieren, weil das internal STATE nicht gefüllt wird.
Hallo,
ich denke Du solltest Dich zunächst mit den Grundlagen der Programmierung und dann mit Perl beschäftigen.
userReadings Messungname
{
return ReadingsVal("Logging_Energy", "Messungname", "Fehler");
sub_Strommesser_V23_01_19("$DEVICE", "$EVENT", "dummy");
}
Wenn Du Dir das ansiehst, dann sollte Dir folgendes auffallen:
{ ... } definiert eine Perl Sub, die von Fhem Evaluiert wird.
return ReadingsVal("Logging_Energy", "Messungname", "Fehler"); Dann machst Du ein return mit dem Inhalt des Readingsval(...)
sub_Strommesser_V23_01_19("$DEVICE", "$EVENT", "dummy"); Aber was soll diese Zeile nach der return Zeile und woher soll $DEVICE und $EVENT kommen? Und wo ist die sub_Strommesser_V23_01_19 definiert und funktioniert sie?
Grüße Jörg
PS Poste doch mal die sub_Strommesser_V23_01_19() und wo Du sie definiert hast
FHEM kenne ich mich nicht aus, das alleine schon zu begreifen, ist schwierig. Deswegen habe ich mich von Anfang an auf Perl hier bei FHEM konzentriert, und mach auch möglichst alles damit. Ob durch die Eingabe ins Inputfeld ein Event und Device weitergegeben wird, weiß ich nicht, meinen Zweifel hatte ich. Perl kenn ich ganz gut, dass ist der Vorteil. Die Sub funktioniert.
Trotzdem, dass dann bei meinem gedankenlosen Schnelltest gleich das ganze FHEM zerreißt, fand ich jetzt suboptimal.
???
Zitat von: AnBad am 23 Januar 2023, 20:12:24
FHEM kenne ich mich nicht aus, das alleine schon zu begreifen, ist schwierig. Deswegen habe ich mich von Anfang an auf Perl hier bei FHEM konzentriert, und mach auch möglichst alles damit. Ob durch die Eingabe ins Inputfeld ein Event und Device weitergegeben wird, weiß ich nicht, meinen Zweifel hatte ich. Perl kenn ich ganz gut, dass ist der Vorteil. Die Sub funktioniert.
Trotzdem, dass dann bei meinem gedankenlosen Schnelltest gleich das ganze FHEM zerreißt, fand ich jetzt suboptimal.
Alles gut und schön, aber was soll eine Code Zeile nach einem return? Und, $DEVICE gibt es wohl nur - klein geschrieben, also $device - bei DOIF. $NAME und $EVENT gibt es beim notify. Ansonsten existieren die Variablen nicht.
Von daher, wenn Du Perl beherrschst, dann erkläre bitte, was Dein Code im userReadings machen soll, mir erschließt sich das nicht. Wie schon gesagt, der Code wird evaluiert. Direkt im Perl Programm würde das dann so aussehen:
eval {
return ReadingsVal("Logging_Energy", "Messungname", "Fehler");
sub_Strommesser_V23_01_19("$DEVICE", "$EVENT", "dummy");
};
Und das man bei falscher Codierung ein Programm zum Absturz bringen kann ist nicht ungewöhnlich.
Grüße Jörg
Und man braucht Variablennamen in einem Funktionsaufruf auch nicht in Anführungszeichen setzen.