• Willkommen im Forum „Wetterstationsforum.info - Archiv“.
 

Neuigkeiten:

Dieses Forum dient ausschließlich zu Archivzwecken.
Für Fragen nutze bitte unser aktuelles Forum, welches du unter https://wetterstationsforum.info findest.

Hauptmenü

SQL-Datenbank - Temperatur vor einem Jahr aus Cumulus auslesen?

Begonnen von Wetterfrosch1971, 23.01.2016, 14:30:06

⏪ vorheriges - nächstes ⏩

Wetterfrosch1971

Hallo Hans,

ja, dem wird dann wohl so sein, d.h. wenn es einen Treffer gibt, dann wird die Ausgabe ja "true" und nicht "false" und somit wird eine Ausgabe generiert.
Das ist dann so doch auch ok, wusste bis dato auch nicht, dass PHP so schlau ist und exakt 1 Jahr zurück rechnet und beim Schaltjahr dann einfach 2x den 01.03. verwendet, das passt für mich aber auch, dann wird halt am 29.02. und am 01.03. jedes mal die Temperatur vom Vorjahres-ersten-März ausgegeben.

Gruß Frank


Bernd aus Köln

Vielleicht ist der Aufwand für den einen Tag in 4 Jahren übertrieben, aber man könnte auch statt
"vor einem Jahr" angeben: "am 01.03.2015".
Dann wären alle Zweifel beseitigt, welcher Tag vor einem Jahr zugrunde gelegt wurde.
WMR 200 & Meteohub auf Sheevaplug

wneudeck

Hallo,
ich würde es sowieso interessanter finden (aber das ist Geschmackssache), nicht den Temperaturwert zu einer genauen Uhrzeit sondern den Durchschnittswert des jeweiligen Tages zu vergleichen. So mache ich es zumindest auf meiner Seite mit einer einzigen Variablen von WSWIN und ganz ohne PHP.  :)
Denn was sagt es schon, wenn es um eine bestimmte Uhrzeit gerade mal +2 Grad gehabt hat, der Durchschnittswert des ganzen Tages aber -5 Grad ist (es also ein ziemlich kalter Tag war).
Das soll jetzt aber keine Diskussion auslösen, die von der eigentlichen Fragestellung wegführt.



[gelöscht durch Administrator]

Wetterfrosch1971

Zitatich würde es sowieso interessanter finden (aber das ist Geschmackssache), nicht den Temperaturwert zu einer genauen Uhrzeit sondern den Durchschnittswert des jeweiligen Tages zu vergleichen

Ja stimmt, ist reine Geschmackssache, ich finde es halt interessant, wenn ich schaue, wie die aktuelle Temperatur im Moment ist, wie sie exakt vor einem Jahr zum Vergleich war.

Sicherlich sagt die Durchschnittstemperatur eventuell mehr aus, doch leider bietet mein Wetterprogramm Cumulus in den log-Dateien keine Durchschnittstemperatur an, d.h. mein Programm verfügt nur über diese Durchschnittstemperatur "heute" und "gestern", weiter zurück wird diese Temperatur von Cumulus leider nicht gespeichert.

Hätte ich die Durchschnittstemperatur als log-Datei, würde ich sie auch noch anzeigen.

Gruß Frank

Wetterfrosch1971

#34
Hallo,

ich poste hier mal das fertige Script von webworker, falls vielleicht Jemand mal das selbe Vorhaben hat.

Das Script ist auf die Parameter die das Wetterprogramm Cumulus produziert ausgelegt.

Damit das Script funktioniert, muss man auf den Webspace, in den selben Ordner wie das Script, die monatlichen Cumulus log Dateien des vergangenen Jahres hochladen (sind unter Cumulus im data-Ordner zu finden und heißen z.B, jan15log.txt)
Diese 12 monatlichen Dateien muss man dann auf dem Webspace in january.txt, february.txt usw. (alles klein geschrieben) umbenennen, sonst funktioniert das Scrip nicht.

