77_UWZ.pm 106 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690
  1. ####################################################################################################
  2. #
  3. # 77_UWZ.pm
  4. #
  5. # (c) 2015-2016 Tobias D. Oestreicher
  6. #
  7. # Special thanks goes to comitters:
  8. # - Marko Oldenburg (leongaultier at gmail dot com)
  9. # - Hanjo (Forum) patch for sort by creation
  10. # - cb1 <kontakt@it-buchinger.de> patch Replace Iconv with native perl encode()
  11. #
  12. # Storm warnings from unwetterzentrale.de
  13. # inspired by 59_PROPLANTA.pm
  14. #
  15. # Copyright notice
  16. #
  17. # This script is free software; you can redistribute it and/or modify
  18. # it under the terms of the GNU General Public License as published by
  19. # the Free Software Foundation; either version 2 of the License, or
  20. # (at your option) any later version.
  21. #
  22. # The GNU General Public License can be found at
  23. # http://www.gnu.org/copyleft/gpl.html.
  24. # A copy is found in the text file GPL.txt and important notices to the license
  25. # from the author is found in LICENSE.txt distributed with these scripts.
  26. #
  27. # This script is distributed in the hope that it will be useful,
  28. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  29. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  30. # GNU General Public License for more details.
  31. #
  32. # This copyright notice MUST APPEAR in all copies of the script!
  33. #
  34. #
  35. #
  36. # $Id: 77_UWZ.pm 17646 2018-10-30 11:20:16Z CoolTux $
  37. #
  38. ####################################################################################################
  39. # also a thanks goes to hexenmeister
  40. ##############################################
  41. package main;
  42. use strict;
  43. use feature qw/say switch/;
  44. use warnings;
  45. no if $] >= 5.017011, warnings => 'experimental::lexical_subs','experimental::smartmatch';
  46. my $missingModul;
  47. eval "use LWP::UserAgent;1" or $missingModul .= "LWP::UserAgent ";
  48. eval "use LWP::Simple;1" or $missingModul .= "LWP::Simple ";
  49. eval "use HTTP::Request;1" or $missingModul .= "HTTP::Request ";
  50. eval "use HTML::Parser;1" or $missingModul .= "HTML::Parser ";
  51. eval "use JSON;1" or $missingModul .= "JSON ";
  52. eval "use Encode::Guess;1" or $missingModul .= "Encode::Guess ";
  53. require 'Blocking.pm';
  54. require 'HttpUtils.pm';
  55. use vars qw($readingFnAttributes);
  56. use vars qw(%defs);
  57. my @DEweekdays = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
  58. my @DEmonths = ( "Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
  59. my @NLweekdays = qw(zondag maandag dinsdag woensdag donderdag vrijdag zaterdag);
  60. my @NLmonths = ("januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december");
  61. my @FRweekdays = qw(dimanche lundi mardi mercredi jeudi vendredi samedi);
  62. my @FRmonths = ("janvier","février","mars","avril","mai","juin","juillet","août","september","octobre","novembre","decembre");
  63. my @ENweekdays = qw(sunday monday thuesday wednesday thursday friday saturday);
  64. my @ENmonths = ("January","February","March","April","Mäy","June","July","August","September","October","November","December");
  65. my $MODUL = "UWZ";
  66. my $version = "2.0.3";
  67. # Declare functions
  68. sub UWZ_Log($$$);
  69. sub UWZ_Map2Movie($$);
  70. sub UWZ_Map2Image($$);
  71. sub UWZ_Initialize($);
  72. sub UWZ_Define($$);
  73. sub UWZ_Undef($$);
  74. sub UWZ_Set($@);
  75. sub UWZ_Get($@);
  76. sub UWZ_GetCurrent($@);
  77. sub UWZ_GetCurrentHail($);
  78. sub UWZ_JSONAcquire($$);
  79. sub UWZ_Start($);
  80. sub UWZ_Aborted($);
  81. sub UWZ_Done($);
  82. sub UWZ_Run($);
  83. sub UWZAsHtml($;$);
  84. sub UWZAsHtmlLite($;$);
  85. sub UWZAsHtmlFP($;$);
  86. sub UWZAsHtmlMovie($$);
  87. sub UWZAsHtmlKarteLand($$);
  88. sub UWZ_GetSeverityColor($$);
  89. sub UWZ_GetUWZLevel($$);
  90. sub UWZSearchLatLon($$);
  91. sub UWZSearchAreaID($$);
  92. sub UWZ_IntervalAtWarnLevel($);
  93. my $countrycode = "DE";
  94. my $plz = "77777";
  95. my $uwz_alert_url = "http://feed.alertspro.meteogroup.com/AlertsPro/AlertsProPollService.php?method=getWarning&language=de&areaID=UWZ" . $countrycode . $plz;
  96. ########################################
  97. sub UWZ_Log($$$) {
  98. my ( $hash, $loglevel, $text ) = @_;
  99. my $xline = ( caller(0) )[2];
  100. my $xsubroutine = ( caller(1) )[3];
  101. my $sub = ( split( ':', $xsubroutine ) )[2];
  102. $sub =~ s/UWZ_//;
  103. my $instName = ( ref($hash) eq "HASH" ) ? $hash->{NAME} : $hash;
  104. Log3 $instName, $loglevel, "$MODUL $instName: $sub.$xline " . $text;
  105. }
  106. ########################################
  107. sub UWZ_Map2Movie($$) {
  108. my $uwz_movie_url = "http://www.meteocentrale.ch/uploads/media/";
  109. my ( $hash, $smap ) = @_;
  110. my $lmap;
  111. $smap=lc($smap);
  112. ## Euro
  113. $lmap->{'niederschlag-wolken'}=$uwz_movie_url.'UWZ_EUROPE_COMPLETE_niwofi.mp4';
  114. $lmap->{'stroemung'}=$uwz_movie_url.'UWZ_EUROPE_COMPLETE_stfi.mp4';
  115. $lmap->{'temperatur'}=$uwz_movie_url.'UWZ_EUROPE_COMPLETE_theta_E.mp4';
  116. ## DE
  117. $lmap->{'niederschlag-wolken-de'}=$uwz_movie_url.'UWZ_EUROPE_GERMANY_COMPLETE_niwofi.mp4';
  118. $lmap->{'stroemung-de'}=$uwz_movie_url.'UWZ_EUROPE_GERMANY_COMPLETE_stfi.mp4';
  119. ## CH
  120. $lmap->{'niederschlag-wolken-ch'}=$uwz_movie_url.'UWZ_EUROPE_SWITZERLAND_COMPLETE_niwofi.mp4';
  121. $lmap->{'stroemung-ch'}=$uwz_movie_url.'UWZ_EUROPE_SWITZERLAND_COMPLETE_stfi.mp4';
  122. ## AT
  123. $lmap->{'niederschlag-wolken-at'}=$uwz_movie_url.'UWZ_EUROPE_AUSTRIA_COMPLETE_niwofi.mp4';
  124. $lmap->{'stroemung-at'}=$uwz_movie_url.'UWZ_EUROPE_AUSTRIA_COMPLETE_stfi.mp4';
  125. ## NL
  126. $lmap->{'neerslag-wolken-nl'}=$uwz_movie_url.'UWZ_EUROPE_BENELUX_COMPLETE_niwofi.mp4';
  127. $lmap->{'stroming-nl'}=$uwz_movie_url.'UWZ_EUROPE_BENELUX_COMPLETE_stfi.mp4';
  128. ## FR
  129. $lmap->{'nuages-precipitations-fr'}=$uwz_movie_url.'UWZ_EUROPE_FRANCE_COMPLETE_niwofi.mp4';
  130. $lmap->{'courants-fr'}=$uwz_movie_url.'UWZ_EUROPE_FRANCE_COMPLETE_stfi.mp4';
  131. ## UK
  132. $lmap->{'clouds-precipitation-uk'}=$uwz_movie_url.'UWZ_EUROPE_GREATBRITAIN_COMPLETE_niwofi.mp4';
  133. $lmap->{'currents-uk'}=$uwz_movie_url.'UWZ_EUROPE_GREATBRITAIN_COMPLETE_stfi.mp4';
  134. ## IT
  135. $lmap->{'niederschlag-wolken-it'}=$uwz_movie_url.'UWZ_EUROPE_ITALY_COMPLETE_niwofi.mp4';
  136. $lmap->{'stroemung-it'}=$uwz_movie_url.'UWZ_EUROPE_ITALY_COMPLETE_stfi.mp4';
  137. return $lmap->{$smap};
  138. }
  139. ########################################
  140. sub UWZ_Map2Image($$) {
  141. my $uwz_de_url = "http://www.unwetterzentrale.de/images/map/";
  142. my $uwz_at_url = "http://unwetter.wetteralarm.at/images/map/";
  143. my $uwz_ch_url = "http://alarm.meteocentrale.ch/images/map/";
  144. my $uwz_en_url = "http://warnings.severe-weather-centre.co.uk/images/map/";
  145. my $uwz_li_url = "http://alarm.meteocentrale.li/images/map/";
  146. my $uwz_be_url = "http://alarm.meteo-info.be/images/map/";
  147. my $uwz_dk_url = "http://alarm.vejrcentral.dk/images/map/";
  148. my $uwz_fi_url = "http://vaaratasot.saa-varoitukset.fi/images/map/";
  149. my $uwz_fr_url = "http://alerte.vigilance-meteo.fr/images/map/";
  150. my $uwz_lu_url = "http://alarm.meteozentral.lu/images/map/";
  151. my $uwz_nl_url = "http://alarm.noodweercentrale.nl/images/map/";
  152. my $uwz_no_url = "http://advarsler.vaer-sentral.no/images/map/";
  153. my $uwz_pt_url = "http://avisos.centrometeo.pt/images/map/";
  154. my $uwz_se_url = "http://varningar.vader-alarm.se/images/map/";
  155. my $uwz_es_url = "http://avisos.alertas-tiempo.es/images/map/";
  156. my $uwz_it_url = "http://allarmi.meteo-allerta.it/images/map/";
  157. my ( $hash, $smap ) = @_;
  158. my $lmap;
  159. $smap=lc($smap);
  160. ## Euro
  161. $lmap->{'europa'}=$uwz_de_url.'europe_index.png';
  162. ## DE
  163. $lmap->{'deutschland'}=$uwz_de_url.'deutschland_index.png';
  164. $lmap->{'deutschland-small'}=$uwz_de_url.'deutschland_preview.png';
  165. $lmap->{'niedersachsen'}=$uwz_de_url.'niedersachsen_index.png';
  166. $lmap->{'bremen'}=$uwz_de_url.'niedersachsen_index.png';
  167. $lmap->{'bayern'}=$uwz_de_url.'bayern_index.png';
  168. $lmap->{'schleswig-holstein'}=$uwz_de_url.'schleswig_index.png';
  169. $lmap->{'hamburg'}=$uwz_de_url.'schleswig_index.png';
  170. $lmap->{'mecklenburg-vorpommern'}=$uwz_de_url.'meckpom_index.png';
  171. $lmap->{'sachsen'}=$uwz_de_url.'sachsen_index.png';
  172. $lmap->{'sachsen-anhalt'}=$uwz_de_url.'sachsenanhalt_index.png';
  173. $lmap->{'nordrhein-westfalen'}=$uwz_de_url.'nrw_index.png';
  174. $lmap->{'thueringen'}=$uwz_de_url.'thueringen_index.png';
  175. $lmap->{'rheinland-pfalz'}=$uwz_de_url.'rlp_index.png';
  176. $lmap->{'saarland'}=$uwz_de_url.'rlp_index.png';
  177. $lmap->{'baden-wuerttemberg'}=$uwz_de_url.'badenwuerttemberg_index.png';
  178. $lmap->{'hessen'}=$uwz_de_url.'hessen_index.png';
  179. $lmap->{'brandenburg'}=$uwz_de_url.'brandenburg_index.png';
  180. $lmap->{'berlin'}=$uwz_de_url.'brandenburg_index.png';
  181. ## AT
  182. $lmap->{'oesterreich'}=$uwz_at_url.'oesterreich_index.png';
  183. $lmap->{'burgenland'}=$uwz_at_url.'burgenland_index.png';
  184. $lmap->{'kaernten'}=$uwz_at_url.'kaernten_index.png';
  185. $lmap->{'niederoesterreich'}=$uwz_at_url.'niederoesterreich_index.png';
  186. $lmap->{'oberoesterreich'}=$uwz_at_url.'oberoesterreich_index.png';
  187. $lmap->{'salzburg'}=$uwz_at_url.'salzburg_index.png';
  188. $lmap->{'steiermark'}=$uwz_at_url.'steiermark_index.png';
  189. $lmap->{'tirol'}=$uwz_at_url.'tirol_index.png';
  190. $lmap->{'vorarlberg'}=$uwz_at_url.'vorarlberg_index.png';
  191. $lmap->{'wien'}=$uwz_at_url.'wien_index.png';
  192. ## CH
  193. $lmap->{'schweiz'}=$uwz_ch_url.'schweiz_index.png';
  194. $lmap->{'aargau'}=$uwz_ch_url.'aargau_index.png';
  195. $lmap->{'appenzell_ausserrhoden'}=$uwz_ch_url.'appenzell_ausserrhoden_index.png';
  196. $lmap->{'appenzell_innerrhoden'}=$uwz_ch_url.'appenzell_innerrhoden_index.png';
  197. $lmap->{'basel_landschaft'}=$uwz_ch_url.'basel_landschaft_index.png';
  198. $lmap->{'basel_stadt'}=$uwz_ch_url.'basel_stadt_index.png';
  199. $lmap->{'bern'}=$uwz_ch_url.'bern_index.png';
  200. $lmap->{'fribourg'}=$uwz_ch_url.'fribourg_index.png';
  201. $lmap->{'geneve'}=$uwz_ch_url.'geneve_index.png';
  202. $lmap->{'glarus'}=$uwz_ch_url.'glarus_index.png';
  203. $lmap->{'graubuenden'}=$uwz_ch_url.'graubuenden_index.png';
  204. $lmap->{'jura'}=$uwz_ch_url.'jura_index.png';
  205. $lmap->{'luzern'}=$uwz_ch_url.'luzern_index.png';
  206. $lmap->{'neuchatel'}=$uwz_ch_url.'neuchatel_index.png';
  207. $lmap->{'nidwalden'}=$uwz_ch_url.'nidwalden_index.png';
  208. $lmap->{'obwalden'}=$uwz_ch_url.'obwalden_index.png';
  209. $lmap->{'schaffhausen'}=$uwz_ch_url.'schaffhausen_index.png';
  210. $lmap->{'schwyz'}=$uwz_ch_url.'schwyz_index.png';
  211. $lmap->{'solothurn'}=$uwz_ch_url.'solothurn_index.png';
  212. $lmap->{'stgallen'}=$uwz_ch_url.'stgallen_index.png';
  213. $lmap->{'ticino'}=$uwz_ch_url.'ticino_index.png';
  214. $lmap->{'thurgau'}=$uwz_ch_url.'thurgau_index.png';
  215. $lmap->{'uri'}=$uwz_ch_url.'uri_index.png';
  216. $lmap->{'waadt'}=$uwz_ch_url.'waadt_index.png';
  217. $lmap->{'wallis'}=$uwz_ch_url.'wallis_index.png';
  218. $lmap->{'zug'}=$uwz_ch_url.'zug_index.png';
  219. $lmap->{'zuerich'}=$uwz_ch_url.'zuerich_index.png';
  220. ## LI
  221. $lmap->{'liechtenstein'}=$uwz_li_url.'liechtenstein_index.png';
  222. ## UK
  223. $lmap->{'unitedkingdom'}=$uwz_en_url.'unitedkingdom_index.png';
  224. $lmap->{'eastofengland'}=$uwz_en_url.'eastofengland_index.png';
  225. $lmap->{'eastmidlands'}=$uwz_en_url.'eastmidlands-index.png';
  226. $lmap->{'london'}=$uwz_en_url.'london-index.png';
  227. $lmap->{'northeastengland'}=$uwz_en_url.'northeastengland-index.png';
  228. $lmap->{'northernireland'}=$uwz_en_url.'northernireland-index.png';
  229. $lmap->{'northwestengland'}=$uwz_en_url.'northwestengland-index.png';
  230. $lmap->{'scotland'}=$uwz_en_url.'scotland-index.png';
  231. $lmap->{'southeastengland'}=$uwz_en_url.'southeastengland-index.png';
  232. $lmap->{'southwestengland'}=$uwz_en_url.'southwestengland-index.png';
  233. $lmap->{'wales'}=$uwz_en_url.'wales-index.png';
  234. $lmap->{'westmidlands'}=$uwz_en_url.'westmidlands-index.png';
  235. $lmap->{'yorkshireandthehumber'}=$uwz_en_url.'yorkshireandthehumber-index.png';
  236. ## BE
  237. $lmap->{'belgique'}=$uwz_be_url.'belgique_index.png';
  238. ## DK
  239. $lmap->{'denmark'}=$uwz_dk_url.'denmark_index.png';
  240. ## FI
  241. $lmap->{'finnland'}=$uwz_fi_url.'finnland_index.png';
  242. ## FR
  243. $lmap->{'france'}=$uwz_fr_url.'france_index.png';
  244. $lmap->{'alsace'}=$uwz_fr_url.'alsace_index.png';
  245. $lmap->{'aquitaine'}=$uwz_fr_url.'aquitaine_index.png';
  246. $lmap->{'basse-normandie'}=$uwz_fr_url.'basse-normandie_index.png';
  247. $lmap->{'bretagne'}=$uwz_fr_url.'bretagne_index.png';
  248. $lmap->{'champagne-ardenne'}=$uwz_fr_url.'champagne-ardenne_index.png';
  249. $lmap->{'franche-comte'}=$uwz_fr_url.'franche-comte_index.png';
  250. $lmap->{'haute-normandie'}=$uwz_fr_url.'haute-normandie_index.png';
  251. $lmap->{'ile-de-france'}=$uwz_fr_url.'ile-de-france_index.png';
  252. $lmap->{'languedoc-roussillon'}=$uwz_fr_url.'languedoc-roussillon_index.png';
  253. $lmap->{'limousin'}=$uwz_fr_url.'limousin_index.png';
  254. $lmap->{'lorraine'}=$uwz_fr_url.'lorraine_index.png';
  255. $lmap->{'bourgogne'}=$uwz_fr_url.'bourgogne_index.png';
  256. $lmap->{'centre'}=$uwz_fr_url.'centre_index.png';
  257. $lmap->{'midi-pyrenees'}=$uwz_fr_url.'midi-pyrenees_index.png';
  258. $lmap->{'nord-pas-de-calais'}=$uwz_fr_url.'nord-pas-de-calais_index.png';
  259. $lmap->{'pays-de-la-loire'}=$uwz_fr_url.'pays-de-la-loire_index.png';
  260. $lmap->{'picardie'}=$uwz_fr_url.'picardie_index.png';
  261. $lmap->{'poitou-charentes'}=$uwz_fr_url.'poitou-charentes_index.png';
  262. $lmap->{'provence-alpes-cote-dazur'}=$uwz_fr_url.'provence-alpes-cote-dazur_index.png';
  263. $lmap->{'rhone-alpes'}=$uwz_fr_url.'rhone-alpes_index.png';
  264. ## LU
  265. $lmap->{'letzebuerg'}=$uwz_lu_url.'letzebuerg_index.png';
  266. ## NL
  267. $lmap->{'nederland'}=$uwz_nl_url.'nederland_index.png';
  268. $lmap->{'drenthe'}=$uwz_nl_url.'drenthe_index.png';
  269. $lmap->{'flevoland'}=$uwz_nl_url.'flevoland_index.png';
  270. $lmap->{'friesland'}=$uwz_nl_url.'friesland_index.png';
  271. $lmap->{'gelderland'}=$uwz_nl_url.'gelderland_index.png';
  272. $lmap->{'groningen'}=$uwz_nl_url.'groningen_index.png';
  273. $lmap->{'limburg'}=$uwz_nl_url.'limburg_index.png';
  274. $lmap->{'noordbrabant'}=$uwz_nl_url.'noordbrabant_index.png';
  275. $lmap->{'noordholland'}=$uwz_nl_url.'noordholland_index.png';
  276. $lmap->{'overijssel'}=$uwz_nl_url.'overijssel_index.png';
  277. $lmap->{'utrecht'}=$uwz_nl_url.'utrecht_index.png';
  278. $lmap->{'zeeland'}=$uwz_nl_url.'zeeland_index.png';
  279. $lmap->{'zuidholland'}=$uwz_nl_url.'zuidholland_index.png';
  280. ## NO
  281. $lmap->{'norwegen'}=$uwz_no_url.'norwegen_index.png';
  282. ## PT
  283. $lmap->{'portugal'}=$uwz_pt_url.'portugal_index.png';
  284. ## SE
  285. $lmap->{'sverige'}=$uwz_se_url.'sverige_index.png';
  286. ## ES
  287. $lmap->{'espana'}=$uwz_es_url.'espana_index.png';
  288. ## IT
  289. $lmap->{'italia'}=$uwz_it_url.'italia_index.png';
  290. $lmap->{'valledaosta'}=$uwz_it_url.'valledaosta_index.png';
  291. $lmap->{'piemonte'}=$uwz_it_url.'piemonte_index.png';
  292. $lmap->{'lombardia'}=$uwz_it_url.'lombardia_index.png';
  293. $lmap->{'trentinoaltoadige'}=$uwz_it_url.'trentinoaltoadige_index.png';
  294. $lmap->{'friuliveneziagiulia'}=$uwz_it_url.'friuliveneziagiulia_index.png';
  295. $lmap->{'veneto'}=$uwz_it_url.'veneto_index.png';
  296. $lmap->{'liguria'}=$uwz_it_url.'liguria_index.png';
  297. $lmap->{'emiliaromagna'}=$uwz_it_url.'emiliaromagna_index.png';
  298. $lmap->{'toscana'}=$uwz_it_url.'toscana_index.png';
  299. $lmap->{'marche'}=$uwz_it_url.'marche_index.png';
  300. $lmap->{'umbria'}=$uwz_it_url.'umbria_index.png';
  301. $lmap->{'lazio'}=$uwz_it_url.'lazio_index.png';
  302. $lmap->{'molise'}=$uwz_it_url.'molise_index.png';
  303. $lmap->{'abruzzo'}=$uwz_it_url.'abruzzo_index.png';
  304. $lmap->{'campania'}=$uwz_it_url.'campania_index.png';
  305. $lmap->{'puglia'}=$uwz_it_url.'puglia_index.png';
  306. $lmap->{'basilicata'}=$uwz_it_url.'basilicata_index.png';
  307. $lmap->{'calabria'}=$uwz_it_url.'calabria_index.png';
  308. $lmap->{'sicilia'}=$uwz_it_url.'sicilia_index.png';
  309. $lmap->{'sardegna'}=$uwz_it_url.'sardegna_index.png';
  310. ## Isobaren
  311. $lmap->{'isobaren1'}="http://www.unwetterzentrale.de/images/icons/UWZ_ISO_00.jpg";
  312. $lmap->{'isobaren2'}="http://www.wetteralarm.at/uploads/pics/UWZ_EURO_ISO_GER_00.jpg";
  313. $lmap->{'isobaren3'}="http://www.severe-weather-centre.co.uk/uploads/pics/UWZ_EURO_ISO_ENG_00.jpg";
  314. return $lmap->{$smap};
  315. }
  316. ###################################
  317. sub UWZ_Initialize($) {
  318. my ($hash) = @_;
  319. $hash->{DefFn} = "UWZ_Define";
  320. $hash->{UndefFn} = "UWZ_Undef";
  321. $hash->{SetFn} = "UWZ_Set";
  322. $hash->{GetFn} = "UWZ_Get";
  323. $hash->{AttrList} = "download:0,1 ".
  324. "savepath ".
  325. "maps ".
  326. "humanreadable:0,1 ".
  327. "htmlattr ".
  328. "htmltitle ".
  329. "htmltitleclass ".
  330. "htmlsequence:ascending,descending ".
  331. "lang ".
  332. "sort_readings_by:severity,start,creation ".
  333. "localiconbase ".
  334. "intervalAtWarnLevel ".
  335. "disable:1 ".
  336. $readingFnAttributes;
  337. foreach my $d(sort keys %{$modules{UWZ}{defptr}}) {
  338. my $hash = $modules{UWZ}{defptr}{$d};
  339. $hash->{VERSION} = $version;
  340. }
  341. }
  342. ###################################
  343. sub UWZ_Define($$) {
  344. my ( $hash, $def ) = @_;
  345. my $name = $hash->{NAME};
  346. my $lang = "";
  347. my @a = split( "[ \t][ \t]*", $def );
  348. return "Error: Perl moduls ".$missingModul."are missing on this system" if( $missingModul );
  349. return "Wrong syntax: use define <name> UWZ <CountryCode> <PLZ> <Interval> " if (int(@a) != 5 and ((lc $a[2]) ne "search"));
  350. if ((lc $a[2]) ne "search") {
  351. $hash->{STATE} = "Initializing";
  352. $hash->{CountryCode} = $a[2];
  353. $hash->{PLZ} = $a[3];
  354. ## URL by CountryCode
  355. my $URL_language="en";
  356. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  357. $URL_language="de";
  358. }
  359. if ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  360. $URL_language="nl";
  361. }
  362. if ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  363. $URL_language="fr";
  364. }
  365. $hash->{URL} = "http://feed.alertspro.meteogroup.com/AlertsPro/AlertsProPollService.php?method=getWarning&language=" . $URL_language . "&areaID=UWZ" . $a[2] . $a[3];
  366. $hash->{fhem}{LOCAL} = 0;
  367. $hash->{INTERVAL} = $a[4];
  368. $hash->{INTERVALWARN} = 0;
  369. $hash->{VERSION} = $version;
  370. RemoveInternalTimer($hash);
  371. #Get first data after 12 seconds
  372. InternalTimer( gettimeofday() + 12, "UWZ_Start", $hash, 0 ) if ((lc $hash->{CountryCode}) ne "search");
  373. } else {
  374. $hash->{STATE} = "Search-Mode";
  375. $hash->{CountryCode} = uc $a[2];
  376. $hash->{VERSION} = $version;
  377. }
  378. $modules{UWZ}{defptr}{$hash->{PLZ}} = $hash;
  379. return undef;
  380. }
  381. #####################################
  382. sub UWZ_Undef($$) {
  383. my ( $hash, $arg ) = @_;
  384. RemoveInternalTimer( $hash );
  385. BlockingKill( $hash->{helper}{RUNNING_PID} ) if ( defined( $hash->{helper}{RUNNING_PID} ) );
  386. delete($modules{UWZ}{defptr}{$hash->{PLZ}});
  387. return undef;
  388. }
  389. #####################################
  390. sub UWZ_Set($@) {
  391. my ( $hash, @a ) = @_;
  392. my $name = $hash->{NAME};
  393. my $reUINT = '^([\\+]?\\d+)$';
  394. my $usage = "Unknown argument $a[1], choose one of update:noArg " if ( (lc $hash->{CountryCode}) ne "search" );
  395. return $usage if ( @a < 2 );
  396. my $cmd = lc( $a[1] );
  397. given ($cmd)
  398. {
  399. when ("?")
  400. {
  401. return $usage;
  402. }
  403. when ("update")
  404. {
  405. UWZ_Log $hash, 4, "set command: " . $a[1];
  406. $hash->{fhem}{LOCAL} = 1;
  407. UWZ_Start($hash);
  408. $hash->{fhem}{LOCAL} = 0;
  409. }
  410. default
  411. {
  412. return $usage;
  413. }
  414. }
  415. return;
  416. }
  417. sub UWZ_Get($@) {
  418. my ( $hash, @a ) = @_;
  419. my $name = $hash->{NAME};
  420. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  421. my $usage = "Unknown argument $a[1], choose one of Sturm:noArg Schneefall:noArg Regen:noArg Extremfrost:noArg Waldbrand:noArg Gewitter:noArg Glaette:noArg Hitze:noArg Glatteisregen:noArg Bodenfrost:noArg Hagel:noArg ";
  422. return $usage if ( @a < 2 );
  423. if ($a[1] =~ /^Sturm/) { UWZ_GetCurrent($hash,2); }
  424. elsif ($a[1] =~ /^Schneefall/) { UWZ_GetCurrent($hash,3); }
  425. elsif ($a[1] =~ /^Regen/) { UWZ_GetCurrent($hash,4); }
  426. elsif ($a[1] =~ /^Extremfrost/) { UWZ_GetCurrent($hash,5); }
  427. elsif ($a[1] =~ /^Waldbrand/) { UWZ_GetCurrent($hash,6); }
  428. elsif ($a[1] =~ /^Gewitter/) { UWZ_GetCurrent($hash,7); }
  429. elsif ($a[1] =~ /^Glaette/) { UWZ_GetCurrent($hash,8); }
  430. elsif ($a[1] =~ /^Hitze/) { UWZ_GetCurrent($hash,9); }
  431. elsif ($a[1] =~ /^Glatteisregen/) { UWZ_GetCurrent($hash,10); }
  432. elsif ($a[1] =~ /^Bodenfrost/) { UWZ_GetCurrent($hash,11); }
  433. elsif ($a[1] =~ /^Hagel/) { UWZ_GetCurrentHail($hash); }
  434. else { return $usage; }
  435. }
  436. elsif ($hash->{CountryCode} ~~ [ 'NL' ] ) {
  437. my $usage = "Unknown argument $a[1], choose one of storm:noArg sneeuw:noArg regen:noArg strenge-vorst:noArg bosbrand:noArg onweer:noArg gladheid:noArg hitte:noArg ijzel:noArg grondvorst:noArg hagel:noArg ";
  438. return $usage if ( @a < 2 );
  439. if ($a[1] =~/^storm/) { UWZ_GetCurrent($hash,2); }
  440. elsif ($a[1] =~/^sneeuw/) { UWZ_GetCurrent($hash,3); }
  441. elsif ($a[1] =~/^regen/) { UWZ_GetCurrent($hash,4); }
  442. elsif ($a[1] =~/^strenge-vorst/) { UWZ_GetCurrent($hash,5); }
  443. elsif ($a[1] =~/^bosbrand/) { UWZ_GetCurrent($hash,6); }
  444. elsif ($a[1] =~/^onweer/) { UWZ_GetCurrent($hash,7); }
  445. elsif ($a[1] =~/^gladheid/) { UWZ_GetCurrent($hash,8); }
  446. elsif ($a[1] =~/^hitte/) { UWZ_GetCurrent($hash,9); }
  447. elsif ($a[1] =~/^ijzel/) { UWZ_GetCurrent($hash,10); }
  448. elsif ($a[1] =~/^grondvorst/) { UWZ_GetCurrent($hash,11); }
  449. elsif ($a[1] =~/^hagel/) { UWZ_GetCurrentHail($hash); }
  450. else { return $usage; }
  451. }
  452. elsif ($hash->{CountryCode} ~~ [ 'FR' ] ) {
  453. my $usage = "Unknown argument $a[1], choose one of tempete:noArg neige:noArg pluie:noArg strenge-vorst:noArg incendie-de-foret:noArg orage:noArg glissange:noArg canicule:noArg verglas:noArg grondvorst:noArg grele:noArg ";
  454. return $usage if ( @a < 2 );
  455. if ($a[1] =~/^tempete/) { UWZ_GetCurrent($hash,2); }
  456. elsif ($a[1] =~/^neige/) { UWZ_GetCurrent($hash,3); }
  457. elsif ($a[1] =~/^pluie/) { UWZ_GetCurrent($hash,4); }
  458. elsif ($a[1] =~/^température/) { UWZ_GetCurrent($hash,5); }
  459. elsif ($a[1] =~/^feu-de-forêt/) { UWZ_GetCurrent($hash,6); }
  460. elsif ($a[1] =~/^orage/) { UWZ_GetCurrent($hash,7); }
  461. elsif ($a[1] =~/^route-glissante/) { UWZ_GetCurrent($hash,8); }
  462. elsif ($a[1] =~/^chaleur/) { UWZ_GetCurrent($hash,9); }
  463. elsif ($a[1] =~/^pluie-de-verglas/) { UWZ_GetCurrent($hash,10); }
  464. elsif ($a[1] =~/^gelée/) { UWZ_GetCurrent($hash,11); }
  465. elsif ($a[1] =~/^grêle/) { UWZ_GetCurrentHail($hash); }
  466. else { return $usage; }
  467. }
  468. elsif ( (lc $hash->{CountryCode}) eq 'search' ) {
  469. my $usage = "Unknown argument $a[1], choose one of SearchAreaID ";
  470. return $usage if ( @a < 3 );
  471. if ($a[1] =~ /^SearchAreaID/) { UWZSearchLatLon($name, $a[2]); }
  472. elsif ($a[1] =~ /^AreaID/) { my @splitparam = split(/,/,$a[2]); UWZSearchAreaID($splitparam[0],$splitparam[1]); }
  473. else { return $usage; }
  474. } else {
  475. my $usage = "Unknown argument $a[1], choose one of storm:noArg snow:noArg rain:noArg extremfrost:noArg forest-fire:noArg thunderstorms:noArg glaze:noArg heat:noArg glazed-rain:noArg soil-frost:noArg hail:noArg ";
  476. return $usage if ( @a < 2 );
  477. if ($a[1] =~ /^storm/) { UWZ_GetCurrent($hash,2); }
  478. elsif ($a[1] =~ /^snow/) { UWZ_GetCurrent($hash,3); }
  479. elsif ($a[1] =~ /^rain/) { UWZ_GetCurrent($hash,4); }
  480. elsif ($a[1] =~ /^extremfrost/) { UWZ_GetCurrent($hash,5); }
  481. elsif ($a[1] =~ /^forest-fire/) { UWZ_GetCurrent($hash,6); }
  482. elsif ($a[1] =~ /^thunderstorms/) { UWZ_GetCurrent($hash,7); }
  483. elsif ($a[1] =~ /^glaze/) { UWZ_GetCurrent($hash,8); }
  484. elsif ($a[1] =~ /^heat/) { UWZ_GetCurrent($hash,9); }
  485. elsif ($a[1] =~ /^glazed-rain/) { UWZ_GetCurrent($hash,10); }
  486. elsif ($a[1] =~ /^soil-frost/) { UWZ_GetCurrent($hash,11); }
  487. elsif ($a[1] =~ /^hail/) { UWZ_GetCurrentHail($hash); }
  488. else { return $usage; }
  489. }
  490. }
  491. #####################################
  492. sub UWZ_GetCurrent($@) {
  493. my ( $hash, @a ) = @_;
  494. my $name = $hash->{NAME};
  495. my $out;
  496. my $curTimestamp = time();
  497. if ( ReadingsVal($name,"WarnCount", 0) eq 0 ) {
  498. $out = "inactive";
  499. } else {
  500. for(my $i= 0;$i < ReadingsVal($name,"WarnCount", 0);$i++) {
  501. if ( (ReadingsVal($name,"Warn_".$i."_Start","") le $curTimestamp) && (ReadingsVal($name,"Warn_".$i."_End","") ge $curTimestamp) && (ReadingsVal($name,"Warn_".$i."_Type","") eq $a[0]) ) {
  502. $out= "active";
  503. last;
  504. } else {
  505. $out = "inactive";
  506. }
  507. }
  508. }
  509. return $out;
  510. }
  511. #####################################
  512. sub UWZ_GetCurrentHail($) {
  513. my ( $hash ) = @_;
  514. my $name = $hash->{NAME};
  515. my $out;
  516. my $curTimestamp = time();
  517. if ( ReadingsVal($name,"WarnCount", 0) eq 0 ) {
  518. $out = "inactive";
  519. } else {
  520. for(my $i= 0;$i < ReadingsVal($name,"WarnCount", 0);$i++) {
  521. if ( (ReadingsVal($name,"Warn_".$i."_Start","") le $curTimestamp) && (ReadingsVal($name,"Warn_".$i."_End","") ge $curTimestamp) && (ReadingsVal($name,"Warn_".$i."_Hail","") eq 1) ) {
  522. $out= "active";
  523. last;
  524. } else {
  525. $out= "inactive";
  526. }
  527. }
  528. }
  529. return $out;
  530. }
  531. #####################################
  532. sub UWZ_JSONAcquire($$) {
  533. my ($hash, $URL) = @_;
  534. my $name = $hash->{NAME};
  535. return unless (defined($hash->{NAME}));
  536. UWZ_Log $hash, 4, "Start capturing of $URL";
  537. my $err_log = "";
  538. my $agent = LWP::UserAgent->new( env_proxy => 1, keep_alive => 1, protocols_allowed => ['http'], timeout => 10 );
  539. my $request = HTTP::Request->new( GET => $URL );
  540. my $response = $agent->request($request);
  541. $err_log = "Can't get $URL -- " . $response->status_line unless( $response->is_success );
  542. if ( $err_log ne "" ) {
  543. readingsSingleUpdate($hash, "lastConnection", $response->status_line, 1);
  544. UWZ_Log $hash, 1, "Error: $err_log";
  545. return "Error|Error " . $response->status_line;
  546. }
  547. UWZ_Log $hash, 4, length($response->content)." characters captured";
  548. return $response->content;
  549. }
  550. #####################################
  551. sub UWZ_Start($) {
  552. my ($hash) = @_;
  553. my $name = $hash->{NAME};
  554. return unless (defined($hash->{NAME}));
  555. if(!$hash->{fhem}{LOCAL} && $hash->{INTERVAL} > 0) { # set up timer if automatically call
  556. RemoveInternalTimer( $hash );
  557. InternalTimer(gettimeofday() + $hash->{INTERVAL}, "UWZ_Start", $hash, 1 );
  558. return undef if( IsDisabled($name) );
  559. readingsSingleUpdate($hash,'currentIntervalMode','normal',0);
  560. }
  561. ## URL by CountryCode
  562. my $URL_language="en";
  563. if (AttrVal($hash->{NAME}, "lang", undef) ) {
  564. $URL_language=AttrVal($hash->{NAME}, "lang", "");
  565. } else {
  566. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  567. $URL_language="de";
  568. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  569. $URL_language="nl";
  570. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  571. $URL_language="fr";
  572. }
  573. }
  574. $hash->{URL} = "http://feed.alertspro.meteogroup.com/AlertsPro/AlertsProPollService.php?method=getWarning&language=" . $URL_language . "&areaID=UWZ" . $hash->{CountryCode} . $hash->{PLZ};
  575. if ( not defined( $hash->{URL} ) ) {
  576. UWZ_Log $hash, 3, "missing URL";
  577. return;
  578. }
  579. $hash->{helper}{RUNNING_PID} =
  580. BlockingCall(
  581. "UWZ_Run", # callback worker task
  582. $name, # name of the device
  583. "UWZ_Done", # callback result method
  584. 120, # timeout seconds
  585. "UWZ_Aborted", # callback for abortion
  586. $hash ); # parameter for abortion
  587. }
  588. #####################################
  589. sub UWZ_Aborted($) {
  590. my ($hash) = @_;
  591. delete( $hash->{helper}{RUNNING_PID} );
  592. }
  593. #####################################
  594. # asyncronous callback by blocking
  595. sub UWZ_Done($) {
  596. my ($string) = @_;
  597. return unless ( defined($string) );
  598. # all term are separated by "|" , the first is the name of the instance
  599. my ( $name, %values ) = split( "\\|", $string );
  600. my $hash = $defs{$name};
  601. return unless ( defined($hash->{NAME}) );
  602. # delete the marker for RUNNING_PID process
  603. delete( $hash->{helper}{RUNNING_PID} );
  604. # UnWetterdaten speichern
  605. readingsBeginUpdate($hash);
  606. if ( defined $values{Error} ) {
  607. readingsBulkUpdate( $hash, "lastConnection", $values{Error} );
  608. } else {
  609. while (my ($rName, $rValue) = each(%values) ) {
  610. readingsBulkUpdate( $hash, $rName, $rValue );
  611. UWZ_Log $hash, 5, "reading:$rName value:$rValue";
  612. }
  613. if (keys %values > 0) {
  614. my $newState;
  615. UWZ_Log $hash, 4, "Delete old Readings";
  616. for my $Counter ($values{WarnCount} .. 9) {
  617. CommandDeleteReading(undef, "$hash->{NAME} Warn_${Counter}_.*");
  618. }
  619. if (defined $values{WarnCount}) {
  620. # Message by CountryCode
  621. $newState = "Warnings: " . $values{WarnCount};
  622. $newState = "Warnungen: " . $values{WarnCount} if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] );
  623. $newState = "Aantal waarschuwingen: " . $values{WarnCount} if ( $hash->{CountryCode} ~~ [ 'NL' ] );
  624. $newState = "Avertissements: " . $values{WarnCount} if ( $hash->{CountryCode} ~~ [ 'FR' ] );
  625. # end Message by CountryCode
  626. } else {
  627. $newState = "Error: Could not capture all data. Please check CountryCode and PLZ.";
  628. }
  629. readingsBulkUpdate($hash, "state", $newState);
  630. readingsBulkUpdate( $hash, "lastConnection", keys( %values )." values captured in ".$values{durationFetchReadings}." s" );
  631. UWZ_Log $hash, 4, keys( %values )." values captured";
  632. } else {
  633. readingsBulkUpdate( $hash, "lastConnection", "no data found" );
  634. UWZ_Log $hash, 1, "No data found. Check city name or URL.";
  635. }
  636. }
  637. readingsEndUpdate( $hash, 1 );
  638. if( AttrVal($name,'intervalAtWarnLevel','') ne '' and ReadingsVal($name,'WarnUWZLevel',0) > 1 ) {
  639. UWZ_IntervalAtWarnLevel($hash);
  640. UWZ_Log $hash, 5, "run Sub IntervalAtWarnLevel";
  641. }
  642. }
  643. #####################################
  644. sub UWZ_Run($) {
  645. my ($name) = @_;
  646. my $ptext=$name;
  647. my $UWZ_download;
  648. my $UWZ_savepath;
  649. my $UWZ_humanreadable;
  650. return unless ( defined($name) );
  651. my $hash = $defs{$name};
  652. return unless (defined($hash->{NAME}));
  653. my $readingStartTime = time();
  654. my $attrdownload = AttrVal( $name, 'download','');
  655. my $attrsavepath = AttrVal( $name, 'savepath','');
  656. my $maps2fetch = AttrVal( $name, 'maps','');
  657. ## begin redundant Reading switch
  658. my $attrhumanreadable = AttrVal( $name, 'humanreadable','');
  659. ## end redundant Reading switch
  660. # preset download
  661. if ($attrdownload eq "") {
  662. $UWZ_download = 0;
  663. } else {
  664. $UWZ_download = $attrdownload;
  665. }
  666. # preset savepath
  667. if ($attrsavepath eq "") {
  668. $UWZ_savepath = "/tmp/";
  669. } else {
  670. $UWZ_savepath = $attrsavepath;
  671. }
  672. # preset humanreadable
  673. if ($attrhumanreadable eq "") {
  674. $UWZ_humanreadable = 0;
  675. } else {
  676. $UWZ_humanreadable = $attrhumanreadable;
  677. }
  678. if ( $UWZ_download == 1 ) {
  679. if ( ! defined($maps2fetch) ) { $maps2fetch = "deutschland"; }
  680. UWZ_Log $hash, 4, "Maps2Fetch : ".$maps2fetch;
  681. my @maps = split(' ', $maps2fetch);
  682. my $uwz_de_url = "http://www.unwetterzentrale.de/images/map/";
  683. foreach my $smap (@maps) {
  684. UWZ_Log $hash, 4, "Download map : ".$smap;
  685. my $img = UWZ_Map2Image($hash,$smap);
  686. if (!defined($img) ) { $img=$uwz_de_url.'deutschland_index.png'; }
  687. my $code = getstore($img, $UWZ_savepath.$smap.".png");
  688. if($code == 200) {
  689. UWZ_Log $hash, 4, "Successfully downloaded map ".$smap;
  690. } else {
  691. UWZ_Log $hash, 3, "Failed to download map (".$img.")";
  692. }
  693. }
  694. }
  695. # acquire the json-response
  696. my $response = UWZ_JSONAcquire($hash,$hash->{URL});
  697. UWZ_Log $hash, 5, length($response)." characters captured";
  698. my $uwz_warnings = JSON->new->ascii->decode($response);
  699. my $enc = guess_encoding($uwz_warnings);
  700. my $uwz_warncount = scalar(@{ $uwz_warnings->{'results'} });
  701. UWZ_Log $hash, 4, "There are ".$uwz_warncount." warnings active";
  702. my $sortby = AttrVal( $name, 'sort_readings_by',"" );
  703. my @sorted;
  704. if ( $sortby eq "creation" ) {
  705. UWZ_Log $hash, 4, "Sorting by creation";
  706. @sorted = sort { $b->{payload}{creation} <=> $a->{payload}{creation} } @{ $uwz_warnings->{'results'} };
  707. } elsif ( $sortby ne "severity" ) {
  708. UWZ_Log $hash, 4, "Sorting by dtgStart";
  709. @sorted = sort { $a->{dtgStart} <=> $b->{dtgStart} } @{ $uwz_warnings->{'results'} };
  710. } else {
  711. UWZ_Log $hash, 4, "Sorting by severity";
  712. @sorted = sort { $a->{severity} <=> $b->{severity} } @{ $uwz_warnings->{'results'} };
  713. }
  714. my $message;
  715. my $i=0;
  716. my %typenames = ( "1" => "unknown", # <===== FIX HERE
  717. "2" => "sturm",
  718. "3" => "schnee",
  719. "4" => "regen",
  720. "5" => "temperatur",
  721. "6" => "waldbrand",
  722. "7" => "gewitter",
  723. "8" => "strassenglaette",
  724. "9" => "temperatur", # 9 = hitzewarnung
  725. "10" => "glatteisregen",
  726. "11" => "temperatur" ); # 11 = bodenfrost
  727. my %typenames_de_str= ( "1" => "unknown", # <===== FIX HERE
  728. "2" => "Sturm",
  729. "3" => "Schnee",
  730. "4" => "Regen",
  731. "5" => "Temperatur",
  732. "6" => "Waldbrand",
  733. "7" => "Gewitter",
  734. "8" => "Strassenglaette",
  735. "9" => "Hitze", # 9 = hitzewarnung
  736. "10" => "Glatteisregen",
  737. "11" => "Bodenfrost" ); # 11 = bodenfrost
  738. my %typenames_nl_str= ( "1" => "unknown", # <===== FIX HERE
  739. "2" => "storm",
  740. "3" => "sneeuw",
  741. "4" => "regen",
  742. "5" => "temperatuur",
  743. "6" => "bosbrand",
  744. "7" => "onweer",
  745. "8" => "gladde wegen",
  746. "9" => "hitte", # 9 = hitzewarnung
  747. "10" => "ijzel",
  748. "11" => "grondvorst" ); # 11 = bodenfrost
  749. my %typenames_fr_str= ( "1" => "unknown", # <===== FIX HERE
  750. "2" => "tempete",
  751. "3" => "neige",
  752. "4" => "pluie",
  753. "5" => "températur",
  754. "6" => "feu de forêt",
  755. "7" => "orage",
  756. "8" => "route glissante",
  757. "9" => "chaleur", # 9 = hitzewarnung
  758. "10" => "pluie de verglas",
  759. "11" => "gelée" ); # 11 = bodenfrost
  760. my %typenames_en_str= ( "1" => "unknown", # <===== FIX HERE
  761. "2" => "storm",
  762. "3" => "snow",
  763. "4" => "rain",
  764. "5" => "temperatur",
  765. "6" => "forest fire",
  766. "7" => "thunderstorms",
  767. "8" => "slippery road",
  768. "9" => "heat", # 9 = hitzewarnung
  769. "10" => "black ice rain",
  770. "11" => "soil frost" ); # 11 = bodenfrost
  771. my %severitycolor = ( "0" => "green",
  772. "1" => "unknown", # <===== FIX HERE
  773. "2" => "unknown", # <===== FIX HERE
  774. "3" => "unknown", # <===== FIX HERE
  775. "4" => "orange",
  776. "5" => "unknown", # <===== FIX HERE
  777. "6" => "unknown", # <===== FIX HERE
  778. "7" => "orange",
  779. "8" => "gelb",
  780. "9" => "gelb", # <===== FIX HERE
  781. "10" => "orange",
  782. "11" => "rot",
  783. "12" => "violett" );
  784. my @uwzmaxlevel;
  785. foreach my $single_warning (@sorted) {
  786. push @uwzmaxlevel, UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'});
  787. UWZ_Log $hash, 4, "Warn_".$i."_EventID: ".$single_warning->{'payload'}{'id'};
  788. $message .= "Warn_".$i."_EventID|".$single_warning->{'payload'}{'id'}."|";
  789. my $chopcreation = substr($single_warning->{'payload'}{'creation'},0,10);
  790. $chopcreation = $chopcreation;
  791. UWZ_Log $hash, 4, "Warn_".$i."_Creation: ".$chopcreation;
  792. $message .= "Warn_".$i."_Creation|".$chopcreation."|";
  793. UWZ_Log $hash, 4, "Warn_".$i."_Type: ".$single_warning->{'type'};
  794. $message .= "Warn_".$i."_Type|".$single_warning->{'type'}."|";
  795. UWZ_Log $hash, 4, "Warn_".$i."_uwzLevel: ".UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'});
  796. $message .= "Warn_".$i."_uwzLevel|".UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'})."|";
  797. UWZ_Log $hash, 4, "Warn_".$i."_Severity: ".$single_warning->{'severity'};
  798. $message .= "Warn_".$i."_Severity|".$single_warning->{'severity'}."|";
  799. UWZ_Log $hash, 4, "Warn_".$i."_Start: ".$single_warning->{'dtgStart'};
  800. $message .= "Warn_".$i."_Start|".$single_warning->{'dtgStart'}."|";
  801. UWZ_Log $hash, 4, "Warn_".$i."_End: ".$single_warning->{'dtgEnd'};
  802. $message .= "Warn_".$i."_End|".$single_warning->{'dtgEnd'}."|";
  803. ## Begin of redundant Reading
  804. if ( $UWZ_humanreadable eq 1 ) {
  805. UWZ_Log $hash, 4, "Warn_".$i."_Start_Date: ".strftime("%d.%m.%Y", localtime($single_warning->{'dtgStart'}));
  806. $message .= "Warn_".$i."_Start_Date|".strftime("%d.%m.%Y", localtime($single_warning->{'dtgStart'}))."|";
  807. UWZ_Log $hash, 4, "Warn_".$i."_Start_Time: ".strftime("%H:%M", localtime($single_warning->{'dtgStart'}));
  808. $message .= "Warn_".$i."_Start_Time|".strftime("%H:%M", localtime($single_warning->{'dtgStart'}))."|";
  809. UWZ_Log $hash, 4, "Warn_".$i."_End_Date: ".strftime("%d.%m.%Y", localtime($single_warning->{'dtgEnd'}));
  810. $message .= "Warn_".$i."_End_Date|".strftime("%d.%m.%Y", localtime($single_warning->{'dtgEnd'}))."|";
  811. UWZ_Log $hash, 4, "Warn_".$i."_End_Time: ".strftime("%H:%M", localtime($single_warning->{'dtgEnd'}));
  812. $message .= "Warn_".$i."_End_Time|".strftime("%H:%M", localtime($single_warning->{'dtgEnd'}))."|";
  813. UWZ_Log $hash, 4, "Warn_".$i."_Creation_Date: ".strftime("%d.%m.%Y", localtime($chopcreation));
  814. $message .= "Warn_".$i."_Creation_Date|".strftime("%d.%m.%Y", localtime($chopcreation))."|";
  815. UWZ_Log $hash, 4, "Warn_".$i."_Creation_Time: ".strftime("%H:%M", localtime($chopcreation));
  816. $message .= "Warn_".$i."_Creation_Time|".strftime("%H:%M", localtime($chopcreation))."|";
  817. # Begin Language by AttrVal
  818. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  819. UWZ_Log $hash, 4, "Warn_".$i."_Type_Str: ".$typenames_de_str{ $single_warning->{'type'} };
  820. $message .= "Warn_".$i."_Type_Str|".$typenames_de_str{ $single_warning->{'type'} }."|";
  821. my %uwzlevelname = ( "0" => "Stufe Grün (keine Warnung)",
  822. "1" => "Stufe Dunkelgrün (Wetterhinweise)",
  823. "2" => "Stufe Gelb (Vorwarnung für Unwetterwarnung)",
  824. "3" => "Warnstufe Orange (Unwetterwarnung)",
  825. "4" => "Warnstufe Rot (Unwetterwarnung)",
  826. "5" => "Warnstufe Violett (Unwetterwarnung)");
  827. UWZ_Log $hash, 4, "Warn_".$i."_uwzLevel_Str: ".$uwzlevelname{ UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'}) };
  828. $message .= "Warn_".$i."_uwzLevel_Str|".$uwzlevelname{ UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'}) }."|";
  829. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  830. UWZ_Log $hash, 4, "Warn_".$i."_Type_Str: ".$typenames_nl_str{ $single_warning->{'type'} };
  831. $message .= "Warn_".$i."_Type_Str|".$typenames_nl_str{ $single_warning->{'type'} }."|";
  832. my %uwzlevelname = ( "0" => "niveau groen (geen waarschuwingen)",
  833. "1" => "niveau donkergroen (weermelding)",
  834. "2" => "niveau geel (voorwaarschuwing)",
  835. "3" => "waarschuwingsniveau oranje (waarschuwing voor matig noodweer)",
  836. "4" => "waarschuwingsniveau rood (waarschuwing voor zwaar noodweer)",
  837. "5" => "waarschuwingsniveau violet (waarschuwing voor zeer zwaar noodweer)");
  838. UWZ_Log $hash, 4, "Warn_".$i."_uwzLevel_Str: ".$uwzlevelname{ UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'}) };
  839. $message .= "Warn_".$i."_uwzLevel_Str|".$uwzlevelname{ UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'}) }."|";
  840. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  841. UWZ_Log $hash, 4, "Warn_".$i."_Type_Str: ".$typenames_nl_str{ $single_warning->{'type'} };
  842. $message .= "Warn_".$i."_Type_Str|".$typenames_nl_str{ $single_warning->{'type'} }."|";
  843. my %uwzlevelname = ( "0" => "niveau vert (aucune alerte)",
  844. "1" => "niveau vert foncé (indication météo)",
  845. "2" => "niveau jaune (pré-alerte)",
  846. "3" => "niveau d' alerte orange (alerte météo)",
  847. "4" => "niveau d' alerte rouge (alerte météo)",
  848. "5" => "niveau d' alerte violet (alerte météo)");
  849. UWZ_Log $hash, 4, "Warn_".$i."_uwzLevel_Str: ".$uwzlevelname{ UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'}) };
  850. $message .= "Warn_".$i."_uwzLevel_Str|".$uwzlevelname{ UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'}) }."|";
  851. } else {
  852. UWZ_Log $hash, 4, "Warn_".$i."_Type_Str: ".$typenames_en_str{ $single_warning->{'type'} };
  853. $message .= "Warn_".$i."_Type_Str|".$typenames_en_str{ $single_warning->{'type'} }."|";
  854. my %uwzlevelname = ( "0" => "level green (no warnings)",
  855. "1" => "level dark green (weather notice)",
  856. "2" => "level yellow (severe weather watch)",
  857. "3" => "Alert level Orange",
  858. "4" => "Alert level Red",
  859. "5" => "Alert level Violet");
  860. UWZ_Log $hash, 4, "Warn_".$i."_uwzLevel_Str: ".$uwzlevelname{ UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'}) };
  861. $message .= "Warn_".$i."_uwzLevel_Str|".$uwzlevelname{ UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'}) }."|";
  862. }
  863. }
  864. ## End of redundant Reading
  865. UWZ_Log $hash, 4, "Warn_".$i."_levelName: ".$single_warning->{'payload'}{'levelName'};
  866. $message .= "Warn_".$i."_levelName|".$single_warning->{'payload'}{'levelName'}."|";
  867. UWZ_Log $hash, 4, "Warn_".$i."_AltitudeMin: ".$enc->decode($single_warning->{'payload'}{'altMin'});
  868. $message .= "Warn_".$i."_AltitudeMin|".encode("UTF-8", decode("iso-8859-1", $single_warning->{'payload'}{'altMin'}))."|";
  869. UWZ_Log $hash, 4, "Warn_".$i."_AltitudeMax: ".$enc->decode($single_warning->{'payload'}{'altMax'});
  870. $message .= "Warn_".$i."_AltitudeMax|".encode("UTF-8", decode("iso-8859-1", $single_warning->{'payload'}{'altMax'}))."|";
  871. my $uclang = "EN";
  872. if (AttrVal( $name, 'lang',undef) ) {
  873. $uclang = uc AttrVal( $name, 'lang','');
  874. } else {
  875. # Begin Language by AttrVal
  876. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  877. $uclang = "DE";
  878. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  879. $uclang = "NL"
  880. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  881. $uclang = "FR"
  882. } else {
  883. $uclang = "EN";
  884. }
  885. }
  886. UWZ_Log $hash, 4, "Warn_".$i."_LongText: ".$enc->decode($single_warning->{'payload'}{'translationsLongText'}{$uclang});
  887. $message .= "Warn_".$i."_LongText|".encode("UTF-8", decode("iso-8859-1", $single_warning->{'payload'}{'translationsLongText'}{$uclang}))."|";
  888. UWZ_Log $hash, 4, "Warn_".$i."_ShortText: ".$enc->decode($single_warning->{'payload'}{'translationsShortText'}{$uclang});
  889. $message .= "Warn_".$i."_ShortText|".encode("UTF-8", decode("iso-8859-1", $single_warning->{'payload'}{'translationsShortText'}{$uclang}))."|";
  890. ###
  891. if (AttrVal( $name, 'localiconbase',undef) ) {
  892. UWZ_Log $hash, 4, "Warn_".$i."_IconURL: ".AttrVal( $name, 'localiconbase',undef).$typenames{ $single_warning->{'type'} }."-".$single_warning->{'severity'}.".png";
  893. $message .= "Warn_".$i."_IconURL|".AttrVal( $name, 'localiconbase',undef).$typenames{ $single_warning->{'type'} }."-".UWZ_GetSeverityColor($hash, UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'} )).".png|";
  894. } else {
  895. UWZ_Log $hash, 4, "Warn_".$i."_IconURL: http://www.unwetterzentrale.de/images/icons/".$typenames{ $single_warning->{'type'} }."-".$single_warning->{'severity'}.".gif";
  896. $message .= "Warn_".$i."_IconURL|http://www.unwetterzentrale.de/images/icons/".$typenames{ $single_warning->{'type'} }."-".UWZ_GetSeverityColor($hash, UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'} )).".gif|";
  897. }
  898. ###
  899. ## Hagel start
  900. my $hagelcount = 0;
  901. # Begin Language by AttrVal
  902. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  903. $hagelcount = my @hagelmatch = $single_warning->{'payload'}{'translationsLongText'}{'DE'} =~ /Hagel/g;
  904. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  905. $hagelcount = my @hagelmatch = $single_warning->{'payload'}{'translationsLongText'}{'NL'} =~ /hagel/g;
  906. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  907. $hagelcount = my @hagelmatch = $single_warning->{'payload'}{'translationsLongText'}{'FR'} =~ /grêle/g;
  908. } else {
  909. $hagelcount = my @hagelmatch = $single_warning->{'payload'}{'translationsLongText'}{'EN'} =~ /Hail/g;
  910. }
  911. # end language by AttrVal
  912. if ( $hagelcount ne 0 ) {
  913. UWZ_Log $hash, 4, "Warn_".$i."_Hail: 1";
  914. $message .= "Warn_".$i."_Hail|1|";
  915. } else {
  916. UWZ_Log $hash, 4, "Warn_".$i."_Hail: 0";
  917. $message .= "Warn_".$i."_Hail|0|";
  918. }
  919. ## Hagel end
  920. $i++;
  921. }
  922. my $max=0;
  923. for (@uwzmaxlevel) {
  924. $max = $_ if !$max || $_ > $max
  925. };
  926. $message .= "WarnUWZLevel|";
  927. $message .= $max."|";
  928. UWZ_Log $hash, 4, "WarnUWZLevel_Color: ".UWZ_GetSeverityColor($hash, $max);
  929. $message .= "WarnUWZLevel_Color|".UWZ_GetSeverityColor($hash, $max)."|";
  930. ## Begin of redundant Reading
  931. if ( $UWZ_humanreadable eq 1 ) {
  932. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  933. my %uwzlevelname = ( "0" => "Stufe Grün (keine Warnung)",
  934. "1" => "Stufe Dunkelgrün (Wetterhinweise)",
  935. "2" => "Stufe Gelb (Vorwarnung für Unwetterwarnung)",
  936. "3" => "Warnstufe Orange (Unwetterwarnung)",
  937. "4" => "Warnstufe Rot (Unwetterwarnung)",
  938. "5" => "Warnstufe Violett (Unwetterwarnung)");
  939. UWZ_Log $hash, 4, "WarnUWZLevel_Str: ".$uwzlevelname{ $max };
  940. $message .= "WarnUWZLevel_Str|".$uwzlevelname{ $max }."|";
  941. } elsif ($hash->{CountryCode} ~~ [ 'NL' ] ) {
  942. my %uwzlevelname = ( "0" => "niveau groen (geen waarschuwingen)",
  943. "1" => "niveau donkergroen (voorwaarschuwing)",
  944. "2" => "niveau geel (voorwaarschuwing)",
  945. "3" => "waarschuwingsniveau oranje (waarschuwing voor matig noodweer)",
  946. "4" => "waarschuwingsniveau rood (waarschuwing voor zwaar noodweer)",
  947. "5" => "waarschuwingsniveau violet (waarschuwing voor zeer zwaar noodweer)");
  948. UWZ_Log $hash, 4, "WarnUWZLevel_Str: ".$uwzlevelname{ $max };
  949. $message .= "WarnUWZLevel_Str|".$uwzlevelname{ $max }."|";
  950. } elsif ($hash->{CountryCode} ~~ [ 'FR' ] ) {
  951. my %uwzlevelname = ( "0" => "niveau vert (aucune alerte)",
  952. "1" => "niveau vert foncé (indication météo)",
  953. "2" => "niveau jaune (pré-alerte)",
  954. "3" => "niveau d' alerte orange (alerte météo)",
  955. "4" => "niveau d' alerte rouge (alerte météo)",
  956. "5" => "niveau d' alerte violet (alerte météo)");
  957. UWZ_Log $hash, 4, "WarnUWZLevel_Str: ".$uwzlevelname{ $max };
  958. $message .= "WarnUWZLevel_Str|".$uwzlevelname{ $max }."|";
  959. } else {
  960. my %uwzlevelname = ( "0" => "level green (no warnings)",
  961. "1" => "level dark green (weather notice)",
  962. "2" => "level yellow (severe weather watch)",
  963. "3" => "Alert level Orange",
  964. "4" => "Alert level Red",
  965. "5" => "Alert level Violet");
  966. UWZ_Log $hash, 4, "WarnUWZLevel_Str: ".$uwzlevelname{ $max };
  967. $message .= "WarnUWZLevel_Str|".$uwzlevelname{ $max }."|";
  968. }
  969. }
  970. $message .= "durationFetchReadings|";
  971. $message .= sprintf "%.2f", time() - $readingStartTime;
  972. UWZ_Log $hash, 3, "Done fetching data";
  973. UWZ_Log $hash, 4, "Will return : "."$name|$message|WarnCount|$uwz_warncount" ;
  974. return "$name|$message|WarnCount|$uwz_warncount" ;
  975. }
  976. #####################################
  977. sub UWZAsHtml($;$) {
  978. my ($name,$items) = @_;
  979. my $ret = '';
  980. my $hash = $defs{$name};
  981. my $htmlsequence = AttrVal($name, "htmlsequence", "none");
  982. my $htmltitle = AttrVal($name, "htmltitle", "");
  983. my $htmltitleclass = AttrVal($name, "htmltitleclass", "");
  984. my $attr;
  985. if (AttrVal($name, "htmlattr", "none") ne "none") {
  986. $attr = AttrVal($name, "htmlattr", "");
  987. } else {
  988. $attr = 'width="100%"';
  989. }
  990. if (ReadingsVal($name, "WarnCount", 0) != 0 ) {
  991. $ret .= '<table><tr><td>';
  992. $ret .= '<table class="block" '.$attr.'><tr><th class="'.$htmltitleclass.'" colspan="2">'.$htmltitle.'</th></tr>';
  993. if ($htmlsequence eq "descending") {
  994. for ( my $i=ReadingsVal($name, "WarnCount", -1)-1; $i>=0; $i--){
  995. $ret .= '<tr><td class="uwzIcon" style="vertical-align:top;"><img src="'.ReadingsVal($name, "Warn_".$i."_IconURL", "").'"></td>';
  996. $ret .= '<td class="uwzValue"><b>'.ReadingsVal($name, "Warn_".$i."_ShortText", "").'</b><br><br>';
  997. $ret .= ReadingsVal($name, "Warn_".$i."_LongText", "").'<br><br>';
  998. my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(ReadingsVal($name, "Warn_".$i."_Start", ""));
  999. if (length($hour) == 1) {$hour = "0$hour";}
  1000. if (length($min) == 1) {$min = "0$min";}
  1001. # language by AttrVal
  1002. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  1003. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Anfang:</b></td><td>'."$DEweekdays[$wday], $mday $DEmonths[$mon] ".(1900+$year)." $hour:$min ".'Uhr</td>';
  1004. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1005. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Begin:</b></td><td>'."$NLweekdays[$wday], $mday $NLmonths[$mon] ".(1900+$year)." $hour:$min ".'uur</td>';
  1006. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1007. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Valide à partir du:</b></td><td>'."$FRweekdays[$wday], $mday $FRmonths[$mon] ".(1900+$year)." $hour:$min ".'heure</td>';
  1008. } else {
  1009. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Start:</b></td><td>'."$ENweekdays[$wday], $mday $ENmonths[$mon] ".(1900+$year)." $hour:$min ".'hour</td>';
  1010. }
  1011. # end language by AttrVal
  1012. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = undef;
  1013. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(ReadingsVal($name, "Warn_".$i."_End", ""));
  1014. if (length($hour) == 1) {$hour = "0$hour";}
  1015. if (length($min) == 1) {$min = "0$min";}
  1016. # language by AttrVal
  1017. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  1018. $ret .= '<td><b>Ende:</b></td><td>'."$DEweekdays[$wday], $mday $DEmonths[$mon] ".(1900+$year)." $hour:$min ".'Uhr</td>';
  1019. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1020. $ret .= '<td><b>Einde:</b></td><td>'."$NLweekdays[$wday], $mday $NLmonths[$mon] ".(1900+$year)." $hour:$min ".'uur</td>';
  1021. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1022. $ret .= '<td><b>Jusqu\'au:</b></td><td>'."$FRweekdays[$wday], $mday $FRmonths[$mon] ".(1900+$year)." $hour:$min ".'heure</td>';
  1023. } else {
  1024. $ret .= '<td><b>End:</b></td><td>'."$ENweekdays[$wday], $mday $ENmonths[$mon] ".(1900+$year)." $hour:$min ".'hour</td>';
  1025. }
  1026. # end language by AttrVal
  1027. $ret .= '</tr></table>';
  1028. $ret .= '</td></tr>';
  1029. }
  1030. } else {
  1031. ###
  1032. for ( my $i=0; $i<ReadingsVal($name, "WarnCount", 0); $i++){
  1033. $ret .= '<tr><td class="uwzIcon" style="vertical-align:top;"><img src="'.ReadingsVal($name, "Warn_".$i."_IconURL", "").'"></td>';
  1034. $ret .= '<td class="uwzValue"><b>'.ReadingsVal($name, "Warn_".$i."_ShortText", "").'</b><br><br>';
  1035. $ret .= ReadingsVal($name, "Warn_".$i."_LongText", "").'<br><br>';
  1036. my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(ReadingsVal($name, "Warn_".$i."_Start", ""));
  1037. if (length($hour) == 1) {$hour = "0$hour";}
  1038. if (length($min) == 1) {$min = "0$min";}
  1039. # language by AttrVal
  1040. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  1041. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Anfang:</b></td><td>'."$DEweekdays[$wday], $mday $DEmonths[$mon] ".(1900+$year)." $hour:$min ".'Uhr</td>';
  1042. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1043. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Begin:</b></td><td>'."$NLweekdays[$wday], $mday $NLmonths[$mon] ".(1900+$year)." $hour:$min ".'uur</td>';
  1044. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1045. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Valide à partir du:</b></td><td>'."$FRweekdays[$wday], $mday $FRmonths[$mon] ".(1900+$year)." $hour:$min ".'heure</td>';
  1046. } else {
  1047. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Start:</b></td><td>'."$ENweekdays[$wday], $mday $ENmonths[$mon] ".(1900+$year)." $hour:$min ".'hour</td>';
  1048. }
  1049. # end language by AttrVal
  1050. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = undef;
  1051. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(ReadingsVal($name, "Warn_".$i."_End", ""));
  1052. if (length($hour) == 1) {$hour = "0$hour";}
  1053. if (length($min) == 1) {$min = "0$min";}
  1054. # language by AttrVal
  1055. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  1056. $ret .= '<td><b>Ende:</b></td><td>'."$DEweekdays[$wday], $mday $DEmonths[$mon] ".(1900+$year)." $hour:$min ".'Uhr</td>';
  1057. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1058. $ret .= '<td><b>Einde:</b></td><td>'."$NLweekdays[$wday], $mday $NLmonths[$mon] ".(1900+$year)." $hour:$min ".'uur</td>';
  1059. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1060. $ret .= '<td><b>Juzqu\'au:</b></td><td>'."$FRweekdays[$wday], $mday $FRmonths[$mon] ".(1900+$year)." $hour:$min ".'heure</td>';
  1061. } else {
  1062. $ret .= '<td><b>End:</b></td><td>'."$ENweekdays[$wday], $mday $ENmonths[$mon] ".(1900+$year)." $hour:$min ".'hour</td>';
  1063. }
  1064. # end language by AttrVal
  1065. $ret .= '</tr></table>';
  1066. $ret .= '</td></tr>';
  1067. }
  1068. }
  1069. ###
  1070. $ret .= '</table>';
  1071. $ret .= '</td></tr>';
  1072. $ret .= '</table>';
  1073. } else {
  1074. $ret .= '<table><tr><td>';
  1075. $ret .= '<table class="block wide" width="600px"><tr><th class="'.$htmltitleclass.'" colspan="2">'.$htmltitle.'</th></tr>';
  1076. $ret .= '<tr><td class="uwzIcon" style="vertical-align:top;">';
  1077. # language by AttrVal
  1078. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  1079. $ret .='<b>Keine Warnungen</b>';
  1080. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1081. $ret .='<b>Geen waarschuwingen</b>';
  1082. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1083. $ret .='<b>Aucune alerte</b>';
  1084. } else {
  1085. $ret .='<b>No Warnings</b>';
  1086. }
  1087. # end language by AttrVal
  1088. $ret .= '</td></tr>';
  1089. $ret .= '</table>';
  1090. $ret .= '</td></tr>';
  1091. $ret .= '</table>';
  1092. }
  1093. return $ret;
  1094. }
  1095. #####################################
  1096. sub UWZAsHtmlLite($;$) {
  1097. my ($name,$items) = @_;
  1098. my $ret = '';
  1099. my $hash = $defs{$name};
  1100. my $htmlsequence = AttrVal($name, "htmlsequence", "none");
  1101. my $htmltitle = AttrVal($name, "htmltitle", "");
  1102. my $htmltitleclass = AttrVal($name, "htmltitleclass", "");
  1103. my $attr;
  1104. if (AttrVal($name, "htmlattr", "none") ne "none") {
  1105. $attr = AttrVal($name, "htmlattr", "");
  1106. } else {
  1107. $attr = 'width="100%"';
  1108. }
  1109. if (ReadingsVal($name, "WarnCount", "") != 0 ) {
  1110. $ret .= '<table><tr><td>';
  1111. $ret .= '<table class="block" '.$attr.'><tr><th class="'.$htmltitleclass.'" colspan="2">'.$htmltitle.'</th></tr>';
  1112. if ($htmlsequence eq "descending") {
  1113. for ( my $i=ReadingsVal($name, "WarnCount", "")-1; $i>=0; $i--){
  1114. $ret .= '<tr><td class="uwzIcon" style="vertical-align:top;"><img src="'.ReadingsVal($name, "Warn_".$i."_IconURL", "").'"></td>';
  1115. $ret .= '<td class="uwzValue"><b>'.ReadingsVal($name, "Warn_".$i."_ShortText", "").'</b><br><br>';
  1116. my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(ReadingsVal($name, "Warn_".$i."_Start", ""));
  1117. if (length($hour) == 1) {$hour = "0$hour";}
  1118. if (length($min) == 1) {$min = "0$min";}
  1119. # language by AttrVal
  1120. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  1121. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Anfang:</b></td><td>'."$DEweekdays[$wday], $mday $DEmonths[$mon] ".(1900+$year)." $hour:$min ".'Uhr</td>';
  1122. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1123. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Begin:</b></td><td>'."$NLweekdays[$wday], $mday $NLmonths[$mon] ".(1900+$year)." $hour:$min ".'uur</td>';
  1124. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1125. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Valide à partir du:</b></td><td>'."$FRweekdays[$wday], $mday $FRmonths[$mon] ".(1900+$year)." $hour:$min ".'heure</td>';
  1126. } else {
  1127. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Start:</b></td><td>'."$ENweekdays[$wday], $mday $ENmonths[$mon] ".(1900+$year)." $hour:$min ".'hour</td>';
  1128. }
  1129. # end language by AttrVal
  1130. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = undef;
  1131. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(ReadingsVal($name, "Warn_".$i."_End", ""));
  1132. if (length($hour) == 1) {$hour = "0$hour";}
  1133. if (length($min) == 1) {$min = "0$min";}
  1134. # language by AttrVal
  1135. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  1136. $ret .= '<td><b>Ende:</b></td><td>'."$DEweekdays[$wday], $mday $DEmonths[$mon] ".(1900+$year)." $hour:$min ".'Uhr</td>';
  1137. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1138. $ret .= '<td><b>Einde:</b></td><td>'."$NLweekdays[$wday], $mday $NLmonths[$mon] ".(1900+$year)." $hour:$min ".'uur</td>';
  1139. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1140. $ret .= '<td><b>Jusqu\'au:</b></td><td>'."$FRweekdays[$wday], $mday $FRmonths[$mon] ".(1900+$year)." $hour:$min ".'heure</td>';
  1141. } else {
  1142. $ret .= '<td><b>End:</b></td><td>'."$ENweekdays[$wday], $mday $ENmonths[$mon] ".(1900+$year)." $hour:$min ".'hour</td>';
  1143. }
  1144. # end language by AttrVal
  1145. $ret .= '</tr></table>';
  1146. $ret .= '</td></tr>';
  1147. }
  1148. } else {
  1149. for ( my $i=0; $i<ReadingsVal($name, "WarnCount", ""); $i++){
  1150. $ret .= '<tr><td class="uwzIcon" style="vertical-align:top;"><img src="'.ReadingsVal($name, "Warn_".$i."_IconURL", "").'"></td>';
  1151. $ret .= '<td class="uwzValue"><b>'.ReadingsVal($name, "Warn_".$i."_ShortText", "").'</b><br><br>';
  1152. my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(ReadingsVal($name, "Warn_".$i."_Start", ""));
  1153. if (length($hour) == 1) {$hour = "0$hour";}
  1154. if (length($min) == 1) {$min = "0$min";}
  1155. # language by AttrVal
  1156. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  1157. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Anfang:</b></td><td>'."$DEweekdays[$wday], $mday $DEmonths[$mon] ".(1900+$year)." $hour:$min ".'Uhr</td>';
  1158. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1159. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Begin:</b></td><td>'."$NLweekdays[$wday], $mday $NLmonths[$mon] ".(1900+$year)." $hour:$min ".'uur</td>';
  1160. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1161. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Valide à partir du:</b></td><td>'."$FRweekdays[$wday], $mday $FRmonths[$mon] ".(1900+$year)." $hour:$min ".'heure</td>';
  1162. } else {
  1163. $ret .= '<table '.$attr.'><tr><th></th><th></th></tr><tr><td><b>Start:</b></td><td>'."$ENweekdays[$wday], $mday $ENmonths[$mon] ".(1900+$year)." $hour:$min ".'hour</td>';
  1164. }
  1165. # end language by AttrVal
  1166. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = undef;
  1167. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(ReadingsVal($name, "Warn_".$i."_End", ""));
  1168. if (length($hour) == 1) {$hour = "0$hour";}
  1169. if (length($min) == 1) {$min = "0$min";}
  1170. # language by AttrVal
  1171. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  1172. $ret .= '<td><b>Ende:</b></td><td>'."$DEweekdays[$wday], $mday $DEmonths[$mon] ".(1900+$year)." $hour:$min ".'Uhr</td>';
  1173. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1174. $ret .= '<td><b>Einde:</b></td><td>'."$NLweekdays[$wday], $mday $NLmonths[$mon] ".(1900+$year)." $hour:$min ".'uur</td>';
  1175. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1176. $ret .= '<td><b>Jusqu\'au:</b></td><td>'."$FRweekdays[$wday], $mday $FRmonths[$mon] ".(1900+$year)." $hour:$min ".'heure</td>';
  1177. } else {
  1178. $ret .= '<td><b>End:</b></td><td>'."$ENweekdays[$wday], $mday $ENmonths[$mon] ".(1900+$year)." $hour:$min ".'hour</td>';
  1179. }
  1180. # end language by AttrVal
  1181. $ret .= '</tr></table>';
  1182. $ret .= '</td></tr>';
  1183. }
  1184. }
  1185. $ret .= '</table>';
  1186. $ret .= '</td></tr>';
  1187. $ret .= '</table>';
  1188. } else {
  1189. $ret .= '<table><tr><td>';
  1190. $ret .= '<table class="block wide" width="600px"><tr><th class="'.$htmltitleclass.'" colspan="2">'.$htmltitle.'</th></tr>';
  1191. $ret .= '<tr><td class="uwzIcon" style="vertical-align:top;">';
  1192. # language by AttrVal
  1193. if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) {
  1194. $ret .='<b>Keine Warnungen</b>';
  1195. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1196. $ret .='<b>Geen waarschuwingen</b>';
  1197. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1198. $ret .='<b>Aucune alerte</b>';
  1199. } else {
  1200. $ret .='<b>No Warnings</b>';
  1201. }
  1202. # end language by AttrVal
  1203. $ret .= '</td></tr>';
  1204. $ret .= '</table>';
  1205. $ret .= '</td></tr>';
  1206. $ret .= '</table>';
  1207. }
  1208. return $ret;
  1209. }
  1210. #####################################
  1211. sub UWZAsHtmlFP($;$) {
  1212. my ($name,$items) = @_;
  1213. my $tablewidth = ReadingsVal($name, "WarnCount", "") * 80;
  1214. my $htmlsequence = AttrVal($name, "htmlsequence", "none");
  1215. my $htmltitle = AttrVal($name, "htmltitle", "");
  1216. my $htmltitleclass = AttrVal($name, "htmltitleclass", "");
  1217. my $ret = '';
  1218. $ret .= '<table class="uwz-fp" style="width:'.$tablewidth.'px"><tr><th class="'.$htmltitleclass.'" colspan="'.ReadingsVal($name, "WarnCount", "none").'">'.$htmltitle.'</th></tr>';
  1219. $ret .= "<tr>";
  1220. if ($htmlsequence eq "descending") {
  1221. for ( my $i=ReadingsVal($name, "WarnCount", "")-1; $i>=0; $i--){
  1222. $ret .= '<td class="uwzIcon"><img width="80px" src="'.ReadingsVal($name, "Warn_".$i."_IconURL", "").'"></td>';
  1223. }
  1224. } else {
  1225. for ( my $i=0; $i<ReadingsVal($name, "WarnCount", ""); $i++){
  1226. $ret .= '<td class="uwzIcon"><img width="80px" src="'.ReadingsVal($name, "Warn_".$i."_IconURL", "").'"></td>';
  1227. }
  1228. }
  1229. $ret .= "</tr>";
  1230. $ret .= '</table>';
  1231. return $ret;
  1232. }
  1233. #####################################
  1234. sub UWZAsHtmlMovie($$) {
  1235. my ($name,$land) = @_;
  1236. my $url = UWZ_Map2Movie($name,$land);
  1237. my $hash = $defs{$name};
  1238. my $ret = '<table><tr><td>';
  1239. $ret .= '<table class="block wide">';
  1240. $ret .= '<tr class="even"><td>';
  1241. if(defined($url)) {
  1242. $ret .= '<video controls="controls">';
  1243. $ret .= '<source src="'.$url.'" type="video/mp4">';
  1244. $ret .= '</video>';
  1245. } else {
  1246. # language by AttrVal
  1247. if ( $hash->{CountryCode} ~~ [ 'DE' , 'AT' , 'CH' ] ) {
  1248. $ret .= 'unbekannte Landbezeichnung';
  1249. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1250. $ret .= 'Onbekende landcode';
  1251. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1252. $ret .= 'code de pays inconnu';
  1253. } else {
  1254. $ret .='unknown movie setting';
  1255. }
  1256. # end language by AttrVal
  1257. }
  1258. $ret .= '</td></tr></table></td></tr>';
  1259. $ret .= '</table>';
  1260. return $ret;
  1261. }
  1262. #####################################
  1263. sub UWZAsHtmlKarteLand($$) {
  1264. my ($name,$land) = @_;
  1265. my $url = UWZ_Map2Image($name,$land);
  1266. my $hash = $defs{$name};
  1267. my $ret = '<table><tr><td>';
  1268. $ret .= '<table class="block wide">';
  1269. $ret .= '<tr class="even"><td>';
  1270. if(defined($url)) {
  1271. $ret .= '<img src="'.$url.'">';
  1272. } else {
  1273. # language by AttrVal
  1274. if ( $hash->{CountryCode} ~~ [ 'DE' , 'AT' , 'CH' ] ) {
  1275. $ret .= 'unbekannte Landbezeichnung';
  1276. } elsif ( $hash->{CountryCode} ~~ [ 'NL' ] ) {
  1277. $ret .= 'onbekende landcode';
  1278. } elsif ( $hash->{CountryCode} ~~ [ 'FR' ] ) {
  1279. $ret .= 'code de pays inconnu';
  1280. } else {
  1281. $ret .='unknown map setting';
  1282. }
  1283. # end language by AttrVal
  1284. }
  1285. $ret .= '</td></tr></table></td></tr>';
  1286. $ret .= '</table>';
  1287. return $ret;
  1288. }
  1289. #####################################
  1290. sub UWZ_GetSeverityColor($$) {
  1291. my ($name,$uwzlevel) = @_;
  1292. my $alertcolor = "";
  1293. my %UWZSeverity = ( "0" => "gruen",
  1294. "1" => "orange",
  1295. "2" => "gelb",
  1296. "3" => "orange",
  1297. "4" => "rot",
  1298. "5" => "violett");
  1299. return $UWZSeverity{$uwzlevel};
  1300. }
  1301. #####################################
  1302. sub UWZ_GetUWZLevel($$) {
  1303. my ($name,$warnname) = @_;
  1304. my @alert = split(/_/,$warnname);
  1305. if ( $alert[0] eq "notice" ) {
  1306. return "1";
  1307. } elsif ( $alert[1] eq "forewarn" ) {
  1308. return "2";
  1309. } else {
  1310. my %UWZSeverity = ( "green" => "0",
  1311. "yellow" => "2",
  1312. "orange" => "3",
  1313. "red" => "4",
  1314. "violet" => "5");
  1315. return $UWZSeverity{$alert[2]};
  1316. }
  1317. }
  1318. #####################################
  1319. sub UWZ_IntervalAtWarnLevel($) {
  1320. my $hash = shift;
  1321. my $name = $hash->{NAME};
  1322. my $warnLevel = ReadingsVal($name,'WarnUWZLevel',0);
  1323. my @valuestring = split( ',', AttrVal($name,'intervalAtWarnLevel','') );
  1324. my %warnLevelInterval;
  1325. readingsSingleUpdate($hash,'currentIntervalMode','warn',0);
  1326. foreach( @valuestring ) {
  1327. my @values = split( '=' , $_ );
  1328. $warnLevelInterval{$values[0]} = $values[1];
  1329. }
  1330. if( defined($warnLevelInterval{$warnLevel}) and $hash->{INTERVALWARN} != $warnLevelInterval{$warnLevel} ) {
  1331. $hash->{INTERVALWARN} = $warnLevelInterval{$warnLevel};
  1332. RemoveInternalTimer( $hash );
  1333. InternalTimer(gettimeofday() + $hash->{INTERVALWARN}, "UWZ_Start", $hash, 1 );
  1334. UWZ_Log $hash, 4, "restart internal timer with interval $hash->{INTERVALWARN}";
  1335. } else {
  1336. RemoveInternalTimer( $hash );
  1337. InternalTimer(gettimeofday() + $hash->{INTERVALWARN}, "UWZ_Start", $hash, 1 );
  1338. UWZ_Log $hash, 4, "restart internal timer with interval $hash->{INTERVALWARN}";
  1339. }
  1340. }
  1341. #####################################
  1342. ##
  1343. ## UWZ Helper Functions
  1344. ##
  1345. #####################################
  1346. sub UWZSearchLatLon($$) {
  1347. my ($name,$loc) = @_;
  1348. my $url = "http://alertspro.geoservice.meteogroup.de/weatherpro/SearchFeed.php?search=".$loc;
  1349. my $agent = LWP::UserAgent->new( env_proxy => 1, keep_alive => 1, protocols_allowed => ['http'], timeout => 10 );
  1350. my $request = HTTP::Request->new( GET => $url );
  1351. my $response = $agent->request($request);
  1352. my $err_log = "Can't get $url -- " . $response->status_line unless( $response->is_success );
  1353. if ( $err_log ne "" ) {
  1354. print "Error|Error " . $response->status_line;
  1355. }
  1356. use XML::Simple qw(:strict);
  1357. use Data::Dumper;
  1358. use Encode qw(decode encode);
  1359. my $uwzxmlparser = XML::Simple->new();
  1360. #my $xmlres = $parser->XMLin(
  1361. my $search = $uwzxmlparser->XMLin($response->content, KeyAttr => { city => 'id' }, ForceArray => [ 'city' ]);
  1362. my $ret = '<html><table><tr><td>';
  1363. $ret .= '<table class="block wide">';
  1364. $ret .= '<tr class="even">';
  1365. $ret .= "<td><b>city</b></td>";
  1366. $ret .= "<td><b>country</b></td>";
  1367. $ret .= "<td><b>latitude</b></td>";
  1368. $ret .= "<td><b>longitude</b></td>";
  1369. $ret .= '</tr>';
  1370. foreach my $locres ($search->{cities}->{city})
  1371. {
  1372. my $linecount=1;
  1373. while ( my ($key, $value) = each(%$locres) ) {
  1374. if ( $linecount % 2 == 0 ) {
  1375. $ret .= '<tr class="even">';
  1376. } else {
  1377. $ret .= '<tr class="odd">';
  1378. }
  1379. $ret .= "<td>".encode('utf-8',$value->{'name'})."</td>";
  1380. $ret .= "<td>$value->{'country-name'}</td>";
  1381. $ret .= "<td>$value->{'latitude'}</td>";
  1382. $ret .= "<td>$value->{'longitude'}</td>";
  1383. my @headerHost = grep /Host/, @FW_httpheader;
  1384. $headerHost[0] =~ s/Host: //g;
  1385. my $aHref="<a href=\"http://".$headerHost[0]."/fhem?cmd=get+".$name."+AreaID+".$value->{'latitude'}.",".$value->{'longitude'}."\">Get AreaID</a>";
  1386. $ret .= "<td>".$aHref."</td>";
  1387. $ret .= '</tr>';
  1388. $linecount++;
  1389. }
  1390. }
  1391. $ret .= '</table></td></tr>';
  1392. $ret .= '</table></html>';
  1393. return $ret;
  1394. }
  1395. #####################################
  1396. sub UWZSearchAreaID($$) {
  1397. my ($lat,$lon) = @_;
  1398. my $url = "http://feed.alertspro.meteogroup.com/AlertsPro/AlertsProPollService.php?method=lookupCoord&lat=".$lat."&lon=".$lon;
  1399. my $agent = LWP::UserAgent->new( env_proxy => 1, keep_alive => 1, protocols_allowed => ['http'], timeout => 10 );
  1400. my $request = HTTP::Request->new( GET => $url );
  1401. my $response = $agent->request($request);
  1402. my $err_log = "Can't get $url -- " . $response->status_line unless( $response->is_success );
  1403. if ( $err_log ne "" ) {
  1404. print "Error|Error " . $response->status_line;
  1405. }
  1406. use JSON;
  1407. my @perl_scalar = @{JSON->new->utf8->decode($response->content)};
  1408. my $AreaType = $perl_scalar[0]->{'AREA_TYPE'};
  1409. my $CC = substr $perl_scalar[0]->{'AREA_ID'}, 3, 2;
  1410. my $AreaID = substr $perl_scalar[0]->{'AREA_ID'}, 5, 5;
  1411. if ( $AreaType eq "UWZ" ) {
  1412. my $ret = '<html>Please use the following statement to define Unwetterzentrale for your location:<br /><br />';
  1413. $ret .= '<table width=100%><tr><td>';
  1414. $ret .= '<table class="block wide">';
  1415. $ret .= '<tr class="even">';
  1416. $ret .= "<td height=100><center><b>define Unwetterzentrale UWZ $CC $AreaID 3600</b></center></td>";
  1417. $ret .= '</tr>';
  1418. $ret .= '</table>';
  1419. $ret .= '</td></tr></table>';
  1420. $ret .= '<br />';
  1421. $ret .= 'You can also use weblinks to add weathermaps. For a list of possible Weblinks see Commandref. For example to add the Europe Map use:<br />';
  1422. $ret .= '<table width=100%><tr><td>';
  1423. $ret .= '<table class="block wide">';
  1424. $ret .= '<tr class="even">';
  1425. $ret .= "<td height=100><center>define UWZ_Map_Europe weblink htmlCode { UWZAsHtmlKarteLand('Unwetterzentrale','europa') }</center></td>";
  1426. $ret .= '</tr>';
  1427. $ret .= '</table>';
  1428. $ret .= '</td></tr></table>';
  1429. $ret .= '</html>';
  1430. return $ret;
  1431. } else {
  1432. return "Sorry, nothing found or not implemented";
  1433. }
  1434. }
  1435. #####################################
  1436. 1;
  1437. =pod
  1438. =item device
  1439. =item summary extracts thunderstorm warnings from unwetterzentrale.de
  1440. =item summary_DE extrahiert Unwetterwarnungen von unwetterzentrale.de
  1441. =begin html
  1442. <a name="UWZ"></a>
  1443. <h3>UWZ</h3>
  1444. <ul>
  1445. <a name="UWZdefine"></a>
  1446. This modul extracts thunderstorm warnings from <a href="http://www.unwetterzentrale.de">www.unwetterzentrale.de</a>.
  1447. <br/>
  1448. Therefore the same interface is used as the Android App <a href="http://www.alertspro.com">Alerts Pro</a> does.
  1449. A maximum of 10 thunderstorm warnings will be served.
  1450. Additional the module provides a few functions to create HTML-Templates which can be used with weblink.
  1451. <br>
  1452. <i>The following Perl-Modules are used within this module: HTTP::Request, LWP::UserAgent, JSON, Encode::Guess und HTML::Parse</i>.
  1453. <br/><br/>
  1454. <b>Define</b>
  1455. <ul>
  1456. <br>
  1457. <code>define &lt;Name&gt; UWZ [CountryCode] [AreaID] [INTERVAL]</code>
  1458. <br><br><br>
  1459. Example:
  1460. <br>
  1461. <code>
  1462. define Unwetterzentrale UWZ UK 08357 1800<br>
  1463. attr Unwetterzentrale download 1<br>
  1464. attr Unwetterzentrale humanreadable 1<br>
  1465. attr Unwetterzentrale maps eastofengland unitedkingdom<br><br>
  1466. define UnwetterDetails weblink htmlCode {UWZAsHtml("Unwetterzentrale")}<br>
  1467. define UnwetterMapE_UK weblink htmlCode {UWZAsHtmlKarteLand("Unwetterzentrale","eastofengland")}<br>
  1468. define UnwetterLite weblink htmlCode {UWZAsHtmlLite("Unwetterzentrale")}
  1469. define UnwetterMovie weblink htmlCode {UWZAsHtmlMovie("Unwetterzentrale","clouds-precipitation-uk")}
  1470. </code>
  1471. <br>&nbsp;
  1472. <li><code>[CountryCode]</code>
  1473. <br>
  1474. Possible values: DE, AT, CH, UK, ...<br/>
  1475. (for other countries than germany use SEARCH for CountryCode to start device in search mode)
  1476. </li><br>
  1477. <li><code>[AreaID]</code>
  1478. <br>
  1479. For Germany you can use the postalcode, other countries use SEARCH for CountryCode to start device in search mode.
  1480. <br>
  1481. </li><br>
  1482. <li><code>[INTERVAL]</code>
  1483. <br>
  1484. Defines the refresh interval. The interval is defined in seconds, so an interval of 3600 means that every hour a refresh will be triggered onetimes.
  1485. <br>
  1486. </li><br>
  1487. <br><br><br>
  1488. Example Search-Mode:
  1489. <br>
  1490. <code>
  1491. define Unwetterzentrale UWZ SEARCH<br>
  1492. </code>
  1493. <br>
  1494. now get the AreaID for your location (example shows london):
  1495. <br>
  1496. <code>
  1497. get Unwetterzentrale SearchAreaID London<br>
  1498. </code>
  1499. <br>
  1500. now redefine your device with the outputted CountryCode and AreaID.
  1501. <br>
  1502. <br>&nbsp;
  1503. </ul>
  1504. <br>
  1505. <a name="UWZget"></a>
  1506. <b>Get</b>
  1507. <ul>
  1508. <br>
  1509. <li><code>get &lt;name&gt; soil-frost</code>
  1510. <br>
  1511. give info about current soil frost (active|inactive).
  1512. </li><br>
  1513. <li><code>get &lt;name&gt; extremfrost</code>
  1514. <br>
  1515. give info about current frost (active|inactive).
  1516. </li><br>
  1517. <li><code>get &lt;name&gt; thunderstorm</code>
  1518. <br>
  1519. give info about current thunderstorm (active|inactive).
  1520. </li><br>
  1521. <li><code>get &lt;name&gt; glaze</code>
  1522. <br>
  1523. give info about current glaze (active|inactive).
  1524. </li><br>
  1525. <li><code>get &lt;name&gt; glazed-rain</code>
  1526. <br>
  1527. give info about current freezing rain (active|inactive).
  1528. </li><br>
  1529. <li><code>get &lt;name&gt; hail</code>
  1530. <br>
  1531. give info about current hail (active|inactive).
  1532. </li><br>
  1533. <li><code>get &lt;name&gt; heat</code>
  1534. <br>
  1535. give info about current heat (active|inactive).
  1536. </li><br>
  1537. <li><code>get &lt;name&gt; rain</code>
  1538. <br>
  1539. give info about current rain (active|inactive).
  1540. </li><br>
  1541. <li><code>get &lt;name&gt; snow</code>
  1542. <br>
  1543. give info about current snow (active|inactive).
  1544. </li><br>
  1545. <li><code>get &lt;name&gt; storm</code>
  1546. <br>
  1547. give info about current storm (active|inactive).
  1548. </li><br>
  1549. <li><code>get &lt;name&gt; forest-fire</code>
  1550. <br>
  1551. give info about current forest fire (active|inactive).
  1552. </li><br>
  1553. </ul>
  1554. <br>
  1555. <b>Get (Search-Mode)</b>
  1556. <ul>
  1557. <br>
  1558. <li><code>get &lt;name&gt; SearchAreaID &lt;city&gt;</code>
  1559. <br>
  1560. Get AreaID coresponnding to entered location.
  1561. </li><br>
  1562. </ul>
  1563. <br>
  1564. <a name="UWZset"></a>
  1565. <b>Set</b>
  1566. <ul>
  1567. <br>
  1568. <li><code>set &lt;name&gt; update</code>
  1569. <br>
  1570. Executes an imediate update of thunderstorm warnings.
  1571. </li><br>
  1572. </ul>
  1573. <br>
  1574. <a name="UWZattr"></a>
  1575. <b>Attributes</b>
  1576. <ul>
  1577. <br>
  1578. <li><code>download</code>
  1579. <br>
  1580. Download maps during update (0|1).
  1581. <br>
  1582. </li>
  1583. <li><code>savepath</code>
  1584. <br>
  1585. Define where to store the map png files (default: /tmp/).
  1586. <br>
  1587. </li>
  1588. <li><code>maps</code>
  1589. <br>
  1590. Define the maps to download space seperated. For possible values see <code>UWZAsHtmlKarteLand</code>.
  1591. <br>
  1592. </li>
  1593. <li><code>humanreadable</code>
  1594. <br>
  1595. Add additional Readings Warn_?_Start_Date, Warn_?_Start_Time, Warn_?_End_Date and Warn_?_End_Time containing the coresponding timetamp in a human readable manner. Additionally Warn_?_uwzLevel_Str and Warn_?_Type_Str will be added to device readings (0|1).
  1596. <br>
  1597. </li>
  1598. <li><code>lang</code>
  1599. <br>
  1600. Overwrite requested language for short and long warn text. (de|en|it|fr|es|..).
  1601. <br>
  1602. </li>
  1603. <li><code>sort_readings_by</code>
  1604. <br>
  1605. define how readings will be sortet (start|severity|creation).
  1606. <br>
  1607. </li>
  1608. <li><code>htmlsequence</code>
  1609. <br>
  1610. define warn order of html output (ascending|descending).
  1611. <br>
  1612. </li>
  1613. <li><code>htmltitle</code>
  1614. <br>
  1615. title / header for the html ouput
  1616. <br>
  1617. </li>
  1618. <li><code>htmltitleclass</code>
  1619. <br>
  1620. css-Class of title / header for the html ouput
  1621. <br>
  1622. </li>
  1623. <li><code>localiconbase</code>
  1624. <br>
  1625. define baseurl to host your own thunderstorm warn pics (filetype is png).
  1626. <br>
  1627. </li>
  1628. <li><code>intervalAtWarnLevel</code>
  1629. <br>
  1630. define the interval per warnLevel. Example: 2=1800,3=900,4=300
  1631. <br>
  1632. </li>
  1633. <br>
  1634. </ul>
  1635. <br>
  1636. <a name="UWZreading"></a>
  1637. <b>Readings</b>
  1638. <ul>
  1639. <br>
  1640. <li><b>Warn_</b><i>0|1|2|3...|9</i><b>_...</b> - active warnings</li>
  1641. <li><b>WarnCount</b> - warnings count</li>
  1642. <li><b>WarnUWZLevel</b> - total warn level </li>
  1643. <li><b>WarnUWZLevel_Color</b> - total warn level color</li>
  1644. <li><b>WarnUWZLevel_Str</b> - total warn level string</li>
  1645. <li><b>Warn_</b><i>0</i><b>_AltitudeMin</b> - minimum altitude for warning </li>
  1646. <li><b>Warn_</b><i>0</i><b>_AltitudeMax</b> - maximum altitude for warning </li>
  1647. <li><b>Warn_</b><i>0</i><b>_EventID</b> - warning EventID </li>
  1648. <li><b>Warn_</b><i>0</i><b>_Creation</b> - warning creation </li>
  1649. <li><b>Warn_</b><i>0</i><b>_Creation_Date</b> - warning creation datum </li>
  1650. <li><b>Warn_</b><i>0</i><b>_Creation_Time</b> - warning creation time </li>
  1651. <li><b>currentIntervalMode</b> - default/warn, Interval is read from INTERVAL or INTERVALWARN Internal</li>
  1652. <li><b>Warn_</b><i>0</i><b>_Start</b> - begin of warnperiod</li>
  1653. <li><b>Warn_</b><i>0</i><b>_Start_Date</b> - start date of warnperiod</li>
  1654. <li><b>Warn_</b><i>0</i><b>_Start_Time</b> - start time of warnperiod</li>
  1655. <li><b>Warn_</b><i>0</i><b>_End</b> - end of warnperiod</li>
  1656. <li><b>Warn_</b><i>0</i><b>_End_Date</b> - end date of warnperiod</li>
  1657. <li><b>Warn_</b><i>0</i><b>_End_Time</b> - end time of warnperiod</li>
  1658. <li><b>Warn_</b><i>0</i><b>_Severity</b> - Severity of thunderstorm (0 no thunderstorm, 4, 7, 11, .. heavy thunderstorm)</li>
  1659. <li><b>Warn_</b><i>0</i><b>_Hail</b> - warning contains hail</li>
  1660. <li><b>Warn_</b><i>0</i><b>_Type</b> - kind of thunderstorm</li>
  1661. <li><b>Warn_</b><i>0</i><b>_Type_Str</b> - kind of thunderstorm (text)</li>
  1662. <ul>
  1663. <li><b>1</b> - unknown</li>
  1664. <li><b>2</b> - storm</li>
  1665. <li><b>3</b> - snow</li>
  1666. <li><b>4</b> - rain</li>
  1667. <li><b>5</b> - frost</li>
  1668. <li><b>6</b> - forest fire</li>
  1669. <li><b>7</b> - thunderstorm</li>
  1670. <li><b>8</b> - glaze</li>
  1671. <li><b>9</b> - heat</li>
  1672. <li><b>10</b> - freezing rain</li>
  1673. <li><b>11</b> - soil frost</li>
  1674. </ul>
  1675. <li><b>Warn_</b><i>0</i><b>_uwzLevel</b> - Severity of thunderstorm (0-5)</li>
  1676. <li><b>Warn_</b><i>0</i><b>_uwzLevel_Str</b> - Severity of thunderstorm (text)</li>
  1677. <li><b>Warn_</b><i>0</i><b>_levelName</b> - Level Warn Name</li>
  1678. <li><b>Warn_</b><i>0</i><b>_ShortText</b> - short warn text</li>
  1679. <li><b>Warn_</b><i>0</i><b>_LongText</b> - detailed warn text</li>
  1680. <li><b>Warn_</b><i>0</i><b>_IconURL</b> - cumulated URL to display warn-icons from <a href="http://www.unwetterzentrale.de">www.unwetterzentrale.de</a></li>
  1681. </ul>
  1682. <br>
  1683. <a name="UWZweblinks"></a>
  1684. <b>Weblinks</b>
  1685. <ul>
  1686. <br>
  1687. With the additional implemented functions <code>UWZAsHtml, UWZAsHtmlLite, UWZAsHtmlFP, UWZAsHtmlKarteLand and UWZAsHtmlMovie</code> HTML-Code will be created to display warnings and weathermovies, using weblinks.
  1688. <br><br><br>
  1689. Example:
  1690. <br>
  1691. <li><code>define UnwetterDetailiert weblink htmlCode {UWZAsHtml("Unwetterzentrale")}</code></li>
  1692. <br>
  1693. <li><code>define UnwetterLite weblink htmlCode {UWZAsHtmlLite("Unwetterzentrale")}</code></li>
  1694. <br>
  1695. <li><code>define UnwetterFloorplan weblink htmlCode {UWZAsHtmlFP("Unwetterzentrale")}</code></li>
  1696. <br>
  1697. <li><code>define UnwetterKarteLand weblink htmlCode {UWZAsHtmlKarteLand("Unwetterzentrale","Bayern")}</code></li>
  1698. <ul>
  1699. <li>The second parameter should be one of:
  1700. <ul>
  1701. <li>europa</li>
  1702. <br/>
  1703. <li>deutschland</li>
  1704. <li>deutschland-small</li>
  1705. <li>niedersachsen</li>
  1706. <li>bremen</li>
  1707. <li>bayern</li>
  1708. <li>schleswig-holstein</li>
  1709. <li>hamburg</li>
  1710. <li>mecklenburg-vorpommern</li>
  1711. <li>sachsen</li>
  1712. <li>sachsen-anhalt</li>
  1713. <li>nordrhein-westfalen</li>
  1714. <li>thueringen</li>
  1715. <li>rheinland-pfalz</li>
  1716. <li>saarland</li>
  1717. <li>baden-wuerttemberg</li>
  1718. <li>hessen</li>
  1719. <li>brandenburg</li>
  1720. <li>berlin</li>
  1721. <br/>
  1722. <li>oesterreich</li>
  1723. <li>burgenland</li>
  1724. <li>kaernten</li>
  1725. <li>niederoesterreich</li>
  1726. <li>oberoesterreich</li>
  1727. <li>salzburg</li>
  1728. <li>steiermark</li>
  1729. <li>tirol</li>
  1730. <li>vorarlberg</li>
  1731. <li>wien</li>
  1732. <br/>
  1733. <li>schweiz</li>
  1734. <li>aargau</li>
  1735. <li>appenzell_ausserrhoden</li>
  1736. <li>appenzell_innerrhoden</li>
  1737. <li>basel_landschaft</li>
  1738. <li>basel_stadt</li>
  1739. <li>bern</li>
  1740. <li>fribourg</li>
  1741. <li>geneve</li>
  1742. <li>glarus</li>
  1743. <li>graubuenden</li>
  1744. <li>jura</li>
  1745. <li>luzern</li>
  1746. <li>neuchatel</li>
  1747. <li>nidwalden</li>
  1748. <li>obwalden</li>
  1749. <li>schaffhausen</li>
  1750. <li>schwyz</li>
  1751. <li>solothurn</li>
  1752. <li>stgallen</li>
  1753. <li>ticino</li>
  1754. <li>thurgau</li>
  1755. <li>uri</li>
  1756. <li>waadt</li>
  1757. <li>wallis</li>
  1758. <li>zug</li>
  1759. <li>zuerich</li>
  1760. <br/>
  1761. <li>liechtenstein</li>
  1762. <br/>
  1763. <li>belgique</li>
  1764. <br/>
  1765. <li>denmark</li>
  1766. <br/>
  1767. <li>finnland</li>
  1768. <br/>
  1769. <li>france</li>
  1770. <li>alsace</li>
  1771. <li>aquitaine</li>
  1772. <li>basse-normandie</li>
  1773. <li>bretagne</li>
  1774. <li>champagne-ardenne</li>
  1775. <li>franche-comte</li>
  1776. <li>haute-normandie</li>
  1777. <li>ile-de-france</li>
  1778. <li>languedoc-roussillon</li>
  1779. <li>limousin</li>
  1780. <li>lorraine</li>
  1781. <li>bourgogne</li>
  1782. <li>centre</li>
  1783. <li>midi-pyrenees</li>
  1784. <li>nord-pas-de-calais</li>
  1785. <li>pays-de-la-loire</li>
  1786. <li>picardie</li>
  1787. <li>poitou-charentes</li>
  1788. <li>provence-alpes-cote-dazur</li>
  1789. <li>rhone-alpes</li>
  1790. <br/>
  1791. <li>letzebuerg</li>
  1792. <br/>
  1793. <li>nederland</li>
  1794. <li>drenthe</li>
  1795. <li>flevoland</li>
  1796. <li>friesland</li>
  1797. <li>gelderland</li>
  1798. <li>groningen</li>
  1799. <li>limburg</li>
  1800. <li>noordbrabant</li>
  1801. <li>noordholland</li>
  1802. <li>overijssel</li>
  1803. <li>utrecht</li>
  1804. <li>zeeland</li>
  1805. <li>zuidholland</li>
  1806. <br/>
  1807. <li>norwegen</li>
  1808. <br/>
  1809. <li>portugal</li>
  1810. <br/>
  1811. <li>sverige</li>
  1812. <br/>
  1813. <li>espana</li>
  1814. <br/>
  1815. <li>unitedkingdom</li>
  1816. <li>eastofengland</li>
  1817. <li>eastmidlands</li>
  1818. <li>london</li>
  1819. <li>northeastengland</li>
  1820. <li>northernireland</li>
  1821. <li>northwestengland</li>
  1822. <li>scotland</li>
  1823. <li>southeastengland</li>
  1824. <li>southwestengland</li>
  1825. <li>wales</li>
  1826. <li>westmidlands</li>
  1827. <li>yorkshireandthehumber</li>
  1828. <br/>
  1829. <li>isobaren1</li>
  1830. <li>isobaren2</li>
  1831. <li>isobaren3</li>
  1832. </ul>
  1833. </li>
  1834. </ul>
  1835. <li><code>define UnwetterKarteMovie weblink htmlCode {UWZAsHtmlMovie("Unwetterzentrale","currents")}</code></li>
  1836. <ul>
  1837. <li>The second parameter should be one of:
  1838. <ul>
  1839. <li>niederschlag-wolken</li>
  1840. <li>stroemung</li>
  1841. <li>temperatur</li>
  1842. <br/>
  1843. <li>niederschlag-wolken-de</li>
  1844. <li>stroemung-de</li>
  1845. <br/>
  1846. <li>niederschlag-wolken-ch</li>
  1847. <li>stroemung-ch</li>
  1848. <br/>
  1849. <li>niederschlag-wolken-at</li>
  1850. <li>stroemung-at</li>
  1851. <br/>
  1852. <li>neerslag-wolken-nl</li>
  1853. <li>stroming-nl</li>
  1854. <br/>
  1855. <li>nuages-precipitations-fr</li>
  1856. <li>courants-fr</li>
  1857. <br/>
  1858. <li>clouds-precipitation-uk</li>
  1859. <li>currents-uk</li>
  1860. <br/>
  1861. </ul>
  1862. </li>
  1863. </ul>
  1864. <br/><br/>
  1865. </ul>
  1866. <br>
  1867. </ul>
  1868. =end html
  1869. =begin html_DE
  1870. <a name="UWZ"></a>
  1871. <h3>UWZ</h3>
  1872. <ul>
  1873. <a name="UWZdefine"></a>
  1874. Das Modul extrahiert Unwetterwarnungen von <a href="http://www.unwetterzentrale.de">www.unwetterzentrale.de</a>.
  1875. <br/>
  1876. Hierfür wird die selbe Schnittstelle verwendet die auch die Android App <a href="http://www.alertspro.com">Alerts Pro</a> nutzt.
  1877. Es werden maximal 10 Standortbezogene Unwetterwarnungen zur Verfügung gestellt.
  1878. Weiterhin verfügt das Modul über HTML-Templates welche als weblink verwendet werden können.
  1879. <br>
  1880. <i>Es nutzt die Perl-Module HTTP::Request, LWP::UserAgent, JSON, Encode::Guess und HTML::Parse</i>.
  1881. <br/><br/>
  1882. <b>Define</b>
  1883. <ul>
  1884. <br>
  1885. <code>define &lt;Name&gt; UWZ [L&auml;ndercode] [Postleitzahl] [INTERVAL]</code>
  1886. <br><br><br>
  1887. Beispiel:
  1888. <br>
  1889. <code>define Unwetterzentrale UWZ DE 86405 3600</code>
  1890. <br>&nbsp;
  1891. <li><code>[L&auml;ndercode]</code>
  1892. <br>
  1893. M&ouml;gliche Werte: DE, AT, CH, SEARCH, ...<br/>
  1894. (f&uuml;r ander L&auml;nder als Deutschland bitte den SEARCH Parameter nutzen um die AreaID zu ermitteln.)
  1895. </li><br>
  1896. <li><code>[Postleitzahl/AreaID]</code>
  1897. <br>
  1898. Die Postleitzahl/AreaID des Ortes für den Unwetterinformationen abgefragt werden sollen.
  1899. <br>
  1900. </li><br>
  1901. <li><code>[INTERVAL]</code>
  1902. <br>
  1903. Definiert das Interval zur aktualisierung der Unwetterwarnungen. Das Interval wird in Sekunden angegeben, somit aktualisiert das Modul bei einem Interval von 3600 jede Stunde 1 mal.
  1904. <br>
  1905. </li><br>
  1906. </ul>
  1907. <br>
  1908. <a name="UWZget"></a>
  1909. <b>Get</b>
  1910. <ul>
  1911. <br>
  1912. <li><code>get &lt;name&gt; Bodenfrost</code>
  1913. <br>
  1914. Gibt aus ob aktuell eine Bodenfrostwarnung besteht (active|inactive).
  1915. </li><br>
  1916. <li><code>get &lt;name&gt; Extremfrost</code>
  1917. <br>
  1918. Gibt aus ob aktuell eine Extremfrostwarnung besteht (active|inactive).
  1919. </li><br>
  1920. <li><code>get &lt;name&gt; Gewitter</code>
  1921. <br>
  1922. Gibt aus ob aktuell eine Gewitter Warnung besteht (active|inactive).
  1923. </li><br>
  1924. <li><code>get &lt;name&gt; Glaette</code>
  1925. <br>
  1926. Gibt aus ob aktuell eine Glaettewarnung besteht (active|inactive).
  1927. </li><br>
  1928. <li><code>get &lt;name&gt; Glatteisregen</code>
  1929. <br>
  1930. Gibt aus ob aktuell eine Glatteisregen Warnung besteht (active|inactive).
  1931. </li><br>
  1932. <li><code>get &lt;name&gt; Hagel</code>
  1933. <br>
  1934. Gibt aus ob aktuell eine Hagel Warnung besteht (active|inactive).
  1935. </li><br>
  1936. <li><code>get &lt;name&gt; Hitze</code>
  1937. <br>
  1938. Gibt aus ob aktuell eine Hitze Warnung besteht (active|inactive).
  1939. </li><br>
  1940. <li><code>get &lt;name&gt; Regen</code>
  1941. <br>
  1942. Gibt aus ob aktuell eine Regen Warnung besteht (active|inactive).
  1943. </li><br>
  1944. <li><code>get &lt;name&gt; Schneefall</code>
  1945. <br>
  1946. Gibt aus ob aktuell eine Schneefall Warnung besteht (active|inactive).
  1947. </li><br>
  1948. <li><code>get &lt;name&gt; Sturm</code>
  1949. <br>
  1950. Gibt aus ob aktuell eine Sturm Warnung besteht (active|inactive).
  1951. </li><br>
  1952. <li><code>get &lt;name&gt; Waldbrand</code>
  1953. <br>
  1954. Gibt aus ob aktuell eine Waldbrand Warnung besteht (active|inactive).
  1955. </li><br>
  1956. </ul>
  1957. <br>
  1958. <b>Get (Search-Mode)</b>
  1959. <ul>
  1960. <br>
  1961. <li><code>get &lt;name&gt; SearchAreaID &lt;gesuchte_stadt&gt;</code>
  1962. <br>
  1963. Gibt die AreaID zum eingegebenen Ort aus.
  1964. </li><br>
  1965. </ul>
  1966. <br>
  1967. <a name="UWZset"></a>
  1968. <b>Set</b>
  1969. <ul>
  1970. <br>
  1971. <li><code>set &lt;name&gt; update</code>
  1972. <br>
  1973. Startet sofort ein neues Auslesen der Unwetterinformationen.
  1974. </li><br>
  1975. </ul>
  1976. <br>
  1977. <a name="UWZattr"></a>
  1978. <b>Attribute</b>
  1979. <ul>
  1980. <br>
  1981. <li><code>download</code>
  1982. <br>
  1983. Download Unwetterkarten während des updates (0|1).
  1984. <br>
  1985. </li>
  1986. <li><code>savepath</code>
  1987. <br>
  1988. Pfad zum speichern der Karten (default: /tmp/).
  1989. <br>
  1990. </li>
  1991. <li><code>maps</code>
  1992. <br>
  1993. Leerzeichen separierte Liste der zu speichernden Karten. Für mögliche Karten siehe <code>UWZAsHtmlKarteLand</code>.
  1994. <br>
  1995. </li>
  1996. <li><code>humanreadable</code>
  1997. <br>
  1998. Anzeige weiterer Readings Warn_?_Start_Date, Warn_?_Start_Time, Warn_?_End_Date, Warn_?_End_Time. Diese Readings enthalten aus dem Timestamp kalkulierte Datums/Zeit Angaben. Weiterhin werden folgende Readings aktivier: Warn_?_Type_Str und Warn_?_uwzLevel_Str welche den Unwettertyp als auch das Unwetter-Warn-Level als Text ausgeben. (0|1)
  1999. <br>
  2000. </li>
  2001. <li><code>lang</code>
  2002. <br>
  2003. Umschalten der angeforderten Sprache für kurz und lange warn text. (de|en|it|fr|es|..).
  2004. <br>
  2005. </li>
  2006. <li><code>sort_readings_by</code>
  2007. <br>
  2008. Sortierreihenfolge der Warnmeldungen. (start|severity|creation).
  2009. <br>
  2010. </li>
  2011. <li><code>htmlsequence</code>
  2012. <br>
  2013. Anzeigereihenfolge der html warnungen. (ascending|descending).
  2014. <br>
  2015. </li>
  2016. <li><code>htmltitle</code>
  2017. <br>
  2018. Titel / Ueberschrift der HTML Ausgabe
  2019. <br>
  2020. </li>
  2021. <li><code>htmltitleclass</code>
  2022. <br>
  2023. css-Class des Titels der HTML Ausgabe
  2024. <br>
  2025. </li>
  2026. <li><code>localiconbase</code>
  2027. <br>
  2028. BaseURL angeben um Warn Icons lokal zu hosten. (Dateityp ist png).
  2029. <br>
  2030. </li>
  2031. <li><code>intervalAtWarnLevel</code>
  2032. <br>
  2033. konfiguriert den Interval je nach WarnLevel. Beispiel: 2=1800,3=900,4=300
  2034. <br>
  2035. </li>
  2036. <br>
  2037. </ul>
  2038. <br>
  2039. <a name="UWZreading"></a>
  2040. <b>Readings</b>
  2041. <ul>
  2042. <br>
  2043. <li><b>Warn_</b><i>0|1|2|3...|9</i><b>_...</b> - aktive Warnmeldungen</li>
  2044. <li><b>WarnCount</b> - Anzahl der aktiven Warnmeldungen</li>
  2045. <li><b>WarnUWZLevel</b> - Gesamt Warn Level </li>
  2046. <li><b>WarnUWZLevel_Color</b> - Gesamt Warn Level Farbe</li>
  2047. <li><b>WarnUWZLevel_Str</b> - Gesamt Warn Level Text</li>
  2048. <li><b>Warn_</b><i>0</i><b>_AltitudeMin</b> - minimum Höhe für Warnung </li>
  2049. <li><b>Warn_</b><i>0</i><b>_AltitudeMax</b> - maximum Höhe für Warnung </li>
  2050. <li><b>Warn_</b><i>0</i><b>_EventID</b> - EventID der Warnung </li>
  2051. <li><b>Warn_</b><i>0</i><b>_Creation</b> - Warnungs Erzeugung </li>
  2052. <li><b>Warn_</b><i>0</i><b>_Creation_Date</b> - Warnungs Erzeugungs Datum </li>
  2053. <li><b>Warn_</b><i>0</i><b>_Creation_Time</b> - Warnungs Erzeugungs Zeit </li>
  2054. <li><b>currentIntervalMode</b> - default/warn, aktuell Verwendeter Interval. Internal INTERVAL oder INTERVALWARN</li>
  2055. <li><b>Warn_</b><i>0</i><b>_Start</b> - Begin der Warnung</li>
  2056. <li><b>Warn_</b><i>0</i><b>_Start_Date</b> - Startdatum der Warnung</li>
  2057. <li><b>Warn_</b><i>0</i><b>_Start_Time</b> - Startzeit der Warnung</li>
  2058. <li><b>Warn_</b><i>0</i><b>_End</b> - Warn Ende</li>
  2059. <li><b>Warn_</b><i>0</i><b>_End_Date</b> - Enddatum der Warnung</li>
  2060. <li><b>Warn_</b><i>0</i><b>_End_Time</b> - Endzeit der Warnung</li>
  2061. <li><b>Warn_</b><i>0</i><b>_Severity</b> - Schwere des Unwetters (0 kein Unwetter, 12 massives Unwetter)</li>
  2062. <li><b>Warn_</b><i>0</i><b>_Hail</b> - Hagelwarnung (1|0)</li>
  2063. <li><b>Warn_</b><i>0</i><b>_Type</b> - Art des Unwetters</li>
  2064. <li><b>Warn_</b><i>0</i><b>_Type_Str</b> - Art des Unwetters (text)</li>
  2065. <ul>
  2066. <li><b>1</b> - unbekannt</li>
  2067. <li><b>2</b> - Sturm/Orkan</li>
  2068. <li><b>3</b> - Schneefall</li>
  2069. <li><b>4</b> - Regen</li>
  2070. <li><b>5</b> - Extremfrost</li>
  2071. <li><b>6</b> - Waldbrandgefahr</li>
  2072. <li><b>7</b> - Gewitter</li>
  2073. <li><b>8</b> - Glätte</li>
  2074. <li><b>9</b> - Hitze</li>
  2075. <li><b>10</b> - Glatteisregen</li>
  2076. <li><b>11</b> - Bodenfrost</li>
  2077. </ul>
  2078. <li><b>Warn_</b><i>0</i><b>_uwzLevel</b> - Unwetterwarnstufe (0-5)</li>
  2079. <li><b>Warn_</b><i>0</i><b>_uwzLevel_Str</b> - Unwetterwarnstufe (text)</li>
  2080. <li><b>Warn_</b><i>0</i><b>_levelName</b> - Level Warn Name</li>
  2081. <li><b>Warn_</b><i>0</i><b>_ShortText</b> - Kurzbeschreibung der Warnung</li>
  2082. <li><b>Warn_</b><i>0</i><b>_LongText</b> - Ausführliche Unwetterbeschreibung</li>
  2083. <li><b>Warn_</b><i>0</i><b>_IconURL</b> - Kumulierte URL um Warnungs-Icon von <a href="http://www.unwetterzentrale.de">www.unwetterzentrale.de</a> anzuzeigen</li>
  2084. </ul>
  2085. <br>
  2086. <a name="UWZweblinks"></a>
  2087. <b>Weblinks</b>
  2088. <ul>
  2089. <br>
  2090. &Uuml;ber die Funktionen <code>UWZAsHtml, UWZAsHtmlLite, UWZAsHtmlFP, UWZAsHtmlKarteLand, UWZAsHtmlMovie</code> wird HTML-Code zur Warnanzeige und Wetterfilme über weblinks erzeugt.
  2091. <br><br><br>
  2092. Beispiele:
  2093. <br>
  2094. <li><code>define UnwetterDetailiert weblink htmlCode {UWZAsHtml("Unwetterzentrale")}</code></li>
  2095. <br>
  2096. <li><code>define UnwetterLite weblink htmlCode {UWZAsHtmlLite("Unwetterzentrale")}</code></li>
  2097. <br>
  2098. <li><code>define UnwetterFloorplan weblink htmlCode {UWZAsHtmlFP("Unwetterzentrale")}</code></li>
  2099. <br>
  2100. <li><code>define UnwetterKarteLand weblink htmlCode {UWZAsHtmlKarteLand("Unwetterzentrale","Bayern")}</code></li>
  2101. <ul>
  2102. <li>Der zweite Parameter kann einer der folgenden sein:
  2103. <ul>
  2104. <li>europa</li>
  2105. <br/>
  2106. <li>deutschland</li>
  2107. <li>deutschland-small</li>
  2108. <li>niedersachsen</li>
  2109. <li>bremen</li>
  2110. <li>bayern</li>
  2111. <li>schleswig-holstein</li>
  2112. <li>hamburg</li>
  2113. <li>mecklenburg-vorpommern</li>
  2114. <li>sachsen</li>
  2115. <li>sachsen-anhalt</li>
  2116. <li>nordrhein-westfalen</li>
  2117. <li>thueringen</li>
  2118. <li>rheinland-pfalz</li>
  2119. <li>saarland</li>
  2120. <li>baden-wuerttemberg</li>
  2121. <li>hessen</li>
  2122. <li>brandenburg</li>
  2123. <li>berlin</li>
  2124. <br/>
  2125. <li>oesterreich</li>
  2126. <li>burgenland</li>
  2127. <li>kaernten</li>
  2128. <li>niederoesterreich</li>
  2129. <li>oberoesterreich</li>
  2130. <li>salzburg</li>
  2131. <li>steiermark</li>
  2132. <li>tirol</li>
  2133. <li>vorarlberg</li>
  2134. <li>wien</li>
  2135. <br/>
  2136. <li>schweiz</li>
  2137. <li>aargau</li>
  2138. <li>appenzell_ausserrhoden</li>
  2139. <li>appenzell_innerrhoden</li>
  2140. <li>basel_landschaft</li>
  2141. <li>basel_stadt</li>
  2142. <li>bern</li>
  2143. <li>fribourg</li>
  2144. <li>geneve</li>
  2145. <li>glarus</li>
  2146. <li>graubuenden</li>
  2147. <li>jura</li>
  2148. <li>luzern</li>
  2149. <li>neuchatel</li>
  2150. <li>nidwalden</li>
  2151. <li>obwalden</li>
  2152. <li>schaffhausen</li>
  2153. <li>schwyz</li>
  2154. <li>solothurn</li>
  2155. <li>stgallen</li>
  2156. <li>ticino</li>
  2157. <li>thurgau</li>
  2158. <li>uri</li>
  2159. <li>waadt</li>
  2160. <li>wallis</li>
  2161. <li>zug</li>
  2162. <li>zuerich</li>
  2163. <br/>
  2164. <li>liechtenstein</li>
  2165. <br/>
  2166. <li>belgique</li>
  2167. <br/>
  2168. <li>denmark</li>
  2169. <br/>
  2170. <li>finnland</li>
  2171. <br/>
  2172. <li>france</li>
  2173. <li>alsace</li>
  2174. <li>aquitaine</li>
  2175. <li>basse-normandie</li>
  2176. <li>bretagne</li>
  2177. <li>champagne-ardenne</li>
  2178. <li>franche-comte</li>
  2179. <li>haute-normandie</li>
  2180. <li>ile-de-france</li>
  2181. <li>languedoc-roussillon</li>
  2182. <li>limousin</li>
  2183. <li>lorraine</li>
  2184. <li>bourgogne</li>
  2185. <li>centre</li>
  2186. <li>midi-pyrenees</li>
  2187. <li>nord-pas-de-calais</li>
  2188. <li>pays-de-la-loire</li>
  2189. <li>picardie</li>
  2190. <li>poitou-charentes</li>
  2191. <li>provence-alpes-cote-dazur</li>
  2192. <li>rhone-alpes</li>
  2193. <br/>
  2194. <li>letzebuerg</li>
  2195. <br/>
  2196. <li>nederland</li>
  2197. <li>drenthe</li>
  2198. <li>flevoland</li>
  2199. <li>friesland</li>
  2200. <li>gelderland</li>
  2201. <li>groningen</li>
  2202. <li>limburg</li>
  2203. <li>noordbrabant</li>
  2204. <li>noordholland</li>
  2205. <li>overijssel</li>
  2206. <li>utrecht</li>
  2207. <li>zeeland</li>
  2208. <li>zuidholland</li>
  2209. <br/>
  2210. <li>norwegen</li>
  2211. <br/>
  2212. <li>portugal</li>
  2213. <br/>
  2214. <li>sverige</li>
  2215. <br/>
  2216. <li>espana</li>
  2217. <br/>
  2218. <li>unitedkingdom</li>
  2219. <li>eastofengland</li>
  2220. <li>eastmidlands</li>
  2221. <li>london</li>
  2222. <li>northeastengland</li>
  2223. <li>northernireland</li>
  2224. <li>northwestengland</li>
  2225. <li>scotland</li>
  2226. <li>southeastengland</li>
  2227. <li>southwestengland</li>
  2228. <li>wales</li>
  2229. <li>westmidlands</li>
  2230. <li>yorkshireandthehumber</li>
  2231. <br/>
  2232. <li>isobaren1</li>
  2233. <li>isobaren2</li>
  2234. <li>isobaren3</li>
  2235. </ul>
  2236. </li>
  2237. </ul>
  2238. <li><code>define UnwetterKarteMovie weblink htmlCode {UWZAsHtmlMovie("Unwetterzentrale","niederschlag-wolken-de")}</code></li>
  2239. <ul>
  2240. <li>Der zweite Parameter kann einer der folgenden sein:
  2241. <ul>
  2242. <li>niederschlag-wolken</li>
  2243. <li>stroemung</li>
  2244. <li>temperatur</li>
  2245. <br/>
  2246. <li>niederschlag-wolken-de</li>
  2247. <li>stroemung-de</li>
  2248. <br/>
  2249. <li>niederschlag-wolken-ch</li>
  2250. <li>stroemung-ch</li>
  2251. <br/>
  2252. <li>niederschlag-wolken-at</li>
  2253. <li>stroemung-at</li>
  2254. <br/>
  2255. <li>neerslag-wolken-nl</li>
  2256. <li>stroming-nl</li>
  2257. <br/>
  2258. <li>nuages-precipitations-fr</li>
  2259. <li>courants-fr</li>
  2260. <br/>
  2261. <li>clouds-precipitation-uk</li>
  2262. <li>currents-uk</li>
  2263. <br/>
  2264. </ul>
  2265. </li>
  2266. </ul>
  2267. <br/><br/>
  2268. </ul>
  2269. <br>
  2270. </ul>
  2271. =end html_DE
  2272. =cut