FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Tommy am 03 Januar 2021, 16:18:39

Titel: Allgemeine frage zu statefomat
Beitrag von: Tommy am 03 Januar 2021, 16:18:39
Hallo,
ich habe nur mal kurz eine verständnisfrage an die Profis unter euch:

Ich habe ein homematic dimmer:

So die konf:

attr webCmd pct
attr devStateIcon on:li_wht_on off:li_wht_off
attr statefomat {if(ReadingsVal($name,"level",0)==0) {"off"} elsif (ReadingsVal($name,"level",0)==100,1) {"on"}}

es funktioniert auch was ich vor hatte, allerdings vertsehe ich nicht warum es so funktioniert.

Bei dim 0 Prozent = Leute aus
Bei dim 1-100 Prozent = Leuchte an

Sobald ich eine zahl (egal welche) hinter der 100 setze, funktioniert es:

attr statefomat {if(ReadingsVal($name,"level",0)==0) {"off"} elsif (ReadingsVal($name,"level",0)==100,1) {"on"}}

Aber warum?

vielleicht kann mich jemand aufklären.
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Beta-User am 03 Januar 2021, 16:31:48
Das ",1" macht Text aus dem abgefragten Wert. Und Text ist in der Regel true....
Du willst vermutlich eigentlich in Zweig 2 ">0" haben ;) ?
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: betateilchen am 03 Januar 2021, 17:08:44
Wenn Du ohnehin Zahlenwerte vergleichen willst, solltest Du besser ReadingsNum() verwenden anstatt ReadingsVal().

Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: rudolfkoenig am 03 Januar 2021, 18:12:05
ZitatDas ",1" macht Text aus dem abgefragten Wert. Und Text ist in der Regel true....
Ich tippe eher darauf, dass Komma hier als Befehlstrenner wahrgenommen wird, damit ist 1 das letzte  Element, und deswegen Rueckgabewert
fhem> define d dummy
fhem> setreading d r1 v1
fhem> { ReadingsVal("d", "r1", 0) }
v1
fhem> { ReadingsVal("d", "r1", 0),7 }
7
fhem> setreading d r2 v2
fhem> { ReadingsVal("d", "r1", 0),ReadingsVal("d", "r2", 2) }
v2
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Tommy am 04 Januar 2021, 00:46:28
Zitat von: Beta-User am 03 Januar 2021, 16:31:48
Das ",1" macht Text aus dem abgefragten Wert. Und Text ist in der Regel true....
Du willst vermutlich eigentlich in Zweig 2 ">0" haben ;) ?

eigentlich wollte ich mit dem zweig 2 (von/bis) machen, also 1-100 = Leuchte an (Symbol).

Aber leider finde ich keine ordenliche doku darüber und da ich keiner bin der gleich nachfragt, (Selbst ist der Mann ;D) wollte ich das selber ausprobieren. Nur jetzt check ich es halt net.

danke für deine antwort
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Tommy am 04 Januar 2021, 00:50:59
Zitat von: betateilchen am 03 Januar 2021, 17:08:44
Wenn Du ohnehin Zahlenwerte vergleichen willst, solltest Du besser ReadingsNum() verwenden anstatt ReadingsVal().

Erstmal danke für deine anwort.

von der funktion ReadingsNum()  höre ich zum ersten mal (Aber ich bin auch kein profi, ich versuche eigentlich immer selbst auf eine lösung zu kommen)
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Tommy am 04 Januar 2021, 00:54:57
Zitat von: rudolfkoenig am 03 Januar 2021, 18:12:05
Ich tippe eher darauf, dass Komma hier als Befehlstrenner wahrgenommen wird, damit ist 1 das letzte  Element, und deswegen Rueckgabewert
fhem> define d dummy
fhem> setreading d r1 v1
fhem> { ReadingsVal("d", "r1", 0) }
v1
fhem> { ReadingsVal("d", "r1", 0),7 }
7
fhem> setreading d r2 v2
fhem> { ReadingsVal("d", "r1", 0),ReadingsVal("d", "r2", 2) }
v2



auch dir danke für deine antwort

Wenn ich das richtig verstehe könnte ich auch die 1 weglassen und es würde funktionieren. (Oder? :-\)
Werde ich morgen mal testen und danach berichten 
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Otto123 am 04 Januar 2021, 08:58:52
Zitat von: Tommy am 03 Januar 2021, 16:18:39
Ich habe ein homematic dimmer:
Hi,

Deinen letzte Schlussfolgerung ist falsch, es würde dann exakt auf 100 geprüft.
Vergleiche innerhalb eines Bereiches müssen separat mit (Zahl > 0) and (Zahl <= 100) durchgeführt werden.

