Differenz von Item-Werten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

AndreM77
Beiträge: 123
Registriert: 2. Feb 2021 21:31

Differenz von Item-Werten

Beitrag 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é
von udo1toni » 2. Dez 2022 15:42
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.
Gehe zur vollständigen Antwort
--
Connectivity: Z-WAVE, TCP/IP, Hue Bridge und IO-Homecontrol
Backend: openHAB 3.3.0 im Docker Container auf QNAP NAS
UI: HABPanel auf Amazon Fire 8

EmptySoft
Beiträge: 188
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Differenz von Item-Werten

Beitrag von EmptySoft »

Meinst Du zum Beispiel den Tagesverbrauch? Das kannst Du über die historischen Werte bekomme

Code: Alles auswählen

DeinItem.minimumSince(now.minusHours(24)).state)
BYe
Harald

AndreM77
Beiträge: 123
Registriert: 2. Feb 2021 21:31

Re: Differenz von Item-Werten

Beitrag von AndreM77 »

Danke für den Reply.

Nein, ich hab verschiedene Stromwerte und brauche die aktuelle Differenz.
--
Connectivity: Z-WAVE, TCP/IP, Hue Bridge und IO-Homecontrol
Backend: openHAB 3.3.0 im Docker Container auf QNAP NAS
UI: HABPanel auf Amazon Fire 8

EmptySoft
Beiträge: 188
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Differenz von Item-Werten

Beitrag 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
BYe
Harald

Benutzeravatar
udo1toni
Beiträge: 13948
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Differenz von Item-Werten

Beitrag 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).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

AndreM77
Beiträge: 123
Registriert: 2. Feb 2021 21:31

Re: Differenz von Item-Werten

Beitrag 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é
--
Connectivity: Z-WAVE, TCP/IP, Hue Bridge und IO-Homecontrol
Backend: openHAB 3.3.0 im Docker Container auf QNAP NAS
UI: HABPanel auf Amazon Fire 8

Benutzeravatar
udo1toni
Beiträge: 13948
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Differenz von Item-Werten

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

AndreM77
Beiträge: 123
Registriert: 2. Feb 2021 21:31

Re: Differenz von Item-Werten

Beitrag von AndreM77 »

alles klar. Hab vielen Dank!
--
Connectivity: Z-WAVE, TCP/IP, Hue Bridge und IO-Homecontrol
Backend: openHAB 3.3.0 im Docker Container auf QNAP NAS
UI: HABPanel auf Amazon Fire 8

Selter
Beiträge: 59
Registriert: 9. Mär 2018 16:06

Re: Differenz von Item-Werten

Beitrag von Selter »

EmptySoft hat geschrieben: 1. Dez 2022 15:20 Meinst Du zum Beispiel den Tagesverbrauch? Das kannst Du über die historischen Werte bekomme

Code: Alles auswählen

DeinItem.minimumSince(now.minusHours(24)).state)
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.
openHAB 3.2 in einer Debian-VM mit openHABian unter Proxmox 6.4-13 auf Intel NUC 5i3ryh

Benutzeravatar
udo1toni
Beiträge: 13948
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Differenz von Item-Werten

Beitrag 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
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten