Allgemeine frage zu statefomat

Begonnen von Tommy, 03 Januar 2021, 16:18:39

Vorheriges Thema - Nächstes Thema

Tommy

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.

Beta-User

Das ",1" macht Text aus dem abgefragten Wert. Und Text ist in der Regel true....
Du willst vermutlich eigentlich in Zweig 2 ">0" haben ;) ?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

Wenn Du ohnehin Zahlenwerte vergleichen willst, solltest Du besser ReadingsNum() verwenden anstatt ReadingsVal().

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

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

Tommy

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

Tommy

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)

Tommy

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 

Otto123

#7
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

@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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

@Beta-User Deine Variante funktioniert nicht für ganze 10 er Schritte?
Also pct 52 geht, pct 50 nicht  :-[ da wird off angezeigt.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

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?

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

#11
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!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

...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?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tommy

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.