Folgendes Problem,
ich versuche in Perl eine einfache Addition durchzuführen aber jedes mal bekomme ich eine Fehlermeldung.
my ($temp_ist,$temp_soll,$heizung,$stat_fenster) = @_;
$heizung = 1;
if (Value($stat_fenster) eq "closed"){
$heizung=$heizung + 3;
fhem("set $heizung ".$heizung);
}
else {fhem("set $heizung ".$heizung)}
}
Hier soll Testweise einfach nur $heizung 1 gesetzt werden da murrt er mit folgender Fehlermeldung rum.
2017.02.17 10:15:53 3: set 1 : Please define 1 first
2017.02.17 10:15:53 2: fkt_heizung: {Heizungssteuerung("Temp_Bad_Ist","Temp_Bad_Soll","Heizung","Fenster_Bad")}: Please define 1 first
Wenn die Bedingung für die Addition $heizung=$heizung + 3; Wahr ist, kriege ich folgende Fehlermeldung.
2017.02.17 10:33:31 3: set 4 : Please define 4 first
2017.02.17 10:33:31 2: fkt_heizung: {Heizungssteuerung("Temp_Bad_Ist","Temp_Bad_Soll","Heizung","Fenster_Bad")}: Please define 4 first
Das heißt ja er rechnet richtig die 4 aus und kann diese nicht weiter verarbeiten.
Ich hab bei Fhem und Google gesucht und da wird nirgends eine explizite Schreibweise verlangt. Darum versteh ich diesen Fehler nicht und weiß auch nicht mehr unter welchen Begriffen ich noch suchen soll.
Für Hilfe wäre ich sehr dankbar.
Please define 1 first
Variable vorher deklarieren!
my $heizung = 1 sollte helfen.
VG
Frank
Hi,
das hier: Value($heizung) versucht ein Device mit dem Namen "1" oder "4" zu finden. Du musst einfach nur $heizung schreiben, dann sollte das gehen.
Ach ja, das was Franky sagt ist auch nicht schlecht, hat aber wenig mit Deinem Problem zu tun.
Gruß,
Thorsten
Ja ich hatte ich Variablen Deklaration vergessen. Hab sie eingefügt kommt trotz dem der selbe Fehler.
Ja das Value hatte ich weg genommen.
sub Heizungssteuerung($$$$) {
my ($temp_ist,$temp_soll,$heizung,$stat_fenster) = @_;
my $heizung = 1;
if (Value($stat_fenster) eq "closed"){
$heizung=$heizung + 3;
fhem("set $heizung ".$heizung);
}
else {fhem("set $heizung ".$heizung)}
}
Trd der selbe Fehler...
Ich habe auch gesucht ob ich ein Perlmodul nicht installiert habe aber angeblich soll ja das eine addieren auch so klappen.
Vor der ersten Verwendung deklarieren!
Du versuchst noch immer, ein Device $heizung, das einer Zahl entspricht auf den Wert $heizung zu setzen. Ich verstehe den Sinn nicht!?
Da steht übersetzt sowas wie
set 1 1
Zitat von: franky08 am 17 Februar 2017, 10:53:44
Vor der ersten Verwendung deklarieren!
Das ist nicht das Problem. Die Variable muss nicht zwei mal deklariert werden. Sie wird oben schon deklariert.
my ($temp_ist,$temp_soll,$heizung,$stat_fenster) = @_;
ZitatSie wird oben schon deklariert.
Habe wohl noch die Sonnenbrille auf... Tschuldigung, hatte ich übersehen ::)
fhem("set $heizung ".$heizung);
Du benutzt für den Gerätenamen und den Temeraturwert die gleiche Variable.
Du benötigst zwei Variablen und in der ersten sollte der Name der Heizung stehen
fhem("set $heizungName ".$heizung);
sub Heizungssteuerung($$$$) {
my ($temp_ist,$temp_soll,$heizung,$stat_fenster) = @_;
my $wert=0;
if (Value($stat_fenster) eq "closed"){
$wert=$heizung + 3;
fhem("set $heizung ".$wert);
}
else {fhem("set $heizung ".$wert)}
}
So gehts erstmal er setzt 0 und 3 wenn ich allerdings die Funktion ein 2. mal durchlaufe, setzt der $heizung nicht 6.
Ich rufe die Funktion so auf
(Temp_Bad_Ist.*||Temp_Bad_Soll.*) ({Heizungssteuerung("Temp_Bad_Ist","Temp_Bad_Soll","Heizung","Fenster_Bad")})
Da Die Parameter sind alles Dummys.
Hi,
vielleicht sagst Du uns erst einmal, was Du eigentlich machen willst. Das kann man aus dem Coding nämlich nicht ganz erraten.
Gruß,
Thorsten
Warum willst du auch $wert mit dem Devicenamen addieren?
Meinst du ggf. sowas:
$wert=Value($heizung) + 3;
?
Strukturier mal bitte deine Gedanken. Ggf. schreibst du auch mal, was du eigentlich machen willst.
Also ich möchte das durch Änderung von "Fenster_Bad" folgendes ausgeführt wird.
defmod fkt_heizung DOIF ([Fenster_Bad:""]) ({Heizungssteuerung("Temp_Bad_Ist","Temp_Bad_Soll","Heizung","Fenster_Bad")})
Funktioniert.
Die Parameter sind alles Dummys.
In der Subfunktion soll "Heizung" mit einem Wert addiert werden.
sub Heizungssteuerung($$$$) {
my ($temp_ist,$temp_soll,$heizung,$stat_fenster) = @_;
my $wert=0;
$wert=$heizung + 3;
fhem("set $heizung ".$wert);
}
Die Funktion soll später noch weiter ausgebaut werden darum temp_ist und temp_soll.
Der Dummy Heizung wird auf 3 gesetzt. Meckert aber um, dass Heizung nicht numerisch ist.
2017.02.17 11:44:16 1: PERL WARNING: Argument "Heizung" isn't numeric in addition (+) at ./FHEM/99_myUtils.pm line 61, <GEN7> line 34.
Wenn ich die Funktion nochmal ausführe also 2 mal hintereinander müsste der Dummy Heizung ja den Wert 6 annehmen. Tut er allerdings nicht.
Also das einzige Problem ist noch, dass der dummy Heizung anscheinend nicht numerisch ist. Ich nehme an, dass er deswegen nicht beim 2. Durchlauf auf 6 kommt.
Siehe mein letzter Beitrag. Du addierst eine Zahl zum Namen des Devices. Der Fehler sagt also genau, wo das Problem liegt. Die Lösung ist auch in meinem Beitrag.
Wieso den Namen. Ich übernehme doch den Wert des Dummys Heizung... oder etwa nicht...
Versuche einmal, auf Papier die Zeilen deiner Routine aufzuschreiben und die Variablen mit den Inhalten zu ersetzen.
Dann kommt heraus, dass da steht:
$wert="Heizung" + 3
Deine Routine könnte so aussehen:
sub Heizungssteuerung($$$$) {
my ($temp_ist,$temp_soll,$heizung,$stat_fenster) = @_;
my $wert=0;
if (Value($stat_fenster) eq "closed"){
$wert=Value($heizung) + 3;
}
fhem("set $heizung ".$wert);
Warum sollte das so sein? Du übergibst ausschließlich Strings an die Funktion.
Die fehlen einige ganz tiefe Grundlagen.
Den Wert eines STATES eines Devices bekommst du mit Value(), den Wert eines Readings mit ReadingsVal. Du kannst natürlich an die Funktion nur Namen übergeben und dir die Werte dann innerhalb der Funktion holen.
Also es funktioniert jetzt.
Danke an alle und für die Geduld.
Lösung war das von marvin78.
Value($heizung)