Hier mal ein Beispiel was man mit dem Modul freie Formel und den Texten dazu im TWS-Wiki machen kann.
Warum das Ganze?
Ich bin ja immer noch dabei mir meine Statistiken der PV-Anlage und meines Dashboards für den Stromverbrauch aufzuhübschen.
Da ich bei mir im Haus auch einige der L&J KNX-Stromzähler habe, ist mir natürlich dieser Beitrag hier KNX-UF Beitrag L&J Zahlenwert Überlauf im KNX-UF nicht entgangen.
Also dachte ich mir da will ich doch mal direkt vorsorgen, bevor mir das später die Werte im Dashboard zerwürfelt.
Außerdem hat es mich, bei der auf kWh basierenden Auswertung des PV-Abdeckungsgrades, sehr gestört keine Nachkommastellen, sondern nur volle kWh ungerundet hart abgeschnitten, zu haben. Was bei einem Gesamttagesverbrauch von < 5kWh einfach zu ungenaue %-Werte ergibt
Die Lösung sollte also den vom Zähler gelieferten Wh Betrag so mit dem gelieferten kWh Betrag verheiraten, dass der kWh Betrag mit 3 Nachkommastellen daherkommt und es dabei egal ist wenn der Wh-Betrag irgendwann mal einige kWh verliert, wegen Überlauf des Wertebereiches für den Zählerstand.
Also gedanklich nehme ich den Wh Betrag Teile ihn durch 1000 (kWh mit 3 Nachkommastellen), und schneide die Vorkommastellen ab und addiere die 0,xxx kWh auf den angelieferten kWh Betrag drauf.
Das Logik-Modul freie Formel bietet dafür die Möglichkeit mit If/then/else Ausdrücken zu arbeiten und kann eine Rundungsfunktion.
Soweit hergeleitet habe ich mir das vorab im xls mit dem Wenn/dann und der richtigen Addition der Werte.
Zu beachten ist das es keine native Funktion gibt die hart abrundet sondern nur Runden auf vollen Integer mit 0 Nachkommastellen, was die IF-Auswertung erforderlich machte.
Das ergab dann folgende zwei Berechnungen:
Je nach dem ob Wh/1000 gerundet abzgl. Wh/1000 negativ oder positiv ist, also ob es gerade kleiner oder größer 500Wh auf dem Zähler sind.
a) bei negativ: kWh Betrag + (1 + Wh/1000 - Wh/1000 gerundet)
b) bei positiv: kWh Betrag + (Wh/1000 - Wh/1000 gerundet)
In der Syntax des Formelparameters in der freien Formel schaut das dann so aus:
X2+((X1/1000)-rint(X1/1000)<0?1+(X1/1000)-rint(X1/1000):(X1/1000)-rint(X1/1000))
Dabei gilt:
X2 ist der kWh Betrag auf dem etwas dynamisch ermittelt drauf addiert werden soll
X1 ist der Wh Betrag
rint() ist die Rundungsfunktion auf den nächsten ganzen Integer
(X1/1000)-rint(X1/1000)<0? ist die IF-Bedingung ob denn die Differenz errechneter kWh - gerundeter errechneter kWh negativ ist
1+(X1/1000)-rint(X1/1000) alles zwischen dem ? und dem : ist die Dann-Aktion
(X1/1000)-rint(X1/1000) alles hinter dem : ist die Sonst-Aktion
Das ganze Wenn-Dann-Sonst ist in einer Klammer gefasst ().
Damit habe ich mit einem Standard-Modul mir einen kWh Betrag mit Nachkommastellen und ohne Wertverlust, wenn der Wh Betrag einen Zahlenüberlauf bekommt und im KNX-Telegramm kWh verloren gehen.
Im Logikeditor schaut das dann so aus.
(Mein originaler Baustein hat noch ein paar weitere Additionen, aber das ist hier jetzt nicht Thema, daher einmal das ganze als Dummy mit manuellen Werten per Doc-Mode).
@StefanW
Die Formel ist ja schon recht lang geworden und gerät damit deutlich über die mögliche Feldbreite des Parameter-Eingabefeldes.
Ggf kann man das ja mal noch etwas vergrößern, auf meinem Bildschirm wäre noch reichlich Platz

Wobei man das eh besser in einem Bereich zusammentippt wo alles komplett in eine Zeile passt und dann kopiert man es rein.
Probiert es aus und werdet Kreativ. Ich mag das Modul freie Formel, das war doch schon eine deutliche Ausweitung der Möglichkeiten des LE.
Und das Modul lässt sich auch sehr gut in Customlogiken verwenden, wer also mit nummerischen Aktionen viel If/Then/Else zu berücksichtigen hat, kann das sehr gut verwenden. Hinweis dazu am Rande für den LE kann ein boolsches 0/1 TWS-Objekt auch einfach nur 0/1 als Zahl daherkommen und in diesem Modul verwendet werden.