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
im Wert $shash->{newTemp} steht vermutlich nix drin oder der Wert existiert gar nicht.
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
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.
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
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.
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
mach mal in Zeile 963 $shash->{newTemp} = -1;
und teste nochmal.
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.
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;
erstens habe ich geschrieben, Du sollst -1 eintragen und nicht 1
zweitens hast Du vermutlich das Semikolon am Ende der neu eingetragenen Zeile vergessen.
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
mach das mal raus: or $temp != 0
denn sie wissen nicht, was sie tun...
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
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
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.
Hat sich erledigt