Ein JSON-Template für die Wettersoftware weewx

Seit einiger Zeit läuft bei mir eine Wetterstation gemeinsam mit einem Raspberry PI.

Zur Aufzeichnung und Anzeige der Daten kommt die Software weewx zum Einsatz.Die Software liest die Daten der Wetterstation, speichert sie in einer Datenbank und generiert HTML-Reports und Grafiken.

Da für bestimmte Ideen, wie z.B. das automatisches Twittern des Wetters (Siehe Twitter) das auslesen und parsen einer HTML-Datei etwas mühsam ist und auch der direkte Datenbank-Zugriff auf die weewx-Datenbank nicht so einfach ist, habe ich einen Skin erzeugt, der die Daten im JSON-Format erzeugt.


Auf dem Webserver läuft dann nur noch eine Webseite, die mit Hilfe von Javascript und jquery diese JSON-Dateien ausliest und anzeigt. Vom Raspberry PI werden nur noch die JSON-Dateien und die Grafiken mit den Kurven übertragen.

weewxjson
Das ganze hat nun zahlreiche Vorteile:

  • Es müssen wesentlich weniger Daten zum Server kopiert werden
  • Das Layout der Seite lässt sich Serverseitig ändern, ohne die weewx-skins anzufassen
  • Die Daten stehen strukturiert für andere Anwendungen zur Verfügung

Anstatt einer vollständigen HTML-Seite sehen die erzeugten Daten nun zum Beispiel so aus:

{
  "title":"Aktuelle Werte",
  "location":"Wedel, Germany",
  "time":"23.12.2014 23:30:00",
  "lat":"53° 34.14' N",
  "lon":"009° 42.72' E",
  "alt":"32 meters",
  "hardware":"VantagePro2",
  "uptime":"21 days, 13 hrs, 6 minutes",
  "serverUptime":"25 days, 2 hrs, 20 minutes",
  "weewxVersion":"2.7.0",
  "stats": {
    "current": {
      "outTemp":"9,0",
      "windchill":"6,8",
      "heatIndex":"9,0",
      "dewpoint":"8,2",
      "humidity":"95%",
      "insideHumidity":"56%",
      "barometer":"1009,2 hPa",
      "barometerTrendDelta":"3 hrs",
      "barometerTrendData":"-0,2 hPa",
      "windSpeed":"14 km/h",
      "windDir":"270°",
      "windDirText":"W",
      "windGust":"26 km/h",
      "windGustDir":"248°",
      "rainRate":"0,0 mm/hr",
      "insideTemp":"23,7"
    },
    "sinceMidnight": {
      "tempMaxValue":"10,1",
      "tempMaxTime":"00:01:24",
      "tempMinValue":"8,9",
      "tempMinTime":"14:14:12",
      "heatIndexMaxValue":"10,1",
      "heatIndexMaxTime":"00:01:24",
      "windchillMinValue":"4,6",
      "windchillMinTime":"11:16:59",
      "humidityMaxValue":"96%",
      "humidityMaxTime":"00:00:01",
      "humidityMinValue":"91%",
      "humidityMinTime":"16:47:02",
      "dewpointMaxValue":"9,4",
      "dewpointMaxTime":"00:01:24",
      "dewpointMinValue":"7,9",
      "dewpointMinTime":"14:45:46",
      "barometerMaxValue":"1009,7 hPa",
      "barometerMaxTime":"19:49:04",
      "barometerMinValue":"1007,7 hPa",
      "barometerMinTime":"01:01:02",
      "rainSum":"4,0 mm",
      "rainRateMaxValue":"1,4 mm/hr",
      "rainRateMaxTime":"19:18:00",
      "windMaxValue":"51 km/h",
      "windMaxGustDir":"270°",
      "windMaxTime":"11:16:59",
      "windAvg":"16 km/h",
      "windRms":"16 km/h",
      "windVecAvg":"16 km/h",
      "windVecDir":"269°",
       "inTempMaxValue":"25,1",
       "inTempMaxTime":"21:17:03",
       "inTempMinValue":"21,4",
       "inTempMinTime":"08:21:01"
    }
  },
  "almanach":{
    "sun":{
      "startCivilTwilight":"07:50:09",
      "sunrise":"08:35:47",
      "transit":"12:20:09",
      "sunset":"16:04:33",
      "endCivilTwilight":"16:50:12",
      "azimuth":"337.6°",
      "altitude":"-58.4°",
      "rightAscension":"272.2°",
      "declination":"-23.4°",
      "equinox":"20.03.2015 23:45:07",
      "solstice":"21.06.2015 18:38:03"
    },
    "moon":{
      "rise":"09:11:21",
      "transit":"13:42:15",
      "set":"18:18:28",
      "azimuth":"306.2°",
      "altitude":"-42.4°",
      "rightAscension":"298.0°",
      "declination":"-16.5°",
      "fullMoon":"05.01.2015 05:53:16",
      "newMoon":"20.01.2015 14:13:41",
      "phase":"Neumond",
      "fullness":"5%"
    }
  },
  "plots":{
    "tempdew":"daytempdew.png",
    "tempchill":"daytempchill.png",
    "rain":"dayrain.png",
    "wind":"daywind.png",
    "barometer":"daybarometer.png",
    "winddir":"daywinddir.png",
    "windvec":"daywindvec.png",
    "rx":"dayrx.png",
    "inside":"dayinside.png"
  }
}

