[gelöst] pearl - Reading bearbeiten und neuem Reading zuweisen

Begonnen von harald654, 29 September 2020, 00:54:58

Vorheriges Thema - Nächstes Thema

harald654

Hallo,

für meine Fenster-Thermostatsteuerung habe ich ein DOIF erstellt.
Wenn das Fenster öffnet wird der Betriebsmodus des Thermostats ausgelsen und in einem Reading gespeichert, bevor das Thermostat auf OFF gesetzt wird. Wird das Fenster wieder geschlossen wird das Thermstats auf den im Reading gespeicherten Betriebsmodus gesetzt:

([ZWave_SENSOR_NOTIFICATION_38:zustand] eq "open")
(set $SELF rstate [ZWave_THERMOSTAT_2:thermostatMode])
(set ZWave_THERMOSTAT_2 tmOff)
DOELSE
(set ZWave_THERMOSTAT_2 [$SELF:rstate])


Das funktioniert soweit auch, nur ist der ausgelesene Betriebsmodus klein geschrieben, der Modus zum setzen muss  aber groß geschrieben werden...
Ich muss also z.B. aus heating -> TmHeating machen.

Mit Perl ist dies über ucfirst möglich, wenn ich in die Commandline eingebe:
{"Tm".ucfirst(ReadingsVal("ZWave_SENSOR_NOTIFICATION_2","zustand","heating"))}
bekomme ich als Ausgabe mein gewolltes Ergebniss:
TMHeating


Allerdings scheitere ich dies in dem DOIF umzusetzen und den mit Perl bearbeiten Wert in einem Reading zu spiecher.
Ich hab es mit set_Reading versucht, aber das funktioniert nicht :/

([ZWave_SENSOR_NOTIFICATION_38:zustand] eq "open")
(set_Reading("rstate",{"Tm".ucfirst(ReadingsVal("ZWave_SENSOR_NOTIFICATION_2","zustand","heating"))}))
(set ZWave_THERMOSTAT_2 tmOff)
DOELSE
(set ZWave_THERMOSTAT_2 [$SELF:rstate])


Fehlermeldung:
Zitat
2020-09-29 00:52:15 DOIF Steu_FenHeiz_Bad error: set_Reading("rstate",{"Tm".ucfirst(ReadingsVal("ZWave_SENSOR_NOTIFICATION_2","zustand","heating"))}): Unknown command set_Reading("rstate",{"Tm".ucfirst(ReadingsVal("ZWave_SENSOR_NOTIFICATION_2","zustand","heating"))}), try help.


Kann jemand weiterhelfen?

mumpitzstuff

Schau dir bitte die Commanref zum Perl Modus noch mal genau an.

define di_rc_tv DOIF {if ([remotecontol:"on"]) {fhem_set"tv on"} else {fhem_set"tv off"}}

Um den gesamten Block ist eine geschweifte Klammer und es wird if Else verwendet anstatt DOELSE.

Otto123

Hi,

oder Du bleibst im normal Modus und verwendest den guten alten FHEM set magic Syntax. Nicht getestet:
([ZWave_SENSOR_NOTIFICATION_38:zustand] eq "open")
(setreading $SELF rstate {("Tm".ucfirst(ReadingsVal("ZWave_SENSOR_NOTIFICATION_2","zustand","heating")))})
(set ZWave_THERMOSTAT_2 tmOff)
DOELSE
(set ZWave_THERMOSTAT_2 [$SELF:rstate])


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

Damian

Zitat von: Otto123 am 29 September 2020, 11:50:54
Hi,

oder Du bleibst im normal Modus und verwendest den guten alten FHEM set magic Syntax. Nicht getestet:
([ZWave_SENSOR_NOTIFICATION_38:zustand] eq "open")
(setreading $SELF rstate {("Tm".ucfirst(ReadingsVal("ZWave_SENSOR_NOTIFICATION_2","zustand","heating")))})
(set ZWave_THERMOSTAT_2 tmOff)
DOELSE
(set ZWave_THERMOSTAT_2 [$SELF:rstate])


Gruß Otto

nur, dass set Magic hier gar nicht zum Zuge kommt, weil es die ursprüngliche Syntax von DOIF ist, aber das muss ja keiner Wissen ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

harald654

Danke für eure Hilfe,

ich habe es inzwischen hinbekommen mit:
({fhem "setreading $SELF rstate tm".ucfirst(ReadingsVal("ZWave_SENSOR_NOTIFICATION_2","zustand","heating"))})

Der Vorschlag von Otto funktionert ebenfalls und gefällt mir zudem noch besser, danke dafür :)