FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Larusso am 09 Juli 2019, 12:36:17

Titel: [gelösst] Nachkommastellen im userReadings beschränken
Beitrag von: Larusso am 09 Juli 2019, 12:36:17
Hallo zusammen,

ich habe mir aus dem Netz ein Schnippsel zusammengestellt was mir meinen Stromverbrauch als reading anzeigt, das funktioniert auch alles super. Ich bekomme es aber einfach von der syntax nicht hin meine Readings mit nur zwei Nachkommastellen anzeigen zu lassen. Könnte mir hier jemand unter die Arme greifen, danke.

hier das userReadings:
PulsZeit:Time.* {ReadingsVal("$name", "Time", 0)/1000 },StromverbauchAktuell:Time.* { my $zeit = ReadingsVal("$name", "Time", 0); if($zeit > 0){sprintf("%.2f",3600/ReadingsVal("$name", "PulsZeit", 0));} else {sprintf("0");}},TagesVerbrauch:Time.* { ReadingsVal("$name", "Total", 0)/150 },ZaehlerStand:Time.* monotonic { ReadingsVal("$name", "Total", 0)/150}



und mein device:
Internals:
   .AttrList  IODev Interval adjustValue colorpicker:RGB,HSV,HSVp deepsleep:0,1 disable:1,0 disableRiskyCmds disabledForIntervals displayTextEncode:1,0 displayTextWidth do_not_notify:0,1 event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading mapLightCmds:lights,nfx maxCmdDuration:slider,0,0.25,15,1 parseCmdResponse pollGPIOs presenceCheck:1,0 readingPrefixGPIO readingSuffixGPIOState readingSwitchText:1,0,2 rgbGPIOs setState:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25,50,100 useSetExtensions:0,1 userSetCmds:textField-long wwcwGPIOs
   CFGFN     
   DEF        192.168.178.157 80 espBridge Stromzaehler_Impulsgeber
   ESP_BUILD  20103
   ESP_BUILD_GIT mega-20190607
   ESP_BUILD_NOTES  - Mega
   ESP_NODE_TYPE_ID ESP Easy Mega
   ESP_SLEEP  0
   ESP_UNIT   0
   ESP_VERSION 2
   FUUID      5d233e32-f33f-7f1e-a839-0e6336f38e8f1669
   HOST       192.168.178.157
   IDENT      Stromzaehler_Impulsgeber
   INTERVAL   300
   IODev      espBridge
   LASTInputDev espBridge
   MAX_CMD_DURATION 1
   MSGCNT     1292
   NAME       ESPEasy_Stromzaehler_Impulsgeber
   NOTIFYDEV  global
   NR         3194
   NTFY_ORDER 50-ESPEasy_Stromzaehler_Impulsgeber
   PORT       80
   STATE      Count: 2 Time: 3819 Total: 2298
   SUBTYPE    device
   TYPE       ESPEasy
   VERSION    2.18
   espBridge_MSGCNT 1292
   espBridge_TIME 2019-07-09 12:34:53
   .attraggr:
   .attrminint:
   .userReadings:
     HASH(0x5b23338)
     HASH(0x5b3a130)
     HASH(0x62ef7c0)
     HASH(0x62bb840)
   OLDREADINGS:
   READINGS:
     2019-07-09 12:34:53   Count           2
     2019-07-09 12:34:53   PulsZeit        3.819
     2019-07-09 12:34:53   StromverbauchAktuell 942.66
     2019-07-09 12:34:53   TagesVerbrauch  15.32
     2019-07-09 12:34:53   Time            3819
     2019-07-09 12:34:53   Total           2298
     2019-07-09 12:34:53   ZaehlerStand    34080.7533333333
     2019-07-09 12:31:05   presence        present
     2019-07-09 12:34:53   state           Count: 2 Time: 3819 Total: 2298
   helper:
     fpc        1562590771
     pm:
       Encode     1
       JSON       1
     received:
       Count      1562668493
       Time       1562668493
       Total      1562668493
   sec:
     admpwd     
Attributes:
   IODev      espBridge
   Interval   300
   alias      Stromzähler ESP Device
   group      Energiekosten
   icon       measure_power_meter
   presenceCheck 1
   readingSwitchText 1
   room       00.Schneider,ESPEasy
   setState   50
   userReadings PulsZeit:Time.* {ReadingsVal("$name", "Time", 0)/1000 },StromverbauchAktuell:Time.* { my $zeit = ReadingsVal("$name", "Time", 0); if($zeit > 0){sprintf("%.2f",3600/ReadingsVal("$name", "PulsZeit", 0));} else {sprintf("0");}},TagesVerbrauch:Time.* { ReadingsVal("$name", "Total", 0)/150 },ZaehlerStand:Time.* monotonic { ReadingsVal("$name", "Total", 0)/150}