Ich hätte noch folgenden einfacheren alternativen Vorschlag:
ohne das zusätzliche attr stateFormat
attr LichtWzL_Dim devStateIcon \d+:li_wht_on off:li_wht_off

Erklärung: sobald im STATE nur noch der Level als Zahl 1-100 (genau genommen beliebige Ziffernfolge) steht greift das regExp \d+
Die Zwischenzustände werden angezeigt. Ist das nicht erwünscht könnte man dafür weitere Symbole einblenden im einfachsten Fall ist der Rest mit dem Toggle Symbol belegt:
attr LichtWzL_Dim devStateIcon \d+:li_wht_on off:li_wht_off .*:toggle
Man kann das noch aufwendiger machen und die einzelnen Dim Stufen Symbole hinterlegen.

Gruß Otto
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Beta-User am 04 Januar 2021, 09:27:55
@Rudi und betateilchen:
Ihr habt selbstredend recht, hatte nur auf die Schnelle am Handy gesehen, dass die Syntax halt verbogen ist...

@Tommy
Falls ein anderes Icon in Frage kommt, könnte man sowas auch ganz ohne stateFormat nur mit devStateIcon lösen:
devStateIcon {Color::devStateIcon($name,'dimmer','','level','state')}
Hat u.A. auch den Vorteil, dass man Kommunikationsprobleme direkt angezeigt bekommt...
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Otto123 am 04 Januar 2021, 09:58:38
@Beta-User Deine Variante funktioniert nicht für ganze 10 er Schritte?
Also pct 52 geht, pct 50 nicht  :-[ da wird off angezeigt.
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Beta-User am 04 Januar 2021, 10:08:01
Hmm, "eigentlich" sollte das mit allem zwischen 0 und 100 klappen, zumindest finde ich ab https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/Color.pm#L458 auf die Schnelle keinen Anhaltspunkt, warum das schief gehen sollte...

Eventuell muss man ein anderes "onoff"- und/oder "pct"-Reading angeben?

Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Otto123 am 04 Januar 2021, 10:52:22
Naja die Zeile zieht mMn wenn im state was mit 0 drin steht :)
Zitat471 return ".*:off:toggle" if( $onoff && ::ReadingsVal($name,$onoff,'') =~ m/(0|off$)/i );

Wenn man das so ändert?
m/(^0|off$)/i
Oder noch exakter:
m/(^0$|off$)/i

Diesen Code gibt es mehrfach!
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Beta-User am 04 Januar 2021, 11:26:16
...klingt plausibel, v.a., weil ein evtl. och enthaltenes "set" ja vorne schon abgefangen wird...

Hmm, und die runden Klammern sehen eigentlich für meine ungeübten Augen auch unnötig aus. (Die Abfrage gibt es btw. in #505 nochmal).

Kontaktierst du justme1968?
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Otto123 am 04 Januar 2021, 11:31:45
mach ich ...
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Tommy am 04 Januar 2021, 12:47:21
Also erstmal vielen,vielen  dank für eure antworten und erklärungen.

ich werde das mal alles ausprobieren.

Könnt ihr mir ein gutes buch oder eine Hompage empfehlen? (Für Anfänger)
Sodass ich es auch selber lernen kann....oder nachlesen könnte.




Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Beta-User am 04 Januar 2021, 12:58:54
Ist (noch) schwierig, und inwieweit pah's Buch Perl-Grundlagen abdeckt, kann ich auch im Moment nicht sagen; vermutlich eher weniger.

Was du v.a. hattest, waren ein paar Syntaxfehler, die ggf. dann auch mit der Aktivierung von "codemirror" (FHEMWEB/Javascript-plugin) deutlich leichter zu sehen gewesen wären.
Für spezielle Perl-Funktionen iVm. FHEM und FHEM-Grundfunktionalität empfehle ich gerne die commandref_modular (https://fhem.de/commandref_modular_DE.html#perl). Da ist m.E. sehr viel mehr an "prinzipiellem" drin, wie man auf den ersten Blick vielleicht erkennt, v.a., wenn man sich nicht auf den verlinkten Perl-Abschnitt beschränkt....
Titel: Antw:Allgemeine frage zu statefomat
Beitrag von: Otto123 am 04 Januar 2021, 14:25:41
Dan hatte dann im Doppelmoppel Thread noch eine Alternative :)
https://forum.fhem.de/index.php/topic,43014.msg1117718.html#msg1117718
Zur Literatur:
Die Grundlage im Wiki https://wiki.fhem.de/wiki/Erste_Schritte_in_FHEM und das Anfänger PDF auf der ersten Seite würden auch schon helfen.
Und für den nächsten Post :) https://forum.fhem.de/index.php/topic,71806.0.html