aWATTar Binding - Preise aus zukünftigen Stunden filtern

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

aWATTar Binding - Preise aus zukünftigen Stunden filtern

Beitrag von Quautiputzli »

Hallo miteinander,

ich nutze das aWATTar Binding. Dort gibt es unter anderem ein Item für den aktuellen Preis "aWATTarHourlyPrice_Current_Totalgross" und für jede Stunde:

Code: Alles auswählen

aWATTarHourlyPrice_Today00_Totalgross
aWATTarHourlyPrice_Today01_Totalgross
aWATTarHourlyPrice_Today01_Totalgross
........
Diese Stundenpreise hab ich in eine Gruppe gepackt

Code: Alles auswählen

aWATTarHourlyPrice_Today
Ich möchte nun von allen Stundenpreise diejenigen rausfiltern die in der Zukunft liegen, und von diesen den Maximalpreis haben. Also, wenn es nun 13:31Uhr ist, möchte ich den Maximalpreis der Stunden von 14 bis 23 haben.

Das lässt sich doch sicher irgendwie mit einer solchen Schleife lösen:

Code: Alles auswählen

aWATTarHourlyPrice_Today.members.filter[?irgendwas?].forEach[i|
Auch gerne eine allgemeine Erklärung zu diesen Schachen die man mit .members so machen kann. Denn ich möchte das ganze ja auch verstehen.

Danke
Servus

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

Re: aWATTar Binding - Preise aus zukünftigen Stunden filtern

Beitrag von udo1toni »

Ja, das ist kein Problem. Es gibt dazu verschiedene Möglichkeiten, z.B.

Code: Alles auswählen

aWATTarHourlyPrice_Today.members.sortBy[ name ].filter[item,index|index>=now.getHour].forEach[i|
Die Elemente der Gruppe (members) werden zunächst nach dem Namen sortiert (alphabetisch aufsteigend). Anschließend werden die Items gefiltert, und zwar in diesem Fall nach dem Index innerhalb der Liste, wobei der Index größer oder gleich der Stunde der aktuellen Zeit sein muss.
Das funktioniert hier, weil der Index zufälligerweise mit den Nummern im Namen übereinstimmt. :) Der Index ist immer die zweite Variable innerhalb des Lambdas (also vor dem |) und wird nur selten gebraucht, hier aber enorm praktisch.
Besser wäre es natürlich, die Stunde stünde getrennt (durch _) im Itemnamen, so: aWATTarHourlyPrice_Today_00_Totalgross denn dann könnte man direkt auf den Index im Itemnamen zugreifen (ohne weitere Verrenkungen)

Code: Alles auswählen

aWATTarHourlyPrice_Today.members.sortBy[ name ].filter[item|Integer.parseInt(item.name.split("_").get(2)) >= now.getHour].forEach[i|
dieser Ausdruck ist schon "schlimm genug", aber letztlich noch ganz gut zu verstehen :)
Ohne das Leerzeichen:

Code: Alles auswählen

aWATTarHourlyPrice_Today.members.sortBy[ name ].filter[item|Integer.parseInt(item.name.split("_").get(1).substring(5,6)) >= now.getHour].forEach[i|
also auch noch "irgendwie handlebar, aber halt definitiv nicht mehr selbsterklärend. Die erste Zahl bei substring() gibt die Startposition an, die zweite Zahl die Endposition, Endposition - Startposition + 1 entspricht dann der Länge des zurückgelieferten Strings. Man könnte auch so abfragen:

Code: Alles auswählen

aWATTarHourlyPrice_Today.members.sortBy[ name ].filter[item|Integer.parseInt(item.name.substring(24,25)) >= now.getHour].forEach[i|
was zwar kürzer, aber eben auch nicht verständlicher ist.

Leider unterstützt das Awattar Binding offensichtlich noch nicht den neuesten "geilen Scheiß", was Dir die Arbeit hier nämlich erleichtern könnte, wäre die Forecast Persistence (keine Ahnung, ob das der korrekte Name ist). Die Idee dahinter ist, dass Messwerte für zukünftige Zeitpunkte einfach unter dem passenden Zeitstempel in die Persistence geschrieben werden. Und von dort kann man sie dann auch leicht abrufen, sei es als Chart der in die Zukunft schaut oder als Abfrage eines Zeitraums, der mit der aktuellen Zeit startet und in der Zukunft endet. Mit verschiedenen Wetterprognosen funktioniert das schon und man braucht nicht mehr 120 Items, um die Stundenwerte eines Messwerts für die nächsten fünf Tage abrufbar zu haben. Das funktioniert nicht mit jeder Persistence, rrd4j ist da raus.
Eventuell wäre ein Feature Request zum Awattar Binding sinnvoll (im englischen Forum...)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: aWATTar Binding - Preise aus zukünftigen Stunden filtern

Beitrag von Quautiputzli »

Hallo und Danke für die verständliche Erklärung
Ich werde das mal durchprobieren.

Im Anschluss bräuchte ich dann von den gefilterten Werten noch das Maximum.

Angeblich unterstützt das aWATTar-Binding ab OH4.3 (und das hab ich am laufen) die Time Series, ich denke das ist was du meinst. Ich finde hier im Thing aber keinen Umschalter um es zu aktivieren, so wie das z.B. beim OpenMeteo ist.
Servus

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: aWATTar Binding - Preise aus zukünftigen Stunden filtern

Beitrag von Quautiputzli »

Ah ja, ich denke ich habe die time series bei aWATTar nun gefunden. Wie es scheint wurden die dort direkt in die bridge gebastelt. Leider gibt es dort nur 2 Kanäle, nämlich ohne MwSt.
Bild_2025-01-24_100549690.png
Im thing Hourly Price gibt es 4 Kanäle:
Bild_2025-01-24_100815819.png
Und ich nutze normalerweise das mit MwSt. So gäbe es ein Durcheinander. Außerdem sind noch keine werte im neuen Kanal, wahrscheinlich kommen die erst mit den neuen Datenabruf heute Nachmittag.

Naja, auf jeden Fall hab ich mal ein bisschen mit einer Testrule gespielt:

Code: Alles auswählen

rule "test"
when
    Time cron "3/20 * * * * *"
then
	aWATTarHourlyPrice_Today.members.sortBy[ name ].filter[item|Integer.parseInt(item.name.substring(24,26)) >= now.getHour].forEach[i|
//		logInfo("filtertest","1 - Items {}", i)
//		if(i.state > 2)
//			logInfo("filtertest","2 - State {}", i.state)
		if(i.state > aWATTarHourlyPrice_Current_Totalgross.state) {
			logInfo("filtertest","3 - State {}, aktueller Preis {}", i.state, aWATTarHourlyPrice_Current_Totalgross.state)
		}
	]
	logInfo("filtertest","Ende")
end
Die auskommentierten Zeilen waren nur zum Fehlersuchen. Komischerweise musste ich (item.name.substring(24,25)) auf "24,26" abändern. Sonst lief es nicht. Ich dachte zuerst, vielleicht wird doch nicht bei null angefangen, sondern bei eins. Darum habe ich es auf "25,26" geändert. Aber dann wurden nur die Stunden 09 und 19 rausgefiltert, also war klar dass die erste Stelle fehlt. Keine Ahnung warum dann dann auch "26" nötig ist.

Gibt es eigentlich auch die Möglichkeit "if" zu invertieren, oder muss man dass dann einfach ins "else" packen?

Danke und Servus
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Servus

Antworten