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
Schau Dir einmal sprintf an.
https://www.perl-community.de/bat/poard/thread/11767
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
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?
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
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}
Hallo t1me2die
warum setzt du '%.2f'
anstelle von ""
??
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
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
ja musste nur die dritte Klammer bei deiner Vorgabe entfernen, vielen dank.
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.
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
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
Das sollte dann vermutlich am "monotonic" (Dokumentation: https://fhem.de/commandref.html#readingFnAttributes --> <modifier> bei den userReadings) liegen.
- Lass' monotonic mal weg, außer du erwartest dass die Werte durch einen Überlauf oder Reset auch mal kleiner werden.
- Oder, alternativ erstelle dir ein zweites, gerundetes userReading:
total_consumption_PV_EUR_rounded { sprintf('%.2f', ReadingsNum($name, "total_consumption_PV_EUR", 0) }
Wenn du auch einen Trigger spezifizierst, hat FHEM das nur bei Updates des passenden Wertes zu berechnen:
total_consumption_PV_EUR_rounded:total_consumption_PV_EUR:.* { sprintf('%.2f', ReadingsNum($name, "total_consumption_PV_EUR", 0) }
- Oder, zur Not kann man monotonic auch "zu Fuß" programmieren und dann gezielter Einfluss nehmen. Probier' bitte erstmal die beiden anderen Punkte.
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