Tagesmitteltemperatur ermitteln

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

duralis
Beiträge: 29
Registriert: 31.12.2015, 15:29
Danksagung erhalten: 4 Mal

Tagesmitteltemperatur ermitteln

Beitrag von duralis » 06.05.2018, 21:39

Hi,

Ich habe mal versucht ein kleines Script zu schreiben.
Es ermittelt stündlich von einem Temperatursensor den Messwert und erzeugt dann um 0:00 Uhr einen "Tagesmittelwert" der in einer Systemvariablen abgelegt wird. Es wird dabei noch eine Hilssystemvariable benötigt.
Wenn jemand Verbesserungsvorschläge hat wäre ich dankbar.

Code: Alles auswählen

!! Tagesmitteltemperatur V1.0
!! Ermittlung der mittleren Tagestemperatur gemaess den Vorgaben vom DWD
!! siehe https://de.wikipedia.org/wiki/Tagesmitteltemperatur
!! 
!! Das Script sollte jede volle Stunde aufgerufen werden.
!!   Ein CUXD Timer kann mit dem Parameter ":0:0" unter "SYSTEM|TIMER_PRESET" mit "SYSTEM|REPEAT" entsprechend konfiguriert werden
!! Funktionsweise:
!! Jede volle Stunde den aktuellen Wert der Aussentemperatur einlesen und der bisher abgespeicherten Temperatur
!!   in der Systemvariable 2 aufaddieren.
!! Um 0:00 Uhr die bisherigen addierten Werte (ausser dem aktuellen 0:00 Uhr Wert) durch 24 teilen und dann das Ergebnis
!!   in die Systemvariable 1 (Tagesmittelwert) ablegen. Die Systemvariable 1 (Tagesmittelwert) wird daher nur 
!!   um 0:00 Uhr mit dem errechneten Tagesmittelwert des vergangenen Tages neu überschrieben.
!!   Die vorhandene Systemvariable 2 löschen und den gemessenen 0:00 Temperaturwert dort dann ablegen.
!! Wenn es nicht 0:00 Uhr ist wird einfach der gemessene Temperaturwert in der Systemvariable 2 addiert abgelegt
!! Der Tagesmittelwert in der Datenbank gilt also fuer den vergangenen Tag!
!! Ein neuer Tag wird erkannt wenn die Stunde der aktuellen Systemzeit "0" ist.
!! Es wird der in der CCU bekannte Wert der Temperatur vom Sensor abgefragt, es wird keine direkte Abfrage gestartet. Bei Bedarf umstellen!
!!
!!(c) duralis; zur beliebigen freien Verwendung
!!
!! abgefragte Sensoren:
!!   Aussentemperatur1 -> BidCos-RF.OEQ1864XXX:1.TEMPERATURE
!!
!! benoetigte Systemvariablen
!! Systemvariable 1 -> Name: v_MT_-TagesmitteltemperaturWetterstation -> Integer; (die errechtete Tagesmitteltemperatur vom vergangenen Tag)
!! Systemvariable 1 -> Name: v_MT_-01-TempTagesmittel01 -> Real; (Zwischensumme der Addition der Tagestemperaturen, maxmal 24x)


! Sensor und Variablendeklaration
! anpassen auf die eigenen Gegebenheiten
string dpTemperatursensor = "OEQ1864668"; ! abzufragender Temperatursensor eintragen
string Var_Mittelwert = "v_MT_-TagesmitteltemperaturWetterstation"; ! Name der Systemvariable für die Tagesmitteltemperatur eintragen
string Var_Zwischenspeicher = "v_MT_-01-TempTagesmittel01"; ! Name der Systemvariable für den Zwischenspeicher eintragen

! ab hier werden keine weiteren Anpassungen benoetigt
var dpname = "TEMPERATURE";
real Temperatur = 0; !lokale Variable zum zwischenspeichern und einfachen Testen


