userReadings Beispiel mit dummy

Begonnen von tomspatz, 24 April 2021, 10:32:23

Vorheriges Thema - Nächstes Thema

tomspatz

defmod WerteTest dummy
attr WerteTest alias WerteTest
attr WerteTest group Heizung & Temperatur
attr WerteTest icon sani_heating_manual
attr WerteTest room System,Wohnzimmer
attr WerteTest setList state:8.00,8.50,9.00,9.50,10.00,10.50,11.00,11.50,12.00,12.50,13.00,13.50,14.00,14.50,15.00,15.50,16.00,16.50,17.00,17.50,18.00,18.50,19.00,19.50,20.00,20.50,21.00,21.50,22.00,22.50,23.00,23.50,24.00,24.50,25.00,25.50,26.00,26.50,27.00,27.50,28.00
attr WerteTest stateFormat {sprintf(" %.1f °C",(ReadingsNum("HeizungReglerWohnzimmer","state",0)))}
attr WerteTest userReadings temperature:state.* { ReadingsVal("WerteTest","state",0) }
attr WerteTest webCmd state

Mit diesem Konstrukt gibt es ja ein "dropDown" mit den Werten. in der WEB kann man es bedienen und dementsprechend wird state aktualisiert. Soweit OK.
Aber das userReading NICHT. Das tut nur wenn man unterhalb im WEB auf "set Werte Test state WERT" klickt.
Dann wird aus state Wert -> state state Wert
Erst adann wird das userreadings erstellt allerdings mit state Wert.

Was stimmt denn da nicht ?

Jamo

#1
Du versuchst hier mit einer setlist fuer state ein userreading fuer temperature zu erzeugen.
Mache doch direkt alles für temperature, also

attr WerteTest setList temperature: 8.00 ...
attr WerteTest readingList temperature
attr WerteTest webCmd temperature


Ich glaube man muss auch noch das attr readingList setzen.

Wenn ich mich richtig erinnere, müsste im userReadings auch ein Doppelpunkt nach dem state, da hat Rudi mal was geändert, also: attr WerteTest userreadings temperature:state:.* ....

Und ReadingsVal auf ReadingsNum ändern.
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

TomLee

und mit dem selectnumbers-Widget wirds nochmal um etwas kürzer, übersichtlicher:

temperature:selectnumbers,8.00,0.5,28.00,2,lin

Otto123

Zitat von: tomspatz am 24 April 2021, 10:32:23
Was stimmt denn da nicht ?
Es gibt keinen Event mit state - eine "Besonderheit" in FHEM.
ZitataddStateEvent
Das mit dem state Reading verknüpfte Event ist speziell, da das dazugehörige Prefix "state: " entfernt wird, d.h. $EVENT ist nicht "state: on", sondern nur "on". In manchen Fällen ist es aber erwünscht das unmodifizierte Event zu bekommen, d.h. wo "state: " nicht entfernt ist. Für diese Fälle sollte addStateEvent auf 1 gesetzt werden, die Voreinstellung ist 0 (deaktiviert).
Achtung:
dieses Attribut muss beim Empfänger (notify, FileLog, etc) gesetzt werden.
dieses Attribut zeigt nur für solche Geräte-Events eine Wirkung, die readingFnAttributes unterstützen.
Ich meine aber, das gibt es bei Dummy und userReadings nicht.
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

TomLee

#4
ZitatEs gibt keinen Event mit state - eine "Besonderheit" in FHEM.

Es gibt doch einen Event bei Änderung mit dem setter state, das Reading wird rot und im Eventmonitor taucht es auch auf.

Ich mein das geht schon, der trigger muss bloss richtig gesetzt werden.

Zum nachvollziehen, das userReadings temperature reagiert nur bei Änderung in state:


[s]defmod WerteTest dummy
attr WerteTest alias WerteTest
attr WerteTest group Heizung & Temperatur
attr WerteTest icon sani_heating_manual
attr WerteTest readingList state bla
attr WerteTest room Test
attr WerteTest setList state:selectnumbers,8.00,0.5,28.00,2,lin bla:1,2,3
attr WerteTest stateFormat {sprintf(" %.1f °C",(ReadingsNum("HeizungReglerWohnzimmer","state",0)))}
attr WerteTest userReadings temperature::.* { ReadingsVal("WerteTest","state",0) }
attr WerteTest webCmd state[/s]


