FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: edition am 17 Juli 2025, 16:14:52

Titel: userReadings mit und. Geht das überhaupt?
Beitrag von: edition am 17 Juli 2025, 16:14:52
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
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: betateilchen am 17 Juli 2025, 16:28:55
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.
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: JudgeDredd am 17 Juli 2025, 16:29:17
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
      }
    }
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: betateilchen am 17 Juli 2025, 16:30:34
Aber logische UND Verknüpfungen stellt man meines Wissens mit && dar und nicht mit ,,and"
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: jkriegl am 17 Juli 2025, 16:32:46
Hier gibt es etwas Fertiges
https://forum.fhem.de/index.php?topic=54716.0 (https://forum.fhem.de/index.php?topic=54716.0)
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: edition am 17 Juli 2025, 19:43:41
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
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: passibe am 17 Juli 2025, 22:57:06
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).)
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: manne44 am 23 Juli 2025, 14:14:38
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.
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: JudgeDredd am 23 Juli 2025, 14:39:27
genau aus Diesem Grund empfehle ich auf Textwurst zu verzichten.
Bei Deinem Vorschlag stimmt die Klammersetzung nicht !
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: manne44 am 23 Juli 2025, 14:44:40
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.
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: manne44 am 23 Juli 2025, 15:03:44
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.
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: Rudi_Hirsch am 25 Juli 2025, 15:26:50
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"}
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: betateilchen am 25 Juli 2025, 16:13:10
Zitat von: Rudi_Hirsch am 25 Juli 2025, 15:26:50ReadingsVal ("netatmo_M06_00_00_01_ac_e8", "windangle""")

Das ist syntaktisch falsch.
Titel: Aw: userReadings mit und. Geht das überhaupt?
Beitrag von: Torxgewinde am 25 Juli 2025, 16:30:27
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