Tagesmitteltemperatur ermitteln

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

Moderator: Co-Administratoren

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

Re: Tagesmitteltemperatur ermitteln

Beitrag von Xel66 » 08.05.2018, 23:28

duralis hat geschrieben:ich habe bei mir intern das Script schon auf UTC umgestellt.
Ich mache auch gerade einen Probelauf mit einer Abwandlung Deines Scripts. Im Grunde habe ich nur die Reihenfolge verändert (Berechnung ans Scriptende, damit der 0:00 Uhr-Wert der letzte des Tages ist und dann genullt wird) und die if-Clause um die %Z-Abfragen ergänzt.

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 » 09.05.2018, 20:17

Jetzt bin ich doch etwas unsicher. Gehört die Temperatur von 0:00 schon zum neuen Tag (wie mein Script rechnet) oder noch zum alten Tag? Aus der DWD Beschreibung werde ich nicht so ganz schlau. "Bewertungszeitraum bis 23:51" würde für mich bedeuten dass die 0:00 Uhr Temperatur zum neuen Tag gehört - oder was meint ihr?

Duralis

Gesendet von meinem HUAWEI NXT-L29 mit Tapatalk

shrimps
Beiträge: 48
Registriert: 28.11.2015, 01:00

Re: Tagesmitteltemperatur ermitteln

Beitrag von shrimps » 09.05.2018, 20:32

Ohne der ccu Guru zu sein:
Der Tag geht von 00:00 bis 23:59 .
Nur so werden 24h erreicht
LG Shrimps

Gesendet von meinem ONEPLUS A3003 mit Tapatalk

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

Re: Tagesmitteltemperatur ermitteln

Beitrag von Xel66 » 09.05.2018, 23:29

