diff --git a/fhem/CHANGED b/fhem/CHANGED index 96771bbb0..9480d9a15 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - update: 98_DOIFtools.pm: add delete readings in other devices than DOIF - update: 88_HMCCU.pm: version 3.9 - update: 98_DOIFtools.pm: marking an eventline in DOIFs event monitor shows different representations of the event as operand diff --git a/fhem/FHEM/98_DOIFtools.pm b/fhem/FHEM/98_DOIFtools.pm index 20952df84..9fa90f527 100644 --- a/fhem/FHEM/98_DOIFtools.pm +++ b/fhem/FHEM/98_DOIFtools.pm @@ -45,51 +45,8 @@ sub DOIFtoolsCounterReset($); sub DOIFtoolsDeleteStatReadings; my @DOIFtools_we =(); - - -######################### -sub DOIFtools_Initialize($) -{ - my ($hash) = @_; - $hash->{DefFn} = "DOIFtools_Define"; - $hash->{SetFn} = "DOIFtools_Set"; - $hash->{GetFn} = "DOIFtools_Get"; - $hash->{UndefFn} = "DOIFtools_Undef"; - $hash->{AttrFn} = "DOIFtools_Attr"; - $hash->{NotifyFn} = "DOIFtools_Notify"; - - $hash->{FW_detailFn} = "DOIFtools_fhemwebFn"; - - $data{FWEXT}{"/DOIFtools_logWrapper"}{CONTENTFUNC} = "DOIFtools_logWrapper"; - - my $oldAttr = "target_room:noArg target_group:noArg executeDefinition:noArg executeSave:noArg eventMonitorInDOIF:noArg readingsPrefix:noArg"; - $hash->{AttrList} = "DOIFtoolsExecuteDefinition:1,0 DOIFtoolsTargetRoom DOIFtoolsTargetGroup DOIFtoolsExecuteSave:1,0 DOIFtoolsReadingsPrefix DOIFtoolsEventMonitorInDOIF:1,0 DOIFtoolsHideModulShortcuts:1,0 DOIFtoolsHideGetSet:1,0 DOIFtoolsMyShortcuts:textField-long DOIFtoolsMenuEntry:1,0 DOIFtoolsHideStatReadings:1,0 DOIFtoolsEventOnDeleted:1,0 disabledForIntervals ".$oldAttr; -} - -sub DOIFtools_dO ($$$$){return "";} -# FW_detailFn for DOIF injecting event monitor -sub DOIFtools_eM($$$$) { - my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn. - my $ret = ""; - # Event Monitor - my $a0 = ReadingsVal($d,".eM", "off") eq "on" ? "off" : "on"; - $ret .= "

Event monitor: toggle  "; - $ret .= "
"; - - my $a = ""; - if (ReadingsVal($d,".eM","off") eq "on") { - $ret .= ""; - my $filter = $a ? ($a eq "log" ? "global" : $a) : ".*"; - $ret .= "

"; - $ret .= "Events (Filter: $filter) ". - "  FHEM log ". - "". - "  
\n"; - $ret .= "
"; - $ret .= ""; - $ret .= "
"; - $ret .= " EOF - $ret .= ""; + + +######################### +sub DOIFtools_Initialize($) +{ + my ($hash) = @_; + $hash->{DefFn} = "DOIFtools_Define"; + $hash->{SetFn} = "DOIFtools_Set"; + $hash->{GetFn} = "DOIFtools_Get"; + $hash->{UndefFn} = "DOIFtools_Undef"; + $hash->{AttrFn} = "DOIFtools_Attr"; + $hash->{NotifyFn} = "DOIFtools_Notify"; + + $hash->{FW_detailFn} = "DOIFtools_fhemwebFn"; + + $data{FWEXT}{"/DOIFtools_logWrapper"}{CONTENTFUNC} = "DOIFtools_logWrapper"; + + my $oldAttr = "target_room:noArg target_group:noArg executeDefinition:noArg executeSave:noArg eventMonitorInDOIF:noArg readingsPrefix:noArg"; + $hash->{AttrList} = "DOIFtoolsExecuteDefinition:1,0 DOIFtoolsTargetRoom DOIFtoolsTargetGroup DOIFtoolsExecuteSave:1,0 DOIFtoolsReadingsPrefix DOIFtoolsEventMonitorInDOIF:1,0 DOIFtoolsHideModulShortcuts:1,0 DOIFtoolsHideGetSet:1,0 DOIFtoolsMyShortcuts:textField-long DOIFtoolsMenuEntry:1,0 DOIFtoolsHideStatReadings:1,0 DOIFtoolsEventOnDeleted:1,0 disabledForIntervals ".$oldAttr; +} + +sub DOIFtools_dO ($$$$){return "";} +# FW_detailFn for DOIF injecting event monitor +sub DOIFtools_eM($$$$) { + my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn. + my $ret = ""; + # Event Monitor + my $a0 = ReadingsVal($d,".eM", "off") eq "on" ? "off" : "on"; + $ret .= "

