Wert/Flag als Vorzeichenindikator für Log-Datei nutzen, aber wie?

Begonnen von stobor, 12 Juni 2023, 07:57:04

Vorheriges Thema - Nächstes Thema

stobor

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?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (FW 1.57 CUL868) für FS20 und CCU3 für HM(IP) + Arduino Mega (Firmata) - FHEM Revision: 29534 - FS20, HM(IP), MQTT, Philips HUE, ModBus

betateilchen

#1
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) ? "+" : "-")
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

stobor

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
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (FW 1.57 CUL868) für FS20 und CCU3 für HM(IP) + Arduino Mega (Firmata) - FHEM Revision: 29534 - FS20, HM(IP), MQTT, Philips HUE, ModBus

betateilchen

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)) 
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

stobor

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))
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (FW 1.57 CUL868) für FS20 und CCU3 für HM(IP) + Arduino Mega (Firmata) - FHEM Revision: 29534 - FS20, HM(IP), MQTT, Philips HUE, ModBus

betateilchen

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))
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

stobor

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"
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (FW 1.57 CUL868) für FS20 und CCU3 für HM(IP) + Arduino Mega (Firmata) - FHEM Revision: 29534 - FS20, HM(IP), MQTT, Philips HUE, ModBus

betateilchen

Zeig doch mal lieber, was Du jetzt in das Attribut eingetragen hast.
Die Fehlermeldung alleine hilft nicht weiter.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

erwin

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
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

betateilchen

damit bekommst Du aber kein + Zeichen bei positiven Werten...

Wenn man meinen obigen Code richtig einträgt, ist das -0.0 auch verschwunden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

stobor

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?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (FW 1.57 CUL868) für FS20 und CCU3 für HM(IP) + Arduino Mega (Firmata) - FHEM Revision: 29534 - FS20, HM(IP), MQTT, Philips HUE, ModBus

betateilchen

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)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: stobor am 12 Juni 2023, 15:24:14Da kann ich doch vermutlich einfach das "+" durch "" ersetzen, oder?

Das wäre ziemlich unsinnig.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

erwin

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));
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

betateilchen

#14
erst lesen, dann schreiben.

Bevor jetzt noch mehr durcheinander geht, bin ich hier raus.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!