Skripte
PHP-Skript: updateweatherstation.php

Funktionsbeschreibung:
Dieses Skript nimmt die von der Wetterstation gesendeten Daten auf, rechnet einige Werte um und ergänzt einige Werte wie bspw. Mondphasen und Sonnenauf- und untergangszeiten. Diese Werte werden dann in eine OWSD-Format-konforme XML-Datei akt_wetterdaten.xml (siehe auch XML-Datei: akt_wetterdaten.xml) geschrieben. Am Ende überträgt das Skript die Daten dann auch an Wunderground (WU) (Link). Für die HP1000 oder baugleiche Wetterstationen darf dieses Skript nur in dem vorgegebenen Pfad des Zielservers liegen und muss auch hinsichtlich des Dateinamens so heißen. Es empfiehlt sich, um Fremdmanipulation zu vermeiden, bei der Gestaltung des Dateinamens für die XML-Datei kreativ zu sein. Gleiches gilt für einen Einsatz auf externen Zielservern im Internet, hierfür sollte zunächst das Skript im eigenem Netzwerk laufen und dann eine Weiterleitung zu externen Zielservern erfolgen. Diese Weiterleitung kann dann, analog der Wunderground Weiterleitung (siehe Skriptende) aufgebaut werden, jedoch mit eigenen kreativen Dateinamen und Pfadstrukturen.
  1. <?php
  2. // Weiterverarbeitung Messdaten HP100X bzw. baugleich, Autor: Joachim Bieniak
  3. // Version 1.0
  4.  
  5. // Variablen der Wetterstation (HP1000) aufnehmen
  6. $ID = urlencode($_GET["ID"]);
  7. $PASSWORD = urlencode($_GET["PASSWORD"]);
  8. $indoortempf = $_GET["indoortempf"];
  9. $tempf = $_GET["tempf"];
  10. $dewptf = $_GET["dewptf"];
  11. $windchillf = $_GET["windchillf"];
  12. $indoorhumidity = $_GET["indoorhumidity"];
  13. $humidity = $_GET["humidity"];
  14. $windspeedmph = $_GET["windspeedmph"];
  15. $windgustmph = $_GET["windgustmph"];
  16. $winddir = $_GET["winddir"];
  17. $absbaromin = $_GET["absbaromin"];
  18. $baromin = $_GET["baromin"];
  19. $rainin = $_GET["rainin"];
  20. $dailyrainin = $_GET["dailyrainin"];
  21. $weeklyrainin = $_GET["weeklyrainin"];
  22. $monthlyrainin = $_GET["monthlyrainin"];
  23. $yearlyrainin = $_GET["yearlyrainin"];
  24. $solarradiation = $_GET["solarradiation"];
  25. $UV = $_GET["UV"];
  26. $dateutc = urlencode($_GET["dateutc"]);
  27. $softwaretype = $_GET["softwaretype"];
  28. $action = urlencode($_GET["action"]);
  29. $realtime = $_GET["realtime"];
  30. $rtfreq = $_GET["rtfreq"];
  31.  
  32. // Aktuelles Datum und Uhrzeit ermitteln
  33. $timestamp = time();
  34. $datum = date("d.m.Y",$timestamp);
  35. $uhrzeit = date("H:i:s",$timestamp);
  36. $tage = array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
  37. $tag = date("w");
  38. $utcdate = date("Y-m-d",$timestamp);
  39. $now = $utcdate."T".$uhrzeit;
  40.  
  41. // Umrechnung Lufttemperatur von F in C
  42. $tempc = ($tempf - 32) * (5/9);
  43. $tempc = round($tempc, 1);
  44.  
  45. //Umrechnung Taupunkt von F in C
  46. $dewptc = ($dewptf - 32) * (5/9);
  47. $dewptc = round($dewptc, 1);
  48.  
  49. //Umrechnung Windchill von F in C
  50. $wct_c = ($windchillf - 32) * (5/9);
  51. $wct_c = round($wct_c, 1);
  52.  
  53. //Umrechnung Inndoortemp von F in C
  54. $indoortemp_c = ($indoortempf - 32) * (5/9);
  55. $indoortemp_c = round($indoortemp_c, 1);
  56.  
  57. //Umrechnung Rel. Luftdruck von inHG in hPA
  58. $relpres = ($baromin * 33.862);
  59. $relpres = round($relpres, 1);
  60.  
  61. //Umrechnung Abs. Luftdruck von inHG in hPA
  62. $abspres = ($absbaromin * 33.862);
  63. $abspres = round($abspres, 1);
  64. settype($wind_gust_mph,"float");
  65.  
  66. //Umrechnung Windgeschwindigkeit von mph zu kmh
  67. $windkmh = ($windspeedmph * 1.6);
  68. settype($windkmh,"float");
  69. $windkmh = round($windkmh, 1);
  70.  
  71. //Umrechnung Windboeengeschwindigkeit von mph zu kmh
  72. $windgustkmh = ($windgustmph * 1.6);
  73. settype($windgustkmh,"float");
  74. $windgustkmh = round($windgustkmh, 1);
  75.  
  76. //Umrechnung Niederschlag Stunde
  77. $rain = ($rainin * 25.4);
  78. $rain = round($rain, 2);
  79.  
  80. //Umrechnung Niederschlag Tag
  81. $raind = ($dailyrainin * 25.4);
  82. $raind = round($raind, 1);
  83.  
  84. //Umrechnung Niederschlag Woche
  85. $rainw = ($weeklyrainin * 25.4);
  86. $rainw = round($rainw, 1);
  87.  
  88. //Umrechnung Niederschlag Monat
  89. $rainm = ($monthlyrainin * 25.4);
  90. $rainm = round($rainm, 1);
  91.  
  92. //Umrechnung Niederschlag Jahr
  93. $rainj = ($yearlyrainin * 25.4);
  94. $rainj = round($rainj, 1);
  95.  
  96. // Funktion zum Errechnen der Beaufort-Werte der derzeitigen Windgeschwindigkeit
  97.  
  98. function kmh2bft($windkmh)
  99. {
  100. $val = round($windkmh);
  101. if($val > 117) {$bft = 12;}
  102. if($val <= 117) {$bft = 11;}
  103. if($val < 103) {$bft = 10;}
  104. if($val < 89) {$bft = 9;}
  105. if($val < 75) {$bft = 8;}
  106. if($val < 62) {$bft = 7;}
  107. if($val < 50) {$bft = 6;}
  108. if($val < 39) {$bft = 5;}
  109. if($val < 29) {$bft = 4;}
  110. if($val < 20) {$bft = 3;}
  111. if($val < 12) {$bft = 2;}
  112. if($val < 6) {$bft = 1;}
  113. if($val < 3) {$bft = 0;}
  114. return $bft;
  115. }
  116.  
  117. // Funktion zum Errechnen der Beaufort-Werte der derzeitigen Windböen
  118.  
  119. function kmhgust2bft($windgustkmh)
  120. {
  121. $valgust = round($windgustkmh);
  122. if($valgust > 117) {$bftgust = 12;}
  123. if($valgust <= 117) {$bftgust = 11;}
  124. if($valgust < 103) {$bftgust = 10;}
  125. if($valgust < 89) {$bftgust = 9;}
  126. if($valgust < 75) {$bftgust = 8;}
  127. if($valgust < 62) {$bftgust = 7;}
  128. if($valgust < 50) {$bftgust = 6;}
  129. if($valgust < 39) {$bftgust = 5;}
  130. if($valgust < 29) {$bftgust = 4;}
  131. if($valgust < 20) {$bftgust = 3;}
  132. if($valgust < 12) {$bftgust = 2;}
  133. if($valgust < 6) {$bftgust = 1;}
  134. if($valgust < 3) {$bftgust = 0;}
  135. return $bftgust;
  136. }
  137.  
  138. // Array zur Zuweisung Werte zu Beaufort-Beschreibung
  139.  
  140. $bfttext = array( "12" => "Orkan",
  141. "11" => "orkanartiger Sturm",
  142. "10" => "schwerer Sturm",
  143. "9" => "Sturm",
  144. "8" => "st&uuml;rmischer Wind",
  145. "7" => "steifer Wind",
  146. "6" => "starker Wind",
  147. "5" => "frische Brise",
  148. "4" => "m&auml;&szlig;ige Brise",
  149. "3" => "schwache Brise",
  150. "2" => "leichte Brise",
  151. "1" => "leiser Zug",
  152. "0" => "still");
  153.  
  154. // Ermittlung Beaufort Werte und Beschreibungen
  155. $windbft = kmh2bft($windkmh);
  156. $gustbft = kmhgust2bft($windgustkmh);
  157. $windbfttext = $bfttext[kmh2bft($windkmh)];
  158. $gustbfttext = $bfttext[kmh2bft($windgustkmh)];
  159.  
  160. // Ermittlung UV-Index Beschreibung
  161. if ($UV <= 2)
  162. {
  163. $uvtext = "Niedrig";
  164. }
  165. if ($uv >= 3 AND $uv <= 5)
  166. {
  167. $uvtext = "Mittel";
  168. }
  169. if ($uv >= 6 AND $uv <= 7)
  170. {
  171. $uvtext = "Hoch";
  172. }
  173. if ($uv >= 8 AND $uv <= 10)
  174. {
  175. $uvtext = "Sehr hoch";
  176. }
  177. if ($uv >= 11)
  178. {
  179. $uvtext = "Extrem";
  180. }
  181.  
  182. // Ermitteln Sonnenaufgang, Sonnenuntergang anhand der GPS-Koordinaten und der Zeitzone
  183. $gmt_offset = 1;
  184. $zenith=90+50/60;
  185. $sunset = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, 52.610935, 13.243770, $zenith, $gmt_offset);
  186. $sunrise= date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, 52.610935, 13.243770, $zenith, $gmt_offset);
  187. $sunset = date("H:i",$sunset);
  188. $sunrise = date("H:i",$sunrise);
  189.  
  190. // Ermitteln der Mondphase (Danke an Peter Ressel für den Code http://www.die-seite.eu/wm-mondphasen.php)
  191. $ursprung = mktime(18,31,18,12,22,1999);
  192. $akt_date = time();
  193. define("ZYCLUS", floor(29.530588861 * 86400));
  194. $mondphase = round(((($akt_date - $ursprung) / ZYCLUS) - floor(($akt_date - $ursprung) / ZYCLUS)) * 100, 0);
  195.  
  196. if ($mondphase <= 1 || $mondphase >= 99 ) $phase_text = "Vollmond";
  197. elseif ($mondphase > 1 && $mondphase < 49) $phase_text = "abnehmender Mond";
  198. elseif ($mondphase >= 49 && $mondphase <= 51) $phase_text = "Neumond";
  199. else $phase_text = "zunehmender Mond";
  200.  
  201. // Ermittlung Windrichtungen kurz und lang
  202. function getWindDirShortName($wd1)
  203. {
  204. $WindDirShortNames = array("N", "NNO", "NO", "ONO", "O", "OSO", "SO", "SSO", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW");
  205. $WindDirShortName = $WindDirShortNames[(int)(round($wd1 / 22.5))];
  206.  
  207. return $WindDirShortName;
  208. }
  209.  
  210. function getWindDirLongName($wd2)
  211. {
  212. $WindDirLongNames = array("NORD", "NORDNORDOST", "NORDOST", "OSTNORDOST", "OST", "OSTSUEDOST", "SUEDOST", "SUEDSUEDOST", "SUED", "SUEDSUEDWEST", "SUEDWEST", "WESTSUEDWEST", "WEST", "WESTNORDWEST", "NORDWEST", "NORDNORDWEST");
  213. $WindDirLongName = $WindDirLongNames[(int)(round($wd2 / 22.5))];
  214.  
  215. return $WindDirLongName;
  216. }
  217.  
  218. $winddirkurz = getWindDirShortName($winddir);
  219. $winddirlang = getWindDirLongName ($winddir);
  220.  
  221. // Runden der Sonnenstrahlung (Ganzzahl)
  222. $solarradiation = round($solarradiation, 0);
  223.  
  224. //XML-Schreiben
  225. if(!$xmlw=simplexml_load_file('akt_wetterdaten.xml')){
  226. trigger_error("Error reading XML file",E_USER_ERROR);
  227. }
  228.  
  229. $xmlw->sektion02->gruppe02->date_time = $now;
  230. $xmlw->sektion02->gruppe02->date = $datum;
  231. $xmlw->sektion02->gruppe02->time = $uhrzeit;
  232. $xmlw->sektion02->gruppe03->temp_air_2m_0_c = $tempc;
  233. $xmlw->sektion02->gruppe03->temp_dewpoint_c = $dewptc;
  234. $xmlw->sektion02->gruppe03->temp_wct_c = $wct_c;
  235. $xmlw->sektion02->gruppe04->humidity = $humidity;
  236. $xmlw->sektion02->gruppe04->baromin = $relpres;
  237. $xmlw->sektion02->gruppe04->absbaromin = $abspres;
  238. $xmlw->sektion02->gruppe05->windspeed = $windkmh;
  239. $xmlw->sektion02->gruppe05->windbft = $windbft;
  240. $xmlw->sektion02->gruppe05->windbfttxt =$windbfttext;
  241. $xmlw->sektion02->gruppe05->windgust = $windgustkmh;
  242. $xmlw->sektion02->gruppe05->gustbft = $gustbft;
  243. $xmlw->sektion02->gruppe05->gustbfttxt =$gustbfttext;
  244. $xmlw->sektion02->gruppe05->winddir = $winddir;
  245. $xmlw->sektion02->gruppe06->rainin = $rain;
  246. $xmlw->sektion02->gruppe06->dailyrainin = $raind;
  247. $xmlw->sektion02->gruppe06->weeklyrainin = $rainw;
  248. $xmlw->sektion02->gruppe06->monthlyrainin = $rainm;
  249. $xmlw->sektion02->gruppe06->yearlyrainin = $rainj;
  250. $xmlw->sektion02->gruppe08->solar_radiation_0 = $solarradiation;
  251. $xmlw->sektion02->gruppe08->uvi_0 = $UV;
  252. $xmlw->sektion02->gruppe08->uvi_txt = $uvtext;
  253. $xmlw->sektion02->gruppe99->indoortemp_c = $indoortemp_c;
  254. $xmlw->sektion02->gruppe99->indoorhumidity = $indoorhumidity;
  255. $xmlw->sektion02->gruppe99->sunset = $sunset;
  256. $xmlw->sektion02->gruppe99->sunrise = $sunrise;
  257. $xmlw->sektion02->gruppe99->mondphase = $phase_text;
  258. $xmlw->sektion02->gruppe99->winddirkurz = $winddirkurz;
  259. $xmlw->sektion02->gruppe99->winddirlang = $winddirlang;
  260.  
  261. $handle = fopen('akt_wetterdaten.xml', "wb");
  262. fwrite($handle, $xmlw->asXML());
  263.  
  264. fclose($handle);
  265.  
  266. // www.wunderground.com (WU) updaten
  267. $url = fopen("http://weatherstation.wunderground.com/weatherstation/updateweatherstation.php?ID=$ID&PASSWORD=$PASSWORD&action=$action&dateutc=$dateutc&tempf=$tempf&dewptf=$dewptf&humidity=$humidity&winddir=$winddir&windspeedmph=$windspeedmph&windgustmph=$windgustmph&UV=$UV&solarradiation=$solarradiation&baromin=$baromin&rainin=$rainin&dailyrainin=$dailyrainin&realtime=$realtime", "r");
  268. fclose($url);
  269.  
  270. echo "success";
  271. ?>



Zurück