Seite 1 von 1

Rule für Soll/Ist Temperatur speichern richtig umgesetzt?

Verfasst: 5. Apr 2021 13:32
von julianpe
Hallo zusammen,

ich möchte die Soll/Ist Temperaturen von allen Räumen in einer InfluxDB2 Datenbank speichern.
Ich verwende Openhab3 in einer Dockerinstanz im Raspberry Pi 4 (8GB, RPiOs 64 Bit).

Ich habe die Rules wie folgt erstellt:
temperature.rules

Code: Alles auswählen

rule "Temperatur Büro"
 
when
Item Ist_Temperatur_Buero received update
then
Ist_Temperatur_Buero.postUpdate(Ist_Temperatur_Buero.state) 
Soll_Temperatur_Buero.postUpdate(Soll_Temperatur_Buero.state)
end

rule "Temperatur Kind Süd"
 
when
Item Ist_Temperatur_Kind_Sued received update
then
Ist_Temperatur_Kind_Sued.postUpdate(Ist_Temperatur_Kind_Sued.state) 
Soll_Temperatur_Kind_Sued.postUpdate(Soll_Temperatur_Kind_Sued.state)
end


rule "Temperatur Kind Nord"
 
when
Item Ist_Temperatur_Kind_Nord received update
then
Ist_Temperatur_Kind_Nord.postUpdate(Ist_Temperatur_Kind_Nord.state) 
Soll_Temperatur_Kind_Nord.postUpdate(Soll_Temperatur_Kind_Nord.state)
end

rule "Temperatur Bad OG"
 
when
Item Ist_Temperatur_Bad_OG received update
then
Ist_Temperatur_Bad_OG.postUpdate(Ist_Temperatur_Bad_OG.state) 
Soll_Temperatur_Bad_OG.postUpdate(Soll_Temperatur_Bad_OG.state)
end

rule "Temperatur Schlafen"
 
when
Item Ist_Temperatur_Schlafen received update
then
Ist_Temperatur_Schlafen.postUpdate(Ist_Temperatur_Schlafen.state) 
Soll_Temperatur_Schlafen.postUpdate(Soll_Temperatur_Schlafen.state)
end

rule "Temperatur Küche"
 
when
Item Ist_Temperatur_Kueche received update
then
Ist_Temperatur_Kueche.postUpdate(Ist_Temperatur_Kueche.state) 
Soll_Temperatur_Kueche.postUpdate(Soll_Temperatur_Kueche.state)
end

rule "Temperatur Wohnzimmer"
 
when
Item Ist_Temperatur_Wohnzimmer received update
then
Ist_Temperatur_Wohnzimmer.postUpdate(Ist_Temperatur_Wohnzimmer.state) 
Soll_Temperatur_Wohnzimmer.postUpdate(Soll_Temperatur_Wohnzimmer.state)
end

rule "Temperatur Arbeiten"
 
when
Item Ist_Temperatur_Arbeiten received update
then
Ist_Temperatur_Arbeiten.postUpdate(Ist_Temperatur_Arbeiten.state) 
Soll_Temperatur_Arbeiten.postUpdate(Soll_Temperatur_Arbeiten.state)
end

rule "Temperatur Gäste-WC"
 
when
Item Ist_Temperatur_Gaeste_WC received update
then
Ist_Temperatur_Gaeste_WC.postUpdate(Ist_Temperatur_Gaeste_WC.state) 
Soll_Temperatur_Gaeste_WC.postUpdate(Soll_Temperatur_Gaeste_WC.state)
end

rule "Temperatur Flur"
 
when
Item Ist_Temperatur_Flur received update
then
Ist_Temperatur_Flur.postUpdate(Ist_Temperatur_Flur.state) 
Soll_Temperatur_Flur.postUpdate(Soll_Temperatur_Flur.state)
end

rule "Temperatur HWR"
 
when
Item Ist_Temperatur_HWR received update
then
Ist_Temperatur_HWR.postUpdate(Ist_Temperatur_HWR.state) 
Soll_Temperatur_HWR.postUpdate(Soll_Temperatur_HWR.state)
end
Und die Speicherlogik influxdb.persist:

Code: Alles auswählen

Strategies {
everyMinute : "0 * * * * ?"
everyHour : "0 0 * * * ?"
everyDay : "0 0 0 * * ?"
every2Minutes : "0 */2 * ? * *"
default=everyChange
}
 
