Hallo,
beschäftige mich gerade etwas mit Perl Programmierung und versuche es in einer 99_testUtils anzuwenden.
Ich habe zwei Dummys definiert <ursprung> und <ergebnis>
Ziel ist nur, zu Testzwecken, den Wert aus <ursprung> an die Sub zu übergeben,
etwas zu rechnen ( $Wert1*100) und dann an Dummy <ergebnis> zurückzugeben.
Der Aufruf soll über folgendes Notify erfolgen.
define n_Multipl notify ergebnis {Multipl("ergebnis")}
Die Datei heißt 99_testUtils.pm
Mein Testscript sieht so aus.
package main;
use strict;
use warnings;
use POSIX;
sub testUtils_Initialize($)
{
my ($hash) = @_;
}
sub Multipl($)
{
my ($Wert1) = @_;
my $Wert2 = $Wert1*100;
{fhem ("setstate ergebnis $Wert2")}
}
1;
Habe versucht, mich an die Struktur aus dem Wiki zu halten, scheitere aber gerade.
Der Wert von<ergebnis> ändert sich nicht entsprechend.
Woran krankts ?
Aktuell übergibst du den Wert ,,ergebnis", du müsstest noch mit ReadingsVal (siehe Commandref) den tatsächlich Wert aus dem Dummy lesen
Gesendet von iPhone mit Tapatalk
Zitat von: KernSani am 12 März 2020, 16:14:40
Aktuell übergibst du den Wert ,,ergebnis", du müsstest noch mit ReadingsVal (siehe Commandref) den tatsächlich Wert aus dem Dummy lesen
Gesendet von iPhone mit Tapatalk
Vielleicht etwas ausführlicher.
Du übergibst der Funktion immer die Zeichenkette "ergebnis".
Somit ist $Wert1 keine Zahl, sondern eine Zeichenkette. Eine Zeichenkette mal 100... macht das Sinn?
Außerdem müsstest du offenbar auf ursprung triggern und nicht auf ergebnis, und auch dessen Wert übergeben.
ZitatEine Zeichenkette mal 100... macht das Sinn?
Aber ja. Perl ist eine Sprache mit schwacher Typisierung - wenn die Zeichenkette also einen Zahlenwert hat, geht das durchaus.
Kann man ausprobieren, indem man
{"100"*3}
in die FHEM Kommandozeile eingibt.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 12 März 2020, 18:06:50
Aber ja. Perl ist eine Sprache mit schwacher Typisierung - wenn die Zeichenkette also einen Zahlenwert hat, geht das durchaus.
Kann man ausprobieren, indem man
{"100"*3}
in die FHEM Kommandozeile eingibt.
LG
pah
Schon klar, aber mit Wort- oder Buchstabenwert (wie beim Geocaching) rechnet Perl wohl normalerweise nicht.
Danke für die Infos
Werde jetzt noch mal versuchen das umzusetzen und melde mich dann.
Also, das Notify sieht jetzt so aus:
define n_Multipl notify ursprung {Multipl(ReadingsNum("ursprung","state",""))}
damit scheint die Übergabe an die Sub zu funktionieren.
Die Sub sieht jetzt so aus:
package main;
use strict;
use warnings;
use POSIX;
sub testUtils_Initialize($$)
{
my ($hash) = @_;
}
sub Multipl($)
{
my ($Wert1) = @_;
my $Wert2=$Wert1*100;
{
fhem ("setstate ergebnis" .$Wert2);
}
}
1;
Im Log ist jetzt folgende Meldung:
2020.03.13 17:12:19 3: setstate ergebnis100 : Usage: setstate <name> <state>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.
2020.03.13 17:12:19 3: n_Multipl return value: Usage: setstate <name> <state>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.
Es scheint der Rückgabebefehl das Problem zu sein.
{fhem ("setstate ergebnis" .$Wert2);}
Nur kann ich mittels commandref den Fehler nicht finden.
setstate <devspec> <value>
Auch Leerzeichen haben eine Bedeutung :)
"setstate ergebnis " .$Wert2
Sagt doch die Fehlermeldung sehr plastisch :-X setstate ergebnis100 du wolltest doch setstate ergebnis 100
Ach komm, das Leerzeichen ::) Das darf doch nicht ...
Funktioniert !!!
Danke :D
https://www.bpb.de/apuz/287315/lesekompetenz-und-lesebegriff
8)
LG
pah