! Objektreferenz auf die Systemvariablen erstellen
var Zwischenspeicher = dom.GetObject(Var_Zwischenspeicher);
var Mittelwert = dom.GetObject(Var_Mittelwert);


! pruefen ob der Tagesmittelwert gebildet werden muss
! aktuelle Stundenzahl ermitteln (0...23)
! Wenn es 0:00 Uhr ist dann die summierten Stundentemperaturen auslesen, durch 24 teilen und in die Systemvariable
!   fuer die Tagesmitteltemperatur ablegen
if (system.Date("%H").ToInteger() == 0)
{
  ! es ist 0:00 Uhr und der Temperaturmittelwert muss gebildet werden
  ! gespeicherte Summe der 24 Tagestemperaturen auslesen
  Temperatur = dom.GetObject(Zwischenspeicher).Value();

  ! Mittelwert aus den 24 Stundentemperaturen errechnen
  Temperatur = Temperatur / 24;

  ! neuen errechneten Mittelwert in die Systemvariable 1 abspeichern
  dom.GetObject(Mittelwert).State(Temperatur);

  ! dann die Systemvariable fuer den Zwischenspeicher loeschen da es 0:00 Uhr ist, der Mittelwert gebildet und abgespeichert wurde
  dom.GetObject(Zwischenspeicher).State(0);
}

