diff --git a/fhem/CHANGED b/fhem/CHANGED index cae664582..09e55e126 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -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 diff --git a/fhem/FHEM/10_OWServer.pm b/fhem/FHEM/10_OWServer.pm index 24bd8a08b..a567d4317 100644 --- a/fhem/FHEM/10_OWServer.pm +++ b/fhem/FHEM/10_OWServer.pm @@ -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 OWServer "; + my $msg = "wrong syntax for $name: define OWServer []"; 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($@) Define
    - define <name> OWServer <protocol> + define <name> OWServer <protocol> [<version>]

    Defines a logical OWServer device which connects to an owserver. @@ -631,9 +658,21 @@ OWServer_Set($@) OWNet.pm from Sourceforge 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 + one of the + available versions and saving it as as + FHEM/lib/OWNet-<version>.pm in the FHEM directory + structure. +

    + The first connection to the owserver is made using version 3.1p5 unless + you explicitely suggest another version using the optional + <version> parameter. You should suggest a OWNet module + version matching your actual owserver version if FHEM hangs after + connecting to the owserver. +

    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 owfs_2.8p17-1_all.zip and install owserver, dependencies and what else you require with dpkg -i <package>.deb.

    - Please report issues related to versions in the + Please report issues and successes related to versions in the 1Wire board of the FHEM Forum.

    A typical working configuration file /etc/owfs.conf looks as follows:

    @@ -672,7 +711,7 @@ OWServer_Set($@) Examples:

      define myLocalOWServer OWServer localhost:4304
      - define myRemoteOWServer OWServer raspi:4304
      + define myRemoteOWServer OWServer raspi:4304 2.8p17


    Notice: if you get no devices add both localhost and the FQDN of your owserver as server directives @@ -779,23 +818,57 @@ OWServer_Set($@) Definition
      - define <name> OWServer <protocol> + define <name> OWServer <protocol> [<version>]

      - 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 1-Wire Dateisystems. Sie ermöglicht den Zugriff auf - alle 1-Wire- Busteilnehmer eines Systems.

      - <protocol> hat das Format <hostname>:<port> Nähere Informationen dazu gibt es in der owserver Dokumentation. -

      - Voraussetzung innerhalb von FHEM ist das Modul OWNet.pm von owfs.org, 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.

      - 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. Einen WIKI- Artikel dazu gibt es hier. -

      - Die ow*-Pakete in der Version 2.9 von Debian Jessie haben Probleme. Bitte entpacke für Debian Jessie entweder - owfs_2.8p17-1_all.zip und installiere - owserver, Abhängigkeiten und was Du sonst noch brauchst mit dpkg -i <package>.deb, oder benutze die neueste Version von OWNet.pm von Sourceforge. + alle 1-Wire-Busteilnehmer eines Systems. + <protocol> hat das Format <hostname>:<port>. + Nähere Informationen dazu gibt es in + der owserver Dokumentation.

      - Die ow*-Pakete in der Version 3.1 von Debian Stretch sind in Ordnung. + Die OWServer-Instanz verwendet + OWNet.pm von Sourceforge, + um sich mit dem owserver zu verbinden. + Gegenwärtig werden OWNet-Module für die Versionen 2.8p17 and 3.1p5 + mit FHEM verteilt. Man kann manuell weitere Versionen hinzufügen, + indem man OWNet.pm aus + einer der + verfügbaren Versionen extrahiert und als + FHEM/lib/OWNet-<version>.pm in der FHEM-Verzeichnisstruktur + speichert. +

      + Die erste Verbindung mit dem owserver wird mit der Version 3.1p5 aufgebaut, + es sei denn, dass man ausdrücklich eine andere Version mit dem + optionalen Parameter + <version> vorschlägt. Man sollte eine + OWNet-Modulversion vorschlagen, die der tatsächlichen Version von + owserver entspricht, falls FHEM nach dem Verbindungsaufbau zum owserver + hängt. +

      + Die OWServer-Instanz erkennt die Version von owserver automatisch und + wählt das passende OWNet-Modul aus der Liste der verfügbaren + OWNet-Module aus. Wenn kein passendes OWNet-Modul gefunden wird, wird die + ursprü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. +

      + 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önnen Auffälligkeiten zeigen (Rückmeldung + willkommen). Für + Debian Jessie kann man + owfs_2.8p17-1_all.zip + auspacken und owserver, Abhängigkeiten und was man sonst so braucht + mittels dpkg -i <package>.deb installieren. +

      + Bitte Auffälligkeiten und Erfolgsmeldungen zu Versionen im + 1Wire-Board des FHEM-Forums berichten.

      Eine typische funktionierende Konfigurationsdatei /etc/owfs.conf sieht so aus:

      diff --git a/fhem/FHEM/lib/OWNet-2.8p17/OWNet.pm b/fhem/FHEM/lib/OWNet-2.8p17.pm similarity index 100% rename from fhem/FHEM/lib/OWNet-2.8p17/OWNet.pm rename to fhem/FHEM/lib/OWNet-2.8p17.pm diff --git a/fhem/FHEM/lib/OWNet-3.1p5/OWNet.pm b/fhem/FHEM/lib/OWNet-3.1p5.pm similarity index 100% rename from fhem/FHEM/lib/OWNet-3.1p5/OWNet.pm rename to fhem/FHEM/lib/OWNet-3.1p5.pm