FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Harald am 01 August 2013, 13:29:27

Titel: Syntaxfehler
Beitrag von: Harald am 01 August 2013, 13:29:27
Hallo zusammen,

Wo ist hier der Fehler?

Log 3, "Max: $shash->{NAME} neu5: $measuredTemperature gespeichert: $var desTemp: $des istneu: $shash->{newTemp}";
Use of uninitialized value in concatenation (.) or string at ./FHEM/10_MAX.pm line 970

Wenn ich das so ändere, ist die Meldung weg:

Log 3, "Max: $shash->{NAME} neu5: $measuredTemperature gespeichert: $var desTemp: $des istneu: ";#$shash->{newTemp}";



Viele Grüße

Harald
Titel: Aw: Syntaxfehler
Beitrag von: betateilchen am 01 August 2013, 15:02:03
im Wert $shash->{newTemp} steht vermutlich nix drin oder der Wert existiert gar nicht.
Titel: Aw: Syntaxfehler
Beitrag von: Harald am 01 August 2013, 18:02:37
Danke betateilchen für die schnelle Antwort. So etwas habe ich schon befürchtet.

Ist denn so eine Zuweisung richtig oder kann man das besser machen?

$shash->{newTemp} = 0 if($measuredTemperature eq "" or $measuredTemperature == 0);

Viele Grüße

