Seite 1 von 2

Berechnung in Rule

Verfasst: 6. Feb 2022 11:00
von mad-mike
Moin zusammen...

Ich schaffe es irgendwie nicht vernünftige zahlen mir anzeigen zu lassen...
Kurz zum Vorhaben:

Habe eine Dect Steckdose zur Ertragsmessung von meinem Balkonkraftwerk.

Dort habe ich eine Gesamt kwh anzeige.

Diese schreibe ich um 0 uhr in ein Item.

Code: Alles auswählen

rule "copy werte"

when
Time cron "0 0 0 * * ? *"
then 
aktpv.postUpdate(FRITZDECT2101_Gesamtverbrauch.state as Number)
PVheute.postUpdate(0)
end
Nun möchte ich einfach nur ""FRITZDECT2101_Gesamtverbrauch"" minus ""aktpv"" rechnen...
und das in PV Heute schreiben lassen..

Code: Alles auswählen

rule "tageswerte"

when
Item FRITZDECT2101_Gesamtverbrauch changed  
then
PVheute.postUpdate((FRITZDECT2101_Gesamtverbrauch.state as Number) - (aktpv.state as Number))
end
Der Rechnet auch irgendwas, aber keine Ahnung was...
Jemand eine idee??


Kann mir jemand sagen, wie ich einfach ""Minus"" rechnen kann??

Re: Berechnung in Rule

Verfasst: 6. Feb 2022 11:49
von oh73
rechnen mit Items hab ich auch so meine Probleme, aber ist machbar!

hab gerade mal aus meiner Heizungs Rule was kopiert und in etwa angepasst,

am besten ist glaube ich du schreibts erst den Wert vom GesamtVerbrauch in eine Variable,
das kwh muss dabei abgeschnitten werden.
in etwa so,

Code: Alles auswählen

var Gesamzverbrauch = Float::parseFloat(String::format("%s", FRITZDECT2101_Gesamtverbrauch.state).replace(' ',''))
dann muss du gucken wie sieht aktpv.state aus ?
eventuell auch erst in eine Variable schreiben?

mite ganzen Zahlen in items könnte das auch so gehen,
PVheute.postUpdate((FRITZDECT2101_Gesamtverbrauch.state as DecimalType).intValue() - (aktpv.state as DecimalType).intValue())
aber da gibt es hier Leute die können das besser als ich, Udo??

Re: Berechnung in Rule

Verfasst: 6. Feb 2022 11:52
von peter-pan
...alles richtig (fast ;) ).

Das Item "FRITZDECT2101_Gesamtverbrauch" ist ein sogenanntes UOM-Item (Quantity/Menge). Es führt sozusagen die Mengeneinheit im Status mit.
Dein anderes Item ist ein " normales" Number-Item und das gilt es jetzt zu synchronisieren.

Code: Alles auswählen

PVheute.postUpdate((FRITZDECT2101_Gesamtverbrauch.state as Number).floatValue - (aktpv.state as Number))
Damit (.floatValue) entfernst du sozusagen die Einheit/Unit/Quantity/Pattern/Suffix/UoM (..alles das Gleiche :lol: ) aus dem Status.

Re: Berechnung in Rule

Verfasst: 6. Feb 2022 12:02
von mad-mike
Danke euch...

Code: Alles auswählen

PVheute.postUpdate((FRITZDECT2101_Gesamtverbrauch.state as Number).floatValue - (aktpv.state as Number))
Funktioniert sofort auf anhieb. :)

Re: Berechnung in Rule

Verfasst: 11. Aug 2022 21:50
von mad-mike
Moin zusammen...

habe ein schreiben bekommen das sich der Strompreis ändert.


Wie kann ich so zusagen das so ändern das sich für die gesamt Rechnung nun eine Preisänderung vorhanden ist??

Akutell sieht das ganze so aus:

Code: Alles auswählen

    var Number nKosten = 0
    if(FRITZDECT2101_Gesamtverbrauch.state instanceof Number)
    nKosten = (FRITZDECT2101_Gesamtverbrauch.state as Number).floatValue * 0.28
    kwheuro.postUpdate(nKosten)
    PVheute.postUpdate((FRITZDECT2101_Gesamtverbrauch.state as Number).floatValue - (aktpv.state as Number).floatValue)
    euroheute.postUpdate((PVheute.state as Number).floatValue * 0.28)
Das item ""kwheuro"" muss quasi ab ersten septemper nicht mehr mit 0.28 berechnet werden sondenr mit 0.38

Macht es Sinn einen ""Fest"" Zahl in die Rule zu setzen welche ich exakt am 01.sep. ein speichere??


Gruss

Re: Berechnung in Rule

Verfasst: 11. Aug 2022 23:00
von udo1toni
Das dynamisch einzubauen wird schwer, Du müsstest dann quasi die Zeitpunkte der Preisänderungen abfragen, die Zählerstände zum Änderungszeitpunkt abfragen, die Differenzen berechnen, die jeweilige Differenz mit dem jeweilig gültigen Preis multiplizieren und die einzelnen Produkte addieren.
Es wird vermutlich das Einfachste sein, zum Stichtag den Zähler abzulesen, die bis dahin aufgelaufenen Beträge zu notieren (also Zählerstand und Geldsumme) und jeweils in der Berechnung zu berücksichtigen, also Zählerstand von aktuellem Zählstand abziehen, mit neuem Preis multiplizieren und das Ergebnis zur alten Summe addieren.

Re: Berechnung in Rule

Verfasst: 12. Aug 2022 18:50
von Harka
auf die Gefahr hin das ich mich Blamiere :shock: (verstehe das DSL nur ansatzweise)
Du hast doch in kwheuro die bisherigen Kosten. Ändere einfach die Berechnung in dem diese um 0 Uhr nicht komplett neu berechnet werden sondern nur der Wert des vergangenen Tages addiert wird. Am Stichstag änderst Du dann den Faktor für die Berechnung des Tageswerts.

Re: Berechnung in Rule

Verfasst: 12. Aug 2022 22:19
von udo1toni
Klar, das sollte genauso gehen. Man muss halt aufpassen, dass der Wert persistiert und bei einem Neustart wiederherhestellt wird.

Re: Berechnung in Rule

Verfasst: 28. Dez 2022 13:35
von mad-mike
Moin.

Ich suche schon die ganze zeit, aber finde kein einfaches Ergebnis. Ich vermute, das ich nur falsch suche...

Eigentlich möchte ich nur ein Ergebnis ohne Komma stelle haben...

Eine Formatierung vom Item bringt keinen Erfolg.

Die Berechnung sieht aktuell wie folgt aus:

Code: Alles auswählen

dhwset1.postUpdate ((dhwset.state as Number - dhw1_actualTemp.state as Number + dhwset.state as Number))
Ich möchte einfach das das Ergebnis ohne Komma nach dhwset1 geschrieben wird... (also anstatt 45,4 Soll 45 stehen) gerundet??

Hat einer eine Idee??

Danke und Gruss

Re: Berechnung in Rule

Verfasst: 28. Dez 2022 14:39
von udo1toni

Code: Alles auswählen

dhwset1.postUpdate(((dhwset.state as Number) - (dhw1_actualTemp.state as Number) + (dhwset.state as Number)).intValue)