readinggroup Formatproblem

Begonnen von Heiner, 26 Juli 2014, 12:53:11

Vorheriges Thema - Nächstes Thema

Heiner

Hallo,

ich moechte gern in einer Readinggroup einen Wert darstellen bekomme es aber nicht hin.

Mein Reading lautet wie folgt:

statStateDayLast    on: 08:04:47 off: 15:55:13

Genau das bekomme ich auch leicht in meine Readinggroup.

Ich möchte aber eigentlich die Onzeit als Dezimalzahl haben und mit einem Leistungswert multiplizieren damit ich einen Tagesenergieverbrauch darstellen kann.

Der Leistungswert sind 1100 Watt.

Ich mochte also in der Readinggroup ein Valueformat erreichen das effetkiv das folgende macht:

(8(h) + 04(min)/60 + 47(sek)/60/60 )*1,1 (kW) = x kWh

x kWh soll angezeigt werden.

Wie mach ich das?

Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

justme1968

#1
zum beispiel so {return ($1 + $2/60 + $3/60/60) * 1.1 if( $VALUE =~ m/(\d{2}):(\d{2}):(\d{2})/ ); return 0;}

wobei der beitrag der der sekunden höchsten etwa 0.01 ist ist und vermutlich im rauschen unter geht.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Heiner

super Danke.

Damit ich das verstehe:
{return ($1 + $2/60 + $3/60/60) * 1.1}

$1,2,3 bezieht sich auf den Wert nach dem 1,2,3 Doppelpunkt, richtig? ( Also "on" waere $0)

if( $VALUE =~ m/(\d){2}:(\d){2}:(\d){2}/ );
reduziere ich hier jeden Wert auf 2 Ziffern? Rein vorsorglich da das Zeit reading ja eigentlich nie anders sein kann ?

); return 0;
wofuer ist das? Um die Offzeit zu ignorieren? wäre das nicht automatisch da wir ja $4-7 nicht beschreiben?

Wie bau ich jetzt noch meine Einheit  "kWh" ein? Das folgende bringt nix:
{return ($1 + $2/60 + $3/60/60) * 1.1 if( $VALUE =~ m/(\d){2}:(\d){2}:(\d){2}/ ); return 0;" kWh"}

Kann ich nun noch die Nachkommastellen des berechneten Werts limitieren?Wie würde das dann aussehen? So wie unten geht's nicht:
{return ($1 + $2/60 + $3/60/60) * 1.1(\d){2} if( $VALUE =~ m/(\d){2}:(\d){2}:(\d){2}/ ); return 0;}

Danke nochmals fuer die Hilfe


Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

justme1968

#3
in der version aus dem bespiel werden die werte per regex matching aus dem string geholt. mehr zu regex findest du z.b. hier: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm

es wird nichts reduziert sondern nach einem muster gesucht. 2 ziffern gefolgt von einem doppelpunkt gefolgt von 2 ziffern gefolgt von einem doppelpunkt gefolgt von zwei ziffern. alles andere matched nicht.

wenn dein reading nicht dieses format hat sondern z.b. auch ein stellige minuten oder drei stellige stunden vorkommen können musst du den ausdruck anpassen. z.b. so:(\d+):(\d+):(\d+)das wären dann ein oder mehr ziffern gefolgt von einem doppelpunkt gefolgt von ein oder mehreren ziffern ...

$1, $2, ... ist jeweils das ergebnis des n-ten in runden klammern stehenden ausdrucks. also die stunden, minuten und sekunden.

mit diesen wird gerechnet und das ergebnis zurückgegeben wenn es einen match gibt. sonst wird 0 zurück gegeben.

du hängst an die Berechnung noch ein ." kWh" an.

wenn du den wert runden möchtest geht das z.b. mit sprintf. oder du multiplizierst mit 110 statt 1.1, addierst 0.5 zum runden, schneidest den nachkomma anteil mit int() ab und teilst durch 100.

alles zusammen wäre das z.b. so etwas:{return int(($1 + $2/60 + $3/60/60) * 110+0.5)/100 ." kWh" if( $VALUE =~ m/(\d+):(\d+):(\d+)/ ); return "nichts";}

ps: in meiner version oben waren die klammern falsch. habe ich eben noch korrigiert.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Heiner

wau, mein Hirn dampft, ich glaub ich muss das noch 2-3 mal lesen bis ich's versteh

aber es funktioniert, super und Vielen Dank.
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

Heiner

Hi, also ich versteh die Mathematik noch nicht.

Du sagst zum runden machen wir das hier:
Zitatint((x) * 110+0.5)/100

Also mal angenommen ich habe eine Variable mit dem Wert 1,23456 und moechte diese nach der 2ten Endstelle gerundet haben,
dann waere mein Verstaendnis zu sagen

1,98765 * 100 = 198,765dann mittels INT die Nachkommas eliminieren
int(198,765) = 198
und dann durch 100 teilen
198*100 = 1,98

ist zwar nun nur abgeschnitten und nicht gerundet, passt aber grob.

Mit der Formel oben bekomme ich aber
int(218,64+0,5)/100 = 2,19 also ein völlig falsches Ergebnis raus.

Ich steh auf dem Schlauch.
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

justme1968

du bringst grad etwas durcheinander. die eigentliche formel ist int(x * 100+0.5)/100
die 110 steht da nur weil du in deinem posting ganz oben mit 1.1 multiplizierst. 1.1*100 = 110. die 0.5 sind zum runden statt abschneiden.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Heiner

oh man, das war aber mal eine richtig dummer Frage  :-[
Danke, jetzt hab ichs begriffen.
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2