Seite 1 von 2
Differenz von Item-Werten
Verfasst: 1. Dez 2022 15:17
von AndreM77
Hi,
über Gruppen ziehe ich Summen von Item-Werten (z.B. Gesamtenergiebedarf).
Jetzt wollte ich das analog für eine Differenz machen, aber dafür braucht es (nach Adam Ries) ja eine Reihenfolge. Wie macht man das am besten? Würde die Differenz am liebsten in einem Hilfsitem zur Verfügung haben.
Danke!
Grüße
André
Re: Differenz von Item-Werten
Verfasst: 1. Dez 2022 15:20
von EmptySoft
Meinst Du zum Beispiel den Tagesverbrauch? Das kannst Du über die historischen Werte bekomme
Re: Differenz von Item-Werten
Verfasst: 1. Dez 2022 15:25
von AndreM77
Danke für den Reply.
Nein, ich hab verschiedene Stromwerte und brauche die aktuelle Differenz.
Re: Differenz von Item-Werten
Verfasst: 1. Dez 2022 15:55
von EmptySoft
Bin mir nicht sicher ob ich Deine Frage verstanden habe ...
so etwas in der Art?
Code: Alles auswählen
var PowerSumme = StromzaehlerNormal_PowerL1.state as DecimalType + StromzaehlerNormal_PowerL2.state as DecimalType + StromzaehlerNormal_PowerL3.state as DecimalType
Re: Differenz von Item-Werten
Verfasst: 2. Dez 2022 02:15
von udo1toni
Also, Du nutzt ein Group Item in der
Form Group:Number:SUM gSumme ... und packst die Items zum Summieren in die Gruppe.
Ja, so kannst Du keine Differenz bilden

Was ginge, wäre, Items zu kennzeichnen, dass sie abgezogen werden sollen, also z.B.
Zahl1minus Zahl2minus Zahl3plus Zahl4plus Zahl5plus. Dann kannst Du eine Rule schreiben, die so aussieht:
Code: Alles auswählen
var sum1 = 0
var sum2 = 0
gSumme.members.forEach[i|
if(i.name.endsWitch("minus"))
sum2 = sum2 + (i.state as Number)
else
sum1 = sum1 + (i.state as Number)
]
val ergebnis = sum1 - sum2
Mutmaßlich wird es aber eh nur um zwei Werte gehen, die Du voneinander abziehen willst, also
Code: Alles auswählen
val ergebnis = (Item1.state as Number) - (Item2.state as Number)
Und falls es sich teilweise um UoM Items handelt, am besten (solange sie die gleiche Einheit nutzen):
Code: Alles auswählen
val ergebnis = (Item1.state as Number).floatValue - (Item2.state as Number).floatValue
Bei Addition oder Subtraktion von einheitenbehafteten Werten ist immer Vorsicht geboten, da kommen manchmal seltsame Werte raus, die erst nach langem Grübeln sinnvoll erscheinen. Deshalb ist es oft einfacher, die Einheit zu entfernen (wie im Beispiel).
Re: Differenz von Item-Werten
Verfasst: 2. Dez 2022 15:33
von AndreM77
Hey,
ja - ich hätte jetzt nach der Summe keine Differenz erwartet o)
Danke für das
Code: Alles auswählen
val ergebnis = (Item1.state as Number).floatValue - (Item2.state as Number).floatValue
Ganz doofe Frage: Wo schreibe ich das jetzt hin, damit das in einem Hilfsitem gespeichert wird? Ich versuche solche Sachen alle als Item zu handeln und diese Items dann stringent im UI zu verwenden. Keine Logik im UI o)
Danke!
Grüße
André
Re: Differenz von Item-Werten
Verfasst: 2. Dez 2022 15:42
von udo1toni
Du brauchst eine Rule, welche triggert, wenn sich der Status eines der beteiligten Items ändert, also z.B. (als DSL Code für Textdateien):
Code: Alles auswählen
rule "Differenz errechnen"
when
Item Minuend changed or
Item Subtrahend changed
then
if(!(Minuend.state instanceof Number))
return;
if(!(Subtrahend.state instanceof Number))
return;
Differenz.postUpdate((Minuend.state instanceof Number).floatValue-(Subtrahend.state instanceof Number).floatValue)
end
Fortan landet immer die Differenz zwischen Minuend und Subtrahend im Item Differenz, Vorausgesetzt, beide Items halten eine gültige Zahl. Die beiden if-Anweisungen brechen die Rule vorzeitig ab, falls dem nicht so ist, da es sonst zu einer Exception käme.
Re: Differenz von Item-Werten
Verfasst: 2. Dez 2022 15:44
von AndreM77
alles klar. Hab vielen Dank!
Re: Differenz von Item-Werten
Verfasst: 7. Jan 2023 12:20
von Selter
EmptySoft hat geschrieben: ↑1. Dez 2022 15:20
Meinst Du zum Beispiel den Tagesverbrauch? Das kannst Du über die historischen Werte bekomme
Ich klinke mich hier mal ein - genau das habe ich gesucht.
Aber wie bekomme ich das in der Sitemap angezeigt?
Das scheint nicht zu funktionieren.
Code: Alles auswählen
Text item=KE_s_wemos1_counter.minimumSince(now.minusHours(24))
Konkret soll der Gas-Verbrauchswert seit Mitternacht geteilt 2 angezeigt werden.
Re: Differenz von Item-Werten
Verfasst: 7. Jan 2023 13:20
von udo1toni
So funktioniert das nicht

In einer Sitemap nutzt Du einen Verweis auf ein Item, nicht auf dessen Status (.state). Entsprechend kannst Du auch nicht andere Methoden verwenden.
Wenn Du also einen berechneten wert anzeigen lassen willst, musst Du ein Item für diesen Wert erzeugen (ohne Channel Link) und eine Rule anlegen, welche die Berechnung anstellt (z.B. .minimumSince(...).state) und das Ergebnis in das neue Item schreibt. Dieses Item kannst Du dann in der Sitemap verwenden.
Konkret für den Gasverbrauch (angenommen ist ein existierendes Item gasZaehler, welches den Zählerstand hält und ein Item gasVerbrauch zur Anzeige):
Code: Alles auswählen
rule "Gasverbrauch aktualisieren"
when
Item gasZaehler changed or
Time cron "1 0 0 * * ?" // täglich um 00:00:01 Uhr
then
val midnight = LocalDateTime.of(LocalDate.now(),LocalTime.MIDNIGHT)
gasVerbracuh.postUpdate(gasZaehler.deltaSince(midnight))
end