Event monitor: toggle  "; + $ret .= "
"; + + my $a = ""; + if (ReadingsVal($d,".eM","off") eq "on") { + $ret .= ""; + my $filter = $a ? ($a eq "log" ? "global" : $a) : ".*"; + $ret .= "

"; + $ret .= "Events (Filter: $filter) ". + "  FHEM log ". + "". + "  
\n"; + $ret .= "
"; + $ret .= ""; + $ret .= "
"; + $ret .= $DOIFtoolsJavaScript; } return $ret; } @@ -313,56 +315,7 @@ sub DOIFtools_fhemwebFn($$$$) { $ret .= "
"; $ret .= ""; $ret .= "
"; - $ret .= ""; + $ret .= $DOIFtoolsJavaScript; } return $ret; } @@ -783,8 +736,10 @@ sub DOIFtools_Set($@) my $ret = ""; my @ret = (); my @doifList = devspec2array("TYPE=DOIF"); + my @deviList = devspec2array("TYPE!=DOIF"); my @ntL =(); my $dL = join(",",sort @doifList); + my $deL = join(",",sort @deviList); my $st = AttrVal($pn,"DOIFtoolsHideStatReadings","") ? ".stat_" : "stat_"; my %types = (); @@ -808,8 +763,26 @@ sub DOIFtools_Set($@) push @ret, $ret if($ret); } $ret = join("\n", @ret); + readingsSingleUpdate($hash,"targetDOIF","",0); return $ret; } else { + readingsSingleUpdate($hash,"targetDOIF","",0); + return "no reading selected."; + } + } elsif ($arg eq "targetDevice") { + readingsSingleUpdate($hash,"targetDevice",$value,0); + } elsif ($arg eq "deleteReadingsInTargetDevice") { + if ($value) { + my @i = split(",",$value); + foreach my $i (@i) { + $ret = CommandDeleteReading(undef,ReadingsVal($pn,"targetDevice","")." $i"); + push @ret, $ret if($ret); + } + $ret = join("\n", @ret); + readingsSingleUpdate($hash,"targetDevice","",0); + return $ret; + } else { + readingsSingleUpdate($hash,"targetDevice","",0); return "no reading selected."; } } elsif ($arg eq "doStatistics") { @@ -862,18 +835,28 @@ sub DOIFtools_Set($@) readingsSingleUpdate($hash,"statisticsDeviceFilterRegex", $value,0); } } else { + my $hardcoded = "doStatistics:disabled,enabled,deleted specialLog:0,1"; + my $retL = "unknown argument $arg for $pn, choose one of statisticsTYPEs:multiple-strict,.*,$tL sourceAttribute:readingList targetDOIF:$dL targetDevice:$deL recording_target_duration:0,1,6,12,24,168 statisticsDeviceFilterRegex statisticsShowRate_ge ".(AttrVal($pn,"DOIFtoolsHideGetSet",0) ? $hardcoded :""); + if (ReadingsVal($pn,"targetDOIF","")) { my $tn = ReadingsVal($pn,"targetDOIF",""); my @rL = (); foreach my $key (keys %{$defs{$tn}->{READINGS}}) { - push @rL, $key if ($key !~ "^(Device|state|error|cmd|e_|timer_|wait_|matched_|last_cmd|mode)"); + push @rL, $key if ($key !~ "^(Device|state|error|cmd|e_|timer_|wait_|matched_|last_cmd|mode|\.eM)"); } - my $rL = join(",",@rL); - return "unknown argument $arg for $pn, choose one of statisticsTYPEs:multiple-strict,.*,$tL sourceAttribute:readingList targetDOIF:$dL deleteReadingsInTargetDOIF:multiple-strict,$rL recording_target_duration:0,1,6,12,24,168 statisticsDeviceFilterRegex statisticsShowRate_ge ".(AttrVal($pn,"DOIFtoolsHideGetSet",0) ? $hardcoded :""); - } else { - return "unknown argument $arg for $pn, choose one of statisticsTYPEs:multiple-strict,.*,$tL sourceAttribute:readingList targetDOIF:$dL recording_target_duration:0,1,6,12,24,168 statisticsDeviceFilterRegex statisticsShowRate_ge ".(AttrVal($pn,"DOIFtoolsHideGetSet",0) ? $hardcoded :""); + $retL .= " deleteReadingsInTargetDOIF:multiple-strict,".join(",", sort @rL); } + if (ReadingsVal($pn,"targetDevice","")) { + my $tn = ReadingsVal($pn,"targetDevice",""); + my @rL = (); + my $rx = ReadingsVal($pn,".debug","") ? "^(state)" : "^(state|[.])"; + foreach my $key (keys %{$defs{$tn}->{READINGS}}) { + push @rL, $key if ($key !~ $rx); + } + $retL .= " deleteReadingsInTargetDevice:multiple-strict,".join(",", sort @rL); + } + return $retL; } return $ret; } @@ -1056,7 +1039,7 @@ sub DOIFtools_Get($@) } else { my $hardcoded = "checkDOIF:noArg statisticsReport:noArg runningTimerInDOIF:noArg"; - return "unknown argument $arg for $pn, choose one of readingsGroup_for:multiple-strict,$dL DOIF_to_Log:multiple-strict,$dL userReading_nextTimer_for:multiple-strict,$ntL ".(AttrVal($pn,"DOIFtoolsHideGetSet",1) ? $hardcoded :""); + return "unknown argument $arg for $pn, choose one of readingsGroup_for:multiple-strict,$dL DOIF_to_Log:multiple-strict,$dL userReading_nextTimer_for:multiple-strict,$ntL ".(AttrVal($pn,"DOIFtoolsHideGetSet",0) ? $hardcoded :""); } return $ret; @@ -1083,6 +1066,7 @@ DOIFtools contains tools to support DOIF.
  • navigation between device listings in logfile if opened via DOIFtools.
  • create userReadings in DOIF devices displaying real dates for weekday restricted timer.
  • delete user defined readings in DOIF devices with multiple choice.
  • +
  • delete visible readings in other devices with multiple choice, but not state.
  • record statistics data about events.
  • limitting recordig duration.
  • generate a statistics report.
  • @@ -1114,6 +1098,7 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.
  • Navigation zwischen den DOIF-Listings im Logfile, wenn es über DOIFtools geöffnet wird.
  • erstellen von userReadings in DOIF-Geräten zur Anzeige des realen Datums bei Wochentag behafteten Timern.
  • löschen von benutzerdefinierten Readings in DOIF-Definitionen über eine Mehrfachauswahl.
  • +
  • löschen von Readings in anderen Geräten über eine Mehrfachauswahl, nicht state.
  • erfassen statistischer Daten über Events.
  • Begrenzung der Datenaufzeichnungsdauer.
  • erstellen eines Statistikreports.
  • @@ -1166,6 +1151,12 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.
    set <name> targetDOIF <target name>
    targetDOIF vor dem Löschen der Readings muss das Ziel-DOIF gesetzt werden.

    + set <name> deleteReadingInTargetDevice <readings to delete name>
    + deleteReadingInTargetDevice löscht sichtbare Readings, ausser state im Ziel-Gerät. Bitte den Gefahrenhinweis zum Befehl deletereading beachten!
    +
    + set <name> targetDevice <target name>
    + targetDevice vor dem Löschen der Readings muss das Ziel-Gerät gesetzt werden.
    +
    set <name> sourceAttribute <readingList>
    sourceAttribute vor dem Erstellen einer ReadingsGroup muss das Attribut gesetzt werden aus dem die Readings gelesen werden, um die ReadingsGroup zu erstellen und zu beschriften. Default, readingsList