Außerdem ist wichtig, welches Speicherintervall man bei den log-Dateien verwendet, das Script im Ursprungszustand arbeitet mit einem Speicherintervall von 1 Minute, d.h. es funktioniert nur, wenn die log-Datei von dem es die Temperatur von vor einem Jahr ausließt, alle Minute einen Wert gespeichert hat.

Hat man ein Speicherintervall von 10 Minuten in den log-Dateien, so kann man im Script eine Zeile abändern, so arbeitet es auch mit diesem Speicherintervall.

Danke an diese Stelle noch mal an webworker, der mir dieses schöne Script erstellt hat, es funktioniert super und hat mit 0,1 Sekunden Laufzeit denke ich keinen Einfluss auf die Geschwindigkeit beim Aufbau der Webseite.

Das fertige Script läuft bei mir auf dieser Seite:
http://www.wetterstation-badenweiler.de/wetter/index.php


<?php    //Datum und Zeitangaben  date_default_timezone_set('Europe/Berlin');    //$now  = ceil(time()/600)*600; //Zeit auf 10 Minuten aufgerundet (für den Fall, dass log-Datei nur alle 10 Minuten einen wert liefert)  //$now = = floor(time()/600)*600; //Zeit auf 10 Minuten abgerundet  $now  = time(); //für den Fall, dass log-Datei alle Minute einen Wert gespeichert hat  $now -= $now % 60;   $past = strtotime(date('d-m-Y H:i', $now) . ' - 1 year');  //Cumulus-Textdatei einlesen (muss auf dem Webspace als january.txt usw. vorliegen)  $lines = file(strtolower (date('F')).'.txt');  foreach ($lines as $row){    $row = explode(';', $row);    $teileDat  = explode('.',$row[0]);    $teileZeit = explode(':',$row[1]);    $datstamp = mktime($teileZeit[0],$teileZeit[1],'00',$teileDat[1],$teileDat[0],$teileDat[2]);    if($datstamp === $past){     	 echo 'Temperatur heute vor einem Jahr: '.$row[2].' &deg;C<br>';	      }    else {      // kein Ergebnis gefunden     	     }}?>



Beiträge zusammengeführt, weil der Autor sich selbst geantwortet hat statt seinen letzten Beitrag zu ändern: 31.01.2016, 14:52:10

Zitat von: wneudeck am 29.01.2016, 16:32:48
Hallo,
ich würde es sowieso interessanter finden (aber das ist Geschmackssache), nicht den Temperaturwert zu einer genauen Uhrzeit sondern den Durchschnittswert des jeweiligen Tages zu vergleichen.

Hallo,

suche gerade nach einer Lösung, dies auch noch umzusetzen können, dazu benötige ich jedoch ein weiteres PHP-Script, denn in den log-Dateien wird bei mir nur die aktuelle Temperatur gespeichert (minütlich).
Jetzt muss ich ein Script haben, welches mir beim Aufrufen des Scriptes aus der Log-Datei die einzelnen Temperaturen seit 0 Uhr (des vergangenen Jahres) bis zur aktuellen Uhrzeit (des heutigen Tages im vergangenen Jahr) addiert und dann durch die Anzahl der Minuten (da jede Minute ein Temperaturwert gespeichert wurde) teilt und diesen Wert dann ausgibt, dann habe ich auch den Durchschnittswert und kann diesen anzeigen.

Falls dies zu viel Rechenarbeit wäre und somit die Laufzeit zu lang wird, könnte man statt jeden minütlichen Wert zu berücksichtigen, auch nur jeden Wert pro 10 Minuten berücksichtigen, somit wird die Rechenoption 10mal kürzer

Gruß frank

webworker

Zitat von: TheWeather am 28.01.2016, 18:03:12

