Mercurial > hg > egg-tcls
annotate fetch_weather.pl @ 405:26c613434971
fetch_weather: Better check for 'force' commandline parameter.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 06 Jan 2017 21:20:52 +0200 |
parents | 32be5d1dca29 |
children | 4c3abf052d01 |
rev | line source |
---|---|
381 | 1 #!/usr/bin/perl -w |
182 | 2 ########################################################################## |
3 # | |
385
4244e30530a2
fetch_weather: Bump copyright and version.
Matti Hamalainen <ccr@tnsp.org>
parents:
384
diff
changeset
|
4 # Fetch Weather v0.7 by Matti 'ccr' Hamalainen <ccr@tnsp.org> |
4244e30530a2
fetch_weather: Bump copyright and version.
Matti Hamalainen <ccr@tnsp.org>
parents:
384
diff
changeset
|
5 # (C) Copyright 2014-2016 Tecnic Software productions (TNSP) |
206 | 6 # This script is freely distributable under GNU GPL (version 2) license. |
182 | 7 # |
8 # Should be ran as a cronjob, and configured properly. | |
206 | 9 # */10 * * * * perl -w /absolute/path/to/fetch_weather.pl /path/to/configfile |
182 | 10 # |
186
b41c525bdaf7
Add example configuration file.
Matti Hamalainen <ccr@tnsp.org>
parents:
185
diff
changeset
|
11 # Configuration file example is in fetch_weather.config |
182 | 12 # |
206 | 13 # Requires various Perl modules, in Debian the packages should be: |
14 # libwww-perl libxml-simple-perl libtimedate-perl | |
15 # | |
182 | 16 # |
17 ########################################################################## | |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
18 use strict; |
380
729eb88d1c63
fetch_weather: "use warnings".
Matti Hamalainen <ccr@tnsp.org>
parents:
379
diff
changeset
|
19 use warnings; |
243 | 20 use utf8; |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
21 use LWP::UserAgent; |
399
a80de0130e45
fetch_weather: Support gzip encoded content in HTTP requests.
Matti Hamalainen <ccr@tnsp.org>
parents:
398
diff
changeset
|
22 use HTTP::Message; |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
23 use HTML::Entities; |
399
a80de0130e45
fetch_weather: Support gzip encoded content in HTTP requests.
Matti Hamalainen <ccr@tnsp.org>
parents:
398
diff
changeset
|
24 use Compress::Zlib; |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
25 use XML::Simple; |
189 | 26 use Date::Format; |
199
95012f8f687a
Another round of timestamp parsing changes, urgh.
Matti Hamalainen <ccr@tnsp.org>
parents:
198
diff
changeset
|
27 use Date::Parse; |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
28 use Data::Dumper; |
402
eaf56c84dc8c
fetch_weather: Use File::Slurper instead of old and somewhat broken File::Slurp.
Matti Hamalainen <ccr@tnsp.org>
parents:
401
diff
changeset
|
29 use File::Slurper qw(read_text write_text); |
403
282e9d9ddb99
fetch_weather: Oops, accidentally removed "use Text::CSV"!
Matti Hamalainen <ccr@tnsp.org>
parents:
402
diff
changeset
|
30 use Text::CSV; |
166 | 31 |
400 | 32 |
162
4f8a163b2bc1
Work on the backend weather data fetching.
Matti Hamalainen <ccr@tnsp.org>
parents:
158
diff
changeset
|
33 ### |
182 | 34 ### Configuration settings |
162
4f8a163b2bc1
Work on the backend weather data fetching.
Matti Hamalainen <ccr@tnsp.org>
parents:
158
diff
changeset
|
35 ### |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
36 my %settings = ( |
166 | 37 "debug" => 0, |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
38 "opt_fmi" => 0, |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
39 "opt_tiehallinto" => 0, |
374
26b7963e7fbd
fetch_weather: Oops, forgot to define the configuration setting
Matti Hamalainen <ccr@tnsp.org>
parents:
373
diff
changeset
|
40 "purge_threshold" => 60, |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
41 "fmi_api_key" => "", |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
42 "outfile" => "", |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
43 "tiehallinto_static_meta" => "tiehallinto.meta", |
185
64e06ee172c7
Add HTTP user agent setting.
Matti Hamalainen <ccr@tnsp.org>
parents:
182
diff
changeset
|
44 "http_user_agent" => "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 6.0) Opera 10.63 [en]", |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
45 ); |
162
4f8a163b2bc1
Work on the backend weather data fetching.
Matti Hamalainen <ccr@tnsp.org>
parents:
158
diff
changeset
|
46 |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
47 |
162
4f8a163b2bc1
Work on the backend weather data fetching.
Matti Hamalainen <ccr@tnsp.org>
parents:
158
diff
changeset
|
48 ### |
4f8a163b2bc1
Work on the backend weather data fetching.
Matti Hamalainen <ccr@tnsp.org>
parents:
158
diff
changeset
|
49 ### Helper functions |
4f8a163b2bc1
Work on the backend weather data fetching.
Matti Hamalainen <ccr@tnsp.org>
parents:
158
diff
changeset
|
50 ### |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
51 sub mlog($) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
52 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
53 print STDERR $_[0]; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
54 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
55 |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
56 |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
57 sub fetch_http($) |
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
58 { |
198 | 59 my $agent = LWP::UserAgent->new; |
60 $agent->agent($settings{"http_user_agent"}); | |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
61 $agent->timeout(20); |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
62 |
198 | 63 my $req = HTTP::Request->new(GET => $_[0]); |
399
a80de0130e45
fetch_weather: Support gzip encoded content in HTTP requests.
Matti Hamalainen <ccr@tnsp.org>
parents:
398
diff
changeset
|
64 $req->header('Accept-Encoding' => scalar HTTP::Message::decodable()); |
339 | 65 |
198 | 66 return $agent->request($req); |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
67 } |
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
68 |
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
69 |
382
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
70 sub str_trim($) |
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
71 { |
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
72 my $tmp = $_[0]; |
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
73 $tmp =~ s/^\s*//; |
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
74 $tmp =~ s/\s*$//; |
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
75 return $tmp; |
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
76 } |
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
77 |
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
78 |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
79 sub parse_timestamp($$) |
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
80 { |
196
a38c123921a9
Change the timestamp parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
195
diff
changeset
|
81 my ($str, $offs) = @_; |
a38c123921a9
Change the timestamp parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
195
diff
changeset
|
82 if ($str =~ /^(\d+):(\d+)$/) |
a38c123921a9
Change the timestamp parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
195
diff
changeset
|
83 { |
a38c123921a9
Change the timestamp parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
195
diff
changeset
|
84 return $offs + (60 * 60 * $1) + ($2 * 60); |
a38c123921a9
Change the timestamp parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
195
diff
changeset
|
85 } |
a38c123921a9
Change the timestamp parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
195
diff
changeset
|
86 else |
a38c123921a9
Change the timestamp parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
195
diff
changeset
|
87 { |
a38c123921a9
Change the timestamp parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
195
diff
changeset
|
88 return $offs; |
a38c123921a9
Change the timestamp parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
195
diff
changeset
|
89 } |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
90 } |
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
91 |
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
92 |
194 | 93 sub format_time_gmt($) |
189 | 94 { |
95 # 2012-02-27T00:00:00Z | |
199
95012f8f687a
Another round of timestamp parsing changes, urgh.
Matti Hamalainen <ccr@tnsp.org>
parents:
198
diff
changeset
|
96 return time2str("%Y-%m-%dT%TZ", $_[0], "UTC"); |
189 | 97 } |
98 | |
193 | 99 |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
100 ### |
331
b8ae5e99341b
fetc_weather: Remove support for old HTML format parsing of Tiehallinto data, it's not provided in this format anymore.
Matti Hamalainen <ccr@tnsp.org>
parents:
325
diff
changeset
|
101 ### Helper functions |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
102 ### |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
103 |
212
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
104 my %th_rain_states = |
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
105 ( |
237 | 106 "Pouta" => "poutaa", |
107 "Heikko" => "heikkoa sadetta", | |
108 "Kohtalainen" => "kohtalaista sadetta", | |
109 "Voimakas" => "voimakasta sadetta", | |
212
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
110 ); |
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
111 |
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
112 my $th_rain_states_k = join("|", map {quotemeta} sort { length($b)<=>length($a) } keys %th_rain_states); |
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
113 |
242 | 114 sub translate_rain($) |
212
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
115 { |
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
116 my $tmp = $_[0]; |
237 | 117 $tmp =~ s/($th_rain_states_k)/$th_rain_states{$1}/igo; |
212
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
118 return $tmp; |
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
119 } |
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
120 |
331
b8ae5e99341b
fetc_weather: Remove support for old HTML format parsing of Tiehallinto data, it's not provided in this format anymore.
Matti Hamalainen <ccr@tnsp.org>
parents:
325
diff
changeset
|
121 |
244 | 122 my %th_cloud_states = |
123 ( | |
124 0 => "selkeää", | |
247
85ad2912e720
Possibly handle cloudyness translation better.
Matti Hamalainen <ccr@tnsp.org>
parents:
245
diff
changeset
|
125 1 => "melkein selkeää", |
85ad2912e720
Possibly handle cloudyness translation better.
Matti Hamalainen <ccr@tnsp.org>
parents:
245
diff
changeset
|
126 2 => "verrattain selkeää", |
85ad2912e720
Possibly handle cloudyness translation better.
Matti Hamalainen <ccr@tnsp.org>
parents:
245
diff
changeset
|
127 3 => "verrattain selkeää", |
85ad2912e720
Possibly handle cloudyness translation better.
Matti Hamalainen <ccr@tnsp.org>
parents:
245
diff
changeset
|
128 4 => "puolipilvistä", |
85ad2912e720
Possibly handle cloudyness translation better.
Matti Hamalainen <ccr@tnsp.org>
parents:
245
diff
changeset
|
129 5 => "verrattain pilvistä", |
85ad2912e720
Possibly handle cloudyness translation better.
Matti Hamalainen <ccr@tnsp.org>
parents:
245
diff
changeset
|
130 6 => "verrattain pilvistä", |
244 | 131 7 => "melkein pilvistä", |
132 8 => "pilvistä", | |
133 ); | |
134 | |
135 sub translate_clouds($) | |
136 { | |
247
85ad2912e720
Possibly handle cloudyness translation better.
Matti Hamalainen <ccr@tnsp.org>
parents:
245
diff
changeset
|
137 return "" if ($_[0] eq "NaN" || $_[0] eq ""); |
85ad2912e720
Possibly handle cloudyness translation better.
Matti Hamalainen <ccr@tnsp.org>
parents:
245
diff
changeset
|
138 my $tmp = int($_[0]); |
244 | 139 foreach my $n (sort { $a <=> $b } keys %th_cloud_states) |
140 { | |
247
85ad2912e720
Possibly handle cloudyness translation better.
Matti Hamalainen <ccr@tnsp.org>
parents:
245
diff
changeset
|
141 return $th_cloud_states{$n}." (".$n."/8)" if ($tmp == $n); |
244 | 142 } |
143 return $tmp; | |
144 } | |
145 | |
212
5f04ec60e8d9
weather: "Translate" rain state from Tiehallitus data.
Matti Hamalainen <ccr@tnsp.org>
parents:
208
diff
changeset
|
146 |
228 | 147 sub plonk_data($) |
148 { | |
149 return defined($_[0]) ? $_[0] : ""; | |
150 } | |
151 | |
152 | |
237 | 153 sub plonk_data_lc($) |
154 { | |
155 return defined($_[0]) ? lc($_[0]) : ""; | |
156 } | |
157 | |
158 | |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
159 ### |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
160 ### Configuration handling |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
161 ### |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
162 sub opt_chk_bool($) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
163 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
164 if (defined($settings{$_[0]})) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
165 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
166 my $val = $settings{$_[0]}; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
167 return ($val == 1 || $val eq "true" || $val eq "on" || $val eq "1"); |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
168 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
169 else |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
170 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
171 return 0; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
172 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
173 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
174 |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
175 |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
176 sub opt_chk_valid($$) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
177 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
178 if (defined($settings{$_[0]})) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
179 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
180 my $val = $settings{$_[0]}; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
181 return length($val) >= $_[1]; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
182 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
183 else |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
184 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
185 return 0; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
186 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
187 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
188 |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
189 |
324
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
190 sub opt_get_int($) |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
191 { |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
192 if (defined($settings{$_[0]})) |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
193 { |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
194 return int($settings{$_[0]}); |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
195 } |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
196 else |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
197 { |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
198 return -1; |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
199 } |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
200 } |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
201 |
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
202 |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
203 sub opt_get($) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
204 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
205 if (defined($settings{$_[0]})) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
206 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
207 return $settings{$_[0]}; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
208 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
209 else |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
210 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
211 return undef; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
212 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
213 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
214 |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
215 |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
216 sub opt_read_config($) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
217 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
218 my $filename = $_[0]; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
219 my $errors = 0; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
220 my $line = 0; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
221 |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
222 open(CONFFILE, "<", $filename) or die("Could not open configuration '".$filename."'!\n"); |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
223 while (<CONFFILE>) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
224 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
225 $line++; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
226 chomp; |
353 | 227 if (/(^\s*#|^\s*$)/) |
228 { | |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
229 # Ignore comments and empty lines |
353 | 230 } |
386 | 231 elsif (/^\s*\"?([a-zA-Z0-9_]+)\"?\s*=>?\s*(\d+),?\s*$/) |
232 { | |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
233 my $key = lc($1); |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
234 my $value = $2; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
235 if (defined($settings{$key})) { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
236 $settings{$key} = $value; |
353 | 237 } |
238 else | |
239 { | |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
240 mlog("[$filename:$line] Unknown setting '$key' = $value\n"); |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
241 $errors = 1; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
242 } |
353 | 243 } |
386 | 244 elsif (/^\s*\"?([a-zA-Z0-9_]+)\"?\s*=>?\s*\"(.*?)\",?\s*$/) |
245 { | |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
246 my $key = lc($1); |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
247 my $value = $2; |
353 | 248 if (defined($settings{$key})) |
249 { | |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
250 $settings{$key} = $value; |
353 | 251 } |
252 else | |
253 { | |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
254 mlog("[$filename:$line] Unknown setting '$key' = '$value'\n"); |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
255 $errors = 1; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
256 } |
353 | 257 } |
258 else | |
259 { | |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
260 mlog("[$filename:$line] Syntax error: $_\n"); |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
261 $errors = 1; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
262 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
263 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
264 close(CONFFILE); |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
265 return $errors; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
266 } |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
267 |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
268 |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
269 ### |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
270 ### Main program begins |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
271 ### |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
272 my $weatherdata = {}; |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
273 |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
274 die( |
385
4244e30530a2
fetch_weather: Bump copyright and version.
Matti Hamalainen <ccr@tnsp.org>
parents:
384
diff
changeset
|
275 "Weather Fetch v0.7 by ccr/TNSP <ccr\@tnsp.org>\n". |
404
32be5d1dca29
fetch_weather: Add commandline option for forcing update of static metadata caches.
Matti Hamalainen <ccr@tnsp.org>
parents:
403
diff
changeset
|
276 "Usage: $0 <config file> [force]\n" |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
277 ) unless scalar(@ARGV) >= 1; |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
278 |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
279 my $cfgfile = shift; |
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
280 opt_read_config($cfgfile) == 0 or die("Errors while parsing configuration file '".$cfgfile."'.\n"); |
405
26c613434971
fetch_weather: Better check for 'force' commandline parameter.
Matti Hamalainen <ccr@tnsp.org>
parents:
404
diff
changeset
|
281 my $force_update = scalar(@ARGV) >= 1 && (shift eq "force"); |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
282 |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
283 |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
284 ### |
354
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
285 ### Load already cached data |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
286 ### |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
287 if (opt_chk_valid("outfile", 1)) |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
288 { |
402
eaf56c84dc8c
fetch_weather: Use File::Slurper instead of old and somewhat broken File::Slurp.
Matti Hamalainen <ccr@tnsp.org>
parents:
401
diff
changeset
|
289 my $str = read_text(opt_get("outfile")); |
354
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
290 if (defined($str)) |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
291 { |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
292 foreach my $line (split(/\s*\n\s*/, $str)) |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
293 { |
367
1ca8ae195077
fetch_weather: Fix parsing of old/cached datafile.
Matti Hamalainen <ccr@tnsp.org>
parents:
363
diff
changeset
|
294 my @mtmp = split(/\|/, $line, -1); |
356
0de6e0c2c89c
fetch_weather: Adjust minimum acceptable recached entry array size.
Matti Hamalainen <ccr@tnsp.org>
parents:
355
diff
changeset
|
295 if (scalar(\@mtmp) >= 3) |
354
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
296 { |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
297 $weatherdata->{shift @mtmp} = \@mtmp; |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
298 } |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
299 } |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
300 print STDERR scalar(keys %$weatherdata)." old records reloaded.\n" if (opt_get_int("debug") > 0); |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
301 } |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
302 } |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
303 |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
304 |
de411e7834aa
fetch_weather: Reload old data from stored data.
Matti Hamalainen <ccr@tnsp.org>
parents:
353
diff
changeset
|
305 ### |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
306 ### Fetch Tiehallinto data |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
307 ### |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
308 if (opt_chk_bool("opt_tiehallinto")) |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
309 { |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
310 my $uri = "http://tie.digitraffic.fi/sujuvuus/ws/roadWeather"; |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
311 my $res = fetch_http($uri); |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
312 if ($res->code >= 200 && $res->code <= 201) |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
313 { |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
314 my $xml = XMLin($res->decoded_content); |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
315 |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
316 if (!defined($xml->{"soap:Body"}) || !defined($xml->{"soap:Body"}{"RoadWeatherResponse"})) |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
317 { |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
318 print STDERR "ERROR: SOAP call result did not contain required data.\n"; |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
319 print STDERR $res->decoded_content."\n\n"; |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
320 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
321 else |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
322 { |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
323 my $data = $xml->{"soap:Body"}{"RoadWeatherResponse"}; |
349
f7793ef7c925
fetch_weather: Improve debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
343
diff
changeset
|
324 print STDERR "Checking Tiehallinto response from ".$uri."\n" if (opt_get_int("debug") > 0); |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
325 |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
326 # Check if we need to update the static meta data |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
327 my $meta_file = opt_get("tiehallinto_static_meta"); |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
328 my $fetch_meta = (-e $meta_file) ? 0 : 1; |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
329 |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
330 if (defined($data->{"laststaticdataupdate"})) |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
331 { |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
332 # Compare metadata cache file modification timestamp to info in XML |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
333 my $tmp1 = str2time($data->{"laststaticdataupdate"}); |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
334 my $tmp2 = (-e $meta_file) ? (stat($meta_file))[9] : -1; |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
335 $fetch_meta = 1 unless ($tmp1 < $tmp2); |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
336 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
337 |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
338 # Fetch or read the cache |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
339 my $meta_str; |
404
32be5d1dca29
fetch_weather: Add commandline option for forcing update of static metadata caches.
Matti Hamalainen <ccr@tnsp.org>
parents:
403
diff
changeset
|
340 if ($fetch_meta || $force_update) |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
341 { |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
342 print STDERR "Fetching Tiehallinto static meta data.\n" if (opt_get_int("debug") > 0); |
377
0a6d9f0f0a57
fetch_weather: Fix Tiehallinto metadata handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
375
diff
changeset
|
343 my $uri = "https://raw.githubusercontent.com/finnishtransportagency/metadata/master/csv/meta_rws_stations.csv"; |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
344 my $res = fetch_http($uri); |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
345 die("Failed to fetch $uri data.\n") unless ($res->code <= 200 && $res->code <= 201); |
339 | 346 |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
347 print STDERR "Storing to cache '$meta_file'.\n" if (opt_get_int("debug") > 0); |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
348 $meta_str = $res->decoded_content; |
402
eaf56c84dc8c
fetch_weather: Use File::Slurper instead of old and somewhat broken File::Slurp.
Matti Hamalainen <ccr@tnsp.org>
parents:
401
diff
changeset
|
349 write_text($meta_file, $meta_str, "utf8"); |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
350 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
351 else |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
352 { |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
353 print STDERR "Using CACHED Tiehallinto static meta data from '$meta_file'.\n" if (opt_get_int("debug") > 0); |
402
eaf56c84dc8c
fetch_weather: Use File::Slurper instead of old and somewhat broken File::Slurp.
Matti Hamalainen <ccr@tnsp.org>
parents:
401
diff
changeset
|
354 $meta_str = read_text($meta_file, "utf8"); |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
355 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
356 |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
357 # Parse the data .. |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
358 my $meta_data = {}; |
387
ff3037bc6efc
fetch_weather: Fix backwards compatibility with old Text::CSV version vs. utf8 and sep_char passing object creation.
Matti Hamalainen <ccr@tnsp.org>
parents:
386
diff
changeset
|
359 # my $csv = Text::CSV->new({blank_is_undef => 1, decode_utf8 => 1, sep_char => ";"}); |
ff3037bc6efc
fetch_weather: Fix backwards compatibility with old Text::CSV version vs. utf8 and sep_char passing object creation.
Matti Hamalainen <ccr@tnsp.org>
parents:
386
diff
changeset
|
360 my $csv = Text::CSV->new({blank_is_undef => 1, sep_char => ";"}); |
343
3fff571a904b
fetch_weather: Some fixes to make this actually work.
Matti Hamalainen <ccr@tnsp.org>
parents:
340
diff
changeset
|
361 die("Failed to instantiate Text::CSV object?\n") unless defined($csv); |
398 | 362 |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
363 foreach my $line (split(/\s*\n\s*/, $meta_str)) |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
364 { |
343
3fff571a904b
fetch_weather: Some fixes to make this actually work.
Matti Hamalainen <ccr@tnsp.org>
parents:
340
diff
changeset
|
365 if (defined($line) && $csv->parse($line)) |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
366 { |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
367 my @fields = $csv->fields(); |
363
3917a1515e31
fetch_weather: Fix parsing of "empty" CSV data.
Matti Hamalainen <ccr@tnsp.org>
parents:
359
diff
changeset
|
368 if (scalar(@fields) > 1) |
3917a1515e31
fetch_weather: Fix parsing of "empty" CSV data.
Matti Hamalainen <ccr@tnsp.org>
parents:
359
diff
changeset
|
369 { |
377
0a6d9f0f0a57
fetch_weather: Fix Tiehallinto metadata handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
375
diff
changeset
|
370 $$meta_data{$fields[0]} = \@fields; |
363
3917a1515e31
fetch_weather: Fix parsing of "empty" CSV data.
Matti Hamalainen <ccr@tnsp.org>
parents:
359
diff
changeset
|
371 } |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
372 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
373 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
374 |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
375 # Parse XML and combine with the station meta data |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
376 if (defined($data->{"roadweatherdata"})) |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
377 { |
349
f7793ef7c925
fetch_weather: Improve debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
343
diff
changeset
|
378 my $nrecords = 0; |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
379 foreach my $wdata (@{$data->{"roadweatherdata"}{"roadweather"}}) |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
380 { |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
381 my $wid = $wdata->{"stationid"}; |
392
afd9a2bc8626
fetch_weather: Improve data validity/error checking.
Matti Hamalainen <ccr@tnsp.org>
parents:
387
diff
changeset
|
382 if (defined($meta_data->{$wid}) && defined($meta_data->{$wid}[2]) && $meta_data->{$wid}[2] ne "") |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
383 { |
349
f7793ef7c925
fetch_weather: Improve debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
343
diff
changeset
|
384 $nrecords++; |
379
3715df1cd9aa
fetch_weather: Use Finnish location names instead of Swedish ones from static Tiehallinto station metadata.
Matti Hamalainen <ccr@tnsp.org>
parents:
378
diff
changeset
|
385 $weatherdata->{$meta_data->{$wid}[2]} = |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
386 [ |
343
3fff571a904b
fetch_weather: Some fixes to make this actually work.
Matti Hamalainen <ccr@tnsp.org>
parents:
340
diff
changeset
|
387 1, |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
388 str2time(plonk_data($wdata->{"measurementtime"}{"utc"})), |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
389 plonk_data($wdata->{"airtemperature1"}), |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
390 |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
391 plonk_data($wdata->{"humidity"}), |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
392 plonk_data($wdata->{"averagewindspeed"}), |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
393 ]; |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
394 } |
377
0a6d9f0f0a57
fetch_weather: Fix Tiehallinto metadata handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
375
diff
changeset
|
395 else |
0a6d9f0f0a57
fetch_weather: Fix Tiehallinto metadata handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
375
diff
changeset
|
396 { |
397
799320c3386e
Change "Station ID #" not defined?" to a debug message.
Matti Hamalainen <ccr@tnsp.org>
parents:
396
diff
changeset
|
397 print STDERR "Station ID #".$wid." not defined?\n" if (opt_get_int("debug") > 0); |
400 | 398 #.Dumper($meta_data->{$wid}); |
377
0a6d9f0f0a57
fetch_weather: Fix Tiehallinto metadata handling.
Matti Hamalainen <ccr@tnsp.org>
parents:
375
diff
changeset
|
399 } |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
400 } |
349
f7793ef7c925
fetch_weather: Improve debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
343
diff
changeset
|
401 print STDERR $nrecords." records from Tiehallinto.\n" if (opt_get_int("debug") > 0); |
338
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
402 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
403 else |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
404 { |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
405 print STDERR "ERROR: Invalid (or unsupported) road weather data blob.\n"; |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
406 print STDERR $res->decoded_content."\n\n"; |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
407 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
408 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
409 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
410 } |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
411 |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
412 |
afb8c0e2d513
fetch_weather: Implement support for new Tiehallinto data API.
Matti Hamalainen <ccr@tnsp.org>
parents:
332
diff
changeset
|
413 ### |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
414 ### Fetch FMI data |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
415 ### |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
416 if (opt_chk_bool("opt_fmi")) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
417 { |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
418 die("FMI data scrape enabled, but no API key set.\n") unless opt_chk_valid("fmi_api_key", 10); |
238
a1d6e2d8789e
Add new data from FMI service and change datafile format.
Matti Hamalainen <ccr@tnsp.org>
parents:
237
diff
changeset
|
419 my @fmitems = ("temperature", "humidity", "windspeedms", "totalcloudcover"); |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
420 |
189 | 421 my $uri = "http://data.fmi.fi/fmi-apikey/".opt_get("fmi_api_key"). |
422 "/wfs?request=getFeature&storedquery_id=fmi::observations::weather::". | |
423 "multipointcoverage". | |
424 # "timevaluepair". | |
194 | 425 "&starttime=".format_time_gmt(time() - 10*60)."&endtime=".format_time_gmt(time()). |
238
a1d6e2d8789e
Add new data from FMI service and change datafile format.
Matti Hamalainen <ccr@tnsp.org>
parents:
237
diff
changeset
|
426 "¶meters=".join(",", @fmitems)."&maxlocations=100&bbox=19,59,32,75"; |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
427 |
324
19c64798de91
weather: Add some better optional debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
247
diff
changeset
|
428 print STDERR "FMI URI: ".$uri."\n" if (opt_get_int("debug") > 0); |
189 | 429 |
430 my $res = fetch_http($uri); | |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
431 if ($res->code >= 200 && $res->code <= 201) |
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
432 { |
170
e4faa3746869
Remove useless parameters from XMLin().
Matti Hamalainen <ccr@tnsp.org>
parents:
169
diff
changeset
|
433 my $xml = XMLin($res->decoded_content); |
169
c12e422a543a
FMI data parsing kinda almost works. It is horrible, though. XML ... :Q
Matti Hamalainen <ccr@tnsp.org>
parents:
168
diff
changeset
|
434 my $time_base = time(); |
339 | 435 |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
436 if (defined($xml->{"wfs:member"}{"omso:GridSeriesObservation"})) |
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
437 { |
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
438 my $fdata = $xml->{"wfs:member"}{"omso:GridSeriesObservation"}; |
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
439 my $fshit = $fdata->{"om:result"}{"gmlcov:MultiPointCoverage"}; |
378
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
440 |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
441 my @position_lines = split(/\n/, $fshit->{"gml:domainSet"}{"gmlcov:SimpleMultiPoint"}{"gmlcov:positions"}); |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
442 my @data_lines = split(/\n/, $fshit->{"gml:rangeSet"}{"gml:DataBlock"}{"gml:doubleOrNilReasonTupleList"}); |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
443 my @farray = (); |
169
c12e422a543a
FMI data parsing kinda almost works. It is horrible, though. XML ... :Q
Matti Hamalainen <ccr@tnsp.org>
parents:
168
diff
changeset
|
444 |
378
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
445 if (scalar(@position_lines) == scalar(@data_lines)) |
169
c12e422a543a
FMI data parsing kinda almost works. It is horrible, though. XML ... :Q
Matti Hamalainen <ccr@tnsp.org>
parents:
168
diff
changeset
|
446 { |
378
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
447 for (my $nline = 0; $nline < scalar(@position_lines); $nline++) |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
448 { |
382
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
449 my $dline = str_trim($data_lines[$nline]); |
5573c1681da9
fetch_weather: Trim split input data lines in FMI XML.
Matti Hamalainen <ccr@tnsp.org>
parents:
381
diff
changeset
|
450 my $pline = str_trim($position_lines[$nline]); |
378
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
451 |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
452 my @fmatches = ($dline =~ /\s*([\+\-]?\d+\.\d*|NaN)\s*/ig); |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
453 if (scalar(@fmatches) != scalar(@fmitems)) |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
454 { |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
455 print STDERR "Not enough items in scalar line #".$nline." (". |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
456 scalar(@fmatches). " vs ".scalar(@fmitems)."): ".$dline."\n"; |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
457 } |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
458 else |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
459 { |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
460 my $vtmp = {}; |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
461 for (my $fni = 0; $fni < scalar(@fmitems); $fni++) |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
462 { |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
463 $$vtmp{$fmitems[$fni]} = $fmatches[$fni] if (lc($fmatches[$fni]) ne "nan"); |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
464 } |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
465 if ($pline =~ /^\s*([\+\-]?\d+\.\d*)\s+([\+\-]?\d+\.\d*)\s+(\d+)\s*$/) |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
466 { |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
467 $$vtmp{"lat"} = $1; |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
468 $$vtmp{"long"} = $2; |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
469 $$vtmp{"time"} = $3; |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
470 push(@farray, $vtmp); |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
471 } |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
472 else |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
473 { |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
474 print STDERR "Data mismatch #".$nline.": ".$pline."\n"; |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
475 } |
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
476 } |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
477 } |
169
c12e422a543a
FMI data parsing kinda almost works. It is horrible, though. XML ... :Q
Matti Hamalainen <ccr@tnsp.org>
parents:
168
diff
changeset
|
478 } |
378
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
479 else |
169
c12e422a543a
FMI data parsing kinda almost works. It is horrible, though. XML ... :Q
Matti Hamalainen <ccr@tnsp.org>
parents:
168
diff
changeset
|
480 { |
384 | 481 print STDERR "Position and data line counts do not match.\n"; |
378
b706e8ebecf8
fetch_weather: Possibly improve FMI XML mess parsing.
Matti Hamalainen <ccr@tnsp.org>
parents:
377
diff
changeset
|
482 goto skip_it; |
189 | 483 } |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
484 # XXX Hashify the array into lat/long keys |
339 | 485 |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
486 # This is horrible :S |
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
487 my $fcrap = $fdata->{"om:featureOfInterest"}{"sams:SF_SpatialSamplingFeature"}{"sams:shape"}{"gml:MultiPoint"}{"gml:pointMember"}; |
352
19b363586b40
fetch_weather: Fix debug prints.
Matti Hamalainen <ccr@tnsp.org>
parents:
349
diff
changeset
|
488 my $nrecords = 0; |
228 | 489 foreach my $xnode (@{$fcrap}) |
189 | 490 { |
228 | 491 my $floc = $xnode->{"gml:Point"}; |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
492 if ($floc->{"gml:pos"} =~ /^\s*([\+\-]?\d+\.\d*)\s+([\+\-]?\d+\.\d*)\s*$/) |
189 | 493 { |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
494 my ($flat, $flong) = ($1, $2); |
349
f7793ef7c925
fetch_weather: Improve debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
343
diff
changeset
|
495 |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
496 # Should use a hash - |
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
497 foreach my $flol (@farray) |
189 | 498 { |
383
1ba1191da15d
fetch_weather: Check for empty station name.
Matti Hamalainen <ccr@tnsp.org>
parents:
382
diff
changeset
|
499 if ($flol->{"lat"} == $flat && $flol->{"long"} == $flong && |
1ba1191da15d
fetch_weather: Check for empty station name.
Matti Hamalainen <ccr@tnsp.org>
parents:
382
diff
changeset
|
500 $floc->{"gml:name"} ne "") |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
501 { |
349
f7793ef7c925
fetch_weather: Improve debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
343
diff
changeset
|
502 $nrecords++; |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
503 $weatherdata->{$floc->{"gml:name"}} = |
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
504 [ |
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
505 1, |
228 | 506 plonk_data($flol->{"time"}), |
237 | 507 plonk_data($flol->{"temperature"}), |
238
a1d6e2d8789e
Add new data from FMI service and change datafile format.
Matti Hamalainen <ccr@tnsp.org>
parents:
237
diff
changeset
|
508 |
228 | 509 plonk_data($flol->{"humidity"}), |
237 | 510 plonk_data($flol->{"windspeedms"}), |
244 | 511 translate_clouds(plonk_data($flol->{"totalcloudcover"})), |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
512 ]; |
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
513 } |
189 | 514 } |
515 } | |
169
c12e422a543a
FMI data parsing kinda almost works. It is horrible, though. XML ... :Q
Matti Hamalainen <ccr@tnsp.org>
parents:
168
diff
changeset
|
516 } |
352
19b363586b40
fetch_weather: Fix debug prints.
Matti Hamalainen <ccr@tnsp.org>
parents:
349
diff
changeset
|
517 print STDERR $nrecords." records from FMI.\n" if (opt_get_int("debug") > 0); |
353 | 518 } |
519 else | |
520 { | |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
521 # defined |
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
522 print STDERR "Invalid XML received:\n"; |
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
523 print STDERR $res->decoded_content."\n\n"; |
169
c12e422a543a
FMI data parsing kinda almost works. It is horrible, though. XML ... :Q
Matti Hamalainen <ccr@tnsp.org>
parents:
168
diff
changeset
|
524 } |
353 | 525 } |
526 else | |
527 { | |
208
c6bbf69afc57
Add some error handling and debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
206
diff
changeset
|
528 print STDERR "Error fetching FMI XML: ".$res->status_line."\n"; |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
529 } |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
530 } |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
531 |
164
d5a0e4248f3e
weather: Implement configuration file support for weather fetcher backend.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
532 |
375
c303ddc0a683
fetch_weather: Don't die() in case of bad XML from FMI, just skip parsing
Matti Hamalainen <ccr@tnsp.org>
parents:
374
diff
changeset
|
533 ### Skip here if the FMI shit fails due to broken data |
c303ddc0a683
fetch_weather: Don't die() in case of bad XML from FMI, just skip parsing
Matti Hamalainen <ccr@tnsp.org>
parents:
374
diff
changeset
|
534 skip_it: |
c303ddc0a683
fetch_weather: Don't die() in case of bad XML from FMI, just skip parsing
Matti Hamalainen <ccr@tnsp.org>
parents:
374
diff
changeset
|
535 |
c303ddc0a683
fetch_weather: Don't die() in case of bad XML from FMI, just skip parsing
Matti Hamalainen <ccr@tnsp.org>
parents:
374
diff
changeset
|
536 |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
537 ### |
394
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
538 ### Purge too old entries |
371
36869897f21d
fetch_weather: Purge sufficiently old data.
Matti Hamalainen <ccr@tnsp.org>
parents:
370
diff
changeset
|
539 ### |
394
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
540 if (opt_chk_valid("purge_threshold", 1)) |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
541 { |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
542 my $purge = opt_get_int("purge_threshold"); |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
543 if ($purge > 0) |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
544 { |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
545 my $wqtime = time(); |
395
33b5e7adc30c
fetch_weather: Make purge_threshold output some information when debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
394
diff
changeset
|
546 my $nold = scalar(keys %$weatherdata); |
373
bc7746ca622e
fetch_weather: Implement purge_threshold setting.
Matti Hamalainen <ccr@tnsp.org>
parents:
371
diff
changeset
|
547 |
394
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
548 foreach my $key (keys %$weatherdata) |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
549 { |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
550 if ($wqtime - $weatherdata->{$key}[1] > (60 * $purge)) |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
551 { |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
552 delete $$weatherdata{$key}; |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
553 } |
315f31e4f964
fetch_weather: Make purge_threshold option entirely optional, e.g. not set or 0 will disable purging.
Matti Hamalainen <ccr@tnsp.org>
parents:
392
diff
changeset
|
554 } |
395
33b5e7adc30c
fetch_weather: Make purge_threshold output some information when debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
394
diff
changeset
|
555 |
33b5e7adc30c
fetch_weather: Make purge_threshold output some information when debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
394
diff
changeset
|
556 my $nnew = scalar(keys %$weatherdata); |
33b5e7adc30c
fetch_weather: Make purge_threshold output some information when debugging.
Matti Hamalainen <ccr@tnsp.org>
parents:
394
diff
changeset
|
557 print STDERR "Purged data older than ".$purge." minutes, ".$nold." -> ".$nnew." = ".($nold - $nnew)." removed.\n" if (opt_get_int("debug") > 0); |
371
36869897f21d
fetch_weather: Purge sufficiently old data.
Matti Hamalainen <ccr@tnsp.org>
parents:
370
diff
changeset
|
558 } |
36869897f21d
fetch_weather: Purge sufficiently old data.
Matti Hamalainen <ccr@tnsp.org>
parents:
370
diff
changeset
|
559 } |
36869897f21d
fetch_weather: Purge sufficiently old data.
Matti Hamalainen <ccr@tnsp.org>
parents:
370
diff
changeset
|
560 |
36869897f21d
fetch_weather: Purge sufficiently old data.
Matti Hamalainen <ccr@tnsp.org>
parents:
370
diff
changeset
|
561 |
36869897f21d
fetch_weather: Purge sufficiently old data.
Matti Hamalainen <ccr@tnsp.org>
parents:
370
diff
changeset
|
562 ### |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
563 ### Output |
178
9b8ec700ede4
Clean up the weather data parser backend a bit.
Matti Hamalainen <ccr@tnsp.org>
parents:
170
diff
changeset
|
564 ### |
353 | 565 if (opt_chk_valid("outfile", 1)) |
566 { | |
396
dbf1d58915f8
fetch_weather: Improve a debug message.
Matti Hamalainen <ccr@tnsp.org>
parents:
395
diff
changeset
|
567 print STDERR "Dumping data to output file '".opt_get("outfile")."'\n" if (opt_get_int("debug") > 0); |
368
ed1c7f2d81df
fetch_weather: Close STDOUT filehandle before reopening it, to make sure we
Matti Hamalainen <ccr@tnsp.org>
parents:
367
diff
changeset
|
568 close(STDOUT); |
369
86adad909681
fetch_weather: Improve debugging and one error message.
Matti Hamalainen <ccr@tnsp.org>
parents:
368
diff
changeset
|
569 open(STDOUT, '>', opt_get("outfile")) or die("Could not open output file '".opt_get("outfile")."': $!\n"); |
158
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
570 } |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
571 |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
572 binmode STDOUT, ':encoding(utf-8)'; |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
573 |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
574 foreach my $key (sort { $a cmp $b } keys %$weatherdata) |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
575 { |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
576 print STDOUT $key."|".join("|", @{$weatherdata->{$key}})."\n"; |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
577 } |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
578 |
db2b1f74d994
Initial import of weather data fetching backend, written in Perl.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
579 close(STDOUT); |