59_WUup.pm 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. # $Id: 59_WUup.pm 17147 2018-08-15 15:38:43Z mahowi $
  2. ################################################################################
  3. # 59_WUup.pm
  4. #
  5. # Copyright: mahowi
  6. # e-mail: mahowi@gmx.net
  7. #
  8. # Based on 55_weco.pm by betateilchen
  9. #
  10. # This file is part of fhem.
  11. #
  12. # Fhem is free software: you can redistribute it and/or modify
  13. # it under the terms of the GNU General Public License as published by
  14. # the Free Software Foundation, either version 2 of the License, or
  15. # (at your option) any later version.
  16. #
  17. # Fhem is distributed in the hope that it will be useful,
  18. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. # GNU General Public License for more details.
  21. #
  22. # You should have received a copy of the GNU General Public License
  23. # along with fhem. If not, see <http://www.gnu.org/licenses/>.
  24. #
  25. ################################################################################
  26. package main;
  27. use strict;
  28. use warnings;
  29. use Time::HiRes qw(gettimeofday);
  30. use HttpUtils;
  31. use UConv;
  32. my $version = "0.9.9";
  33. # Declare functions
  34. sub WUup_Initialize($);
  35. sub WUup_Define($$$);
  36. sub WUup_Undef($$);
  37. sub WUup_Set($@);
  38. sub WUup_Attr(@);
  39. sub WUup_stateRequestTimer($);
  40. sub WUup_send($);
  41. sub WUup_receive($);
  42. ################################################################################
  43. #
  44. # Main routines
  45. #
  46. ################################################################################
  47. sub WUup_Initialize($) {
  48. my ($hash) = @_;
  49. $hash->{DefFn} = "WUup_Define";
  50. $hash->{UndefFn} = "WUup_Undef";
  51. $hash->{SetFn} = "WUup_Set";
  52. $hash->{AttrFn} = "WUup_Attr";
  53. $hash->{AttrList} =
  54. "disable:1 "
  55. . "disabledForIntervals "
  56. . "interval "
  57. . "unit_windspeed:km/h,m/s "
  58. . "unit_solarradiation:W/m²,lux "
  59. . "round "
  60. . "wubaromin wudailyrainin wudewptf wuhumidity wurainin wusoilmoisture "
  61. . "wusoiltempf wusolarradiation wutempf wuUV wuwinddir wuwinddir_avg2m "
  62. . "wuwindgustdir wuwindgustdir_10m wuwindgustmph wuwindgustmph_10m "
  63. . "wuwindspdmph_avg2m wuwindspeedmph wuAqPM2.5 wuAqPM10 "
  64. . $readingFnAttributes;
  65. $hash->{VERSION} = $version;
  66. }
  67. sub WUup_Define($$$) {
  68. my ( $hash, $def ) = @_;
  69. my @a = split( "[ \t][ \t]*", $def );
  70. return "syntax: define <name> WUup <stationID> <password>"
  71. if ( int(@a) != 4 );
  72. my $name = $hash->{NAME};
  73. $hash->{VERSION} = $version;
  74. $hash->{INTERVAL} = 300;
  75. $hash->{helper}{stationid} = $a[2];
  76. $hash->{helper}{password} = $a[3];
  77. $hash->{helper}{softwaretype} = 'FHEM';
  78. $hash->{helper}{url} =
  79. "https://weatherstation.wunderground.com/weatherstation/updateweatherstation.php";
  80. $hash->{helper}{url_rf} =
  81. "https://rtupdate.wunderground.com/weatherstation/updateweatherstation.php";
  82. readingsSingleUpdate( $hash, "state", "defined", 1 );
  83. $attr{$name}{room} = "Weather" if ( !defined( $attr{$name}{room} ) );
  84. $attr{$name}{unit_windspeed} = "km/h"
  85. if ( !defined( $attr{$name}{unit_windspeed} ) );
  86. $attr{$name}{unit_solarradiation} = "lux"
  87. if ( !defined( $attr{$name}{unit_solarradiation} ) );
  88. $attr{$name}{round} = 4 if ( !defined( $attr{$name}{round} ) );
  89. RemoveInternalTimer($hash);
  90. if ($init_done) {
  91. WUup_stateRequestTimer($hash);
  92. }
  93. else {
  94. InternalTimer( gettimeofday(), "WUup_stateRequestTimer", $hash, 0 );
  95. }
  96. Log3 $name, 3, "WUup ($name): defined";
  97. return undef;
  98. }
  99. sub WUup_Undef($$) {
  100. my ( $hash, $arg ) = @_;
  101. RemoveInternalTimer($hash);
  102. return undef;
  103. }
  104. sub WUup_Set($@) {
  105. my ( $hash, $name, $cmd, @args ) = @_;
  106. return "\"set $name\" needs at least one argument" unless ( defined($cmd) );
  107. if ( $cmd eq "update" ) {
  108. WUup_stateRequestTimer($hash);
  109. }
  110. else {
  111. return "Unknown argument $cmd, choose one of update:noArg";
  112. }
  113. }
  114. sub WUup_Attr(@) {
  115. my ( $cmd, $name, $attrName, $attrVal ) = @_;
  116. my $hash = $defs{$name};
  117. if ( $attrName eq "disable" ) {
  118. if ( $cmd eq "set" and $attrVal eq "1" ) {
  119. readingsSingleUpdate( $hash, "state", "disabled", 1 );
  120. Log3 $name, 3, "WUup ($name) - disabled";
  121. }
  122. elsif ( $cmd eq "del" ) {
  123. readingsSingleUpdate( $hash, "state", "active", 1 );
  124. Log3 $name, 3, "WUup ($name) - enabled";
  125. }
  126. }
  127. if ( $attrName eq "disabledForIntervals" ) {
  128. if ( $cmd eq "set" ) {
  129. readingsSingleUpdate( $hash, "state", "unknown", 1 );
  130. Log3 $name, 3, "WUup ($name) - disabledForIntervals";
  131. }
  132. elsif ( $cmd eq "del" ) {
  133. readingsSingleUpdate( $hash, "state", "active", 1 );
  134. Log3 $name, 3, "WUup ($name) - enabled";
  135. }
  136. }
  137. if ( $attrName eq "interval" ) {
  138. if ( $cmd eq "set" ) {
  139. if ( $attrVal < 3 ) {
  140. Log3 $name, 1,
  141. "WUup ($name) - interval too small, please use something >= 3 (sec), default is 300 (sec).";
  142. return
  143. "interval too small, please use something >= 3 (sec), default is 300 (sec)";
  144. }
  145. else {
  146. $hash->{INTERVAL} = $attrVal;
  147. Log3 $name, 4, "WUup ($name) - set interval to $attrVal";
  148. }
  149. }
  150. elsif ( $cmd eq "del" ) {
  151. $hash->{INTERVAL} = 300;
  152. Log3 $name, 4, "WUup ($name) - set interval to default";
  153. }
  154. }
  155. return undef;
  156. }
  157. sub WUup_stateRequestTimer($) {
  158. my ($hash) = @_;
  159. my $name = $hash->{NAME};
  160. if ( !IsDisabled($name) ) {
  161. readingsSingleUpdate( $hash, "state", "active", 1 )
  162. if (
  163. (
  164. ReadingsVal( $name, "state", 0 ) eq "defined"
  165. or ReadingsVal( $name, "state", 0 ) eq "disabled"
  166. or ReadingsVal( $name, "state", 0 ) eq "Unknown"
  167. )
  168. );
  169. WUup_send($hash);
  170. }
  171. else {
  172. readingsSingleUpdate( $hash, "state", "disabled", 1 );
  173. }
  174. InternalTimer( gettimeofday() + $hash->{INTERVAL},
  175. "WUup_stateRequestTimer", $hash, 1 );
  176. Log3 $name, 5,
  177. "Sub WUup_stateRequestTimer ($name) - Request Timer is called";
  178. }
  179. sub WUup_send($) {
  180. my ($hash) = @_;
  181. my $name = $hash->{NAME};
  182. my $version = $hash->{VERSION};
  183. my $url = "";
  184. if ( $hash->{INTERVAL} < 300 ) {
  185. $url = $hash->{helper}{url_rf};
  186. }
  187. else {
  188. $url = $hash->{helper}{url};
  189. }
  190. $url .= "?ID=" . $hash->{helper}{stationid};
  191. $url .= "&PASSWORD=" . $hash->{helper}{password};
  192. my $datestring = strftime "%F+%T", gmtime;
  193. $datestring =~ s/:/%3A/g;
  194. $url .= "&dateutc=" . $datestring;
  195. $attr{$name}{unit_windspeed} = "km/h"
  196. if ( !defined( $attr{$name}{unit_windspeed} ) );
  197. $attr{$name}{unit_solarradiation} = "lux"
  198. if ( !defined( $attr{$name}{unit_solarradiation} ) );
  199. $attr{$name}{round} = 4 if ( !defined( $attr{$name}{round} ) );
  200. my ( $data, $d, $r, $o );
  201. my $a = $attr{$name};
  202. my $rnd = $attr{$name}{round};
  203. while ( my ( $key, $value ) = each(%$a) ) {
  204. next if substr( $key, 0, 2 ) ne 'wu';
  205. $key = substr( $key, 2, length($key) - 2 );
  206. ( $d, $r, $o ) = split( ":", $value );
  207. if ( defined($r) ) {
  208. $o = ( defined($o) ) ? $o : 0;
  209. $value = ReadingsVal( $d, $r, 0 ) + $o;
  210. }
  211. if ( $key =~ /\w+f$/ ) {
  212. $value = UConv::c2f( $value, $rnd );
  213. }
  214. elsif ( $key =~ /\w+mph.*/ ) {
  215. if ( $attr{$name}{unit_windspeed} eq "m/s" ) {
  216. Log3 $name, 5, "WUup ($name) - windspeed unit is m/s";
  217. $value =
  218. UConv::kph2mph( ( UConv::mps2kph( $value, $rnd ) ), $rnd );
  219. }
  220. else {
  221. Log3 $name, 5, "WUup ($name) - windspeed unit is km/h";
  222. $value = UConv::kph2mph( $value, $rnd );
  223. }
  224. }
  225. elsif ( $key eq "baromin" ) {
  226. $value = UConv::hpa2inhg( $value, $rnd );
  227. }
  228. elsif ( $key =~ /.*rainin$/ ) {
  229. $value = UConv::mm2in( $value, $rnd );
  230. }
  231. elsif ( $key eq "solarradiation" ) {
  232. if ( $attr{$name}{unit_solarradiation} eq "lux" ) {
  233. Log3 $name, 5, "WUup ($name) - solarradiation unit is lux";
  234. $value = ( $value / 126.7 );
  235. }
  236. else {
  237. Log3 $name, 5, "WUup ($name) - solarradiation unit is W/m²";
  238. }
  239. }
  240. $data .= "&$key=$value";
  241. }
  242. readingsBeginUpdate($hash);
  243. if ( defined($data) ) {
  244. readingsBulkUpdate( $hash, "data", $data );
  245. Log3 $name, 4, "WUup ($name) - data sent: $data";
  246. $url .= $data;
  247. $url .= "&softwaretype=" . $hash->{helper}{softwaretype};
  248. $url .= "&action=updateraw";
  249. if ( $hash->{INTERVAL} < 300 ) {
  250. $url .= "&realtime=1&rtfreq=" . $hash->{INTERVAL};
  251. }
  252. my $param = {
  253. url => $url,
  254. timeout => 6,
  255. hash => $hash,
  256. method => "GET",
  257. header =>
  258. "agent: FHEM-WUup/$version\r\nUser-Agent: FHEM-WUup/$version",
  259. callback => \&WUup_receive
  260. };
  261. Log3 $name, 5, "WUup ($name) - full URL: $url";
  262. HttpUtils_NonblockingGet($param);
  263. # my $response = GetFileFromURL($url);
  264. # readingsBulkUpdate( $hash, "response", $response );
  265. # Log3 $name, 4, "WUup ($name) - server response: $response";
  266. }
  267. else {
  268. CommandDeleteReading( undef, "$name data" );
  269. CommandDeleteReading( undef, "$name response" );
  270. Log3 $name, 3, "WUup ($name) - no data";
  271. readingsBulkUpdate( $hash, "state", "defined" );
  272. }
  273. readingsEndUpdate( $hash, 1 );
  274. return;
  275. }
  276. sub WUup_receive($) {
  277. my ( $param, $err, $data ) = @_;
  278. my $hash = $param->{hash};
  279. my $name = $hash->{NAME};
  280. if ( $err ne "" ) {
  281. Log3 $name, 3,
  282. "WUup ($name) - error while requesting " . $param->{url} . " - $err";
  283. readingsSingleUpdate( $hash, "state", "ERROR", undef );
  284. readingsSingleUpdate( $hash, "response", $err, undef );
  285. }
  286. elsif ( $data ne "" ) {
  287. Log3 $name, 4, "WUup ($name) - server response: $data";
  288. readingsSingleUpdate( $hash, "state", "active", undef );
  289. readingsSingleUpdate( $hash, "response", $data, undef );
  290. }
  291. }
  292. 1;
  293. ################################################################################
  294. #
  295. # Documentation
  296. #
  297. ################################################################################
  298. #
  299. # Changelog:
  300. #
  301. # 2017-01-23 initial release
  302. # 2017-02-10 added german docu
  303. # 2017-02-22 fixed bug when module cannot get reenabled after disabling
  304. # added disabledForIntervals
  305. # changed attribute WUInterval to interval
  306. # default interval 300
  307. # 2017-02-23 added attribute unit_windspeed
  308. # converted units rounded to 4 decimal places
  309. # 2017-03-16 implemented non-blocking mode
  310. # 2017-08-16 integrated RapidFire mode (thanks to Scooty66)
  311. # 2017-10-10 added windspdmph_avg2m, winddir_avg2m, windgustmph_10m,
  312. # windgustdir_10m (thanks to Aeroschmelz for reminding me)
  313. # timeout raised to 6s, fixed state error (thanks to mumpitzstuff)
  314. # 2017-10-16 fixed attributes
  315. # 2017-10-19 added set-command "update"
  316. # 2018-03-19 solarradiation calculated from lux to W/m² (thanks to dieter114)
  317. # 2018-04-10 added attribute round
  318. # 2018-04-13 added AqPM2.5 and AqPM10
  319. # 2018-08-15 added attribute unit_solarradiation
  320. #
  321. ################################################################################
  322. =pod
  323. =item helper
  324. =item summary sends weather data to Weather Underground
  325. =item summary_DE sendet Wetterdaten zu Weather Underground
  326. =begin html
  327. <a name="WUup"></a>
  328. <h3>WUup</h3>
  329. <ul>
  330. <a name="WUupdefine"></a>
  331. <b>Define</b>
  332. <ul>
  333. <br/>
  334. <code>define &lt;name&gt; WUup &lt;stationId&gt; &lt;password&gt;</code>
  335. <br/><br/>
  336. This module provides connection to
  337. <a href="https://www.wunderground.com">www.wunderground.com</a></br>
  338. to send data from your own weather station.<br/>
  339. </ul>
  340. <br/><br/>
  341. <a name="WUupset"></a>
  342. <b>Set-Commands</b><br/>
  343. <ul>
  344. <li><b>update</b> - send data to Weather Underground</li>
  345. </ul>
  346. <br/><br/>
  347. <a name="WUupget"></a>
  348. <b>Get-Commands</b><br/>
  349. <ul>
  350. <br/>
  351. - not implemented -<br/>
  352. </ul>
  353. <br/><br/>
  354. <a name="WUupattr"></a>
  355. <b>Attributes</b><br/><br/>
  356. <ul>
  357. <li><b><a href="#readingFnAttributes">readingFnAttributes</a></b></li>
  358. <li><b>interval</b> - Interval (seconds) to send data to
  359. www.wunderground.com.
  360. Will be adjusted to 300 (which is the default) if set to a value lower than 3.<br />
  361. If lower than 300, RapidFire mode will be used.</li>
  362. <li><b>disable</b> - disables the module</li>
  363. <li><b><a href="#disabledForIntervals">disabledForIntervals</a></b></li>
  364. <li><b>unit_windspeed</b> - change the units of your windspeed readings (m/s or km/h)</li>
  365. <li><b>unit_solarradiation</b> - change the units of your solarradiation readings (lux or W/m&sup2;)</li>
  366. <li><b>round</b> - round values to this number of decimals for calculation (default 4)</li>
  367. <li><b>wu....</b> - Attribute name corresponding to
  368. <a href="http://wiki.wunderground.com/index.php/PWS_-_Upload_Protocol">parameter name from api.</a>
  369. Each of these attributes contains information about weather data to be sent
  370. in format <code>sensorName:readingName</code><br/>
  371. Example: <code>attr WUup wutempf outside:temperature</code> will
  372. define the attribute wutempf and <br/>
  373. reading "temperature" from device "outside" will be sent to
  374. network as parameter "tempf" (which indicates current temperature)
  375. <br/>
  376. Units get converted to angloamerican system automatically
  377. (&deg;C -> &deg;F; km/h(m/s) -> mph; mm -> in; hPa -> inHg)<br/><br/>
  378. <u>The following information is supported:</u>
  379. <ul>
  380. <li>winddir - instantaneous wind direction (0-360) [&deg;]</li>
  381. <li>windspeedmph - instantaneous wind speed ·[mph]</li>
  382. <li>windgustmph - current wind gust, using software specific time period [mph]</li>
  383. <li>windgustdir - current wind direction, using software specific time period [&deg;]</li>
  384. <li>windspdmph_avg2m - 2 minute average wind speed [mph]</li>
  385. <li>winddir_avg2m - 2 minute average wind direction [&deg;]</li>
  386. <li>windgustmph_10m - past 10 minutes wind gust [mph]</li>
  387. <li>windgustdir_10m - past 10 minutes wind gust direction [&deg;]</li>
  388. <li>humidity - outdoor humidity (0-100) [&#37;]</li>
  389. <li>dewptf- outdoor dewpoint [F]</li>
  390. <li>tempf - outdoor temperature [F]</li>
  391. <li>rainin - rain over the past hour -- the accumulated rainfall in the past 60 min [in]</li>
  392. <li>dailyrainin - rain so far today in local time [in]</li>
  393. <li>baromin - barometric pressure [inHg]</li>
  394. <li>soiltempf - soil temperature [F]</li>
  395. <li>soilmoisture - soil moisture [&#37;]</li>
  396. <li>solarradiation - solar radiation[W/m&sup2;]</li>
  397. <li>UV - [index]</li>
  398. <li>AqPM2.5 - PM2.5 mass [&micro;g/m&sup3;]</li>
  399. <li>AqPM10 - PM10 mass [&micro;g/m&sup3;]</li>
  400. </ul>
  401. </li>
  402. </ul>
  403. <br/><br/>
  404. <b>Readings/Events:</b>
  405. <br/><br/>
  406. <ul>
  407. <li><b>data</b> - data string transmitted to www.wunderground.com</li>
  408. <li><b>response</b> - response string received from server</li>
  409. </ul>
  410. <br/><br/>
  411. <b>Notes</b><br/><br/>
  412. <ul>
  413. <li>Find complete api description
  414. <a href="http://wiki.wunderground.com/index.php/PWS_-_Upload_Protocol">here</a></li>
  415. <li>Have fun!</li><br/>
  416. </ul>
  417. </ul>
  418. =end html
  419. =begin html_DE
  420. <a name="WUup"></a>
  421. <h3>WUup</h3>
  422. <ul>
  423. <a name="WUupdefine"></a>
  424. <b>Define</b>
  425. <ul>
  426. <br/>
  427. <code>define &lt;name&gt; WUup &lt;stationId&gt; &lt;password&gt;</code>
  428. <br/><br/>
  429. Dieses Modul stellt eine Verbindung zu <a href="https://www.wunderground.com">www.wunderground.com</a></br>
  430. her, um Daten einer eigenen Wetterstation zu versenden..<br/>
  431. </ul>
  432. <br/><br/>
  433. <a name="WUupset"></a>
  434. <b>Set-Befehle</b><br/>
  435. <ul>
  436. <li><b>update</b> - sende Daten an Weather Underground</li>
  437. </ul>
  438. <br/><br/>
  439. <a name="WUupget"></a>
  440. <b>Get-Befehle</b><br/>
  441. <ul>
  442. <br/>
  443. - keine -<br/>
  444. </ul>
  445. <br/><br/>
  446. <a name="WUupattr"></a>
  447. <b>Attribute</b><br/><br/>
  448. <ul>
  449. <li><b><a href="#readingFnAttributes">readingFnAttributes</a></b></li>
  450. <li><b>interval</b> - Sendeinterval in Sekunden. Wird auf 300 (Default-Wert)
  451. eingestellt, wenn der Wert kleiner als 3 ist.<br />
  452. Wenn der Wert kleiner als 300 ist, wird der RapidFire Modus verwendet.</li>
  453. <li><b>disable</b> - deaktiviert das Modul</li>
  454. <li><b><a href="#disabledForIntervals">disabledForIntervals</a></b></li>
  455. <li><b>unit_windspeed</b> - gibt die Einheit der Readings für die
  456. Windgeschwindigkeiten an (m/s oder km/h)</li>
  457. <li><b>unit_solarradiation</b> - gibt die Einheit der Readings für die
  458. Sonneneinstrahlung an (lux oder W/m&sup2;)</li>
  459. <li><b>round</b> - Anzahl der Nachkommastellen zur Berechnung (Standard 4)</li>
  460. <li><b>wu....</b> - Attributname entsprechend dem
  461. <a href="http://wiki.wunderground.com/index.php/PWS_-_Upload_Protocol">Parameternamen aus der API.</a><br />
  462. Jedes dieser Attribute enth&auml;lt Informationen &uuml;ber zu sendende Wetterdaten
  463. im Format <code>sensorName:readingName</code>.<br/>
  464. Beispiel: <code>attr WUup wutempf outside:temperature</code> definiert
  465. das Attribut wutempf und sendet das Reading "temperature" vom Ger&auml;t "outside" als Parameter "tempf"
  466. (welches die aktuelle Temperatur angibt).
  467. <br />
  468. Einheiten werden automatisch ins anglo-amerikanische System umgerechnet.
  469. (&deg;C -> &deg;F; km/h(m/s) -> mph; mm -> in; hPa -> inHg)<br/><br/>
  470. <u>Unterst&uuml;tzte Angaben</u>
  471. <ul>
  472. <li>winddir - momentane Windrichtung (0-360) [&deg;]</li>
  473. <li>windspeedmph - momentane Windgeschwindigkeit [mph]</li>
  474. <li>windgustmph - aktuelle B&ouml;e, mit Software-spezifischem Zeitraum [mph]</li>
  475. <li>windgustdir - aktuelle B&ouml;enrichtung, mit Software-spezifischer Zeitraum [&deg;]</li>
  476. <li>windspdmph_avg2m - durchschnittliche Windgeschwindigkeit innerhalb 2 Minuten [mph]</li>
  477. <li>winddir_avg2m - durchschnittliche Windrichtung innerhalb 2 Minuten [&deg;]</li>
  478. <li>windgustmph_10m - B&ouml;en der vergangenen 10 Minuten [mph]</li>
  479. <li>windgustdir_10m - Richtung der B&ouml;en der letzten 10 Minuten [&deg;]</li>
  480. <li>humidity - Luftfeuchtigkeit im Freien (0-100) [&#37;]</li>
  481. <li>dewptf- Taupunkt im Freien [F]</li>
  482. <li>tempf - Au&szlig;entemperatur [F]</li>
  483. <li>rainin - Regen in der vergangenen Stunde [in]</li>
  484. <li>dailyrainin - Regenmenge bisher heute [in]</li>
  485. <li>baromin - barometrischer Druck [inHg]</li>
  486. <li>soiltempf - Bodentemperatur [F]</li>
  487. <li>soilmoisture - Bodenfeuchtigkeit [&#37;]</li>
  488. <li>solarradiation - Sonneneinstrahlung [W/m&sup2;]</li>
  489. <li>UV - [Index]</li>
  490. <li>AqPM2.5 - Feinstaub PM2,5 [&micro;g/m&sup3;]</li>
  491. <li>AqPM10 - Feinstaub PM10 [&micro;g/m&sup3;]</li>
  492. </ul>
  493. </li>
  494. </ul>
  495. <br/><br/>
  496. <b>Readings/Events:</b>
  497. <br/><br/>
  498. <ul>
  499. <li><b>data</b> - Daten, die zu www.wunderground.com gesendet werden</li>
  500. <li><b>response</b> - Antwort, die vom Server empfangen wird</li>
  501. </ul>
  502. <br/><br/>
  503. <b>Notizen</b><br/><br/>
  504. <ul>
  505. <li>Die komplette API-Beschreibung findet sich
  506. <a href="http://wiki.wunderground.com/index.php/PWS_-_Upload_Protocol">hier</a></li>
  507. <li>Viel Spa&szlig;!</li><br/>
  508. </ul>
  509. </ul>
  510. =end html_DE
  511. =cut