Das ist nicht wirklich entscheidend, aber wenn's jemand weiß (webworker?), würde mich das generell interessieren (1 Jahr ist ja keine genau definierte Zeitangabe im Sinne eindeutig definierbarer Zeitabschnitte).

Gruß Hans

Hallo Hans, ich kann es Dir nicht genau sagen - soweit ich weiß arbeitet PHP intern mit den Sekunden des Timestamps. Vielleicht findest Du ja noch weitere Informationen zu den relativen Zahlenformaten und deren Behandlung in der PHP-Doku.


Ansonsten habe ich gerade noch eine Version an den Author des Thread gesendet, der die Durchschnittstemperatur vor einem Jahr versucht zu berücksichtigen -  ist allerdings nicht ausreichend getestet...
Freundliche Grüße

Rene

private Wetterstation Frohngau / Eifel
www.wetterstation-frohngau.de

Wetterfrosch1971

#36
dank webworker wird bei mir nun auch noch als Vergleichswert die Durchschnittstemperatur von vor einem Jahr mit der heutigen Durchschnittstemperatur verglichen/angezeigt, gugst du:

http://www.wetterstation-badenweiler.de/wetter/index.php

TheWeather

Hallo Rene,
Zitat von: webworker am 31.01.2016, 17:03:41
Hallo Hans, ich kann es Dir nicht genau sagen - soweit ich weiß arbeitet PHP intern mit den Sekunden des Timestamps.
Ich habe gerade mal probiert, die Thematik in C++ (Embarcadero) abzuarbeiten. Im Microsoft C++ gibt es eine Funktion zu DateTime, .AddYears(x) mit x = Integer + oder -, welche anscheinend ebenfalls alle Umstände berücksichtigt.

Bei der Klasse TDateTime im Embarcadero C++ gibt es kein entsprechendes Pendant, lediglich über Drittanbieter, welche dazu ebenfalls Units bereit stellen.

Um in der Klasse TDateTime zu einem zurückliegenden oder vorauseilenden Jahr gleichen Datums zu gelangen, braucht es wenigstens zwei Entscheidungen: Ist das Ausgangsdatum ein Schaltjahr (?) und liegt das Datum vor dem 01.03. des Jahres (?) oder danach.

Mit diesen Entscheidungen kann man mal 365 oder auch 366 Tage (Vorkommawert in TDateTime) addieren oder subtrahieren, je nachdem, ob das momentane Datum vor oder nach dem 01.03. eines Jahres liegt und ob das Ausgangsdatum ein Schaltjahr ist oder nicht. Je nachdem, ob es um ein oder mehrere Jahre (vor oder zurück geht) muss geprüft werden, ob ein Schaltjahr dazwischen liegt (2000 war ja bekanntlicherweise ein Schaltjahr, 1900 aber keins, also Regeln für Schaltjahre beachten). Mit all diesen Regeln kann man (bislang) auch 100te von Jahren addieren, allerdings nur wenige Jahrhunderte zurückrechnen, da es (ich meine es war 1563) mal ein Loch von 10 Tagen im Oktober gab, wo vom 06.10. direkt auf den 16.10. gesprungen werden musste, um irgendwelche Kalendarien anzugleichen.

Das Thema ist also schon interessant, für uns allerdings nicht mehr über Jahrhunderte zurück noch anwendbar, wenn ein Tool nicht Alles Dagewesene in der Zeitrechnung bereits berücksichtigt und die zukünftigen Entwicklungen natürlich noch nicht weiß. Es gibt also immer einen Wertebereich, der in einem Tool berücksichtigt sein müsste. Der hört nun aber nach unten nicht beim Jahr "0", Christi Geburt am 25.12.0000 auf (war das ein Dienstag oder ein Samstag) auf, sondern erst viel später im Mittelalter, seit dem unser "neues Datumssystem" etabliert werden konnte.

