14_SD_WS09.pm 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. ##############################################
  2. ##############################################
  3. # $Id: 14_SD_WS09.pm 12233 2016-10-01 22:22:51Z mrsidey $
  4. #
  5. # The purpose of this module is to support serval
  6. # weather sensors like WS-0101 (Sender 868MHz ASK Epmfänger RX868SH-DV elv)
  7. # Sidey79 & pejonp 2015
  8. #
  9. package main;
  10. use strict;
  11. use warnings;
  12. use Digest::CRC qw(crc);
  13. #use Math::Round qw/nearest/;
  14. sub SD_WS09_Initialize($)
  15. {
  16. my ($hash) = @_;
  17. $hash->{Match} = "^P9#[A-Fa-f0-9]+"; ## pos 7 ist aktuell immer 0xF
  18. $hash->{DefFn} = "SD_WS09_Define";
  19. $hash->{UndefFn} = "SD_WS09_Undef";
  20. $hash->{ParseFn} = "SD_WS09_Parse";
  21. $hash->{AttrFn} = "SD_WS09_Attr";
  22. $hash->{AttrList} = "IODev do_not_notify:1,0 ignore:0,1 showtime:1,0 "
  23. ."windKorrektur:-3,-2,-1,0,1,2,3 "
  24. ."$readingFnAttributes ";
  25. $hash->{AutoCreate} =
  26. { "SD_WS09.*" => { ATTR => "event-min-interval:.*:300 event-on-change-reading:.* windKorrektur:.*:0 " , FILTER => "%NAME", GPLOT => "temp4hum4:Temp/Hum,", autocreateThreshold => "2:180"} };
  27. }
  28. #############################
  29. sub SD_WS09_Define($$)
  30. {
  31. my ($hash, $def) = @_;
  32. my @a = split("[ \t][ \t]*", $def);
  33. return "wrong syntax: define <name> SD_WS09 <code> ".int(@a)
  34. if(int(@a) < 3 );
  35. $hash->{CODE} = $a[2];
  36. $hash->{lastMSG} = "";
  37. $hash->{bitMSG} = "";
  38. $modules{SD_WS09}{defptr}{$a[2]} = $hash;
  39. $hash->{STATE} = "Defined";
  40. my $name= $hash->{NAME};
  41. return undef;
  42. }
  43. #####################################
  44. sub SD_WS09_Undef($$)
  45. {
  46. my ($hash, $name) = @_;
  47. delete($modules{SD_WS09}{defptr}{$hash->{CODE}})
  48. if(defined($hash->{CODE}) &&
  49. defined($modules{SD_WS09}{defptr}{$hash->{CODE}}));
  50. return undef;
  51. }
  52. ###################################
  53. sub SD_WS09_Parse($$)
  54. {
  55. my ($iohash, $msg) = @_;
  56. my $name = $iohash->{NAME};
  57. my (undef ,$rawData) = split("#",$msg);
  58. my @winddir_name=("N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW");
  59. my $hlen = length($rawData);
  60. my $blen = $hlen * 4;
  61. my $bitData = unpack("B$blen", pack("H$hlen", $rawData));
  62. my $bitData2;
  63. my $bitData20;
  64. my $rain = 0;
  65. my $deviceCode = 0;
  66. my $model = "undef"; # 0xFFA -> WS0101/WH1080 alles andere -> CTW600
  67. my $modelattr ;
  68. my $modelid;
  69. my $windSpeed = 0;
  70. my $windguest =0;
  71. my $sensdata;
  72. my $id;
  73. my $bat = 0;
  74. my $temp;
  75. my $hum;
  76. my $windDirection ;
  77. my $windDirectionText;
  78. $modelattr = AttrVal($iohash->{NAME},'WS09_WSModel',0);
  79. if ($modelattr eq '0'){
  80. $modelattr = "undef";
  81. }
  82. my $crcwh1080 = AttrVal($iohash->{NAME},'WS09_CRCAUS',0);
  83. Log3 $iohash, 3, "$name: SD_WS09_Parse CRC_AUS:$crcwh1080 Model=$modelattr" ;
  84. my $syncpos= index($bitData,"11111110"); #7x1 1x0 preamble
  85. Log3 $iohash, 3, "$name: SD_WS09_Parse0 Bin=$bitData syncp=$syncpos length:".length($bitData) ;
  86. if ($syncpos ==-1 || length($bitData)-$syncpos < 78)
  87. {
  88. Log3 $iohash, 3, "$name: SD_WS09_Parse EXIT: msg=$rawData syncp=$syncpos length:".length($bitData) ;
  89. return undef;
  90. }
  91. my $wh = substr($bitData,0,8);
  92. #CRC-Check bei WH1080/WS0101 WS09_CRCAUS=0 und WS09_WSModel = undef oder Wh1080
  93. if(($crcwh1080 == 0) && ($modelattr ne "CTW600")) {
  94. if($wh == "11111111") {
  95. if ($syncpos == 0)
  96. {
  97. $hlen = length($rawData);
  98. $blen = $hlen * 4;
  99. $bitData2 = '11'.unpack("B$blen", pack("H$hlen", $rawData));
  100. $bitData20 = substr($bitData2,0,length($bitData2)-2);
  101. $blen = length($bitData20);
  102. $hlen = $blen / 4;
  103. $msg = 'P9#'.unpack("H$hlen", pack("B$blen", $bitData20));
  104. $bitData = $bitData20;
  105. Log3 $iohash, 3, "$name: SD_WS09_Parse sync1 msg=$msg syncp=$syncpos length:".length($bitData) ;
  106. }
  107. if ($syncpos == 1)
  108. {
  109. $hlen = length($rawData);
  110. $blen = $hlen * 4;
  111. $bitData2 = '1'.unpack("B$blen", pack("H$hlen", $rawData));
  112. $bitData20 = substr($bitData2,0,length($bitData2)-1);
  113. $blen = length($bitData20);
  114. $hlen = $blen / 4;
  115. $msg = 'P9#'.unpack("H$hlen", pack("B$blen", $bitData20));
  116. $bitData = $bitData20;
  117. Log3 $iohash, 3, "$name: SD_WS09_Parse sync2 msg=$msg syncp=$syncpos length:".length($bitData) ;
  118. }
  119. my $datacheck = pack( 'H*', substr($msg,5,length($msg)-5) );
  120. my $crcmein = Digest::CRC->new(width => 8, poly => 0x31);
  121. my $rr2 = $crcmein->add($datacheck)->hexdigest;
  122. if ($rr2 eq "0"){
  123. $model = "WH1080";
  124. Log3 $iohash, 3, "$name: SD_WS09_Parse CRC_OK: CRC=$rr2 Model=$model attr=$modelattr" ;
  125. }else{
  126. Log3 $iohash, 3, "$name: SD_WS09_Parse CRC_Error: msg=$msg CRC=$rr2 " ;
  127. return undef;
  128. }
  129. }else{
  130. $model = "CTW600";
  131. Log3 $iohash, 3, "$name: SD_WS09_Parse CTW600: Model=$model attr=$modelattr" ;
  132. }
  133. };
  134. if( ($wh == "11111111") || ($model eq "WH1080")) {
  135. if ($modelattr eq "CTW600"){
  136. Log3 $iohash, 3, "$name: SD_WS09_WH1080 off=$modelattr Model=$model " ;
  137. return undef;
  138. }
  139. $sensdata = substr($bitData,8);
  140. my $whid = substr($sensdata,0,4);
  141. if( $whid == "1010" ){ # A
  142. Log3 $iohash, 3, "$name: SD_WS09_Parse WH=$wh msg=$sensdata syncp=$syncpos length:".length($sensdata) ;
  143. $model = "WH1080";
  144. $id = SD_WS09_bin2dec(substr($sensdata,4,8));
  145. $bat = (SD_WS09_bin2dec((substr($sensdata,64,4))) == 0) ? 'ok':'low' ; # decode battery = 0 --> ok
  146. $temp = (SD_WS09_bin2dec(substr($sensdata,12,12)) - 400)/10;
  147. $hum = SD_WS09_bin2dec(substr($sensdata,24,8));
  148. $windDirection = SD_WS09_bin2dec(substr($sensdata,68,4));
  149. $windDirectionText = $winddir_name[$windDirection];
  150. $windSpeed = round((SD_WS09_bin2dec(substr($sensdata,32,8))* 34)/100,01);
  151. Log3 $iohash, 3, "$name: SD_WS09_Parse ".$model." Windspeed bit: ".substr($sensdata,32,8)." Dec: " . $windSpeed ;
  152. $windguest = round((SD_WS09_bin2dec(substr($sensdata,40,8)) * 34)/100,01);
  153. Log3 $iohash, 3, "$name: SD_WS09_Parse ".$model." Windguest bit: ".substr($sensdata,40,8)." Dec: " . $windguest ;
  154. $rain = SD_WS09_bin2dec(substr($sensdata,56,8)) * 0.3;
  155. Log3 $iohash, 3, "$name: SD_WS09_Parse ".$model." Rain bit: ".substr($sensdata,56,8)." Dec: " . $rain ;
  156. } else {
  157. if( $whid == "1011" ){ # B DCF-77 Zeitmeldungen vom Sensor
  158. my $hrs1 = substr($sensdata,16,8);
  159. my $hrs;
  160. my $mins;
  161. my $sec;
  162. my $mday;
  163. my $month;
  164. my $year;
  165. $id = SD_WS09_bin2dec(substr($sensdata,4,8));
  166. Log3 $iohash, 3, "$name: SD_WS09_Parse Zeitmeldung0: HRS1=$hrs1 id:$id" ;
  167. $hrs = SD_WS09_BCD2bin(substr($sensdata,18,6) ) ; # Stunde
  168. $mins = SD_WS09_BCD2bin(substr($sensdata,24,8)); # Minute
  169. $sec = SD_WS09_BCD2bin(substr($sensdata,32,8)); # Sekunde
  170. #day month year
  171. $year = SD_WS09_BCD2bin(substr($sensdata,40,8)); # Jahr
  172. $month = SD_WS09_BCD2bin(substr($sensdata,51,5)); # Monat
  173. $mday = SD_WS09_BCD2bin(substr($sensdata,56,8)); # Tag
  174. Log3 $iohash, 3, "$name: SD_WS09_Parse Zeitmeldung1: msg=$rawData syncp=$syncpos length:".length($bitData) ;
  175. Log3 $iohash, 3, "$name: SD_WS09_Parse Zeitmeldung2: HH:mm:ss - ".$hrs.":".$mins.":".$sec ;
  176. Log3 $iohash, 3, "$name: SD_WS09_Parse Zeitmeldung3: dd.mm.yy - ".$mday.":".$month.":".$year ;
  177. return $name;
  178. }
  179. Log3 $iohash, 3, "$name: SD_WS09_Parse Zeitmeldung4: msg=$rawData syncp=$syncpos length:".length($sensdata) ;
  180. return undef;
  181. }
  182. }else{
  183. if ($modelattr eq "WH1080"){
  184. Log3 $iohash, 3, "$name: SD_WS09_CTW600 off=$modelattr Model=$model " ;
  185. return undef;
  186. } else {
  187. # eine CTW600 wurde erkannt
  188. $sensdata = substr($bitData,$syncpos+8);
  189. Log3 $iohash, 3, "$name: SD_WS09_Parse CTW WH=$wh msg=$sensdata syncp=$syncpos length:".length($sensdata) ;
  190. $model = "CTW600";
  191. my $nn1 = substr($sensdata,10,2); # Keine Bedeutung
  192. my $nn2 = substr($sensdata,62,4); # Keine Bedeutung
  193. $modelid = substr($sensdata,0,4);
  194. Log3 $iohash, 3, "$name: SD_WS09_Parse Id: ".$modelid." NN1:$nn1 NN2:$nn2" ;
  195. Log3 $iohash, 3, "$name: SD_WS09_Parse Id: ".$modelid." Bin-Sync=$sensdata syncp=$syncpos length:".length($sensdata) ;
  196. $bat = SD_WS09_bin2dec((substr($sensdata,0,3))) ;
  197. $id = SD_WS09_bin2dec(substr($sensdata,4,6));
  198. $temp = (SD_WS09_bin2dec(substr($sensdata,12,10)) - 400)/10;
  199. $hum = SD_WS09_bin2dec(substr($sensdata,22,8));
  200. $windDirection = SD_WS09_bin2dec(substr($sensdata,66,4));
  201. $windDirectionText = $winddir_name[$windDirection];
  202. $windSpeed = round(SD_WS09_bin2dec(substr($sensdata,30,16))/240,01);
  203. Log3 $iohash, 3, "$name: SD_WS09_Parse ".$model." Windspeed bit: ".substr($sensdata,32,8)." Dec: " . $windSpeed ;
  204. $windguest = round((SD_WS09_bin2dec(substr($sensdata,40,8)) * 34)/100,01);
  205. Log3 $iohash, 3, "$name: SD_WS09_Parse ".$model." Windguest bit: ".substr($sensdata,40,8)." Dec: " . $windguest ;
  206. $rain = round(SD_WS09_bin2dec(substr($sensdata,46,16)) * 0.3,01);
  207. Log3 $iohash, 3, "$name: SD_WS09_Parse ".$model." Rain bit: ".substr($sensdata,46,16)." Dec: " . $rain ;
  208. }
  209. }
  210. Log3 $iohash, 3, "$name: SD_WS09_Parse ".$model." id:$id :$sensdata ";
  211. Log3 $iohash, 3, "$name: SD_WS09_Parse ".$model." id:$id, bat:$bat, temp=$temp, hum=$hum, winddir=$windDirection:$windDirectionText wS=$windSpeed, wG=$windguest, rain=$rain";
  212. if($hum > 100 || $hum < 0) {
  213. Log3 $iohash, 3, "$name: SD_WS09_Parse HUM: hum=$hum msg=$rawData " ;
  214. return undef;
  215. }
  216. if($temp > 60 || $temp < -40) {
  217. Log3 $iohash, 3, "$name: SD_WS09_Parse TEMP: Temp=$temp msg=$rawData " ;
  218. return undef;
  219. }
  220. my $longids = AttrVal($iohash->{NAME},'longids',0);
  221. if ( ($longids ne "0") && ($longids eq "1" || $longids eq "ALL" || (",$longids," =~ m/,$model,/)))
  222. {
  223. $deviceCode=$model."_".$id;
  224. Log3 $iohash,4, "$name: SD_WS09_Parse using longid: $longids model: $model";
  225. } else {
  226. $deviceCode = $model;
  227. }
  228. my $def = $modules{SD_WS09}{defptr}{$iohash->{NAME} . "." . $deviceCode};
  229. $def = $modules{SD_WS09}{defptr}{$deviceCode} if(!$def);
  230. if(!$def) {
  231. Log3 $iohash, 1, 'SD_WS09_Parse UNDEFINED sensor ' . $model . ' detected, code ' . $deviceCode;
  232. return "UNDEFINED $deviceCode SD_WS09 $deviceCode";
  233. }
  234. my $hash = $def;
  235. $name = $hash->{NAME};
  236. Log3 $name, 4, "SD_WS09_Parse: $name ($rawData)";
  237. my $windkorr = AttrVal($hash->{NAME},'windKorrektur',0);
  238. if ($windkorr != 0 )
  239. {
  240. my $oldwinddir = $windDirection;
  241. $windDirection = $windDirection + $windkorr;
  242. $windDirectionText = $winddir_name[$windDirection];
  243. Log3 $iohash, 3, "SD_WS09_Parse ".$model." Faktor:$windkorr wD:$oldwinddir Korrektur wD:$windDirection:$windDirectionText" ;
  244. }
  245. if (!defined(AttrVal($hash->{NAME},"event-min-interval",undef)))
  246. {
  247. my $minsecs = AttrVal($iohash->{NAME},'minsecs',0);
  248. if($hash->{lastReceive} && (time() - $hash->{lastReceive} < $minsecs)) {
  249. Log3 $hash, 4, "SD_WS09_Parse $deviceCode Dropped due to short time. minsecs=$minsecs";
  250. return "";
  251. }
  252. }
  253. $def->{lastMSG} = $rawData;
  254. my $state = "T: $temp ". ($hum>0 ? " H: $hum ":" ")." Ws: $windSpeed "." Wg: $windguest "." Wd: $windDirectionText "." R: $rain";
  255. readingsBeginUpdate($hash);
  256. readingsBulkUpdate($hash, "state", $state);
  257. readingsBulkUpdate($hash, "temperature", $temp) if ($temp ne"");
  258. readingsBulkUpdate($hash, "humidity", $hum) if ($hum ne "" && $hum != 0 );
  259. readingsBulkUpdate($hash, "battery", $bat) if ($bat ne "");
  260. readingsBulkUpdate($hash, "id", $id) if ($id ne "");
  261. #zusätzlich Daten für Wetterstation
  262. readingsBulkUpdate($hash, "rain", $rain );
  263. readingsBulkUpdate($hash, "windGust", $windguest );
  264. readingsBulkUpdate($hash, "windSpeed", $windSpeed );
  265. readingsBulkUpdate($hash, "windDirection", $windDirection );
  266. readingsBulkUpdate($hash, "windDirectionDegree", $windDirection * 360 / 16);
  267. readingsBulkUpdate($hash, "windDirectionText", $windDirectionText );
  268. readingsEndUpdate($hash, 1); # Notify is done by Dispatch
  269. return $name;
  270. }
  271. sub SD_WS09_Attr(@)
  272. {
  273. my @a = @_;
  274. # Make possible to use the same code for different logical devices when they
  275. # are received through different physical devices.
  276. return if($a[0] ne "set" || $a[2] ne "IODev");
  277. my $hash = $defs{$a[1]};
  278. my $iohash = $defs{$a[3]};
  279. my $cde = $hash->{CODE};
  280. delete($modules{SD_WS09}{defptr}{$cde});
  281. $modules{SD_WS09}{defptr}{$iohash->{NAME} . "." . $cde} = $hash;
  282. return undef;
  283. }
  284. sub SD_WS09_bin2dec($)
  285. {
  286. my $h = shift;
  287. my $int = unpack("N", pack("B32",substr("0" x 32 . $h, -32)));
  288. return sprintf("%d", $int);
  289. }
  290. sub SD_WS09_binflip($)
  291. {
  292. my $h = shift;
  293. my $hlen = length($h);
  294. my $i = 0;
  295. my $flip = "";
  296. for ($i=$hlen-1; $i >= 0; $i--) {
  297. $flip = $flip.substr($h,$i,1);
  298. }
  299. return $flip;
  300. }
  301. sub SD_WS09_BCD2bin($) {
  302. my $binary = shift;
  303. my $int = unpack("N", pack("B32", substr("0" x 32 . $binary, -32)));
  304. my $BCD = sprintf("%x", $int );
  305. return $BCD;
  306. }
  307. 1;
  308. =pod
  309. =item summary Supports weather sensors protocl 9 from SIGNALduino
  310. =item summary_DE Unterst&uumltzt Wettersensoren mit Protokol 9 vom SIGNALduino
  311. =begin html
  312. <a name="SD_WS09"></a>
  313. <h3>Wether Sensors protocol #9</h3>
  314. <ul>
  315. The SD_WS09 module interprets temperature sensor messages received by a Device like CUL, CUN, SIGNALduino etc.<br>
  316. Requires Perl-Modul Digest::CRC. <br>
  317. <br>
  318. cpan install Digest::CRC or sudo apt-get install libdigest-crc-perl <br>
  319. <br>
  320. <br>
  321. <b>Known models:</b>
  322. <ul>
  323. <li>WS-0101 --> Model: WH1080</li>
  324. <li>TFA 30.3189 / WH1080 --> Model: WH1080</li>
  325. <li>1073 (WS1080) --> Model: WH1080</li>
  326. <li>CTW600 --> Model: CTW600 (??) </li>
  327. </ul>
  328. <br>
  329. New received device are add in fhem with autocreate.
  330. <br><br>
  331. <a name="SD_WS09_Define"></a>
  332. <b>Define</b>
  333. <ul>The received devices created automatically.<br>
  334. The ID of the defice is the model or, if the longid attribute is specified, it is a combination of model and some random generated bits at powering the sensor.<br>
  335. If you want to use more sensors, you can use the longid option to differentiate them.
  336. </ul>
  337. <br>
  338. <a name="SD_WS09 Events"></a>
  339. <b>Generated readings:</b>
  340. <br>Some devices may not support all readings, so they will not be presented<br>
  341. <ul>
  342. <li>State (T: H: Ws: Wg: Wd: R: ) temperature, humidity, windSpeed, windGuest, windDirection, Rain</li>
  343. <li>Temperature (&deg;C)</li>
  344. <li>Humidity: (The humidity (1-100 if available)</li>
  345. <li>Battery: (low or ok)</li>
  346. <li>ID: (The ID-Number (number if)</li>
  347. <li>windSpeed (m/s) and windDirection (N-O-S-W)</li>
  348. <li>Rain (mm)</li>
  349. </ul>
  350. <br>
  351. <b>Attributes</b>
  352. <ul>
  353. <li><a href="#do_not_notify">do_not_notify</a></li>
  354. <li><a href="#ignore">ignore</a></li>
  355. <li><a href="#showtime">showtime</a></li>
  356. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  357. <li>Model<br>
  358. WH1080, CTW600
  359. </li><br>
  360. <li>windKorrektur<br>
  361. -3,-2,-1,0,1,2,3
  362. </li><br>
  363. </ul>
  364. <a name="SD_WS09_Set"></a>
  365. <b>Set</b> <ul>N/A</ul><br>
  366. <a name="SD_WS09_Parse"></a>
  367. <b>Set</b> <ul>N/A</ul><br>
  368. </ul>
  369. =end html
  370. =begin html_DE
  371. <a name="SD_WS09"></a>
  372. <h3>SD_WS09</h3>
  373. <ul>
  374. Das SD_WS09 Module verarbeitet von einem IO Gerät (CUL, CUN, SIGNALDuino, etc.) empfangene Nachrichten von Temperatur-Sensoren.<br>
  375. <br>
  376. Perl-Modul Digest::CRC erforderlich. <br>
  377. <br>
  378. cpan install Digest::CRC oder auch <br>
  379. sudo apt-get install libdigest-crc-perl <br>
  380. <br>
  381. <br>
  382. <b>Unterstütze Modelle:</b>
  383. <ul>
  384. <li>WS-0101 --> Model: WH1080</li>
  385. <li>TFA 30.3189 / WH1080 --> Model: WH1080</li>
  386. <li>1073 (WS1080) --> Model: WH1080</li>
  387. <li>CTW600 --> Model: CTW600 (nicht getestet) </li>
  388. </ul>
  389. <br>
  390. Neu empfangene Sensoren werden in FHEM per autocreate angelegt.
  391. <br><br>
  392. <a name="SD_WS09_Define"></a>
  393. <b>Define</b>
  394. <ul>Die empfangenen Sensoren werden automatisch angelegt.<br>
  395. Die ID der angelegten Sensoren wird nach jedem Batteriewechsel ge&aumlndert, welche der Sensor beim Einschalten zuf&aumlllig vergibt.<br>
  396. CRC Checksumme wird zur Zeit noch nicht überpr&uumlft, deshalb werden Sensoren bei denen die Luftfeuchte < 0 oder > 100 ist, nicht angelegt.<br>
  397. </ul>
  398. <br>
  399. <a name="SD_WS09 Events"></a>
  400. <b>Generierte Readings:</b>
  401. <ul>
  402. <li>State (T: H: Ws: Wg: Wd: R: ) temperature, humidity, windSpeed, windGuest, windDirection, Rain</li>
  403. <li>Temperature (&deg;C)</li>
  404. <li>Humidity: (The humidity (1-100 if available)</li>
  405. <li>Battery: (low or ok)</li>
  406. <li>ID: (The ID-Number (number if)</li>
  407. <li>windSpeed (m/s) and windDirection (N-O-S-W)</li>
  408. <li>Rain (mm)</li>
  409. </ul>
  410. <br>
  411. <b>Attribute</b>
  412. <ul>
  413. <li><a href="#do_not_notify">do_not_notify</a></li>
  414. <li><a href="#ignore">ignore</a></li>
  415. <li><a href="#showtime">showtime</a></li>
  416. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  417. <li>Model<br>
  418. WH1080, CTW600
  419. </li><br>
  420. <li>windKorrektur<br>
  421. Korrigiert die Nord-Ausrichtung des Windrichtungsmessers, wenn dieser nicht richtig nach Norden ausgerichtet ist.
  422. -3,-2,-1,0,1,2,3
  423. </li><br>
  424. </ul>
  425. <a name="SD_WS09_Set"></a>
  426. <b>Set</b> <ul>N/A</ul><br>
  427. <a name="SD_WS09_Parse"></a>
  428. <b>Set</b> <ul>N/A</ul><br>
  429. </ul>
  430. =end html_DE
  431. =cut