Items {
HouseSumConsumption: strategy = everyMinute, restoreOnStartup
Stromzaehler_Verbrauch_Aktuell : strategy = everyMinute, restoreOnStartup
Stromzaehler_Verbrauch_Tag : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_Buero : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_Buero : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_Kind_Sued : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_Kind_Sued : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_Kind_Nord : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_Kind_Nord : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_Bad_OG : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_Bad_OG : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_Schlafen : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_Schlafen : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_Kueche : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_Kueche : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_Wohnzimmer : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_Wohnzimmer : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_Arbeiten : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_Arbeiten : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_Gaeste_WC : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_Gaeste_WC : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_HWR : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_HWR : strategy = everyMinute, restoreOnStartup
Ist_Temperatur_Flur : strategy = everyMinute, restoreOnStartup
Soll_Temperatur_Flur : strategy = everyMinute, restoreOnStartup
}

Die Daten bekomme ich über das KNX Bussystem.
Nun habe ich das Gefühl, dass Openhab mit den Rules überfordert ist, denn der Container läuft mit tlw. 300% CPU Last (lt. Portainer Darstellung)
CPU_Usage.png
Overview_Rules.png
Edit:

Wenn ich die Temperatur rule deaktiviere und die Einträge aus der persist Datei entferne, geht die CPU Last auf ca 7% zurück
CPU_danach.png
Was sagt ihr dazu?

Danke und Gruß
Julian

Re: Rule für Soll/Ist Temperatur speichern richtig umgesetzt?

Verfasst: 5. Apr 2021 14:44
von int5749
Evtl. verstehe ich die Rule nicht, aber die triggern sich doch alle permanent? Da ist eine hohe Proz-Last kein Wunder.
Rule trigget und in der Rule triggerst Du diese wieder und wieder und ....

Zum persistieren braucht es doch keine zusätzliche Rule? Was soll die Rule bewirken? Du setzt nach einem Trigger dem gleichen Item den state des gleichen Items?

Re: Rule für Soll/Ist Temperatur speichern richtig umgesetzt?

Verfasst: 5. Apr 2021 15:27
von julianpe
Ich dachte, dass durch den Funktionsaufruf .postUpdate erst die Daten geschrieben werden.
Stattdessen kann ich einfach die Variablen in der persistence Datei lassen, die werden dann minütlich in die Datenbank geschrieben?

Re: Rule für Soll/Ist Temperatur speichern richtig umgesetzt?

Verfasst: 5. Apr 2021 16:13
von itsego1990
hi,
wie int5749 schreibt , braucht man keine Rule um werte in die datenbank zuschreiben.
Stattdessen kann ich einfach die Variablen in der persistence Datei lassen, die werden dann minütlich in die Datenbank geschrieben?
Genau in der persistence Datei stellst du ein wie oft der wert aktuallisert wird bzw, welche variable überhaupt in der Datenbank erfasst wird.
Aber wenn ein wert öfter aktuallisert bedeutet das auch mehr Leistung wird vom Server benötigt auf dem Openhab läuft. Bei ein paar Werten ist das nicht spürbar aber wenn man viele hat wo oft aktualsoert werden macht das schon was aus. Es bedeutet auch viel Schreib und Lese zugriffe auf die SD-Karte auf der die Datenbank läuft.

Ich loge z.b. meine Soll-werte mit dem Befehl everyChange. weil die änderen sich ja nicht so oft.
die Ist-werte von der Temperatur reichen mir auch alle 5min .

Rule für Soll/Ist Temperatur speichern richtig umgesetzt?

Verfasst: 6. Apr 2021 09:53
von udo1toni
Wie schon geschrieben braucht es zum Persistieren der Werte gar keine Rule.

Es geht aber noch weiter... Du brauchst nur zwei Zeilen in der *.persist Datei für das Persistieren, das wären

Code: Alles auswählen

gSollTemp* : strategy = everyMinute,everyChange,restoreOnStartup
gIstTemp*  : strategy = everyMinute,everyChange
Und dann packst Du alle Solltemperaturitems in die Gruppe gSollTemp und die Isttemperaturitems Gruppe gIstTemp.
Du möchtest die Isttemperaur nicht beim Programmstart aus den persistierten Daten wiederherstellen. Bei der Solltemperatur kann man auch drüber streiten, ob es nicht sinnvoller wäre, diese aus den RTR auszulesen.
Auf jeden Fall möchtest Du aber, dass die Persistence nicht nur minütlich, sondern auch bei Wertänderungen persistiert.

EveryMinute ist nur bei rrd4j zwingend notwendig, wenn ein anderes Backend eingesetzt wird (z.B. MySQL oder InfluxDB) so kann das wiederholte Schreiben immer identischer Werte komplett entfallen.


Gesendet von iPad mit Tapatalk