From b18dea6a0416733f6e2eddf0ffa4187575b42adf Mon Sep 17 00:00:00 2001
From: borisneubert
Date: Sat, 19 Jan 2013 13:36:29 +0000
Subject: [PATCH] new command deletereading
git-svn-id: https://fhem.svn.sourceforge.net/svnroot/fhem/trunk/fhem@2533 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
docs/commandref_frame.html | 35 ++++++++++++++++++-----
docs/commandref_frame_DE.html | 45 +++++++++++++++++++++--------
fhem.pl | 54 ++++++++++++++++++++++++++++-------
3 files changed, 104 insertions(+), 30 deletions(-)
diff --git a/docs/commandref_frame.html b/docs/commandref_frame.html
index acd3fddec..7ffdd84dd 100644
--- a/docs/commandref_frame.html
+++ b/docs/commandref_frame.html
@@ -37,6 +37,7 @@
define
delete
deleteattr
+ deletereading
fheminfo
get
getstate
@@ -466,6 +467,23 @@ A line ending with \ will be concatenated with the next one, so long lines
+
+delete
+
+ delete <devspec>
+
+ Delete something created with the define command.
+ See the Device specification section for details on
+ <devspec>.
+ After deletion, the global event "DELETED" will be generated, see the notify
+ section for details.
+ Examples:
+
+
+
+
deleteattr
@@ -485,19 +503,22 @@ A line ending with \ will be concatenated with the next one, so long lines
-
-delete
+
+deletereading
- delete <devspec>
+ deletereading <devspec> <readingname>
- Delete something created with the define command.
+ Delete the reading <readingname>
+ for a device. <readingname> is a perl regular expression that must match the whole name of the reading.
+ Use with greatest care! FHEM might crash if you delete vital readings of a device.
See the Device specification section for details on
<devspec>.
- After deletion, the global event "DELETED" will be generated, see the notify
- section for details.
+
+
Examples:
- delete lamp
+ deletereading mySensor temp1
+ deletereading mySensor temp\d+
diff --git a/docs/commandref_frame_DE.html b/docs/commandref_frame_DE.html
index 1dc703ede..c6d81bbf1 100644
--- a/docs/commandref_frame_DE.html
+++ b/docs/commandref_frame_DE.html
@@ -34,6 +34,7 @@
define
delete
deleteattr
+ deletereading
fheminfo
get
getstate
@@ -482,6 +483,25 @@ Zeilen erstreckende Befehle, indem man keine \ am Zeilenende eingeben muss.
+
+delete
+
+ delete <devspec>
+
+ Löscht etwas was mit dem define Befehl erstellt worden
+ ist.
+ Lesen Sie sich bitte den Abschnitt Device specification für
+ Details von
+ <devspec> durch.
+ Nach dem löschen, wird das globale Ereignis "DELETED" erzeugt. Lesen Sie bitte
+ den Abschnitt zu "notify" für genauere Informationen durch.
+ Beispiel:
+
+
+
+
deleteattr
@@ -503,21 +523,22 @@ Zeilen erstreckende Befehle, indem man keine \ am Zeilenende eingeben muss.
-
-delete
+
+deletereading
- delete <devspec>
+ deletereading <devspec> <readingname>
- Löscht etwas was mit dem define Befehl erstellt worden
- ist.
- Lesen Sie sich bitte den Abschnitt Device specification für
- Details von
- <devspec> durch.
- Nach dem löschen, wird das globale Ereignis "DELETED" erzeugt. Lesen Sie bitte
- den Abschnitt zu "notify" für genauere Informationen durch.
- Beispiel:
+ Delete the reading <readingname>
+ for a device. <readingname> is a perl regular expression that must match the whole name of the reading.
+ Use with greatest care! FHEM might crash if you delete vital readings of a device.
+ See the Device specification section for details on
+ <devspec>.
+
+
+ Examples:
- delete lamp
+ deletereading mySensor temp1
+ deletereading mySensor temp\d+
diff --git a/fhem.pl b/fhem.pl
index e49b90c85..5d9458b65 100755
--- a/fhem.pl
+++ b/fhem.pl
@@ -186,9 +186,9 @@ my $cvsid = '$Id$';
my $namedef =
"where is either:\n" .
"- a single device name\n" .
- "- a list seperated by komma (,)\n" .
- "- a regexp, if contains one of the following characters: *[]^\$\n" .
- "- a range seperated by dash (-)\n";
+ "- a list separated by komma (,)\n" .
+ "- a regexp, if it contains one of the following characters: *[]^\$\n" .
+ "- a range separated by dash (-)\n";
my $stt_sec; # Used by SecondsTillTomorrow()
my $stt_day; # Used by SecondsTillTomorrow()
my @cmdList; # Remaining commands in a chain. Used by sleep
@@ -220,6 +220,8 @@ $readingFnAttributes = "event-on-change-reading:0,1 event-on-update-reading:0,1
Hlp=>" ,define a device/at/notify entity" },
"deleteattr" => { Fn=>"CommandDeleteAttr",
Hlp=>" [],delete attribute for " },
+ "deletereading" => { Fn=>"CommandDeleteReading",
+ Hlp=>" [],delete user defined reading for " },
"delete" => { Fn=>"CommandDelete",
Hlp=>",delete the corresponding definition(s)"},
"get" => { Fn=>"CommandGet",
@@ -1398,8 +1400,8 @@ CommandDeleteAttr($$)
$a[0] = $sdev;
if($a[1] eq "userReadings") {
- Debug "Deleting userReadings for $sdev";
- delete($defs{$sdev}{fhem}{userReadings});
+ #Debug "Deleting userReadings for $sdev";
+ delete($defs{$sdev}{fhem}{'.userReadings'});
}
$ret = CallFn($sdev, "AttrFn", "del", @a);
@@ -1419,6 +1421,37 @@ CommandDeleteAttr($$)
return join("\n", @rets);
}
+#############
+sub
+CommandDeleteReading($$)
+{
+ my ($cl, $def) = @_;
+
+ my @a = split(" ", $def, 2);
+ return "Usage: deletereading \n$namedef" if(@a != 2);
+
+ my @rets;
+ foreach my $sdev (devspec2array($a[0])) {
+
+ if(!defined($defs{$sdev})) {
+ push @rets, "Please define $sdev first";
+ next;
+ }
+
+ $a[0] = $sdev;
+ my $readingspec= '^' . $a[1] . '$';
+
+ foreach my $reading (grep { /$readingspec/ } keys ($defs{$sdev}{READINGS})) {
+ delete($defs{$sdev}{READINGS}{$reading});
+ push @rets, "Deleted reading $reading for device $sdev";
+ }
+
+ }
+
+ return join("\n", @rets);
+}
+
+#############
sub
PrintHash($$)
{
@@ -1773,7 +1806,7 @@ CommandAttr($$)
my $regexi= '\s*(\w+)\s+({.*?})\s*'; # matches myReading1 { codecodecode1 }
my $regexo= '^(' . $regexi . ')(,\s*(.*))*$';
- Debug "arg is $arg";
+ #Debug "arg is $arg";
while($arg =~ /$regexo/) {
my $userReading= $2;
@@ -1782,7 +1815,7 @@ CommandAttr($$)
$userReadings{$userReading}= $perlCode;
$arg= defined($5) ? $5 : "";
}
- $defs{$sdev}{fhem}{userReadings}= \%userReadings;
+ $defs{$sdev}{fhem}{'.userReadings'}= \%userReadings;
}
if($a[1] eq "IODev" && (!$a[2] || !defined($defs{$a[2]}))) {
@@ -2926,7 +2959,6 @@ EOD
################################################################
#
# Wrappers for commonly used core functions in device-specific modules.
-# This part maintained by Boris Neubert omega at online dot de
#
################################################################
@@ -2973,10 +3005,10 @@ readingsEndUpdate($$)
my $name = $hash->{NAME};
# process user readings
- if(defined($hash->{fhem}{userReadings})) {
- my %userReadings= %{$hash->{fhem}{userReadings}};
+ if(defined($hash->{fhem}{'.userReadings'})) {
+ my %userReadings= %{$hash->{fhem}{'.userReadings'}};
foreach my $userReading (keys %userReadings) {
- Debug "Evaluating " . $userReadings{$userReading};
+ #Debug "Evaluating " . $userReadings{$userReading};
my $value= eval $userReadings{$userReading};
if($@) {
$value = "Error evaluating $name userReading $userReading: $@";