FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Bastian0302 am 17 Februar 2017, 10:37:45

Titel: Perl erkennt Zahl nicht als Zahl
Beitrag von: Bastian0302 am 17 Februar 2017, 10:37:45
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.
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: franky08 am 17 Februar 2017, 10:42:30
Please define 1 first

Variable vorher deklarieren!

my $heizung = 1 sollte helfen.

VG
Frank
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: Thorsten Pferdekaemper am 17 Februar 2017, 10:46:37
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
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: Bastian0302 am 17 Februar 2017, 10:52:06
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.
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: franky08 am 17 Februar 2017, 10:53:44
Vor der ersten Verwendung deklarieren!
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: marvin78 am 17 Februar 2017, 10:53:49
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
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: marvin78 am 17 Februar 2017, 10:54:29
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) = @_;
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: franky08 am 17 Februar 2017, 11:00:17
ZitatSie wird oben schon deklariert.

Habe wohl noch die Sonnenbrille auf... Tschuldigung, hatte ich übersehen  ::)
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: Dietmar63 am 17 Februar 2017, 11:08:19
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);


Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: Bastian0302 am 17 Februar 2017, 11:09:30
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.
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: Bastian0302 am 17 Februar 2017, 11:11:03
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.
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: Thorsten Pferdekaemper am 17 Februar 2017, 11:11:17
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
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: marvin78 am 17 Februar 2017, 11:12:38
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.
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: Bastian0302 am 17 Februar 2017, 12:11:00
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.
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: marvin78 am 17 Februar 2017, 12:12:02
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.
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: Bastian0302 am 17 Februar 2017, 12:13:48
Wieso den Namen. Ich übernehme doch den Wert des Dummys Heizung... oder etwa nicht...
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: digiart am 17 Februar 2017, 12:16:15
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);
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: marvin78 am 17 Februar 2017, 12:16:48
Warum sollte das so sein? Du übergibst ausschließlich Strings an die Funktion.

Die fehlen einige ganz tiefe Grundlagen.
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: marvin78 am 17 Februar 2017, 12:18:53
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.
Titel: Antw:Perl erkennt Zahl nicht als Zahl
Beitrag von: Bastian0302 am 17 Februar 2017, 12:21:32
Also es funktioniert jetzt.
Danke an alle und für die Geduld.

Lösung war das von marvin78.
Value($heizung)