Edit: Offensichtlich Käse mit dem richtigen trigger k.A. was da beim testen schief lief

tomspatz

Vielen dank an Jamo, der Anstoss für temperature statt state war goldig.

Ach dankeschön an TomLee, das widgek kannte ich noch nicht.

SO, ist es wie ich es haben wollte:
defmod WerteTest dummy
attr WerteTest alias WerteTest
attr WerteTest group Heizung & Temperatur
attr WerteTest icon sani_heating_manual
attr WerteTest readingList temperature
attr WerteTest room Test
attr WerteTest setList temperature:selectnumbers,8.0,0.5,28.0,1,lin
attr WerteTest stateFormat {sprintf(" %.1f °C",(ReadingsNum("$name","temperature",0)))}
attr WerteTest webCmd temperature

TomLee

Mir war nach dem zeigen des selectnumbers-Beispiel noch aufgefallen das die Angabe der Nachkommastellen im Widget unnötig sind, man gibt die Anzahl anzuzeigenden Nachkommastellen ja in einem Parameter an.

Also dann einfach :
temperature:selectnumbers,8,0.5,28,1,lin

wenns jetzt nur noch eine sein soll.

Jamo

attr WerteTest stateFormat {sprintf(" %.1f °C",(ReadingsNum("$name","temperature",0)))}

So wäre es noch einfacher, temperature hat eh nur 1 Nachkommastelle, muss also nicht nochmal formatiert werden, ein einfaches concatenation geht auch: attr WerteTest stateFormat {return ReadingsNum($name,"temperature",0) . " °C"}
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

TomLee

#8
Nochmal zu dem trigger bei state, auch wenn das jetzt nicht mehr das Thema ist.

Wie erwähnt ein Event gibts doch mit dem setter state ein Event.
Auch beim dummy trifft doch auch zu dass das dazugehörige Prefix "state: " entfernt wird, sieht man doch im Event-Monitor.

Wenn man es so definiert:

temperature:.*
oder so:
temperature:.+
dann reagiert man immer auf alle Readings.

Wenn man aber mit einem regexp genau spezifiziert auf welchen Wert man in state reagieren möchte (hier eine Zahl mit Nachkommastellen), dann klappt das doch nur auf state zu reagieren.

defmod WerteTest dummy
attr WerteTest alias WerteTest
attr WerteTest group Heizung & Temperatur
attr WerteTest icon sani_heating_manual
attr WerteTest readingList state bla
attr WerteTest room Test
attr WerteTest setList state:selectnumbers,8,0.5,28,2,lin bla:1.1,2.8,3.6
attr WerteTest stateFormat {sprintf(" %.1f °C",(ReadingsNum("HeizungReglerWohnzimmer","state",0)))}
attr WerteTest userReadings temperature:.(\d+\.\d+) { ReadingsVal("WerteTest","state",0) }
attr WerteTest webCmd state


Versteh ich was falsch oder macht mans doch anders, wie macht mans denn korrekt wenn man auf irgendwas in state reagieren wollte ?

Otto123

Zitat von: TomLee am 24 April 2021, 12:45:34
Es gibt doch einen Event bei Änderung mit dem setter state, das Reading wird rot und im Eventmonitor taucht es auch auf.
naja wenn man set WerteTest state schnulli absetzt gibt es den Begriff state im Event. und im state steht dann: state schnulli - das wollte ja keiner ;)
Hat aber nichts damit zu tun, dass man beim userReadings normal nicht
userReadings temperature:state.*
schreiben kann.
Nicht mehr und nicht weniger wollte ich damit sagen. Und addStateEvent gibt es an der Stelle glaube ich nicht.

Wobei: bei einem Dummy auf alle readings zu reagieren ist auch egal. Es gibt doch nur das eine :)
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

TomLee

#10
ZitatWobei: bei einem Dummy auf alle readings zu reagieren ist auch egal. Es gibt doch nur das eine

Deswegen hab ich in dem gerade gezeigten Beispiel bla noch zusätzlich dazugenommen zum nachvollziehen auf was ich hinaus bin.

Bei mir gibts übrigens ausser Test-Dummys keine weiteren, mir gehts nur um das Verständnis.