unten ist mal ein Bild mit den Nachkommastellen die ich meine
Titel: Antw:Nachkommastellen im userReadings beschränken
Beitrag von: CoolTux am 09 Juli 2019, 12:46:53
Schau Dir einmal sprintf an.
https://www.perl-community.de/bat/poard/thread/11767
Titel: Antw:Nachkommastellen im userReadings beschränken
Beitrag von: t1me2die am 09 Juli 2019, 12:54:00
Moin, bei deinem Reading "StromverbauchAktuell" benutzt du doch schon erfolgreich sprintf mit zwei Nachkommastellen :)
Wenn du nun "TagesVerbrauch" und "ZaehlerStand" auch nur mit zwei Nachkommastellen haben möchtest, dann mach es genauso wie beim "StromverrbrauchAktuell"  :)

Oder wo hapert es nun genau?

Gruß
Mathze
Titel: Antw:Nachkommastellen im userReadings beschränken
Beitrag von: Larusso am 09 Juli 2019, 12:56:15
danke für die schnelle Antwort. Wie muss ich sprintf"%.2f" (steht ja für zwei Nachkommastellen) mit einbinden damit es sich auf reading TagesVerbrauch und Zaehlerstand auswirkt? Den Zusammenhang blicke ich noch nicht wirklich?
Titel: Antw:Nachkommastellen im userReadings beschränken
Beitrag von: t1me2die am 09 Juli 2019, 12:59:15
Ohne getestet zu haben, so oder so ähnlich könnte es ausschauen:


TagesVerbrauch:Time.* { sprintf('%.2f', ReadingsNum("$name", "Total", 0)/150)) }
ZaehlerStand:Time.* monotonic { sprintf('%.2f', ReadingsNum("$name", "Total", 0)/150)) }


Gruß
Mathze
Titel: Antw:Nachkommastellen im userReadings beschränken
Beitrag von: Larusso am 09 Juli 2019, 13:01:14
hab das ganze mal ein bisschen entzerrt und denke das es so funktionieren könnte......

PulsZeit:Time.* {ReadingsVal("$name", "Time", 0)/1000 },
StromverbauchAktuell:Time.* { my $zeit = ReadingsVal("$name", "Time", 0); if($zeit > 0){sprintf("%.2f",3600/ReadingsVal("$name", "PulsZeit", 0));}
else
{sprintf("0");}},
TagesVerbrauch:Time.* {sprintf("%.2f",ReadingsVal("$name", "Total", 0))/150 },
ZaehlerStand:Time.* monotonic {sprintf("%.2f",ReadingsVal("$name", "Total", 0))/150}
Titel: Antw:Nachkommastellen im userReadings beschränken
Beitrag von: Larusso am 09 Juli 2019, 13:02:29
Hallo t1me2die

warum setzt du '%.2f'

anstelle von ""

??
Titel: Antw:Nachkommastellen im userReadings beschränken
Beitrag von: t1me2die am 09 Juli 2019, 13:14:46
Moin, das Ergebnis wird in deinem Fall dasselbe sein.
Stichwort: Zeichenketten und Variableninterpolation
Zitat
...
Der Unterschied zwischen einfachen und doppelten Anführungszeichen besteht in der sogenannten Variableninterpolation
...

Paar Basic's zum nachlesen:
https://de.wikibooks.org/wiki/Perl-Programmierung:_Variablen (https://de.wikibooks.org/wiki/Perl-Programmierung:_Variablen)

PS.: Ist das Ergebnis nun wie gewünscht?

Gruß
Mathze
Titel: Antw:Nachkommastellen im userReadings beschränken
Beitrag von: Meck am 09 Juli 2019, 13:21:05
Zitat von: Larusso am 09 Juli 2019, 13:02:29
Hallo t1me2die

warum setzt du '%.2f'

anstelle von ""

??

Hallo Larusso,

die Frage habe ich mir auch am Anfang gestellt daher empfehle ich dir folgendes Buch:
https://upload.wikimedia.org/wikibooks/de/4/45/Perl.pdf

Auf Seite 19 udn20 steht deine Antwort.
Hier kannst du auch eine Codeschnipsel testen:
https://www.tutorialspoint.com/execute_perl_online.php


Gruß

