From f6c9b1c1f25a0d03a4c28710a866759107162adc Mon Sep 17 00:00:00 2001 From: Astro Date: Thu, 25 Mar 2021 17:17:57 +0100 Subject: [PATCH] luftqualitaet: init --- default.nix | 1 + luftqualitaet/scrape.rb | 63 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 luftqualitaet/scrape.rb diff --git a/default.nix b/default.nix index 13de19b..a75155c 100644 --- a/default.nix +++ b/default.nix @@ -25,6 +25,7 @@ let in { xerox = wrapScript "xerox" ./xerox/scrape.rb; luftdaten = wrapScript "luftdaten" ./luftdaten/scrape.rb; + luftqualitaet = wrapScript "luftqualitaet" ./luftqualitaet/scrape.rb; fhem = wrapScript "fhem" ./fhem/scrape.rb; matemat = wrapScript "matemat" ./matemat/scrape.rb; freifunk_node = wrapScript "freifunk_node" ./freifunk_node/scrape.rb; diff --git a/luftqualitaet/scrape.rb b/luftqualitaet/scrape.rb new file mode 100644 index 0000000..94974a8 --- /dev/null +++ b/luftqualitaet/scrape.rb @@ -0,0 +1,63 @@ +#!/usr/bin/env ruby +# coding: utf-8 + +require 'open-uri' +require 'csv' +require 'time' +require 'influxdb' + +TIME_PRECISION = 'h' + +station = ARGV[0] +unless station + puts "Missing station argument" + exit 1 +end + +def fmt_date d + d.strftime "%Y-%m-%d" +end +url = "https://www.umweltbundesamt.de/api/air_data/v2/airquality/csv?date_from=#{fmt_date(Date::today - 1)}&time_from=0&date_to=#{fmt_date Date::today}&time_to=24&station=#{station}&lang=de" + +puts "GET #{url}" +data = open(url).read().force_encoding("UTF-8") + +INDEX = { + "sehr gut" => 1, + "gut" => 2, + "mäßig" => 3, + "schlecht" => 4, + "sehr schlecht" => 5, +} + +points = [] +CSV::parse(data, headers: true, col_sep: ";").each do |data| + values = {} + station = nil + time = nil + data.each do |n, v| + n = n.dup.force_encoding "UTF-8" + case n + when /Stationscode/ + station = v + when /Datum/ + time = Time.strptime v, "'%d.%m.%Y %H:%M'" if v + when "Luftqualitätsindex" + values["Luftqualitätsindex"] = INDEX[v] if INDEX[v] + else + values[n] = v.to_f + end + end + + points.push({ + series: "umweltbundesamt", + tags: { + station: station, + }, + values: values, + timestamp: InfluxDB::convert_timestamp(time.to_i, TIME_PRECISION), + }) if time +end + +db = InfluxDB::Client.new(url: "http://grafana.serv.zentralwerk.dn42:8086/luftdaten") +db.write_points points, TIME_PRECISION