• 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,

hat Jemand eine Idee, wie ich aus der Wettersoftware Cumulus die aktuelle Tagestemperatur vor einem Jahr auf meinem Webspace ausgeben kann?

D.h. ich würde gerne neben der aktuellen Temperatur auch die Temperatur anzeigen, wie sie genau vor einem Jahr zu dieser Zeit war.

Man sagte mir, dass das irgendwie mit SQL gehen könnte, doch habe ich von SQL keine Ahnung.

hab diesbezüglich mal etwas gegoogelt und bin darauf gestoßen, kann ich mein Vorhaben ggf. damit umsetzen:
http://wiki.sandaysoft.com/a/ImportCumulusFile

oder vielleicht gibt es noch eine einfacherer Möglichkeit über PHP?
denn Cumulus liefert eine txt-Datei in der alle Messwerte gespeichert sind.
Jetzt müsste ich nur aus dieser txt-datei den entsprechenden wert auslesen, doch wie man das realisieren kann, weiß ich leider nicht, ich hänge hier mal einen Auszug dieser txt-Datei an:

22.01.15;20:25;1,2;98;0,9;2,5;5,0;46;0,0;0,0;1016,9;0,6;23,4;25;5,0;1,2;1,2;0;0;0,00;0,00;-1,1;0;0,0;45;0,0;0,0
22.01.15;20:26;1,4;98;1,1;4,4;7,2;82;0,0;0,0;1016,9;0,6;23,4;25;7,2;1,4;1,4;0;0;0,00;0,00;-1,3;0;0,0;90;0,0;0,0
22.01.15;20:27;1,2;98;0,9;5,2;7,2;67;0,0;0,0;1016,9;0,6;23,4;25;7,2;-0,3;1,2;0;0;0,00;0,00;-1,6;0;0,0;45;0,0;0,0
22.01.15;20:28;1,2;98;0,9;4,6;7,2;71;0,0;0,0;1016,9;0,6;23,4;25;6,1;1,2;1,2;0;0;0,00;0,00;-1,5;0;0,0;360;0,0;0,0


Der Wert den ich ausgeben möchte, ist der erste Wert nach dem Datum und der Uhrzeit, das ist die Temperatur.

Jetzt müsste ich wissen, wie ich in der txt-Datei auf die entsprechende Zeile zugreifen könnte und zwar abhängig von der aktuellen Uhrzeit müsste mein Script dann immer die entsprechende Zeile mit der entsprechenden Uhrzeit und dem Datum vor einem Jahr aufrufen und dort dann den ersten Zahlenwert ausgeben.

Ist so etwas möglich?


Kann mir hier vielleicht Jemand weiter helfen?

Danke für die Infos
Gruß Frank

gismoat

#1
Hallo,
bei mir ist es mitlerweile schon 5 Jahre her das ich Cumulus verwendet habe.
Damals habe ich meine Daten genau mit der Prozedur ins SQL bekommen.
Habe die Daten dann aus der Dayfile ausgelesen und ins SQL übertragen.
Das ging dann mit dem Link der im Wiki angegeben ist.
Zusätzlich hatte ich dann noch eine Webpage die, die Werte in einer Tabelle angezeigt hat.
Diese Tabelle konnte man dann nach seinen Bedürfnissen anpassen.
Die Tabelle habe ich damals von einem User der im Sandysoft Forum unterwegs war bekommen.
Such mal im Forum bei sandysoft ob es zu der Tabelle noch einen alten Beitrag gibt.

*UPDATE* Ich habe den Beitrag gefunden. Das war die historic.php
http://sandaysoft.com/forum/viewtopic.php?f=18&t=2373
http://sandaysoft.com/forum/viewtopic.php?f=18&t=2367

Der Autor von der historic.php ist "daj". Soweit ich gesehen habe ist der noch Aktiv und betreibt auch noch eine Wetter Seite. Vielleicht kannst du über ihn die benötigte Dateien beziehen.

Anbei noch ein Beispiel von einem User der die Tabelle verwendet.
http://weather.gktnet.com/history_php.php

Grüße
Werner
Wetterstation: Vantage Pro2 Aktiv, Auswertung: mit WsWin

Twitter: https://twitter.com/WetterThalgau

Facebook: http://facebook.com/ThalgauWetter

Wetterfrosch1971

Hallo,