Meck
Titel: Antw:Nachkommastellen im userReadings beschränken
Beitrag von: Larusso am 09 Juli 2019, 13:22:20
ja musste nur die dritte Klammer bei deiner Vorgabe entfernen, vielen dank.
Titel: Antw:[gelösst] Nachkommastellen im userReadings beschränken
Beitrag von: en-trust am 27 November 2020, 20:22:40
Ich habe folgendes Reading erstellt, bekomme aber dennoch keine Nachkommastelle.


ram_used {if (sprintf("%.2f",ReadingsVal("$name","ram",0) =~ m/Used:\s(\d+)/)) {return $1;;;;}}


Und wie füge ich die Kürzel Mb noch dran?

Danke.
Titel: Aw: [gelösst] Nachkommastellen im userReadings beschränken
Beitrag von: SouzA am 01 November 2023, 11:23:52
Zitat von: en-trust am 27 November 2020, 20:22:40Ich habe folgendes Reading erstellt, bekomme aber dennoch keine Nachkommastelle.

ram_used {if (sprintf("%.2f",ReadingsVal("$name","ram",0) =~ m/Used:\s(\d+)/)) {return $1;;;;}}

Und wie füge ich die Kürzel Mb noch dran?

Danke.

Hi,
ein "Kürzel" hab ich z.B. so angefügt:
total_consumption_kwh_Einheit {sprintf("%.2f" ,ReadingsVal("Stromzaehler","total_consumption",0)/1000 )." kWh"}Da wird kWh dann angezeigt.

Bis denn
SouzA
Titel: Aw: [gelösst] Nachkommastellen im userReadings beschränken
Beitrag von: SouzA am 01 November 2023, 11:34:18
Hallo liebe fhem-Liebhaber,

ich habe da auch ein Problem mit den Nachkommastellen.
Nämlich wird bei einem meiner Userreadings auch das "%.2f" nicht beachtet.
Allerdings hat dies bei der ersten Erstellung des Readings noch funktioniert.
Ab einem bestimmten Zeitpunkt funktionierte es nicht mehr:
2023-06-13_07:09:35 224.77
2023-06-13_19:10:05 224.78
2023-06-14_09:46:09 224.79
2023-06-15_08:10:59 224.8
.
.
.
2023-10-12_06:08:18 256.49
2023-10-12_06:13:10 256.5
2023-10-12_06:17:18 256.51
2023-10-12_06:22:27 256.52
2023-10-12_06:27:10 256.53
2023-10-12_06:31:15 256.54
2023-10-12_06:35:41 256.549999999999
2023-10-12_06:37:24 256.559999999999
2023-10-12_06:40:11 256.569999999999
2023-10-12_06:43:35 256.579999999999
2023-10-12_06:45:15 256.589999999999
2023-10-12_06:50:20 256.599999999999
2023-10-12_06:54:37 256.609999999999
.
.
.
2023-11-01_09:54:53 285.839999999973
2023-11-01_10:18:22 285.849999999973
#%:%total_consumption_PV_EUR:::

Es handelt sich um das nachfolgende Userreading:
total_consumption_PV_EUR monotonic {sprintf('%.2f' ,((ReadingsNum("Stromzaehler","total_consumption",0)/1000) - 5836.03) *(ReadingsNum("Stromzaehler","Energiekosten_bezug",0)))},
Ich habe die Schreibweisen '%.2f' und "%.2f" erfolglos versucht.
Sowie ReadingsNum und ReadingsVal getestet.
Klammersetzung auch variiert...

