Guten Tag
Ich beiße mir gerade die Zähne an einem userReading aus, welches die Windrichtung meines Netatmo Windmessers (wird in Grad angegeben) in Text umwandeln soll. Also größer 0 und kleiner 22.5 soll NNO ergeben und so weiter. Beim testen bin ich erst mal von größer 0 und kleiner 360 ausgegangen, damit in jedem Fall ein Reading erzeugt wird.
userReadings windangle_txt {if(ReadingsVal("netatmo_M06_00_00_01_ac_e8", "windangle","") >0) and (ReadingsVal("netatmo_M06_00_00_01_ac_e8", "windangle","") <360) {return "N"} else {return -1}
Dabei erhalte ich die Fehlermeldung:
Error evaluating netatmo_M06_00_00_01_ac_e8 userReading windangle_txt: syntax error at (eval 4887280) line 1, near ") and"
Gehen hier etwa keine und Bedingungen?
Gruß
edition
Irgendwo im Forum gab es eine Funktion, die aus einer Gradzahl direkt die Windrichtung zurückgibt. Du musst das Rad nicht neu erfinden.
Natürlich kann man auch in einem userReading mit logischen Verknüpfungen arbeiten, man sollte es halt richtig machen. Auf dem Handy kann ich mir Deinen code gerade nicht vernünftig ansehen.
Hi edition,
Warum kein List ?
Warum kein Trigger beim Userreading ?
Warum immer als Textwurst und nichtmal ordentlich formatiert ?
Die Klammersetzung ist falsch und ausserdem unvollständig.
userReadings windangle_txt
{
if( ReadingsVal( 'netatmo_M06_00_00_01_ac_e8', 'windangle', '' ) > 0 && ReadingsVal( 'netatmo_M06_00_00_01_ac_e8', 'windangle', '' ) < 360 ) {
return 'N'
} else {
return -1
}
}
Aber logische UND Verknüpfungen stellt man meines Wissens mit && dar und nicht mit ,,and"
Hier gibt es etwas Fertiges
https://forum.fhem.de/index.php?topic=54716.0 (https://forum.fhem.de/index.php?topic=54716.0)
Mit der richtigen Klammersetzung funktioniert es natürlich. Auch als Textwurst ohne ordentliche Formatierung und mit and statt &&!
Die Fehlermeldung ist allerdings auch mehr irreführend als hilfreich. Fehler bei der Auswertung von Netatmo userReading: Syntaxfehler in Zeile 1 neben ") und" soll auf eine zu viel gesetzte Klammer verweisen? Hätte ich in der Schule doch besser aufpassen sollen!
Der Hinweiß von betateilchen und jkriegl, dass es was fertiges gibt, hört sich auch nicht schlecht an. Das werde ich mir ansehen, bevor ich meine Idee vollende. Das wird nämlich ziemlich umfangreich, wenn es fertig ist.
Vielen Dank für die Unterstützung.
edition
Zitat von: edition am 17 Juli 2025, 19:43:41in Zeile 1 neben ") und" soll auf eine zu viel gesetzte Klammer verweisen
Ja, weil du den Bedingungsteil vom if mit der Klammer nach >0 viel zu früh beendet hast und deshalb das "and" im luftleeren Raum steht. Perl weiß dann nicht, was es mit "and" an der Stelle anfangen soll und schmeißt den Error (erwartet wäre ein { für den Beginn des "code-bei-if"-Teils, siehe sogleich).
Das war nämlich:
{if (BEDINGUNG) and (BEDINGUNG) {code-bei-if} else {code-bei-else}
Richtig wäre:
{if (BEDINGUNG and BEDINGUNG) {code-bei-if} else {code-bei-else}}
(Es waren damit sogar zwei Klammern zu viel, nämlich auch die vor dem zweiten ReadingsVal, und es hat auch eine geschweifte Klammer ganz am Ende gefehlt (die, die die allererste geschweifte Klammer vor dem if schließt).)
Also ich würde das so schreiben:
userReadings windangle_txt {(ReadingsVal("netatmo_M06_00_00_01_ac_e8", "windangle","") > 0 and (ReadingsVal("netatmo_M06_00_00_01_ac_e8", "windangle","") < 360) ? "N" : "-1"}
Wobei mir die verschiedenen Antworttypen Zahl und Buchstabe nicht gefallen, deshalb beide als Character.
genau aus Diesem Grund empfehle ich auf Textwurst zu verzichten.
Bei Deinem Vorschlag stimmt die Klammersetzung nicht !
Stimmt, hier die richtige Klammersetzung:
userReadings windangle_txt {ReadingsVal("netatmo_M06_00_00_01_ac_e8", "windangle","") > 0 and ReadingsVal("netatmo_M06_00_00_01_ac_e8", "windangle","") < 360 ? "N" : "-1"}
Und ohne "Textwurst" kann man keine Zeile Code schreiben.
Und übrigens verstehe ich die Angst vor "Textwurst" überhaupt nicht, denn wenn man das Userreading in der IDE von Fhem schreibt, dann kann man eigentlich keine Klammerfehler machen, denn dort kann man die Klammersetzung einfach überprüfen, bzw. sie wird automatisch überprüft.
entweder
userReadings windangle_txt {ReadingsNum("netatmo_M06_00_00_01_ac_e8", "windangle",0) > 0 and ReadingsNum ("netatmo_M06_00_00_01_ac_e8", "windangle",0) < 360 ? "N" : "-1"}
oder
entweder
userReadings windangle_txt {ReadingsVal("netatmo_M06_00_00_01_ac_e8", "windangle","") gt 0 and ReadingsVal ("netatmo_M06_00_00_01_ac_e8", "windangle""") lt 360 ? "N" : "-1"}
Zitat von: Rudi_Hirsch am 25 Juli 2025, 15:26:50ReadingsVal ("netatmo_M06_00_00_01_ac_e8", "windangle""")
Das ist syntaktisch falsch.
Moin,
Ich habe dir mal ein Demodevice gebaut, das sollte das tun was du vorhast:
define netatmo_M06_00_00_01_ac_e8 dummy
attr netatmo_M06_00_00_01_ac_e8 readingList windangle
attr netatmo_M06_00_00_01_ac_e8 setList windangle
attr netatmo_M06_00_00_01_ac_e8 userReadings windangle_txt:windangle:.* {\
my $input = ReadingsNum($name, "windangle", -1);;\
my @winddir_name=("N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW");;\
return $winddir_name[int((($input + 11.25) % 360) / 22.5)];;\
}
Zum Ausprobieren: https://demo-fhem.cooltux.net/fhem?detail=netatmo_M06_00_00_01_ac_e8