vielen dank für deine Ausführungen, doch ich glaube das Unterfangen wird für mich etwas zu kompliziert, denn ich habe bezüglich SQL NULL Kenntnisse ;-(

Vielleicht geht es ja auch irgendwie einfacher, da ich ja keine komplette Tabelle benötige, ich will ja lediglich aus der txt.-Datei die Temperatur auslesen, die zum aktuellen Zeitpunkt vor einem Jahr herrschte, d.h. ich müsste irgendwie über das aktuelle Datum (minus 1 Jahr) sowie der aktuellen Uhrzeit in die entsprechende Zeile der txt.-Datei springen und dann aus dieser Zeile dann die Temperatur auslesen.

Gruß Frank

TheWeather

#3
Hallo Frank,

bevor Du die Flinte ins Korn wirfst, vielleicht noch eine kleine Anmerkung zu der Datenspeicherung in .txt- oder .csv-Dateien:

Diese Dateien verwenden keine feste Datensatzlänge, so dass man z.B. ab Anfang der Datei immer nur z.B. 138 Byte Offset addieren könnte, um auf den nächsten Datensatz zu gelangen.

Die Datensatzlänge hängt stets von den Formatierungen des Datums und auch der Größe der Messwerte ab. Wenn z.B. ein Temperatur von 1,2 (° C) auftritt, benötigt die 3 Byte zur Darstellung, ein Wert von 12,4 aber 4 Byte oder ein Wert von -10,8 5 Byte. Die Datensatzlänge variiert also mit den Daten und da kann man nicht wirklich indizieren, um genau den gewünschten Datensatz zu treffen.

Andererseits ist jeder Datensatz mit einem Lf (Linefeed, UNIX-typisch) oder der Zeichenkombination CrLf (CarriageReturn + Linefeed, DOS- oder Windows-typisch) abgeschlossen. Wenn man einen bestimmten Datensatz sucht, müsste man zeichenweise über die komplette Datei scannen, um das N-te Vorkommen der Schlusszeichen (Lf oder CrLf) zu finden und damit den Anfang des Datensatzes N+1 zu bestimmen. Mit intelligenten Suchkriterien ließe sich das zeitlich optimieren, indem man eine binäre Suche definiert (die den Suchbereich immer halbiert, um auf einen Treffer zu gelangen), aber dafür sind .txt- oder .csv-Dateien eher weniger gedacht - die lassen sich am Besten nur linear von vorne bis hinten abarbeiten, um die enthaltenen Daten in Tabellen oder Grafiken zu übertragen. Hier einen bestimmten Datensatz zu suchen, wird schnell zu einer komplexen Aufgabe, weil man ja nicht wie bei "fester Datensatzlänge" einfach mit einem Offset arbeiten kann, um auf den nächsten Datensatz zu gelangen.

Daneben stellt sich das Problem, dass Datumsformate (anscheinend in Cumulus einstellbar), unterschiedlich gestaltet sein können also z.B. YYYYMMDD oder auch DD.MM.YY(YY), die Zeit auch anstelle von hh:mm:ss als 9:38:00 am oder 9:38:00 pm in der Datei abgelegt sein könnten, was man bei einer Suche nach dem "richtigen" Datensatz zusätzlich berücksichtigen müsste.

Desweiteren wird angloamerikanisch mit dem "." als Dezimaltrenner gearbeitet, in Europa meist mit "," wobei ich nicht weiß, wie intelligent die Ablage in eine SQL-Datenbank damit umgeht. Die braucht eventuell den Dezimalpunkt "." bei zu übertragenden Werten und nicht das Dezimalkomma ",".

Direkt auf eine indizierte Zeile zu "springen", kannst Du bei .txt- oder .csv-Dateien getrost vergessen - da braucht's zusätzliche Feinarbeit, um einen gewünschten Eintrag in der Datei wirklich zu treffen und "einfach" auswerten zu können - kein Hexenwerk (in C++ wüsste ich, wie ich vorgehen müsste), aber bei PHP oder betreff der Anbindung an eine SQL-Datenbank muss ich einfach passen, weil ich davon keine Ahnung habe.

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

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

Wetterfrosch1971

Hallo Hans,

danke für deine ausführlicher Erklärung.

Ich will ja nicht gleich die Flinte ins Korn werfen, hab ja auch die anderen Dinge, was meine Homepage angeht, mit anfänglich NULL Ahnung, nur durch Hilfe von Forenkollegen und viel nachlesen im Internet geschafft.

Aber mein Vorhaben, was sich anfangs für mich so einfach anhörte, scheint doch wesentlich komplizierter als gedacht zu sein und ich glaube, dass sich wegen der Kleinigkeit, d.h. die Temperatur von vor einem Jahr anzuzeigen, der Aufwand nicht lohnt.
Wär eine nette kleine Spielerei gewesen, wenn man neben der aktuellen Temperatur auch immer noch die Temperatur von vor einem Jahr gesehen hätte, denn oftmals fragt man sich ja "wie war es heute noch mal vor einem Jahr?", doch wie gesagt, ich glaube da steht "Nutzen" und "Aufwand" in keiner Relation zu einander.

Gruß Frank

wneudeck

Hallo Frank.,
Zitatich glaube da steht "Nutzen" und "Aufwand" in keiner Relation zu einander.
So ist es. Ohne Kenntnisse von PHP wirst Du hier nichts erreichen und das eignet man sich nicht mal schnell so in 2 Wochen an.

Bernd aus Köln

Hallo Frank,
das ist mit PHP lösbar (ohne den Umweg über eine SQL-Datenbank).
Da ich nur sporadisch PHP nutze, habe ich die erforderlichen Befehle nicht alle parat.

Grundsätzlich müsste das so aussehen:
Das aktuelle Datum/Uhrzeit erfassen, 1 Jahr davon abziehen;
dabei müsste geklärt werden, wie mit dem 29.2. umgegangen wird.
Umwandeln in das Format, in dem es in der txt-Datei vorliegt, also bei dir "TT.MM.JJ;HH:MM".
Mit fopen die txt-Datei öffnen
In einer Schleife mit fgets die Zeilen einlesen
Die ersten 14 Zeichen jeder Zeile mit dem Datumstring vergleichen bis zum Treffer
Ist die Zeile gefunden, die Zeichen ab Pos. 16 bis vor dem nächsten Semikolon extrahieren
Das ist dann der gesuchte Wert.

WMR 200 & Meteohub auf Sheevaplug

Wetterfrosch1971

Hallo,

prinzipiell mal die Frage zur Abfrage mit PHP, ist diese Abfrage überhaupt realistisch?

Denn die Datenbank enthält für jede Minute einen Eintrag, d.h. wenn PHP dann die Datums und Uhrzeit durchsuchen muss, bis es an der richtigen Stelle angekommen ist, wäre wenn man die txt-Datenbänke monatlich durchsuchen würde, ja schon ein mega großer Suchdurchlauf.

Nehmen wir mal an es wäre der 31. eines Monats und es wäre 23:59 Uhr dann müssten insgesamt fast 45 000 Einträge durchlaufen werden bis man beim richtigen Eintrag ankommt (60 Einträge pro Stunde, das mal 24h und dann mal 31 Tage).

Gruß Frank

webworker

#8
Realistisch schon da Du ja den Wert von vor einem Jahr haben willst. Vielleicht ist das Durchsuchen der CSV aber nicht mehr performant genug - da gilt es letztlich zu experimentieren und Aufwand/Nutzen/Laufzeit zu prüfen. Mit einer SQL-DB wäre es sicher schneller, da man dort ganz andere Abfrage-Möglichkeiten hat.

Wenn Du es dennoch ausprobieren willst, hier mal ein möglicher Schnellansatz ohne Fehlerprüfungen etc.  - Gibt viele Wege zum Ziel  ;)


<?php  //Datum und Zeitangaben  date_default_timezone_set('Europe/Berlin');  $now  = time();  $past = strtotime(date('d-m-Y H:i', $now) . ' - 1 year');   // Cumulus-Textdatei einlesen  $lines = file('cumulus.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){      // Treffer gefunden       echo '<strong><font color="red">'.$datstamp.' -- Passt!</font></strong><br>';    }    else {      // Kein Treffer      echo $datstamp.' -- Passt nicht<br>';    }}?>



Ergänzung:
Ein kleiner Test auf meinem Server ergab eine Scriptlaufzeit im Schnitt von 0.3 Sekunden.
Als Grundlage habe ich eine Textdatei erzeugt, die für einen Monat minütliche Werte beinhaltet.
Freundliche Grüße

Rene

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

falk

Wenn das Parsen einer Textdatei zu langsam und die Installation einer relationalen Datenbank zu aufwändig ist, dann lohnt es sich im Allgemeinen SQLite3 in Betracht zu ziehen.