FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Heiner am 26 Juli 2014, 12:53:11

Titel: readinggroup Formatproblem
Beitrag von: Heiner am 26 Juli 2014, 12:53:11
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?

Titel: Antw:readinggroup Formatproblem
Beitrag von: justme1968 am 26 Juli 2014, 15:58:43
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
Titel: Antw:readinggroup Formatproblem
Beitrag von: Heiner am 26 Juli 2014, 16:37:51
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


Titel: Antw:readinggroup Formatproblem
Beitrag von: justme1968 am 26 Juli 2014, 16:51:59
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 (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.
Titel: Antw:readinggroup Formatproblem
Beitrag von: Heiner am 26 Juli 2014, 17:04:46
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.
Titel: Antw:readinggroup Formatproblem
Beitrag von: Heiner am 28 Juli 2014, 18:06:38
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.
Titel: Antw:readinggroup Formatproblem
Beitrag von: justme1968 am 28 Juli 2014, 18:38:25
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
Titel: Antw:readinggroup Formatproblem
Beitrag von: Heiner am 29 Juli 2014, 11:56:39
oh man, das war aber mal eine richtig dummer Frage  :-[
Danke, jetzt hab ichs begriffen.