duralis hat geschrieben: Gehört die Temperatur von 0:00 schon zum neuen Tag (wie mein Script rechnet) oder noch zum alten Tag?
Eigentlich ist die Wikipedia-Aussage:von 0 bis einschließlich 23 Uhr UTC (also von 1 bis einschließlich 0 Uhr MEZ recht eindeutig. Der Bezug ist eindeutig UTC. Da wir uns mit MEZ bei UTC+1 befinden (oder MESZ=UTC+2 derzeit), gehört 0:00 Uhr-Wert zum Vortag und Deine Berechnung um 0:00 Uhr ist zur Winterzeit korrekt. Während der Sommerzeit muss die Berechnung beim Bezug auf 23:00 Uhr UTC eben um 01:00 Uhr MESZ laufen. So habe ich es bei mir zur Zeit umgesetzt.
Ich habe derzeit bei mir den Berechnungszeitpunkt mit:

Code: Alles auswählen

if (((system.Date("%H").ToInteger() == 0) && (system.Date("%Z").ToString() == "CET")) || ((system.Date("%").ToInteger() == 1) && (system.Date("%Z").ToString() == "CEST")))
programmiert.

Weiterhin habe ich noch den Berechnungsblock im Script nach hinten verschoben, dass zuerst noch der 0:00 Uhr-Wert auf den Tagessummenwert addiert und dann die Berechnung durchgeführt wird. Im Anschluss nulle ich dann den Summenwert, dass beim nächsten Scriptlauf (01:00 Uhr MEZ oder eben 02:00 Uhr MESZ) wieder mit der neuen Summe begonnen wird. In Deiner obigen Variante wird immer der 0:00 Uhr-Wert als erster Summand hinterlegt. Das macht sicher bei der Berechnung nicht viel aus, weil es eigentlich für eine Mittelwertbildung relativ egal ist, ob die Werte von 0:000 bis 23 Uhr oder von 01:00 bis 00:00 Uhr summiert werden. Der Genauigkeit tut das keinen großen Abbruch, ist aber nicht entsprechend der Definition.

Solltest Du den CUxD-Timer auf eine Triggerzeit von xx:50 Uhr anpassen, musst Du auch wieder die Triggerstunden zur Berechnung anpassen, da Du dann ja "eine Stunde vorher" bist. Wobei ein Scriptlauf nicht zur vollen Stunde grundsätzlich zielführend ist, weil bei mir z.B. bei Tageswechsel zur vollen Stunde auch andere Scripte laufen. Das würde das alles etwas entzerren. Muss ich mal hirnen.

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 » 12.05.2018, 18:58

Hallo Ihr,

aufgrund anregender Diskussionen zum Script habe ich dieses leicht überarbeitet und stelle die Version wieder ein.
In der neuen Version V1.2 wird die Uhrzeit von UTC ermittelt und jetzt um 0:00 Uhr UTC die Mittelwertbildung durchgeführt.
Die 0:00 Uhr Temperatur wird, wie schon in der alten Version V1.0, nicht in die Mittelwertbildung des gerade vergangenen Tages eingerechnet sonder schon für den neuen Tag verwendet.
Ich selbst starte den CUXD Timer immer zur vollen Stunde verzögere des Script aber um einige Sekunden da ich, wie auch andere, mit dem Stundentimer noch andere Funktionen aufrufe und hoffe die CCU dabei etwas zu entlasten.
Danke auch an Xel66

Duralis

Code: Alles auswählen

!! Tagesmitteltemperatur V1.2
!! Ermittlung der mittleren Tagestemperatur gemaess den Vorgaben vom DWD
!! siehe https://www.dwd.de/DE/leistungen/klimadatendeutschland/beschreibung_tagesmonatswerte.html
!! 
!! Das Script sollte jede volle Stunde aufgerufen werden.
!!   Ein CUXD Timer kann mit dem Parameter ":0:0" untern "SYSTEM|TIMER_PRESET" mit "SYSTEM|REPEAT" entsprechend konfiguriert werden
!! Funktionsweise:
!! Jede volle Stunde (aufgrund des CUXD Timers) 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 ueberschrieben.
!!   Die vorhandene Systemvariable 2 loeschen und den gemessenen 0:00 Temperaturwert dort dann als erstes ablegen.
!! Wenn es nicht 0:00 Uhr ist wird einfach der gemessene Temperaturwert in der Systemvariable 2 addiert abgelegt
!! Ab V1.2 wird die Uhrzeit auf UTC umgerechnet und damit dann um 0:00 Uhr UTC die Mittelwertbildung durchgefuehrt.
!! Der Tagesmittelwert in der Variablen (z.B. CCU-Historian Datenbank) gilt also fuer den vergangenen Tag!
!! Ein neuer Tag wird erkannt wenn die Stunde der aktuellen UTC Zeit "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.OEQ1864668: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 fuer die Tagesmitteltemperatur eintragen
string Var_Zwischenspeicher = "v_MT_-01-TempTagesmittel01"; ! Name der Systemvariable fuer 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) inkl. Verrechnung der Verschiebung zu UTC
! aufgrund der Verrechnung des Versatzes zu UTC
!   bei MEZ  -> -1 bis +22
!   bei MESZ -> -2 bis +21

integer UTCStunde = system.Date("%H").ToInteger() - (system.Date("%z").ToInteger()/100); ! UTC Verschiebung berechnen
! pruefen ob durch den UTC Versatz eine negative Stunde auftriit, diese korrigieren
if (UTCStunde < 0)
{
  UTCStunde = UTCStunde + 24;
}

