Readings aus HTTPMOD formatieren

Begonnen von mahowi, 09 Januar 2015, 15:14:44

Vorheriges Thema - Nächstes Thema

mahowi

Hallo,

ich bin noch Neuling in fhem und meine Perl-Kenntnisse sind leider etwas eingerostet. Das letzte Mal habe ich wohl vor 15 Jahren ind Perl programmiert.

Ich lese den Zustand meiner tado° Heizungssteuerung mittel HTTPMOD aus. Leider wird die Ist-Temperatur mit 14 Nachkommastellen ausgegeben.
Zitat"insideTemp":19.540000915527344
Jetzt möchte ich die Temperatur nur mit 1 Nachkommastelle anzeigen und auswerten, bin aber scheinbar zu blöd dazu.  :-[ "valueFormat" wird ja von HTTPMOD nicht unterstützt. Probiert habe ich es bisher mit
attr tado_temp stateFormat {sprintf("%.1f", ReadingsVal($name,"insideTemp",0))}
und
attr tado_temp userReadings tado_temp:tempist {sprintf("%.1f", ReadingsVal("tado_temp","tempist",0))}.
Beides bringt genau nichts.

Ausgelesen habe ich die Daten mittels
define tado_temp HTTPMOD https://my.tado.com/mobile/1.5/getCurrentState?password=PASSWORT&username=LOGIN 300
attr tado_temp userattr reading1Name reading1Regex reading2Name reading2Regex reading3Name reading3Regex reading4Name reading4Regex requestHeader1 requestHeader2
attr tado_temp reading1Name tempist
attr tado_temp reading1Regex insideTemp":([\d\.]+)
attr tado_temp reading2Name tempsoll
attr tado_temp reading2Regex setPointTemp":([\d\.]+)
attr tado_temp reading3Name operation
attr tado_temp reading3Regex operation":"([\w\.]+)
attr tado_temp reading4Name controlPhase
attr tado_temp reading4Regex controlPhase":"([\w\.]+)
attr tado_temp requestHeader1 Content-Type: application/json
attr tado_temp requestHeader2 Accept: */*

wie in diesem Thread beschrieben.

Kann mich mal jemand in die richtige Richtung stupsen?  ;) Mir fällt auch kein Regex ein, mit dem ich nur die erste Nachkommastelle auslese.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

StefanStrobel

Hallo,

Du kannst mit Reading1Expr eine Perl-Expression auf den extrahierten Wert anwenden. Der bisherige Wert steht dabei in $val.
Beispiel:

attr PM reading04Expr $val * 25 / 100

entsprechend kannst Du auch ein sprintf einbinden.

Wenn Du gleich in der Regex nur die erste nachkommastelle extrahieren möchtest, dann versuch doch mal die Expression expliziter zu formulieren. Statt insideTemp":([\d\.]+) beispielsweise insideTemp":(\d+\.\d\d) oder ähnlich.
Am besten schaust Du Dir in Ruhe mal das Perl-Regex Tutorial an:
http://perldoc.perl.org/perlretut.html

Gruss
   Stefan


mahowi

Vielen Dank!  :)
Ich hatte zwar auch das ReadingXExpr im Wiki bzw. der commandref gesehen, dachte aber, damit kann man nur einfache arithmetische Berechnungen ausführen.

attr tado_temp reading1Expr {sprintf("%.1f", $val)} tut jetzt genau das, was ich wollte.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

jkriegl

#3
Möchte grosse Zahlen (ganzzahlig) mit Tausender-Punkt formatieren. Es sind Impfzahlen z.B. sum_doses 25399437
Habe so etwas $zahl =~ s/(\d{1,3})
  (?=  (?:\d\d\d)+  (?!\d)  )
/$1\./gx;
und eine sub taupu gefunden. Aber wie baut man das ein? (mit readingxxFormat, ohne über userReadings zu gehen)
Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

Benni

Einen über 6 Jahre alten Thread für sowas wiederzubeleben .... ::)

Schau mal da: https://forum.fhem.de/index.php?topic=97807.0

Das ist erst 2 Jahre alt  ;D

gb#

yersinia

viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

jkriegl

Danke. Wollte eigentlich userReadings vermeiden, damit habe ich es hinbekommen.

Eher habe ich an so etwas wie das Entwickler-Modul UConv gedacht.
attr device readingxxOExpr UConv::f2c($val,2) bzw. Aufruf einer sub "taupu" aus 99_myUtils
Oder wäre readingxxOExpr 99_myUtils:taupu($val) sogar richtig?
Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

frank

wenn perl code als argument erlaubt ist, wird perl code normaler weise in geschweifte klammern gesetzt.
schon mal so probiert?
readingxxOExpr {taupu($val)}
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

jkriegl

Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly