2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 16:56:54 +00:00

10_OWServer: added OWNet module version suggestion to define

git-svn-id: https://svn.fhem.de/fhem/trunk@16462 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
borisneubert 2018-03-21 19:04:00 +00:00
parent 2b20235e5b
commit 071c2e7235
4 changed files with 106 additions and 32 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- feature: 10_OWServer: added OWNet module version suggestion to define
- feature: 49_SSCam: V3.4.0, new commands startTracking, stopTracking for
PTZ-Cams with object tracking capability
- added: 74_HOMBOT: add commandref summary, code design

View File

@ -128,18 +128,33 @@ OWServer_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t]+", $def, 3);
my @a = split("[ \t]+", $def, 4);
my $name = $a[0];
if(@a < 3) {
my $msg = "wrong syntax for $name: define <name> OWServer <protocol>";
my $msg = "wrong syntax for $name: define <name> OWServer <protocol> [<version>]";
Log 2, $msg;
return $msg;
}
my $protocol = $a[2];
$hash->{fhem}{protocol}= $protocol;
my $version;
if(@a==4) {
$version= $a[3];
Log3 $hash, 5, "$name: Suggesting OWNet version $version";
if(!OWServer_hasOWNet($version)) {
Log3 $hash, 2, "$name: Suggested OWNet version $version not available, falling back to default version "
. OWNet_version_default;
$version= OWNet_version_default;
}
} else {
$version= OWNet_version_default;
Log3 $hash, 5, "$name: Tentatively assuming OWNet version $version";
}
$hash->{OWNET_VERSION}= $version;
$hash->{NOTIFYDEV} = "global";
$hash->{OWNET_VERSION}= OWServer_loadOWNet($hash);
@ -175,8 +190,20 @@ OWServer_Undef($$)
}
#####################################
sub OWServer_getOWNetfilename($) {
my ($v)= @_;
return "lib/OWNet-$v.pm";
}
sub OWServer_hasOWNet($) {
my ($v)= @_;
my $filename= $attr{global}{modpath}."/FHEM/lib/OWNet-$v.pm";
return -r $filename;
}
sub OWServer_loadOWNet($) {
my ($hash) = @_;
my $name = $hash->{NAME};
@ -185,9 +212,9 @@ sub OWServer_loadOWNet($) {
return $OWNet_version;
}
$OWNet_version= OWNet_version_default;
my $libfilename= "lib/OWNet-" . $OWNet_version . "/OWNet.pm";
Log3 $name, 5, "$name: loading OWNet version $OWNet_version...";
$OWNet_version= $hash->{OWNET_VERSION};
my $libfilename= OWServer_getOWNetfilename($OWNet_version);
Log3 $name, 5, "$name: Loading OWNet version $OWNet_version...";
require $libfilename;
Log3 $name, 3, "$name: OWNet version $OWNet_version loaded.";
@ -197,29 +224,29 @@ sub OWServer_loadOWNet($) {
Log3 $name, 3, "$name: owserver version $version found.";
$hash->{OWSERVER_VERSION}= $version;
if($OWNet_version eq $version) {
Log3 $name, 3, "$name: matching OWNet version already loaded.";
Log3 $name, 3, "$name: Matching OWNet version already loaded.";
return $OWNet_version;
}
my $libfilename= "lib/OWNet-" . $version . "/OWNet.pm";
Log3 $name, 5, "$name: looking for OWNet version $version in $libfilename...";
if(-r $attr{global}{modpath}."/FHEM/$libfilename") {
my $libfilename= OWServer_getOWNetfilename($version);
Log3 $name, 5, "$name: Looking for OWNet version $version in $libfilename...";
if(OWServer_hasOWNet($version)) {
# we temporarily disable the subroutine warning
my $handler= $SIG{__WARN__};
$SIG{__WARN__} = sub {
my $warning= shift;
warn $warning unless $warning =~ /Subroutine .* redefined at/;
};
Log3 $name, 5, "$name: loading OWNet version $version...";
Log3 $name, 5, "$name: Loading OWNet version $version...";
require $libfilename;
$SIG{__WARN__}= $handler;
$OWNet_version= $version;
Log3 $name, 3, "$name: OWNet version $OWNet_version loaded.";
return $OWNet_version;
} else {
Log3 $name, 3, "$name: no matching OWNet version found, using default OWNet version $OWNet_version.";
Log3 $name, 3, "$name: No matching OWNet version found, using OWNet version $OWNet_version.";
}
} else {
Log3 $name, 2, "$name: could not connect to owserver, using default OWNet version $OWNet_version";
Log3 $name, 2, "$name: Could not connect to owserver, using OWNet version $OWNet_version";
return $OWNet_version;
}
# we should not get here
@ -616,7 +643,7 @@ OWServer_Set($@)
<a name="OWServerdefine"></a>
<b>Define</b>
<ul>
<code>define &lt;name&gt; OWServer &lt;protocol&gt;</code>
<code>define &lt;name&gt; OWServer &lt;protocol&gt; [&lt;version&gt;]</code>
<br><br>
Defines a logical OWServer device which connects to an owserver.
@ -631,9 +658,21 @@ OWServer_Set($@)
<a href="http://owfs.cvs.sourceforge.net/viewvc/owfs/owfs/module/ownet/perl5/OWNet/lib/OWNet.pm">OWNet.pm from Sourceforge</a>
to connect to the owserver.
Currently, OWNet modules for versions 2.8p17 and 3.1p5 are deployed with FHEM.
You can manually add more versions by extracting OWNet.pm from
<a href="https://sourceforge.net/projects/owfs/files/owfs/">one of the
available versions</a> and saving it as as
<code>FHEM/lib/OWNet-&lt;version&gt.pm</code> in the FHEM directory
structure.
<p>
The first connection to the owserver is made using version 3.1p5 unless
you explicitely suggest another version using the optional
<code>&lt;version&gt;</code> parameter. You should suggest a OWNet module
version matching your actual owserver version if FHEM hangs after
connecting to the owserver.
<p>
The OWServer device autodetects the owserver version and chooses a matching
OWNet module from this list. If no matching OWNet module is found,
the default version 3.1p5 is used. The nightmare situation of two
OWNet module from the list of available OWNet modules. If no matching OWNet
module is found, the initially suggested version is used. The nightmare situation of two
OWServer devices connecting to owserver instances with different versions is
not handled correctly. The server and module versions are stored in the
internals of the OWServer device for your reference.
@ -641,12 +680,12 @@ OWServer_Set($@)
The ow* version 3.1p5 packages provided with Debian Stretch and
the ow* version 2.8p17 packages provided with Debian Jessie are fine.
The ow* version 2.9 packages provided with Debian Jessie in combination with OWNet.pm as
deployed with FHEM might have issues.
deployed with FHEM might have issues (feedback welcome).
For Debian Jessie you could unzip
<a href="http://forum.fhem.de/index.php?action=dlattach;topic=12219.0;attach=2463">owfs_2.8p17-1_all.zip</a> and install
owserver, dependencies and what else you require with <code>dpkg -i &lt;package&gt;.deb</code>.
<p>
Please report issues related to versions in the
Please report issues and successes related to versions in the
<a href="https://forum.fhem.de/index.php/board,26.0.html">1Wire board of the FHEM Forum</a>.
<p>
A typical working configuration file <code>/etc/owfs.conf</code> looks as follows:<p>
@ -672,7 +711,7 @@ OWServer_Set($@)
Examples:
<ul>
<code>define myLocalOWServer OWServer localhost:4304</code><br>
<code>define myRemoteOWServer OWServer raspi:4304</code><br>
<code>define myRemoteOWServer OWServer raspi:4304 2.8p17</code><br>
</ul>
<br><br>
Notice: if you get no devices add both <code>localhost</code> and the FQDN of your owserver as server directives
@ -779,23 +818,57 @@ OWServer_Set($@)
<a name="OWServerdefine"></a>
<b>Definition</b>
<ul>
<code>define &lt;name&gt; OWServer &lt;protocol&gt;</code>
<code>define &lt;name&gt; OWServer &lt;protocol&gt; [&lt;version&gt;]</code>
<br><br>
Definiert eine logische OWServer- Instanz. OWServer ist die Serverkomponente des
Definiert eine logische OWServer-Instanz, die sich mit einem owserver
verbindet. owserver ist die Serverkomponente des
<a href="http://owfs.org">1-Wire Dateisystems</a>. Sie ermöglicht den Zugriff auf
alle 1-Wire- Busteilnehmer eines Systems.<br><br>
&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>.
<br><br>
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.
Das auf CPAN erhältliche OWNet- Modul beinhaltet seit dem 23.12.2012 einen Fehler, der es für Fernzugriffe unbrauchbar macht.<p>
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>
<br><br>
Die ow*-Pakete in der Version 2.9 von Debian Jessie haben Probleme. Bitte entpacke f&uuml;r Debian Jessie entweder
<a href="http://forum.fhem.de/index.php?action=dlattach;topic=12219.0;attach=2463">owfs_2.8p17-1_all.zip</a> und installiere
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.
alle 1-Wire-Busteilnehmer eines Systems.
&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>.
<p>
Die ow*-Pakete in der Version 3.1 von Debian Stretch sind in Ordnung.
Die OWServer-Instanz verwendet
<a href="http://owfs.cvs.sourceforge.net/viewvc/owfs/owfs/module/ownet/perl5/OWNet/lib/OWNet.pm">OWNet.pm von Sourceforge</a>,
um sich mit dem owserver zu verbinden.
Gegenw&auml;rtig werden OWNet-Module f&uuml;r die Versionen 2.8p17 and 3.1p5
mit FHEM verteilt. Man kann manuell weitere Versionen hinzuf&uuml;gen,
indem man OWNet.pm aus
<a href="https://sourceforge.net/projects/owfs/files/owfs/">einer der
verf&uuml;gbaren Versionen</a> extrahiert und als
<code>FHEM/lib/OWNet-&lt;version&gt.pm</code> in der FHEM-Verzeichnisstruktur
speichert.
<p>
Die erste Verbindung mit dem owserver wird mit der Version 3.1p5 aufgebaut,
es sei denn, dass man ausdr&uuml;cklich eine andere Version mit dem
optionalen Parameter
<code>&lt;version&gt;</code> vorschl&auml;gt. Man sollte eine
OWNet-Modulversion vorschlagen, die der tats&auml;chlichen Version von
owserver entspricht, falls FHEM nach dem Verbindungsaufbau zum owserver
h&auml;ngt.
<p>
Die OWServer-Instanz erkennt die Version von owserver automatisch und
w&auml;hlt das passende OWNet-Modul aus der Liste der verf&uuml;gbaren
OWNet-Module aus. Wenn kein passendes OWNet-Modul gefunden wird, wird die
urspr&uuml;nglich vorgeschlagene Version verwendet. Die alptraumhafte Situation
mit zwei OWServer-Instanzen, die sich mit owserver-Instanzen in
unterschiedlichen Versionen verbinden, wird nicht korrekt gehandhabt.
Die Versionen von Server und Modul werden zum Nachschauen in den Internals der
OWServer-Instanz gespeichert.
<p>
Die ow*-Pakete in der Version 3.1p5 bei Debian Stretch und
die ow*-Pakete in der Version 2.8p17 bei Debian Jessie sind gut.
Die ow*-Pakete in der Version 2.9 bei Debian Jessie in Kombination mit den
OWNet-Modulen bei FHEM k&ouml;nnen Auff&auml;lligkeiten zeigen (R&uuml;ckmeldung
willkommen). F&uuml;r
Debian Jessie kann man
<a href="http://forum.fhem.de/index.php?action=dlattach;topic=12219.0;attach=2463">owfs_2.8p17-1_all.zip</a>
auspacken und owserver, Abh&auml;ngigkeiten und was man sonst so braucht
mittels <code>dpkg -i &lt;package&gt;.deb</code> installieren.
<p>
Bitte Auff&auml;lligkeiten und Erfolgsmeldungen zu Versionen im
<a href="https://forum.fhem.de/index.php/board,26.0.html">1Wire-Board des FHEM-Forums</a> berichten.
<p>
Eine typische funktionierende Konfigurationsdatei <code>/etc/owfs.conf</code> sieht so aus:<p>
<code>