In Aktion kann man das ganze unter der folgenden Adresse finden:
www.elbebilder.de/wetter

Die Skin-Dateien sind auf Github unter
https://github.com/lnitram/pi-weather/tree/master/weewx-skins/json zu finden. Achtung: Die skin.conf enthält nur die geänderten Zeilen in Bezug auf die Originaldatei. Also diese bitte nicht einfach überschreiben, sondern nur die entsprechenden Änderungen eintragen.

7 Gedanken zu „Ein JSON-Template für die Wettersoftware weewx

  1. Bernhard

    Echt eine tolle Sache! Kann man auch irgendwo die Sourcefiles und Javascripts von der Wetterseite (www.elbebilder.de/wetter) runterladen? Wäre für jede Hilfe dankbar, komme leider mit der Einbindung der JSON-Daten in (m)eine HTML Seite nicht zurecht… 🙁

    LG,
    Bernhard

    Antworten
    1. martin Beitragsautor

      Hallo Bernhard,

      Den Quellcode mit allen Komponenten als Download gibt es so nicht. Natürlich kannst Du Dir den Quellcode meiner Seite anschauen, und die Teile, die Du benötigst, übernehmen. Vielleicht helfen Dir ja ein paar Sätze mit einer Beschreibung, wie ich das gemacht habe:

      Die Webseite ist aus mehreren Komponenten zusammengestzt. Für das Layout benutze ich Bootstrap. Zum Abruf der JSON-Dateien und Umwandeln in HTML benutze ich jQuery. Für die Wetterinstrumente benutze ich eine selbstgeschriebene Java-Script-Bibliothek, die auf snap.svg aufbaut. Das Projekt ist auf github unter https://github.com/lnitram/weather-instruments zu finden.

      Die JSON-Daten lassen sich mit jQuery dann sehr einfach abrufen:

      jQuery.get('/data/data.json', function(data) {
      $("#headline").html(data.title + "- Stand: " + data.time);
      });

      Dieses Beispiel lädt die Datei /data/data.json und schreibt in das HTML-Tag mit der id „headline“ (z.B.: <h1 id=“headline“></h1>) den Titel und das Datum und die Uhrzeit der Datenerzeugung, die im json stehen.

      Ansonsten wäre es vielleicht gut, wenn Du ein paar konkrete Fragen stellst und einen Link zu Deiner Seite dazu schreibst. Dann kann ich vielleicht gezielt helfen, wo es hakt.

      Antworten
  2. Bernhard

    Hi!

    Irgendwie bin ich zu dumm dafür… 🙁

    Mein HTML-File sieht jetzt so aus:

    jQuery Beispiel: einbinden und erster Befehl

    jQuery.get(‚/data/data.json‘, function(data) {
    $(„#headline“).html(data.title + „- Stand: “ + data.time);
    });

    Mein data.json sieht so aus:

    {
    „title“:“Aktuelle Werte“,
    „location“:“xxxx, Austria“,
    „time“:“02/15/15 12:39:31″,
    „lat“:“xxx N“,
    „lon“:“xxx E“,
    „alt“:“1234 feet“,
    „hardware“:“LaCrosse WS-2300″,
    „uptime“:“0 days, 2 hours, 23 minutes“,
    „serverUptime“:“0 days, 0 hours, 54 minutes“,
    „weewxVersion“:“3.1.0″,
    „stats“: {
    „current“: {
    „outTemp“:“49.3F“,
    „windchill“:“49.3F“,
    .
    .
    .
    „rainRate“:“0.00 in/hr“,
    „insideTemp“:“75.0F“
    },
    „sinceMidnight“: {
    „tempMaxValue“:“54.9F“,
    „tempMaxTime“:“12:01:51″,
    .
    .
    .
    „inTempMaxTime“:“12:39:05″,
    „inTempMinValue“:“72.0F“,
    „inTempMinTime“:“08:24:51″
    }
    },
    „almanach“:{
    „sun“:{
    „sunrise“:“07:12″,
    „sunset“:“17:26″,
    },
    „moon“:{
    „phase“:“Waning crescent“,
    „fullness“:“16%“
    }
    }
    }

    Ich bekomme einfach keine Daten aus dem .json-File raus. Entweder ist mein .json-File falsch formatiert oder mein HTML-File mit Javascript falsch. Ich wäre dir total dankbar, wenn du mir einen Beispiel Quellcode zur Verfügung stellen könntest, wo ich sehe wie ein Wert aus dem JSON-File einfach im HTML-File ausgegeben wird.

    Danke und LG,
    Bernhard

    Antworten
    1. martin Beitragsautor

      Moin, es würde wirklich helfen, wenn man mal eine Seite hätte, auf der sich der Fehler nachvollziehen ließe. So ist das leider ein ziemliches Stochern im Nebel.

      Für Firefox gibt es eine Web-Developer-Toolbar. Wenn die installiert wird, werden Javascript-Fehler angezeigt. Ähnliches gibt es auch für Chrome.

      Hier kannst Du JSON validieren lassen:
      http://jsonlint.com/

      Vielleicht ist in meinem JSON-Template auch noch ein fehler. Ich habe es nicht 1:1 bei Github, da ich noch ein paar weitere Anpassungen habe.

      Ansonsten, sag doch mal, wo man sich Deinen Versuchsaufbau angucken kann. Ich denke, dann könnte man dir in kurzer Zeit sagen, wo der Fehler ist.

      Viele Grüße

      Martin

      Antworten
      1. Bernhard

        Hallo Martin!

        Danke für deine Antwort(en), hatte in den letzten Tagen leider wenig Zeit zum probieren…
        Also, es war das JSON-File nicht ganz OK, hab das aber hingekriegt. Lokal kann ich das ganze jetzt weiterverarbeiten.
        Jetzt hab ich aber das nächste Problem, dass ich 2 verschiedene Geräte im Netzwerk habe, die JSON Daten „senden“ (Wetterstation und Wechselrichter) und ich diese aber nicht abfragen kann, von wegen Cross Domain Abfragen mit Javascript.
        Ich kann leider keine vernünftigen Files zur Verfügung stellen, da das ganze nur „hausintern“ auf einem Webserver auf der SPS für die Jalousiensteuerung läuft.

        Jedenfalls herzlichen Dank für deine Hilfe, es hat mir auf jeden Fall bereits weiter geholfen!

        Gruß,
        Bernhard

        Antworten
  3. Pingback: Raspi Wetterstation mit Davis Hardware – Wichtig für mich!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.