Harald
Titel: Aw: Syntaxfehler
Beitrag von: betateilchen am 01 August 2013, 19:31:55
sollte grundsätzlich so funktionieren, obwohl ich es, je nachdem wie das in Deiner Anwendung auftreten kann, anders lösen würde (z.B. mit undef und einer Abfrage if(defined(...)) umsetzen würde. Um das zu beurteilen, müsste man aber mehr Sourcecode aus dem umgebenden Kontext kennen.
Titel: Aw: Syntaxfehler
Beitrag von: Harald am 02 August 2013, 12:37:13
Hier mal den entsprechenden Auszug:960 # neu
961 # Modus wurde durch einen manuellen Eingriff während xScan aktiv ist geändert
962 readingsBulkUpdate($shash, "xScanSet", 0) if ((MAX_ReadingsVal($shash, "mode") eq MAX_ReadingsVal($shash, "xScanMode")) and MAX_ReadingsVal($shash, "xScanSet") eq 1);
963
964 # nur übernehmen wenn Isttemperatur wieder 0 war oder eine andere Isttemperatur gesendet wird als die schon gespeicherte
965 $shash->{newTemp} = 0 if($measuredTemperature eq "" or $measuredTemperature == 0);
966 Log 3, "Max: $shash->{NAME} new4: $measuredTemperature gespeichert: $var desTemp: $des istneu: $shash->{newTemp}";
967
968 my $temp = $measuredTemperature;
969 if ((($temp ne "") or ($temp != 0)) and (($temp != $var) or ($shash->{newTemp} == 0))) {
970 Log 3, "Max: $shash->{NAME} neu5: $measuredTemperature gespeichert: $var desTemp: $des istneu: $shash->{newTemp}";
971 readingsBulkUpdate($shash, "temperature", sprintf("%2.1f",$measuredTemperature));
972 # neue Temperatur empfangen
973 $shash->{newTemp} = 1;
974 # bei scanTemp Modus 2 und scanTempSet auf 1 wird der Thermostat beim Empfang einer neuen Temperatur
975 # sofort wieder in seinen ursprünglichen Modus zurück gesetzt !

Für mich sieht das eigentlich richtig aus. Oder gibt es da Fehler, die für dieseUse of uninitialized numeric eq (==) at ./FHEM/10_MAX.pm line 969
Use of uninitialized value in concatenation (.) or string at ./FHEM/10_MAX.pm line 970
Meldungen sorgen?
Wenn ich $shash->{newTemp} auskommentiere, sind die Meldungen weg.

Viele Grüße

Harald
Titel: Aw: Syntaxfehler
Beitrag von: betateilchen am 02 August 2013, 13:23:52
Welche Version von dem Modul verwendest Du eigentlich? Bei mir ist die aktuelle diese hier:

##############################################
# $Id: 10_MAX.pm 3448 2013-07-18 22:25:31Z mgehre $
# Written by Matthias Gehre, M.Gehre@gmx.de, 2012-2013
#


Bei mir ist die letzte Coding-Zeile in 10_MAX.pm die Zeile 816.

Die Ursache für die beiden von Dir genannten Meldungen dürften vor dieser Codingstelle auftreten.
Titel: Aw: Syntaxfehler
Beitrag von: Harald am 02 August 2013, 16:04:55
Hallo betateilchen,

ich versuche, das Modul von Jürgen (http://forum.fhem.de/index.php?topic=11624.msg84248#msg84248) hin zu bekommen. Er ist leider für längere Zeit verhindert, daran weiter zu arbeiten. Da ich das gerne nutzen möchte, versuche ich zu finden, wo die in telnet gezeigten Fehlermeldungen herrühren und die Ursachen zu finden. Ein paar Erfolge habe ich schon zu verzeichnen. Aber nun übersteigt das meinen derzeitigen Horizont in Perl. Deshalb habe ich mich an's Forum gewendet und Du hast Dich dankenswerter Weise gemeldet. Ich denke, dass ich bei der Ursachenforschung sicherlich auch mit Perl etwas vertrauter werde.

Danke jedenfalls für den Hinweis. Da muss ich mal weiter suchen. Allerdings gibt es $Shash->{newTemp} nur an dieser Stelle im Modul. Habe es mit Notepad++ mehrfach durchsucht und nichts weiter gefunden. Und, wie schon geschrieben, wenn ich $shash->{newTemp} auskommentiere, sind die Meldungen weg. Es muss m.E. damit zusammen hängen, oder?

Besten Dank nochmal für Deine Bemühungen und viele Grüße

Harald
Titel: Aw: Syntaxfehler
Beitrag von: betateilchen am 02 August 2013, 17:17:07
mach mal in Zeile 963 $shash->{newTemp} = -1; und teste nochmal.
Titel: Aw: Syntaxfehler
Beitrag von: Harald am 02 August 2013, 20:31:35
wenn ich das mache, erhalte ich jede Menge Meldungen bez. div. Subroutinen in 10_MAX.pm, egal, ob ich -1, 1 oder 2 einsetzt.

Vertausche ich 1 und 0 in Zele 965 und 973, sehe ich keine Änderung.
Titel: Aw: Syntaxfehler
Beitrag von: Harald am 03 August 2013, 10:55:51
Hm, wie kann es sein, dass ich solche Meldungen im Logfile finde2013.08.03 10:43:05 0: syntax error at ./FHEM/10_MAX.pm line 965, near "$shash"
Global symbol "$measuredTemperature" requires explicit package name at ./FHEM/10_MAX.pm line 965.
Global symbol "$measuredTemperature" requires explicit package name at ./FHEM/10_MAX.pm line 965.
Global symbol "$measuredTemperature" requires explicit package name at ./FHEM/10_MAX.pm line 966.
Global symbol "$var" requires explicit package name at ./FHEM/10_MAX.pm line 966.
Global symbol "$des" requires explicit package name at ./FHEM/10_MAX.pm line 966.
wenn ich in Zeile 963  $shash->{newTemp} = 1  eingebe.
Damit setze ich doch explizit die den Wert von $shash->{newTemp} auf 1, oder? In der nachfolgenden Zeile
$shash->{newTemp} = 0 if($measuredTemperature eq "" or $measuredTemperature == 0);
wird der Wert doch auf 0 gesetzt, wenn keine Temperatur vom Thermostat gelesen wurde.

Viele Grüße

Harald

Ich hab's! Es fehlt das Semicolon am Ende -> $shash->{newTemp} = 1;
Titel: Aw: Syntaxfehler
Beitrag von: betateilchen am 03 August 2013, 11:03:24
erstens habe ich geschrieben, Du sollst -1 eintragen und nicht 1

zweitens hast Du vermutlich das Semikolon am Ende der neu eingetragenen Zeile vergessen.

Titel: Aw: Syntaxfehler
Beitrag von: Harald am 03 August 2013, 12:58:09
Hallo betateilchen,

entschuldige bitte, aber ich Trottel hatte, wie ich ja schon schrieb, das Semikolon vergessen. Ich habe erstmal $shash->{newTemp} = 1 (oder auch -1, wie Du vorschlugst) in Zeile 930 (nicht 936, weil davor noch einige Logausgaben vorhanden sind) platziert. Damit sind die diesbezüglichen Meldungen eliminiert und es läuft soweit. Im Log sieht es auch ganz gut aus.

Nun habe ich noch ein Problem, was möglicherweise die Ursache, dass $shash{newTemp} nicht richtig gesetzt wird, sein könnte.

Ab Zeile 968 steht

my $temp = $measuredTemperature;
if (($temp ne "" or $temp != 0) and (($shash->{newTemp} == 0) or ($temp != $var))) {
Log 3, "Max:$shash->{NAME} neu5:$measuredTemperature gespeichert:$var desTemp:$des Mode:$mode temp:$temp istneu:$shash->{newTemp}";
readingsBulkUpdate($shash, "temperature", sprintf("%2.1f",$measuredTemperature));
# neue Temperatur empfangen
$shash->{newTemp} = 1;
und die Fehlermeldung in Telnet lautet

Argument "" isn't numeric in numeric ne (!=) at ./FHEM/10_MAX.pm line 969

Ist es nicht so, dass wenn ein Syntaxfehler auftritt, die Funktion nicht weiter bearbeitet wird?
Wenn das so ist, wird $shash{newTemp} nicht auf 1 gesetzt?

Viele Grüße

Harald
Titel: Aw: Syntaxfehler
Beitrag von: betateilchen am 03 August 2013, 13:50:51
mach das mal raus: or $temp != 0

denn sie wissen nicht, was sie tun...
Titel: Aw: Syntaxfehler
Beitrag von: Harald am 03 August 2013, 15:33:09
Besten Dank, hab' ich gemacht und die Fehlermeldung ist weg!

Dann kann ich auf die Suche nach den Ursachen der anderen Fehlermeldungen gehen. Ich glaube, die sind schwieriger zu finden, da sie sich auf Bereiche beziehen, die Jürgen nicht programiert hat. Ich vermute, dass da falsche Parameter übergeben werden - aber wo? Vielleicht finde ich ja was.

Ist meine Annahme bez. der Abarbeitung von Perlcodes richtig, dass die Sequenz bei Syntaxfehler nicht bearbeitet wird?

Entschuldige die dumme Frage (Anfänger halt) was ist an (..... or $temp != 0) denn falsch?

Vielen Dank für die Hilfe und viele Grüße

Harald
Titel: Aw: Syntaxfehler
Beitrag von: Harald am 04 August 2013, 10:07:16
Hallo betateilchen,

ich würde mich sehr freuen, wenn Du mir die beiden Fragen von gestern beantworten könntest. Ich würde gerne verstehen, was und warum das nicht geklappt hat.

Herzlichen Dank im Voaus und schönen Sonntag noch

Harald
Titel: Aw: Syntaxfehler
Beitrag von: betateilchen am 04 August 2013, 10:40:37
Versteh mich bitte nicht falsch, aber Deine Fragen beruhen auf absolutem Grundlagen-Nichtwissen. Vielleicht solltest Du zuerst ein gutes Buch zu Perl lesen, bevor Du versuchst, irgendwelche Gerätemodule umschreiben zu wollen.

Ob eine Verarbeitung bei einem Fehler abgebrochen wird, läßt sich nicht mit ja oder nein beantworten, das kommt drauf an, wie der Programmierer das gestaltet hat. Man kann sogar eine Division by Zero machen, ohne dass ein Fehler auftritt

Der Unterschied zwischen "ne" und "!=" liegt darin, dass das eine einen String vergleicht und das andere eine numerischen Wert.

Achja: Und Fehlermeldungen sollte man auch lesen, interpretieren und verstehen können - das ist extrem wichtig und läßt manche aufkommende Fragen einfach in Luft auflösen.
Titel: Aw: Syntaxfehler
Beitrag von: Harald am 16 August 2013, 11:26:03
Hat sich erledigt