From 4a9d4bbdf3fb4aef5ff4864cec9d2f98fbc59cb1 Mon Sep 17 00:00:00 2001 From: markusbloch <> Date: Tue, 8 Jan 2019 12:20:03 +0000 Subject: [PATCH] FB_CALLMONITOR: support for contact images added (download via TR-064) (Forum: #92636) git-svn-id: https://svn.fhem.de/fhem/trunk@18180 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 5 + fhem/FHEM/72_FB_CALLMONITOR.pm | 345 +++++++++++++++++++++++++++------ 2 files changed, 286 insertions(+), 64 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 90bf1a489..736caf4f8 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,10 @@ # 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: 72_FB_CALLMONITOR: support for contact images and download of + all available contact images from FritzBox + phonebooks via TR-064 API. + (new attributes: contactImageDirectory, + contactDefaultImage and contactImageViaTR064) - feature: 72_FB_CALLLIST: support for contact images (new attributes contactImageDirectory and contactImageDirectory) - change: 70_ONKYO_AVR: clearing screenItemCxxx readings on page update diff --git a/fhem/FHEM/72_FB_CALLMONITOR.pm b/fhem/FHEM/72_FB_CALLMONITOR.pm index 4964fa40b..a7cffa298 100755 --- a/fhem/FHEM/72_FB_CALLMONITOR.pm +++ b/fhem/FHEM/72_FB_CALLMONITOR.pm @@ -76,6 +76,9 @@ FB_CALLMONITOR_Initialize($) "fritzbox-user ". "apiKeySearchCh ". "sendKeepAlives:none,5m,10m,15m,30m,1h ". + "contactImageViaTR064:0,1 ". + "contactImageDirectory ". + "contactDefaultImage ". $readingFnAttributes; } @@ -473,7 +476,7 @@ FB_CALLMONITOR_Read($) if($array[1] =~ /^CALL|RING$/) { - delete($hash->{helper}{TEMP}{$array[2]}) if(exists($hash->{helper}{TEMP}{$array[2]})); + delete($hash->{helper}{TEMP}{$array[2]}); if(AttrVal($name, "unique-call-ids", "0") eq "1") { @@ -487,6 +490,11 @@ FB_CALLMONITOR_Read($) $hash->{helper}{TEMP}{$array[2]}{external_number} = (defined($external_number) ? $external_number : "unknown"); $hash->{helper}{TEMP}{$array[2]}{external_name} = (defined($reverse_search) ? $reverse_search : "unknown"); $hash->{helper}{TEMP}{$array[2]}{internal_number} = $array[4]; + + if(my $contact_image = FB_CALLMONITOR_getContactImage($hash, $hash->{helper}{TEMP}{$array[2]}{external_number})) + { + $hash->{helper}{TEMP}{$array[2]}{contact_image} = $contact_image; + } } if($array[1] eq "CALL") @@ -542,7 +550,7 @@ FB_CALLMONITOR_Read($) if($array[1] eq "DISCONNECT") { - delete($hash->{helper}{TEMP}{$array[2]}) if(exists($hash->{helper}{TEMP}{$array[2]})); + delete($hash->{helper}{TEMP}{$array[2]}); } } } @@ -1107,6 +1115,7 @@ sub FB_CALLMONITOR_readPhonebook($;$) delete($hash->{helper}{PHONEBOOK}); delete($hash->{helper}{PHONEBOOKS}); + delete($hash->{helper}{IMAGE_URLS}); if(AttrVal($name, "fritzbox-remote-phonebook", "0") eq "1") { @@ -1189,7 +1198,9 @@ sub FB_CALLMONITOR_readPhonebook($;$) } } - delete($hash->{helper}{PHONEBOOK_URL}) if(exists($hash->{helper}{PHONEBOOK_URL})) + delete($hash->{helper}{PHONEBOOK_URL}); + + FB_CALLMONITOR_downloadImageURLs($hash, $testPassword); } } else @@ -1254,6 +1265,15 @@ sub FB_CALLMONITOR_parsePhonebook($$) { $contact = $1; + my $imageURL; + + if($contact =~ m,([^<>]+),) + { + $imageURL = $1; + + $hash->{helper}{IMAGE_URLS}{$imageURL} = [] unless(exists($hash->{helper}{IMAGE_URLS}{$imageURL})); + } + if($contact =~ m,(.+?),) { $contact_name = $1; @@ -1267,11 +1287,20 @@ sub FB_CALLMONITOR_parsePhonebook($$) $count_contacts++; Log3 $name, 4, "FB_CALLMONITOR ($name) - found $contact_name with number $number"; $out->{$number} = FB_CALLMONITOR_html2txt($contact_name); + + if($imageURL) + { + Log3 $name, 5, "FB_CALLMONITOR ($name) - found image for $contact_name with number $number"; + push @{$hash->{helper}{IMAGE_URLS}{$imageURL}}, $number; + } + undef $number; } } undef $contact_name; } + + } } @@ -1298,7 +1327,7 @@ sub FB_CALLMONITOR_loadCacheFile($;$) if($file ne "" and -r $file) { - delete($hash->{helper}{CACHE}) if(defined($hash->{helper}{CACHE})); + delete($hash->{helper}{CACHE}); Log3 $hash->{NAME}, 3, "FB_CALLMONITOR ($name) - loading cache file $file"; @@ -1349,7 +1378,7 @@ sub FB_CALLMONITOR_loadTextFile($;$) if($file ne "" and -r $file) { - delete($hash->{helper}{TEXTFILE}) if(defined($hash->{helper}{TEXTFILE})); + delete($hash->{helper}{TEXTFILE}); Log3 $hash->{NAME}, 3, "FB_CALLMONITOR ($name) - loading textfile $file"; @@ -1431,7 +1460,7 @@ sub FB_CALLMONITOR_readRemotePhonebookViaTelnet($;$) my $fb_user = AttrVal($name, "fritzbox-user", undef); my $fb_pw = FB_CALLMONITOR_readPassword($hash, $testPassword); - delete($hash->{helper}{READ_PWD}) if(exists($hash->{helper}{READ_PWD})); + delete($hash->{helper}{READ_PWD}); return "no password available to access FritzBox. Please set your FRITZ!Box password via 'set ".$hash->{NAME}." password '" unless(defined($fb_pw)); my $telnet = Net::Telnet->new(Timeout => 10, Errmode => 'return'); @@ -1504,36 +1533,39 @@ sub FB_CALLMONITOR_readRemotePhonebookViaTelnet($;$) $telnet->print('exit'); $telnet->close; - delete($hash->{helper}{PWD_NEEDED}) if(exists($hash->{helper}{PWD_NEEDED})); + delete($hash->{helper}{PWD_NEEDED}); return (undef, join('', @FBPhoneBook)); } ##################################### -# execute TR-064 methods via HTTP/SOAP request -sub FB_CALLMONITOR_requestTR064($$$$;$$) +# performs a HTTP based request via TR-064 port with authentication +sub FB_CALLMONITOR_requestHTTPviaTR064($$$$;$$) { - my ($hash, $path, $command, $type, $command_arg, $testPassword) = @_; + my ($hash, $url, $data, $header, $auth, $testPassword) = @_; my $name = $hash->{NAME}; - + my ($fb_ip,undef) = split(/:/, ($hash->{DeviceName}), 2); + my ($fb_user, $fb_pw); my $param; - my ($err, $data); + my ($err, $response); - my $fb_user = AttrVal($name, "fritzbox-user", "admin"); - - $hash->{helper}{READ_PWD} = 1; - my $fb_pw = FB_CALLMONITOR_readPassword($hash, $testPassword); - delete($hash->{helper}{READ_PWD}); - - unless(defined($fb_pw)) + if($auth) { - $hash->{helper}{PWD_NEEDED} = 1; - return "no password available to access FritzBox. Please set your FRITZ!Box password via 'set ".$hash->{NAME}." password '"; + $fb_user = AttrVal($name, "fritzbox-user", "admin"); + + $hash->{helper}{READ_PWD} = 1; + $fb_pw = FB_CALLMONITOR_readPassword($hash, $testPassword); + delete($hash->{helper}{READ_PWD}); + + unless(defined($fb_pw)) + { + $hash->{helper}{PWD_NEEDED} = 1; + return "no password available to access FritzBox. Please set your FRITZ!Box password via 'set ".$hash->{NAME}." password '"; + } } - - my $tr064_base_url = "http://".urlEncode($fb_user).":".urlEncode($fb_pw)."\@$fb_ip:49000"; + my $tr064_base_url = "http://".($auth ? urlEncode($fb_user).":".urlEncode($fb_pw)."\@" : "") ."$fb_ip:49000"; $param->{noshutdown} = 1; $param->{timeout} = AttrVal($name, "fritzbox-remote-timeout", 5); @@ -1556,7 +1588,7 @@ sub FB_CALLMONITOR_requestTR064($$$$;$$) $param->{data} = $get_security_port; Log3 $name, 4, "FB_CALLMONITOR ($name) - request SSL port for TR-064 access via method GetSecurityPort:\n$get_security_port"; - my ($err, $data) = HttpUtils_BlockingGet($param); + my ($err, $response) = HttpUtils_BlockingGet($param); if($err ne "") { @@ -1564,41 +1596,41 @@ sub FB_CALLMONITOR_requestTR064($$$$;$$) return "error while requesting phonebooks: $err"; } - if($data eq "" and exists($param->{code})) + if($response eq "" and exists($param->{code})) { Log3 $name, 3, "FB_CALLMONITOR ($name) - received http code ".$param->{code}." without any data after requesting security port via TR-064"; return "received no data after requesting security port via TR-064"; } - Log3 $name, 5, "FB_CALLMONITOR ($name) - received TR-064 method GetSecurityPort response:\n$data"; + Log3 $name, 5, "FB_CALLMONITOR ($name) - received TR-064 method GetSecurityPort response:\n$response"; - if($data =~ /(\d+)<\/NewSecurityPort>/) + if($response =~ /(\d+)<\/NewSecurityPort>/) { - $tr064_base_url = "https://".urlEncode($fb_user).":".urlEncode($fb_pw)."\@$fb_ip:$1"; + $tr064_base_url = "https://".($auth ? urlEncode($fb_user).":".urlEncode($fb_pw)."\@" : "")."$fb_ip:$1"; $hash->{helper}{TR064}{SECURITY_PORT} = $1; } } else { - $tr064_base_url = "https://".urlEncode($fb_user).":".urlEncode($fb_pw)."\@$fb_ip:".$hash->{helper}{TR064}{SECURITY_PORT}; + $tr064_base_url = "https://".($auth ? urlEncode($fb_user).":".urlEncode($fb_pw)."\@" : "")."$fb_ip:".$hash->{helper}{TR064}{SECURITY_PORT}; } - # éxecute the TR-064 request - my $soap_request = ''. - ''. - ''. - "".($command_arg ? $command_arg : "")."". - ''. - ''; + $param->{url} = "$tr064_base_url$url"; + $param->{header} = $header if($header); - $param->{url} = "$tr064_base_url$path"; - $param->{header} = "SOAPACTION: $type#$command\r\nContent-Type: text/xml; charset=utf-8"; - $param->{data} = $soap_request; - Log3 $name, 5, "FB_CALLMONITOR ($name) - requesting TR-064 method $command:\n$soap_request"; + if($data) + { + $param->{data} = $data if($data); + Log3 $name, 4, "FB_CALLMONITOR ($name) - sending TR-064 request:\n$data"; + } + else + { + Log3 $name, 4, "FB_CALLMONITOR ($name) - requesting TR-064 URL: $url"; + } + + ($err, $response) = HttpUtils_BlockingGet($param); - ($err, $data) = HttpUtils_BlockingGet($param); - if($err ne "") { if(exists($param->{code}) and $param->{code} eq "401") @@ -1609,20 +1641,50 @@ sub FB_CALLMONITOR_requestTR064($$$$;$$) } else { - Log3 $name, 3, "FB_CALLMONITOR ($name) - error while requesting TR-064 method $command: $err"; - return "error while requesting TR-064 TR-064 method $command: $err"; + Log3 $name, 3, "FB_CALLMONITOR ($name) - error while requesting TR-064 URL $url: $err"; + return "error while requesting TR-064 URL $url: $err"; } } - if($data eq "" and exists($param->{code})) + if($response eq "" and exists($param->{code})) { - Log3 $name, 3, "FB_CALLMONITOR ($name) - received http code ".$param->{code}." without any data after requesting TR-064 method $command"; - return "received no data after requesting TR-064 method $command"; + Log3 $name, 3, "FB_CALLMONITOR ($name) - received http code ".$param->{code}." without any data after requesting TR-064 URL $url"; + return "received no data after requesting TR-064 URL $url"; } - Log3 $name, 5, "FB_CALLMONITOR ($name) - received TR-064 method $command response:\n$data"; + if($param->{httpheader} =~ m,^Content-Type:\s*text,mi) + { + Log3 $name, 5, "FB_CALLMONITOR ($name) - received TR-064 response for URL $url:\n$response"; + } + else + { + Log3 $name, 5, "FB_CALLMONITOR ($name) - received TR-064 response for URL $url"; + } + + return (undef, $response, $param); - return (undef, $data); +} + +##################################### +# execute TR-064 methods via HTTP/SOAP request +sub FB_CALLMONITOR_requestTR064($$$$;$$) +{ + my ($hash, $path, $command, $type, $command_arg, $testPassword) = @_; + + my $name = $hash->{NAME}; + + # éxecute the TR-064 request + my $soap_request = ''. + ''. + ''. + "".($command_arg ? $command_arg : "")."". + ''. + ''; + + + my $header = "SOAPACTION: $type#$command\r\nContent-Type: text/xml; charset=utf-8"; + + return FB_CALLMONITOR_requestHTTPviaTR064($hash, $path, $soap_request, $header, 1, $testPassword); } ##################################### @@ -1656,19 +1718,21 @@ sub FB_CALLMONITOR_identifyPhoneBooksViaTR064($;$) # request name and FritzBox phone id for each list item foreach (@phonebooks) { + my $item_id = $_; + my $phb_id; - Log3 $name, 5, "FB_CALLMONITOR ($name) - requesting phonebook description for id $_"; + Log3 $name, 5, "FB_CALLMONITOR ($name) - requesting phonebook description for id $item_id"; - ($err, $data) = FB_CALLMONITOR_requestTR064($hash, "/upnp/control/x_contact", "GetPhonebook", "urn:dslforum-org:service:X_AVM-DE_OnTel:1", "$_", $testPassword); + ($err, $data) = FB_CALLMONITOR_requestTR064($hash, "/upnp/control/x_contact", "GetPhonebook", "urn:dslforum-org:service:X_AVM-DE_OnTel:1", "$item_id", $testPassword); if ($err) { - Log3 $name, 3, "FB_CALLMONITOR ($name) - error while requesting phonebook description for id $_: $err"; - return "error while requesting phonebook description for id $_: $err"; + Log3 $name, 3, "FB_CALLMONITOR ($name) - error while requesting phonebook description for id $item_id: $err"; + return "error while requesting phonebook description for id $item_id: $err"; } - Log3 $name, 5, "FB_CALLMONITOR ($name) - received response with phonebook description for id $_:\n$data"; + Log3 $name, 5, "FB_CALLMONITOR ($name) - received response with phonebook description for id $item_id:\n$data"; if($data =~ m,(.+?).*?.*?pbid=(\d+)\D*?,si) { @@ -1765,6 +1829,125 @@ sub FB_CALLMONITOR_readRemotePhonebookViaTR064($$;$) return (undef, $phonebook); } +##################################### +# retrieves a session id to download files via TR-064 (phonebook contact images) +sub FB_CALLMONITOR_getSIDviaTR064($) +{ + + + my ($hash, $testPassword) = @_; + my $name = $hash->{NAME}; + + my ($err, $response) = FB_CALLMONITOR_requestTR064($hash, "/upnp/control/deviceconfig", "X_AVM-DE_CreateUrlSID", "urn:dslforum-org:service:DeviceConfig:1", undef, $testPassword); + + if($err) + { + Log3 $name, 3, "FB_CALLMONITOR ($name) - error while requesting session id via TR064: $err"; + return undef; + } + + if($response =~ m,(.+?),) + { + return $1; + } + + return undef; + +} + +##################################### +# downloads all available image URL's via TR-064 +sub FB_CALLMONITOR_downloadImageURLs($$) +{ + my ($hash, $testPassword) = @_; + my $name = $hash->{NAME}; + + if($hash->{helper}{IMAGE_URLS} and AttrVal($name,"contactImageViaTR064", "1") eq "1") + { + my $sid = FB_CALLMONITOR_getSIDviaTR064($hash); + my $local_path = AttrVal($name,"contactImageDirectory", undef); + + return unless(defined($sid) and defined($local_path)); + + if(! -d $local_path) + { + eval { use File::Path }; + if($@) + { + Log3 $name, 3, "FB_CALLMONITOR ($name) - unable to load File::Path perl module to create contact images directory '$local_path'. Please create it by yourself"; + return undef; + } + + eval {File::Path::make_path($local_path) }; + if($@) + { + Log3 $name, 3, "FB_CALLMONITOR ($name) - unable to create contact images directory '$local_path': $@"; + return undef; + } + } + + foreach my $url (keys %{$hash->{helper}{IMAGE_URLS}}) + { + my ($err, $file, $param) = FB_CALLMONITOR_requestHTTPviaTR064($hash, $url."&".$sid, undef, undef, 0, $testPassword); + + if($err) + { + Log3 $name, 3, "FB_CALLMONITOR ($name) - error while requesting image URL $url via TR064: $err"; + continue; + } + + if($param->{httpheader} =~ /Content-Disposition: attachment; filename="[^"\s]+(\.\w+)"$/m) + { + my $suffix = $1; + + foreach my $number (@{$hash->{helper}{IMAGE_URLS}{$url}}) + { + + my $filename = $local_path."/".$number.$suffix; + my $result = FileWrite({FileName => $local_path."/".$number.$suffix, ForceType=> "file", NoNL=> 1}, $file); + + if($result) + { + Log3 $name, 3, "FB_CALLMONITOR ($name) - error while writing image $filename: $result"; + } + } + } + } + + Log3 $name, 2, "FB_CALLMONITOR ($name) - downloaded ".(scalar keys %{$hash->{helper}{IMAGE_URLS}})." contact images from all phonebooks"; + + } +} + +##################################### +# returns the filename of a corresponding contact image if exist. +sub FB_CALLMONITOR_getContactImage($$) +{ + + my ($hash, $number) = @_; + + my $name = $hash->{NAME}; + + my $local_path = AttrVal($name,"contactImageDirectory", undef); + + return undef unless(defined($local_path)); + + $local_path =~ s,/+$,,; + + opendir(DIR, $local_path) or return undef; + + while (my $file = readdir(DIR)) { + + next if($file =~ /^\./); + next if(-d "$local_path/$file"); + next unless($file =~ /^$number\./); + + return $file; + } + + return AttrVal($name,"contactDefaultImage", "none"); +} + ##################################### # identifys the phonebooks defined on the FritzBox via web interface (http) sub FB_CALLMONITOR_identifyPhoneBooksViaWeb($;$) @@ -1779,7 +1962,7 @@ sub FB_CALLMONITOR_identifyPhoneBooksViaWeb($;$) $hash->{helper}{READ_PWD} = 1; $fb_pw = FB_CALLMONITOR_readPassword($hash, $testPassword); - delete($hash->{helper}{READ_PWD}) if(exists($hash->{helper}{READ_PWD})); + delete($hash->{helper}{READ_PWD}); return "no password available to access FritzBox. Please set your FRITZ!Box password via 'set ".$hash->{NAME}." password '" unless(defined($fb_pw)); @@ -1820,7 +2003,7 @@ sub FB_CALLMONITOR_identifyPhoneBooksViaWeb($;$) $data = $1; } - delete($hash->{helper}{PHONEBOOK_NAMES}) if(exists($hash->{helper}{PHONEBOOK_NAMES})); + delete($hash->{helper}{PHONEBOOK_NAMES}); while($data =~ m,]*for="uiBookid:(\d+)"[^>]*>\s*(.+?)\s*,gcs) { @@ -1830,7 +2013,7 @@ sub FB_CALLMONITOR_identifyPhoneBooksViaWeb($;$) Log3 $name, 3, "FB_CALLMONITOR ($name) - phonebooks found: ".join(", ", map { $hash->{helper}{PHONEBOOK_NAMES}{$_}." (id: $_)" } sort keys %{$hash->{helper}{PHONEBOOK_NAMES}}) if(exists($hash->{helper}{PHONEBOOK_NAMES})); - delete($hash->{helper}{PWD_NEEDED}) if(exists($hash->{helper}{PWD_NEEDED})); + delete($hash->{helper}{PWD_NEEDED}); return undef; } @@ -1852,7 +2035,7 @@ sub FB_CALLMONITOR_readRemotePhonebookViaWeb($$;$) $hash->{helper}{READ_PWD} = 1; $fb_pw = FB_CALLMONITOR_readPassword($hash, $testPassword); - delete($hash->{helper}{READ_PWD}) if(exists($hash->{helper}{READ_PWD})); + delete($hash->{helper}{READ_PWD}); return "no password available to access FritzBox. Please set your FRITZ!Box password via 'set ".$hash->{NAME}." password '" unless(defined($fb_pw)); @@ -1908,7 +2091,7 @@ sub FB_CALLMONITOR_readRemotePhonebookViaWeb($$;$) return "received http code ".$param->{code}." without any data"; } - delete($hash->{helper}{PWD_NEEDED}) if(exists($hash->{helper}{PWD_NEEDED})); + delete($hash->{helper}{PWD_NEEDED}); return (undef, $phonebook); } @@ -2271,10 +2454,25 @@ sub FB_CALLMONITOR_sendKeepAlive($)
  • sendKeepAlives (none,5m,10m,15m,30m,1h)
  • If activated, FB_CALLMONITOR sends a keep-alive on a regularly basis depending on the configured value. This ensures a working connection when the connected FritzBox is operating behind another NAT-based router (e.g. another FritzBox) so the connection will not be detected as "dead" and therefore blocked.

    Possible values: none,5m,10m,15m,30m,1h
    - Default value: none (no keep-alives will be sent)
    + Default value: none (no keep-alives will be sent)

    + +
  • contactImageDirectory <directory>
  • + If set, FB_CALLMONITOR generates the reading "contact_image" if a file with the external number as filename is found in this directory (e.g. "0123456567.jpg"). + If no matching file exist in this directory or the external number is unknown, the reading "contact_image" is set to "none" (can be override by attribute contactDefaultImage). +

    + +
  • contactDefaultImage <filename>
  • + If set, FB_CALLMONITOR uses the given filename instead of "none" in case no image exists in the configured contact image directory or the external number is unknown. +

    +
  • contactImageViaTR064 0,1
  • + If this attribute is activated, FB_CALLMONITOR will download all available contact images from the FritzBox phonebook(s) via TR-064 (if attribute fritzbox-remote-phonebook-via is set to tr064) and will store them in the directory configured by attribute contactImageDirectory. + The downloaded images will then be used as contact images for the reading "contact_image". +

    + Possible values: 0 => off , 1 => on
    + Default value is 1 (contact images will be downloaded via TR-064 from FritzBox)
    - +
    Generated Events:

      @@ -2288,6 +2486,7 @@ sub FB_CALLMONITOR_sendKeepAlive($)
    • call_duration - The call duration in seconds. Is only generated at a disconnect event. The value 0 means, the call was not taken by anybody.
    • call_id - The call identification number to separate events of two or more different calls at the same time. This id number is equal for all events relating to one specific call.
    • missed_call - This event will be raised in case of a incoming call, which is not answered. If available, also the name of the calling number will be displayed.
    • +
    • contact_image - This event will be raised if attribute contactImageDirectory is configured. It contains the filename of the corresponding contact image filename or "none" if no file exist or external number is unknown.
    @@ -2439,10 +2638,26 @@ sub FB_CALLMONITOR_sendKeepAlive($)
  • sendKeepAlives (none,5m,10m,15m,30m,1h)
  • Wenn dieses Attribut gesetzt ist, wird ein zyklisches Keep-Alive im konfigurierten Zeitabstand an die FritzBox gesendet um die Verbindung aktiv zu halten. Dadurch bleibt die Verbindung bestehen, insbesondere wenn die verbundene FritzBox sich hinter einem weiteren NAT-Router befindet (z.B. einer weiteren FritzBox). Dadurch wird die Verbindung in so einem Fall nicht fälschlicherweise als "tot" erkannt und geblockt.

    Mögliche Werte: none,5m,10m,15m,30m,1h
    - Standardwert ist "none" (es werden keine Keep-Alives gesendet)
    + Standardwert ist "none" (es werden keine Keep-Alives gesendet)

    + +
  • contactImageDirectory <Verzeichnis>
  • + Sofern gesetzt, generiert FB_CALLMONITOR das Reading "contact_image" sofern eine Datei mit der externen Rufnummer als Dateinamen (z.B. "012323456.jpg") in diesem Verzeichnis existiert. + Wenn keine passende Datei in dem Verzeichnis existiert oder die externe Rufnummer unterdrückt ist, wird das Reading "contact_image" auf den Wert "none" gesetzt (kann mit dem Attribut contactDefaultImage geändert werden) +

    + +
  • contactDefaultImage <Dateiname>
  • + Sofern gesetzt, verwendet FB_CALLMONITOR den gesetzten Dateinamen anstelle von "none", sollte keine passende Datei zu einer Rufnummer existieren oder die Rufnummer unterdrückt sein. +

    + +
  • contactImageViaTR064 0,1
  • + Wenn dieses Attribut aktiviert ist, lädt FB_CALLMONITOR alle verfügbaren Kontaktbilder aus dem FritzBox Telefonbüchern via TR-064 (if attribute fritzbox-remote-phonebook-via is set to tr064) und speichert diese in dem Verzeichnis contactImageDirectory. + Die heruntergeladenen Kontaktbilder werden dann automatisch für das Reading "contact_image" verwendet. +

    + Mögliche Werte: 0 => deaktiviert , 1 => aktiviert
    + Standardwert ist 1 (aktiviert)


    - +
    Generierte Events:

      @@ -2456,7 +2671,9 @@ sub FB_CALLMONITOR_sendKeepAlive($)
    • call_duration - Die Gesprächsdauer in Sekunden. Dieser Wert wird nur bei einem disconnect-Event erzeugt. Ist der Wert 0, so wurde das Gespräch von niemandem angenommen.
    • call_id - Die Identifizierungsnummer eines einzelnen Gesprächs. Dient der Zuordnung bei zwei oder mehr parallelen Gesprächen, damit alle Events eindeutig einem Gespräch zugeordnet werden können
    • missed_call - Dieses Event wird nur generiert, wenn ein eingehender Anruf nicht beantwortet wird. Sofern der Name dazu bekannt ist, wird dieser ebenfalls mit angezeigt.
    • -
    +
  • contact_image - Dieses Event wird nur generiert, wenn das Attribut contactImageDirectory gesetzt ist. Es enthält das zugehörige Kontaktfoto als Dateiname oder "none", falls kein entsprechendes Kontaktfoto existiert, oder die Rufnummer unterdrückt ist.
  • + +