10_OWServer.pm 28 KB

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