fhem / uba

UBA - Umweltbundesamt Module for FHEM [GITHUB ONLY PROJECT]
GNU General Public License v2.0
1 stars 1 forks source link

Neue UBA Api verwenden #4

Closed florian-asche closed 4 years ago

florian-asche commented 5 years ago

Leider ist die alte API nicht mehr verfügbar. Dass Module muss angepasst werden.

http://www.umweltbundesamt.de/js/uaq/data/stations/measuring?pollutant[]=SO2&scope[]=1SMW&station[]=DERP020&group[]=pollutant&range[]=1569871800,1569956400 https://www.umweltbundesamt.de/api/air_data/v2/airquality/json?date_from=2019-10-11&time_from=10&date_to=2019-10-11&time_to=10&lang=de https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet/eJzrWJSSuMrIwNBS19BA19BwUUnmIiCZl7pgUXHJEkNDI6PFKW5FcAUGJotTQvKR1edWsS3KTW5anJNYctrBc9WcUp8tdotz8tJPO6hc3MDAwMAIAJ1lIwg= https://www.umweltbundesamt.de/api/air_data/v2/airquality/json?date_from=2019-10-03&time_from=24&date_to=2019-10-11&time_to=24&station=1122&lang=de https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet/eJzrWJSSuMrIwNBS19BA19BwUUnmIiCZl7pgUXHJEkNDI6PFKW5FEAUGhkC0OCUkH1l9bhXbotzkpsU5iSWnHTxXBVbnnj67OCcv_bSDypUGBgYGRgCiSyNa

Stationen: https://www.umweltbundesamt.de/api/air_data/v2/stations/json?use=airquality&lang=de&date_from=2019-01-01&time_from=1&date_to=2019-12-31&time_to=24

Download: https://www.umweltbundesamt.de/api/air_data/v2/airquality/csv?date_from=2019-10-03&time_from=24&date_to=2019-10-11&time_to=24&station=1122&lang=de

Stationscode;Datum;"Feinstaub (PM₁₀) stündlich gleitendes Tagesmittel in µg/m³";"Ozon (O₃) Ein-Stunden-Mittelwert in µg/m³";"Stickstoffdioxid (NO₂) Ein-Stunden-Mittelwert in µg/m³";Luftqualitätsindex DENW067;"'04.10.2019 01:00'";10;22;20;"sehr gut" DENW067;"'04.10.2019 02:00'";10;17;22;gut DENW067;"'04.10.2019 03:00'";11;15;22;gut DENW067;"'04.10.2019 21:00'";11;29;23;gut DENW067;"'04.10.2019 22:00'";11;23;26;gut DENW067;"'04.10.2019 23:00'";10;33;-;"sehr gut" DENW067;"'04.10.2019 24:00'";9;-;18;"sehr gut" DENW067;"'05.10.2019 01:00'";8;44;11;"sehr gut" DENW067;"'05.10.2019 02:00'";8;-;-;"sehr gut" DENW067;"'05.10.2019 03:00'";6;51;5;"sehr gut" DENW067;"'05.10.2019 04:00'";6;48;7;"sehr gut"

Warnlimits: https://www.umweltbundesamt.de/berechnungsgrundlagen-luftqualitaetsindex

florian-asche commented 4 years ago

Von Markus M. aus dem Forum:

sub uba_GetStations($) {
  my ($hash) = @_;
  my $name = $hash->{NAME};

  my $dateymd = strftime("%Y-%m-%d", localtime());
  my($err,$data) = HttpUtils_BlockingGet({
  url => 'https://www.umweltbundesamt.de/api/air_data/v2/meta/json?use=airquality&date_from='.$dateymd.'&date_to='.$dateymd.'&time_from=1&time_to=24',
  noshutdown => 1,
  timeout => 20,
  });
  return $err if($err);

  my $json = eval { JSON->new->utf8(0)->decode($data) };
  if($@)
  {
    Log3 $name, 2, "$name: json evaluation error ".$@;
    return $@;
  }

  my @stations = ();
  foreach my $stationnumber ( keys (%{$json->{stations}})){
    my $station;
    $station->{number} = $json->{stations}->{$stationnumber}[0];
    $station->{id} = $json->{stations}->{$stationnumber}[1];
    $station->{name} = encode_utf8($json->{stations}->{$stationnumber}[2]);
    $station->{city} = $json->{stations}->{$stationnumber}[3];
    $station->{type} = $json->{stations}->{$stationnumber}[15].' '.$json->{stations}->{$stationnumber}[16];
    push( @stations, $station );
  }
  my $ret = '';
  @stations = sort { $a->{number} <=> $b->{number} } @stations;
  foreach my $station (@stations){
    $ret .= $station->{id}."\t<b>-> ".$station->{number}." <-</b>\t".$station->{name}." (".$station->{type}.")\n"
  }
  return $ret;
}

Aber die API ist echt träge.

florian-asche commented 4 years ago

Beispieltest der neuen API: Es werden die Daten von einem Tag mit dem Zeitraum von nur einer Stunde abgefragt: https://www.umweltbundesamt.de/api/air_data/v2/meta/json?use=airquality&date_from=2020-01-17&date_to=2020-01-17&time_from=11&time_to=12

Die Abfrage hat 30 Sekunden gedauert.

florian-asche commented 4 years ago

Über die CSV Schnittstelle:

 use Text::CSV_XS qw( csv );
    use Text::CSV_XS;

   # create memory mapped file form received data and parse as CSV

    my $csv = Text::CSV_XS->new({ sep_char => ';' });
    if (!defined($csv)) {
      Log3 $name, 2, "error creating CSV parser: ".Text::CSV_XS->error_diag();
    }
    #open my $fileHandle, '<', \$data;
    open my $fileHandle, "<:encoding(utf8)", \$data or Log3 $name, 2, "$name: fileHandle open error";

    # parse file content
    my @columnNames = @{$csv->getline($fileHandle)};
    if (!@columnNames) {
      Log3 $name, 2, "error parsing header line";
    }

    foreach my $columnName (@columnNames) {
      Log3 $name, 2, "$name: Processing cn: $columnName";
    }

    $csv->column_names(@columnNames);
    my @aoh;
   while (my $row = $csv->getline ($fileHandle)) {
      #Log3 $name, 2, "$name: Processing r: $row";
      Log3 $name, 2, "$name: Processing r: $row->[0]";
      push(@aoh, $row);
    }

    # abort if no data
    if (scalar(@aoh) == 0) {
      Log3 $name, 2, "file does not contain valid data";
    }

    #Log3 $name, 2, "$name: Processing data: ".join("\n",@aoh)."\n";
florian-asche commented 4 years ago

Gerade eine Fehlermeldung mit "Varnish cache server" gesehen. Das lässt schon mal an bisschen Aufschluss, was da vor dem Webserver steht...

florian-asche commented 4 years ago

done with b454c674319b66cf5a7b52097e4e6a01412dde04