Mit FHEM Device perl-sub aufrufen und Variable übergeben?

Begonnen von AnBad, 20 Januar 2023, 13:23:52

Vorheriges Thema - Nächstes Thema

AnBad

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

JoWiemann

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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

betateilchen

kannst Du Dich mal bitte für EINEN Benutzernamen entscheiden?

Und dann nochmal so beschreiben, was Du tun willst, dass man das auch versteht?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

Verschoben, da im Ausgangspost nicht eine Zeile Perl zu finden war, die man besprechen könnte...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

AnBad

#4
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.

Beta-User

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?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

AnBad

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.

Beta-User

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....
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

AnBad

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?

Icinger

ReadingsNum("Dummie", "Mein-Wert", 0)
IST eine perl-sub.........halt direkt in der fhem.pl

sub ReadingsNum($$$;$);
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

AnBad

Ich werde das mal ausprobieren.
Vielen Dank soweit!!!

AnBad

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");}

betateilchen

#12
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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoWiemann

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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

AnBad

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.


betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoWiemann

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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

betateilchen

Und man braucht Variablennamen in einem Funktionsaufruf auch nicht in Anführungszeichen setzen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!