FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: stobor am 12 Juni 2023, 07:57:04

Titel: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: stobor am 12 Juni 2023, 07:57:04
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?
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: betateilchen am 12 Juni 2023, 08:18:58
Da ergeben sich Fragen über Fragen...


Battery_Power: ". sprintf("%s%.1f", ReadingsNum("SH10rt_Fast","Battery_Power", 0), (ReadingsNum("SH10rt_Fast","Running_State_Bit_2", 0) == 4) ? "+" : "-")
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: stobor am 12 Juni 2023, 12:08:32
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
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: betateilchen am 12 Juni 2023, 12:17:47
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)) 
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: stobor am 12 Juni 2023, 13:22:53
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))
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: betateilchen am 12 Juni 2023, 13:55:52
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))
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: stobor am 12 Juni 2023, 14:52:15
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"
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: betateilchen am 12 Juni 2023, 15:12:04
Zeig doch mal lieber, was Du jetzt in das Attribut eingetragen hast.
Die Fehlermeldung alleine hilft nicht weiter.
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: erwin am 12 Juni 2023, 15:18:39
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
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: betateilchen am 12 Juni 2023, 15:21:14
damit bekommst Du aber kein + Zeichen bei positiven Werten...

Wenn man meinen obigen Code richtig einträgt, ist das -0.0 auch verschwunden.
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: stobor am 12 Juni 2023, 15:24:14
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?
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: betateilchen am 12 Juni 2023, 15:35:28
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)
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: betateilchen am 12 Juni 2023, 15:36:44
Zitat von: stobor am 12 Juni 2023, 15:24:14Da kann ich doch vermutlich einfach das "+" durch "" ersetzen, oder?

Das wäre ziemlich unsinnig.
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: erwin am 12 Juni 2023, 15:37:13
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));
Titel: Aw: Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?
Beitrag von: betateilchen am 12 Juni 2023, 15:40:25
erst lesen, dann schreiben.

Bevor jetzt noch mehr durcheinander geht, bin ich hier raus.