Hallo,
ich erfasse von unserer PV-Anlage verschiedenste Parameter. U.a. logge ich die Leistung, die in den Akku und auch wieder herausfließt.
Leider liefert der Wechselrichter dabei die Leistung immer vorzeichenlos. Das Vorzeichen kommt über einen anderen Parameter.
Das Reading Battery_Power liefert mir die vorzeichenlose Leistung.
Running_State_Bit_2 liefert mir das Vorzeichen in form von:
Wert = 4 : Akku wird entladen
Wert = 0 : Akku wird geladen
Gern wurde ich in einem Diagramm u.a. die Lade-/Entlade-Leistung über die Zeit auftragen.
Derzeit erfasse ich die Werte für das Diagramm bereits so in einer Log-Datei (Reading am Device SH10rt_Fast):
Data4FileLog {"Total_DC_Power: ". sprintf("%.1f", (ReadingsNum("SH10rt_Fast","Total_DC_Power", 0))) ." Load_Power: ". sprintf("%.1f", (ReadingsNum("SH10rt_Fast","Load_Power", 0))) ." Export_Power: ". sprintf("%.1f", (ReadingsNum("SH10rt_Fast","Export_Power", 0)))." Battery_Power: ". sprintf("%.1f", (ReadingsNum("SH10rt_Fast","Battery_Power", 0)))." Battery_Level: ". sprintf("%.1f", (ReadingsNum("SH10rt_Fast","Battery_Level", 0)))}
define SH10rt_Fast_FileLog_WR FileLog ./log/Electricity/WR-Data_W-%Y-%m.log SH10rt_Fast:Data4FileLog:.*
Wie kann ich das Reading Running_State_Bit_2 mit integrieren, so dass es das Vorzeichen für die Leistung bildet?
Da ergeben sich Fragen über Fragen...
- warum verwendest Du keine code-Tags in Deiner Frage, um eine sinnvolle Darstellung zu schaffen?
- wozu die ganzen userReadings, in denen nix anderes drinsteht, als in ohenhin schon vorhandenen readings?
- weißt Du, dass ReadingsNum() selbst runden kann, wenn man die Anzahl der gewünschten Nachkommastellen einfach als 4. Parameter angibt?
- wozu die vielen unnötigen Klammern?
- wenn Du schon mit sprintf() arbeitest, warum packst Du das gewünschte Vorzeichen nicht einfach da mit rein?
Battery_Power: ". sprintf("%s%.1f", ReadingsNum("SH10rt_Fast","Battery_Power", 0), (ReadingsNum("SH10rt_Fast","Running_State_Bit_2", 0) == 4) ? "+" : "-")
Danke.
Runden über ReadingsNum war mir nicht bekannt, sorry.
Ich habe jetzt den Code so eingetragen:
Data4FileLog {"Total_DC_Power: ". ReadingsNum("SH10rt_Fast","Total_DC_Power", 0,0) ." Load_Power: ". ReadingsNum("SH10rt_Fast","Load_Power", 0,0) ." Export_Power: ". ReadingsNum("SH10rt_Fast","Export_Power", 0,0) ." Battery_Power: " .sprintf("%s%.1f", ReadingsNum("SH10rt_Fast","Battery_Power", 0,0), (ReadingsNum("SH10rt_Fast","Running_State_Bit_2", 0) == 4) ? "+" : "-") ." Battery_Level: ". ReadingsNum("SH10rt_Fast","Battery_Level", 0,0)}
Im Log erscheinen die Zahlen jetzt so (ich benötige keine Nachkommastellen):
2023-06-12_12:05:14 SH10rt_Fast Data4FileLog: Total_DC_Power: 7335 Load_Power: 490 Export_Power: 6847 Battery_Power: 00.0 Battery_Level: 100
Ich hätte nun erwartet, dass Battery_Power nun entweder ein + oder - vorangestellt wird. Oder wird das wegoptimiert, da man in der Regel bei positiven Zahlen kein explizites + schreibt?
Warum hat die Zahl vor dem Komma jetzt aber 2 Nullen?
Ich bin mit Perl nicht ganz so fit und kannte bisher auch die Kurzform von if/then nicht.
Danke
Zitat von: stobor am 12 Juni 2023, 12:08:32Warum hat die Zahl vor dem Komma jetzt aber 2 Nullen?
Sorry, mein Fehler. Die Parameter im sprintf() sind in der falschen Reihenfolge.
Probier mal:
Battery_Power: " .sprintf("%s%.1f", (ReadingsNum("SH10rt_Fast","Running_State_Bit_2",0) == 4) ? "+" : "-", ReadingsNum("SH10rt_Fast","Battery_Power",0,0))
Super, danke.
Derzeit wird der Akku weder geladen noch entladen. Die 0.0 haben nun zwar ein negatives Vorzeichen, aber das liegt dann wohl daran, was der Wechselrichter an Flag (Running_State_Bit_2) liefert:
2023-06-12_13:18:41 SH10rt_Fast Data4FileLog: Total_DC_Power: 7583 Load_Power: 955 Export_Power: 6628 Battery_Power: -0.0 Battery_Level: 100
Mal sehen, wie sich später das Vorzeichen ändert; ob ein + Angezeigt wird oder wegfällt. Ggf. kann ich vermutlich einfach das "+" durch " ersetzen, oder?
Also: Battery_Power: " .sprintf("%s%.1f", (ReadingsNum("SH10rt_Fast","Running_State_Bit_2",0) == 4) ? "" : "-", ReadingsNum("SH10rt_Fast","Battery_Power",0,0))
sprintf("%s%.1f", (ReadingsNum("SH10rt_Fast","Running_State_Bit_2",0,1) != 0) ? (ReadingsNum("SH10rt_Fast","Running_State_Bit_2",0) == 4) ? "+" : "-" :"",ReadingsNum("SH10rt_Fast","Battery_Power",0,0))
Das liefert leider Fehler:
2023-06-12_14:48:33 SH10rt_Fast Data4FileLog: Error evaluating SH10rt_Fast userReading Data4FileLog: syntax error at (eval 2028978) line 1, near "" Battery_Power: " sprintf"
Zeig doch mal lieber, was Du jetzt in das Attribut eingetragen hast.
Die Fehlermeldung alleine hilft nicht weiter.
Wenns um Zahlen geht, multipliziere ich lieber ;) Damit sollte das -0.0 Problemchen auch weg sein:
sprintf('%.1f',$value * (($sign > 0)?-1:1));
l.g.erwin
damit bekommst Du aber kein + Zeichen bei positiven Werten...
Wenn man meinen obigen Code richtig einträgt, ist das -0.0 auch verschwunden.
OH, ich glaube, ich hatte einen Punkt vergessen. Jetzt kommen Werte:
2023-06-12_15:20:35 SH10rt_Fast Data4FileLog: Total_DC_Power: 6611 Load_Power: 914 Export_Power: 5696 Battery_Power: 0.0 Battery_Level: 100
Data4FileLog {"Total_DC_Power: ". ReadingsNum("SH10rt_Fast","Total_DC_Power", 0,0) ." Load_Power: ". ReadingsNum("SH10rt_Fast","Load_Power", 0,0) ." Export_Power: ". ReadingsNum("SH10rt_Fast","Export_Power", 0,0) ." Battery_Power: " .sprintf("%s%.1f", (ReadingsNum("SH10rt_Fast","Running_State_Bit_2",0,1) != 0) ? (ReadingsNum("SH10rt_Fast","Running_State_Bit_2",0) == 4) ? "+" : "-" :"",ReadingsNum("SH10rt_Fast","Battery_Power",0,0)) ." Battery_Level: ". ReadingsNum("SH10rt_Fast","Battery_Level", 0,0)}
0 ist ohne Vorzeichen :)
Bei positiven Werten benötige ich ja eigentlich kein +. Da kann ich doch vermutlich einfach das "+" durch "" ersetzen, oder?
Und wenn ich dann auch noch die Nachkommastellen weglassen möchte?
Zitat von: stobor am 12 Juni 2023, 15:24:14OH, ich glaube, ich hatte einen Punkt vergessen.
Das hatte ich vemutet.
ZitatWie kann ich das Reading Running_State_Bit_2 mit integrieren, so dass es das Vorzeichen für die Leistung bildet?
Naja, wenn Du das + gar nicht haben willst, ist das eine andere Anforderung als in Deinem Eingangsbeitrag. Das macht die Sache natürlich erheblich einfacher und Du kannst beispielsweise die von erwin vorgeschlagene Lösung verwenden.
" Battery_Power: " .ReadingsNum("SH10rt_Fast","Battery_Power",0,0) * (ReadingsNum("SH10rt_Fast","Running_State_Bit_2",0,0) == 4) ? -1 : 1 ." Battery_Level...(usw)
Zitat von: stobor am 12 Juni 2023, 15:24:14Da kann ich doch vermutlich einfach das "+" durch "" ersetzen, oder?
Das wäre ziemlich unsinnig.
Zitatdamit bekommst Du aber kein + Zeichen bei positiven Werten...
stimmt! Jetzt aber:
sprintf('%+.1f',$value * (($sign > 0)?-1:1));
Nachkommastellen weg:
sprintf('%+d',$value * (($sign > 0)?-1:1));
erst lesen, dann schreiben.
Bevor jetzt noch mehr durcheinander geht, bin ich hier raus.