Das Device sieht wie folgt aus:
define Stromzaehler OBIS /dev/serial/by-id/usb-FTDI_FT230X_Basic_UART_D30A13JC-if00-port0@9600
attr Stromzaehler DbLogInclude total_feed,total_feed_EUR,total_feed_kwh,total_consumption,total_consumption_kwh,total_consumption_PV_EUR,total_consumption_PV_kwh,total_summery_EUR,total_summery_kwh,power_kw,current_L1,current_L2,current_L3,voltage_L1,voltage_L2,voltage_L3
attr Stromzaehler alias Elt.-Energie
attr Stromzaehler channels {"1.0.14.7.0.255"=>"frequenz"}
attr Stromzaehler comment !!!Das _PV_ in den Userreadings bedeutet, dass dies die Werte ab dem 13.01.2023 sind.!!!!\
Diese wurden (mit Zählerstand zum 13.01.2023) bereinigt.
attr Stromzaehler event-on-change-reading .*
attr Stromzaehler group Zähler
attr Stromzaehler icon measure_power_meter
attr Stromzaehler interval 5
attr Stromzaehler pollingMode on
attr Stromzaehler room Energieverbrauch
attr Stromzaehler stateFormat {\
 my $pkw              = ReadingsVal("$name","power_kw", "")." kW";;\
 my $eday              = ReadingsVal("$name","statTotal_consumption_PV_kwhDay", "")." kWh";;\
 my $edaylast          = ReadingsVal("$name","statTotal_consumption_PV_kwhDayLast", "")." kWh";;\
 my $emonth          = ReadingsVal("$name","statTotal_consumption_PV_kwhMonth", "")." kWh";;\
 my $emonthlast    = ReadingsVal("$name","statTotal_consumption_PV_kwhMonthLast", "")." kWh";;\
 my $eyear          = ReadingsVal("$name","statTotal_consumption_PV_kwhYear", "")." kWh";;\
 my $eyearlast      = ReadingsVal("$name","statTotal_consumption_PV_kwhYearLast", "")." kWh";;\
 my $edayeur          = ReadingsVal("$name","statTotal_consumption_PV_EURDay", "")." €";;\
 my $edayeurlast    = ReadingsVal("$name","statTotal_consumption_PV_EURDayLast", "")." €";;\
 my $emontheur      = ReadingsVal("$name","statTotal_consumption_PV_EURMonth", "")." €";;\
 my $emontheurlast  = ReadingsVal("$name","statTotal_consumption_PV_EURMonthLast", "")." €";;\
 my $eyeareur          = ReadingsVal("$name","statTotal_consumption_PV_EURYear", "")." €";;\
 my $eyeareurlast    = ReadingsVal("$name","statTotal_consumption_PV_EURYearLast", "")." €";;\
 my $fday              = ReadingsVal("$name","statTotal_feed_kwhDay", "")." kWh";;\
 my $fdaylast          = ReadingsVal("$name","statTotal_feed_kwhDayLast", "")." kWh";;\
 my $fmonth          = ReadingsVal("$name","statTotal_feed_kwhMonth", "")." kWh";;\
 my $fmonthlast    = ReadingsVal("$name","statTotal_feed_kwhMonthLast", "")." kWh";;\
 my $fyear          = ReadingsVal("$name","statTotal_feed_kwhYear", "")." kWh";;\
 my $fyearlast      = ReadingsVal("$name","statTotal_feed_kwhYearLast", "")." kWh";;\
 my $fdayeur          = ReadingsVal("$name","statTotal_feed_EURDay", "")." €";;\
 my $fdayeurlast    = ReadingsVal("$name","statTotal_feed_EURDayLast", "")." €";;\
 my $fmontheur      = ReadingsVal("$name","statTotal_feed_EURMonth", "")." €";;\
 my $fmontheurlast    = ReadingsVal("$name","statTotal_feed_EURMonthLast", "")." €";;\
 my $fyeareur          = ReadingsVal("$name","statTotal_feed_EURYear", "")." €";;\
 my $fyeareurlast    = ReadingsVal("$name","statTotal_feed_EURYearLast", "")." €";;\
"<html><table border=2 bordercolor='grey' cellspacing=0>\
<tr>\
<td style='padding-right:5px;;padding-left:5px;;font-weight:bold'></td>\
<td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>aktueller Wert</td>\
<td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Heute</td>\
<td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Gestern</td>\
<td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>dieser Monat</td>\
<td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>letzter Monat</td>\
<td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>dieses Jahr</td>\
<td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>letztes Jahr</td>\
</tr>\
<tr>\
<td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Verbrauch</td>\
<td style='padding-right:5px;;padding-left:5px'>".$pkw."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$eday."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$edaylast."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$emonth."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$emonthlast."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$eyear."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$eyearlast."</td>\
</tr>\
<tr>\
<td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Kosten</td>\
<td style='padding-right:5px;;padding-left:5px'></td>\
<td style='padding-right:5px;;padding-left:5px'>".$edayeur."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$edayeurlast."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$emontheur."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$emontheurlast."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$eyeareur."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$eyeareurlast."</td>\
</tr>\
<tr>\
<td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Einspeisung</td>\
<td style='padding-right:5px;;padding-left:5px'>"."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fday."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fdaylast."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fmonth."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fmonthlast."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fyear."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fyearlast."</td>\
</tr>\
<tr>\
<td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Vergütung</td>\
<td style='padding-right:5px;;padding-left:5px'></td>\
<td style='padding-right:5px;;padding-left:5px'>".$fdayeur."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fdayeurlast."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fmontheur."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fmontheurlast."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fyeareur."</td>\
<td style='padding-right:5px;;padding-left:5px'>".$fyeareurlast."</td>\
</tr>\
</table>\
</html>"\
}
attr Stromzaehler unitReadings off
attr Stromzaehler userReadings feed { if ((ReadingsVal("Stromzaehler","power",0)) < 0) {return (ReadingsVal("Stromzaehler","power",0)) * (-1)} else {return 0}},\
consumption { if ((ReadingsVal("Stromzaehler","power",0)) > 0) {return (ReadingsVal("Stromzaehler","power",0))} else {return 0}},\
\
power_kw {sprintf("%.2f" ,ReadingsVal("Stromzaehler","power",0)/1000 )},\
feed_kw {sprintf("%.2f" ,ReadingsVal("Stromzaehler","feed",0)/1000 )},\
total_consumption_kwh {sprintf("%.2f" ,ReadingsVal("Stromzaehler","total_consumption",0)/1000 )},\
total_consumption_PV_kwh {sprintf("%.2f" ,(ReadingsVal("Stromzaehler","total_consumption",0)/1000) - 5836.03 )},\
total_consumption_kwh_Einheit {sprintf("%.2f" ,ReadingsVal("Stromzaehler","total_consumption",0)/1000 )." kWh"},\
total_feed_kwh {sprintf("%.2f" ,ReadingsVal("Stromzaehler","total_feed",0)/1000 )},\
\
total_consumption_PV_EUR monotonic {sprintf('%.2f' ,((ReadingsNum("Stromzaehler","total_consumption",0)/1000) - 5836.03) *(ReadingsNum("Stromzaehler","Energiekosten_bezug",0)))},\
\
total_feed_EUR {sprintf("%.2f" , ReadingsNum("Stromzaehler","total_feed_kwh",0)* 0.082 )},\
\
total_summery_kwh {sprintf("%.2f" ,( (ReadingsNum("Stromzaehler","total_consumption",0)/1000) - 5836.03 ) - (ReadingsNum("Stromzaehler","total_feed",0)/1000 ));;;;},\
\
total_summery_EUR {sprintf("%.2f" ,ReadingsNum("Stromzaehler","total_consumption_PV_EUR",0) - ReadingsNum("Stromzaehler","total_feed_EUR",0));;;;},\
total_summery_EURDay {sprintf("%.2f" ,ReadingsNum("Stromzaehler","statTotal_consumption_PV_EURDay",0) - ReadingsNum("Stromzaehler","statTotal_feed_EURDay",0));;;;},\
total_summery_EURDayLast {sprintf("%.2f" ,ReadingsNum("Stromzaehler","statTotal_consumption_PV_EURDayLast",0) - ReadingsNum("Stromzaehler","statTotal_feed_EURDayLast",0));;;;},\
total_summery_EURMonth {sprintf("%.2f" ,ReadingsNum("Stromzaehler","statTotal_consumption_PV_EURMonth",0) - ReadingsNum("Stromzaehler","statTotal_feed_EURMonth",0));;;;},\
total_summery_EURMonthLast {sprintf("%.2f" ,ReadingsNum("Stromzaehler","statTotal_consumption_PV_EURMonthLast",0) - ReadingsNum("Stromzaehler","statTotal_feed_EURMonthLast",0));;;;},\
total_summery_EURYear {sprintf("%.2f" ,ReadingsNum("Stromzaehler","statTotal_consumption_PV_EURYear",0) - ReadingsNum("Stromzaehler","statTotal_feed_EURYear",0));;;;},\
total_summery_EURYearLast {sprintf("%.2f" ,ReadingsNum("Stromzaehler","statTotal_consumption_PV_EURYearLast",0) - ReadingsNum("Stromzaehler","statTotal_feed_EURYearLast",0));;;;},
attr Stromzaehler verbose 0

Wie ihr seht, sind im Device mehrere Userreadings mit zwei Nachkommastellen angelegt und nur bei dem einen Reading funktioniert es nicht.
Im Reading kommt folgendes an:
total_consumption_PV_EUR 285.849999999973
Was mache ich falsch?
Kann mir da jemand bitte helfen?

Vielen Dank!

Bis denn
SouzA
Titel: Aw: [gelösst] Nachkommastellen im userReadings beschränken
Beitrag von: Torxgewinde am 03 November 2023, 17:56:03
Das sollte dann vermutlich am "monotonic" (Dokumentation: https://fhem.de/commandref.html#readingFnAttributes --> <modifier> bei den userReadings) liegen.

Titel: Aw: [gelösst] Nachkommastellen im userReadings beschränken
Beitrag von: SouzA am 03 November 2023, 18:29:25
Hallo Torxgewinde,

Vielen Dank für die Antwort!
Am Wochenende habe ich da jetzt keine Zeit zu.
Melde mich im Laufe der nächsten Woche dazu.

Wünsche ein schönes Wochenende und bis bald.
SouzA