소스 검색

Commit before change Tradrfimodule

hmetzner 7 년 전
부모
커밋
cbfaafee70

+ 28 - 0
fhem/core/CHANGED

@@ -1,5 +1,33 @@
 # 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: 93_DbRep: V8.4.0, reduceLog from DbLog integrated into DbRep, 
+                       sqlCmd/dbValue with textField-long as default, both 
+                       attributes timeOlderThan / timeDiffToNow can be set,
+                       get versionNotes changed to support en/de, new attribute
+                       "countEntriesDetail", countEntries separate count of  
+                       every reading if attribute "countEntriesDetail" is set
+  - change:  49_SSCam: COMPATIBILITY changed to 8.2.1
+  - bugfix:  74_XiaomiBTLESens : fix warning Illegal hexadecimal digit
+                                 ignored
+  - bugfix:  93_DbLog: timer not deleted if reopen after reopen xxx executed
+             (forum.fhem.de/index.php/topic,91869.msg848433.html#msg848433)
+  - feature: 70_ZoneMinder: added attribute loginInterval and setter for login
+  - bugfix:  38_netatmo: changed connection check mechanism
+  - new:     98_SmarterCoffee: new modul for SmarterCoffee devices
+  - bugfix:  74_XiaomiBTLESens: fix humidity bug
+  - feature: 49_SSCam: direct help for attributes, new get versionNotes command
+  - change:  ROOMMATE, GUEST: Support for updated GEOFANCY version
+  - feature: 98_GEOFANCY: add new reading LocTravDist; add support for
+                Geofency.app webhook attributes radius, currentLatitude,
+                currentLongitude, motion, wifiSSID and wifiBSSID.
+                New readings: PosBSSID, PosLat, PosDistHome, PosDistLoc,
+                PosLong, PosMotion, PosSSID, PosTravDist
+  - bugfix:  98_GEOFANCY: fixed last* readings
+  - feature: 89_FULLY: New commands for sound playback and photo.
+  - bugfix:  74_XiaomiBTLESens: fix disableForTimer Problem after reboot
+  - feature: 31_HUEDevice: added water reading for Xiaomi Aqara Water sensor
+  - bugfix:  73_GardenaSmartBridge/Device
+                fix Undefined subroutine &GardenaSmartDevice
   - change:  93_DbLog: Log output of recuceLogNbl & use of charFilter enhanced
   - feature: 93_Log2Syslog: attribute sslCertPrefix added (Forum:#92030)
   - bugfix:  10_IT fix usage with multible io devices

+ 3 - 2
fhem/core/FHEM/00_CUL.pm

@@ -1,5 +1,5 @@
 ##############################################
-# $Id: 00_CUL.pm 16907 2018-06-25 09:03:09Z rudolfkoenig $
+# $Id: 00_CUL.pm 17559 2018-10-18 07:45:07Z rudolfkoenig $
 package main;
 
 use strict;
@@ -48,7 +48,7 @@ my @ampllist = (24, 27, 30, 33, 36, 38, 40, 42); # rAmpl(dB)
 my $sccMods = "STACKABLE_CC:TSSTACKED:STACKABLE";
 my $culNameRe = "^(CUL|TSCUL)\$";
 
-my $clientsSlowRF    = ":FS20:FHT.*:KS300:USF1000:BS:HMS: ".
+my $clientsSlowRF    = ":FS20:FHT.*:KS300:USF1000:BS:HMS:FS20V: ".
                        ":CUL_EM:CUL_WS:CUL_FHTTK:CUL_HOERMANN: ".
                        ":ESA2000:CUL_IR:CUL_TX:Revolt:IT:UNIRoll:SOMFY: ".
                        ":$sccMods:CUL_RFR::CUL_TCM97001:CUL_REDIRECT:";
@@ -58,6 +58,7 @@ my $clientsWMBus     = ":WMBUS:HMS:CUL_IR:$sccMods:";
 my $clientsKOPP_FC   = ":KOPP_FC:HMS:CUL_IR:$sccMods:";
 
 my %matchListSlowRF = (
+    "0:FS20V"     => "^81..(04|0c)..0101a001......00[89a-f]...",
     "1:USF1000"   => "^81..(04|0c)..0101a001a5ceaa00....",
     "2:BS"        => "^81..(04|0c)..0101a001a5cf",
     "3:FS20"      => "^81..(04|0c)..0101a001",

+ 4 - 1
fhem/core/FHEM/00_FBAHAHTTP.pm

@@ -1,5 +1,5 @@
 ##############################################
-# $Id: 00_FBAHAHTTP.pm 17110 2018-08-09 07:11:33Z rudolfkoenig $
+# $Id: 00_FBAHAHTTP.pm 17603 2018-10-23 09:10:09Z rudolfkoenig $
 package main;
 
 # Documentation: AHA-HTTP-Interface.pdf, AVM_Technical_Note_-_Session_ID.pdf
@@ -46,6 +46,9 @@ FBAHAHTTP_Define($$)
       CommandAttr(undef, "$d IODev $hash->{NAME}");
       CommandDelete(undef, $n) if($defs{$n});
       $defs{$d}{IODev} = $hash;
+
+      my $oldNr = $defs{$d}{IODev}{NR}; # Forum #92286
+      $hash->{NR} = $oldNr if($hash->{NR} > $oldNr);
     }
   }
   $hash->{CmdStack} = ();

+ 44 - 27
fhem/core/FHEM/10_MQTT_GENERIC_BRIDGE.pm

@@ -22,19 +22,23 @@
 #     You should have received a copy of the GNU General Public License
 #     along with fhem.  If not, see <http://www.gnu.org/licenses/>.
 #
-# $Id: 10_MQTT_GENERIC_BRIDGE.pm 17533 2018-10-14 19:25:32Z hexenmeister $
+# $Id: 10_MQTT_GENERIC_BRIDGE.pm 17564 2018-10-18 20:28:34Z hexenmeister $
 #
 ###############################################################################
 
 ###############################################################################
 # 
 # CHANGE LOG
+# 
+# 18.10.2018 0.9.9
+#   bugfix   : qos/retain/expression aus 'mqttDefaults' in Device wurden nicht
+#              verwendet (Fehler bei der Suche (Namen))
 #
 # 14.10.2018 0.9.9
-#   change   :  'mqttForward' dokumentiert
-#   improved :  Laden von MQTT-Modul in BEGIN-Block verlagert. 
-#               Es gab Meldungen ueber Probleme (undefined subroutine) wenn
-#               MQTT-Modul in fhem.cfg nach dem Bridge-Modul stand.
+#   change   : 'mqttForward' dokumentiert
+#   improved : Laden von MQTT-Modul in BEGIN-Block verlagert. 
+#              Es gab Meldungen ueber Probleme (undefined subroutine) wenn
+#              MQTT-Modul in fhem.cfg nach dem Bridge-Modul stand.
 #
 # 11.10.2018 0.9.9
 #   change   : 'self-trigger-topic' wieder ausgebaut.
@@ -190,6 +194,7 @@
 #   - Variablen in Expression funktionieren nicht, wenn Topic kein perl-Expression ist
 #   - atopic wird in devInfo nicht dargestellt
 #   - beim Aendern von mqttXXX und globalXXX mit Zeilenumbruechen werden interne Tabellen nicht aktualisiert
+#   - qos/retain ueber mqttDefaults funktionieren nicht (in publish als *:retaind=1 dagegen schon)
 #
 # [testing]
 # 
@@ -203,7 +208,7 @@ use strict;
 use warnings;
 
 #my $DEBUG = 1;
-my $cvsid = '$Id: 10_MQTT_GENERIC_BRIDGE.pm 17533 2018-10-14 19:25:32Z hexenmeister $';
+my $cvsid = '$Id: 10_MQTT_GENERIC_BRIDGE.pm 17564 2018-10-18 20:28:34Z hexenmeister $';
 my $VERSION = "version 0.9.9 by hexenmeister\n$cvsid";
 
 my %sets = (
@@ -883,7 +888,8 @@ sub getDevicePublishRecIntern($$$$$) {
 
   # reading map
   my $readingMap = $publishMap->{$reading} if defined $publishMap;
-  my $defaultReadingMap = $publishMap->{'*'} if defined $publishMap;
+  #my $defaultReadingMap = $publishMap->{'*'} if defined $publishMap;
+  my $defaultReadingMap = $devMap->{':defaults'} if defined $publishMap;
   
   # global reading map
   my $globalReadingMap = $globalPublishMap->{$reading} if defined $globalPublishMap;
@@ -960,48 +966,59 @@ sub retrieveQosRetainExpression($$$$) {
   my $retain = undef;
   my $expression = undef;
 
+  # Log3('GB',1,"MQTT_GENERIC_BRIDGE: retrieveQosRetainExpression: globalDefaultReadingMap: ".Dumper($globalDefaultReadingMap));
+  # Log3('GB',1,"MQTT_GENERIC_BRIDGE: retrieveQosRetainExpression: globalReadingMap: ".Dumper($globalReadingMap));
+  # Log3('GB',1,"MQTT_GENERIC_BRIDGE: retrieveQosRetainExpression: defaultReadingMap: ".Dumper($defaultReadingMap));
+  # Log3('GB',1,"MQTT_GENERIC_BRIDGE: retrieveQosRetainExpression: readingMap: ".Dumper($readingMap));
+
   if(defined $readingMap) {
     $qos =          $readingMap->{'qos'};
     $retain =       $readingMap->{'retain'};
     $expression =   $readingMap->{'expression'};
-    if(defined($readingMap->{':defaults'})) {
-      $qos =        $readingMap->{':defaults'}->{'pub:qos'} unless defined $qos;
-      $retain =     $readingMap->{':defaults'}->{'pub:retain'} unless defined $retain;
-      $expression = $readingMap->{':defaults'}->{'expression'} unless defined $expression;
-    }
+    # if(defined($readingMap->{':defaults'})) {
+    #   $qos =        $readingMap->{':defaults'}->{'pub:qos'} unless defined $qos;
+    #   $retain =     $readingMap->{':defaults'}->{'pub:retain'} unless defined $retain;
+    #   $expression = $readingMap->{':defaults'}->{'expression'} unless defined $expression;
+    # }
   }
 
   if(defined $defaultReadingMap) {
+    $qos =          $defaultReadingMap->{'pub:qos'} unless defined $qos;
+    $retain =       $defaultReadingMap->{'pub:retain'} unless defined $retain;
+    $expression =   $defaultReadingMap->{'pub:expression'} unless defined $expression;
     $qos =          $defaultReadingMap->{'qos'} unless defined $qos;
     $retain =       $defaultReadingMap->{'retain'} unless defined $retain;
     $expression =   $defaultReadingMap->{'expression'} unless defined $expression;
-    if(defined($defaultReadingMap->{':defaults'})) {
-      $qos =        $defaultReadingMap->{':defaults'}->{'pub:qos'} unless defined $qos;
-      $retain =     $defaultReadingMap->{':defaults'}->{'pub:retain'} unless defined $retain;
-      $expression = $defaultReadingMap->{':defaults'}->{'expression'} unless defined $expression;
-    }
+    # if(defined($defaultReadingMap->{':defaults'})) {
+    #   $qos =        $defaultReadingMap->{':defaults'}->{'pub:qos'} unless defined $qos;
+    #   $retain =     $defaultReadingMap->{':defaults'}->{'pub:retain'} unless defined $retain;
+    #   $expression = $defaultReadingMap->{':defaults'}->{'expression'} unless defined $expression;
+    # }
   }
 
   if(defined $globalReadingMap) {
     $qos =          $globalReadingMap->{'qos'};
     $retain =       $globalReadingMap->{'retain'};
     $expression =   $globalReadingMap->{'expression'} unless defined $expression;
-    if(defined($globalReadingMap->{':defaults'})) {
-      $qos =        $globalReadingMap->{':defaults'}->{'pub:qos'} unless defined $qos;
-      $retain =     $globalReadingMap->{':defaults'}->{'pub:retain'} unless defined $retain;
-      $expression = $globalReadingMap->{':defaults'}->{'expression'} unless defined $expression;
-    }
+    # if(defined($globalReadingMap->{':defaults'})) {
+    #   $qos =        $globalReadingMap->{':defaults'}->{'pub:qos'} unless defined $qos;
+    #   $retain =     $globalReadingMap->{':defaults'}->{'pub:retain'} unless defined $retain;
+    #   $expression = $globalReadingMap->{':defaults'}->{'expression'} unless defined $expression;
+    # }
   }
   
   if(defined $globalDefaultReadingMap) {
+    $qos =          $globalDefaultReadingMap->{'pub:qos'} unless defined $qos;
+    $retain =       $globalDefaultReadingMap->{'pub:retain'} unless defined $retain;
+    $expression =   $globalDefaultReadingMap->{'pub:expression'} unless defined $expression;
     $qos =          $globalDefaultReadingMap->{'qos'} unless defined $qos;
     $retain =       $globalDefaultReadingMap->{'retain'} unless defined $retain;
     $expression =   $globalDefaultReadingMap->{'expression'} unless defined $expression;
-    if(defined($globalDefaultReadingMap->{':defaults'})) {
-      $qos =        $globalDefaultReadingMap->{':defaults'}->{'pub:qos'} unless defined $qos;
-      $retain =     $globalDefaultReadingMap->{':defaults'}->{'pub:retain'} unless defined $retain;
-      $expression = $globalDefaultReadingMap->{':defaults'}->{'expression'} unless defined $expression;
-    }
+    # if(defined($globalDefaultReadingMap->{':defaults'})) {
+    #   $qos =        $globalDefaultReadingMap->{':defaults'}->{'pub:qos'} unless defined $qos;
+    #   $retain =     $globalDefaultReadingMap->{':defaults'}->{'pub:retain'} unless defined $retain;
+    #   $expression = $globalDefaultReadingMap->{':defaults'}->{'expression'} unless defined $expression;
+    # }
   }
 
   $qos = 0 unless defined $qos;

+ 7 - 7
fhem/core/FHEM/10_RESIDENTS.pm

@@ -1,5 +1,5 @@
 ###############################################################################
-# $Id: 10_RESIDENTS.pm 14136 2017-04-29 16:31:46Z loredo $
+# $Id: 10_RESIDENTS.pm 17602 2018-10-23 07:48:38Z loredo $
 package main;
 use strict;
 use warnings;
@@ -823,14 +823,14 @@ sub RESIDENTS_UpdateReadings (@) {
             readingsBulkUpdate(
                 $hash,
                 "lastDurSleep",
-                RESIDENTStk_TimeDiff(
+                UConv::duration(
                     $datetime, ReadingsVal( $name, "lastSleep", "" )
                 )
             );
             readingsBulkUpdate(
                 $hash,
                 "lastDurSleep_cr",
-                RESIDENTStk_TimeDiff(
+                UConv::duration(
                     $datetime, ReadingsVal( $name, "lastSleep", "" ), "min"
                 )
             );
@@ -854,14 +854,14 @@ sub RESIDENTS_UpdateReadings (@) {
                 readingsBulkUpdate(
                     $hash,
                     "lastDurAbsence",
-                    RESIDENTStk_TimeDiff(
+                    UConv::duration(
                         $datetime, ReadingsVal( $name, "lastDeparture", "-" )
                     )
                 );
                 readingsBulkUpdate(
                     $hash,
                     "lastDurAbsence_cr",
-                    RESIDENTStk_TimeDiff(
+                    UConv::duration(
                         $datetime, ReadingsVal( $name, "lastDeparture", "-" ),
                         "min"
                     )
@@ -876,14 +876,14 @@ sub RESIDENTS_UpdateReadings (@) {
                 readingsBulkUpdate(
                     $hash,
                     "lastDurPresence",
-                    RESIDENTStk_TimeDiff(
+                    UConv::duration(
                         $datetime, ReadingsVal( $name, "lastArrival", "-" )
                     )
                 );
                 readingsBulkUpdate(
                     $hash,
                     "lastDurPresence_cr",
-                    RESIDENTStk_TimeDiff(
+                    UConv::duration(
                         $datetime, ReadingsVal( $name, "lastArrival", "-" ),
                         "min"
                     )

+ 2 - 1
fhem/core/FHEM/31_HUEDevice.pm

@@ -1,5 +1,5 @@
 
-# $Id: 31_HUEDevice.pm 16352 2018-03-08 07:42:40Z justme1968 $
+# $Id: 31_HUEDevice.pm 17560 2018-10-18 08:12:38Z justme1968 $
 
 # "Hue Personal Wireless Lighting" is a trademark owned by Koninklijke Philips Electronics N.V.,
 # see www.meethue.com for more information.
@@ -1267,6 +1267,7 @@ HUEDevice_Parse($$)
       $readings{voltage} = $state->{voltage} if( defined($state->{voltage}) );
       $readings{current} = $state->{current} if( defined($state->{current}) );
       $readings{consumption} = $state->{consumption} if( defined($state->{consumption}) );
+      $readings{water} = $state->{water} if( defined($state->{water}) );
     }
 
     if( scalar keys %readings ) {

+ 33 - 15
fhem/core/FHEM/38_netatmo.pm

@@ -1,5 +1,5 @@
 ##############################################################################
-# $Id: 38_netatmo.pm 17485 2018-10-07 19:05:13Z moises $
+# $Id: 38_netatmo.pm 17588 2018-10-22 08:43:51Z moises $
 #
 #  38_netatmo.pm
 #
@@ -11,12 +11,13 @@
 #
 #
 ##############################################################################
-# Release 21 / 2018-10-06
+# Release 22 / 2018-10-22
 
 package main;
 
 use strict;
 use warnings;
+no warnings qw(redefine);
 
 use Encode qw(encode_utf8 decode_utf8);
 use JSON;
@@ -896,28 +897,37 @@ netatmo_refreshAppTokenTimer($)
 }
 
 sub
-netatmo_checkConnection($)
+netatmo_checkConnection($;$)
 {
-  my ($hash) = @_;
+  my ($hash,$forcecheck) = @_;
   my $name = $hash->{NAME};
 
-  return undef if($hash->{network} eq "ok");
+  return undef if(!$forcecheck && $hash->{network} eq "ok");
   return undef if(!defined($hash->{access_token}));
-
   Log3 $name, 3, "$name: refreshing connection information";
 
-  my $json = '{"limit":2,"divider":3,"zoom":18,"lat_ne":0.1,"lon_ne":-0.1,"lat_sw":0.1,"lon_sw":-0.1,"date_end":"last","quality":1}';
-
   HttpUtils_NonblockingGet({
-    url => "https://".$hash->{helper}{apiserver}."/api/getpublicmeasures",
+    url => "https://".$hash->{helper}{apiserver}."/api/getuser",
     method => "POST",
     timeout => 30,
     header => "Content-Type: application/json\r\nAuthorization: Bearer ".$hash->{access_token},
     hash => $hash,
-    data => $json,
     callback => \&netatmo_parseConnection,
   });
   return undef;
+
+  # my $json = '{"limit":2,"divider":3,"zoom":18,"lat_ne":0.1,"lon_ne":-0.1,"lat_sw":0.1,"lon_sw":-0.1,"date_end":"last","quality":1}';
+  #
+  # HttpUtils_NonblockingGet({
+  #   url => "https://".$hash->{helper}{apiserver}."/api/getpublicmeasures",
+  #   method => "POST",
+  #   timeout => 30,
+  #   header => "Content-Type: application/json\r\nAuthorization: Bearer ".$hash->{access_token},
+  #   hash => $hash,
+  #   data => $json,
+  #   callback => \&netatmo_parseConnection,
+  # });
+  # return undef;
 }
 
 sub
@@ -947,12 +957,13 @@ netatmo_parseConnection($$$)
       $hash->{status} = "timeout";
       $hash->{network} = "disconnected";
     }
-    
+    readingsSingleUpdate($hash, "active", "error", 1);
     return undef;
   } elsif( $data ) {
       $data =~ s/\n//g;
       if( $data !~ m/^{.*}$/ ) {
         Log3 $name, 2, "$name: invalid json on connection check";
+        Log3 $name, 4, "$name: ".$data;
         return undef;
       }
       my $json = eval { JSON->new->utf8(0)->decode($data) };
@@ -966,6 +977,7 @@ netatmo_parseConnection($$$)
       } else {
         Log3 $name, 4, "$name: connection check: \n".$data;
         $hash->{network} = "ok" if($json->{status} eq "ok");
+        readingsSingleUpdate($hash, "active", "ok", 1) if($json->{status} eq "ok");
       }
     }
   return undef;
@@ -1896,7 +1908,7 @@ netatmo_pollHeatingHome($@)
 #    url => "https://".$iohash->{helper}{apiserver}."/api/gethomedata",
 #    data => \%data,
   HttpUtils_NonblockingGet({
-    url => "https://my.netatmo.com/syncapi/v1/gethomestatus",
+    url => "https://".$iohash->{helper}{apiserver}."/syncapi/v1/gethomestatus",
     timeout => 60,
     noshutdown => 1,
     header => "Content-Type: application/json;charset=utf-8\r\nAuthorization: Bearer ".$iohash->{access_token},
@@ -2701,7 +2713,7 @@ netatmo_dispatch($$$)
       RemoveInternalTimer($hash);
       InternalTimer(gettimeofday()+300, "netatmo_poll", $hash);
       Log3 $name, 2, "$name: invalid json detected";
-      Log3 $name, 5, "$name: $data";
+      Log3 $name, 4, "$name: $data";
       $hash->{status} = "error";
       $hash->{network} = "ok" if($hash->{SUBTYPE} eq "ACCOUNT");
       $hash->{IODev}->{network} = "ok" if($hash->{SUBTYPE} ne "ACCOUNT");
@@ -3511,7 +3523,7 @@ netatmo_parseReadings($$;$)
             $hash->{helper}{NEXT_POLL} = $nextdata;
             Log3 $name, 3, "$name: next extended dynamic update ($requested) at ".FmtDateTime($nextdata);
           } else {
-          Log3 $name, 2, "$name: invalid time for dynamic update ($requested): ".FmtDateTime($nextdata);
+            Log3 $name, 3, "$name: invalid time for dynamic update ($requested): ".FmtDateTime($nextdata);
           }
         }
       } elsif(defined($last_time) && int($last_time) > 0) {
@@ -5774,7 +5786,7 @@ netatmo_Get($$@)
       return undef;
     }
   } elsif( $hash->{SUBTYPE} eq "ACCOUNT" ) {
-    $list = "update:noArg devices:noArg homes:noArg thermostats:noArg homecoachs:noArg public showAccount:noArg";
+    $list = "update:noArg devices:noArg homes:noArg thermostats:noArg homecoachs:noArg public showAccount:noArg"; #checkConnection:noArg";
 
     if( $cmd eq "update" ) {
       netatmo_poll($hash);
@@ -5795,6 +5807,12 @@ netatmo_Get($$@)
       return "username: $username\npassword: $password";
     }
 
+    if( $cmd eq 'checkConnection' )
+    {
+      netatmo_checkConnection($hash,1);
+      return undef;
+    }
+
     if( $cmd eq "devices" ) {
       my $devices = netatmo_getDevices($hash,1);
       my $ret;

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 433 - 276
fhem/core/FHEM/49_SSCam.pm


+ 7 - 3
fhem/core/FHEM/57_CALVIEW.pm

@@ -1,4 +1,4 @@
-# $Id: 57_CALVIEW.pm 17031 2018-07-26 17:17:50Z chris1284 $
+# $Id: 57_CALVIEW.pm 17605 2018-10-23 16:37:40Z chris1284 $
 ############################
 #	CALVIEW
 #	needs a defined Device 57_Calendar
@@ -271,6 +271,8 @@ sub CALVIEW_GetUpdate($){
 						readingsBulkUpdate($hash, "today_".sprintf ('%03d', $todaycounter)."_etime", $termin->{etime}); 
 						readingsBulkUpdate($hash, "today_".sprintf ('%03d', $todaycounter)."_mode", $termin->{mode});
 						readingsBulkUpdate($hash, "today_".sprintf ('%03d', $todaycounter)."_timeshort", $timeshort );
+						readingsBulkUpdate($hash, "today_".sprintf ('%03d', $todaycounter)."_weekday", $termin->{weekday} );
+						readingsBulkUpdate($hash, "today_".sprintf ('%03d', $todaycounter)."_weekdayname", $termin->{weekdayname} );
 						readingsBulkUpdate($hash, "today_".sprintf ('%03d', $todaycounter)."_duration", $termin->{duration});
 						$todaycounter ++;
 					}
@@ -292,6 +294,8 @@ sub CALVIEW_GetUpdate($){
 						readingsBulkUpdate($hash, "tomorrow_".sprintf ('%03d', $tomorrowcounter)."_etime", $termin->{etime});
 						readingsBulkUpdate($hash, "tomorrow_".sprintf ('%03d', $tomorrowcounter)."_mode", $termin->{mode});
 						readingsBulkUpdate($hash, "tomorrow_".sprintf ('%03d', $tomorrowcounter)."_timeshort", $timeshort );
+						readingsBulkUpdate($hash, "tomorrow_".sprintf ('%03d', $tomorrowcounter)."_weekday", $termin->{weekday} );
+						readingsBulkUpdate($hash, "tomorrow_".sprintf ('%03d', $tomorrowcounter)."_weekdayname", $termin->{weekdayname} );
 						readingsBulkUpdate($hash, "tomorrow_".sprintf ('%03d', $tomorrowcounter)."_duration", $termin->{duration});
 						$tomorrowcounter++;
 					}
@@ -388,7 +392,7 @@ sub CALVIEW_Notify($$)
 <a name="CALVIEW"></a>
 <h3>CALVIEW</h3>
 <ul>This module creates a device with deadlines based on calendar-devices of the 57_Calendar.pm module. You need to install the  perl-modul Date::Parse!</ul>
-<ul>Actually the module supports only the "get <> next" function of the CALENDAR-Modul.</ul>
+<ul>Please configure the attribut HideOlderThen in your CALENDAR-Device, that controls if old events from past are shown!</ul>
 <b>Define</b>
 <ul><code>define &lt;Name&gt; CALVIEW &lt;calendarname(s) separate with ','&gt; &lt;next&gt; &lt;updateintervall in sec (default 43200)&gt;</code></ul>
 <ul><code>define myView CALVIEW Googlecalendar next</code></ul>
@@ -457,7 +461,7 @@ sub CALVIEW_Notify($$)
 <a name="CALVIEW"></a>
 <h3>CALVIEW</h3>
 <ul>Dieses Modul erstellt ein Device welches als Readings Termine eines oder mehrere Kalender(s), basierend auf dem 57_Calendar.pm Modul, besitzt. Ihr müsst das Perl-Modul Date::Parse installieren!</ul>
-<ul>Aktuell wird nur die "get <> next" Funktion vom CALENDAR untertstützt.</ul>
+<ul>Bitte setzt das Attribut HideOlderThen in eurem CALENDAR_Device, da sonst auch vergangene Termine gezeigt werden.</ul>
 <b>Define</b>
 <ul><code>define &lt;Name&gt; CALVIEW &lt;Kalendername(n) getrennt durch ','&gt; &lt;next&gt; &lt;updateintervall in sek (default 43200)&gt;</code></ul>
 <ul><code>define myView CALVIEW Googlekalender next</code></ul>

+ 14 - 6
fhem/core/FHEM/70_ZoneMinder.pm

@@ -25,7 +25,7 @@
 #
 # Discussed in FHEM Forum: https://forum.fhem.de/index.php/topic,91847.0.html
 #
-# $Id: 70_ZoneMinder.pm 17549 2018-10-17 02:55:08Z delmar $
+# $Id: 70_ZoneMinder.pm 17594 2018-10-22 16:40:45Z delmar $
 #
 ##############################################################################
 
@@ -53,7 +53,7 @@ sub ZoneMinder_Initialize {
   $hash->{WriteFn}   = "ZoneMinder_Write";
   $hash->{ReadyFn}   = "ZoneMinder_Ready";
 
-  $hash->{AttrList} = "interval publicAddress webConsoleContext " . $readingFnAttributes;
+  $hash->{AttrList} = "loginInterval publicAddress webConsoleContext " . $readingFnAttributes;
   $hash->{MatchList} = { "1:ZM_Monitor" => "^.*" };
 
   Log3 '', 3, "ZoneMinder - Initialize done ...";
@@ -182,6 +182,7 @@ sub ZoneMinder_API_Login_Callback {
   my $name = $hash->{NAME};
 
   $hash->{APILoginStatus} = $param->{code};
+  Log3 $name, 3, "ZoneMinder ($name) - login status: $hash->{APILoginStatus}";
 
   if($err ne "") {
     Log3 $name, 0, "error while requesting ".$param->{url}." - $err";
@@ -205,7 +206,9 @@ sub ZoneMinder_API_Login_Callback {
     }
   }
 
-  InternalTimer(gettimeofday() + 3600, "ZoneMinder_API_Login", $hash);
+  RemoveInternalTimer($hash, "ZoneMinder_API_Login");
+  my $interval = AttrVal($name, 'loginInterval', 3600);
+  InternalTimer(gettimeofday() + $interval, "ZoneMinder_API_Login", $hash);
   
   return undef;
 }
@@ -624,11 +627,16 @@ sub ZoneMinder_Get {
 }
 
 sub ZoneMinder_Set {
-  my ( $hash, $param ) = @_;
+  my ( $hash, $name, $opt, $args ) = @_;
+
+  if ("login" eq $opt) {
+    Log3 $name, 1, "ZoneMinder ($name) - Manually triggered Login";
+    ZoneMinder_API_Login($hash);
+    return undef;
+  }
 
-  my $name = $hash->{NAME};
 #  Log3 $name, 3, "ZoneMinder ($name) - Set done ...";
-  return undef;
+  return "Unknown argument $opt, choose one of login";
 }
 
 sub ZoneMinder_Ready {

+ 2 - 31
fhem/core/FHEM/73_GardenaSmartBridge.pm

@@ -28,7 +28,7 @@
 #  GNU General Public License for more details.
 #
 #
-# $Id: 73_GardenaSmartBridge.pm 17536 2018-10-15 12:57:08Z CoolTux $
+# $Id: 73_GardenaSmartBridge.pm 17555 2018-10-17 20:06:58Z CoolTux $
 #
 ###############################################################################
 ##
@@ -60,26 +60,6 @@ use warnings;
 
 my $version = "1.4.0";
 
-# # Declare functions
-# sub Attr(@);
-# sub Define($$);
-# sub Initialize($);
-# sub Set($@);
-# sub Write($@);
-# sub Undef($$);
-# sub Delete($$);
-# sub ResponseProcessing($$);
-# sub ErrorHandling($$$);
-# sub WriteReadings($$);
-# sub ParseJSON($$);
-# sub getDevices($);
-# sub getToken($);
-# sub createHttpValueStrings($@);
-# sub Notify($$);
-# sub StorePassword($$);
-# sub ReadPassword($);
-# sub DeletePassword($);
-# sub Rename(@);
 
 sub GardenaSmartBridge_Initialize($) {
 
@@ -166,7 +146,7 @@ sub Define($$) {
     my @a = split( "[ \t][ \t]*", $def );
 
     return "too few parameters: define <NAME> GardenaSmartBridge"
-      if ( @a < 2 or @a > 4 );
+      if ( @a != 2 );
     return
 "Cannot define Gardena Bridge device. Perl modul ${missingModul}is missing."
       if ($missingModul);
@@ -181,9 +161,6 @@ sub Define($$) {
     CommandAttr( undef, $name . ' room GardenaSmart' )
       if ( AttrVal( $name, 'room', 'none' ) eq 'none' );
 
-    CommandDefMod( undef, $name . ' ' . $hash->{TYPE} )
-      if ( @a > 2 );    # fix new define
-
     readingsSingleUpdate( $hash, 'token', 'none',        1 );
     readingsSingleUpdate( $hash, 'state', 'initialized', 1 );
 
@@ -277,8 +254,6 @@ sub Notify($$) {
     my $events  = deviceEvents( $dev, 1 );
     return if ( !$events );
 
-#Log3 $name, 1, "GardenaSmartBridge ($name) - Im Notify: DEVTYPE: $devtype, DEVNAME: $devname EVENT: @{$events}";
-
     getToken($hash)
       if (
         (
@@ -338,8 +313,6 @@ sub Set($@) {
 
     my ( $hash, $name, $cmd, @args ) = @_;
 
-    #my ($arg, @params) = @args;
-
     if ( lc $cmd eq 'getdevicesstate' ) {
         getDevices($hash);
 
@@ -408,7 +381,6 @@ sub Write($@) {
         }
     );
 
-#Log3 $name, 4, "GardenaSmartBridge ($name) - Send with URL: $hash->{URL}$uri, HEADER: $header, DATA: $payload, METHOD: $method";
     Log3 $name, 4,
 "GardenaSmartBridge ($name) - Send with URL: $hash->{URL}$uri, HEADER: secret!, DATA: secret!, METHOD: $method";
 }
@@ -1025,7 +997,6 @@ sub DeletePassword($) {
 
     my $hash = shift;
 
-    #my $index = $hash->{TYPE}."_".$hash->{NAME}."_passwd";
     setKeyValue( $hash->{TYPE} . "_" . $hash->{NAME} . "_passwd", undef );
 
     return undef;

+ 3 - 19
fhem/core/FHEM/74_GardenaSmartDevice.pm

@@ -28,7 +28,7 @@
 #  GNU General Public License for more details.
 #
 #
-# $Id: 74_GardenaSmartDevice.pm 17536 2018-10-15 12:57:08Z CoolTux $
+# $Id: 74_GardenaSmartDevice.pm 17555 2018-10-17 20:06:58Z CoolTux $
 #
 ###############################################################################
 ##
@@ -58,19 +58,6 @@ package main;
 use strict;
 use warnings;
 
-# # Declare functions
-# sub GardenaSmartDevice_Attr(@);
-# sub GardenaSmartDevice_Define($$);
-# sub GardenaSmartDevice_Initialize($);
-# sub GardenaSmartDevice_Set($@);
-# sub GardenaSmartDevice_Undef($$);
-# sub GardenaSmartDevice_WriteReadings($$);
-# sub GardenaSmartDevice_Parse($$);
-# sub GardenaSmartDevice_ReadingLangGerman($$);
-# sub GardenaSmartDevice_RigRadingsValue($$);
-# sub GardenaSmartDevice_Zulu2LocalString($);
-# sub GardenaSmartDevice_SetPredefinedStartPoints($@);
-
 my $version = "1.4.0";
 
 sub GardenaSmartDevice_Initialize($) {
@@ -129,7 +116,8 @@ BEGIN {
           AssignIoPort
           modules
           IOWrite
-          defs)
+          defs
+          makeDeviceName)
     );
 }
 
@@ -179,11 +167,9 @@ sub Define($$) {
         and $d->{IODev} == $hash->{IODev}
         and $d->{NAME} ne $name );
 
-#$attr{$name}{room}          = "GardenaSmart"    if( not defined( $attr{$name}{room} ) );
     CommandAttr( undef, $name . ' room GardenaSmart' )
       if ( AttrVal( $name, 'room', 'none' ) eq 'none' );
 
-#$attr{$name}{model}         = $category         if( not defined( $attr{$name}{model} ) );
     CommandAttr( undef, $name . ' model ' . $category )
       if ( AttrVal( $name, 'model', 'none' ) eq 'none' );
 
@@ -219,8 +205,6 @@ sub Set($@) {
 
     my ( $hash, $name, $cmd, @args ) = @_;
 
-    #my ($arg, @params) = @args;
-
     my $payload;
     my $abilities = '';
 

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 788 - 587
fhem/core/FHEM/74_XiaomiBTLESens.pm


+ 62 - 24
fhem/core/FHEM/89_FULLY.pm

@@ -1,8 +1,8 @@
 ##############################################################################
 #
-#  89_FULLY.pm 0.8
+#  89_FULLY.pm 0.9
 #
-#  $Id: 89_FULLY.pm 17221 2018-08-28 06:16:32Z zap $
+#  $Id: 89_FULLY.pm 17568 2018-10-19 08:40:24Z zap $
 #
 #  Control Fully browser on Android tablets from FHEM.
 #  Requires Fully Plus license!
@@ -35,9 +35,10 @@ sub FULLY_Abort ($);
 sub FULLY_UpdateReadings ($$);
 sub FULLY_Ping ($$);
 
-my $FULLY_VERSION = "0.8";
+my $FULLY_VERSION = "0.9";
 my $FULLY_TIMEOUT = 4;
 my $FULLY_POLL_INTERVAL = 3600;
+my $FULLY_REQUIRED_VERSION = 1.27;
 
 my $FULLY_FHEM_COMMAND = qq(
 function SendRequest(FHEM_Address, Devicename, Command) {
@@ -93,15 +94,14 @@ sub FULLY_Define ($$)
 	$hash->{host} = $$a[2];
 	$hash->{version} = $FULLY_VERSION;
 	$hash->{onForTimer} = 'off';
-#	$hash->{remoteAdmin} = '<html><a href="http://'.$hash->{host}.':2323">Remote Admin</a></html>';
 	$hash->{fully}{password} = $$a[3];
 	$hash->{fully}{schedule} = 0;
 
-	Log3 $name, 1, "FULLY: Version $FULLY_VERSION Opening device ".$hash->{host};
+	Log3 $name, 1, "FULLY: [$name] Version $FULLY_VERSION Opening device ".$hash->{host};
 	
 	my $result = FULLY_GetDeviceInfo ($name);
 	if (!FULLY_UpdateReadings ($hash, $result)) {
-		Log3 $name, 2, "FULLY: Update of device info failed";
+		Log3 $name, 2, "FULLY: [$name] Update of device info failed";
 	}
 
 	if (@$a == 5) {
@@ -130,7 +130,7 @@ sub FULLY_Attr ($@)
 			if ($attrval >= 10 && $attrval <= 86400) {
 				my $curval = AttrVal ($name, 'pollInterval', $FULLY_POLL_INTERVAL);
 				if ($attrval != $curval) {
-					Log3 $name, 2, "FULLY: Polling interval set to $attrval";
+					Log3 $name, 2, "FULLY: [$name] Polling interval set to $attrval";
 					RemoveInternalTimer ($hash);
 					$hash->{nextUpdate} = strftime "%d.%m.%Y %H:%M:%S", localtime (time+$attrval);
 					InternalTimer (gettimeofday()+$attrval, "FULLY_UpdateDeviceInfo", $hash, 0);
@@ -218,17 +218,21 @@ sub FULLY_Set ($@)
 	my ($hash, $a, $h) = @_;
 	my $name = shift @$a;
 	my $opt = shift @$a;
-	my $options = "brightness clearCache:noArg exit:noArg lock:noArg motionDetection:on,off ".
-		"off:noArg on:noArg on-for-timer restart:noArg screenOffTimer screenSaver:start,stop ".
-		"screenSaverTimer screenSaverURL speak startURL unlock:noArg url";
+	my $options = "brightness photo:noArg clearCache:noArg exit:noArg lock:noArg motionDetection:on,off ".
+		"off:noArg on:noArg on-for-timer playSound restart:noArg screenOffTimer screenSaver:start,stop ".
+		"screenSaverTimer screenSaverURL speak startURL stopSound:noArg unlock:noArg url ".
+		"volume";
 	my $response;
 	
 	# Fully commands without argument
 	my %cmds = (
 		"clearCache" => "clearCache",
-		"exit" => "exitApp", "restart" => "restartApp",
+		"photo" => "getCamshot",
+		"exit" => "exitApp",
+		"restart" => "restartApp",
 		"on" => "screenOn", "off" => "screenOff",
-		"lock" => "enabledLockedMode", "unlock" => "disableLockedMode"
+		"lock" => "enabledLockedMode", "unlock" => "disableLockedMode",
+		"stopSound" => "stopSound"
 	);
 	
 	my $disable = AttrVal ($name, 'disable', 0);
@@ -329,6 +333,22 @@ sub FULLY_Set ($@)
 		my $enctext = urlEncode ($text);
 		$response = FULLY_Execute ($hash, "textToSpeech", { "text" => "$enctext" }, 1);
 	}
+	elsif ($opt eq 'playSound') {
+		my $url = shift @$a;
+		my $loop = shift @$a;
+		$loop = defined ($loop) ? 'true' : 'false';
+		return "Usage: set $name playSound {url} [loop]" if (!defined ($url));
+		$response = FULLY_Execute ($hash, "playSound",
+			{ "url" => "$url", "loop" => "$loop"}, 1);
+	}
+	elsif ($opt eq 'volume') {
+		my $level = shift @$a;
+		my $stream = shift @$a;
+		return "Usage: set $name volume {level} {stream}"
+			if (!defined ($stream) || $level !~ /^[0-9]+$/ || $stream !~ /^[0-9]+$/);
+		$response = FULLY_Execute ($hash, "setAudioVolume",
+			{ "level" => "$level", "stream" => "$stream"}, 1);
+	}
 	elsif ($opt eq 'url') {
 		my $url = shift @$a;
 		my $cmd = defined ($url) ? "loadURL" : "loadStartURL";
@@ -340,7 +360,7 @@ sub FULLY_Set ($@)
 	
 	my $result = FULLY_ProcessDeviceInfo ($name, $response);
 	if (!FULLY_UpdateReadings ($hash, $result)) {
-		Log3 $name, 2, "FULLY: Command failed";
+		Log3 $name, 2, "FULLY: [$name] Command failed";
 		return "FULLY: Command failed";
 	}
 	
@@ -365,11 +385,11 @@ sub FULLY_Get ($@)
 	if ($opt eq 'info') {
 		my $result = FULLY_Execute ($hash, 'deviceInfo', undef, 1);
 		if (!defined ($result) || $result eq '') {
-			Log3 $name, 2, "FULLY: Command failed";
+			Log3 $name, 2, "FULLY: [$name] Command failed";
 			return "FULLY: Command failed";
 		}
 		elsif ($response =~ /Wrong password/) {
-			Log3 $name, 2, "FULLY: Wrong password";
+			Log3 $name, 2, "FULLY: [$name] Wrong password";
 			return "FULLY: Wrong password";
 		}
 
@@ -386,7 +406,7 @@ sub FULLY_Get ($@)
 	elsif ($opt eq 'update') {
 		my $result = FULLY_GetDeviceInfo ($name);
 		if (!FULLY_UpdateReadings ($hash, $result)) {
-			Log3 $name, 2, "FULLY: Command failed";
+			Log3 $name, 2, "FULLY: [$name] Command failed";
 			return "FULLY: Command failed";
 		}
 	}
@@ -428,7 +448,7 @@ sub FULLY_Execute ($$$$)
 	my $i = 0;
 	while ($i <= $repeatCommand && (!defined ($response) || $response eq '')) {
 		$response = GetFileFromURL ("$url&password=".$hash->{fully}{password}, $timeout);
-		Log3 $name, 4, "FULLY: HTTP response empty" if (defined ($response) && $response eq '');
+		Log3 $name, 4, "FULLY: [$name] HTTP response empty" if (defined ($response) && $response eq '');
 		$i++;
 	}
 	
@@ -511,6 +531,10 @@ sub FULLY_ProcessDeviceInfo ($$)
 		elsif ($rn eq 'screen_status') {
 			$parameters .= "|state=$rv";
 		}
+		elsif ($rn eq 'fully_version') {
+			Log3 $name, 1, "FULLY: [$name] Version of fully browser is $rv. Version $FULLY_REQUIRED_VERSION is required."
+				if ($rv < $FULLY_REQUIRED_VERSION);
+		}
 		$parameters .= "|$rn=$rv";
 	}
 	
@@ -535,10 +559,10 @@ sub FULLY_GotDeviceInfo ($)
 	
 	my $rc = FULLY_UpdateReadings ($hash, $string);
 	if (!$rc) {
-		Log3 $name, 2, "FULLY: Request timed out";
+		Log3 $name, 2, "FULLY: [$name] Request timed out";
 		if ($hash->{fully}{schedule} == 0) {
 			$hash->{fully}{schedule} += 1;
-			Log3 $name, 2, "FULLY: Rescheduling in $timeout seconds.";
+			Log3 $name, 2, "FULLY: [$name] Rescheduling in $timeout seconds.";
 			$pollInterval = $timeout;
 		}
 		else {
@@ -565,10 +589,10 @@ sub FULLY_Abort ($)
 
 	delete $hash->{fully}{bc} if (exists ($hash->{fully}{bc}));		
 
-	Log3 $name, 2, "FULLY: request timed out";
+	Log3 $name, 2, "FULLY: [$name] request timed out";
 	if ($hash->{fully}{schedule} == 0) {
 		$hash->{fully}{schedule} += 1;
-		Log3 $name, 2, "FULLY: Rescheduling in $timeout seconds.";
+		Log3 $name, 2, "FULLY: [$name] Rescheduling in $timeout seconds.";
 		$pollInterval = $timeout;
 	}
 	else {
@@ -591,13 +615,13 @@ sub FULLY_UpdateReadings ($$)
 	my $rc = 1;
 
 	if (!defined ($result) || $result eq '') {
-		Log3 $name, 2, "FULLY: empty response";
+		Log3 $name, 2, "FULLY: [$name] empty response";
 		return 0;
 	}
 	
 	my @parameters = split ('\|', $result);
 	if (scalar (@parameters) == 0) {
-		Log3 $name, 2, "FULLY: empty response";
+		Log3 $name, 2, "FULLY: [$name] empty response";
 		return 0;
 	}
 	
@@ -642,7 +666,7 @@ sub FULLY_Ping ($$)
 		$temp = qx(ping -c $count $host 2>&1);
 	}
 	
-	Log3 $name, 4, "FULLY: Ping response = $temp" if (defined ($temp));
+	Log3 $name, 4, "FULLY: [$name] Ping response = $temp" if (defined ($temp));
 	
 	sleep (1);
 	
@@ -696,6 +720,13 @@ sub FULLY_Ping ($$)
 		<li><b>set &lt;name&gt; on-for-timer [{ &lt;Seconds&gt; | <u>forever</u> | off }]</b><br/>
 			Set timer for display. Default is forever.
 		</li><br/>
+		<li><b>set &lt;name&gt; photo</b><br/>
+			Take a picture with device cam. Setting motion detection must be enabled. Picture
+			can be viewed in remote admin interface under device info.
+		</li><br/>
+		<li><b>set &lt;name&gt; playSound &lt;url&gt; [loop]</b><br/>
+			Play sound from URL.
+		</li><br/>
 		<li><b>set &lt;name&gt; restart</b><br/>
 			Restart Fully.
 		</li><br/>
@@ -718,9 +749,16 @@ sub FULLY_Ping ($$)
 		<li><b>set &lt;name&gt; startURL &lt;URL&gt;</b><br/>
 			Show this URL when FULLY starts.<br/>
 		</li><br/>
+		<li><b>set &lt;name&gt; stopSound</b><br/>
+			Stop playback of sound if playback has been started with option <i>loop</i>.
+		</li><br/>
 		<li><b>set &lt;name&gt; url [&lt;URL&gt;]</b><br/>
 			Navigate to <i>URL</i>. If no URL is specified navigate to start URL.
 		</li><br/>
+		<li><b>set &lt;name&gt; volume &lt;level&gt; &lt;stream&gt;</b><br/>
+			Set audio volume. Range of parameter <i>level</i> is 0-100, range of parameter
+			<i>stream</i> is 1-10. 
+		</li><br/>
    </ul>
    <br/>
    

+ 13 - 6
fhem/core/FHEM/90_at.pm

@@ -1,5 +1,5 @@
 ##############################################
-# $Id: 90_at.pm 17507 2018-10-11 11:47:46Z rudolfkoenig $
+# $Id: 90_at.pm 17561 2018-10-18 14:45:30Z rudolfkoenig $
 package main;
 
 use strict;
@@ -555,12 +555,15 @@ EOF
         but the next time will be computed.</li><br>
 
     <a name="disabledForIntervals"></a>
-    <li>disabledForIntervals HH:MM-HH:MM HH:MM-HH-MM...<br>
+    <li>disabledForIntervals HH:MM-HH:MM HH:MM-HH:MM ...<br>
         Space separated list of HH:MM or D@HH:MM tupels. If the current time is
         between the two time specifications, the current device is disabled.
         Instead of HH:MM you can also specify HH or HH:MM:SS. D is the day of
-        the week, with 0 indicating Sunday and 3 indicating Wednesday. To
-        specify an interval spawning midnight, you have to specify two
+        the week, with 0 indicating Sunday and 3 indicating Wednesday.
+        Specifying the day for the "from" part does _not_ specify it for the
+        "to" part, i.e.  1@00-24 will disable from monday to the end of the
+        week, but not on sunday (as 1@00 is greater than any time on sunday).
+        To specify an interval spawning midnight, you have to specify two
         intervals, e.g.:
         <ul>
           23:00-24:00 00:00-01:00
@@ -745,13 +748,17 @@ EOF
         Ausf&uuml;hrungszeit berechnet.</li><br>
 
     <a name="disabledForIntervals"></a>
-    <li>disabledForIntervals HH:MM-HH:MM HH:MM-HH-MM...<br>
+    <li>disabledForIntervals HH:MM-HH:MM HH:MM-HH:MM ...<br>
         Das Argument ist eine Leerzeichengetrennte Liste von Minuszeichen-
         getrennten HH:MM oder D@HH:MM Paaren. Falls die aktuelle Uhrzeit
         zwischen diesen Werten f&auml;llt, dann wird die Ausf&uuml;hrung, wie
         beim disable, ausgesetzt. Statt HH:MM kann man auch HH oder HH:MM:SS
         angeben.  D ist der Tag der Woche, mit 0 als Sonntag and 3 als
-        Mittwoch.  Um einen Intervall um Mitternacht zu spezifizieren, muss man
+        Mittwoch. Die Angabe des Wochentags f&uuml;r den "von" Wert impliziert
+        _nicht_ den gleichen Tag f&uuml;r den "bis" Wert, z.Bsp.  deaktiviert
+        1@00-24 die Asf&uuml;hrung von Montag bis Ende der Woche, aber nicht
+        Sonntag (da alle Zeitangaben am Montag vor 1@00 liegen).
+        Um einen Intervall um Mitternacht zu spezifizieren, muss man
         zwei einzelne angeben, z.Bsp.:
         <ul>
           23:00-24:00 00:00-01:00

+ 4 - 3
fhem/core/FHEM/93_DbLog.pm

@@ -1,5 +1,5 @@
 ############################################################################################################################################
-# $Id: 93_DbLog.pm 17545 2018-10-16 13:46:11Z DS_Starter $
+# $Id: 93_DbLog.pm 17599 2018-10-22 19:25:46Z DS_Starter $
 #
 # 93_DbLog.pm
 # written by Dr. Boris Neubert 2007-12-30
@@ -16,6 +16,7 @@
 ############################################################################################################################################
 #  Versions History done by DS_Starter & DeeSPe:
 #
+# 3.12.6     22.10.2018       fix timer not deleted if reopen after reopen xxx (Forum: https://forum.fhem.de/index.php/topic,91869.msg848433.html#msg848433)
 # 3.12.5     12.10.2018       charFilter: "\xB0C" substitution by "°C" added and usage in DbLog_Log changed
 # 3.12.4     10.10.2018       return non-saved datasets back in asynch mode only if transaction is used
 # 3.12.3     08.10.2018       Log output of recuceLogNbl enhanced, some functions renamed
@@ -214,7 +215,7 @@ use Time::Local;
 use Encode qw(encode_utf8);
 no if $] >= 5.017011, warnings => 'experimental::smartmatch'; 
 
-my $DbLogVersion = "3.12.5";
+my $DbLogVersion = "3.12.6";
 
 my %columns = ("DEVICE"  => 64,
                "TYPE"    => 64,
@@ -593,7 +594,7 @@ sub DbLog_Set($@) {
             if($hash->{HELPER}{REOPEN_RUNS}) {
 			    delete $hash->{HELPER}{REOPEN_RUNS};
                 delete $hash->{HELPER}{REOPEN_RUNS_UNTIL};
-                RemoveInternalTimer($hash, "reopen");
+                RemoveInternalTimer($hash, "DbLog_reopen");
             }
 			DbLog_execmemcache($hash) if($async);
             $ret = "Reopen executed.";

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 894 - 330
fhem/core/FHEM/93_DbRep.pm


+ 17 - 18
fhem/core/FHEM/98_DOIF.pm

@@ -1,5 +1,5 @@
 #############################################
-# $Id: 98_DOIF.pm 17530 2018-10-14 16:10:58Z Damian $
+# $Id: 98_DOIF.pm 17557 2018-10-17 21:06:30Z Damian $
 #
 # This file is part of fhem.
 #
@@ -5144,8 +5144,8 @@ Da man beliebige Perl-Ausdrücke verwenden kann, lässt sich z. B. der Mittelwer
 <br>
 <a name="DOIF_Readings"></a>
 Mit Hilfe des Attributes DOIF_Readings können eigene Readings innerhalb des DOIF definiert werden, auf die man im selben DOIF-Moduls zugreifen kann.
-Die Nutzung ist insbesondere dann sinnvoll, wenn mehrfach die gleichen Berechnungen innerhalb eines DOIF-Modus vorgenommen werden sollen.
-DOIF_Readings-Berechnungen funktionieren ressourcenschonend ohne Erzeugung FHEM-Events nach außen. Änderungen dieser Readings triggern allerdings das eigene DOIF-Modul, wenn sich deren Inhalt ändert.<br>
+Die Nutzung ist insbesondere dann sinnvoll, wenn zyklisch sendende Sensoren, im Perl-Modus oder mit dem Attribut do always, abgefragt werden.
+DOIF_Readings-Berechnungen funktionieren ressourcenschonend ohne Erzeugung FHEM-Events nach außen. Änderungen dieser Readings triggern allerdings das eigene DOIF-Modul, allerdings nur, wenn sich deren Inhalt ändert.<br>
 <br>
 Syntax<br>
 <br>
@@ -5153,25 +5153,22 @@ Syntax<br>
 <br>
 <code>&lt;definition&gt;</code>: Beliebiger Perlausdruck ergänzt um DOIF-Syntax in eckigen Klammern. Angaben in eckigen Klammern wirken triggernd und aktualisieren das definierte Reading.<br>
 <br>
+Beispiel<br>
+<br>
+<a href="#DOIF_Perl_Modus"><b>Perl-Modus</b>:</a><br>
+<code>define heating DOIF {if ([switch] eq "on" and [$SELF:frost]) {fhem_set"heating on"} else {fhem_set"heating off"}}<br>
+attr heating DOIF_Readings frost:([outdoor:temperature] < 0)</code><br>
+<br>
+Das Reading frost triggert nur dann die definierte Abfrage, wenn sich sein Zustand ändert. Dadurch wird sichergestellt, dass ein wiederholtes Schalten der Heizung vermieden wird, obwohl der Sensor outdoor zyklisch sendet.<br>
+<br>
 Beispiel: Push-Mitteilung über die durchschnittliche Temperatur aller Zimmer<br>
 <br>
 <code>define di_temp DOIF ([$SELF:temperature]&gt;20) (push "Die Durchschnittstemperatur ist höher als 20 Grad, sie beträgt [$SELF:temperature]")<br>
-DOELSE<br>
 <br>
 attr di_temp DOIF_Readings temperature:[#average:d2:":temperature":temperature]<br></code>
 <br>
 Hierbei wird der aufwändig berechnete Durchschnittswert nur einmal berechnet, statt zwei mal, wenn man die Aggregationsfunktion direkt in der Bedingung und im Ausführungsteil angeben würde.<br>
 <br>
-Mit DOIF_Readings ist es ebenfalls möglich eine Wiederholung des Schaltens eines DOIF-Moduls mit do always zu provozieren und gleichzeitig zyklisch sendende Sensoren abzufragen.<br>
-<br>
-Beispiel<br>
-<br>
-<code>define heating DOIF ([switch] eq "on" and [$SELF:frost] eq "on") (set heating on) DOELSE (set heating off)<br>
-attr heating do always<br>
-attr heating DOIF_Readings frost:([outdoor:temperature] < 0 ? "on" : "off")</code><br>
-<br>
-Das Attribut do always ist in diesem Beispiel unkritisch, obwohl Temperatur zyklisch gesendet wird, da das Reading "frost" nur dann die Bedingung triggert, wenn sich dessen Inhalt ändert<br>
-<br>
 <a name="DOIF_initialize"></a>
 <b>Vorbelegung des Status mit Initialisierung nach dem Neustart</b>&nbsp;&nbsp;&nbsp;<a href="#DOIF_Inhaltsuebersicht">back</a><br>
 <br>
@@ -5730,16 +5727,17 @@ Der Benutzer kann mit der Funktion <code>set_Exec</code> beliebig viele eigene T
 <br>
 Definitionen im FHEM-Modus mit do-Attribut der Form:<br>
 <br>
-&nbsp;&nbsp;<code>DOIF (&lt;Bedingung mit Trigger&gt;) (&lt;FHEM-Befehle&gt;) DOELSE (&lt;FHEM-Befehle&gt;)</code><br>
+<ol><code>DOIF (&lt;Bedingung mit Trigger&gt;) (&lt;FHEM-Befehle&gt;) DOELSE (&lt;FHEM-Befehle&gt;)</code><br></ol>
 <br>
 lassen sich wie folgt in Perl-Modus übertragen:<br>
 <br>
-&nbsp;&nbsp;<code>DOIF {if (&lt;Bedingung mit Trigger&gt;) {fhem"&lt;FHEM-Befehle&gt;"} else {fhem"&lt;FHEM-Befehle&gt;"}}</code><br>
+<ol><code>DOIF {if (&lt;Bedingung mit Trigger&gt;) {fhem"&lt;FHEM-Befehle&gt;"} else {fhem"&lt;FHEM-Befehle&gt;"}}</code><br></ol>
 <br>
 Die Bedingungen des FHEM-Modus können ohne Änderungen in Perl-Modus übernommen werden.<br>
 <br>
 <a name="DOIF_Einfache_Anwendungsbeispiele_Perl"></a>
-<u>Einfache Anwendungsbeispiele (vgl. <a href="#DOIF_Einfache_Anwendungsbeispiele">Anwendungsbeispiele im FHEM-Modus</a>):</u><ol>
+<u>Einfache Anwendungsbeispiele (vgl. <a href="#DOIF_Einfache_Anwendungsbeispiele">Anwendungsbeispiele im FHEM-Modus</a>):</u>
+<ol>
 <br>
 <code>define di_rc_tv DOIF {if ([remotecontol:"on"]) {fhem_set"tv on"} else {fhem_set"tv off"}}</code><br>
 <br>
@@ -5748,7 +5746,8 @@ Die Bedingungen des FHEM-Modus können ohne Änderungen in Perl-Modus übernomme
 <code>define di_lamp DOIF {if ([06:00-09:00] and [sensor:brightness] < 40) {fhem_set"lamp:FILTER=STATE!=on on"} else {fhem_set"lamp:FILTER=STATE!=off off"}}</code><br>
 <br>
 </ol>
-Bemerkung: Im Gegensatz zum FHEM-Modus arbeitet der Perl-Modus ohne Auswertung des eigenen Status (Zustandsauswertung), daher muss der Anwender selbst darauf achten, wiederholende Ausführungen zu vermeiden (im oberen Beispiel z.B. mit FILTER-Option)<br>
+Bemerkung: Im Gegensatz zum FHEM-Modus arbeitet der Perl-Modus ohne Auswertung des eigenen Status (Zustandsauswertung),
+daher muss der Anwender selbst darauf achten, wiederholende Ausführungen zu vermeiden (im oberen Beispiel z.B. mit FILTER-Option). Elegant lässt sich das Problem der wiederholenden Ausführung bei zyklisch sendenden Sensoren mit Hilfe des Attributes <a href="#DOIF_DOIF_Readings">DOIF_Readings</a> lösen.<br>
 <br>
 Es können beliebig viele Ereignisblöcke definiert werden, die unabhängig von einander durch einen oder mehrere Trigger ausgewertet und zur Ausführung führen können:<br>
 <br>

+ 229 - 39
fhem/core/FHEM/98_GEOFANCY.pm

@@ -1,10 +1,11 @@
 ###############################################################################
-# $Id: 98_GEOFANCY.pm 14110 2017-04-26 06:54:58Z loredo $
+# $Id: 98_GEOFANCY.pm 17593 2018-10-22 15:35:04Z loredo $
 package main;
 use strict;
 use warnings;
 use Data::Dumper;
 use Time::Local;
+use UConv;
 
 use HttpUtils;
 
@@ -98,20 +99,32 @@ sub GEOFANCY_CGI() {
     my ($request) = @_;
 
     my $hash;
-    my $name        = "";
-    my $link        = "";
-    my $URI         = "";
-    my $device      = "";
-    my $deviceAlias = "-";
-    my $id          = "";
-    my $lat         = "";
-    my $long        = "";
-    my $address     = "-";
-    my $entry       = "";
-    my $msg         = "";
-    my $date        = "";
-    my $time        = "";
-    my $locName     = "";
+    my $name          = "";
+    my $link          = "";
+    my $URI           = "";
+    my $device        = "";
+    my $deviceAlias   = "-";
+    my $id            = "";
+    my $lat           = "";
+    my $long          = "";
+    my $posLat        = "";
+    my $posLong       = "";
+    my $posBeaconUUID = "";
+    my $posTravDist   = "";
+    my $address       = "-";
+    my $posAddress    = "-";
+    my $entry         = "";
+    my $msg           = "";
+    my $date          = "";
+    my $time          = "";
+    my $locName       = "";
+    my $radius        = 0;
+    my $posDistLoc    = "";
+    my $posDistHome   = "";
+    my $locTravDist   = "";
+    my $motion        = "";
+    my $wifiSSID      = "";
+    my $wifiBSSID     = "";
 
     # data received
     if ( $request =~ m,^(\/[^/]+?)(?:\&|\?|\/\?|\/)(.*)?$, ) {
@@ -258,6 +271,34 @@ m/(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5
                 || $webArgs->{longitude} > 180 )
           );
 
+        # validate posLAT
+        return (
+            "text/plain; charset=utf-8",
+            "NOK Specified latitude '"
+              . $webArgs->{currentLatitude}
+              . "' has unexpected format"
+          )
+          if (
+            defined $webArgs->{currentLatitude}
+            && (   $webArgs->{currentLatitude} !~ m/^-?\d+(\.\d+)?$/
+                || $webArgs->{currentLatitude} < -90
+                || $webArgs->{currentLatitude} > 90 )
+          );
+
+        # validate posLONG
+        return (
+            "text/plain; charset=utf-8",
+            "NOK Specified longitude '"
+              . $webArgs->{currentLongitude}
+              . "' has unexpected format"
+          )
+          if (
+            defined $webArgs->{currentLongitude}
+            && (   $webArgs->{currentLongitude} !~ m/^-?\d+(\.\d+)?$/
+                || $webArgs->{currentLongitude} < -180
+                || $webArgs->{currentLongitude} > 180 )
+          );
+
         # validate device
         return ( "text/plain; charset=utf-8",
             "NOK Expected value for 'device' cannot be empty" )
@@ -270,14 +311,28 @@ m/(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5
           if ( defined( $webArgs->{device} )
             && $webArgs->{device} =~ m/(?:\s)/ );
 
+        # validate motion
+        if ( defined( $webArgs->{motion} ) ) {
+            my @motions = (
+                "unknown",    "stationary", "walking", "running",
+                "automotive", "cycling"
+            );
+            my $motionLc = lc( $webArgs->{motion} );
+            return ( "text/plain; charset=utf-8",
+                "NOK Unknown motion type '" . $webArgs->{motion} . "'" )
+              if ( !grep( /^$motionLc$/, @motions ) );
+        }
+
         # Locative.app
         if ( defined $webArgs->{trigger} ) {
             Log3 $name, 5, "GEOFANCY $name: detected data format: Locative.app";
-            $id     = $webArgs->{id};
-            $entry  = $webArgs->{trigger};
-            $lat    = $webArgs->{latitude};
-            $long   = $webArgs->{longitude};
-            $device = $webArgs->{device};
+            $id      = $webArgs->{id};
+            $entry   = $webArgs->{trigger};
+            $lat     = $webArgs->{latitude};
+            $long    = $webArgs->{longitude};
+            $device  = $webArgs->{device};
+            $posLat  = $lat;
+            $posLong = $long;
 
             if ( defined( $webArgs->{timestamp} ) ) {
                 my ( $sec, $min, $hour, $d, $m, $y ) =
@@ -295,9 +350,36 @@ m/(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5
             $date    = GEOFANCY_ISO8601UTCtoLocal( $webArgs->{date} );
             $lat     = $webArgs->{latitude};
             $long    = $webArgs->{longitude};
+            $radius  = $webArgs->{radius}
+              if ( defined( $webArgs->{radius} ) );
             $address = $webArgs->{address}
               if ( defined( $webArgs->{address} ) );
             $device = $webArgs->{device};
+            $motion = $webArgs->{motion}
+              if ( defined( $webArgs->{motion} ) );
+            $wifiSSID = $webArgs->{wifiSSID}
+              if ( defined( $webArgs->{wifiSSID} ) );
+            $wifiBSSID = $webArgs->{wifiBSSID}
+              if ( defined( $webArgs->{wifiBSSID} ) );
+            $posBeaconUUID = $webArgs->{beaconUUID}
+              if ( defined( $webArgs->{beaconUUID} ) );
+
+            if (
+                   !defined( $webArgs->{currentLatitude} )
+                || !defined( $webArgs->{currentLongitude} )
+                || (   $webArgs->{currentLatitude} == 0
+                    && $webArgs->{currentLongitude} == 0 )
+              )
+            {
+                $posLat     = $webArgs->{latitude};
+                $posLong    = $webArgs->{longitude};
+                $posAddress = $address;
+            }
+            else {
+                $posLat     = $webArgs->{currentLatitude};
+                $posLong    = $webArgs->{currentLongitude};
+                $posAddress = $address if ( $posBeaconUUID ne "" );
+            }
         }
 
         # SMART Geofences.app
@@ -312,7 +394,10 @@ m/(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5
             $long    = $webArgs->{longitude};
             $address = $webArgs->{address}
               if ( defined( $webArgs->{address} ) );
-            $device = $webArgs->{device};
+            $device     = $webArgs->{device};
+            $posLat     = $lat;
+            $posLong    = $long;
+            $posAddress = $address;
         }
         else {
             return "fatal error";
@@ -406,15 +491,64 @@ m/(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5
     }
 
     $deviceAlias = $hash->{helper}{device_aliases}{$device}
-      if ( $hash->{helper}{device_aliases}{$device} && $matchingResident == 0 );
+      if ( $hash->{helper}{device_aliases}{$device}
+        && $matchingResident == 0 );
 
     Log3 $name, 4,
-"GEOFANCY $name: id=$id name=$locName trig=$entry date=$date lat=$lat long=$long address:$address dev=$device devAlias=$deviceAlias";
+"GEOFANCY $name: id=$id name=$locName trig=$entry date=$date lat=$lat long=$long posLat=$posLat posLong=$posLong address:$address dev=$device devAlias=$deviceAlias motion=$motion wifiSSID=$wifiSSID wifiBSSID=$wifiBSSID";
 
     Log3 $name, 3,
 "GEOFANCY $name: Unknown device UUID $device: Set attribute devAlias for $name or assign $device to any ROOMMATE or GUEST device using attribute r*_geofenceUUIDs"
       if ( $deviceAlias eq "-" );
 
+    # distance between home and position
+    my $homeLat  = AttrVal( "global", "latitude",  undef );
+    my $homeLong = AttrVal( "global", "longitude", undef );
+    if ( $homeLat && $homeLong ) {
+        if ( $posLat ne "" && $posLong ne "" ) {
+            $posDistHome =
+              UConv::distance( $posLat, $posLong, $homeLat, $homeLong, 2 );
+        }
+        elsif ( $lat ne "" && $long ne "" ) {
+            $posDistHome =
+              UConv::distance( $lat, $long, $homeLat, $homeLong, 2 );
+        }
+    }
+
+    # distance between location and position
+    if ( $lat ne "" && $long ne "" && $posLat ne "" && $posLong ne "" ) {
+        $posDistLoc = UConv::distance( $posLat, $posLong, $lat, $long, 2 );
+    }
+
+    # travelled distance for location
+    if ( $lat ne "" && $long ne "" ) {
+        my $locLatVal = ReadingsVal( $name, "currLocLat_" . $deviceAlias, "-" );
+        $locLatVal = ReadingsVal( $name, "lastLocLat_" . $deviceAlias, "-" )
+          if ( $locLatVal eq "-" );
+        my $locLongVal =
+          ReadingsVal( $name, "currLocLong_" . $deviceAlias, "-" );
+        $locLongVal = ReadingsVal( $name, "lastLocLong_" . $deviceAlias, "-" )
+          if ( $locLongVal eq "-" );
+
+        if ( $locLatVal ne "-" && $locLongVal ne "-" ) {
+            $locTravDist =
+              UConv::distance( $lat, $long, $locLatVal, $locLongVal, 2 );
+        }
+    }
+
+    # travelled distance for position
+    if ( $posLat ne "" && $posLong ne "" ) {
+        my $currPosLatVal =
+          ReadingsVal( $name, "currPosLat_" . $deviceAlias, "" );
+        my $currPosLongVal =
+          ReadingsVal( $name, "currPosLong_" . $deviceAlias, "" );
+
+        if ( $currPosLatVal ne "" && $currPosLongVal ne "" ) {
+            $posTravDist = UConv::distance( $posLat, $posLong, $currPosLatVal,
+                $currPosLongVal, 2 );
+        }
+    }
+
     readingsBeginUpdate($hash);
 
     # use date for readings
@@ -436,10 +570,7 @@ m/(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5
     readingsBulkUpdate( $hash, "lastDeviceUUID", $device );
     readingsBulkUpdate( $hash, "lastDevice",     $deviceAlias );
 
-    # update local device readings if
-    # - UUID was not assigned to any resident device
-    # - UUID has a defined devAlias
-    if ( $matchingResident == 0 && $deviceAlias ne "-" ) {
+    if ( $deviceAlias ne "-" ) {
 
         $id = $locName if ( defined($locName) && $locName ne "" );
 
@@ -452,6 +583,57 @@ m/(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5
             || lc($entry) eq "0"
             || lc($entry) eq "leaving" );
 
+        my $currReading;
+        my $lastReading;
+        my $currVal;
+
+        # backup last known position
+        $currReading = "currPosTime_" . $deviceAlias;
+        $currVal = ReadingsVal( $name, $currReading, undef );
+        readingsBulkUpdate( $hash, "lastPosArr_" . $deviceAlias, $currVal );
+        if ($currVal) {
+            readingsBulkUpdate( $hash, "lastPosDep_" . $deviceAlias, $time );
+            readingsBulkUpdate(
+                $hash,
+                "lastPosDur_" . $deviceAlias,
+                UConv::duration( $time, $currVal, "sec" )
+            );
+
+        }
+
+        foreach (
+            'PosSSID',    'PosBSSID',    'PosMotion',     'PosLat',
+            'PosLong',    'PosAddr',     'PosBeaconUUID', 'PosDistHome',
+            'PosDistLoc', 'PosTravDist', 'LocTravDist',   'LocRadius'
+          )
+        {
+            $currReading = "curr" . $_ . "_" . $deviceAlias;
+            $lastReading = "last" . $_ . "_" . $deviceAlias;
+            $currVal     = ReadingsVal( $name, $currReading, undef );
+            readingsBulkUpdate( $hash, $lastReading, $currVal )
+              if ( defined($currVal) );
+        }
+
+        readingsBulkUpdate( $hash, "currPosSSID_" . $deviceAlias,  $wifiSSID );
+        readingsBulkUpdate( $hash, "currPosBSSID_" . $deviceAlias, $wifiBSSID );
+        readingsBulkUpdate( $hash, "currPosMotion_" . $deviceAlias, $motion );
+        readingsBulkUpdate( $hash, "currPosBeaconUUID_" . $deviceAlias,
+            $posBeaconUUID );
+        readingsBulkUpdate( $hash, "currPosLat_" . $deviceAlias,  $posLat );
+        readingsBulkUpdate( $hash, "currPosLong_" . $deviceAlias, $posLong );
+        readingsBulkUpdate( $hash, "currPosAddr_" . $deviceAlias, $posAddress );
+        readingsBulkUpdate( $hash, "currPosTime_" . $deviceAlias, $time );
+        readingsBulkUpdate( $hash, "currPosDistHome_" . $deviceAlias,
+            $posDistHome );
+        readingsBulkUpdate( $hash, "currPosDistLoc_" . $deviceAlias,
+            $posDistLoc );
+        readingsBulkUpdate( $hash, "currLocTravDist_" . $deviceAlias,
+            $locTravDist );
+        readingsBulkUpdate( $hash, "currPosTravDist_" . $deviceAlias,
+            $posTravDist );
+
+        readingsBulkUpdate( $hash, "currLocRadius_" . $deviceAlias, $radius );
+
         if (   lc($entry) eq "enter"
             || lc($entry) eq "1"
             || lc($entry) eq "entered"
@@ -470,26 +652,31 @@ m/(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5
             || lc($entry) eq "0"
             || lc($entry) eq "leaving" )
         {
-            my $currReading;
-            my $lastReading;
-
             Log3 $name, 4,
               "GEOFANCY $name: $deviceAlias left $id and is in transit";
 
             # backup last known location if not "underway"
-            $currReading = "currLoc_" . $deviceAlias;
-            my $currVal = ReadingsVal( $name, $currReading, undef );
+            $currReading = "currLocTime_" . $deviceAlias;
+            $currVal = ReadingsVal( $name, $currReading, undef );
             if ( $currVal && $currVal ne "underway" ) {
+                readingsBulkUpdate( $hash, "lastLocArr_" . $deviceAlias,
+                    $currVal );
+                readingsBulkUpdate( $hash, "lastLocDep_" . $deviceAlias,
+                    $time );
+                readingsBulkUpdate(
+                    $hash,
+                    "lastLocDur_" . $deviceAlias,
+                    UConv::duration( $time, $currVal, "sec" )
+                );
+
                 foreach ( 'Loc', 'LocLat', 'LocLong', 'LocAddr' ) {
                     $currReading = "curr" . $_ . "_" . $deviceAlias;
                     $lastReading = "last" . $_ . "_" . $deviceAlias;
+                    $currVal     = ReadingsVal( $name, $currReading, "" );
+                    $currVal     = ReadingsVal( $name, $lastReading, "" )
+                      if ( $currVal eq "-" || $currVal eq "" );
                     readingsBulkUpdate( $hash, $lastReading, $currVal );
                 }
-                $currReading = "currLocTime_" . $deviceAlias;
-                readingsBulkUpdate( $hash, "lastLocArr_" . $deviceAlias,
-                    $currVal );
-                readingsBulkUpdate( $hash, "lastLocDep_" . $deviceAlias,
-                    $time );
             }
 
             readingsBulkUpdate( $hash, $deviceAlias, "left " . $id );
@@ -514,8 +701,11 @@ m/(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([0-1][0-9]|2[0-3]):([0-5
         $locName = $id if ( $locName eq "" );
 
         RESIDENTStk_SetLocation(
-            $deviceAlias, $locName, $trigger, $id, $time,
-            $lat,         $long,    $address, $device
+            $deviceAlias, $locName,       $trigger,     $id,
+            $time,        $lat,           $long,        $address,
+            $device,      $radius,        $posLat,      $posLong,
+            $posAddress,  $posBeaconUUID, $posDistHome, $posDistLoc,
+            $motion,      $wifiSSID,      $wifiBSSID
         ) if ( IsDevice( $deviceAlias, "ROOMMATE|GUEST" ) );
     }
 

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 4303 - 4044
fhem/core/FHEM/98_MSwitch.pm


+ 2 - 2
fhem/core/FHEM/98_logProxy.pm

@@ -1,4 +1,4 @@
-# $Id: 98_logProxy.pm 16299 2018-03-01 08:06:55Z justme1968 $
+# $Id: 98_logProxy.pm 17587 2018-10-22 07:18:30Z justme1968 $
 ##############################################################################
 #
 #     This file is part of fhem.
@@ -463,7 +463,7 @@ logProxy_shiftTime($$)
 
   $time =~ s/ /_/;
 
-  if( $offset =~ m/((-)?\d)*m/ ) {
+  if( $offset =~ m/((-)?\d+)m/ ) {
     my @t = split("[-_:]", $time);
     $time = mktime($t[5],$t[4],$t[3],$t[2],$t[1]-1+$1,$t[0]-1900,0,0,-1);;
   } else {

+ 3 - 1
fhem/core/FHEM/Blocking.pm

@@ -1,5 +1,5 @@
 ##############################################
-# $Id: Blocking.pm 16985 2018-07-15 14:08:15Z rudolfkoenig $
+# $Id: Blocking.pm 17553 2018-10-17 15:56:35Z rudolfkoenig $
 package main;
 
 =pod
@@ -172,6 +172,8 @@ BlockingStart(;$)
     my $pid = fhemFork;
     if(!defined($pid)) {
       Log 1, "Cannot fork: $!";
+      stacktrace() if(AttrVal("global", "stracktrace", 0));
+      DoTrigger("global", "CANNOT_FORK", 1);
       return $curr;
     }
 

+ 2 - 2
fhem/core/FHEM/HMConfig.pm

@@ -1,5 +1,5 @@
 ##############################################
-# $Id: HMConfig.pm 17310 2018-09-09 17:13:28Z martinp876 $
+# $Id: HMConfig.pm 17554 2018-10-17 18:25:03Z martinp876 $
 # CUL HomeMatic device configuration data
 
 #####################################################
@@ -1678,7 +1678,7 @@ $culHmRegChan{"HM-OU-CFM-TW02"}         = $culHmRegChan{"HM-OU-CFM-PL02"};
 
 ##############################---set---########################################
 %culHmGlobalSets       = (# all but virtuals
-                       regBulk       => "-list-:-peer- -addr1:data1- -addr2:data2- ..."
+                       regBulk       => "-list-.-peer- -addr1:data1- -addr2:data2- ..."
                       ,getRegRaw     => "[List0|List1|List2|List3|List4|List5|List6] ... [-PeerChannel-]"
                       ,getConfig     => ""
                       ,regSet        => "[prep|exec] -regName- -value- ... [-peerChannel-]"

+ 120 - 58
fhem/core/FHEM/RESIDENTStk.pm

@@ -1,10 +1,9 @@
 ###############################################################################
-# $Id: RESIDENTStk.pm 14160 2017-05-01 19:43:40Z loredo $
+# $Id: RESIDENTStk.pm 17593 2018-10-22 15:35:04Z loredo $
 package main;
 use strict;
 use warnings;
 use Data::Dumper;
-use Time::Local;
 
 use Unit;
 our (@RESIDENTStk_attr);
@@ -415,14 +414,14 @@ sub RESIDENTStk_Set($@) {
                 readingsBulkUpdate(
                     $hash,
                     "lastDurSleep",
-                    RESIDENTStk_TimeDiff(
+                    UConv::duration(
                         $datetime, ReadingsVal( $name, "lastSleep", "" )
                     )
                 );
                 readingsBulkUpdate(
                     $hash,
                     "lastDurSleep_cr",
-                    RESIDENTStk_TimeDiff(
+                    UConv::duration(
                         $datetime, ReadingsVal( $name, "lastSleep", "" ),
                         "min"
                     )
@@ -517,7 +516,7 @@ sub RESIDENTStk_Set($@) {
                         readingsBulkUpdate(
                             $hash,
                             "lastDurAbsence",
-                            RESIDENTStk_TimeDiff(
+                            UConv::duration(
                                 $datetime,
                                 ReadingsVal( $name, "lastDeparture", "-" )
                             )
@@ -525,7 +524,7 @@ sub RESIDENTStk_Set($@) {
                         readingsBulkUpdate(
                             $hash,
                             "lastDurAbsence_cr",
-                            RESIDENTStk_TimeDiff(
+                            UConv::duration(
                                 $datetime,
                                 ReadingsVal( $name, "lastDeparture", "-" ),
                                 "min"
@@ -541,7 +540,7 @@ sub RESIDENTStk_Set($@) {
                         readingsBulkUpdate(
                             $hash,
                             "lastDurPresence",
-                            RESIDENTStk_TimeDiff(
+                            UConv::duration(
                                 $datetime,
                                 ReadingsVal( $name, "lastArrival", "-" )
                             )
@@ -549,7 +548,7 @@ sub RESIDENTStk_Set($@) {
                         readingsBulkUpdate(
                             $hash,
                             "lastDurPresence_cr",
-                            RESIDENTStk_TimeDiff(
+                            UConv::duration(
                                 $datetime,
                                 ReadingsVal( $name, "lastArrival", "-" ), "min"
                             )
@@ -1476,28 +1475,47 @@ sub RESIDENTStk_DurationTimer($;$) {
     return undef;
 }
 
-sub RESIDENTStk_SetLocation($$$;$$$$$$) {
-    my ( $name, $location, $trigger, $id, $time,
-        $lat, $long, $address, $device ) = @_;
-    my $hash         = $defs{$name};
-    my $TYPE         = GetType($name);
-    my $prefix       = RESIDENTStk_GetPrefixFromType($name);
-    my $state        = ReadingsVal( $name, "state", "initialized" );
-    my $presence     = ReadingsVal( $name, "presence", "present" );
-    my $currLocation = ReadingsVal( $name, "location", "-" );
-    my $currWayhome  = ReadingsVal( $name, "wayhome", "0" );
-    my $currLat      = ReadingsVal( $name, "locationLat", "-" );
-    my $currLong     = ReadingsVal( $name, "locationLong", "-" );
-    my $currAddr     = ReadingsVal( $name, "locationAddr", "" );
+sub RESIDENTStk_SetLocation(@) {
+    my (
+        $name,       $location,      $trigger,     $id,
+        $time,       $lat,           $long,        $address,
+        $device,     $radius,        $posLat,      $posLong,
+        $posAddress, $posBeaconUUID, $posDistHome, $posDistLoc,
+        $motion,     $wifiSSID,      $wifiBSSID
+    ) = @_;
+    my $hash              = $defs{$name};
+    my $TYPE              = GetType($name);
+    my $prefix            = RESIDENTStk_GetPrefixFromType($name);
+    my $state             = ReadingsVal( $name, "state", "initialized" );
+    my $presence          = ReadingsVal( $name, "presence", "present" );
+    my $currLocation      = ReadingsVal( $name, "location", "-" );
+    my $currWayhome       = ReadingsVal( $name, "wayhome", "0" );
+    my $currLat           = ReadingsVal( $name, "locationLat", "-" );
+    my $currLong          = ReadingsVal( $name, "locationLong", "-" );
+    my $currRadius        = ReadingsVal( $name, "locationRadius", "" );
+    my $currAddr          = ReadingsVal( $name, "locationAddr", "" );
+    my $currPosLat        = ReadingsVal( $name, "positionLat", "" );
+    my $currPosLong       = ReadingsVal( $name, "positionLong", "" );
+    my $currPosAddr       = ReadingsVal( $name, "positionAddr", "" );
+    my $currPosBeaconUUID = ReadingsVal( $name, "positionBeaconUUID", "" );
+    my $currPosDistHome   = ReadingsVal( $name, "positionDistHome", "" );
+    my $currPosDistLoc    = ReadingsVal( $name, "positionDistLocation", "" );
+    my $currPosMotion     = ReadingsVal( $name, "positionMotion", "" );
+    my $currPosSSID       = ReadingsVal( $name, "positionSSID", "" );
+    my $currPosBSSID      = ReadingsVal( $name, "positionBSSID", "" );
     $id   = "-" if ( !$id   || $id eq "" );
     $lat  = "-" if ( !$lat  || $lat eq "" );
     $long = "-" if ( !$long || $long eq "" );
-    $address = "" if ( !$address );
-    $time    = "" if ( !$time );
-    $device  = "" if ( !$device );
+    $address       = ""  if ( !$address );
+    $time          = ""  if ( !$time );
+    $device        = ""  if ( !$device );
+    $posLat        = ""  if ( !$posLat || $posLat eq "-" );
+    $posLong       = ""  if ( !$posLong || $posLong eq "-" );
+    $posAddress    = "-" if ( !$posAddress || $posAddress eq "" );
+    $posBeaconUUID = ""  if ( !$posBeaconUUID || $posBeaconUUID eq "-" );
 
     Log3 $name, 5,
-"$TYPE $name: received location information: id=$id name=$location trig=$trigger date=$time lat=$lat long=$long address:$address device=$device";
+"$TYPE $name: received location information: id=$id name=$location trig=$trigger date=$time lat=$lat long=$long posLat=$posLat posLong=$posLong address=$address device=$device";
 
     my $searchstring;
 
@@ -1514,10 +1532,76 @@ sub RESIDENTStk_SetLocation($$$;$$$$$$) {
     $searchstring = quotemeta($location);
 
     # update locationPresence
-    readingsBulkUpdate( $hash, "locationPresence", "present" )
-      if ( $trigger == 1 );
-    readingsBulkUpdate( $hash, "locationPresence", "absent" )
-      if ( $trigger == 0 );
+    # if ( $posBeaconUUID eq "" ) {
+        readingsBulkUpdate( $hash, "locationPresence", "present" )
+          if ( $trigger == 1 );
+        readingsBulkUpdate( $hash, "locationPresence", "absent" )
+          if ( $trigger == 0 );
+    # }
+
+    # # update positionPresence
+    # readingsBulkUpdate( $hash, "positionPresence", "present" )
+    #   if ( $trigger == 1 );
+    # readingsBulkUpdate( $hash, "positionPresence", "absent" )
+    #   if ( $trigger == 0 );
+
+    # travelled distance for location
+    my $locTravDist = "";
+    if ( $lat ne "" && $long ne "" ) {
+        my $locLatVal = ReadingsVal( $name, "locationLat", "-" );
+        $locLatVal = ReadingsVal( $name, "lastLocationLat", "-" )
+          if ( $locLatVal eq "-" );
+        my $locLongVal = ReadingsVal( $name, "locationLong", "-" );
+        $locLongVal = ReadingsVal( $name, "lastLocationLong", "-" )
+          if ( $locLongVal eq "-" );
+
+        if ( $locLatVal ne "-" && $locLongVal ne "-" ) {
+            $locTravDist =
+              UConv::distance( $lat, $long, $locLatVal, $locLongVal, 2 );
+        }
+    }
+
+    # travelled distance for position
+    my $posTravDist = "";
+    if ( $posLat ne "" && $posLong ne "" ) {
+        my $currPosLatVal  = ReadingsVal( $name, "positionLat",  "" );
+        my $currPosLongVal = ReadingsVal( $name, "positionLong", "" );
+
+        if ( $currPosLatVal ne "" && $currPosLongVal ne "" ) {
+            $posTravDist = UConv::distance( $posLat, $posLong, $currPosLatVal,
+                $currPosLongVal, 2 );
+        }
+    }
+
+    # backup last known position
+    foreach (
+        'positionLat',      'positionLong',
+        'positionAddr',     'positionBeaconUUID',
+        'positionDistHome', 'positionDistLocation',
+        'positionMotion',   'positionSSID',
+        'positionBSSID',    'positionTravDistance',
+        'locationTravDistance'
+      )
+    {
+        my $currReading = $_;
+        my $lastReading = "last" . ucfirst($_);
+        my $currVal     = ReadingsVal( $name, $currReading, undef );
+        readingsBulkUpdate( $hash, $lastReading, $currVal )
+          if ( defined($currVal) );
+    }
+
+    # update position based readings
+    readingsBulkUpdate( $hash, "positionLat",          $posLat );
+    readingsBulkUpdate( $hash, "positionLong",         $posLong );
+    readingsBulkUpdate( $hash, "positionAddr",         $posAddress );
+    readingsBulkUpdate( $hash, "positionBeaconUUID",   $posBeaconUUID );
+    readingsBulkUpdate( $hash, "positionDistHome",     $posDistHome );
+    readingsBulkUpdate( $hash, "positionDistLocation", $posDistLoc );
+    readingsBulkUpdate( $hash, "positionMotion",       $motion );
+    readingsBulkUpdate( $hash, "positionSSID",         $wifiSSID );
+    readingsBulkUpdate( $hash, "positionBSSID",        $wifiBSSID );
+    readingsBulkUpdate( $hash, "positionTravDistance", $posTravDist );
+    readingsBulkUpdate( $hash, "locationTravDistance", $locTravDist );
 
     # check for implicit state change
     #
@@ -1630,15 +1714,17 @@ sub RESIDENTStk_SetLocation($$$;$$$$$$) {
       )
     {
         Log3 $name, 5, "$TYPE $name: archiving last known location";
-        readingsBulkUpdate( $hash, "lastLocationLat",  $currLat );
-        readingsBulkUpdate( $hash, "lastLocationLong", $currLong );
-        readingsBulkUpdate( $hash, "lastLocationAddr", $currAddr )
+        readingsBulkUpdate( $hash, "lastLocationLat",    $currLat );
+        readingsBulkUpdate( $hash, "lastLocationLong",   $currLong );
+        readingsBulkUpdate( $hash, "lastLocationRadius", $currRadius );
+        readingsBulkUpdate( $hash, "lastLocationAddr",   $currAddr )
           if ( $currAddr ne "" );
         readingsBulkUpdate( $hash, "lastLocation", $currLocation );
     }
 
-    readingsBulkUpdate( $hash, "locationLat",  $lat );
-    readingsBulkUpdate( $hash, "locationLong", $long );
+    readingsBulkUpdate( $hash, "locationLat",    $lat );
+    readingsBulkUpdate( $hash, "locationLong",   $long );
+    readingsBulkUpdate( $hash, "locationRadius", $radius );
 
     if ( $address ne "" ) {
         readingsBulkUpdate( $hash, "locationAddr", $address );
@@ -3393,30 +3479,6 @@ sub RESIDENTStk_TimeSum($$) {
 
 }
 
-sub RESIDENTStk_TimeDiff ($$;$) {
-    my ( $datetimeNow, $datetimeOld, $format ) = @_;
-
-    if ( $datetimeNow eq "" || $datetimeOld eq "" ) {
-        $datetimeNow = "1970-01-01 00:00:00";
-        $datetimeOld = "1970-01-01 00:00:00";
-    }
-
-    my $timestampNow = time_str2num($datetimeNow);
-    my $timestampOld = time_str2num($datetimeOld);
-    my $timeDiff     = $timestampNow - $timestampOld;
-
-    # return seconds
-    return round( $timeDiff, 0 )
-      if ( defined($format) && $format eq "sec" );
-
-    # return minutes
-    return round( $timeDiff / 60, 0 )
-      if ( defined($format) && $format eq "min" );
-
-    # return human readable format
-    return UConv::s2hms( round( $timeDiff, 0 ) );
-}
-
 sub RESIDENTStk_InternalTimer($$$$$) {
     my ( $modifier, $tim, $callback, $hash, $waitIfInitNotDone ) = @_;
 

+ 45 - 4
fhem/core/FHEM/UConv.pm

@@ -1,5 +1,5 @@
 ###############################################################################
-# $Id: UConv.pm 14398 2017-05-28 09:40:42Z loredo $
+# $Id: UConv.pm 17589 2018-10-22 13:37:00Z loredo $
 package main;
 sub UConv_Initialize() { }
 
@@ -8,6 +8,7 @@ use Scalar::Util qw(looks_like_number);
 use POSIX qw(strftime);
 use Data::Dumper;
 
+
 ####################
 # Translations
 
@@ -583,6 +584,18 @@ sub wpsm2lux($;$) {
 ### Nautic unit conversions
 ###
 
+# Speed: convert smi (statute miles) to nmi (nautical miles)
+sub smi2nmi($;$) {
+    my ( $data, $rnd ) = @_;
+    return _round( $data * 0.8684, $rnd );
+}
+
+# Speed: convert km (kilometer) to nmi (nautical miles)
+sub km2nmi($;$) {
+    my ( $data, $rnd ) = @_;
+    return _round( smi2nmi( km2mi( $data, 9 ), 9 ), $rnd );
+}
+
 # Speed: convert km/h to knots
 sub kph2kn($;$) {
     my ( $data, $rnd ) = @_;
@@ -691,8 +704,11 @@ sub mph2bft($) {
 ### Differential conversions
 ###
 
-sub distance($$$$;$) {
-    my ( $lat1, $lng1, $lat2, $lng2, $miles ) = @_;
+sub distance($$$$;$$) {
+    my ( $lat1, $lng1, $lat2, $lng2, $rnd, $unit ) = @_;
+    return _round( "0.000000000", $rnd )
+      if ( $lat1 eq $lat2 && $lng1 eq $lng2 );
+
     use constant M_PI => 4 * atan2( 1, 1 );
     my $pi80 = M_PI / 180;
     $lat1 *= $pi80;
@@ -709,7 +725,32 @@ sub distance($$$$;$) {
     my $c = 2 * atan2( sqrt($a), sqrt( 1 - $a ) );
     my $km = $r * $c;
 
-    return ( $miles ? km2mi($km) : $km );
+    return _round(
+        ( $unit eq "nmi" ? km2nmi($km) : ( $unit ? km2mi($km) : $km ) ), $rnd );
+}
+
+sub duration ($$;$) {
+    my ( $datetimeNow, $datetimeOld, $format ) = @_;
+
+    if ( $datetimeNow eq "" || $datetimeOld eq "" ) {
+        $datetimeNow = "1970-01-01 00:00:00";
+        $datetimeOld = "1970-01-01 00:00:00";
+    }
+
+    my $timestampNow = main::time_str2num($datetimeNow);
+    my $timestampOld = main::time_str2num($datetimeOld);
+    my $timeDiff     = $timestampNow - $timestampOld;
+
+    # return seconds
+    return _round( $timeDiff, 0 )
+      if ( defined($format) && $format eq "sec" );
+
+    # return minutes
+    return _round( $timeDiff / 60, 0 )
+      if ( defined($format) && $format eq "min" );
+
+    # return human readable format
+    return s2hms( _round( $timeDiff, 0 ) );
 }
 
 #################################

+ 32 - 31
fhem/core/FHEM/controls_fhem.txt

@@ -1,4 +1,4 @@
-REV 17549
+REV 17609
 DIR unused
 MOV www/pgm2/fhemweb_multiple.js unused
 MOV www/pgm2/fhemweb_noArg.js unused
@@ -21,16 +21,16 @@ MOV www/pgm2/ios7smallscreensvg_style.css unused
 MOV www/pgm2/iossmallscreensvg_defs.svg unused
 MOV www/pgm2/iossmallscreensvg_style.css unused
 MOV FHEM/firmware/LaCrosseGateway.bin unused
-UPD 2018-10-17_07:45:02 260955 ./CHANGED
-UPD 2018-10-13_07:45:03 38075 ./MAINTAINER.txt
+UPD 2018-10-24_07:45:03 262846 ./CHANGED
+UPD 2018-10-21_07:45:03 38276 ./MAINTAINER.txt
 UPD 2018-09-09_07:45:03 39688 ./configDB.pm
 UPD 2018-09-17_07:45:03 19987 ./fhem.cfg.demo
 UPD 2018-10-15_07:45:09 150899 ./fhem.pl
 UPD 2018-03-11_07:45:03 22076 FHEM/00_CM11.pm
-UPD 2018-06-26_07:45:03 57519 FHEM/00_CUL.pm
+UPD 2018-10-19_07:45:03 57590 FHEM/00_CUL.pm
 UPD 2018-03-04_07:45:03 76990 FHEM/00_DFPlayerMini.pm
 UPD 2018-03-01_07:45:03 15583 FHEM/00_FBAHA.pm
-UPD 2018-08-10_07:45:03 10026 FHEM/00_FBAHAHTTP.pm
+UPD 2018-10-24_07:45:03 10135 FHEM/00_FBAHAHTTP.pm
 UPD 2017-08-14_07:45:02 27524 FHEM/00_FHZ.pm
 UPD 2017-04-23_07:45:02 58685 FHEM/00_HMLAN.pm
 UPD 2018-02-14_07:45:02 89817 FHEM/00_HMUARTLGW.pm
@@ -80,11 +80,11 @@ UPD 2018-06-11_07:45:06 61938 FHEM/10_MAX.pm
 UPD 2018-10-09_07:45:03 14516 FHEM/10_MQTT2_DEVICE.pm
 UPD 2018-09-18_07:45:02 11022 FHEM/10_MQTT_BRIDGE.pm
 UPD 2018-09-18_07:45:02 13548 FHEM/10_MQTT_DEVICE.pm
-UPD 2018-10-15_07:45:02 138462 FHEM/10_MQTT_GENERIC_BRIDGE.pm
+UPD 2018-10-19_07:45:03 139789 FHEM/10_MQTT_GENERIC_BRIDGE.pm
 UPD 2018-06-23_07:45:04 30428 FHEM/10_MYSENSORS_DEVICE.pm
 UPD 2018-06-12_07:45:06 19100 FHEM/10_NeuronPin.pm
 UPD 2018-03-28_07:45:02 33933 FHEM/10_OWServer.pm
-UPD 2017-04-30_07:45:02 71321 FHEM/10_RESIDENTS.pm
+UPD 2018-10-24_07:45:03 71291 FHEM/10_RESIDENTS.pm
 UPD 2018-01-07_07:45:03 61206 FHEM/10_SOMFY.pm
 UPD 2016-12-19_07:45:02 18301 FHEM/10_UNIRoll.pm
 UPD 2018-08-21_07:45:03 234138 FHEM/10_ZWave.pm
@@ -175,7 +175,7 @@ UPD 2016-04-25_07:45:10 5350 FHEM/30_pilight_switch.pm
 UPD 2016-01-15_07:45:16 6136 FHEM/30_pilight_temp.pm
 UPD 2018-07-28_07:45:02 28156 FHEM/31_Aurora.pm
 UPD 2015-07-28_14:05:31 4627 FHEM/31_ENECSYSINV.pm
-UPD 2018-03-09_07:45:03 62358 FHEM/31_HUEDevice.pm
+UPD 2018-10-19_07:45:03 62431 FHEM/31_HUEDevice.pm
 UPD 2018-07-29_07:45:03 35646 FHEM/31_LightScene.pm
 UPD 2018-02-05_07:45:02 98839 FHEM/31_MilightDevice.pm
 UPD 2017-11-20_07:45:02 22207 FHEM/31_Nello.pm
@@ -224,7 +224,7 @@ UPD 2017-07-01_07:45:02 152744 FHEM/37_plex.pm
 UPD 2017-12-10_07:45:03 31453 FHEM/38_Broadlink.pm
 UPD 2017-05-31_07:45:02 28640 FHEM/38_CO20.pm
 UPD 2016-02-09_07:45:13 15879 FHEM/38_JawboneUp.pm
-UPD 2018-10-08_07:45:02 237505 FHEM/38_netatmo.pm
+UPD 2018-10-23_07:45:03 238229 FHEM/38_netatmo.pm
 UPD 2018-03-18_07:45:02 80208 FHEM/39_Talk2Fhem.pm
 UPD 2018-03-02_07:47:09 24286 FHEM/39_alexa.pm
 UPD 2017-04-21_07:45:02 2759 FHEM/39_siri.pm
@@ -260,7 +260,7 @@ UPD 2018-04-03_07:45:06 57938 FHEM/46_TRX_WEATHER.pm
 UPD 2018-01-24_07:45:02 18229 FHEM/46_TeslaPowerwall2AC.pm
 UPD 2018-02-14_07:45:02 37065 FHEM/47_OBIS.pm
 UPD 2015-07-28_14:05:31 26441 FHEM/49_IPCAM.pm
-UPD 2018-09-03_07:45:03 457841 FHEM/49_SSCam.pm
+UPD 2018-10-24_07:45:03 465240 FHEM/49_SSCam.pm
 UPD 2018-07-04_07:45:03 10638 FHEM/49_SSCamSTRM.pm
 UPD 2018-03-12_07:45:04 46280 FHEM/49_TBot_List.pm
 UPD 2018-10-15_07:45:02 62521 FHEM/50_HP1000.pm
@@ -295,7 +295,7 @@ UPD 2018-09-29_07:45:03 77974 FHEM/55_DWD_OpenData.pm
 UPD 2018-05-29_07:45:03 65815 FHEM/55_InfoPanel.pm
 UPD 2016-08-24_07:45:10 20855 FHEM/55_PIFACE.pm
 UPD 2015-07-28_14:05:31 17091 FHEM/56_POKEYS.pm
-UPD 2018-07-27_07:45:05 27136 FHEM/57_CALVIEW.pm
+UPD 2018-10-24_07:45:03 27668 FHEM/57_CALVIEW.pm
 UPD 2018-10-15_07:45:02 148508 FHEM/57_Calendar.pm
 UPD 2018-10-01_07:45:02 33614 FHEM/59_HCS.pm
 UPD 2018-10-17_07:45:02 26685 FHEM/59_LuftdatenInfo.pm
@@ -340,7 +340,7 @@ UPD 2016-08-21_07:45:14 20340 FHEM/70_VolumeLink.pm
 UPD 2018-03-14_07:45:03 44782 FHEM/70_WINCONNECT.pm
 UPD 2017-03-01_07:45:02 22279 FHEM/70_WS3600.pm
 UPD 2016-12-30_07:45:02 55308 FHEM/70_XBMC.pm
-UPD 2018-10-17_07:45:02 21994 FHEM/70_ZoneMinder.pm
+UPD 2018-10-23_07:45:03 22365 FHEM/70_ZoneMinder.pm
 UPD 2017-05-29_07:45:02 63897 FHEM/71_ONKYO_AVR_ZONE.pm
 UPD 2017-04-20_07:45:02 96053 FHEM/71_PHILIPS_AUDIO.pm
 UPD 2017-06-27_07:45:02 24467 FHEM/71_PIONEERAVRZONE.pm
@@ -354,7 +354,7 @@ UPD 2018-10-01_07:45:02 221693 FHEM/72_FRITZBOX.pm
 UPD 2018-10-06_07:45:02 151068 FHEM/72_XiaomiDevice.pm
 UPD 2018-06-03_07:45:03 47236 FHEM/73_AMADCommBridge.pm
 UPD 2018-04-14_07:45:02 89324 FHEM/73_ElectricityCalculator.pm
-UPD 2018-10-16_07:45:03 35233 FHEM/73_GardenaSmartBridge.pm
+UPD 2018-10-18_07:45:03 34360 FHEM/73_GardenaSmartBridge.pm
 UPD 2018-04-14_07:45:02 81612 FHEM/73_GasCalculator.pm
 UPD 2018-01-09_07:45:03 87372 FHEM/73_MPD.pm
 UPD 2018-07-12_07:45:02 30806 FHEM/73_NUKIBridge.pm
@@ -363,7 +363,7 @@ UPD 2017-11-06_07:45:02 81399 FHEM/73_UpsPico.pm
 UPD 2018-04-14_07:45:02 84632 FHEM/73_WaterCalculator.pm
 UPD 2017-05-09_07:45:02 118318 FHEM/73_km200.pm
 UPD 2018-06-20_07:45:04 67279 FHEM/74_AMADDevice.pm
-UPD 2018-10-16_07:45:03 42084 FHEM/74_GardenaSmartDevice.pm
+UPD 2018-10-18_07:45:03 41415 FHEM/74_GardenaSmartDevice.pm
 UPD 2018-03-22_07:45:04 41340 FHEM/74_HOMBOT.pm
 UPD 2018-06-20_07:45:04 30459 FHEM/74_HusqvarnaAutomower.pm
 UPD 2018-07-12_07:45:02 22747 FHEM/74_NUKIDevice.pm
@@ -372,7 +372,7 @@ UPD 2017-05-03_07:45:02 64129 FHEM/74_THINKINGCLEANER.pm
 UPD 2018-07-23_07:45:03 105658 FHEM/74_Unifi.pm
 UPD 2018-07-23_07:45:03 12273 FHEM/74_UnifiSwitch.pm
 UPD 2018-02-13_07:45:02 15941 FHEM/74_UnifiVideo.pm
-UPD 2018-09-13_07:45:06 40684 FHEM/74_XiaomiBTLESens.pm
+UPD 2018-10-24_07:45:03 40375 FHEM/74_XiaomiBTLESens.pm
 UPD 2017-10-11_07:45:02 112592 FHEM/75_MSG.pm
 UPD 2017-10-02_07:45:02 31295 FHEM/75_msgConfig.pm
 UPD 2016-08-22_07:45:11 9037 FHEM/76_MSGFile.pm
@@ -406,19 +406,19 @@ UPD 2015-07-28_14:05:31 12845 FHEM/88_VantagePro2.pm
 UPD 2015-07-28_14:05:31 4198 FHEM/88_WEBCOUNT.pm
 UPD 2018-05-01_07:45:03 39556 FHEM/88_xs1Bridge.pm
 UPD 2018-04-14_07:45:02 22528 FHEM/88_xs1Dev.pm
-UPD 2018-08-29_07:45:04 21359 FHEM/89_FULLY.pm
+UPD 2018-10-20_07:45:04 22965 FHEM/89_FULLY.pm
 UPD 2016-01-05_07:45:12 44169 FHEM/89_HEATRONIC.pm
 UPD 2016-07-11_07:45:14 62016 FHEM/89_VCONTROL.pm
 UPD 2016-12-07_07:45:10 15485 FHEM/90_SIGNALduino_un.pm
-UPD 2018-10-12_07:45:02 25588 FHEM/90_at.pm
+UPD 2018-10-19_07:45:03 26109 FHEM/90_at.pm
 UPD 2017-08-14_07:45:02 6980 FHEM/91_eventTypes.pm
 UPD 2018-08-30_07:45:03 27694 FHEM/91_notify.pm
 UPD 2018-05-11_07:45:02 9863 FHEM/91_sequence.pm
 UPD 2018-07-10_07:45:14 16502 FHEM/91_watchdog.pm
 UPD 2018-08-21_07:45:03 54919 FHEM/92_FileLog.pm
 UPD 2017-08-14_07:45:02 11589 FHEM/92_SingleFileLog.pm
-UPD 2018-10-17_07:45:02 346819 FHEM/93_DbLog.pm
-UPD 2018-10-13_07:45:03 668506 FHEM/93_DbRep.pm
+UPD 2018-10-23_07:45:03 346982 FHEM/93_DbLog.pm
+UPD 2018-10-24_07:45:03 698240 FHEM/93_DbRep.pm
 UPD 2018-09-18_07:45:02 18106 FHEM/93_FHEM2FHEM.pm
 UPD 2018-10-17_07:45:02 135339 FHEM/93_Log2Syslog.pm
 UPD 2018-02-09_07:45:02 66936 FHEM/93_PWMR.pm
@@ -444,13 +444,13 @@ UPD 2016-08-19_14:49:02 4984 FHEM/98_CULflash.pm
 UPD 2017-05-10_07:45:02 47704 FHEM/98_ComfoAir.pm
 UPD 2017-09-20_07:45:02 9013 FHEM/98_CustomReadings.pm
 UPD 2018-01-10_07:45:02 60933 FHEM/98_DLNARenderer.pm
-UPD 2018-10-15_07:45:02 266672 FHEM/98_DOIF.pm
+UPD 2018-10-18_07:45:03 266719 FHEM/98_DOIF.pm
 UPD 2018-09-09_07:45:03 111923 FHEM/98_DOIFtools.pm
 UPD 2017-11-06_07:45:02 40228 FHEM/98_Dooya.pm
 UPD 2016-10-29_07:45:14 28678 FHEM/98_EDIPLUG.pm
 UPD 2017-04-03_07:45:02 25462 FHEM/98_FReplacer.pm
 UPD 2017-12-14_07:45:02 40432 FHEM/98_GAEBUS.pm
-UPD 2017-04-27_07:45:02 24956 FHEM/98_GEOFANCY.pm
+UPD 2018-10-23_07:45:03 32630 FHEM/98_GEOFANCY.pm
 UPD 2018-04-12_07:45:02 30163 FHEM/98_GOOGLECAST.pm
 UPD 2017-01-21_07:45:02 11576 FHEM/98_GoogleAuth.pm
 UPD 2018-10-07_07:45:02 174706 FHEM/98_HMinfo.pm
@@ -461,7 +461,7 @@ UPD 2016-04-26_07:45:11 33223 FHEM/98_HourCounter.pm
 UPD 2017-12-02_07:45:02 66644 FHEM/98_Hyperion.pm
 UPD 2017-01-04_07:45:02 21573 FHEM/98_IF.pm
 UPD 2018-08-31_07:45:03 4884 FHEM/98_JsonList2.pm
-UPD 2018-10-13_07:45:03 257263 FHEM/98_MSwitch.pm
+UPD 2018-10-23_07:45:03 289933 FHEM/98_MSwitch.pm
 UPD 2016-03-12_07:45:14 49251 FHEM/98_MaxScanner.pm
 UPD 2017-09-05_07:45:02 34104 FHEM/98_MediaList.pm
 UPD 2018-01-14_07:45:02 121875 FHEM/98_Modbus.pm
@@ -475,6 +475,7 @@ UPD 2018-06-07_07:45:10 22527 FHEM/98_RandomTimer.pm
 UPD 2016-10-05_07:45:11 20567 FHEM/98_STOCKQUOTES.pm
 UPD 2018-10-05_07:45:02 95595 FHEM/98_SVG.pm
 UPD 2018-03-24_07:45:03 97508 FHEM/98_Siro.pm
+UPD 2018-10-21_07:45:03 80498 FHEM/98_SmarterCoffee.pm
 UPD 2017-05-04_07:45:02 52568 FHEM/98_THRESHOLD.pm
 UPD 2018-03-19_07:45:04 49956 FHEM/98_TRAFFIC.pm
 UPD 2018-06-12_07:45:06 58167 FHEM/98_Text2Speech.pm
@@ -503,7 +504,7 @@ UPD 2018-05-25_07:45:02 6830 FHEM/98_fhemdebug.pm
 UPD 2018-06-26_07:45:03 11220 FHEM/98_fheminfo.pm
 UPD 2018-04-09_07:45:03 53633 FHEM/98_freezemon.pm
 UPD 2017-10-11_07:45:02 9129 FHEM/98_help.pm
-UPD 2018-03-02_07:47:09 44070 FHEM/98_logProxy.pm
+UPD 2018-10-23_07:45:03 44070 FHEM/98_logProxy.pm
 UPD 2018-08-29_07:45:04 54289 FHEM/98_monitoring.pm
 UPD 2016-08-19_14:49:02 25936 FHEM/98_notice.pm
 UPD 2015-08-13_07:45:10 8668 FHEM/98_pilight.pm
@@ -524,7 +525,7 @@ UPD 2018-03-01_07:45:03 5808 FHEM/98_weblink.pm
 UPD 2018-03-17_07:45:07 54100 FHEM/98_weekprofile.pm
 UPD 2018-04-18_07:45:03 26187 FHEM/99_SUNRISE_EL.pm
 UPD 2017-12-29_07:45:02 9321 FHEM/99_Utils.pm
-UPD 2018-07-16_07:45:03 8364 FHEM/Blocking.pm
+UPD 2018-10-18_07:45:03 8469 FHEM/Blocking.pm
 UPD 2016-03-31_07:45:12 11202 FHEM/Color.pm
 UPD 2018-04-16_07:45:03 16044 FHEM/DevIo.pm
 UPD 2015-07-28_14:05:29 562 FHEM/FhemUtils/release.pm
@@ -532,7 +533,7 @@ UPD 2015-07-28_14:05:29 5739 FHEM/FhemUtils/update-20130127-001
 UPD 2018-05-06_07:45:03 3548 FHEM/FritzBoxUtils.pm
 UPD 2015-07-28_14:05:31 1582 FHEM/GPUtils.pm
 UPD 2018-09-20_07:45:03 55373 FHEM/HMCCUConf.pm
-UPD 2018-09-10_07:45:02 201333 FHEM/HMConfig.pm
+UPD 2018-10-18_07:45:03 201333 FHEM/HMConfig.pm
 UPD 2017-05-22_07:45:02 42698 FHEM/HOMESTATEtk.pm
 UPD 2018-07-28_07:45:02 29104 FHEM/HttpUtils.pm
 UPD 2015-07-28_14:05:31 2324 FHEM/MaxCommon.pm
@@ -541,7 +542,7 @@ UPD 2015-07-28_14:05:31 12165 FHEM/OWX_DS2480.pm
 UPD 2016-01-25_07:45:12 10196 FHEM/OWX_DS9097.pm
 UPD 2015-07-28_14:05:31 8453 FHEM/OWX_FRM.pm
 UPD 2015-07-28_14:05:31 12536 FHEM/OWX_SER.pm
-UPD 2017-05-02_07:45:02 138443 FHEM/RESIDENTStk.pm
+UPD 2018-10-23_07:45:03 141864 FHEM/RESIDENTStk.pm
 UPD 2016-01-13_07:45:13 1191 FHEM/RTypes.pm
 UPD 2015-07-28_14:05:31 7121 FHEM/SHC_datafields.pm
 UPD 2015-07-28_14:05:31 11758 FHEM/SHC_parser.pm
@@ -550,7 +551,7 @@ UPD 2017-05-21_07:45:02 7416 FHEM/SubProcess.pm
 UPD 2017-11-16_07:45:02 3372 FHEM/TR064Utils.pm
 UPD 2018-10-15_07:45:02 7861 FHEM/TcpServerUtils.pm
 UPD 2016-02-22_07:45:12 27613 FHEM/TimeSeries.pm
-UPD 2017-05-29_07:45:02 49037 FHEM/UConv.pm
+UPD 2018-10-23_07:45:03 50211 FHEM/UConv.pm
 UPD 2017-04-30_07:45:02 137531 FHEM/Unit.pm
 UPD 2018-07-18_07:45:03 63719 FHEM/WMBus.pm
 UPD 2015-07-28_14:05:31 8525 FHEM/WinService.pm
@@ -683,12 +684,12 @@ UPD 2016-07-21_07:45:27 24829 docs/HOWTO_DE.html
 UPD 2015-07-28_14:05:35 46151 docs/IMG_0483.jpg
 UPD 2017-06-30_07:45:02 37394 docs/Landis-Gyr-E350-meter.jpg
 UPD 2015-07-28_14:05:35 14548 docs/ccc.jpg
-UPD 2018-10-17_07:45:05 3589756 docs/commandref.html
-UPD 2018-10-17_07:45:07 2207200 docs/commandref_DE.html
+UPD 2018-10-24_07:45:06 3617478 docs/commandref.html
+UPD 2018-10-24_07:45:08 2223011 docs/commandref_DE.html
 UPD 2018-10-08_07:45:02 76228 docs/commandref_frame.html
 UPD 2018-10-08_07:45:02 85677 docs/commandref_frame_DE.html
-UPD 2018-10-17_07:45:08 198933 docs/commandref_modular.html
-UPD 2018-10-17_07:45:09 209614 docs/commandref_modular_DE.html
+UPD 2018-10-24_07:45:09 199638 docs/commandref_modular.html
+UPD 2018-10-24_07:45:10 210289 docs/commandref_modular_DE.html
 UPD 2015-07-28_14:05:35 4778 docs/cul_rfr.jpg
 UPD 2015-07-28_14:05:35 19949 docs/faq.html
 UPD 2015-07-28_14:05:35 938 docs/fhemdoc.js

+ 3 - 3
fhem/core/FHEM/controls_fhemtabletui.txt

@@ -12,8 +12,8 @@ UPD 2018-04-03_01:31:38 7326 www/tablet/css/fhem-darkgreen-ui.css
 UPD 2018-04-02_23:22:10 2658 www/tablet/css/fhem-green-ui.css
 UPD 2018-04-02_23:24:25 7123 www/tablet/css/fhem-mobil-ui.css
 UPD 2017-02-05_13:50:40 6916 www/tablet/css/fhem-tablet-ui-wdtimer.css
-UPD 2018-10-06_20:55:55 64557 www/tablet/css/fhem-tablet-ui.css
-UPD 2018-10-03_01:06:51 48206 www/tablet/css/fhem-tablet-ui.min.css
+UPD 2018-10-22_22:59:40 64719 www/tablet/css/fhem-tablet-ui.css
+UPD 2018-10-22_22:59:44 48574 www/tablet/css/fhem-tablet-ui.min.css
 UPD 2017-02-11_14:27:26 2049 www/tablet/css/ftui-bright-mint-ui.css
 UPD 2018-09-21_20:59:49 6600 www/tablet/css/ftui_chart.css
 UPD 2017-10-03_08:03:02 1132 www/tablet/css/ftui_checklist.css
@@ -144,7 +144,7 @@ UPD 2018-10-01_18:04:53 13743 www/tablet/js/widget_simplechart.js
 UPD 2017-02-20_22:59:41 3118 www/tablet/js/widget_slideout.js
 UPD 2018-08-15_22:43:29 16306 www/tablet/js/widget_slider.js
 UPD 2018-04-05_17:32:57 12476 www/tablet/js/widget_spinner.js
-UPD 2018-01-21_15:00:48 3083 www/tablet/js/widget_svgplot.js
+UPD 2018-10-19_11:15:31 3096 www/tablet/js/widget_svgplot.js
 UPD 2017-12-30_19:39:40 4299 www/tablet/js/widget_swiper.js
 UPD 2018-03-29_00:09:31 1557 www/tablet/js/widget_switch.js
 UPD 2018-03-28_23:04:46 1931 www/tablet/js/widget_symbol.js

+ 3 - 0
fhem/core/MAINTAINER.txt

@@ -329,11 +329,13 @@ FHEM/70_PushNotifier.pm      xusader              Unterstuetzende Dienste
 FHEM/70_Pushalot.pm          Talkabout            Unterstuetzende Dienste
 FHEM/70_Pushsafer.pm         markusbloch          Unterstuetzende Dienste
 FHEM/70_DoorPi.pm            pahenning            Automatisierung
+FHEM/70_ZoneMinder.pm        delmar               Sonstige Systeme
 FHEM/71_ONKYO_AVR_ZONE.pm    loredo               Multimedia
 FHEM/71_PHILIPS_AUDIO.pm     ra666ack             Multimedia
 FHEM/71_YAMAHA_AVR.pm        markusbloch          Multimedia
 FHEM/71_YAMAHA_BD.pm         markusbloch          Multimedia
 FHEM/71_YAMAHA_NP.pm         ra666ack             Multimedia
+FHEM/71_ZM_Monitor.pm        delmar               Sonstige Systeme
 FHEM/72_FB_CALLMONITOR.pm    markusbloch          Unterstuetzende Dienste
 FHEM/72_FB_CALLLIST.pm       markusbloch          Frontends
 FHEM/72_FRITZBOX.pm          tupol                FRITZBOX (link als PM an tupol)
@@ -501,6 +503,7 @@ FHEM/98_version.pm           markusbloch          Sonstiges
 FHEM/98_weblink.pm           rudolfkoenig         Frontends/FHEMWEB
 FHME/98_weekprofile.pm       risiko               Frontends
 FHEM/98_STOCKQUOTES.pm       vbs                  Unterstuetzende Dienste
+FHEM/98_SmarterCoffee        CoolTux              Sonstige Systeme
 FHEM/99_SUNRISE_EL.pm        rudolfkoenig         Automatisierung
 FHEM/99_Utils.pm             rudolfkoenig         Automatisierung
 FHEM/99_Venetian.pm          Christian.Kühnel     Automatisierung

+ 468 - 57
fhem/core/docs/commandref.html

@@ -406,6 +406,7 @@
       <a href="#SISPM">SISPM</a> &nbsp;
       <a href="#SMAEM">SMAEM</a> &nbsp;
       <a href="#SMAInverter">SMAInverter</a> &nbsp;
+      <a href="#SmarterCoffee">SmarterCoffee</a> &nbsp;
       <a href="#SmartMeterP1">SmartMeterP1</a> &nbsp;
       <a href="#SMARTMON">SMARTMON</a> &nbsp;
       <a href="#SmartPi">SmartPi</a> &nbsp;
@@ -4221,7 +4222,7 @@ The following local attributes are used by a wider range of devices:
 <h3>CALVIEW</h3>
 <div class='langLinks'>[EN <a href='commandref_DE.html#CALVIEW'>DE</a>]</div>
 <ul>This module creates a device with deadlines based on calendar-devices of the 57_Calendar.pm module. You need to install the  perl-modul Date::Parse!</ul>
-<ul>Actually the module supports only the "get <> next" function of the CALENDAR-Modul.</ul>
+<ul>Please configure the attribut HideOlderThen in your CALENDAR-Device, that controls if old events from past are shown!</ul>
 <b>Define</b>
 <ul><code>define &lt;Name&gt; CALVIEW &lt;calendarname(s) separate with ','&gt; &lt;next&gt; &lt;updateintervall in sec (default 43200)&gt;</code></ul>
 <ul><code>define myView CALVIEW Googlecalendar next</code></ul>
@@ -10346,6 +10347,7 @@ Just one definition per FHEM-installation is allowed. <a href="https://fhem.de/c
 	 <li> delete consecutive datasets with different timestamp but same values (clearing up consecutive doublets) </li>
      <li> Repair of a corrupted SQLite database ("database disk image is malformed") </li>
      <li> transmission of datasets from source database into another (Standby) database (syncStandby) </li>
+     <li> reduce the amount of datasets in database (reduceLog) </li>
      </ul></ul>
      <br>
      
@@ -10527,11 +10529,30 @@ Just one definition per FHEM-installation is allowed. <a href="https://fhem.de/c
                                  </li> <br>
                                  </ul>
                                  
-    <li><b> countEntries [history|current] </b> -  provides the number of table-entries (default: history) between period set 
-	                                               by timestamp-<a href="#DbRepattr">attributes</a> if set. 
-                                                   If timestamp-attributes are not set, all entries of the table will be count. 
+    <li><b> countEntries [history|current] </b> -  provides the number of table entries (default: history) between time period set 
+	                                               by time.* -<a href="#DbRepattr">attributes</a> if set. 
+                                                   If time.* attributes not set, all entries of the table will be count. 
 												   The <a href="#DbRepattr">attributes</a> "device" and "reading" can be used to 
-												   limit the evaluation.  </li> <br>
+												   limit the evaluation.  <br>
+                                                   By default the summary of all counted datasets, labeled by "ALLREADINGS", will be created.
+                                                   If the attribute "countEntriesDetail" is set, the number of every reading  
+                                                   is reported additionally. <br><br>                                                   
+                                                   
+                                                   The relevant attributes for this function are: <br><br>
+
+	                                               <ul>
+                                                   <table>  
+                                                      <colgroup> <col width=5%> <col width=95%> </colgroup>
+                                                      <tr><td> <b>aggregation</b>       </td><td>: aggregatiion/grouping of time intervals </td></tr>
+                                                      <tr><td> <b>countEntriesDetail</b></td><td>: detailed report the count of datasets (per reading) </td></tr>
+                                                      <tr><td> <b>device</b>            </td><td>: selection only of datasets which contain &lt;device&gt; </td></tr>
+                                                      <tr><td> <b>reading</b>           </td><td>: selection only of datasets which contain &lt;reading&gt; </td></tr>
+                                                      <tr><td> <b>time.*</b>            </td><td>: a number of attributes to limit selection by time </td></tr>
+                                                      </table>
+	                                               </ul>
+	                                               <br>                                           
+                                                   
+                                                   </li> <br>
                                                    
                            
     <li><b> delEntries </b>   -  deletes all database entries or only the database entries specified by <a href="#DbRepattr">attributes</a> Device and/or 
@@ -10989,7 +11010,7 @@ Just one definition per FHEM-installation is allowed. <a href="https://fhem.de/c
                                       <tr><td> <b>device</b>                </td><td>: select only datasets which are contain &lt;device&gt; </td></tr>
                                       <tr><td> <b>reading</b>               </td><td>: select only datasets which are contain &lt;reading&gt; </td></tr>
                                       <tr><td> <b>time.*</b>                </td><td>: A number of attributes to limit selection by time </td></tr>
-                                      <tr><td> <b>valueFilter</b>           </td><td>: filter datasets of database field "VALUE" by a regular expression </td></tr>
+                                      <tr><td> <b>valueFilter</b>           </td><td>: Filter datasets which are to show by a regular expression. The regex is applied to the whole selected dataset. </td></tr>
                                    </table>
 	                               </ul>
 	                               <br>
@@ -11512,7 +11533,16 @@ return $ret;
                                  </li> 
                                  <br><br>
                                  </ul>                                                                                   
-  <br>
+  
+    <li><b> versionNotes [hints | rel | &lt;key&gt;] </b> - 
+                              Shows realease informations and/or hints about the module. It contains only main release 
+                              informations for module users. <br>
+                              If no options are specified, both release informations and hints will be shown. "rel" shows 
+                              only release informations and "hints" shows only hints. By the &lt;key&gt;-specification only 
+                              the hint with the specified number is shown.                          
+                              </li>     
+                              <br>
+  
   </ul></ul>
   
 </ul>  
@@ -11523,7 +11553,9 @@ return $ret;
 
 <br>
 <ul>
-  Using the module specific attributes you are able to define the scope of evaluation and the aggregation. <br><br>
+  Using the module specific attributes you are able to define the scope of evaluation and the aggregation. <br>
+  The listed attrbutes are not completely relevant for every function of the module. The help of set/get-commands
+  contain explicitly which attributes are relevant for the specific command. <br><br>
   
   <b>Note for SQL-Wildcard Usage:</b> <br>
   Within the attribute values of "device" and "reading" you may use SQL-Wildcard "%", Character "_" is not supported as a wildcard. 
@@ -11551,15 +11583,20 @@ return $ret;
 	                               <ul>
                                    <table>  
                                    <colgroup> <col width=20%> <col width=80%> </colgroup>
-                                      <tr><td><b>avgArithmeticMean :</b> </td><td>the arithmetic average is calculated (default) </td></tr>
-                                      <tr><td><b>avgDailyMeanGWS :</b>   </td><td>calculates the daily medium temperature according the 
-                                                                                  specifications of german weather service (pls. see helpful hints by get versionNotes). <br>
-                                                                                  This variant uses aggregation "day" automatically. </td></tr>
-                                      <tr><td><b>avgTimeWeightMean :</b> </td><td>calculates a time weighted average mean value is calculated </td></tr>
+                                      <tr><td><b>avgArithmeticMean                          :</b> </td><td>the arithmetic average is calculated (default) </td></tr>
+                                      <tr><td style="vertical-align:top"><b>avgDailyMeanGWS :</b> <td>calculates the daily medium temperature according the 
+                                                                                                  specifications of german weather service (pls. see "get &lt;name&gt; versionNotes 2"). <br>
+                                                                                                  This variant uses aggregation "day" automatically. </td></tr>
+                                      <tr><td><b>avgTimeWeightMean                          :</b> </td><td>calculates a time weighted average mean value is calculated </td></tr>
 								   </table>
 	                               </ul>								   
                                 </li><br>
 
+  <a name="countEntriesDetail"></a>
+  <li><b>countEntriesDetail </b>   - If set, the function countEntries creates a detailed report of counted datasets of
+                                     every reading. By default only the summary of counted datasets is reported. 
+                                     </li> <br>
+  
   <a name="device"></a>
   <li><b>device </b>          - Selection of a particular device. <br>
                                 You can specify device specifications (devspec). <br> 
@@ -11648,7 +11685,8 @@ return $ret;
 								The global attrubute "archivesort" will be considered. </li> <br> 
   
   <a name="executeAfterProc"></a>
-  <li><b>executeAfterProc </b> - you can specify a FHEM-command which should be executed <b>after dump</b>. <br>
+  <li><b>executeAfterProc </b> - you can specify a FHEM command or perl function which should be executed 
+                                 <b>after command execution</b>. <br>
                                  Perl functions have to be enclosed in {} .<br><br>
 
                                 <ul>
@@ -11672,8 +11710,9 @@ sub adump {
 </li>
   
   <a name="executeBeforeProc"></a>
-  <li><b>executeBeforeProc </b> - you can specify a FHEM-command which should be executed <b>before dump</b>. <br>
-                                  Perl functions have to be enclosed in {} .<br><br>
+  <li><b>executeBeforeProc </b> - you can specify a FHEM command or perl function which should be executed 
+                                 <b>before command execution</b>. <br>
+                                 Perl functions have to be enclosed in {} .<br><br>
 
                                 <ul>
 							    <b>Example:</b> <br><br>
@@ -11963,12 +12002,38 @@ sub bdump {
 							   <br><br>
 
   <a name="timestamp_begin"></a>							   
-  <li><b>timestamp_begin </b> - begin of data selection (*)  </li> <br>
+  <li><b>timestamp_begin </b> - begin of data selection  </li> <br>
+  
+  The format of timestamp is as used with DbLog "YYYY-MM-DD HH:MM:SS". For the attributes "timestamp_begin", "timestamp_end" 
+  you can also use one of the following entries. The timestamp-attribute will be dynamically set to: <br><br>
+                              <ul>
+                              <b>current_year_begin</b>     : matches "&lt;current year&gt;-01-01 00:00:00"         <br>
+                              <b>current_year_end</b>       : matches "&lt;current year&gt;-12-31 23:59:59"         <br>
+                              <b>previous_year_begin</b>    : matches "&lt;previous year&gt;-01-01 00:00:00"        <br>
+                              <b>previous_year_end</b>      : matches "&lt;previous year&gt;-12-31 23:59:59"        <br>
+                              <b>current_month_begin</b>    : matches "&lt;current month first day&gt; 00:00:00"    <br>
+                              <b>current_month_end</b>      : matches "&lt;current month last day&gt; 23:59:59"     <br>
+                              <b>previous_month_begin</b>   : matches "&lt;previous month first day&gt; 00:00:00"   <br>
+                              <b>previous_month_end</b>     : matches "&lt;previous month last day&gt; 23:59:59"    <br>
+                              <b>current_week_begin</b>     : matches "&lt;first day of current week&gt; 00:00:00"  <br>
+                              <b>current_week_end</b>       : matches "&lt;last day of current week&gt; 23:59:59"   <br>
+                              <b>previous_week_begin</b>    : matches "&lt;first day of previous week&gt; 00:00:00" <br>
+                              <b>previous_week_end</b>      : matches "&lt;last day of previous week&gt; 23:59:59"  <br>
+                              <b>current_day_begin</b>      : matches "&lt;current day&gt; 00:00:00"                <br>
+                              <b>current_day_end</b>        : matches "&lt;current day&gt; 23:59:59"                <br>
+                              <b>previous_day_begin</b>     : matches "&lt;previous day&gt; 00:00:00"               <br>
+                              <b>previous_day_end</b>       : matches "&lt;previous day&gt; 23:59:59"               <br>
+                              <b>current_hour_begin</b>     : matches "&lt;current hour&gt;:00:00"                  <br>
+                              <b>current_hour_end</b>       : matches "&lt;current hour&gt;:59:59"                  <br>
+                              <b>previous_hour_begin</b>    : matches "&lt;previous hour&gt;:00:00"                 <br>
+                              <b>previous_hour_end</b>      : matches "&lt;previous hour&gt;:59:59"                 <br> 
+                              </ul>
+                              <br><br>
 
   <a name="timestamp_end"></a>  
-  <li><b>timestamp_end </b>   - end of data selection. If not set the current date/time combination will be used. (*) </li> <br>
+  <li><b>timestamp_end </b>   - end of data selection. If not set the current date/time combination will be used.  </li> <br>
   
-  (*) The format of timestamp is as used with DbLog "YYYY-MM-DD HH:MM:SS". For the attributes "timestamp_begin", "timestamp_end" 
+  The format of timestamp is as used with DbLog "YYYY-MM-DD HH:MM:SS". For the attributes "timestamp_begin", "timestamp_end" 
   you can also use one of the following entries. The timestamp-attribute will be dynamically set to: <br><br>
                               <ul>
                               <b>current_year_begin</b>     : matches "&lt;current year&gt;-01-01 00:00:00"         <br>
@@ -12010,7 +12075,7 @@ sub bdump {
   <br><br>
 
   <a name="timeDiffToNow"></a>  
-  <li><b>timeDiffToNow </b>   - the <b>begin</b> of data selection will be set to the timestamp <b>"&lt;current time&gt; - 
+  <li><b>timeDiffToNow </b>   - the <b>begin time </b> of data selection will be set to the timestamp <b>"&lt;current time&gt; - 
                                 &lt;timeDiffToNow&gt;"</b> dynamically (e.g. if set to 86400, the last 24 hours are considered by data 
 								selection). The time period will be calculated dynamically at execution time.     </li> <br> 
 
@@ -12029,15 +12094,39 @@ sub bdump {
 								<code>attr &lt;name&gt; timeDiffToNow y:1.5</code> <br>
                                 # the start time is set to "current time - 1.5 years" <br>
 								</ul>
-								<br><br>								
+								<br>
+                                
+                                If both attributes "timeDiffToNow" and "timeOlderThan" are set, the selection  
+                                period will be calculated between of these timestamps dynamically.
+                                <br><br> 								
 
   <a name="timeOlderThan"></a>
-  <li><b>timeOlderThan </b>   - the <b>end</b> of data selection will be set to the timestamp <b>"&lt;aktuelle Zeit&gt; - 
+  <li><b>timeOlderThan </b>   - the <b>end time</b> of data selection will be set to the timestamp <b>"&lt;aktuelle Zeit&gt; - 
                                 &lt;timeOlderThan&gt;"</b> dynamically. Always the datasets up to timestamp 
 								"&lt;current time&gt; - &lt;timeOlderThan&gt;" will be considered (e.g. if set to 
 								86400, all datasets older than one day are considered). The time period will be calculated dynamically at 
-								execution time. <br>
-								The valid input format for attribute "timeOlderThan" is identical to attribute "timeDiffToNow". </li> <br> 
+								execution time. </li> <br> 
+                                
+                                <ul>
+							    <b>Examples for input format:</b> <br>
+								<code>attr &lt;name&gt; timeOlderThan 86400</code> <br>
+                                # the selection end time is set to "current time - 86400 seconds" <br>
+								<code>attr &lt;name&gt; timeOlderThan d:2 h:3 m:2 s:10</code> <br>
+                                # the selection end time is set to "current time - 2 days 3 hours 2 minutes 10 seconds" <br>							
+								<code>attr &lt;name&gt; timeOlderThan m:600</code> <br> 
+                                # the selection end time is set to "current time - 600 minutes" gesetzt <br>
+								<code>attr &lt;name&gt; timeOlderThan h:2.5</code> <br>
+                                # the selection end time is set to "current time - 2,5 hours" <br>
+								<code>attr &lt;name&gt; timeOlderThan y:1 h:2.5</code> <br>
+                                # the selection end time is set to "current time - 1 year and 2,5 hours" <br>
+								<code>attr &lt;name&gt; timeOlderThan y:1.5</code> <br>
+                                # the selection end time is set to "current time - 1.5 years" <br>
+								</ul>
+								<br>
+                                
+                                If both attributes "timeDiffToNow" and "timeOlderThan" are set, the selection  
+                                period will be calculated between of these timestamps dynamically.
+                                <br><br> 
 
   <a name="timeout"></a>
   <li><b>timeout </b>         - set the timeout-value for Blocking-Call Routines in background in seconds (default 86400)  </li> <br>
@@ -12086,8 +12175,9 @@ sub bdump {
   
   <a name="valueFilter"></a>  
   <li><b>valueFilter </b>     - Regular expression to filter datasets within particular functions. The regex is  
-                                applied to the whole selected dataset (inclusive Device, Reading and so on). 
-                                Please compare to explanations of relevant set-commands. </li> <br> 
+                                applied to a particular field or to the whole selected dataset (inclusive Device, Reading and 
+                                so on). 
+                                Please consider the explanations within the set-commands. </li> <br> 
 							   
 </ul>
 </ul></ul>
@@ -25095,6 +25185,13 @@ Step C0 C1<br>
 		<li><b>set &lt;name&gt; on-for-timer [{ &lt;Seconds&gt; | <u>forever</u> | off }]</b><br/>
 			Set timer for display. Default is forever.
 		</li><br/>
+		<li><b>set &lt;name&gt; photo</b><br/>
+			Take a picture with device cam. Setting motion detection must be enabled. Picture
+			can be viewed in remote admin interface under device info.
+		</li><br/>
+		<li><b>set &lt;name&gt; playSound &lt;url&gt; [loop]</b><br/>
+			Play sound from URL.
+		</li><br/>
 		<li><b>set &lt;name&gt; restart</b><br/>
 			Restart Fully.
 		</li><br/>
@@ -25117,9 +25214,16 @@ Step C0 C1<br>
 		<li><b>set &lt;name&gt; startURL &lt;URL&gt;</b><br/>
 			Show this URL when FULLY starts.<br/>
 		</li><br/>
+		<li><b>set &lt;name&gt; stopSound</b><br/>
+			Stop playback of sound if playback has been started with option <i>loop</i>.
+		</li><br/>
 		<li><b>set &lt;name&gt; url [&lt;URL&gt;]</b><br/>
 			Navigate to <i>URL</i>. If no URL is specified navigate to start URL.
 		</li><br/>
+		<li><b>set &lt;name&gt; volume &lt;level&gt; &lt;stream&gt;</b><br/>
+			Set audio volume. Range of parameter <i>level</i> is 0-100, range of parameter
+			<i>stream</i> is 1-10. 
+		</li><br/>
    </ul>
    <br/>
    
@@ -56455,12 +56559,16 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
     </pre>
     
     The password length has a maximum of 20 characters. <br> 
-	The operator can, dependend on what functions are planned to execute, create an user in DSM respectively in Synology Surveillance Station as well. <br>
-    If the user is member of admin-group, he has access to all module functions. Without this membership the user can only execute functions with lower need of rights. <br>
+	The operator can, dependend on what functions are planned to execute, create an user in DSM respectively in Synology 
+    Surveillance Station as well. <br>
+    If the user is member of admin-group, he has access to all module functions. Without this membership the user can only 
+    execute functions with lower need of rights. <br>
     The required minimum rights to execute functions are listed in a table further down. <br>
     
-    Alternatively to DSM-user a user created in SVS can be used. Also in that case a user of type "manager" has the right to execute all functions, <br>
-    whereat the access to particular cameras can be restricted by the privilege profile (please see help function in SVS for details).  <br>
+    Alternatively to DSM-user a user created in SVS can be used. Also in that case a user of type "manager" has the right to 
+    execute all functions, <br>
+    whereat the access to particular cameras can be restricted by the privilege profile (please see help function in SVS for 
+    details).  <br>
     As best practice it is proposed to create an user in DSM as well as in SVS too:  <br><br>
     
     <ul>
@@ -56469,13 +56577,16 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
     </ul>
     <br>
     
-    Using the <a href="#SSCamattr">Attribute</a> "session" can be selected, if the session should be established to DSM or the SVS instead. <br>
-    If the session will be established to DSM, SVS Web-API methods are available as well as further API methods of other API's what possibly needed for processing. <br><br>
+    Using the <a href="#SSCamattr">Attribute</a> "session" can be selected, if the session should be established to DSM or the 
+    SVS instead. Further informations about user management in SVS are available by execute  
+    "get &lt;name&gt; versionNotes 5".<br>
+    If the session will be established to DSM, SVS Web-API methods are available as well as further API methods of other API's 
+    what possibly needed for processing. <br><br>
     
     After device definition the default is "login to DSM", that means credentials with admin rights can be used to test all camera-functions firstly. <br>
     After this the credentials can be switched to a SVS-session with a restricted privilege profile as needed on dependency what module functions are want to be executed. <br><br>
     
-    The following list shows the minimum rights what the particular module function needs. <br><br>
+    The following list shows the <b>minimum rights</b> that the particular module function needs. <br><br>
     <ul>
       <table>
       <colgroup> <col width=20%> <col width=80%> </colgroup>
@@ -56488,7 +56599,7 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
       <tr><td><li>set ... expmode            </td><td> session: ServeillanceStation - manager       </li></td></tr>
       <tr><td><li>set ... extevent           </td><td> session: DSM - user as member of admin-group   </li></td></tr>
       <tr><td><li>set ... goPreset           </td><td> session: ServeillanceStation - observer with privilege objective control of camera  </li></td></tr>
-      <tr><td><li>set ... homeMode           </td><td> ssession: ServeillanceStation - observer with privilege Home Mode switch  </li></td></tr>
+      <tr><td><li>set ... homeMode           </td><td> ssession: ServeillanceStation - observer with privilege Home Mode switch (valid for <b>SVS-device ! </b>) </li></td></tr>
 	  <tr><td><li>set ... motdetsc           </td><td> session: ServeillanceStation - manager       </li></td></tr>
 	  <tr><td><li>set ... runPatrol          </td><td> session: ServeillanceStation - observer with privilege objective control of camera  </li></td></tr>
       <tr><td><li>set ... goAbsPTZ           </td><td> session: ServeillanceStation - observer with privilege objective control of camera  </li></td></tr>
@@ -56511,11 +56622,13 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
       <tr><td><li>get ... stmUrlPath         </td><td> session: ServeillanceStation - observer    </li></td></tr>      
       </table>
     </ul>
-      <br><br>
+    <br><br>
+    </ul>
     
-    <a name="SSCam_HTTPTimeout"></a>
-    <b>HTTP-Timeout Settings</b><br><br>
+<a name="SSCam_HTTPTimeout"></a>
+<b>HTTP-Timeout Settings</b><br><br>
     
+  <ul>  
     All functions of SSCam use HTTP-calls to SVS Web API. <br>
     The default-value of HTTP-Timeout amounts 4 seconds. You can set the <a href="#SSCamattr">attribute</a> "httptimeout" > 0 to adjust the value as needed in your technical environment. <br>
     
@@ -57230,9 +57343,19 @@ http(s)://&lt;hostname&gt;&lt;port&gt;/webapi/entry.cgi?api=SYNO.SurveillanceSta
   
   Determines common informations about the installed SVS-version and other properties. <br>
   </ul>
-  <br><br>  
+  <br><br> 
+
+  <ul>
+  <li><b> get &lt;name&gt; versionNotes [hints | rel | &lt;key&gt;] </b> &nbsp;&nbsp;&nbsp;&nbsp;(valid for CAM/SVS)</li> <br>
   
+  Shows realease informations and/or hints about the module. It contains only main release informations for module users. <br>
+  If no options are specified, both release informations and hints will be shown. "rel" shows only release informations and
+  "hints" shows only hints. By the &lt;key&gt;-specification only the hint with the specified number is shown.
+  </ul>
+  <br><br>   
   
+  
+  <a name="SSCamPolling"></a>
   <b>Polling of Camera/SVS-Properties</b><br><br>
   <ul>
   Retrieval of Camera-Properties can be done automatically if the attribute "pollcaminfoall" will be set to a value &gt; 10. <br>
@@ -57297,12 +57420,15 @@ http(s)://&lt;hostname&gt;&lt;port&gt;/webapi/entry.cgi?api=SYNO.SurveillanceSta
   
   <ul>
   <ul>
+  <a name="debugactivetoken"></a>
   <li><b>debugactivetoken</b><br>
     if set the state of active token will be logged - only for debugging, don't use it in normal operation ! </li><br>
   
+  <a name="disable"></a>
   <li><b>disable</b><br>
     deactivates the device definition </li><br>
     
+  <a name="genericStrmHtmlTag"></a>
   <li><b>genericStrmHtmlTag</b><br>
   This attribute contains HTML-Tags for video-specification in a Streaming-Device of type "generic". 
   (see also "set &lt;name&gt; createStreamDev generic") <br><br> 
@@ -57319,10 +57445,12 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
     <br><br>
     </li>
   
+  <a name="httptimeout"></a>
   <li><b>httptimeout</b><br>
     Timeout-Value of HTTP-Calls to Synology Surveillance Station, Default: 4 seconds (if httptimeout = "0" 
 	or not set) </li><br>
   
+  <a name="htmlattr"></a>
   <li><b>htmlattr</b><br>
     additional specifications to inline oictures to manipulate the behavior of stream, e.g. size of the image.	</li><br>
 	
@@ -57332,32 +57460,40 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
         </ul>
 		<br>
   
+  <a name="livestreamprefix"></a>
   <li><b>livestreamprefix</b><br>
     overwrites the specifications of protocol, servername and port for further use of the livestream address, e.g. 
 	as an link to external use. It has to be specified as "http(s)://&lt;servername&gt;:&lt;port&gt;"  </li><br>
 
+  <a name="loginRetries"></a>
   <li><b>loginRetries</b><br>
-    set the amount of login-repetitions in case of failure (default = 1)   </li><br>
+    set the amount of login-repetitions in case of failure (default = 3)   </li><br>
   
+  <a name="noQuotesForSID"></a>
   <li><b>noQuotesForSID</b><br>
-    this attribute may be helpfull in some cases to avoid errormessage "402 - permission denied" and makes login 
+    this attribute may be helpful in some cases to avoid errormessage "402 - permission denied" and makes login 
 	possible.  </li><br>
   
+  <a name="pollcaminfoall"></a>
   <li><b>pollcaminfoall</b><br>
     Interval of automatic polling the Camera properties (if <= 10: no polling, if &gt; 10: polling with interval) </li><br>
 
+   <a name="pollnologging"></a>
   <li><b>pollnologging</b><br>
     "0" resp. not set = Logging device polling active (default), "1" = Logging device polling inactive</li><br>
-    
+   
+  <a name="ptzPanel_Home"></a>
   <li><b>ptzPanel_Home</b><br>
     In the PTZ-control panel the Home-Icon (in attribute "ptzPanel_row02") is automatically assigned to the value of 
     Reading "PresetHome".
     With "ptzPanel_Home" you can change the assignment to another preset from the available Preset list. </li><br> 
-    
+  
+  <a name="ptzPanel_iconPath"></a>  
   <li><b>ptzPanel_iconPath</b><br>
     Path for icons used in PTZ-control panel, default is "www/images/sscam". 
     The attribute value will be used for all icon-files except *.svg. </li><br> 
 
+  <a name="ptzPanel_iconPrefix"></a>
   <li><b>ptzPanel_iconPrefix</b><br>
     Prefix for icons used in PTZ-control panel, default is "black_btn_". 
     The attribute value will be used for all icon-files except *.svg. <br>
@@ -57365,6 +57501,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
     attributes "ptzPanel_row[00-09]" just with the subsequent part of name, e.g. "CAMDOWN.png".
     </li><br>   
 
+  <a name="ptzPanel_row00"></a>
   <li><b>ptzPanel_row[00-09] &lt;command&gt;:&lt;icon&gt;,&lt;command&gt;:&lt;icon&gt;,... </b><br>
     For PTZ-cameras the attributes "ptzPanel_row00" to "ptzPanel_row04" are created automatically for usage by 
     the PTZ-control panel. <br>
@@ -57375,9 +57512,8 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
     If needed the assignment for Home-button in "ptzPanel_row02" can be changed by attribute "ptzPanel_Home". <br>
     The icons are searched in path "ptzPanel_iconPath". The value of "ptzPanel_iconPrefix" is prepend to the icon filename.
     Own extensions of the PTZ-control panel can be done using the attributes "ptzPanel_row05" to "ptzPanel_row09". 
-    For creation of own icons a template is provided in the SVN: 
-    <a href="https://svn.fhem.de/trac/browser/trunk/fhem/contrib/sscam">contrib/sscam/black_btn_CAM_Template.pdn</a>. This
-    template can be edited by e.g. Paint.Net.  <br><br>
+    For creation of own icons a template is provided in the SVN. Further information can be get by "get &lt;name&gt; versionNotes 2". 
+    <br><br>
     
     <b>Note:</b> <br>
     For an empty field please use ":CAMBLANK.png" respectively ":CAMBLANK.png,:CAMBLANK.png,:CAMBLANK.png,..." for an empty 
@@ -57392,25 +57528,33 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
 		<br>
     </li><br>      
 
+  <a name="ptzPanel_use"></a>
   <li><b>ptzPanel_use</b><br>
     Switch the usage of a PTZ-control panel in detail view respectively a created StreamDevice off or on 
     (default: on). </li><br> 
   
+  <a name="rectime"></a>
   <li><b>rectime</b><br>
    determines the recordtime when a recording starts. If rectime = 0 an endless recording will be started. If 
    it isn't defined, the default recordtime of 15s is activated </li><br>
   
+  <a name="recextend"></a>
   <li><b>recextend</b><br>
     "rectime" of a started recording will be set new. Thereby the recording time of the running recording will be 
 	extended </li><br>
   
+  <a name="session"></a>
   <li><b>session</b><br>
     selection of login-Session. Not set or set to "DSM" -&gt; session will be established to DSM (Sdefault). 
-	"SurveillanceStation" -&gt; session will be established to SVS </li><br>
+	"SurveillanceStation" -&gt; session will be established to SVS. <br>
+    For establish a sesion with Surveillance Station you have to create a user with suitable privilege profile in SVS.
+    If you need more infomations please execute "get &lt;name&gt; versionNotes 5".    </li><br>
   
+  <a name="simu_SVSversion"></a>
   <li><b>simu_SVSversion</b><br>
     simulates another SVS version. (only a lower version than the installed one is possible !)  </li><br>
-	
+    
+  <a name="snapGalleryBoost"></a>
   <li><b>snapGalleryBoost</b><br>
     If set, the last snapshots (default 3) will be retrieved by Polling, will be stored in the FHEM-servers main memory
     and can be displayed by the "set/get ... snapGallery" command. <br>
@@ -57418,9 +57562,11 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
 	If the attribute is set, you can't specify arguments in addition to the "set/get ... snapGallery" command. 
     (see also attribut "snapGalleryNumber") </li><br>
   
+  <a name="snapGalleryColumns"></a>
   <li><b>snapGalleryColumns</b><br>
     The number of snapshots which shall appear in one row of the gallery popup (default 3). </li><br>
 	
+  <a name="snapGalleryHtmlAttr"></a>
   <li><b>snapGalleryHtmlAttr</b><br>
     the image parameter can be controlled by this attribute. <br>
 	If the attribute isn't set, the value of attribute "htmlattr" will be used. <br>
@@ -57432,26 +57578,32 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
         </ul>
 		<br>
         </li>
-		
+	
+  <a name="snapGalleryNumber"></a>	
   <li><b>snapGalleryNumber</b><br>
     The number of snapshots to retrieve (default 3). </li><br>
 	
+  <a name="snapGallerySize"></a>
   <li><b>snapGallerySize</b><br>
      By this attribute the quality of the snapshot images can be controlled (default "Icon"). <br>
 	 If mode "Full" is set, the images are retrieved with their original available resolution. That requires more ressources 
 	 and may slow down the display. By setting attribute "snapGalleryBoost=1" the display may accelerated, because in that case
 	 the images will be retrieved by continuous polling and need only bring to display. </li><br>
   
+  <a name="showStmInfoFull"></a>
   <li><b>showStmInfoFull</b><br>
     additional stream informations like LiveStreamUrl, StmKeyUnicst, StmKeymjpegHttp will be created  </li><br>
   
+  <a name="showPassInLog"></a>
   <li><b>showPassInLog</b><br>
     if set the used password will be shown in logfile with verbose 4. (default = 0) </li><br>
   
+  <a name="videofolderMap"></a>
   <li><b>videofolderMap</b><br>
     replaces the content of reading "VideoFolder", Usage if e.g. folders are mountet with different names than original 
 	(SVS) </li><br>
   
+  <a name="verbose"></a>
   <li><b>verbose</b></li><br>
   
   <ul>
@@ -59575,6 +59727,262 @@ set Siro1 set_favorite               programs the current roll position as hardw
     </ul>
 </ul>
 
+<p><a name="SmarterCoffee"></a>
+<h3>SmarterCoffee</h3>
+<div class='langLinks'>[EN <a href='commandref_DE.html#SmarterCoffee'>DE</a>]</div>
+<ul>
+    Integrates the equally called Wi-Fi coffee machine (<code>http://smarter.am/</code>) with FHEM.
+    <br><br>
+    <i>Prerequisite</i>:<br>
+    Make sure the machine can be controlled by the smarter mobile app when both are connected to the same network as fhem.<br>
+    If in doubt check the official documentation or official support forum to get help with integrating the coffee machine into your network.
+</ul>
+<br>
+
+<a name="SmarterCoffeedefine"></a>
+<b>Define</b>
+<ul>
+    <code>define &lt;name&gt; SmarterCoffee (&lt;hostname&gt;)</code>
+    <br><br>
+    Hostname is optional, if omitted the name is auto-detected via UDP broadcast.
+    <br><br>
+    Examples:<ul>
+    <li><code>define coffee-machine SmarterCoffee</code><br>
+        Connects with the first coffee machine that answers the UDP broadcast.</li><br>
+    <li><code>define coffee-machine SmarterCoffee smarter-coffee.fritz.box</code><br>
+        Connects with the coffee machine at address 'smarter-coffee.fritz.box'.</li><br>
+    <li><code>define coffee-machine SmarterCoffee 192.168.2.56:2081</code><br>
+        Connects with the coffee machine at '192.168.2.56' using port 2081 (= default)</li>
+    </ul>
+</ul>
+<br>
+
+<a name="SmarterCoffeereadings"></a>
+<b>Readings</b><br>
+<ul>
+    <li>
+        <code>state</code><br>
+        Device state, can be one of:<ul>
+            <li><code>disconnected</code>: No connection to coffee machine.</li>
+            <li><code>opened / connected</code>: Intermediate states after connection has been established but before the machine's state is known.</li>
+            <li><code>invalid</code>: The connected device is not a coffee machine.</li>
+            <li><code>ready</code>: Ready to start brewing.</li>
+            <li><code>grinding</code>: Grinding coffee.</li>
+            <li><code>brewing</code>: Brewing coffee.</li>
+            <li><code>done</code>: Done brewing.</li>
+            <li><code>heating</code>: Keeping coffee warm or reheating.</li>
+            <li><code>maintenance</code>: Maintenance is needed to get ready for brewing (e.g. water or carafe is missing).</li>
+        </ul>
+    </li><br>
+    <li>
+        <code>hotplate_on_for_minutes</code><br>
+        Shows the number of minutes that the hotplate will be on when it was turned on via "<code>set &lt;name&gt; hotplate</code>"
+        or "<code>set &lt;name&gt; brew</code>".</li><br>
+    <li>
+        <code>carafe</code><br>
+        One of "<code>present</code>" or "<code>missing</code>" as the carafe is detected as being present or not.<br>
+        (<code>state</code> <code>ready</code> turns to <code>maintenance</code> when carafe is missing and <code>carafe_required</code> is <code>yes</code>)</li><br>
+    <li>
+        <code>carafe_required</code><br>
+        Is "<code>yes</code>" or "<code>no</code>" as the carafe is required to start brewing or not.<br>
+        This option can be configured via the smarter mobile app. Read disclaimer before turning off carafe detection.</li><br>
+    <li>
+        <code>cups_max</code><br>
+        The estimated maximum brewable cups when taking current water level into account.</li><br>
+    <li>
+        <code>cups_single_mode</code><br>
+        Is "<code>yes</code>" or "<code>no</code>" as the single cup mode is active or not.<br>
+        This option can be configured via the smarter mobile app.
+        When enabled "<code>set &lt;name&gt; brew</code>" will not enable the hotplate and "<code>cups_max</code>" is limited to <code>3</code>.
+        In single cup mode, cups [1,2,3] is used for one [small,medium,large] cup.</li><br>
+    <li>
+        <code>water</code> and <code>water_level</code><br>
+        Is [<code>none, low, half, full</code>] and [<code>0, 25, 50, 100</code>] indicating the amount of water that remains in the tank.<br>
+        (<code>state</code> <code>ready</code> turns to <code>maintenance</code> when <code>water_level</code> is "<code>0</code>")</li><br>
+    <li>
+        <code>last_command.*</code><br>
+        Is updated with the last executed <code>set</code> or <code>get</code> command string, including device response and success information.</li><br>
+    <li>
+        Further readings match <code>set</code> commands and reflect the corresponding machine state. See <i>Set</i> section below.</li><br>
+</ul>
+
+<a name="SmarterCoffeeget"></a>
+<b>Get</b><br>
+<ul>
+    <li>
+        <code>get &lt;name&gt; info</code><br>
+        Retrieves firmware &amp; device type information and updates internals.</li><br>
+    <li>
+        <code>get &lt;name&gt; carafe_required_status</code><br>
+        Retrieves whether carafe is required for brewing and updates reading "carafe_required".</li><br>
+    <li>
+        <code>get &lt;name&gt; cups_single_mode_status</code><br>
+        Retrieves whether single cup mode is active and updates reading "cups_single_mode".</li><br>
+    <li>
+        <code>get &lt;name&gt; get_defaults</code><br>
+        Retrieves and applies previously set machine defaults. Triggers the event "defaults" after retrieval but before applying them.</li><br>
+</ul>
+
+<a name="SmarterCoffeeset"></a>
+<b>Set</b><br>
+<ul>
+    <li>
+        <code>set &lt;name&gt; brew</code><br>
+        Start brewing with settings displayed in readings and "<code>default-hotplate-on-for-minutes</code>" for hotplate.</li>
+    <li>
+        <code>set &lt;name&gt; brew current</code><br>
+        Start brewing with current machine settings.</li>
+    <li>
+        <code>set &lt;name&gt; brew [1 - 12] ([weak, medium, strong, extra]) ([5-40]) ([enabled, disabled])</code><br>
+        Start brewing the specified amount of cups at optionally specified strength, hotplate and grinder with non-specified settings used from readings
+        and "<code>default-hotplate-on-for-minutes</code>" for hotplate.
+        <p></p>
+        E.g. "<code>set &lt;name&gt; brew 5 medium</code>" brews 5 cups of medium coffee reusing current hotplate and grinder settings.</li><br>
+    <li>
+        <code>set &lt;name&gt; defaults ([1 - 12]) ([weak, medium, strong]) ([5-40]) ([enabled, disabled])</code><br>
+        Sets the machine defaults to the current settings optionally overridden by specified amount of cups, strength, hotplate and grinder.
+        Non-specified settings are used from readings and "<code>default-hotplate-on-for-minutes</code>" for hotplate.<br>
+        Note: Machine defaults are applied by the coffee machine after every brew and when stopping or turning off.
+        Readings are updated accordingly when defaults are applied.
+        <p></p>
+        E.g. "<code>set &lt;name&gt; defaults 5 medium</code>" sets defaults to 5 cups of medium coffee and reuses current hotplate and grinder settings
+        as future defaults.</li><br>
+    <li>
+        <code>set &lt;name&gt; stop</code><br>
+        Stop brewing and disable hotplate if on.</li><br>
+    <li>
+        <code>set &lt;name&gt; strength [weak, medium, strong, extra]</code><br>
+        Toggles the strength via the amount of coffee beans to use per cup when grinding.
+        <p></p>
+        The strength "<code>extra</code>" is special in that it is not natively supported by the machine itself.
+        To brew coffee with "extra" strength a custom sequence similar to the following is started:<br>
+        <code>set &lt;name&gt; brew &lt;cups + 1&gt; strong on enabled ;; sleep &lt;cups * 1.5&gt; ;; set &lt;name&gt; stop ;; set &lt;name&gt; brew &lt;cups&gt; on disabled</code>.<br>
+        See also attributes "<code>strength-extra-percent</code>" and "<code>strength-coffee-weights</code>" which control the calculation
+        of actual strength and cup counts.</li><br>
+    <li>
+        <code>set &lt;name&gt; grinder [enabled, disabled]</code><br>
+        Toggles whether grinder is used when brewing coffee.
+        Ground coffee has to be added manually to the filter and strength settings are ignored when grinder is disabled.</li><br>
+    <li>
+        <code>set &lt;name&gt; cups [1 - 12]</code><br>
+        Toggles the amount of cups (~100ml) to brew.</li><br>
+    <li>
+        <code>set &lt;name&gt; [1 - 12]-cups</code><br>
+        Is an alias to "<code>set &lt;name&gt; brew [1 - 12]</code>".
+        This adds support for web commands like "8-cups" and "3-cups,strong".</li><br>
+    <li>
+        <code>set &lt;name&gt; hotplate &lt;command&gt;</code><br>
+        Toggles the hotplate that keeps the coffee warm after brewing.
+        <br><br>
+        &lt;command&gt; is one of:<ul>
+            <li><code>on</code><br>On for "<code>default-hotplate-on-for-minutes</code>" minutes (defaults to 15 minutes)</li>
+            <li><code>on [5 - 40]</code><br>On for the specified amount of minutes</li>
+            <li><code>off</code></li>
+        </ul>
+    </li><br>
+    <li>
+        <code>set &lt;name&gt; hotplate_on_for_minutes [5 - 40]</code><br>
+        Is an alias to "<code>set &lt;name&gt; hotplate on [5 - 40]</code>".</li><br>
+    <li>
+        <code>set &lt;name&gt; reconnect</code><br>
+        Disconnects, optionally runs discovery (if hostname or address was omitted in the device definition) and reconnects.</li><br>
+    <li>
+        <code>set &lt;name&gt; reset</code><br>
+        Resets machine to factory default, excluding WLAN settings.</li><br>
+</ul>
+
+<a name="SmarterCoffeeattr"></a>
+<b>Attributes</b><br>
+<ul>
+    <li>
+        <code>attr &lt;name&gt; devStateIcon { SmarterCoffee::GetDevStateIcon($name) }</code>
+        <br><br>
+        The function <code>SmarterCoffee::GetDevStateIcon($name[, "...colors..."])</code> renders a custom dev state icon that displays
+        the machine states (ready, brewing, done) and shows information on carafe, hotplate and water level.
+        <br><br>
+        The icon is monochrome using a default color that may change to highlight states: ready, brewing, done.
+        Built-in colors can be adjusted with the second parameter of <code>SmarterCoffee::GetDevStateIcon</code>.<br>
+        E.g. using "<code>attr &lt;name&gt; devStateIcon { SmarterCoffee::GetDevStateIcon($name, '#7b7b7b green chocolate #336699' }</code>"
+        sets colors for default, ready, brewing and done.
+        <br><br>
+        Colors are specified as HTML color values delimited by whitespace using a fixed order of "default ready brewing done".
+        Use '-' or '0' to substitute a color with the built-in or the default color within the color sequence. E.g. a color sequence of 'blue - 0 0' uses
+        blue for all states except "ready" which uses the built-in color green.</li><br>
+    <li>
+        <code>attr &lt;name&gt; default-hotplate-on-for-minutes 15</code><br>
+        Defines how long the hotplate is heating coffee when turning it on without specifying a time or when brewing coffee without
+        specifying a valid time value for hotplate.<br>
+        Values of 15, 5 or 40 minutes are used as this attribute is not specified, invalid or greater than 40 (5 <= x <= 40, with x defaulting to 15).
+        <br><br>
+        In addition to a fixed value, the hotplate can also be turned on relative to the number of cups that are brewed.
+        E.g. setting a value of "<code>15 5=20 10=35</code>" means: 15 from 1 to 4 cups, 20 from 5 cups and 35 from 10 cups.</li><br>
+    <li>
+        <code>attr &lt;name&gt; ignore-max-cups [1, 0]</code><br>
+        Toggles whether the reading "<code>cups_max</code>" influences the state "<code>ready</code>".
+        By default "<code>attr &lt;name&gt; ignore-max-cups 1</code>" is assumed which means that the state "<code>ready</code>" is not
+        related to "<code>cups_max</code>" if this attribute is not set. Set this attribute to "0" if the state should turn to "<code>maintenance</code>"
+        when the selected cup count is larger than "<code>cups_max</code>".</li><br>
+    <li>
+        <code>attr &lt;name&gt; set-on-brews-coffee [0, 1]</code><br>
+        Toggles whether the command "<code>set &lt;name&gt; on</code>" is an alias to "<code>set &lt;name&gt; brew</code>".
+        By default this is disabled to avoid accidental coffee brewing.</li><br>
+    <li>
+        <code>attr &lt;name&gt; strength-extra-percent 1.4</code><br>
+        Specifies the percentage of coffee to use relative to strength "<code>strong</code>" when brewing coffee with <code>extra</code> strength.
+        A value of "<code>1.4</code>" brews coffee that is 140% the strength of "<code>strong</code>" respectively "<code>0.6</code>" brews coffee that
+        is 60% the strength. Setting <code>strength-extra-percent</code> to <code>0</code> disables support for extra strength.
+        <br><br>
+        Note: Brewing coffee with <code>extra</code> strength uses strengths and cup counts natively supported by the machine and the configured percentage
+        is likely not matched exactly.
+        Best results are achieved with 4 - 8 cups and a full water tank as it allows to use most variations to get close to the target.</li><br>
+    <li>
+        <code>attr &lt;name&gt; strength-extra-pre-brew-delay-seconds 0</code><br>
+        Specifies a delay in seconds when brewing coffee with extra strength which is used to split the brewing operation in a pre-brew
+        and the normal brew phase. The pre-brew phase brews a small amount of cups (usually 1) and pauses for a couple of seconds
+        before continuing with the rest of the cups.
+        This mode can help to overcome limitations with grounds being too coarse to provide good taste at standard brewing speed.
+        Specifying 0 disables "pre-brew".
+        </li><br>
+    <li>
+        <code>attr &lt;name&gt; strength-extra-pre-brew-cups 1</code><br>
+        Specifies the number of cups that are brewed first before delaying brewing in extra mode. Specifying 0 disables "pre-brew".
+        </li><br>
+    <li>
+        <code>attr &lt;name&gt; strength-extra-start-on-device-strength [off, weak, medium, strong]</code><br>
+        Specifies a strength level that maps to strength 'extra' when starting brewing without grinder using the buttons at the coffee machine.
+        By default this option is set to "<code>off</code>" which means that strength 'extra' can only be used when starting brewing via FHEM.
+        <br>
+        E.g. a value of "<code>weak</code>" allows to brew coffee with extra strength by pressing the start button at the coffee machine
+        with strength set to "weak" and grinder set to "disabled" (= "Filter" in the display).
+        <br><br>
+        Note: Brewing started from FHEM is never affected by this setting.
+        </li><br>
+    <li>
+        <code>attr &lt;name&gt; strength-coffee-weights 3.5 3.9 4.3</code><br>
+        Is the amount of coffee that the grinder produces per cup depending on the selected strength. This setting does not control the amount it only
+        tells the module what the grinder will produce. Changing the default values is therefore only required if the coffee machine produces
+        different results on the actually used beans.<br>
+        The amounts are specified in grams per strength <code>[weak, medium, strong]</code> using whitespace as delimiter.
+        <br><br>
+        The purpose of this metric is to calculate the actual <code>strength</code> and <code>cups</code> to use when grinding coffee with
+        <code>extra</code> strength. E.g. for 140% extra strength, 4 cups require <tt style="white-space: nowrap">(4 * 4.3 * 1.4) = 24.08</tt>
+        gramms of coffee. In this example the closest match is grinding 7 cups with weak strength which produces <code>(7 * 3.5) = 24.5</code> gramms.
+        The actual brewing is then performed with 4 cups as originally requested.
+        <br><br>
+        The algorithm tries to find the closest matching cup counts and strength value towards the target amount of coffee required for
+        <code>extra</code> strength. It is technically not possible to control the amount of coffee directly, therefore the grams specified for the
+        different strengths are used select between natively supported strengths <code>weak, medium, strong</code> that match the desired target the closest.
+        Water level is also taken into account as cup count is truncated by the coffee machine when grinding, depending on the amount of available water.
+        Decisions may vary depending on cups and available water, keep water level at maximum to get best results.
+        <br><br>
+        Note: SCAE (Speciality Coffee Association of Europe) recommends ~6 gramms of coffee per cup. To come close, 140% is the default value for
+        <code>extra</code> strength assuming that the default values for <code>strength-coffee-weights</code> apply to the used coffee beans.
+        As the density of coffee beans differs these defaults may be inappropriate. To get better results with a certain kind of beans it may make
+        sense to measure the actual produced weights and adjust the values (<code>strength-coffee-weights</code> and <code>strength-extra-percent</code>)
+        accordingly.
+        </li><br>
+</ul>
+
 <p><a name="Snapcast"></a>
 <h3>Snapcast</h3>
 <div class='langLinks'>[EN <a href='commandref_DE.html#Snapcast'>DE</a>]</div>
@@ -62595,13 +63003,13 @@ KlikAanKlikUit, NEXA, CHACON, HomeEasy UK. <br> You need to define an RFXtrx433
 		You need to run kCoAPSocket running in background, that acts like a translator between FHEM and the Trådfri Gateway.
     </ul>
     <br>
-    
+
     <a name="TradfriGatewayset"></a>
     <b>Set</b><br>
     <ul>
         <code>set &lt;name&gt; &lt;option&gt; [&lt;value&gt;]</code>
         <br><br>
-        You can set the following options. See <a href="http://fhem.de/commandref.html#set">commandref#set</a> 
+        You can set the following options. See <a href="http://fhem.de/commandref.html#set">commandref#set</a>
         for more info about the set command.
         <br><br>
         Options:
@@ -62620,8 +63028,8 @@ KlikAanKlikUit, NEXA, CHACON, HomeEasy UK. <br> You need to define an RFXtrx433
     <ul>
         <code>get &lt;name&gt; &lt;option&gt;</code>
         <br><br>
-        You can get the following information about the device. See 
-        <a href="http://fhem.de/commandref.html#get">commandref#get</a> for more info about 
+        You can get the following information about the device. See
+        <a href="http://fhem.de/commandref.html#get">commandref#get</a> for more info about
         the get command.
 		<br><br>
         Options:
@@ -62633,13 +63041,13 @@ KlikAanKlikUit, NEXA, CHACON, HomeEasy UK. <br> You need to define an RFXtrx433
         </ul>
     </ul>
     <br>
-    
+
     <a name="TradfriGatewayattr"></a>
     <b>Attributes</b>
     <ul>
         <code>attr &lt;name&gt; &lt;attribute&gt; &lt;value&gt;</code>
         <br><br>
-        See <a href="http://fhem.de/commandref.html#attr">commandref#attr</a> for more info about 
+        See <a href="http://fhem.de/commandref.html#attr">commandref#attr</a> for more info about
         the attr command.
         <br><br>
         Attributes:
@@ -72313,12 +72721,15 @@ attr SVG_link_archetype attributes group</pre>
         but the next time will be computed.</li><br>
 
     <a name="disabledForIntervals"></a>
-    <li>disabledForIntervals HH:MM-HH:MM HH:MM-HH-MM...<br>
+    <li>disabledForIntervals HH:MM-HH:MM HH:MM-HH:MM ...<br>
         Space separated list of HH:MM or D@HH:MM tupels. If the current time is
         between the two time specifications, the current device is disabled.
         Instead of HH:MM you can also specify HH or HH:MM:SS. D is the day of
-        the week, with 0 indicating Sunday and 3 indicating Wednesday. To
-        specify an interval spawning midnight, you have to specify two
+        the week, with 0 indicating Sunday and 3 indicating Wednesday.
+        Specifying the day for the "from" part does _not_ specify it for the
+        "to" part, i.e.  1@00-24 will disable from monday to the end of the
+        week, but not on sunday (as 1@00 is greater than any time on sunday).
+        To specify an interval spawning midnight, you have to specify two
         intervals, e.g.:
         <ul>
           23:00-24:00 00:00-01:00

+ 299 - 85
fhem/core/docs/commandref_DE.html

@@ -407,6 +407,7 @@
       <a href="#SISPM">SISPM</a> &nbsp;
       <a href="#SMAEM">SMAEM</a> &nbsp;
       <a href="#SMAInverter">SMAInverter</a> &nbsp;
+      <a href="#SmarterCoffee">SmarterCoffee</a> &nbsp;
       <a href="#SmartMeterP1">SmartMeterP1</a> &nbsp;
       <a href="#SMARTMON">SMARTMON</a> &nbsp;
       <a href="#SmartPi">SmartPi</a> &nbsp;
@@ -3236,7 +3237,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
 <h3>CALVIEW</h3>
 <div class='langLinks'>[<a href='commandref.html#CALVIEW'>EN</a> DE]</div>
 <ul>Dieses Modul erstellt ein Device welches als Readings Termine eines oder mehrere Kalender(s), basierend auf dem 57_Calendar.pm Modul, besitzt. Ihr müsst das Perl-Modul Date::Parse installieren!</ul>
-<ul>Aktuell wird nur die "get <> next" Funktion vom CALENDAR untertstützt.</ul>
+<ul>Bitte setzt das Attribut HideOlderThen in eurem CALENDAR_Device, da sonst auch vergangene Termine gezeigt werden.</ul>
 <b>Define</b>
 <ul><code>define &lt;Name&gt; CALVIEW &lt;Kalendername(n) getrennt durch ','&gt; &lt;next&gt; &lt;updateintervall in sek (default 43200)&gt;</code></ul>
 <ul><code>define myView CALVIEW Googlekalender next</code></ul>
@@ -7860,8 +7861,8 @@ Da man beliebige Perl-Ausdrücke verwenden kann, lässt sich z. B. der Mittelwer
 <br>
 <a name="DOIF_Readings"></a>
 Mit Hilfe des Attributes DOIF_Readings können eigene Readings innerhalb des DOIF definiert werden, auf die man im selben DOIF-Moduls zugreifen kann.
-Die Nutzung ist insbesondere dann sinnvoll, wenn mehrfach die gleichen Berechnungen innerhalb eines DOIF-Modus vorgenommen werden sollen.
-DOIF_Readings-Berechnungen funktionieren ressourcenschonend ohne Erzeugung FHEM-Events nach außen. Änderungen dieser Readings triggern allerdings das eigene DOIF-Modul, wenn sich deren Inhalt ändert.<br>
+Die Nutzung ist insbesondere dann sinnvoll, wenn zyklisch sendende Sensoren, im Perl-Modus oder mit dem Attribut do always, abgefragt werden.
+DOIF_Readings-Berechnungen funktionieren ressourcenschonend ohne Erzeugung FHEM-Events nach außen. Änderungen dieser Readings triggern allerdings das eigene DOIF-Modul, allerdings nur, wenn sich deren Inhalt ändert.<br>
 <br>
 Syntax<br>
 <br>
@@ -7869,25 +7870,22 @@ Syntax<br>
 <br>
 <code>&lt;definition&gt;</code>: Beliebiger Perlausdruck ergänzt um DOIF-Syntax in eckigen Klammern. Angaben in eckigen Klammern wirken triggernd und aktualisieren das definierte Reading.<br>
 <br>
+Beispiel<br>
+<br>
+<a href="#DOIF_Perl_Modus"><b>Perl-Modus</b>:</a><br>
+<code>define heating DOIF {if ([switch] eq "on" and [$SELF:frost]) {fhem_set"heating on"} else {fhem_set"heating off"}}<br>
+attr heating DOIF_Readings frost:([outdoor:temperature] < 0)</code><br>
+<br>
+Das Reading frost triggert nur dann die definierte Abfrage, wenn sich sein Zustand ändert. Dadurch wird sichergestellt, dass ein wiederholtes Schalten der Heizung vermieden wird, obwohl der Sensor outdoor zyklisch sendet.<br>
+<br>
 Beispiel: Push-Mitteilung über die durchschnittliche Temperatur aller Zimmer<br>
 <br>
 <code>define di_temp DOIF ([$SELF:temperature]&gt;20) (push "Die Durchschnittstemperatur ist höher als 20 Grad, sie beträgt [$SELF:temperature]")<br>
-DOELSE<br>
 <br>
 attr di_temp DOIF_Readings temperature:[#average:d2:":temperature":temperature]<br></code>
 <br>
 Hierbei wird der aufwändig berechnete Durchschnittswert nur einmal berechnet, statt zwei mal, wenn man die Aggregationsfunktion direkt in der Bedingung und im Ausführungsteil angeben würde.<br>
 <br>
-Mit DOIF_Readings ist es ebenfalls möglich eine Wiederholung des Schaltens eines DOIF-Moduls mit do always zu provozieren und gleichzeitig zyklisch sendende Sensoren abzufragen.<br>
-<br>
-Beispiel<br>
-<br>
-<code>define heating DOIF ([switch] eq "on" and [$SELF:frost] eq "on") (set heating on) DOELSE (set heating off)<br>
-attr heating do always<br>
-attr heating DOIF_Readings frost:([outdoor:temperature] < 0 ? "on" : "off")</code><br>
-<br>
-Das Attribut do always ist in diesem Beispiel unkritisch, obwohl Temperatur zyklisch gesendet wird, da das Reading "frost" nur dann die Bedingung triggert, wenn sich dessen Inhalt ändert<br>
-<br>
 <a name="DOIF_initialize"></a>
 <b>Vorbelegung des Status mit Initialisierung nach dem Neustart</b>&nbsp;&nbsp;&nbsp;<a href="#DOIF_Inhaltsuebersicht">back</a><br>
 <br>
@@ -8446,16 +8444,17 @@ Der Benutzer kann mit der Funktion <code>set_Exec</code> beliebig viele eigene T
 <br>
 Definitionen im FHEM-Modus mit do-Attribut der Form:<br>
 <br>
-&nbsp;&nbsp;<code>DOIF (&lt;Bedingung mit Trigger&gt;) (&lt;FHEM-Befehle&gt;) DOELSE (&lt;FHEM-Befehle&gt;)</code><br>
+<ol><code>DOIF (&lt;Bedingung mit Trigger&gt;) (&lt;FHEM-Befehle&gt;) DOELSE (&lt;FHEM-Befehle&gt;)</code><br></ol>
 <br>
 lassen sich wie folgt in Perl-Modus übertragen:<br>
 <br>
-&nbsp;&nbsp;<code>DOIF {if (&lt;Bedingung mit Trigger&gt;) {fhem"&lt;FHEM-Befehle&gt;"} else {fhem"&lt;FHEM-Befehle&gt;"}}</code><br>
+<ol><code>DOIF {if (&lt;Bedingung mit Trigger&gt;) {fhem"&lt;FHEM-Befehle&gt;"} else {fhem"&lt;FHEM-Befehle&gt;"}}</code><br></ol>
 <br>
 Die Bedingungen des FHEM-Modus können ohne Änderungen in Perl-Modus übernommen werden.<br>
 <br>
 <a name="DOIF_Einfache_Anwendungsbeispiele_Perl"></a>
-<u>Einfache Anwendungsbeispiele (vgl. <a href="#DOIF_Einfache_Anwendungsbeispiele">Anwendungsbeispiele im FHEM-Modus</a>):</u><ol>
+<u>Einfache Anwendungsbeispiele (vgl. <a href="#DOIF_Einfache_Anwendungsbeispiele">Anwendungsbeispiele im FHEM-Modus</a>):</u>
+<ol>
 <br>
 <code>define di_rc_tv DOIF {if ([remotecontol:"on"]) {fhem_set"tv on"} else {fhem_set"tv off"}}</code><br>
 <br>
@@ -8464,7 +8463,8 @@ Die Bedingungen des FHEM-Modus können ohne Änderungen in Perl-Modus übernomme
 <code>define di_lamp DOIF {if ([06:00-09:00] and [sensor:brightness] < 40) {fhem_set"lamp:FILTER=STATE!=on on"} else {fhem_set"lamp:FILTER=STATE!=off off"}}</code><br>
 <br>
 </ol>
-Bemerkung: Im Gegensatz zum FHEM-Modus arbeitet der Perl-Modus ohne Auswertung des eigenen Status (Zustandsauswertung), daher muss der Anwender selbst darauf achten, wiederholende Ausführungen zu vermeiden (im oberen Beispiel z.B. mit FILTER-Option)<br>
+Bemerkung: Im Gegensatz zum FHEM-Modus arbeitet der Perl-Modus ohne Auswertung des eigenen Status (Zustandsauswertung),
+daher muss der Anwender selbst darauf achten, wiederholende Ausführungen zu vermeiden (im oberen Beispiel z.B. mit FILTER-Option). Elegant lässt sich das Problem der wiederholenden Ausführung bei zyklisch sendenden Sensoren mit Hilfe des Attributes <a href="#DOIF_DOIF_Readings">DOIF_Readings</a> lösen.<br>
 <br>
 Es können beliebig viele Ereignisblöcke definiert werden, die unabhängig von einander durch einen oder mehrere Trigger ausgewertet und zur Ausführung führen können:<br>
 <br>
@@ -10449,6 +10449,7 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.<br>
      <li> Bereinigung sequentiell aufeinander folgender Datensätze mit unterschiedlichen Zeitstempel aber gleichen Werten (sequentielle Dublettenbereinigung) </li>
 	 <li> Reparatur einer korrupten SQLite Datenbank ("database disk image is malformed") </li>
      <li> Übertragung von Datensätzen aus der Quelldatenbank in eine andere (Standby) Datenbank (syncStandby) </li>
+     <li> Reduktion der Anzahl von Datensätzen in der Datenbank (reduceLog) </li>
      </ul></ul>
      <br>
      
@@ -10634,9 +10635,28 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.<br>
     <li><b> countEntries [history | current] </b> 
                                  -  liefert die Anzahl der Tabelleneinträge (default: history) in den gegebenen 
 	                             Zeitgrenzen (siehe <a href="#DbRepattr">Attribute</a>). 
-                                 Sind die Timestamps nicht gesetzt werden alle Einträge gezählt. 
+                                 Sind die Timestamps nicht gesetzt, werden alle Einträge der Tabelle gezählt. 
                                  Beschränkungen durch die <a href="#DbRepattr">Attribute</a> Device bzw. Reading 
-								 gehen in die Selektion mit ein.  </li> <br>
+								 gehen in die Selektion mit ein. <br>
+                                 Standardmäßig wird die Summe aller Datensätze, gekennzeichnet mit "ALLREADINGS", erstellt.
+                                 Ist das Attribut "countEntriesDetail" gesetzt, wird die Anzahl jedes einzelnen Readings 
+                                 zusätzlich ausgegeben. <br><br>                               
+                                 
+                                 Die für diese Funktion relevanten Attribute sind: <br><br>
+
+	                               <ul>
+                                   <table>  
+                                   <colgroup> <col width=5%> <col width=95%> </colgroup>
+                                      <tr><td> <b>aggregation</b>       </td><td>: Zusammenfassung/Gruppierung von Zeitintervallen </td></tr>
+                                      <tr><td> <b>countEntriesDetail</b></td><td>: detaillierte Ausgabe der Datensatzanzahl </td></tr>
+                                      <tr><td> <b>device</b>            </td><td>: Selektion nur von Datensätzen die &lt;device&gt; enthalten </td></tr>
+                                      <tr><td> <b>reading</b>           </td><td>: Selektion nur von Datensätzen die &lt;reading&gt; enthalten </td></tr>
+                                      <tr><td> <b>time.*</b>            </td><td>: eine Reihe von Attributen zur Zeitabgrenzung </td></tr>
+                                      </table>
+	                               </ul>
+	                               <br>
+                                   
+                                 </li> <br>
 
     <li><b> delEntries </b>   -  löscht alle oder die durch die <a href="#DbRepattr">Attribute</a> device und/oder 
 	                             reading definierten Datenbankeinträge. Die Eingrenzung über Timestamps erfolgt 
@@ -11053,7 +11073,7 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.<br>
                                  
                                  Jedes Ergebnisreading setzt sich aus dem Timestring des Datensatzes, einem Index, dem Device
                                  und dem Reading zusammen.
-                                 Die Funktion fetchrows ist in der Lage mehrfach vorkommende Datensätze (Dubletten) zu erkennen.
+                                 Die Funktion fetchrows ist in der Lage, mehrfach vorkommende Datensätze (Dubletten) zu erkennen.
                                  Solche Dubletten sind mit einem Index > 1 gekennzeichnet. <br>
                                  Dubletten können mit dem Attribut "fetchMarkDuplicates" farblich hervorgehoben werden. <br><br>
                                  
@@ -11087,13 +11107,13 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.<br>
 	                               <ul>
                                    <table>  
                                    <colgroup> <col width=5%> <col width=95%> </colgroup>
-                                      <tr><td> <b>fetchRoute</b>            </td><td>: Leserichtung des Selekts innerhalb der Datenbank </td></tr>
+                                      <tr><td> <b>fetchRoute</b>            </td><td>: Leserichtung der Selektion innerhalb der Datenbank </td></tr>
                                       <tr><td> <b>limit</b>                 </td><td>: begrenzt die Anzahl zu selektierenden bzw. anzuzeigenden Datensätze  </td></tr>
                                       <tr><td> <b>fetchMarkDuplicates</b>   </td><td>: Hervorhebung von gefundenen Dubletten </td></tr>
                                       <tr><td> <b>device</b>                </td><td>: Selektion nur von Datensätzen die &lt;device&gt; enthalten </td></tr>
                                       <tr><td> <b>reading</b>               </td><td>: Selektion nur von Datensätzen die &lt;reading&gt; enthalten </td></tr>
                                       <tr><td> <b>time.*</b>                </td><td>: eine Reihe von Attributen zur Zeitabgrenzung </td></tr>
-                                      <tr><td> <b>valueFilter</b>           </td><td>: filtert Datensätze des Datenbankfeldes "VALUE" mit einem regulären Ausdruck </td></tr>
+                                      <tr><td> <b>valueFilter</b>           </td><td>: filtert die anzuzeigenden Datensätze mit einem regulären Ausdruck. Der Regex wird auf den gesamten anzuzeigenden Datensatz angewendet. </td></tr>
                                    </table>
 	                               </ul>
 	                               <br>
@@ -11246,7 +11266,72 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.<br>
                                  Obwohl die Funktion selbst non-blocking ausgelegt ist, sollte das zugeordnete DbLog-Device
                                  im asynchronen Modus betrieben werden um ein Blockieren von FHEMWEB zu vermeiden (Tabellen-Lock). <br><br> 
                                  </li> <br>
-                                 </ul>  
+                                 </ul>
+
+    <li><b> reduceLog [average[=day]] [exclude=device1:reading1,device2:reading2,...] [include=device:reading]</b> <br>
+                                 Reduziert historische Datensätze innerhalb der durch die "time.*"-Attribute bestimmten 
+                                 Zeitgrenzen auf einen Eintrag (den ersten) pro Stunde je Device & Reading. <br>
+                                 Es muss mindestens eines der "time.*"-Attribute gesetzt sein (siehe Tabelle unten). 
+                                 Die jeweils fehlende Zeitabgrenzung wird in diesem Fall durch das Modul errechnet.
+                                 <br><br>
+                                 
+                 	             Die für diese Funktion relevanten Attribute sind: <br><br>
+	                               <ul>
+                                   <table>  
+                                   <colgroup> <col width=5%> <col width=95%> </colgroup>
+	                                  <tr><td> <b>executeBeforeProc</b>  </td><td>: FHEM Kommando (oder perl-Routine) vor dem Export ausführen </td></tr>
+                                      <tr><td> <b>executeAfterProc</b>   </td><td>: FHEM Kommando (oder perl-Routine) nach dem Export ausführen </td></tr>
+                                      <tr><td> <b>timeOlderThan</b>      </td><td>: es werden Datenbankeinträge <b>älter</b> als dieses Attribut reduziert </td></tr>
+                                      <tr><td> <b>timestamp_end</b>      </td><td>: es werden Datenbankeinträge <b>älter</b> als dieses Attribut reduziert </td></tr>
+                                      <tr><td> <b>timeDiffToNow</b>      </td><td>: es werden Datenbankeinträge <b>neuer</b> als dieses Attribut reduziert </td></tr>
+                                      <tr><td> <b>timestamp_begin</b>    </td><td>: es werden Datenbankeinträge <b>neuer</b> als dieses Attribut reduziert </td></tr>
+                                   </table>
+	                               </ul>
+                                   <br>
+                                 
+                                 Das Reading "reduceLogState" enthält das Ausführungsergebnis des letzten reduceLog-Befehls. <br><br>
+          
+                                 Durch die optionale Angabe von 'average' wird nicht nur die Datenbank bereinigt, sondern 
+                                 alle numerischen Werte einer Stunde werden auf einen einzigen Mittelwert reduziert. <br>
+                                 Durch die optionale Angabe von 'average=day' wird nicht nur die Datenbank bereinigt, sondern 
+                                 alle numerischen Werte eines Tages auf einen einzigen Mittelwert reduziert. 
+                                 (impliziert 'average') <br><br>
+          
+                                 Optional kann als letzer Parameter "exclude=device1:reading1,device2:reading2,...." 
+		                         angegeben werden um device/reading Kombinationen von reduceLog auszuschließen. <br>
+                                 <b>Tipp:</b> Wird "exclude=.*:.*" angegeben, wird nichts in der Datenbank gelöscht. Das kann
+                                 z.B. verwendet werden um vorab die gesetzten Zeitgrenzen und die Anzahl der zu bearbeitenden
+                                 Datenbankeinträge zu checken. <br><br>
+          
+                                 Optional kann als letzer Parameter "include=device:reading" angegeben werden um 
+		                         die auf die Datenbank ausgeführte SELECT-Abfrage einzugrenzen, was die RAM-Belastung 
+                                 verringert und die Performance erhöht. <br><br>
+          
+                                 <ul>
+                                 <b>Beispiel: </b><br><br>
+                                 
+                                 attr &lt;name&gt; timeOlderThan = d:200  <br>
+                                 set &lt;name&gt; reduceLog <br>
+                                 # Datensätze die älter als 200 Tage sind, werden auf den ersten Eintrag pro Stunde je Device & Reading
+                                 reduziert.  <br> 
+                                 <br>
+                                 
+                                 attr &lt;name&gt; timeDiffToNow = d:10 <br>
+                                 attr &lt;name&gt; timeOlderThan = d:5  <br>
+                                 set &lt;name&gt; reduceLog average include=Luftdaten_remote:% <br>
+                                 # Datensätze die älter als 5 und neuer als 10 Tage sind, werden bereinigt. Numerische Werte 
+                                 einer Stunde werden auf einen Mittelwert reduziert <br>                                  
+                                 <br>
+								 </ul>
+                                 
+								 <b>Hinweis:</b> <br>
+                                 Obwohl die Funktion selbst non-blocking ausgelegt ist, sollte das zugeordnete DbLog-Device
+                                 im asynchronen Modus betrieben werden um ein Blockieren von FHEMWEB zu vermeiden 
+                                 (Tabellen-Lock). <br>
+                                 Weiterhin wird dringend empfohlen den standard INDEX 'Search_Idx' in der Tabelle 'history' 
+                                 anzulegen ! <br>
+		                         Die Abarbeitung dieses Befehls dauert unter Umständen (ohne INDEX) extrem lange. <br><br>
+                                 </li> <br>                                 
 
     <li><b> repairSQLite </b>  - repariert eine korrupte SQLite-Datenbank. <br>
                                  Eine Korruption liegt im Allgemeinen vor wenn die Fehlermitteilung "database disk image is malformed"
@@ -11307,7 +11392,7 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.<br>
 								 verbundenen Datenbank beginnt, aufgelistet . <br><br>
 								 </li><br>
 								 
-    <li><b> sqlCmd </b>        - führt ein beliebiges Benutzer spezifisches Kommando aus. <br>
+    <li><b> sqlCmd </b>        - führt ein beliebiges benutzerspezifisches Kommando aus. <br>
                                  Enthält dieses Kommando eine Delete-Operation, muss zur Sicherheit das 
 								 <a href="#DbRepattr">Attribut</a> "allowDeletion" gesetzt sein. <br>
                                  Bei der Ausführung dieses Kommandos werden keine Einschränkungen durch gesetzte Attribute
@@ -11537,7 +11622,7 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.<br>
                                  
     <li><b> dbValue &lt;SQL-Statement&gt;</b> - 
                             Führt das angegebene SQL-Statement <b>blockierend</b> aus. Diese Funktion ist durch ihre Arbeitsweise 
-                            speziell für den Einsatz in usereigenen Scripten geeignet. <br>
+                            speziell für den Einsatz in benutzerspezifischen Scripten geeignet. <br>
                             Die Eingabe akzeptiert Mehrzeiler und gibt ebenso mehrzeilige Ergebisse zurück. 
                             Werden mehrere Felder selektiert und zurückgegeben, erfolgt die Feldtrennung mit dem Trenner 
                             des <a href="#DbRepattr">Attributes</a> "sqlResultFieldSep" (default "|"). Mehrere Ergebniszeilen 
@@ -11637,7 +11722,15 @@ return $ret;
                                  # Es werden nur Information der Tabellen "current" und "history" angezeigt
                                  </li> 
                                  <br><br>
-                                 </ul>                                                      
+                                 </ul>  
+
+    <li><b> versionNotes [hints | rel | &lt;key&gt;] </b> - 
+                             Zeigt Release Informationen und/oder Hinweise zum Modul an. Es sind nur Release Informationen mit 
+                             Bedeutung für den Modulnutzer enthalten. <br>
+                             Sind keine Optionen angegben, werden sowohl Release Informationen als auch Hinweise angezeigt. 
+                             "rel" zeigt nur Release Informationen und "hints" nur Hinweise an. Mit der &lt;key&gt;-Angabe 
+                             wird der Hinweis mit der angegebenen Nummer angezeigt.
+                             </li>                                      
                                                      
   <br>
   </ul></ul>
@@ -11650,7 +11743,9 @@ return $ret;
 
 <br>
 <ul>
-  Über die modulspezifischen Attribute wird die Abgrenzung der Auswertung und die Aggregation der Werte gesteuert. <br><br>
+  Über die modulspezifischen Attribute wird die Abgrenzung der Auswertung und die Aggregation der Werte gesteuert. <br>
+  Die hier aufgeführten Attribute sind nicht für jede Funktion des Moduls bedeutsam. In der Hilfe zu den set/get-Kommandos
+  wird explizit angegeben, welche Attribute für das jeweilige Kommando relevant sind. <br><br>
   
   <b>Hinweis zur SQL-Wildcard Verwendung:</b> <br>
   Innerhalb der Attribut-Werte für "device" und "reading" kann SQL-Wildcards "%" angegeben werden. 
@@ -11683,16 +11778,22 @@ return $ret;
 	                               <ul>
                                    <table>  
                                    <colgroup> <col width=20%> <col width=80%> </colgroup>
-                                      <tr><td> <b>avgArithmeticMean :</b>  </td><td>es wird der arithmetische Mittelwert berechnet (default) </td></tr>
-                                      <tr><td> <b>avgDailyMeanGWS :</b>    </td><td>berechnet die Tagesmitteltemperatur entsprechend den
-                                                                                    Vorschriften des deutschen Wetterdienstes (siehe "helpful hints" mit Funktion get versionNotes). <br>
-                                                                                    Diese Variante verwendet automatisch die Aggregation "day". </td></tr>
-                                      <tr><td> <b>avgTimeWeightMean :</b>  </td><td>berechnet den zeitgewichteten Mittelwert </td></tr>
+                                      <tr><td> <b>avgArithmeticMean                          :</b> </td><td>es wird der arithmetische Mittelwert berechnet (default) </td></tr>
+                                      <tr><td style="vertical-align:top"> <b>avgDailyMeanGWS :</b> <td>berechnet die Tagesmitteltemperatur entsprechend den
+                                                                                                   Vorschriften des deutschen Wetterdienstes (siehe "get &lt;name&gt; versionNotes 2"). <br>
+                                                                                                   Diese Variante verwendet automatisch die Aggregation "day". </td></tr>
+                                      <tr><td> <b>avgTimeWeightMean                          :</b> </td><td>berechnet den zeitgewichteten Mittelwert </td></tr>
 								   </table>
 	                               </ul>
                                 </li><br>
  
-  <a name="device"></a>
+  <a name="countEntriesDetail"></a>
+  <li><b>countEntriesDetail </b>   - Wenn gesetzt, erstellt die Funktion "countEntries" eine detallierte Ausgabe der Datensatzzahl
+                                     pro Reading und Zeitintervall.
+                                     Standardmäßig wird nur die Summe aller selektierten Datensätze ausgegeben. 
+                                     </li> <br>
+
+ <a name="device"></a>
   <li><b>device </b>          - Abgrenzung der DB-Selektionen auf ein bestimmtes Device. <br>
                                 Es können Geräte-Spezifikationen (devspec) angegeben werden. <br> 
 								Innerhalb von Geräte-Spezifikationen wird SQL-Wildcard (%) als normales ASCII-Zeichen gewertet. 
@@ -11769,8 +11870,9 @@ return $ret;
 								Attribut "archivesort" wird berücksichtigt. </li> <br> 
 
   <a name="executeAfterProc"></a>
-  <li><b>executeAfterProc </b> - Es kann ein FHEM-Kommando angegeben werden welches <b>nach dem Dump</b> ausgeführt werden soll. <br>
-                                 Funktionen sind in {} einzuschließen.<br><br>
+  <li><b>executeAfterProc </b> - Es kann ein FHEM-Kommando oder eine Perl-Funktion angegeben werden welche <b>nach der 
+                                  Befehlsabarbeitung</b> ausgeführt werden soll. <br>
+                                  Funktionen sind in {} einzuschließen.<br><br>
 
                                 <ul>
 							    <b>Beispiel:</b> <br><br>
@@ -11793,15 +11895,16 @@ sub adump {
 </li>
 		
   <a name="executeBeforeProc"></a>		
-  <li><b>executeBeforeProc </b> - Es kann ein FHEM-Kommando angegeben werden welches <b>vor dem Dump</b> ausgeführt werden soll. <br>
-                                 Funktionen sind in {} einzuschließen.<br><br>
+  <li><b>executeBeforeProc </b> - Es kann ein FHEM-Kommando oder eine Perl-Funktion angegeben werden welche <b>vor der 
+                                  Befehlsabarbeitung</b> ausgeführt werden soll. <br>
+                                  Funktionen sind in {} einzuschließen.<br><br>
 
-                                <ul>
-							    <b>Beispiel:</b> <br><br>
-								attr &lt;name&gt; executeBeforeProc set og_gz_westfenster on; <br>
-								attr &lt;name&gt; executeBeforeProc {bdump ("&lt;name&gt;")} <br><br>
+                                  <ul>
+							      <b>Beispiel:</b> <br><br>
+								  attr &lt;name&gt; executeBeforeProc set og_gz_westfenster on; <br>
+								  attr &lt;name&gt; executeBeforeProc {bdump ("&lt;name&gt;")} <br><br>
 								
-								# "bdump" ist eine in 99_myUtils definierte Funktion. <br>
+								  # "bdump" ist eine in 99_myUtils definierte Funktion. <br>
 								
 <pre>
 sub bdump {
@@ -12086,14 +12189,38 @@ sub bdump {
 							   <br><br>
   
   <a name="timestamp_begin"></a> 
-  <li><b>timestamp_begin </b> - der zeitliche Beginn für die Datenselektion (*)   </li> <br>
+  <li><b>timestamp_begin </b> - der zeitliche Beginn für die Datenselektion </li> <br>
+  
+  Das Format von Timestamp ist "YYYY-MM-DD HH:MM:SS". Für die Attribute "timestamp_begin", "timestamp_end" 
+  kann ebenso eine der folgenden Eingaben verwendet werden. Dabei wird das timestamp-Attribut dynamisch belegt: <br><br>
+                              <ul>
+                              <b>current_year_begin</b>     : entspricht "&lt;aktuelles Jahr&gt;-01-01 00:00:00"          <br>
+                              <b>current_year_end</b>       : entspricht "&lt;aktuelles Jahr&gt;-12-31 23:59:59"          <br>
+                              <b>previous_year_begin</b>    : entspricht "&lt;vorheriges Jahr&gt;-01-01 00:00:00"         <br>
+                              <b>previous_year_end</b>      : entspricht "&lt;vorheriges Jahr&gt;-12-31 23:59:59"         <br>
+                              <b>current_month_begin</b>    : entspricht "&lt;aktueller Monat erster Tag&gt; 00:00:00"    <br>
+                              <b>current_month_end</b>      : entspricht "&lt;aktueller Monat letzter Tag&gt; 23:59:59"   <br>
+                              <b>previous_month_begin</b>   : entspricht "&lt;Vormonat erster Tag&gt; 00:00:00"           <br>
+                              <b>previous_month_end</b>     : entspricht "&lt;Vormonat letzter Tag&gt; 23:59:59"          <br>
+                              <b>current_week_begin</b>     : entspricht "&lt;erster Tag der akt. Woche&gt; 00:00:00"     <br>
+                              <b>current_week_end</b>       : entspricht "&lt;letzter Tag der akt. Woche&gt; 23:59:59"    <br>
+                              <b>previous_week_begin</b>    : entspricht "&lt;erster Tag Vorwoche&gt; 00:00:00"           <br>
+                              <b>previous_week_end</b>      : entspricht "&lt;letzter Tag Vorwoche&gt; 23:59:59"          <br>
+                              <b>current_day_begin</b>      : entspricht "&lt;aktueller Tag&gt; 00:00:00"                 <br>
+                              <b>current_day_end</b>        : entspricht "&lt;aktueller Tag&gt; 23:59:59"                 <br>
+                              <b>previous_day_begin</b>     : entspricht "&lt;Vortag&gt; 00:00:00"                        <br>
+                              <b>previous_day_end</b>       : entspricht "&lt;Vortag&gt; 23:59:59"                        <br>
+                              <b>current_hour_begin</b>     : entspricht "&lt;aktuelle Stunde&gt;:00:00"                  <br>
+                              <b>current_hour_end</b>       : entspricht "&lt;aktuelle Stunde&gt;:59:59"                  <br>
+                              <b>previous_hour_begin</b>    : entspricht "&lt;vorherige Stunde&gt;:00:00"                 <br>
+                              <b>previous_hour_end</b>      : entspricht "&lt;vorherige Stunde&gt;:59:59"                 <br>
+                              </ul><br>
 
   <a name="timestamp_end"></a>   
   <li><b>timestamp_end </b>   - das zeitliche Ende für die Datenselektion. Wenn nicht gesetzt wird immer die aktuelle 
-                                Datum/Zeit-Kombi für das Ende der Selektion eingesetzt. (*)  </li> <br>
+                                Datum/Zeit-Kombi für das Ende der Selektion eingesetzt.  </li> <br>
 															
-  
-  (*) Das Format von Timestamp ist wie in DbLog "YYYY-MM-DD HH:MM:SS". Für die Attribute "timestamp_begin", "timestamp_end" 
+  Das Format von Timestamp ist "YYYY-MM-DD HH:MM:SS". Für die Attribute "timestamp_begin", "timestamp_end" 
   kann ebenso eine der folgenden Eingaben verwendet werden. Dabei wird das timestamp-Attribut dynamisch belegt: <br><br>
                               <ul>
                               <b>current_year_begin</b>     : entspricht "&lt;aktuelles Jahr&gt;-01-01 00:00:00"          <br>
@@ -12157,15 +12284,39 @@ sub bdump {
 								<code>attr &lt;name&gt; timeDiffToNow y:1.5</code> <br>
                                 # die Startzeit wird auf "aktuelle Zeit - 1,5 Jahre gesetzt <br>
 								</ul>
-								<br><br>
+								<br>
+                                
+                                Sind die Attribute "timeDiffToNow" und "timeOlderThan" gleichzeitig gesetzt, wird der 
+                                Selektionszeitraum zwischen diesen Zeitpunkten dynamisch kalkuliert.
+                                <br><br>
 
   <a name="timeOlderThan"></a> 								
   <li><b>timeOlderThan </b>   - das <b>Selektionsende</b> wird auf den Zeitpunkt <b>"&lt;aktuelle Zeit&gt; - &lt;timeOlderThan&gt;"</b> 
                                 gesetzt. Dadurch werden alle Datensätze bis zu dem Zeitpunkt "&lt;aktuelle 
 								Zeit&gt; - &lt;timeOlderThan&gt;" berücksichtigt (z.b. wenn auf 86400 gesetzt, werden alle
 								Datensätze die älter als ein Tag sind berücksichtigt). Die Timestampermittlung erfolgt 
-								dynamisch zum Ausführungszeitpunkt. <br>
-								Es gelten die gleichen Eingabeformate wie für das Attribut "timeDiffToNow".   </li> <br> 
+								dynamisch zum Ausführungszeitpunkt. </li> <br>
+
+                                <ul>
+							    <b>Eingabeformat Beispiel:</b> <br>
+								<code>attr &lt;name&gt; timeOlderThan 86400</code> <br>
+                                # das Selektionsende wird auf "aktuelle Zeit - 86400 Sekunden" gesetzt <br>
+								<code>attr &lt;name&gt; timeOlderThan d:2 h:3 m:2 s:10</code> <br>
+                                # das Selektionsende wird auf "aktuelle Zeit - 2 Tage 3 Stunden 2 Minuten 10 Sekunden" gesetzt <br>							
+								<code>attr &lt;name&gt; timeOlderThan m:600</code> <br> 
+                                # das Selektionsende wird auf "aktuelle Zeit - 600 Minuten" gesetzt <br>
+								<code>attr &lt;name&gt; timeOlderThan h:2.5</code> <br>
+                                # das Selektionsende wird auf "aktuelle Zeit - 2,5 Stunden" gesetzt <br>
+								<code>attr &lt;name&gt; timeOlderThan y:1 h:2.5</code> <br>
+                                # das Selektionsende wird auf "aktuelle Zeit - 1 Jahr und 2,5 Stunden" gesetzt <br>
+								<code>attr &lt;name&gt; timeOlderThan y:1.5</code> <br>
+                                # das Selektionsende wird auf "aktuelle Zeit - 1,5 Jahre gesetzt <br>
+								</ul>
+								<br>
+                                
+                                Sind die Attribute "timeDiffToNow" und "timeOlderThan" gleichzeitig gesetzt, wird der 
+                                Selektionszeitraum zwischen diesen Zeitpunkten dynamisch kalkuliert.
+                                <br><br>                               
 
   <a name="timeout"></a> 								
   <li><b>timeout </b>         - das Attribut setzt den Timeout-Wert für die Blocking-Call Routinen in Sekunden  
@@ -12217,8 +12368,9 @@ sub bdump {
 
   <a name="valueFilter"></a>                                
   <li><b>valueFilter </b>     - Regulärer Ausdruck zur Filterung von Datensätzen innerhalb bestimmter Funktionen. Der 
-                                Regex auf den gesamten selektierten Datensatz (inkl. Device, Reading usw.) angewendet. 
-                                Bitte vergleichen sie die Erläuterungen zu den entsprechenden Set-Kommandos. </li> <br> 
+                                Regex wird auf ein bestimmtes Feld oder den gesamten selektierten Datensatz (inkl. Device, 
+                                Reading usw.) angewendet. 
+                                Bitte beachten sie die Erläuterungen zu den entsprechenden Set-Kommandos. </li> <br> 
                                 
 
 </ul></ul>
@@ -31740,27 +31892,34 @@ Hier wird definiert, dass ein Event erzeugt werden soll, wenn innerhalb von 2 Se
     </pre>
     
 	Die Passwortlänge beträgt maximal 20 Zeichen. <br> 
-    Der Anwender kann in Abhängigkeit der beabsichtigten einzusetzenden Funktionen einen Nutzer im DSM bzw. in der Surveillance Station einrichten. <br>
-    Ist der DSM-Nutzer der Gruppe Administratoren zugeordnet, hat er auf alle Funktionen Zugriff. Ohne diese Gruppenzugehörigkeit können nur Funktionen mit niedrigeren <br>
-    Rechtebedarf ausgeführt werden. Die benötigten Mindestrechte der Funktionen sind in der Tabelle weiter unten aufgeführt. <br>
+    Der Anwender kann in Abhängigkeit der beabsichtigten einzusetzenden Funktionen einen Nutzer im DSM bzw. in der Surveillance 
+    Station einrichten. <br>
+    Ist der DSM-Nutzer der Gruppe Administratoren zugeordnet, hat er auf alle Funktionen Zugriff. Ohne diese Gruppenzugehörigkeit 
+    können nur Funktionen mit niedrigeren Rechtebedarf ausgeführt werden. Die benötigten Mindestrechte der Funktionen sind in 
+    der Tabelle weiter unten aufgeführt. <br>
     
-    Alternativ zum DSM-Nutzer kann ein in der SVS angelegter Nutzer verwendet werden. Auch in diesem Fall hat ein Nutzer vom Typ Manager das Recht alle Funktionen  <br>
-    auszuführen, wobei der Zugriff auf bestimmte Kameras/ im Privilegienprofil beschränkt werden kann (siehe Hilfefunktion in SVS). <br>
-    Als Best Practice wird vorgeschlagen jeweils einen User im DSM und einen in der SVS anzulegen: <br><br>
+    Alternativ zum DSM-Nutzer kann ein in der SVS angelegter Nutzer verwendet werden. Auch in diesem Fall hat ein Nutzer vom 
+    Typ Manager das Recht alle Funktionen auszuführen, wobei der Zugriff auf bestimmte Kameras/ im Privilegienprofil beschränkt 
+    werden kann (siehe Hilfefunktion in SVS). <br>
+    Als Best Practice wird vorgeschlagen, jeweils einen User im DSM und einen in der SVS anzulegen: <br><br>
     
     <ul>
-    <li>DSM-User als Mitglied der Admin-Gruppe: uneingeschränkter Test aller Modulfunktionen -> session:DSM  </li>
+    <li>DSM-User als Mitglied der Admin-Gruppe: uneingeschränkter Test aller Modulfunktionen -> session: DSM  </li>
     <li>SVS-User als Manager oder Betrachter: angepasstes Privilegienprofil -> session: SurveillanceStation  </li>
     </ul>
     <br>
     
-    Über das <a href="#SSCamattr">Attribut</a> "session" kann ausgewählt werden, ob die Session mit dem DSM oder der SVS augebaut werden soll. <br>
-    Erfolgt der Session-Aufbau mit dem DSM, stehen neben der SVS Web-API auch darüber hinaus gehende API-Zugriffe zur Verfügung die unter Umständen zur Verarbeitung benötigt werden. <br><br>
+    Über das <a href="#SSCamattr">Attribut</a> "session" kann ausgewählt werden, ob die Session mit dem DSM oder der SVS 
+    aufgebaut werden soll. Weitere Informationen zum Usermanagement in der SVS sind verfügbar mit 
+    "get &lt;name&gt; versionNotes 5".<br>
+    Erfolgt der Session-Aufbau mit dem DSM, stehen neben der SVS Web-API auch darüber hinausgehende API-Zugriffe zur Verfügung,
+    die unter Umständen zur Verarbeitung benötigt werden. <br><br>
     
-    Nach der Gerätedefinition ist die Grundeinstellung "Login in das DSM", d.h. es können Credentials mit Admin-Berechtigungen genutzt werden um zunächst alle <br>
-    Funktionen der Kameras testen zu können. Danach können die Credentials z.B. in Abhängigkeit der benötigten Funktionen auf eine SVS-Session mit entsprechend beschränkten Privilegienprofil umgestellt werden. <br><br>
+    Nach der Gerätedefinition ist die Grundeinstellung "Login in das DSM", d.h. es können Credentials mit Admin-Berechtigungen 
+    genutzt werden um zunächst alle Funktionen der Kameras testen zu können. Danach können die Credentials z.B. in Abhängigkeit 
+    der benötigten Funktionen auf eine SVS-Session mit entsprechend beschränkten Privilegienprofil umgestellt werden. <br><br>
     
-    Die nachfolgende Aufstellung zeigt die Mindestanforderungen der jeweiligen Modulfunktionen an die Nutzerrechte. <br><br>
+    Die nachfolgende Aufstellung zeigt die <b>Mindestanforderungen</b> der jeweiligen Modulfunktionen an die Nutzerrechte. <br><br>
     <ul>
       <table>
       <colgroup> <col width=20%> <col width=80%> </colgroup>
@@ -31771,7 +31930,7 @@ Hier wird definiert, dass ein Event erzeugt werden soll, wenn innerhalb von 2 Se
       <tr><td><li>set ... expmode            </td><td> session: ServeillanceStation - Manager       </li></td></tr>
       <tr><td><li>set ... extevent           </td><td> session: DSM - Nutzer Mitglied von Admin-Gruppe     </li></td></tr>
 	  <tr><td><li>set ... goPreset           </td><td> session: ServeillanceStation - Betrachter mit Privileg Objektivsteuerung der Kamera  </li></td></tr>
-      <tr><td><li>set ... homeMode           </td><td> session: ServeillanceStation - Betrachter mit Privileg Home-Modus schalten     </li></td></tr>
+      <tr><td><li>set ... homeMode           </td><td> session: ServeillanceStation - Betrachter mit Privileg Home-Modus schalten ( gilt für <b>SVS-Device !</b> )  </li></td></tr>
 	  <tr><td><li>set ... goAbsPTZ           </td><td> session: ServeillanceStation - Betrachter mit Privileg Objektivsteuerung der Kamera  </li></td></tr>
 	  <tr><td><li>set ... move               </td><td> session: ServeillanceStation - Betrachter mit Privileg Objektivsteuerung der Kamera  </li></td></tr>
       <tr><td><li>set ... motdetsc           </td><td> session: ServeillanceStation - Manager       </li></td></tr>
@@ -31796,15 +31955,17 @@ Hier wird definiert, dass ein Event erzeugt werden soll, wenn innerhalb von 2 Se
       <tr><td><li>get ... stmUrlPath         </td><td> session: ServeillanceStation - Betrachter    </li></td></tr>
       </table>
     </ul>
-      <br><br>
-    
+    <br><br>
+    </ul>
     
-    <a name="SSCam_HTTPTimeout"></a>
-    <b>HTTP-Timeout setzen</b><br><br>
+<a name="SSCam_HTTPTimeout"></a>
+<b>HTTP-Timeout setzen</b><br><br>
     
+    <ul>
     Alle Funktionen dieses Moduls verwenden HTTP-Aufrufe gegenüber der SVS Web API. <br>
-    Der Standardwert für den HTTP-Timeout beträgt 4 Sekunden. Durch Setzen des <a href="#SSCamattr">Attributes</a> "httptimeout" > 0 kann dieser Wert bei Bedarf entsprechend den technischen Gegebenheiten angepasst werden. <br>
-     
+    Der Standardwert für den HTTP-Timeout beträgt 4 Sekunden. Durch Setzen des 
+    <a href="#SSCamattr">Attributes</a> "httptimeout" > 0 kann dieser Wert bei Bedarf entsprechend den technischen 
+    Gegebenheiten angepasst werden. <br> 
     
   </ul>
   <br><br><br>
@@ -32531,9 +32692,22 @@ http(s)://&lt;hostname&gt;&lt;port&gt;/webapi/entry.cgi?api=SYNO.SurveillanceSta
   </ul>
   <br><br> 
   
+  <ul>
+  <li><b> get &lt;name&gt; versionNotes [hints | rel | &lt;key&gt;] </b> &nbsp;&nbsp;&nbsp;&nbsp;(gilt für CAM/SVS)</li> <br>
+  
+  Zeigt Release Informationen und/oder Hinweise zum Modul an. Es sind nur Release Informationen mit Bedeutung für den 
+  Modulnutzer enthalten. <br>
+  Sind keine Optionen angegben, werden sowohl Release Informationen als auch Hinweise angezeigt. "rel" zeigt nur Release
+  Informationen und "hints" nur Hinweise an. Mit der &lt;key&gt;-Angabe wird der Hinweis mit der angegebenen Nummer 
+  angezeigt.
+  Ist das Attribut "language = DE" im global Device gesetzt, erfolgt die Ausgabe der Hinweise in deutscher Sprache.
+  </ul>
+  <br><br> 
+  
   </ul>
   <br><br>
 
+  <a name="SSCamPolling"></a>
   <b>Polling der Kamera/SVS-Eigenschaften:</b><br><br>
 
   Die Abfrage der Kameraeigenschaften erfolgt automatisch, wenn das Attribut "pollcaminfoall" (siehe Attribute) mit einem Wert &gt; 10 gesetzt wird. <br>
@@ -32598,13 +32772,16 @@ http(s)://&lt;hostname&gt;&lt;port&gt;/webapi/entry.cgi?api=SYNO.SurveillanceSta
   
   <ul>
   <ul>
+  <a name="debugactivetoken"></a>
   <li><b>debugactivetoken</b><br> 
     wenn gesetzt wird der Status des Active-Tokens gelogged - nur für Debugging, nicht im 
     normalen Betrieb benutzen ! </li><br>
   
+  <a name="disable"></a>
   <li><b>disable</b><br>
     deaktiviert das Gerätemodul bzw. die Gerätedefinition </li><br>
-    
+  
+  <a name="genericStrmHtmlTag"></a>  
   <li><b>genericStrmHtmlTag</b><br>
   Das Attribut enthält HTML-Tags zur Video-Spezifikation in einem Streaming-Device von Typ "generic". 
   (siehe "set &lt;name&gt; createStreamDev generic") <br><br> 
@@ -32621,10 +32798,12 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
     <br><br>
     </li>
   
+  <a name="httptimeout"></a>
   <li><b>httptimeout</b><br>
     Timeout-Wert für HTTP-Aufrufe zur Synology Surveillance Station, Default: 4 Sekunden (wenn 
     httptimeout = "0" oder nicht gesetzt) </li><br>
   
+  <a name="htmlattr"></a>
   <li><b>htmlattr</b><br>
   ergänzende Angaben zur Inline-Bilddarstellung um das Verhalten wie Bildgröße zu beeinflussen. <br><br> 
   
@@ -32635,35 +32814,43 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
 		<br>
         </li>
   
+  <a name="livestreamprefix"></a>
   <li><b>livestreamprefix</b><br>
     überschreibt die Angaben zu Protokoll, Servernamen und Port zur Weiterverwendung der 
     Livestreamadresse als z.B. externer Link. Anzugeben in der Form 
 	"http(s)://&lt;servername&gt;:&lt;port&gt;"   </li><br>
   
+  <a name="loginRetries"></a>
   <li><b>loginRetries</b><br>
-    setzt die Anzahl der Login-Wiederholungen im Fehlerfall (default = 1)   </li><br>
+    setzt die Anzahl der Login-Wiederholungen im Fehlerfall (default = 3)   </li><br>
   
+  <a name="noQuotesForSID"></a>
   <li><b>noQuotesForSID</b><br>
     dieses Attribut kann in bestimmten Fällen die Fehlermeldung "402 - permission denied" 
     vermeiden und ein login ermöglichen.  </li><br>                      
   
+  <a name="pollcaminfoall"></a>
   <li><b>pollcaminfoall</b><br>
     Intervall der automatischen Eigenschaftsabfrage (Polling) einer Kamera (kleiner/gleich 10: kein 
     Polling, größer 10: Polling mit Intervall) </li><br>
-
+  
+  <a name="pollnologging"></a>
   <li><b>pollnologging</b><br>
     "0" bzw. nicht gesetzt = Logging Gerätepolling aktiv (default), "1" = Logging 
     Gerätepolling inaktiv </li><br>
-    
+  
+  <a name="ptzPanel_Home"></a>  
   <li><b>ptzPanel_Home</b><br>
     Im PTZ-Steuerungspaneel wird dem Home-Icon (im Attribut "ptzPanel_row02") automatisch der Wert des Readings 
     "PresetHome" zugewiesen.
     Mit "ptzPanel_Home" kann diese Zuweisung mit einem Preset aus der verfügbaren Preset-Liste geändert werden. </li><br> 
-    
+  
+  <a name="ptzPanel_iconPath"></a>  
   <li><b>ptzPanel_iconPath</b><br>
     Pfad für Icons im PTZ-Steuerungspaneel, default ist "www/images/sscam". 
     Der Attribut-Wert wird für alle Icon-Dateien außer *.svg verwendet. </li><br> 
 
+  <a name="ptzPanel_iconPrefix"></a>
   <li><b>ptzPanel_iconPrefix</b><br>
     Prefix für Icon-Dateien im PTZ-Steuerungspaneel, default ist "black_btn_". 
     Der Attribut-Wert wird für alle Icon-Dateien außer *.svg verwendet. <br>
@@ -32671,6 +32858,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
     Attributen "ptzPanel_row[00-09]" nur noch mit dem darauf folgenden Teilstring, z.B. "CAMDOWN.png" benannt zu werden.
     </li><br>    
 
+  <a name="ptzPanel_row00"></a>
   <li><b>ptzPanel_row[00-09] &lt;command&gt;:&lt;icon&gt;,&lt;command&gt;:&lt;icon&gt;,... </b><br>
     Für PTZ-Kameras werden automatisch die Attribute "ptzPanel_row00" bis "ptzPanel_row04" zur Verwendung im
     PTZ-Steuerungspaneel angelegt. <br>
@@ -32681,9 +32869,9 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
     Bei Bedarf kann die Belegung der Home-Taste in "ptzPanel_row02" geändert werden mit dem Attribut "ptzPanel_Home". <br>
     Die Icons werden im Pfad "ptzPanel_iconPath" gesucht. Dem Icon-Namen wird "ptzPanel_iconPrefix" vorangestellt.
     Eigene Erweiterungen des PTZ-Steuerungspaneels können über die Attribute "ptzPanel_row05" bis "ptzPanel_row09" 
-    vorgenommen werden. Zur Erstellung eigener Icons gibt es eine Vorlage im SVN: 
-    <a href="https://svn.fhem.de/trac/browser/trunk/fhem/contrib/sscam">contrib/sscam/black_btn_CAM_Template.pdn</a>. Diese
-    Vorlage kann zum Beispiel mit Paint.Net bearbeitet werden.    <br><br>
+    vorgenommen werden. Zur Erstellung eigener Icons gibt es eine Vorlage im SVN. Für weitere Informationen bitte
+    "get &lt;name&gt; versionNotes 2" ausführen.
+    <br><br>
     
     <b>Hinweis</b> <br>
     Für eine Leerfeld verwenden sie bitte ":CAMBLANK.png" bzw. ":CAMBLANK.png,:CAMBLANK.png,:CAMBLANK.png,..." für eine 
@@ -32698,36 +32886,46 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
 		<br>
     </li><br>  
 
+  <a name="ptzPanel_use"></a>
   <li><b>ptzPanel_use</b><br>
     Die Anzeige des PTZ-Steuerungspaneels in der Detailanzeige bzw. innerhalb eines generierten Streamdevice wird 
     ein- bzw. ausgeschaltet (default ein). </li><br>    
-    
+  
+  <a name="rectime"></a>  
   <li><b>rectime</b><br>
     festgelegte Aufnahmezeit wenn eine Aufnahme gestartet wird. Mit rectime = 0 wird eine 
     Endlosaufnahme gestartet. Ist "rectime" nicht gesetzt, wird der Defaultwert von 15s 
 	verwendet.</li><br>
   
+  <a name="recextend"></a>
   <li><b>recextend</b><br>
     "rectime" einer gestarteten Aufnahme wird neu gesetzt. Dadurch verlängert sich die 
     Aufnahemzeit einer laufenden Aufnahme </li><br>
   
+  <a name="session"></a>
   <li><b>session</b><br>
     Auswahl der Login-Session. Nicht gesetzt oder "DSM" -> session wird mit DSM aufgebaut 
-    (Standard). "SurveillanceStation" -> Session-Aufbau erfolgt mit SVS </li><br>
+    (Standard). "SurveillanceStation" -> Session-Aufbau erfolgt mit SVS. <br>
+    Um eine Session mit der Surveillance Station aufzubauen muss ein Nutzer mit passenden Privilegien Profil in der SVS
+    angelegt werden. Für weitere Informationen bitte "get &lt;name&gt; versionNotes 5" ausführen.  </li><br>
   
+  <a name="simu_SVSversion"></a>
   <li><b>simu_SVSversion</b><br>
     Simuliert eine andere SVS-Version. (es ist nur eine niedrigere als die installierte SVS 
     Version möglich !) </li><br>
 	
+  <a name="snapGalleryBoost"></a>
   <li><b>snapGalleryBoost</b><br>
     Wenn gesetzt, werden die letzten Schnappschüsse (default 3) über Polling im Speicher gehalten und mit "set/get snapGallery" 
 	aufbereitet angezeigt. Dieser Modus bietet sich an wenn viele bzw. Fullsize Images angezeigt werden sollen. 
 	Ist das Attribut eingeschaltet, können bei "set/get snapGallery" keine Argumente mehr mitgegeben werden. 
     (siehe Attribut "snapGalleryNumber") </li><br>
   
+  <a name="snapGalleryColumns"></a>
   <li><b>snapGalleryColumns</b><br>
     Die Anzahl der Snaps die in einer Reihe im Popup erscheinen sollen (default 3). </li><br>
 	
+  <a name="snapGalleryHtmlAttr"></a>
   <li><b>snapGalleryHtmlAttr</b><br>
     hiermit kann die Bilddarstellung beeinflusst werden. <br>
 	Ist das Attribut nicht gesetzt, wird das Attribut "htmlattr" verwendet. <br>
@@ -32740,27 +32938,33 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;video $HTMLATTR controls autoplay&gt;
 		<br>
         </li>
 		
+  <a name="snapGalleryNumber"></a>
   <li><b>snapGalleryNumber</b><br>
     Die Anzahl der abzurufenden Schnappschüsse (default 3). </li><br>
 	
+  <a name="snapGallerySize"></a>  
   <li><b>snapGallerySize</b><br>
      Mit diesem Attribut kann die Qualität der Images eingestellt werden (default "Icon"). <br>
 	 Im Modus "Full" wird die original vorhandene Auflösung der Images abgerufen. Dies erfordert mehr Ressourcen und kann die 
 	 Anzeige verlangsamen. Mit "snapGalleryBoost=1" kann die Ausgabe beschleunigt werden, da in diesem Fall die Aufnahmen über 
 	 Polling abgerufen und nur noch zur Anzeige gebracht werden. </li><br>
 	
+  <a name="showStmInfoFull"></a>
   <li><b>showStmInfoFull</b><br>
     zusaätzliche Streaminformationen wie LiveStreamUrl, StmKeyUnicst, StmKeymjpegHttp werden 
     ausgegeben</li><br>
   
+  <a name="showPassInLog"></a>
   <li><b>showPassInLog</b><br>
-    wenn gesetzt wird das verwendete Passwort im Logfile (verbose 4) angezeigt. 
+    Wenn gesetzt, wird das verwendete Passwort im Logfile mit verbose 4 angezeigt. 
     (default = 0) </li><br>
   
+  <a name="videofolderMap"></a>
   <li><b>videofolderMap</b><br>
     ersetzt den Inhalt des Readings "VideoFolder", Verwendung z.B. bei gemounteten 
     Verzeichnissen </li><br>
   
+  <a name="verbose"></a>
   <li><b>verbose</b> </li><br>
   
   <ul>
@@ -34667,7 +34871,13 @@ Die Anzeige der Position, des States, ist eine ausschliesslich rechnerisch ermit
 <h3>SmartPi</h3>
 <div class='langLinks'>[<a href='commandref.html#SmartPi'>EN</a> DE]</div>
 
-<p><a name="Snapcast"></a>
+<p><a name="SmarterCoffee"></a>
+<h3>SmarterCoffee</h3>
+<ul>
+  Leider keine deutsche Dokumentation vorhanden. Die englische Version gibt es
+  hier: <a href='commandref.html#SmarterCoffee'>SmarterCoffee</a><br/>
+</ul>
+<a name="Snapcast"></a>
 <h3>Snapcast</h3>
 <ul>
   Leider keine deutsche Dokumentation vorhanden. Die englische Version gibt es
@@ -40774,13 +40984,17 @@ attr SVG_link_archetype attributes group</pre>
         Ausf&uuml;hrungszeit berechnet.</li><br>
 
     <a name="disabledForIntervals"></a>
-    <li>disabledForIntervals HH:MM-HH:MM HH:MM-HH-MM...<br>
+    <li>disabledForIntervals HH:MM-HH:MM HH:MM-HH:MM ...<br>
         Das Argument ist eine Leerzeichengetrennte Liste von Minuszeichen-
         getrennten HH:MM oder D@HH:MM Paaren. Falls die aktuelle Uhrzeit
         zwischen diesen Werten f&auml;llt, dann wird die Ausf&uuml;hrung, wie
         beim disable, ausgesetzt. Statt HH:MM kann man auch HH oder HH:MM:SS
         angeben.  D ist der Tag der Woche, mit 0 als Sonntag and 3 als
-        Mittwoch.  Um einen Intervall um Mitternacht zu spezifizieren, muss man
+        Mittwoch. Die Angabe des Wochentags f&uuml;r den "von" Wert impliziert
+        _nicht_ den gleichen Tag f&uuml;r den "bis" Wert, z.Bsp.  deaktiviert
+        1@00-24 die Asf&uuml;hrung von Montag bis Ende der Woche, aber nicht
+        Sonntag (da alle Zeitangaben am Montag vor 1@00 liegen).
+        Um einen Intervall um Mitternacht zu spezifizieren, muss man
         zwei einzelne angeben, z.Bsp.:
         <ul>
           23:00-24:00 00:00-01:00

+ 37 - 5
fhem/core/fhem.cfg

@@ -67,6 +67,7 @@ attr initialUsbCheck group System
 attr initialUsbCheck icon rc_USB
 attr initialUsbCheck room System
 define Mosquitto MQTT mqtt:1883
+attr Mosquitto DbLogExclude .*
 attr Mosquitto room Interfaces
 define TabletUiEval HTTPSRV ftuidev/ ./www/tablet_dev TabletUI-Development
 attr TabletUiEval alias Tablet Eval
@@ -91,6 +92,7 @@ attr at_DbLoggingReduce room Log,System
 define Siri siri
 attr Siri room Interfaces
 define DBLogging_Reopen at +*00:15:00 set DBLogging reopen
+attr DBLogging_Reopen DbLogExclude .*
 attr DBLogging_Reopen alias Database-Log Reopen
 attr DBLogging_Reopen group Logging
 attr DBLogging_Reopen icon time_timer
@@ -101,7 +103,7 @@ attr allowed_WEB group Web-Access
 attr allowed_WEB icon scene_keyboard
 attr allowed_WEB room System
 attr allowed_WEB validFor WEB
-define DOIFtools DOIFtools associated DOIF: UpdateNew
+define DOIFtools DOIFtools associated DOIF: UpdateNew diAkkuladenWandTabletKU
 attr DOIFtools DOIFtoolsMenuEntry 1
 attr DOIFtools group System
 attr DOIFtools icon helper_doiftools
@@ -231,9 +233,12 @@ attr OurCalendars modes next
 attr OurCalendars room Kalender
 attr OurCalendars sourcecolor FamilyCal:green,PitCal:darkblue,JuleCal:red,NeleCal:purple,HolgerCal:lightgreen
 attr OurCalendars timeshort 1
-define ku.Tablet FULLY 192.168.1.51 admin 3600
+define ku.Tablet FULLY 192.168.1.51 admin 300
 attr ku.Tablet DbLogExclude .*
-attr ku.Tablet pollInterval 3600
+attr ku.Tablet DbLogInclude battery_level,power
+attr ku.Tablet alias Wandtablet
+attr ku.Tablet group Tablet
+attr ku.Tablet pollInterval 300
 attr ku.Tablet room Küche,Interfaces
 define AbfallCal Calendar ical url https://calendar.google.com/calendar/ical/clua211u44hi3308sq48mjv96k%40group.calendar.google.com/private-fdbdd74c3688099af97446b66b6dbd23/basic.ics
 attr AbfallCal DbLogExclude .*
@@ -248,6 +253,7 @@ attr myABFALL room Kalender
 attr myABFALL stateFormat next_text in next_days Tag(en)
 attr myABFALL weekday_mapping Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag
 define UpdateCounter CustomReadings
+attr UpdateCounter DbLogExclude .*
 attr UpdateCounter event-on-update-reading FHEM,FTUI,ALL
 attr UpdateCounter group Update
 attr UpdateCounter icon system_fhem_reboot
@@ -277,7 +283,33 @@ attr Systemreboot group Update
 attr Systemreboot room System
 define TradfriGW TradfriGateway 192.168.1.74 gPf8AKIxwNOwmK3j
 attr TradfriGW DbLogExclude .*
-attr TradfriGW room Interfaces
+attr TradfriGW room Interfaces,Tradfri
 define tr_WhiteTemp01 TradfriDevice 65537
 attr tr_WhiteTemp01 DbLogExclude .*
-attr tr_WhiteTemp01 room Studio
+attr tr_WhiteTemp01 room Tradfri,Studio
+define tr_ColorTempNele TradfriDevice 65539
+attr tr_ColorTempNele DbLogExclude .*
+attr tr_ColorTempNele room Nele,Tradfri
+define ku.Tabletpower MQTT_DEVICE
+attr ku.Tabletpower userattr subscribeReading_state
+attr ku.Tabletpower DbLogExclude .*
+attr ku.Tabletpower IODev Mosquitto
+attr ku.Tabletpower alias Tablet Netzteil
+attr ku.Tabletpower event-on-change-reading state
+attr ku.Tabletpower eventMap ON:on OFF:off
+attr ku.Tabletpower group Tablet
+attr ku.Tabletpower publishSet on off toggle /SmartHome/ku/S20_01/cmnd/power
+attr ku.Tabletpower room Küche
+attr ku.Tabletpower subscribeReading_state /SmartHome/ku/S20_01/stat/POWER
+attr ku.Tabletpower webCmd on:off:toggle
+define diAkkuladenWandTabletKU DOIF ([ku.Tablet:battery_level] < 25 and [ku.Tablet:power]eq'unplugged') (set ku.Tabletpower on) DOELSEIF ([ku.Tablet:battery_level] > 90 and [ku.Tablet:power]eq'plugged') (set ku.Tabletpower off) DOELSE
+attr diAkkuladenWandTabletKU DbLogExclude .*
+attr diAkkuladenWandTabletKU do always
+attr diAkkuladenWandTabletKU group Tablet
+attr diAkkuladenWandTabletKU room Automation,Küche
+attr diAkkuladenWandTabletKU wait 600:600
+define plotPowerTabletKu SVG DBLogging:ku.Tablet:CURRENT
+attr plotPowerTabletKu DbLogExclude .*
+attr plotPowerTabletKu group Tablet
+attr plotPowerTabletKu label "Battery Min: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1} - Power: $data{currval2}"
+attr plotPowerTabletKu room Küche

+ 9 - 1
fhem/core/www/tablet/css/fhem-tablet-ui.css

@@ -361,6 +361,10 @@ a:active {
     height: 100%;
 }
 
+.display > [class*='display-'] {
+    text-align: initial;
+}
+
 .display-topleft {
     position: absolute;
     top: 0px;
@@ -972,7 +976,7 @@ main > .box.horizontal {
     justify-content: flex-start;
 }
 
-.box.vertical.items-top,
+.box.vertical.items-bottom,
 .vbox.items-bottom {
     justify-content: flex-end;
 }
@@ -2232,6 +2236,7 @@ div[data-type="link"] > div.fa {
 .row > [class*='cell-'].top-space,
 .row > [class*='col-'].top-space,
 .row > .col.top-space,
+.display > .top-space,
 [class*='row-'] > .cell.top-space,
 [class*='row-'] > [class*='cell-'].top-space,
 [class*='row-'] > .col.top-space,
@@ -2244,6 +2249,7 @@ div[data-type="link"] > div.fa {
 .row > [class*='cell-'][class*='top-space-2'],
 .row > [class*='col-'][class*='top-space-2'],
 .row > .col[class*='top-space-2'],
+.display > .top-space-2,
 [class*='row-'] > .cell[class*='top-space-2'],
 [class*='row-'] > [class*='cell-'][class*='top-space-2'],
 [class*='row-'] > .col[class*='top-space-2'],
@@ -2256,6 +2262,7 @@ div[data-type="link"] > div.fa {
 .row > [class*='cell-'][class*='top-space-3'],
 .row > [class*='col-'][class*='top-space-3'],
 .row > .col[class*='top-space-3'],
+.display > .top-space-3,
 [class*='row-'] > .cell[class*='top-space-3'],
 [class*='row-'] > [class*='cell-'][class*='top-space-3'],
 [class*='row-'] > .col[class*='top-space-3'],
@@ -2268,6 +2275,7 @@ div[data-type="link"] > div.fa {
 .row > [class*='cell-'][class*='top-space-4'],
 .row > [class*='col-'][class*='top-space-4'],
 .row > .col[class*='top-space-4'],
+.display > .top-space-4,
 [class*='row-'] > .cell[class*='top-space-4'],
 [class*='row-'] > [class*='cell-'][class*='top-space-4'],
 [class*='row-'] > .col[class*='top-space-4'],

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 1
fhem/core/www/tablet/css/fhem-tablet-ui.min.css


+ 5 - 4
fhem/core/www/tablet/js/widget_svgplot.js

@@ -1,5 +1,5 @@
 /* FTUI Plugin
- * Copyright (c) 2016 Mario Stephan <mstephan@shared-files.de>
+ * Copyright (c) 2016-2018 Mario Stephan <mstephan@shared-files.de>
  * originally created by Thomas Nesges
  * https://raw.githubusercontent.com/nesges/Widgets-for-fhem-tablet-ui/master/www/tablet/js/widget_svgplot.js
  * Under MIT License (http://www.opensource.org/licenses/mit-license.php)
@@ -35,7 +35,7 @@ var Modul_svgplot = function () {
         me.elements.each(function (index) {
             var elem = $(this);
             elem.attr("data-ready", "");
-            
+
             me.init_attr(elem);
             var spinner = $('<div />').appendTo(elem);
             spinner.famultibutton({
@@ -51,7 +51,8 @@ var Modul_svgplot = function () {
             var logfile = elem.data('logfile');
             if (gplot && logdev && logfile) {
                 elem.empty();
-                var src = ftui.config.fhemDir + '/SVG_showLog?dev=' + device + '&logdev=' + logdev + '&gplotfile=' + gplot + '&logfile=' + logfile + '&_=1';
+                var src = ftui.config.fhemDir + 'SVG_showLog?dev=' + device + '&logdev=' +
+                    logdev + '&gplotfile=' + gplot + '&logfile=' + logfile + '&_=1';
                 var img = $('<img/>', {
                     alt: logfile,
                     src: src,
@@ -94,4 +95,4 @@ var Modul_svgplot = function () {
     });
 
     return me;
-};
+};