10_OWServer.pm 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  1. # $Id: 10_OWServer.pm 13114 2017-01-16 19:25:59Z neubert $
  2. ################################################################
  3. #
  4. # Copyright notice
  5. #
  6. # (c) 2012 Copyright: Dr. Boris Neubert & Martin Fischer
  7. # e-mail: omega at online dot de
  8. # e-mail: m_fischer at gmx dot de
  9. #
  10. # This file is part of fhem.
  11. #
  12. # Fhem is free software: you can redistribute it and/or modify
  13. # it under the terms of the GNU General Public License as published by
  14. # the Free Software Foundation, either version 2 of the License, or
  15. # (at your option) any later version.
  16. #
  17. # Fhem is distributed in the hope that it will be useful,
  18. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. # GNU General Public License for more details.
  21. #
  22. # You should have received a copy of the GNU General Public License
  23. # along with fhem. If not, see <http://www.gnu.org/licenses/>.
  24. #
  25. ################################################################################
  26. package main;
  27. use strict;
  28. use warnings;
  29. # this must be the latest OWNet from
  30. # http://owfs.cvs.sourceforge.net/viewvc/owfs/owfs/module/ownet/perl5/OWNet/lib/OWNet.pm
  31. # the version at CPAN is outdated and malfunctioning as at 2012-12-19
  32. use lib::OWNet;
  33. use vars qw(%owfamily);
  34. # 1-Wire devices (order by family code)
  35. # http://owfs.sourceforge.net/family.html
  36. %owfamily = (
  37. "01" => "DS2401 DS1990A",
  38. "05" => "DS2405",
  39. "10" => "DS18S20 DS1920",
  40. "12" => "DS2406 DS2507",
  41. "1B" => "DS2436",
  42. "1D" => "DS2423",
  43. "20" => "DS2450",
  44. "22" => "DS1822",
  45. "23" => "DS2433",
  46. "24" => "DS2415 DS1904",
  47. "26" => "DS2438",
  48. "27" => "DS2417",
  49. "28" => "DS18B20",
  50. "29" => "DS2408",
  51. "3A" => "DS2413",
  52. "3B" => "DS1825",
  53. "7E" => "EDS000XX",
  54. "81" => "DS1420",
  55. "FF" => "LCD",
  56. );
  57. use vars qw(%gets %sets);
  58. %gets = (
  59. "/settings/timeout/directory" => "",
  60. "/settings/timeout/ftp" => "",
  61. "/settings/timeout/ha7" => "",
  62. "/settings/timeout/network" => "",
  63. "/settings/timeout/presence" => "",
  64. "/settings/timeout/serial" => "",
  65. "/settings/timeout/server" => "",
  66. "/settings/timeout/stable" => "",
  67. "/settings/timeout/uncached" => "",
  68. "/settings/timeout/usb" => "",
  69. "/settings/timeout/volatile" => "",
  70. "/settings/timeout/w1" => "",
  71. "/settings/units/pressure_scale" => "",
  72. "/settings/units/temperature_scale" => "",
  73. );
  74. %sets = (
  75. "timeout/directory" => "",
  76. "timeout/ftp" => "",
  77. "timeout/ha7" => "",
  78. "timeout/network" => "",
  79. "timeout/presence" => "",
  80. "timeout/serial" => "",
  81. "timeout/server" => "",
  82. "timeout/stable" => "",
  83. "timeout/uncached" => "",
  84. "timeout/usb" => "",
  85. "timeout/volatile" => "",
  86. "timeout/w1" => "",
  87. "units/pressure_scale" => "",
  88. "units/temperature_scale" => "",
  89. );
  90. #####################################
  91. sub
  92. OWServer_Initialize($)
  93. {
  94. my ($hash) = @_;
  95. # Provider
  96. $hash->{WriteFn} = "OWServer_Write";
  97. $hash->{ReadFn} = "OWServer_Read";
  98. $hash->{DirFn} = "OWServer_Dir";
  99. $hash->{FindFn} = "OWServer_Find";
  100. $hash->{Clients} = ":OWDevice:OWAD:OWCOUNT:OWMULTI:OWSWITCH:OWTHERM:";
  101. # Consumer
  102. $hash->{DefFn} = "OWServer_Define";
  103. $hash->{NotifyFn}= "OWServer_Notify";
  104. $hash->{NotifyOrderPrefix}= "50a-";
  105. $hash->{UndefFn} = "OWServer_Undef";
  106. $hash->{GetFn} = "OWServer_Get";
  107. $hash->{SetFn} = "OWServer_Set";
  108. # $hash->{AttrFn} = "OWServer_Attr";
  109. $hash->{AttrList}= "nonblocking " . $readingFnAttributes;
  110. }
  111. #####################################
  112. sub
  113. OWServer_Define($$)
  114. {
  115. my ($hash, $def) = @_;
  116. my @a = split("[ \t]+", $def, 3);
  117. my $name = $a[0];
  118. if(@a < 3) {
  119. my $msg = "wrong syntax for $name: define <name> OWServer <protocol>";
  120. Log 2, $msg;
  121. return $msg;
  122. }
  123. my $protocol = $a[2];
  124. $hash->{fhem}{protocol}= $protocol;
  125. $hash->{NOTIFYDEV} = "global";
  126. if( $init_done ) {
  127. OWServer_OpenDev($hash);
  128. }
  129. return undef;
  130. }
  131. #####################################
  132. sub
  133. OWServer_Undef($$)
  134. {
  135. my ($hash, $arg) = @_;
  136. my $name = $hash->{NAME};
  137. foreach my $d (sort keys %defs) {
  138. if(defined($defs{$d}) &&
  139. defined($defs{$d}{IODev}) &&
  140. $defs{$d}{IODev} == $hash)
  141. {
  142. my $lev = ($reread_active ? 4 : 2);
  143. Log3 $name, $lev, "deleting OWServer for $d";
  144. delete $defs{$d}{IODev};
  145. }
  146. }
  147. OWServer_CloseDev($hash);
  148. return undef;
  149. }
  150. #####################################
  151. sub
  152. OWServer_CloseDev($)
  153. {
  154. my ($hash) = @_;
  155. my $name = $hash->{NAME};
  156. return unless(defined($hash->{fhem}{owserver}));
  157. delete $hash->{fhem}{owserver};
  158. readingsSingleUpdate($hash, "state", "DISCONNECTED", 1);
  159. }
  160. ########################
  161. sub
  162. OWServer_OpenDev($)
  163. {
  164. my ($hash) = @_;
  165. my $name = $hash->{NAME};
  166. OWServer_CloseDev($hash);
  167. my $protocol= $hash->{fhem}{protocol};
  168. Log3 $name, 3, "$name: Opening connection to OWServer $protocol...";
  169. my $owserver= OWNet->new($protocol);
  170. if($owserver) {
  171. Log3 $name, 3, "$name: Successfully connected to $protocol.";
  172. $hash->{fhem}{owserver}= $owserver;
  173. readingsSingleUpdate($hash, "state", "CONNECTED", 1);
  174. my $ret = OWServer_DoInit($hash);
  175. }
  176. return $owserver
  177. }
  178. #####################################
  179. sub
  180. OWServer_Notify($$)
  181. {
  182. my ($hash,$dev) = @_;
  183. my $name = $hash->{NAME};
  184. my $type = $hash->{TYPE};
  185. return if($dev->{NAME} ne "global");
  186. return if(!grep(m/^INITIALIZED|REREADCFG$/, @{$dev->{CHANGED}}));
  187. return if($attr{$name} && $attr{$name}{disable});
  188. OWServer_OpenDev($hash);
  189. return undef;
  190. }
  191. #####################################
  192. sub
  193. OWServer_DoInit($)
  194. {
  195. my $hash = shift;
  196. my $name = $hash->{NAME};
  197. my $owserver= $hash->{fhem}{owserver};
  198. foreach my $reading (sort keys %gets) {
  199. readingsBeginUpdate($hash);
  200. readingsBulkUpdate($hash,"$reading",$owserver->read("$reading"));
  201. readingsEndUpdate($hash,1);
  202. }
  203. readingsSingleUpdate($hash, "state", "Initialized", 1);
  204. OWServer_Autocreate($hash);
  205. return undef;
  206. }
  207. #####################################
  208. sub
  209. OWServer_Read($@)
  210. {
  211. my ($hash,$path)= @_;
  212. return undef unless(defined($hash->{fhem}{owserver}) || $hash->{LAST_READ_FAILED});
  213. my $ret= undef;
  214. if(AttrVal($hash->{NAME},"nonblocking",undef) && $init_done) {
  215. $hash->{".path"}= $path;
  216. pipe(READER,WRITER);
  217. #READER->autoflush(1);
  218. WRITER->autoflush(1);
  219. my $pid= fork;
  220. if(!defined($pid)) {
  221. Log3 $hash, 1, "OWServer: Cannot fork: $!";
  222. return undef;
  223. }
  224. InternalTimer(gettimeofday()+6, "OWServer_TimeoutChild", $pid, 0);
  225. if($pid == 0) {
  226. close READER;
  227. $ret= OWNet::read($hash->{DEF},$path);
  228. $ret =~ s/^\s+//g if(defined($ret));
  229. my $r= defined($ret) ? $ret : "<undefined>";
  230. Log3 $hash, 5, "OWServer child read $path: $r";
  231. delete $hash->{".path"};
  232. print WRITER $ret if(defined($ret));
  233. close WRITER;
  234. # see http://forum.fhem.de/index.php?t=tree&goto=94670
  235. # changed from
  236. # exit 0;
  237. # to
  238. POSIX::_exit(0);
  239. }
  240. Log3 $hash, 5, "OWServer child ID for reading '$path' is $pid";
  241. close WRITER;
  242. # http://forum.fhem.de/index.php/topic,16945.0/topicseen.html#msg110673
  243. my ($rout,$rin, $eout,$ein) = ('','', '','');
  244. vec($rin, fileno(READER), 1) = 1;
  245. $ein = $rin;
  246. my $nfound = select($rout=$rin, undef, $eout=$ein, 4);
  247. if( $nfound ) {
  248. $ret= <READER>;
  249. if(defined($ret)) {
  250. chomp($ret) } else {
  251. Log3 $hash, 5, "OWServer: undefined response from child $pid";
  252. }
  253. RemoveInternalTimer($pid);
  254. OWServer_OpenDev($hash) if( $hash->{LAST_READ_FAILED} );
  255. $hash->{LAST_READ_FAILED} = 0;
  256. } else {
  257. Log3 undef, 1, "OWServer: read timeout for child $pid";
  258. $hash->{NR_READ_FAILED} = 0 if( !$hash->{NR_READ_FAILED} );
  259. $hash->{NR_READ_FAILED}++;
  260. OWServer_CloseDev($hash) if( !$hash->{LAST_READ_FAILED} );
  261. $hash->{LAST_READ_FAILED} = 1;
  262. }
  263. close READER;
  264. } else {
  265. $ret= $hash->{fhem}{owserver}->read($path);
  266. $ret =~ s/^\s+//g if(defined($ret));
  267. $hash->{LAST_READ_FAILED} = 0;
  268. }
  269. # if a device does not exist, the server returns undef
  270. # therefore it's not a good idea to blame the connection
  271. # and remove the server in such a case.
  272. #if(!defined($ret)) { OWServer_CloseDev($hash); }
  273. return $ret;
  274. }
  275. #####################################
  276. sub
  277. OWServer_TimeoutChild($)
  278. {
  279. my $pid= shift;
  280. Log3 undef, 1, "OWServer: Terminated child $pid" if($pid && kill(9, $pid));
  281. }
  282. #####################################
  283. sub
  284. OWServer_Write($@)
  285. {
  286. my ($hash,$path,$value)= @_;
  287. return undef if($hash->{LAST_READ_FAILED});
  288. return undef unless(defined($hash->{fhem}{owserver}));
  289. return $hash->{fhem}{owserver}->write($path,$value);
  290. }
  291. #####################################
  292. sub
  293. OWServer_Dir($@)
  294. {
  295. my ($hash,$path)= @_;
  296. return undef if($hash->{LAST_READ_FAILED});
  297. return undef unless(defined($hash->{fhem}{owserver}));
  298. $path= ($path) ? $path : "/";
  299. return $hash->{fhem}{owserver}->dir($path);
  300. }
  301. #####################################
  302. sub
  303. OWServer_Find($@)
  304. {
  305. my ($hash,$slave)= @_;
  306. return undef if($hash->{LAST_READ_FAILED});
  307. return undef unless(defined($hash->{fhem}{owserver}));
  308. my $owserver= $hash->{fhem}{owserver};
  309. my $fulldir= $owserver->dir("/");
  310. return undef unless(defined($fulldir));
  311. my @dir= split(",", $fulldir);
  312. my $path= undef;
  313. for my $entry (@dir) {
  314. $entry = substr($entry,1);
  315. next if($entry !~ m/^bus.\d+/m);
  316. my @busdir= split(",",$owserver->dir("/$entry"));
  317. $path= (grep { m/$slave/i } @busdir) ? $entry : undef;
  318. last if($path)
  319. }
  320. return $path;
  321. }
  322. #####################################
  323. sub
  324. OWServer_Autocreate($)
  325. {
  326. my ($hash)= @_;
  327. my $name = $hash->{NAME};
  328. my $acdname= "";
  329. foreach my $d (keys %defs) {
  330. next if($defs{$d}{TYPE} ne "autocreate");
  331. $acdname= $defs{$d}{NAME};
  332. return undef if(AttrVal($acdname,"disable",undef));
  333. }
  334. return undef unless($acdname ne "");
  335. my $owserver= $hash->{fhem}{owserver};
  336. my @dir= split(",", $owserver->dir("/"));
  337. my @devices= grep { m/^\/[0-9a-f]{2}.[0-9a-f]{12}$/i } @dir;
  338. my %defined = ();
  339. foreach my $d (keys %defs) {
  340. next if($defs{$d}{TYPE} !~ /^OW(Device|AD|ID|MULTI|COUNT|LCD|SWITCH|THERM)$/);
  341. if(defined($defs{$d}{fhem}) && defined($defs{$d}{fhem}{address})) {
  342. $defined{$defs{$d}{fhem}{address}} = $d;
  343. } elsif(defined($defs{$d}{OW_ID}) and defined($defs{$d}{OW_FAMILY})) {
  344. $defined{"$defs{$d}{OW_FAMILY}.$defs{$d}{OW_ID}"} = $d;
  345. }
  346. }
  347. my $created = 0;
  348. for my $device (@devices) {
  349. my $address= substr($device,1);
  350. my $family= substr($address,0,2);
  351. if(!exists $owfamily{$family}) {
  352. Log3 $name, 2, "$name: Autocreate: unknown familycode '$family' found. Please report this!";
  353. next;
  354. } else {
  355. my $type= $owserver->read($device . "/type");
  356. my $owtype= $owfamily{$family};
  357. if($owtype !~ m/$type/) {
  358. Log3 $name, 2, "$name: Autocreate: type '$type' not defined in familycode '$family'. Please report this!";
  359. next;
  360. } elsif( defined($defined{$address}) ) {
  361. Log3 $name, 5, "$name address '$address' already defined as '$defined{$address}'";
  362. next;
  363. } else {
  364. my $id= substr($address,3);
  365. my $devname= $type . "_" . $id;
  366. Log3 $name, 5, "$name create new device '$devname' for address '$address'";
  367. my $interval= ($family eq "81") ? "" : " 60";
  368. my $define= "$devname OWDevice $address" . $interval;
  369. my $cmdret;
  370. $cmdret= CommandDefine(undef,$define);
  371. if($cmdret) {
  372. Log3 $name, 1, "$name: Autocreate: An error occurred while creating device for address '$address': $cmdret";
  373. } else {
  374. $created++;
  375. $cmdret= CommandAttr(undef,"$devname room OWDevice");
  376. }
  377. }
  378. }
  379. }
  380. CommandSave(undef,undef) if( $created && AttrVal($acdname, "autosave", 1 ) );
  381. return undef;
  382. }
  383. #####################################
  384. sub
  385. OWServer_Get($@)
  386. {
  387. my ($hash, @a) = @_;
  388. my $name = $a[0];
  389. return "$name: get needs at least one parameter" if(@a < 2);
  390. my $cmd= $a[1];
  391. #my $arg = ($a[2] ? $a[2] : "");
  392. #my @args= @a; shift @args; shift @args;
  393. my $owserver= $hash->{fhem}{owserver};
  394. if($cmd eq "devices") {
  395. my @dir= split(",", $owserver->dir("/"));
  396. my @devices= grep { m/^\/[0-9a-f]{2}.[0-9a-f]{12}$/i } @dir;
  397. my $ret;
  398. for my $device (@devices) {
  399. my $name= "";
  400. my $address= substr($device,1);
  401. my $type= $owserver->read($device . "/type");
  402. foreach my $p (keys %defs) {
  403. $name= concatc(", ", $name, $p) if($defs{$p}{TYPE} eq "OWDevice" and $defs{$p}{fhem}{address} eq $address);
  404. }
  405. $ret .= sprintf("%s %10s %s\n", $address, $type, $name);
  406. }
  407. return $ret;
  408. } elsif($cmd eq "errors") {
  409. my $path= "statistics/errors";
  410. my @dir= split(",", $owserver->dir($path));
  411. my $wide= (reverse sort { $a <=> $b } map { length($_) } @dir)[0];
  412. $wide= $wide-length($path);
  413. my $ret= "=> $path:\n";
  414. for my $error (@dir) {
  415. my $stat= $owserver->read("$path/$error");
  416. my (undef, $str) = $error =~ m|^(.*[/\\])([^/\\]+?)$|;
  417. $str =~ s/_/ /g;
  418. $ret .= sprintf("%-*s %d\n",$wide,$str,($stat) ? $stat : 0);
  419. }
  420. return $ret;
  421. } elsif(defined($gets{$cmd})) {
  422. my $ret;
  423. my $value= $owserver->read($cmd);
  424. readingsSingleUpdate($hash,$cmd,$value,1);
  425. return "$cmd => $value";
  426. } else {
  427. return "Unknown argument $cmd, choose one of devices ".join(" ", sort keys %gets);
  428. }
  429. }
  430. #####################################
  431. sub
  432. OWServer_Set($@)
  433. {
  434. my ($hash, @a) = @_;
  435. my $name = $a[0];
  436. # usage check
  437. #my $usage= "Usage: set $name classdef <classname> <filename> OR set $name reopen";
  438. my $usage= "Unknown argument $a[1], choose one of reopen ".join(" ", sort keys %sets);
  439. return $usage if($a[1] ne "reopen" && !defined($sets{$a[1]}));
  440. if((@a == 2) && ($a[1] eq "reopen")) {
  441. OWServer_OpenDev($hash);
  442. return undef;
  443. } elsif(@a == 3) {
  444. my $cmd= $a[1];
  445. my $value= $a[2];
  446. my $owserver= $hash->{fhem}{owserver};
  447. my $ret= $owserver->write("/settings/$cmd",$value);
  448. #return $ret if($ret);
  449. readingsSingleUpdate($hash,"/settings/$cmd",$value,1);
  450. }
  451. return undef;
  452. }
  453. #####################################
  454. 1;
  455. =pod
  456. =item device
  457. =item summary controls a One-Wire (1Wire) server instance
  458. =item summary_DE steuert eine Ausgabe eines One-Wire (1Wire) Servers
  459. =begin html
  460. <a name="OWServer"></a>
  461. <h3>OWServer</h3>
  462. <ul>
  463. <br>
  464. <a name="OWServerdefine"></a>
  465. <b>Define</b>
  466. <ul>
  467. <code>define &lt;name&gt; OWServer &lt;protocol&gt;</code>
  468. <br><br>
  469. Defines a logical OWServer device. OWServer is the server component of the
  470. <a href="http://owfs.org">1-Wire Filesystem</a>. It serves as abstraction layer
  471. for any 1-wire devices on a host. &lt;protocol&gt; has
  472. format &lt;hostname&gt;:&lt;port&gt;. For details see
  473. <a href="http://owfs.org/index.php?page=owserver_protocol">owserver documentation</a>.
  474. <p>
  475. You need <a href="http://owfs.cvs.sourceforge.net/viewvc/owfs/owfs/module/ownet/perl5/OWNet/lib/OWNet.pm">OWNet.pm from owfs.org on Sourceforge</a>, which is normally deployed with FHEM. As at 2012-12-23 the OWNet module
  476. on CPAN has an issue which renders it useless for remote connections.
  477. <p>
  478. The ow* version 2.9 packages provided with Debian Jessie in combination with OWNet.pm as deployed with FHEM have issues.
  479. For Debian Jessie please either unzip
  480. <a href="http://forum.fhem.de/index.php?action=dlattach;topic=12219.0;attach=2463">owfs_2.8p17-1_all.zip</a> and install
  481. owserver, dependencies and what else you require with <code>dpkg -i &lt;package&gt;.deb</code> or use the latest OWNet.pm from Sourceforge.
  482. <p>
  483. A typical working configuration file <code>/etc/owfs.conf</code> looks as follows:<p>
  484. <code>
  485. # server uses device /dev/onewire<br>
  486. server: device = /dev/onewire<br>
  487. # clients other than server use server<br>
  488. ! server: server = localhost:4304<br>
  489. # port<br>
  490. server: port = 4304<br>
  491. # owhttpd<br>
  492. http: port = 2121<br>
  493. # owftpd<br>
  494. ftp: port = 2120<br>
  495. </code>
  496. <p>
  497. The actual 1-wire devices are defined as <a href="#OWDevice">OWDevice</a> devices.
  498. If <a href="#autocreate">autocreate</a> is enabled, all the devices found are created at
  499. start of FHEM automatically.
  500. <br><br>
  501. This module is completely unrelated to the 1-wire modules with names all in uppercase.
  502. <br><br>
  503. Examples:
  504. <ul>
  505. <code>define myLocalOWServer OWServer localhost:4304</code><br>
  506. <code>define myRemoteOWServer OWServer raspi:4304</code><br>
  507. </ul>
  508. <br><br>
  509. Notice: if you get no devices add both <code>localhost</code> and the FQDN of your owserver as server directives
  510. to the owserver configuration file
  511. on the remote host.
  512. <br><br>
  513. </ul>
  514. <a name="OWServerset"></a>
  515. <b>Set</b>
  516. <ul>
  517. <code>set &lt;name&gt; &lt;value&gt;</code>
  518. <br><br>
  519. where <code>value</code> is one of<br><br>
  520. <li><code>reopen</code><br>
  521. Reopens the connection to the owserver.
  522. </li>
  523. <li>owserver (OWFS) specific settings:
  524. <ul>
  525. <li><code>timeout/directory</code></li>
  526. <li><code>timeout/ftp</code></li>
  527. <li><code>timeout/ha7</code></li>
  528. <li><code>timeout/network</code></li>
  529. <li><code>timeout/presence</code></li>
  530. <li><code>timeout/serial</code></li>
  531. <li><code>timeout/server</code></li>
  532. <li><code>timeout/stable</code></li>
  533. <li><code>timeout/uncached</code></li>
  534. <li><code>timeout/usb</code></li>
  535. <li><code>timeout/volatile</code></li>
  536. <li><code>timeout/w1</code></li>
  537. <li><code>units/pressure_scale</code></li>
  538. <li><code>units/temperature_scale</code></li>
  539. </ul>
  540. </li>
  541. For further informations have look on <a href="http://owfs.org/uploads/owserver.1.html#sect41">owserver manual</a>).
  542. <br>
  543. </ul>
  544. <br><br>
  545. <a name="OWServerget"></a>
  546. <b>Get</b>
  547. <ul>
  548. <code>get &lt;name&gt; &lt;value&gt;</code>
  549. <br><br>
  550. where <code>value</code> is one of<br><br>
  551. <li><code>devices</code><br>
  552. Lists the addresses and types of all 1-wire devices provided by the owserver. Also shows
  553. the corresponding <a href="#OWDevice">OWDevice</a> if one is defined for the respective 1-wire devices.
  554. </li>
  555. <li><code>errors</code><br>
  556. List a view of error statistics.</li>
  557. <li>owserver (OWFS) specific settings:
  558. <ul>
  559. <li><code>/settings/timeout/directory</code></li>
  560. <li><code>/settings/timeout/ftp</code></li>
  561. <li><code>/settings/timeout/ha7</code></li>
  562. <li><code>/settings/timeout/network</code></li>
  563. <li><code>/settings/timeout/presence</code></li>
  564. <li><code>/settings/timeout/serial</code></li>
  565. <li><code>/settings/timeout/server</code></li>
  566. <li><code>/settings/timeout/stable</code></li>
  567. <li><code>/settings/timeout/uncached</code></li>
  568. <li><code>/settings/timeout/usb</code></li>
  569. <li><code>/settings/timeout/volatile</code></li>
  570. <li><code>/settings/timeout/w1</code></li>
  571. <li><code>/settings/units/pressure_scale</code></li>
  572. <li><code>/settings/units/temperature_scale</code></li>
  573. </ul>
  574. </li>
  575. For further informations have look on <a href="http://owfs.org/uploads/owserver.1.html#sect41">owserver manual</a>).
  576. <br>
  577. </ul>
  578. <br><br>
  579. <a name="OWServerattr"></a>
  580. <b>Attributes</b>
  581. <ul>
  582. <li>nonblocking<br>
  583. Get all readings (OWServer / <a href="#OWDevice">OWDevice</a>) via a child process. This ensures, that FHEM
  584. is not blocked during communicating with the owserver.<br>
  585. Example:<br>
  586. <code> attr &lt;name&gt; nonblocking 1</code>
  587. </li>
  588. <li><a href="#eventMap">eventMap</a></li>
  589. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  590. </ul>
  591. <br><br>
  592. Note: unset <code>nonblocking</code> if you experience lockups of FHEM.
  593. </ul>
  594. =end html
  595. =begin html_DE
  596. <a name="OWServer"></a>
  597. <h3>OWServer</h3>
  598. <ul>
  599. <br>
  600. <a name="OWServerdefine"></a>
  601. <b>Definition</b>
  602. <ul>
  603. <code>define &lt;name&gt; OWServer &lt;protocol&gt;</code>
  604. <br><br>
  605. Definiert eine logische OWServer- Instanz. OWServer ist die Serverkomponente des
  606. <a href="http://owfs.org">1-Wire Dateisystems</a>. Sie ermöglicht den Zugriff auf
  607. alle 1-Wire- Busteilnehmer eines Systems.<br><br>
  608. &lt;protocol&gt; hat das Format &lt;hostname&gt;:&lt;port&gt; Nähere Informationen dazu gibt es in der <a href="http://owfs.org/index.php?page=owserver_protocol">owserver Dokumentation</a>.
  609. <br><br>
  610. Voraussetzung innerhalb von FHEM ist das Modul <a href="http://owfs.cvs.sourceforge.net/viewvc/owfs/owfs/module/ownet/perl5/OWNet/lib/OWNet.pm">OWNet.pm von owfs.org</a>, welches bereits mit FHEM ausgeliefert wird.
  611. Das auf CPAN erhältliche OWNet- Modul beinhaltet seit dem 23.12.2012 einen Fehler, der es für Fernzugriffe unbrauchbar macht.<p>
  612. Auf dem Computer, an dem der 1-Wire- Bus angeschlossen ist, muss die Software "owserver" installiert sein. Zusätzlich sollte auf diesem Rechner die Konfigurationsdatei "owfs.conf" eingesehen bzw. angepasst werden. <a href="http://www.fhemwiki.de/wiki/OWServer_%26_OWDevice#Tipps_und_Tricks"> Einen WIKI- Artikel dazu gibt es hier.</a>
  613. <br><br>
  614. Die ow*-Pakete in der Version 2.9 von Debian Jessie haben Probleme. Bitte entpacke f&uuml;r Debian Jessie entweder
  615. <a href="http://forum.fhem.de/index.php?action=dlattach;topic=12219.0;attach=2463">owfs_2.8p17-1_all.zip</a> und installiere
  616. owserver, Abh&auml;ngigkeiten und was Du sonst noch brauchst mit <code>dpkg -i &lt;package&gt;.deb</code>, oder benutze die neueste Version von OWNet.pm von Sourceforge.
  617. <p>
  618. Eine typische funktionierende Konfigurationsdatei <code>/etc/owfs.conf</code> sieht so aus:<p>
  619. <code>
  620. # server uses device /dev/onewire<br>
  621. server: device = /dev/onewire<br>
  622. # clients other than server use server<br>
  623. ! server: server = localhost:4304<br>
  624. # port<br>
  625. server: port = 4304<br>
  626. # owhttpd<br>
  627. http: port = 2121<br>
  628. # owftpd<br>
  629. ftp: port = 2120<br>
  630. </code>
  631. <p>
  632. Die vorhandenen 1-Wire- Busteilnehmer werden als <a href="#OWDevice">OWDevice</a> -Geräte definiert.
  633. Wenn <a href="#autocreate">autocreate</a> aktiviert ist, werden beim Start von FHEM alle Geräte automatisch erkannt und eingerichtet.
  634. <br><br>
  635. <b>Achtung: Dieses Modul ist weder verwandt noch verwendbar mit den 1-Wire Modulen, deren Namen nur aus Großbuchstaben bestehen!</b>
  636. <br><br>
  637. Beispiele für die Einrichtung:
  638. <ul>
  639. <code>define myLocalOWServer OWServer localhost:4304</code><br>
  640. <code>define myRemoteOWServer OWServer 192.168.1.100:4304</code><br>
  641. <code>define myRemoteOWServer OWServer raspi:4304</code><br>
  642. </ul>
  643. <br>
  644. Hinweis: Sollten keine Geräte erkannt werden, kann man versuchen in der owserver- Konfigurationsdatei (owfs.conf) zwei Servereinträge anzulegen:
  645. Einen mit <code>localhost</code> und einen mit dem "FQDN", bzw. dem Hostnamen, oder der IP-Adresse des Computers, auf dem die Software "owserver" läuft.
  646. <br><br>
  647. </ul>
  648. <a name="OWServerset"></a>
  649. <b>Set- Befehle</b>
  650. <ul>
  651. <code>set &lt;name&gt; &lt;value&gt;</code>
  652. <br><br>
  653. wobei <code>value</code> für einen der folgenden Befehle steht:<br><br>
  654. <li><code>reopen</code><br>
  655. Erneuert die Verbindung zum owserver.
  656. </li>
  657. <li>owserver (OWFS) -spezifische Einstellungen:
  658. <ul>
  659. <li><code>timeout/directory</code></li>
  660. <li><code>timeout/ftp</code></li>
  661. <li><code>timeout/ha7</code></li>
  662. <li><code>timeout/network</code></li>
  663. <li><code>timeout/presence</code></li>
  664. <li><code>timeout/serial</code></li>
  665. <li><code>timeout/server</code></li>
  666. <li><code>timeout/stable</code></li>
  667. <li><code>timeout/uncached</code></li>
  668. <li><code>timeout/usb</code></li>
  669. <li><code>timeout/volatile</code></li>
  670. <li><code>timeout/w1</code></li>
  671. <li><code>units/pressure_scale</code></li>
  672. <li><code>units/temperature_scale</code></li>
  673. </ul>
  674. </li>
  675. Nähere Informationen zu diesen Einstellungen gibt es im <a href="http://owfs.org/uploads/owserver.1.html#sect41">owserver- Manual</a>.
  676. <br>
  677. </ul>
  678. <br><br>
  679. <a name="OWServerget"></a>
  680. <b>Get- Befehle</b>
  681. <ul>
  682. <code>get &lt;name&gt; &lt;value&gt;</code>
  683. <br><br>
  684. wobei <code>value</code> für einen der folgenden Befehle steht:<br><br>
  685. <li><code>devices</code><br>
  686. Gibt eine Liste der Adressen und Typen aller von owserver erkannten Geräte aus. Außerdem
  687. werden die entsprechenden <a href="#OWDevice">OWDevice-</a> Namen angezeigt, soweit sie bereits definiert sind.
  688. </li>
  689. <li><code>errors</code><br>
  690. Liefert eine Fehlerstatistik zurück.</li>
  691. <li>owserver (OWFS) -spezifische Einstellungen:
  692. <ul>
  693. <li><code>/settings/timeout/directory</code></li>
  694. <li><code>/settings/timeout/ftp</code></li>
  695. <li><code>/settings/timeout/ha7</code></li>
  696. <li><code>/settings/timeout/network</code></li>
  697. <li><code>/settings/timeout/presence</code></li>
  698. <li><code>/settings/timeout/serial</code></li>
  699. <li><code>/settings/timeout/server</code></li>
  700. <li><code>/settings/timeout/stable</code></li>
  701. <li><code>/settings/timeout/uncached</code></li>
  702. <li><code>/settings/timeout/usb</code></li>
  703. <li><code>/settings/timeout/volatile</code></li>
  704. <li><code>/settings/timeout/w1</code></li>
  705. <li><code>/settings/units/pressure_scale</code></li>
  706. <li><code>/settings/units/temperature_scale</code></li>
  707. </ul>
  708. </li>
  709. Nähere Informationen zu diesen Einstellungen gibt es im <a href="http://owfs.org/uploads/owserver.1.html#sect41">owserver- Manual</a>.
  710. <br>
  711. </ul>
  712. <p>
  713. <a name="OWServerattr"></a>
  714. <b>Attribute</b>
  715. <ul>
  716. <li>nonblocking<br>
  717. Holt alle readings (OWServer / <a href="#OWDevice">OWDevice</a>) über einen Tochterprozess. Dieses Verfahren stellt sicher,
  718. dass FHEM während der Kommunikation mit owserver nicht angehalten wird.<br>
  719. Beispiel:<br>
  720. <code> attr &lt;name&gt; nonblocking 1</code>
  721. </li>
  722. <li><a href="#eventMap">eventMap</a></li>
  723. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  724. </ul>
  725. <br>
  726. Hinweis: Falls in FHEM trotzdem ungewöhnliche Stillstände auftreten, sollte das Attribut <code>nonblocking</code> wieder deaktiviert werden.<br>
  727. </ul>
  728. =end html_DE
  729. =cut