42_SMARTMON.pm 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  1. ################################################################
  2. #
  3. # Copyright notice
  4. #
  5. # (c) 2014 Alexander Schulz
  6. #
  7. # This script is free software; you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License as published by
  9. # the Free Software Foundation; either version 2 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # The GNU General Public License can be found at
  13. # http://www.gnu.org/copyleft/gpl.html.
  14. # A copy is found in the textfile GPL.txt and important notices to the license
  15. # from the author is found in LICENSE.txt distributed with these scripts.
  16. #
  17. # This script is distributed in the hope that it will be useful,
  18. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. # GNU General Public License for more details.
  21. #
  22. # This copyright notice MUST APPEAR in all copies of the script!
  23. #
  24. ################################################################
  25. # $Id$
  26. package main;
  27. use strict;
  28. use warnings;
  29. use Data::Dumper;
  30. my $VERSION = "0.9.1.1";
  31. my $DEFAULT_INTERVAL = 60; # in minuten
  32. sub SMARTMON_refreshReadings($);
  33. sub SMARTMON_obtainParameters($);
  34. sub SMARTMON_getSmartDataReadings($$);
  35. sub SMARTMON_interpretKnownData($$$);
  36. sub SMARTMON_readSmartData($;$);
  37. sub SMARTMON_readDeviceData($%);
  38. sub SMARTMON_sec2Dauer($);
  39. sub SMARTMON_hour2Dauer($);
  40. sub SMARTMON_execute($$);
  41. sub SMARTMON_Initialize($)
  42. {
  43. my ($hash) = @_;
  44. Log 5, "SMARTMON Initialize";
  45. $hash->{DefFn} = "SMARTMON_Define";
  46. $hash->{UndefFn} = "SMARTMON_Undefine";
  47. $hash->{GetFn} = "SMARTMON_Get";
  48. #$hash->{SetFn} = "SMARTMON_Set";
  49. $hash->{AttrFn} = "SMARTMON_Attr";
  50. $hash->{AttrList} = "show_raw:0,1,2 disable:0,1 include parameters ".$readingFnAttributes;
  51. }
  52. sub SMARTMON_Log($$$) {
  53. my ( $hash, $loglevel, $text ) = @_;
  54. my $xline = ( caller(0) )[2];
  55. my $xsubroutine = ( caller(1) )[3];
  56. my $sub = ( split( ':', $xsubroutine ) )[2];
  57. $sub =~ s/SMARTMON_//;
  58. my $instName = ( ref($hash) eq "HASH" ) ? $hash->{NAME} : $hash;
  59. Log3 $hash, $loglevel, "SMARTMON $instName: $sub.$xline " . $text;
  60. }
  61. my $device;
  62. sub SMARTMON_Define($$)
  63. {
  64. my ($hash, $def) = @_;
  65. SMARTMON_Log($hash, 4, "Define $def");
  66. my @a = split("[ \t][ \t]*", $def);
  67. SMARTMON_Log($hash, 5, "Define: ".Dumper(@a));
  68. return "Usage: define <name> SMARTMON <device> [M1]" if(@a < 3);
  69. $hash->{DEVICE} = $a[2];
  70. if(int(@a)>=4)
  71. {
  72. $hash->{INTERVAL} = $a[3]*60;
  73. } else {
  74. $hash->{INTERVAL} = $DEFAULT_INTERVAL*60;
  75. }
  76. $hash->{STATE} = "Initialized";
  77. RemoveInternalTimer($hash);
  78. # erstes update zeitversetzt starten
  79. InternalTimer(gettimeofday()+10, "SMARTMON_Update", $hash, 0);
  80. return undef;
  81. }
  82. sub SMARTMON_Undefine($$)
  83. {
  84. my ($hash, $arg) = @_;
  85. SMARTMON_Log($hash, 4, "Undefine");
  86. RemoveInternalTimer($hash);
  87. return undef;
  88. }
  89. sub SMARTMON_Get($@)
  90. {
  91. # http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2004/10/Die-Zuverlaessigkeit-von-Festplatten-ueberwachen-mit-smartmontools
  92. my ($hash, @a) = @_;
  93. my $name = $a[0];
  94. if(@a < 2)
  95. {
  96. return "$name: get needs at least one parameter";
  97. }
  98. my $cmd= $a[1];
  99. SMARTMON_Log($hash, 5, "Get: ".Dumper(@a));
  100. if($cmd eq "update")
  101. {
  102. SMARTMON_refreshReadings($hash);
  103. return undef;
  104. }
  105. my $param="";
  106. if($hash->{PARAMETERS}) {$param=" ".$hash->{PARAMETERS};}
  107. if($cmd eq "list")
  108. {
  109. if(@a<3) {return "$name: get list needs at least one parameter"; }
  110. my $subcmd=$a[2];
  111. my $t;
  112. if($subcmd eq "info") {
  113. my $tdev = $hash->{DEVICE};
  114. if(@a>3) {$tdev=$a[3];}
  115. $t = SMARTMON_execute($hash, "sudo smartctl -i".$param." ".$tdev);
  116. }
  117. if($subcmd eq "data") {
  118. my $tdev = $hash->{DEVICE};
  119. if(@a>3) {$tdev=$a[3];}
  120. $t = SMARTMON_execute($hash, "sudo smartctl -A".$param." ".$tdev);
  121. }
  122. if($subcmd eq "health") {
  123. my $tdev = $hash->{DEVICE};
  124. if(@a>3) {$tdev=$a[3];}
  125. $t = SMARTMON_execute($hash, "sudo smartctl -H".$param." ".$tdev);
  126. }
  127. if($subcmd eq "devices") {
  128. $t = SMARTMON_execute($hash, "sudo smartctl --scan");
  129. }
  130. if(!$t) {return "unknown parameter";}
  131. return $t;
  132. }
  133. if($cmd eq "version")
  134. {
  135. return $VERSION;
  136. }
  137. return "Unknown argument $cmd, choose one of update:noArg version:noArg list:devices,info,data,health";
  138. }
  139. sub SMARTMON_Attr($$$) {
  140. my ($cmd, $name, $attrName, $attrVal) = @_;
  141. $attrVal= "" unless defined($attrVal);
  142. Log 5, "SMARTMON Attr: $cmd $name $attrName $attrVal";
  143. my $hash = $main::defs{$name};
  144. my $orig = AttrVal($name, $attrName, "");
  145. if( $cmd eq "set" ) {# set, del
  146. if( $orig ne $attrVal ) {
  147. $attr{$name}{$attrName} = $attrVal;
  148. if($attrName eq "disable") {
  149. # NOP
  150. }
  151. if($attrName eq "parameters") {
  152. $hash->{PARAMETERS}=$attrVal;
  153. }
  154. if($attrName eq "show_raw") {
  155. SMARTMON_refreshReadings($hash);
  156. }
  157. if($attrName eq "include") {
  158. SMARTMON_refreshReadings($hash);
  159. }
  160. #return $attrName ." set to ". $attrVal;
  161. return undef;
  162. }
  163. }
  164. if( $cmd eq "del" ) {# set,
  165. if($attrName eq "show_raw") {
  166. delete $attr{$name}{$attrName};
  167. SMARTMON_refreshReadings($hash);
  168. }
  169. if($attrName eq "include") {
  170. delete $attr{$name}{$attrName};
  171. SMARTMON_refreshReadings($hash);
  172. }
  173. if($attrName eq "parameters") {
  174. delete $hash->{PARAMETERS};
  175. }
  176. }
  177. return;
  178. }
  179. sub SMARTMON_Update($)
  180. {
  181. my ($hash) = @_;
  182. SMARTMON_Log($hash, 5, "Update");
  183. my $name = $hash->{NAME};
  184. RemoveInternalTimer($hash);
  185. InternalTimer(gettimeofday()+$hash->{INTERVAL}, "SMARTMON_Update", $hash, 1);
  186. SMARTMON_refreshReadings($hash);
  187. }
  188. # Alle Readings neuerstellen
  189. sub SMARTMON_refreshReadings($) {
  190. my ($hash) = @_;
  191. SMARTMON_Log($hash, 5, "Refresh readings");
  192. my $name = $hash->{NAME};
  193. readingsBeginUpdate($hash);
  194. if( AttrVal($name, "disable", "") eq "1" ) {
  195. SMARTMON_Log($hash, 5, "Update disabled");
  196. $hash->{STATE} = "Inactive";
  197. } else {
  198. # Parameter holen
  199. my $map = SMARTMON_obtainParameters($hash);
  200. $hash->{STATE} = "Active";
  201. foreach my $aName (keys %{$map}) {
  202. my $value = $map->{$aName};
  203. # Nur aktualisieren, wenn ein gueltiges Value vorliegt
  204. if(defined $value) {
  205. readingsBulkUpdate($hash,$aName,$value);
  206. }
  207. }
  208. # Alle anderen Readings entfernen
  209. foreach my $rName (sort keys %{$hash->{READINGS}}) {
  210. if(!defined($map->{$rName})) {
  211. delete $hash->{READINGS}->{$rName};
  212. }
  213. }
  214. }
  215. readingsEndUpdate($hash,1);
  216. }
  217. # Alle Readings erstellen
  218. sub SMARTMON_obtainParameters($) {
  219. my ($hash) = @_;
  220. SMARTMON_Log($hash, 5, "Obtain parameters");
  221. my $map;
  222. # /usr/sbin/smartctl in /etc/sudoers aufnehmen
  223. # fhem ALL=(ALL) NOPASSWD: [...,] /usr/sbin/smartctl
  224. # Natuerlich muss der user auch der Gruppe "sudo" angehören.
  225. # Health
  226. my $param="";
  227. if($hash->{PARAMETERS}) {$param=" ".$hash->{PARAMETERS};}
  228. my $dev_health = SMARTMON_execute($hash, "sudo smartctl -H".$param." ".$hash->{DEVICE}." | grep 'test result:'");
  229. SMARTMON_Log($hash, 5, "health: $dev_health");
  230. if($dev_health=~m/test\s+result:\s+(\S+).*/) {
  231. $map->{"overall_health_test"} = $1;
  232. } else {
  233. delete $map->{"overall_health_test"};
  234. }
  235. $map = SMARTMON_getSmartDataReadings($hash, $map);
  236. return $map;
  237. }
  238. # Readings zu gelesenen RAW-Daten
  239. sub SMARTMON_getSmartDataReadings($$) {
  240. my ($hash, $map) = @_;
  241. my $name = $hash->{NAME};
  242. # Attribut lesen, splitten, als Keys eines Hashes setzen
  243. my $t_include = AttrVal($name, "include", undef);
  244. my %h_include;
  245. if(defined($t_include)) {
  246. my @a_include = split(/,\s*/, trim($t_include));
  247. %h_include = map { int($_) => 1 } @a_include; # 1 oder 001 soll gleichwertig sein
  248. }
  249. # S.M.A.R.T. RAW-Daten auslesen
  250. my $dmap = SMARTMON_readSmartData($hash, defined($t_include)?\%h_include:undef);
  251. #$dmap->{1}->{failed}="FAILING_NOW";
  252. # Bekannte Werte einspielen
  253. # per Referenz uebergeben!
  254. my $done_map = SMARTMON_interpretKnownData($hash, \%{$dmap}, \%{$map});
  255. my $cnt_oldage=0;
  256. my $cnt_prefail=0;
  257. my $sr = AttrVal($name, "show_raw", "0");
  258. foreach my $id (sort keys %{$dmap}) {
  259. # warnings zaehlen
  260. if($dmap->{$id}->{failed} ne "-") {
  261. if($dmap->{$id}->{type} eq "Pre-fail") {$cnt_prefail++;}
  262. if($dmap->{$id}->{type} eq "Old_age") {$cnt_oldage++;}
  263. }
  264. # restlichen RAW-Werte ggf. einspielen, per Attribut (show_raw) abschaltbar
  265. if( $sr eq "1" || $sr eq "2" ) {
  266. # nur wenn noch nicht frueher interpretiert werden,
  267. # oder wenn explizit erwuenscht (Attribut show_raw)
  268. if(!defined($done_map->{$id}) || $sr eq "2") {
  269. my $m = $dmap->{$id};
  270. my $rName = $m->{name};
  271. #my $raw = $dmap->{$id}->{raw};
  272. $map->{sprintf("%03d_%s",$id,$rName)} =
  273. sprintf("Flag: %s Val: %s Worst: %s Thresh: %s ".
  274. "Type: %s Updated: %s When_Failed: %s Raw: %s",
  275. $m->{flag},$m->{value},$m->{worst},$m->{thresh},$m->{type},
  276. $m->{updated},$m->{failed},$m->{raw});
  277. }
  278. }
  279. }
  280. $map->{warnings}="Pre-fail: $cnt_prefail Old_age: $cnt_oldage";
  281. SMARTMON_readDeviceData($hash, \%{$map});
  282. return $map;
  283. }
  284. sub SMARTMON_readDeviceData($%) {
  285. my ($hash, $map) = @_;
  286. my $param="";
  287. if($hash->{PARAMETERS}) {$param=" ".$hash->{PARAMETERS};}
  288. my @dev_data = SMARTMON_execute($hash, "sudo smartctl -i".$param." ".$hash->{DEVICE});
  289. SMARTMON_Log($hash, 5, "device data: ".Dumper(@dev_data));
  290. if(defined($dev_data[0])) {
  291. while(scalar(@dev_data)>0) {
  292. my $line = $dev_data[0];
  293. shift @dev_data;
  294. my($k,$v) = split(/:\s*/,$line);
  295. if($k eq "Device Model") {
  296. $hash->{DEVICE_MODEL}=$v;
  297. }
  298. if($k eq "Serial Number") {
  299. $hash->{DEVICE_SERIAL}=$v;
  300. }
  301. if($k eq "Firmware Version") {
  302. $hash->{DEVICE_FIRMARE}=$v;
  303. }
  304. if($k eq "User Capacity") {
  305. $hash->{DEVICE_CAPACITY}=$v;
  306. }
  307. }
  308. }
  309. }
  310. # Readings zu bekannten Werten erstellen
  311. sub SMARTMON_interpretKnownData($$$) {
  312. my ($hash, $dmap, $map) = @_;
  313. my $known;
  314. #$map->{TEST}="TestX";
  315. # smartctl 5.41 2011-06-09 r3365 [armv7l-linux-3.4.98-sun7i+] (local build)
  316. # Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net
  317. #
  318. # === START OF READ SMART DATA SECTION ===
  319. # SMART Attributes Data Structure revision number: 16
  320. # Vendor Specific SMART Attributes with Thresholds:
  321. # ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
  322. # 1 Raw_Read_Error_Rate 0x002f 200 200 051 Pre-fail Always - 0
  323. # 3 Spin_Up_Time 0x0027 184 183 021 Pre-fail Always - 1800
  324. # 4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 28
  325. # 5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0
  326. # 7 Seek_Error_Rate 0x002e 200 200 000 Old_age Always - 0
  327. # 9 Power_On_Hours 0x0032 096 096 000 Old_age Always - 3444
  328. # 10 Spin_Retry_Count 0x0032 100 253 000 Old_age Always - 0
  329. # 11 Calibration_Retry_Count 0x0032 100 253 000 Old_age Always - 0
  330. # 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 28
  331. # 192 Power-Off_Retract_Count 0x0032 200 200 000 Old_age Always - 20
  332. # 193 Load_Cycle_Count 0x0032 200 200 000 Old_age Always - 7
  333. # 194 Temperature_Celsius 0x0022 103 097 000 Old_age Always - 44
  334. # 196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0
  335. # 197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0
  336. # 198 Offline_Uncorrectable 0x0030 100 253 000 Old_age Offline - 0
  337. # 199 UDMA_CRC_Error_Count 0x0032 200 200 000 Old_age Always - 0
  338. # 200 Multi_Zone_Error_Rate 0x0008 100 253 000 Old_age Offline - 0
  339. if($dmap->{3}) {
  340. $map->{spin_up_time} = $dmap->{3}->{raw};
  341. $known->{3}=1;
  342. }
  343. if($dmap->{4}) {
  344. $map->{start_stop_count} = $dmap->{4}->{raw};
  345. $known->{4}=1;
  346. }
  347. if($dmap->{5}) {
  348. $map->{reallocated_sector_count} = $dmap->{5}->{raw};
  349. $known->{5}=1;
  350. }
  351. if($dmap->{9}) {
  352. $map->{power_on_hours} = $dmap->{9}->{raw};
  353. $map->{power_on_text} = SMARTMON_hour2Dauer($dmap->{9}->{raw});
  354. $known->{9}=1;
  355. }
  356. if($dmap->{10}) {
  357. $map->{spin_retry_count} = $dmap->{10}->{raw};
  358. $known->{10}=1;
  359. }
  360. if($dmap->{12}) {
  361. $map->{power_cycle_count} = $dmap->{12}->{raw};
  362. $known->{12}=1;
  363. }
  364. if($dmap->{190}) {
  365. $map->{airflow_temperature} = $dmap->{190}->{raw};
  366. $known->{190}=1;
  367. }
  368. if($dmap->{194}) {
  369. $map->{temperature} = $dmap->{194}->{raw};
  370. $known->{194}=1;
  371. }
  372. # TODO
  373. return $known;
  374. }
  375. # Ausrechnet aus der Zahl der Sekunden Anzeige in Tagen:Stunden:Minuten:Sekunden.
  376. sub SMARTMON_sec2Dauer($){
  377. my ($t) = @_;
  378. my $d = int($t/86400);
  379. my $r = $t-($d*86400);
  380. my $h = int($r/3600);
  381. $r = $r - ($h*3600);
  382. my $m = int($r/60);
  383. my $s = $r - $m*60;
  384. return sprintf("%02d Tage %02d Std. %02d Min. %02d Sec.",$d,$h,$m,$s);
  385. }
  386. # Ausrechnet aus der Zahl der Stunden Anzeige in Tagen:Stunden:Minuten:Sekunden.
  387. sub SMARTMON_hour2Dauer($){
  388. my ($t) = @_;
  389. #return SMARTMON_sec2Dauer($t*3600);
  390. my $d=int($t/24);
  391. $t = $t-($d*24);
  392. my $y=int($d/365);
  393. $d = $d-($y*365);
  394. return sprintf("%d Jahre %d Tage %d Std.",$y,$d,$t);
  395. }
  396. # liest RAW-Daten
  397. # Params:
  398. # HASH: Device-HASH
  399. # Include-HASH: Wenn definiert,werden nur die ID zurueckgegeben, die in
  400. # diesem HASH enthalten sind.
  401. sub SMARTMON_readSmartData($;$) {
  402. my ($hash, $include) = @_;
  403. my $map;
  404. my $param="";
  405. if($hash->{PARAMETERS}) {$param=" ".$hash->{PARAMETERS};}
  406. my @dev_data = SMARTMON_execute($hash, "sudo smartctl -A".$param." ".$hash->{DEVICE});
  407. SMARTMON_Log($hash, 5, "device SMART data: ".Dumper(@dev_data));
  408. if(defined($dev_data[0])) {
  409. while(scalar(@dev_data)>0) {
  410. shift @dev_data;
  411. if(scalar(@dev_data)>0 && $dev_data[0]=~m/ID#.*/) {
  412. shift @dev_data;
  413. while(scalar(@dev_data)>0) {
  414. my ($d_id, $d_attr_name, $d_flag, $d_value, $d_worst, $d_thresh,
  415. $d_type, $d_updated, $d_when_failed, $d_raw_value)
  416. = split(/\s+/, trim($dev_data[0]));
  417. shift @dev_data;
  418. if(!defined($include) || defined($include->{$d_id})) {
  419. if(defined($d_attr_name)) {
  420. #$map->{$d_attr_name} = "Value: $d_value, Worst: $d_worst, Type: $d_type, Raw: $d_raw_value";
  421. $map->{$d_id}->{name} = $d_attr_name;
  422. $map->{$d_id}->{flag} = $d_flag;
  423. $map->{$d_id}->{value} = $d_value;
  424. $map->{$d_id}->{worst} = $d_worst;
  425. $map->{$d_id}->{thresh} = $d_thresh;
  426. $map->{$d_id}->{type} = $d_type;
  427. $map->{$d_id}->{updated} = $d_updated;
  428. $map->{$d_id}->{failed} = $d_when_failed;
  429. $map->{$d_id}->{raw} = $d_raw_value;
  430. }
  431. }
  432. }
  433. }
  434. }
  435. }
  436. return $map;
  437. }
  438. # BS-Befehl ausfuehren
  439. sub SMARTMON_execute($$) {
  440. my ($hash, $cmd) = @_;
  441. SMARTMON_Log($hash, 5, "Execute: $cmd");
  442. return qx($cmd);
  443. }
  444. 1;
  445. =pod
  446. =begin html
  447. <!-- ================================ -->
  448. <a name="SMARTMON"></a>
  449. <h3>SMARTMON</h3>
  450. <ul>
  451. This module is a FHEM frontend to the Linux tool smartctl.
  452. It provides various information on the SMART System of the hard drive.
  453. <br><br>
  454. <b>Define</b>
  455. <br><br>
  456. <code>define &lt;name&gt; SMARTMON &lt;device&gt; [&lt;Interval&gt;]</code><br>
  457. <br>
  458. This statement creates a new SMARTMON instance.
  459. The parameters specify a device to be monitored and the update interval in minutes.<br>
  460. <br>
  461. Example: <code>define sm SMARTMON /dev/sda 60</code>
  462. <br>
  463. <br>
  464. <b>Readings:</b>
  465. <br><br>
  466. <ul>
  467. <li>overall_health_test<br>
  468. Specifies the general condition of the HDD (PASSED or FAILED).
  469. </li>
  470. <br>
  471. <li>warnings<br>
  472. Specifies the number of stored alerts.
  473. </li>
  474. <br>
  475. Furthermore, the available SMART parameters can be displayed as Readings (RAW and / or (partially) interpreted).
  476. </ul>
  477. <br>
  478. <b>Get:</b><br><br>
  479. <ul>
  480. <li>version<br>
  481. Displays the module version.
  482. </li>
  483. <br>
  484. <li>update<br>
  485. Updates all readings.
  486. </li>
  487. <br>
  488. <li>list<br>
  489. Displays various information:
  490. <ul>
  491. <li>devices:<br>List of available devices in the system.</li>
  492. </ul><br>
  493. <ul>
  494. <li>info:<br>Information about the current device.</li>
  495. </ul><br>
  496. <ul>
  497. <li>data:<br>List of SMART parameters for the current device.</li>
  498. </ul><br>
  499. <ul>
  500. <li>health:<br>Information about overall health status for the device.</li>
  501. </ul><br>
  502. For the Last 3 commands can also be another Device specified (as an additional parameter).
  503. </li>
  504. <br>
  505. </ul><br>
  506. <b>Attributes:</b><br><br>
  507. <ul>
  508. <li>show_raw<br>
  509. Valid values: 0: no RAW Readings (default), 1: show all, are not included in interpreted Readings, 2: show all.
  510. </li>
  511. <br>
  512. <li>include<br>
  513. Comma separated list of IDs for desired SMART parameters. If nothing passed, all available values are displayed.
  514. </li>
  515. <br>
  516. <li>disable<br>
  517. Valid values: 0: Module active (default), 1: module is disabled (no updates).
  518. </li>
  519. <br>
  520. <li>parameters<br>
  521. Additional values for smartctl.
  522. </li>
  523. <br>
  524. </ul><br>
  525. For more information see cmartctrl documentation.
  526. </ul>
  527. <!-- ================================ -->
  528. =end html
  529. =begin html_DE
  530. <a name="SMARTMON"></a>
  531. <h3>SMARTMON</h3>
  532. <ul>
  533. Dieses Modul ist ein FHEM-Frontend zu dem Linux-Tool smartctl.
  534. Es liefert diverse Informationen zu dem S.M.A.R.T. System einer Festplatte.
  535. <br><br>
  536. <b>Define</b>
  537. <br><br>
  538. <code>define &lt;name&gt; SMARTMON &lt;device&gt; [&lt;Interval&gt;]</code><br>
  539. <br>
  540. Diese Anweisung erstellt eine neue SMARTMON-Instanz.
  541. Die Parameter geben ein zu &uuml;berwachenden Ger&auml;t und den Aktualisierungsinterval in Minuten an.<br>
  542. <br>
  543. Beispiel: <code>define sm SMARTMON /dev/sda 60</code>
  544. <br>
  545. <br>
  546. <b>Readings:</b>
  547. <br><br>
  548. <ul>
  549. <li>overall_health_test<br>
  550. Gibt den allgemeinen Zustand der Platte an. Kann PASSED oder FAILED sein.
  551. </li>
  552. <br>
  553. <li>warnings<br>
  554. Gibt die Anzahl der vermerkten Warnungen an.
  555. </li>
  556. <br>
  557. Weiterhin k&ouml;nnen die verf&uuml;gbaren SMART-Parameter als Readings angezeigt werden (RAW und/oder (teilweise) interpretiert).
  558. </ul>
  559. <br>
  560. <b>Get:</b><br><br>
  561. <ul>
  562. <li>version<br>
  563. Zeigt die verwendete Modul-Version an.
  564. </li>
  565. <br>
  566. <li>update<br>
  567. Veranlasst die Aktualisierung der gelesenen Parameter.
  568. </li>
  569. <br>
  570. <li>list<br>
  571. Zeigt verschiedenen Informationen an:
  572. <ul>
  573. <li>devices:<br>Liste der im System verf&uuml;gbaren Ger&auml;ten.</li>
  574. </ul><br>
  575. <ul>
  576. <li>info:<br>Information zu dem aktuellen Ger&auml;t.</li>
  577. </ul><br>
  578. <ul>
  579. <li>data:<br>Liste der SMART-Parameter zu dem aktuellen Ger&auml;t.</li>
  580. </ul><br>
  581. <ul>
  582. <li>health:<br>Information zu dem allgemeinen Gesundheitsstatus f&uuml;r das verwendete Ger&auml;t.</li>
  583. </ul><br>
  584. F&uuml;r letzten 3 Befehle kann auch noch ein anderes Ger&auml;t als zus&auml;tzliche Parameter mitgegeben werden.
  585. </li>
  586. <br>
  587. </ul><br>
  588. <b>Attributes:</b><br><br>
  589. <ul>
  590. <li>show_raw<br>
  591. G&uuml;ltige Werte: 0: keine RAW-Readings anzeigen (default), 1: alle anzeigen, die nicht in interpretierten Readings enthalten sind, 2: alle anzeigen.
  592. </li>
  593. <br>
  594. <li>include<br>
  595. Kommaseparierte Liste der IDs gew&uuml;nschten SMART-Parameter. Wenn nichts angegeben, werden alle verf&uuml;gbaren angezeigt.
  596. </li>
  597. <br>
  598. <li>disable<br>
  599. G&uuml;ltige Werte: 0: Modul aktiv (default), 1: Modul deaktiviert (keine Aktualisierungen).
  600. </li>
  601. <br>
  602. <li>parameters<br>
  603. Zusatzparameter f&uuml;r den AUfruf von smartctl.
  604. </li>
  605. <br>
  606. </ul><br>
  607. F&uuml;r weitere Informationen wird die cmartctrl-Dokumentation empfohlen.
  608. </ul>
  609. =end html_DE
  610. =cut