!jetzt noch den stündlichen Wert der Temperatur in den Zwischenspeicher aufaddiert ablegen
! Objektreferenz auf Temperaturobjekt erstellen
object ObjektSensor = dom.GetObject("BidCos-RF."#dpTemperatursensor#":1."#dpname);

!Temperatur auslesen und zwischenspeichern
Temperatur = ObjektSensor.Value(); ! vom Temperatursensor den in der CCU aktuell gespeicherten Wert abfragen und in die Variable speichern

! abspeichern des neuen Wertes indem der Alte Wert ausgelesen, mit dem neuen Wert addiert und dann abgespichert wird
dom.GetObject(Zwischenspeicher).State(dom.GetObject(Zwischenspeicher).Value()+Temperatur);

! addierten Wert aus der sytenvariablen wieder auslesen
Temperatur = dom.GetObject(Var_Zwischenspeicher).Value();
Duralis

Xel66
Beiträge: 14164
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 585 Mal
Danksagung erhalten: 1500 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von Xel66 » 07.05.2018, 07:26

Prima Idee! Danke. Kann man gut z.B. als Entscheidungshilfe für das Umschalten der Heizperiode für die Heizungssteuerung gebrauchen. Derzeit "entscheide ich" das über die Tageshöchst- und -tiefsttemperatur des vergangenen und aktuellen Tages.

Eine kleine Anmerkung habe ich doch. Vielleicht muss man noch ein Handling für die Umschalttage von Sommer- auf Winterzeit (Teiler 23 und 25) und vice versa implementieren, oder man lebt mit dem Rechenfehler an diesen Tagen. Wenn man keine Steuerung davon abhängig macht, dann ist das mehr ein optischer Fehler. Zwei Optionen. Entweder man implementiert noch eine Zählvariable (wie oft ist das Script an dem Tag gelaufen?) oder man wertet per Script das aktuelle Datum aus und past den Dividenden dann an. Ich denke, erstere Möglichkeit ist vielleicht einfacher zu einzubauen.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

dtp
Beiträge: 10660
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 321 Mal
Danksagung erhalten: 501 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von dtp » 07.05.2018, 14:02

Nur der Vollständigkeit halber und falls jemand eh schon den ioBroker nutzt, hier mal ein Link zu einem entsprechenden Javaskript.

Mein Ziel wäre das Auslesen der gespeicherten SQL-Datenbankwerte per "getHistory" sowie das Berechnen von Mittelwert, Standardabweichung und ggf. Varianz für ein zurückliegendes Zeitfenster.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

duralis
Beiträge: 29
Registriert: 31.12.2015, 15:29
Danksagung erhalten: 4 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von duralis » 07.05.2018, 22:38

Meine Antrieb zu dem Script bestand darin, mal den Heizenergieverbrauch über einen Zeitraum mit "irgendwas" vergleichen zu können. Um mal ermitteln zu können ob Änderungen an der Einstellung der Heizungssteuerung oder Hausdämmung oder was auch immer sich jetzt positiv oder negativ bemerkbar machen. Dazu sind aber wohl einige längere Zeiträume Aufzeichnung notwendig oder Recherchen bei der nächsten Wetterstation. Die Idee damit am nächsten Tag ein Thermostatventil zu beeinflussen ist auch nicht schlecht.
Die verschiedenen Stunden bei Sommer- Winterzeit Umstellung hatte ich noch nicht ganz so im Blick. Da müsste man ja noch eine Systemvariable "veralbern" nur um die Stunden bis 0:00 Uhr mitzuzählen oder gibt es da noch Alternativen?

Gruß Duralis

Xel66
Beiträge: 14164
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 585 Mal
Danksagung erhalten: 1500 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von Xel66 » 07.05.2018, 23:29

duralis hat geschrieben:Da müsste man ja noch eine Systemvariable "veralbern" nur um die Stunden bis 0:00 Uhr mitzuzählen oder gibt es da noch Alternativen?
Ja und, wo ist das Problem? Ich glaube nicht, dass Du so viele erstellst, dass Du an ein Limit kommst. Falls Dir die Zahl 200 im Hirn rumspukt, dann vergiss es. Es war erstens ein anderes Problem (Scriptvariablen) und zweitens wird die Anzahl der Geräte, Programme, Systemvariablen nur durch den Vorrat an internen IDs begrenzt. Da müsste man schon eine relativ große Installation mit vielen Kanälen und Datenpunkten haben.

Eine Alternative bestünde darin, die jeweiligen Termine für die Zeitumstellung (letzter Sonntag im März und Oktober) im Script zu überwachen und somit die Dividenden zu wählen. Ansosten ist es an beiden betreffenden Tagen im Mittel zu kalt. Für die Überwachung gäbe es zwei Ansätze. Man berechnet jeweils das Datum der Zeitumstellung und wählt den Dividenden entsprechend oder man lässt im Script immer um 3:00 Uhr die aktuelle Zeitzone (CET/(CEST) und die einer Minute zuvor überwachen und schreibt die aktuelle Temperatur doppelt (W/S) in den Zwischenspeicher oder lässt sie aus (S/W).

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

dtp
Beiträge: 10660
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 321 Mal
Danksagung erhalten: 501 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von dtp » 08.05.2018, 08:04

Man kann auch einfach einen Counter mitlaufen lassen, der bei jedem Skriptaufruf um Eins hoch zählt und zu einem definierten Zeitpunkt (z.B. 23:00 Uhr) auf Null gesetzt wird. Durch diesen Counter wird am Ende jeder Messperiode dann geteilt. Dazu braucht es aber noch eine weitere Systemvariable.
Zuletzt geändert von dtp am 08.05.2018, 12:07, insgesamt 2-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Xel66
Beiträge: 14164
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 585 Mal
Danksagung erhalten: 1500 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von Xel66 » 08.05.2018, 09:55

dtp hat geschrieben:Man kann auch einfach einen Counter mitlaufen lassen
Das meinte ich oben mit der Zählervariable. Diese Lösung hat sogar noch den Charme, dass man bei untertägigem Messzyklus (z.B. nach dem Einspielen eines Backups, späteren Start des Scripts oder CCU-Neustart zu einer vollen Stunde o.ä.) bei der Berechnung einen einigermaßen plausiblen (wenn auch nicht richtigen) Wert erhält. Nullen darf man ihn allerdings erst, wenn die Tagesbrechnung (nach 0:00 Uhr) gelaufen ist. Sonst hat man ja auch keinen Teiler und das Ergebnis wäre dementsprechend. Mit dem Counter spart man sich das ganze Handling der Zeitumstellungstermine und erschießt gleichzeitig noch das Problem mit dem untertägigen Programmlauf.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

dtp
Beiträge: 10660
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 321 Mal
Danksagung erhalten: 501 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von dtp » 08.05.2018, 12:07

Xel66 hat geschrieben:Nullen darf man ihn allerdings erst, wenn die Tagesbrechnung (nach 0:00 Uhr) gelaufen ist. Sonst hat man ja auch keinen Teiler und das Ergebnis wäre dementsprechend.
Hast Recht. Eine Division durch Null muss man natürlich vermeiden.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Xel66
Beiträge: 14164
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 585 Mal
Danksagung erhalten: 1500 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von Xel66 » 08.05.2018, 16:58

Jetzt habe ich mir die Mühe gemacht, eine Implementation einer Zählervariable umzusetzen und ein laufendes Script zu haben und wollte es gerade posten, da lese ich auf den Seiten vom DWD das:
Zitat:
"Ab dem 01.04.2001 wurde der Standard wie folgt geändert:
  • Berechnung der Tagesmittel aus 24 Stundenwerten
    Wenn mehr als 3 Stundenwerte fehlen -> Berechnung aus den 4 Hauptterminen (00, 06, 12, 18 UTC)
  • Bezugszeit für einen Tag i.d.R. 23:51 UTC des Vortages bis 23:50 UTC
  • nur der Niederschlag des Vortages wird morgens um 05:50 UTC gemessen

Hierbei werden die Beobachtungstermine auf die global genutzte Zeit in Greenwich (GMT oder UTC) bezogen. Die Beobachtungszeit ist jeweils 10 Minuten vor dem Bezugstermin (daher die krummen Zeitangaben). Diese Umstellung war erforderlich, nachdem das Stationsnetz weitgehend automatisiert wurde."


Man beachte den fett markierten Satz. Es ist also unnötig, den Zähler zu implementieren. Man muss nur den Zeitpunkt der Berechnung der Tagesmitteltemperatur in Abhängigkeit von der aktuellen Zeitzone (Sommer- oder Winterzeit) variieren. Es werden immer 24 Stunden betrachtet. Somit umgeht man auch elegant das Problem mit dem Divisor an den Umstellungstagen.

Bei Wikipedia findet man dann noch folgendes:
Zitat: Die Tagesmitteltemperatur, auch Tagesdurchschnittstemperatur, wird in Deutschland seitens des Deutschen Wetterdienstes seit dem 1. April 2001 durch Bilden des Mittelwerts aller zur vollen Stunde gemessenen Lufttemperaturwerte (TL) von 0 bis einschließlich 23 Uhr UTC (also von 1 bis einschließlich 0 Uhr MEZ; TUhrzeit) ermittelt:

Nun betreiben wir ja keine meteorologische Datenerfassung, aber wenn man schon so was berechnet, dann könnte man sich auch an etablierte Standards halten. Somit ist das Script schon richtig, wenn es den Wert um 0:00 Uhr (MEZ) berechnet. Allerdings könnte man den Berechnungszeitpunkt durch die Abfrage von %z (Zeitabstand zu GMT) oder %Z (Name der Zeitzone) zwischen 0:00 Uhr (MEZ) und 23:00 (MESZ) variieren.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

duralis
Beiträge: 29
Registriert: 31.12.2015, 15:29
Danksagung erhalten: 4 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von duralis » 08.05.2018, 21:06

Hi,
ich habe bei mir intern das Script schon auf UTC umgestellt. Ich prüfe mal die 0:00 Uhr Wechsel noch ab. Wenn alles läuft stelle ich die Korrektur hier ein.
Danke an Xel66 für die umfangreichen Recherchen und Tipps zur Umrechnung!

Beste Grüße

Duralis

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“