Erspart mir bitte weitere Recherchen und detaillierte Quellenangaben - mir ging's nur darum aufzuzeigen, mit welchen teils zwar detaillierten aber oft nur schwer zugänglichen Informationen bei Zeitumrechnungen zu rechnen ist. Kein Mensch kann mehr sagen, ob das Sauriersterben vor einigen Mio Jahren nun primär an einem Donnerstag oder einem Dienstag statt fand.

Dass morgen (heute ist der 01.02.) der 02.02. folgt, ist mittlerweile selbstredend. Ob am 01.03. diesen Jahres der vorangehende Tag der 29.02. oder der 28.02. war, lässt sich nur klären, wenn man weiß, ob dieses Jahr nun ein Schaltjahr ist.

PHP scheint das (für neuzeitliche Daten) tatsächlich im Griff zu haben - aber es gehört eine Menge Recherche dazu, hier wirklich Alles richtig zu machen, sobald es mal um Daten geht, die um Jahrhunderte zurückgreifen sollten. Nach oben hin ist noch Alles offen, aber auch da ist es vermutlich vermessen, jetzt schon zu bestimmen, ob der 24.12.2156 auf einen Donnerstag fällt oder doch eher auf einen Mittwoch, da weitere Korrekturen (die Erde dreht sich immer langsamer) bis dahin wohl zur Zeit noch nicht wirklich auf ihren Einfluss bezüglich des Datums erforscht sind.

Klingt vielleicht blöde oder auch utopisch, aber ich kenne keine Studien, inwieweit wir mit Schaltsekunden oder auch Schaltjahren im Bezug auf einige hundert Jahre in der Zukunft noch "up to date" sind.

Nichts Schlimmes, aber so ein paar Überlegungen dazu, dass Zeitumrechnungen immer fehlerbehaftet sein können, solange der Definitionsbereich nicht eindeutig in der heutigen Zeit liegt und der Wertebereich (das Ergebniss von Berechnungen) nicht eindeutig im Zeitrahmen definiert ist.

Da haben die Mayas wohl auch mal einen Strich gezogen, weswegen deren Kalender am 21.12.2012 endete. Keine Spur von Weltuntergang, aber immer noch die Erinnerung, "dass nichts bleibt, nichts bleibt, wie es war" - da waren die damals schon ziemlich schlau.

Das ist im Zusammenhang mit dem Thread vielleicht ziemlich "Off Topic", aber es gibt uns Allen gleichfalls das Recht, die Zeitrechnung nach eigenen Maßstäben zu interpretieren.

Es geht hier im Thread jedenfalls nur darum, einen knapp ein Jahr zurückliegenden Tag als Vergleich zu "heutigen" Verhältnissen zu zitieren und das ist so "voll in Odrdnung".

Gruß Hans
2xTFA Nexus, Sinus, Duo, EOS Max, Klima-Logger, Mebus TE923

Die Titanic wurde von Profis gebaut, die Arche Noah von einem Amateur. ...

GS63

Angespornt vom ursprünglichen Thema habe ich, glaube ich jedenfalls, eine Lösung für meine MySQL-Tabelle gefunden.

In der Tabelle ist das Datum mit Zeitanteil als datetime  (0000-00-00 00:00:00) abgespeichert.

Zunächst wird der Unix Timestamp vor einem Jahr im PHP-Skript ermittelt:

$lastyear = strtotime("-1 year");

Dann wird dieser Wert in das datetime-Format konvertiert:

$datuml = date("Y-m-d H:i:s", $lastyear);

Mit der Abfrage:

"SELECT tempout AS ljahrT   
FROM tabelle

WHERE datetime <= '$datuml'
ORDER BY datetime
DESC
Limit 1");

Es wird der Temperaturwert vor einem Jahr, dessen Datum inkl. Zeitanteil entweder gleich bzw. eine Speicherung vor dem ermittelten Datum liegt, ausgegeben.

wneudeck

Hallo,
wobei aber bei
Limit 1");
die Klammer verschwinden sollte, denke ich.