10_OWServer.pm 27 KB

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