! Wenn es 0:00 Uhr UTC ist dann die summierten Stundentemperaturen auslesen, durch 24 teilen und in die Systemvariable
!   fuer die Tagesmitteltemperatur ablegen
if (UTCStunde == 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 stuendlichen 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 Temperatur Wertes indem der alte Wert ausgelesen, mit dem neuen Wert addiert und dann abgespichert wird
dom.GetObject(Zwischenspeicher).State(dom.GetObject(Zwischenspeicher).Value()+Temperatur);


Handi
Beiträge: 192
Registriert: 15.08.2006, 20:34
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von Handi » 28.07.2018, 21:25

duralis hat geschrieben:
12.05.2018, 18:58
In der neuen Version V1.2 wird die Uhrzeit von UTC ermittelt und jetzt um 0:00 Uhr UTC die Mittelwertbildung durchgeführt.
Hm. Das führt leider dazu, daß der Tageswert immer erst um 1 bzw. 2 Uhr des Folgetages zur Verfügung steht und somit mit dem Datum des Folgetages versehen ist. Zusammen mit dem Energieverbrauch, den ich via Zählerscript um 23:55 tagesgenau in eine Tagessummen-Variable speichere paßt das dann leider nicht mehr :(
Meine langjährige Mitgliedschaft im Forum heißt nicht zwingend, daß ich mich mit der HM-Umgebung gut auskenne (bin nur "Gelegenheits-Anwender")

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

Re: Tagesmitteltemperatur ermitteln

Beitrag von Xel66 » 28.07.2018, 21:46

Handi hat geschrieben:
28.07.2018, 21:25
... Tageswert immer erst um 1 bzw. 2 Uhr des Folgetages zur Verfügung steht ...
So ist es nun mal. Per Definition bezieht sich die Berechnung des Tagesmittelwerts auf 0-23 Uhr UTC. Da bei uns die ME(S)Z gilt, wirst Du die (korrekte) Berechnung eben nie vor 0:00 Uhr haben. Du musst Dir eben das Script auf Deine Zeiten anpassen. Kommt drauf an, was Dir wichtiger ist. Ich berechne parallel noch einen gleitenden Mittelwert der letzten 24 Stunden. Die Werte sind ähnlich, aber prinzipbedingt nicht gleich. Für die eigene Statistik und in meinem Fall Heizungssteuerung ist der Wert für mich aussagekräftiger, da sich z.B. ein heutiger Tag mit deutlich vom Vortag abweichendem Temperaturniveau schneller auf das Ergebnis auswirkt. Das ist aber kein "genormter" meteororologischer Wert.

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

Mike42
Beiträge: 39
Registriert: 31.12.2013, 13:48
Wohnort: Lauf an der Pegnitz
Danksagung erhalten: 2 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von Mike42 » 28.07.2018, 22:39

Hi,

Bei mir läuft ein Skript im Stundentakt und errechnet stündlich den Mittelwert der letzten 24 Stunden... damit habe ich jede Stunde einen gleitenden Mittelwert... bei Interesse kann ich das Skript gerne posten.

Grüße

Mika

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

Re: Tagesmitteltemperatur ermitteln

Beitrag von Xel66 » 29.07.2018, 10:34

Mike42 hat geschrieben:
28.07.2018, 22:39
..Skript im Stundentakt und errechnet stündlich den Mittelwert der letzten 24 Stunden...
Einen solchen Wert habe ich ja wie oben beschrieben auch. Kommt eben drauf an, was man mit den Werten machen will. Für die eigene Steuerung ist das durchaus zu gebrauchen (vielleicht sogar besser als die meteorologisch korrekt erfasste Tagesmitteltemperatur). Für Hobby-Meteorologen eher nicht. Ich denke mal, die dürften sowieso keine HM-Sensorik einsetzen.

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

Handi
Beiträge: 192
Registriert: 15.08.2006, 20:34
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal

Re: Tagesmitteltemperatur ermitteln

Beitrag von Handi » 09.08.2018, 10:42

Mir kommt es nicht auf 100% korrekte Werte an, sondern ich will für statistische Zwecke einfach eine tagesgenaue Zuordnung des täglichen Energieverbrauchs zur durchschnittlichen Außentemperatur; da kommt es mir nicht auf Nachkommastellen an und auch nicht wirklich auf +/- 10 Grad innerhalb eines Tages (wie sie hier auch schon mal vorkommen) - mir geht es einfach um einen grundsätzllichen (langfristigen) Trend, dem ich dann entnehmen kann, welche Energieeinsparmaßnahmen evtl. noch sinnvoll sind/wären. Dazu werde ich das Script (das ohne UTC) vermutlich so abändern, daß ich das Script kurz nach 23 Uhr ausführe und den bis dahin ermittelten Summenwert der stündlichen Temperaturen dann entsprechend modifiziert dividiere.
Meine langjährige Mitgliedschaft im Forum heißt nicht zwingend, daß ich mich mit der HM-Umgebung gut auskenne (bin nur "Gelegenheits-Anwender")

Antworten

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