From c8ffebfd15d5de3982ab5be657e4c0170c14b8d5 Mon Sep 17 00:00:00 2001
From: markusbloch <>
Date: Mon, 15 Sep 2014 10:12:17 +0000
Subject: [PATCH] FB_CALLMONITOR: - use FHEMWEB multiple widget for attr
reverse-search - remove "all" from reverse-search (backwards compatibility
still given) - change "internal" to "phonebook" for attr reverse-search
(backward compatibility still given) - allow comma and pipe as delimiter for
attr reverse-search - fixing reverse search regexp for dasoerliche.de -
improve AttrFn handling - minor docu changes - code cosmetics
git-svn-id: https://svn.fhem.de/fhem/trunk@6554 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/CHANGED | 3 +
fhem/FHEM/72_FB_CALLMONITOR.pm | 739 ++++++++++++++++-----------------
2 files changed, 370 insertions(+), 372 deletions(-)
diff --git a/fhem/CHANGED b/fhem/CHANGED
index 643babe20..7ebb1928c 100644
--- a/fhem/CHANGED
+++ b/fhem/CHANGED
@@ -1,5 +1,8 @@
# 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: FB_CALLMONITOR: reverse-search attribute is now providing all
+ possible values, which are selectable (via fhemweb_multiple.js).
+ see commandref for all possible values
- feature: speed up through caching of postproc and regex in ECMDDevice
- bugfix: fixed handling of autocreation for 10_OWServer.pm
- feature: option to cope with partial messages in ECMD/ECMDDevice
diff --git a/fhem/FHEM/72_FB_CALLMONITOR.pm b/fhem/FHEM/72_FB_CALLMONITOR.pm
index 73d290df6..27b8ce74f 100755
--- a/fhem/FHEM/72_FB_CALLMONITOR.pm
+++ b/fhem/FHEM/72_FB_CALLMONITOR.pm
@@ -34,6 +34,7 @@ use Time::HiRes qw(gettimeofday);
use DevIo;
use Digest::MD5;
use HttpUtils;
+use DevIo;
my %connection_type = (
0 => "0",
@@ -92,9 +93,7 @@ FB_CALLMONITOR_Initialize($)
$hash->{UndefFn} = "FB_CALLMONITOR_Undef";
$hash->{AttrFn} = "FB_CALLMONITOR_Attr";
-
-
- $hash->{AttrList}= "do_not_notify:0,1 disable:0,1 unique-call-ids:0,1 local-area-code remove-leading-zero:0,1 reverse-search-cache-file reverse-search:all,internal,klicktel.de,dasoertliche.de,search.ch,dasschnelle.at,none reverse-search-cache:0,1 reverse-search-phonebook-file ".
+ $hash->{AttrList}= "do_not_notify:0,1 disable:0,1 unique-call-ids:0,1 local-area-code remove-leading-zero:0,1 reverse-search-cache-file reverse-search:multiple,phonebook,klicktel.de,dasoertliche.de,search.ch,dasschnelle.at reverse-search-cache:0,1 reverse-search-phonebook-file ".
$readingFnAttributes;
}
@@ -147,29 +146,25 @@ FB_CALLMONITOR_Undef($$)
sub
FB_CALLMONITOR_Get($@)
{
+ my ($hash, @arguments) = @_;
-my ($hash, @arguments) = @_;
+ return "argument missing" if(int(@arguments) < 2);
-
-return "argument missing" if(int(@arguments) < 2);
-
-if($arguments[1] eq "search")
-{
- if($arguments[2] =~ /^\d+$/)
+ if($arguments[1] eq "search")
{
- return FB_CALLMONITOR_reverseSearch($hash, $arguments[2]);
+ if($arguments[2] =~ /^\d+$/)
+ {
+ return FB_CALLMONITOR_reverseSearch($hash, $arguments[2]);
+ }
+ else
+ {
+ return "given argument is not a telephone number";
+ }
}
else
{
- return "given argument is not a telephone number";
+ return "unknown argument ".$arguments[1].", choose one of search";
}
-}
-else
-{
-
- return "unknown argument ".$arguments[1].", choose one of search";
-
-}
}
@@ -178,7 +173,6 @@ FB_CALLMONITOR_Set($@)
{
my ($hash, @a) = @_;
-
my $usage = (defined($hash->{helper}{PHONEBOOK}) ? "Unknown argument ".$a[1].", choose one of rereadPhonebook" : "");
if($a[1] eq "rereadPhonebook")
@@ -201,7 +195,9 @@ FB_CALLMONITOR_Read($)
my ($hash) = @_;
my $buf = DevIo_SimpleRead($hash);
+
return "" if(!defined($buf));
+
my $name = $hash->{NAME};
my @array;
my $reverse_search = undef;
@@ -210,18 +206,18 @@ FB_CALLMONITOR_Read($)
my $external_number = undef;
Log3 $name, 5, "FB_CALLMONITOR ($name) - received data: $data";
+
@array = split(";", $data);
$external_number = $array[3] if(not $array[3] eq "0" and $array[1] eq "RING" and $array[3] ne "");
$external_number = $array[5] if($array[1] eq "CALL" and $array[3] ne "");
-
$external_number =~ s/^0// if(AttrVal($name, "remove-leading-zero", "0") eq "1" and defined($external_number));
if(defined($external_number) and not $external_number =~ /^0/ and $area_code ne "")
{
if($area_code =~ /^0[1-9]\d+$/)
{
- $external_number = $area_code.$external_number;
+ $external_number = $area_code.$external_number;
}
else
{
@@ -234,13 +230,15 @@ FB_CALLMONITOR_Read($)
$reverse_search = FB_CALLMONITOR_reverseSearch($hash, $external_number) if(defined($external_number) and AttrVal($name, "reverse-search", "none") ne "none");
+ Log3 $name, 4, "FB_CALLMONITOR ($name) - reverse search returned: $reverse_search" if(defined($reverse_search));
+
if($array[1] eq "CALL" or $array[1] eq "RING")
{
delete($hash->{helper}{TEMP}{$array[2]}) if(exists($hash->{helper}{TEMP}{$array[2]}));
if(AttrVal($name, "unique-call-ids", "0") eq "1")
{
- $hash->{helper}{TEMP}{$array[2]}{call_id} = Digest::MD5::md5_hex($data);
+ $hash->{helper}{TEMP}{$array[2]}{call_id} = Digest::MD5::md5_hex($data);
}
}
@@ -299,23 +297,23 @@ FB_CALLMONITOR_Read($)
if($array[1] eq "DISCONNECT")
{
delete($hash->{helper}{TEMP}{$array[2]}) if(exists($hash->{helper}{TEMP}{$array[2]}));
- }
-
-
-
+ }
readingsEndUpdate($hash, 1);
}
-
+#####################################
+# Reconnects to FritzBox in case of disconnects
sub
FB_CALLMONITOR_Ready($)
{
- my ($hash) = @_;
+ my ($hash) = @_;
- return DevIo_OpenDev($hash, 1, undef);
+ return DevIo_OpenDev($hash, 1, undef);
}
+#####################################
+# Handles Attribute Changes
sub
FB_CALLMONITOR_Attr($@)
{
@@ -326,16 +324,20 @@ FB_CALLMONITOR_Attr($@)
if($a[0] eq "set")
{
- if($a[2] eq "reverse-search" or $a[2] eq "reverse-search-phonebook-file")
+ if($a[2] eq "reverse-search" and $a[3] =~ /(all|internal|phonebook)/)
{
- $attr{$name}{"reverse-search-phonebook-file"} = $a[3] if($a[2] eq "reverse-search-phonebook-file");
- FB_CALLMONITOR_loadInternalPhonebookFile($hash);
+ FB_CALLMONITOR_loadInternalPhonebookFile($hash, 1);
+ return;
+ }
+
+ if($a[2] eq "reverse-search-phonebook-file")
+ {
+ return FB_CALLMONITOR_loadInternalPhonebookFile($hash, 1, $a[3]);
}
if($a[2] eq "reverse-search-cache-file")
{
- $attr{$name}{"reverse-search-cache-file"} = $a[3];
- FB_CALLMONITOR_loadCacheFile($hash);
+ return FB_CALLMONITOR_loadCacheFile($hash,$a[3]);
}
if($a[2] eq "disable")
@@ -346,403 +348,398 @@ FB_CALLMONITOR_Attr($@)
}
elsif($a[3] eq "1")
{
- DevIo_CloseDev($hash);
- $hash->{STATE} = "disabled";
+ DevIo_CloseDev($hash);
+ $hash->{STATE} = "disabled";
}
}
-
}
elsif($a[0] eq "del")
{
-
if($a[2] eq "reverse-search" or $a[2] eq "reverse-search-phonebook-file")
{
delete($hash->{helper}{PHONEBOOK}) if(defined($hash->{helper}{PHONEBOOK}));
}
+ if($a[2] eq "reverse-search-cache" )
+ {
+ delete($hash->{helper}{CACHE}) if(defined($hash->{helper}{CACHE}));
+ }
+
if( $a[2] eq "disable")
{
- DevIo_OpenDev($hash, 0, undef);
+ DevIo_OpenDev($hash, 0, undef);
}
}
-
return undef;
-
}
+############################################################################################################
+#
+# Begin of helper functions
+#
+############################################################################################################
+
+
+#####################################
+# Performs a reverse search of a phone number
sub
FB_CALLMONITOR_reverseSearch($$)
{
-my ($hash, $number) = @_;
-my $name = $hash->{NAME};
-my $result;
-my $invert_match = undef;
+ my ($hash, $number) = @_;
+ my $name = $hash->{NAME};
+ my $result;
+ my $invert_match = undef;
+ my @attr_list = split("(,|\\|)", AttrVal($name, "reverse-search", "none"));
+
+ chomp $number;
-chomp $number;
+ # Using internal phonebook if available and enabled
+ if((grep { /^(all|phonebook|internal)$/ } @attr_list) and defined($hash->{helper}{PHONEBOOK}))
+ {
+ if(defined($hash->{helper}{PHONEBOOK}{$number}))
+ {
+ Log3 $name, 4, "FB_CALLMONITOR $name using internal phonebook for reverse search of $number";
+ return $hash->{helper}{PHONEBOOK}{$number};
+ }
+ }
-# Using internal phonebook if available and enabled
-if(AttrVal($name, "reverse-search", "none") eq "all" or AttrVal($name, "reverse-search", "none") eq "internal" and defined($hash->{helper}{PHONEBOOK}))
-{
- if(defined($hash->{helper}{PHONEBOOK}{$number}))
- {
- Log3 $name, 4, "FB_CALLMONITOR $name using internal phonebook for reverse search of $number";
- return $hash->{helper}{PHONEBOOK}{$number};
-
- }
-}
-
-# Using Cache if enabled
-if(AttrVal($name, "reverse-search-cache", "0") eq "1")
-{
- if(defined($hash->{helper}{CACHE}{$number}))
- {
- Log3 $name, 4, "FB_CALLMONITOR $name using cache for reverse search of $number";
- if($hash->{helper}{CACHE}{$number} ne "timeout")
- {
- return $hash->{helper}{CACHE}{$number};
- }
- }
-}
-
-# Ask klicktel.de
-if(AttrVal($name, "reverse-search", "none") eq "all" or AttrVal($name, "reverse-search", "none") eq "klicktel.de")
-{
- Log3 $name, 4, "FB_CALLMONITOR: $name using klicktel.de for reverse search of $number";
-
- $result = GetFileFromURL("http://www.klicktel.de/inverssuche/index/search?_dvform_posted=1&phoneNumber=".$number, 5, undef, 1);
- if(not defined($result))
- {
- if(AttrVal($name, "reverse-search-cache", "0") eq "1")
- {
- $hash->{helper}{CACHE}{$number} = "timeout";
- undef($result);
- return "timeout";
- }
- }
- else
- {
-
- if($result =~ /1\. (.+?)<\/a>/)
- {
- $invert_match = $1;
- $invert_match = FB_CALLMONITOR_html2txt($invert_match);
- FB_CALLMONITOR_writeToCache($hash, $number, $invert_match) if(AttrVal($name, "reverse-search-cache", "0") eq "1");
- undef($result);
- return $invert_match;
- }
- elsif(not $result =~ /Leider wurde zu dieser Suche kein Eintrag gefunden/)
- {
- Log3 $name, 3, "FB_CALLMONITOR: the reverse search result for $number could not be extracted from klicktel.de. Please contact the FHEM community.";
- }
- }
-}
-
-# Ask dasoertliche.de
-if(AttrVal($name, "reverse-search", "none") eq "all" or AttrVal($name, "reverse-search", "none") eq "dasoertliche.de")
-{
- Log3 $name, 4, "FB_CALLMONITOR: $name using dasoertliche.de for reverse search of $number";
-
- $result = GetFileFromURL("http://www1.dasoertliche.de/?form_name=search_inv&ph=".$number, 5, undef, 1);
- if(not defined($result))
- {
+ # Using Cache if enabled
if(AttrVal($name, "reverse-search-cache", "0") eq "1")
{
- $hash->{helper}{CACHE}{$number} = "timeout";
- undef($result);
- return "timeout";
+ if(defined($hash->{helper}{CACHE}{$number}))
+ {
+ Log3 $name, 4, "FB_CALLMONITOR $name using cache for reverse search of $number";
+ if($hash->{helper}{CACHE}{$number} ne "timeout")
+ {
+ return $hash->{helper}{CACHE}{$number};
+ }
+ }
}
-
- }
- else
- {
- #Log 2, $result;
- if($result =~ /(.+?)<\/span>/)
- {
- $invert_match = $1;
- $invert_match = FB_CALLMONITOR_html2txt($invert_match);
- FB_CALLMONITOR_writeToCache($hash, $number, $invert_match) if(AttrVal($name, "reverse-search-cache", "0") eq "1");
- undef($result);
- return $invert_match;
- }
- elsif(not $result =~ /wir konnten keine Treffer finden/)
- {
- Log3 $name, 3, "FB_CALLMONITOR: the reverse search result for $number could not be extracted from dasoertliche.de. Please contact the FHEM community.";
- }
- }
-}
-# SWITZERLAND ONLY!!! Ask search.ch
-if(AttrVal($name, "reverse-search", "none") eq "search.ch")
-{
- Log3 $name, 4, "FB_CALLMONITOR: $name using search.ch for reverse search of $number";
-
- $result = GetFileFromURL("http://tel.search.ch/?tel=".$number, 5, undef, 1);
- if(not defined($result))
- {
- if(AttrVal($name, "reverse-search-cache", "0") eq "1")
+ # Ask klicktel.de
+ if((grep { /^(all|klicktel\.de)$/ } @attr_list))
+ {
+ Log3 $name, 4, "FB_CALLMONITOR: $name using klicktel.de for reverse search of $number";
+
+ $result = GetFileFromURL("http://www.klicktel.de/inverssuche/index/search?_dvform_posted=1&phoneNumber=".$number, 5, undef, 1);
+ if(not defined($result))
+ {
+ if(AttrVal($name, "reverse-search-cache", "0") eq "1")
+ {
+ $hash->{helper}{CACHE}{$number} = "timeout";
+ undef($result);
+ return "timeout";
+ }
+ }
+ else
+ {
+ if($result =~ /1\. (.+?)<\/a>/)
+ {
+ $invert_match = $1;
+ $invert_match = FB_CALLMONITOR_html2txt($invert_match);
+ FB_CALLMONITOR_writeToCache($hash, $number, $invert_match) if(AttrVal($name, "reverse-search-cache", "0") eq "1");
+ undef($result);
+ return $invert_match;
+ }
+ elsif(not $result =~ /Leider wurde zu dieser Suche kein Eintrag gefunden/)
+ {
+ Log3 $name, 3, "FB_CALLMONITOR: the reverse search result for $number could not be extracted from klicktel.de. Please contact the FHEM community.";
+ }
+ }
+ }
+
+ # Ask dasoertliche.de
+ if(grep { /^(all|dasoertliche\.de)$/ } @attr_list)
{
- $hash->{helper}{CACHE}{$number} = "timeout";
- undef($result);
- return "timeout";
- }
-
- }
- else
- {
- #Log 2, $result;
- if($result =~ /