Neues Modul Telefonmonitor (TM)

Begonnen von Elektrolurch, 20 September 2014, 14:17:38

Vorheriges Thema - Nächstes Thema

bewa58

Weitere Info:

Hab gerade über "Festnetz" von AMT A nach AMT B angerufen. Und siehe da: DECT wird angezeigt.
Wenn ich vom Handy anrufe erfolgt keine Anzeige.

Ist keine ISDN-Anlage?!
Provider o2 mit 3 Amtnummern via Internet

JoWiemann

Dann muss ich im Modul oder im 72_FB_CALLMONITOR mal sehen, was bei einem Handyanruf übergeben wird.


Grüße Jörg

Gesendet von iPhone mit Tapatalk
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

bewa58

@Jörg
Es funktioniert !!

Nachdem ich nochmals CLEAR, den RASPI komplett runtergefahren und wieder gestartet habe UND
die Fritz-Box neu gestartet habe!

Warum auch immer.

Danke für deine Hilfe!

Bernd

bumbumb

Hallo ich habe folgendes ausprobiert.

die fhem.cfg

define fbCM FB_CALLMONITOR 192.168.178.1
attr fbCM fritzbox-remote-phonebook 1
attr fbCM group Anrufe
attr fbCM icon phone_call
attr fbCM local-area-code 02664
attr fbCM reverse-search phonebook,klicktel.de,dasoertliche.de
attr fbCM reverse-search-cache 1
attr fbCM room SYSTEM

define myTM TM fbCM
attr myTM group Anrufe
attr myTM icon phone_call
attr myTM maxlines 4
attr myTM room SYSTEM
attr myTM symbol-answering-machine AB
attr myTM symbol-connected connected
attr myTM symbol-incoming incoming
attr myTM symbol-incoming-noconnect incoming_noconnect
attr myTM symbol-outgoing outgoing
attr myTM symbol-outgoing-noconnect outgoing_noconnect
attr myTM update 2

define Anrufliste readingsGroup <Pos>,<Art>,<Datum>,<Name>,<Nummer>,<Dauer> myTM:A0,B0,C0,D0,E0 myTM:A1,B1,C1,D1,E1 myTM:A2,B2,C2,D2,E2 myTM:A3,B3,C3,D3,E3 myTM:A4,B4,C4,D4,E4
attr Anrufliste mapping {'CallMon' => '{sprintf("%d.",$ROW-1);;;;}'}
attr Anrufliste nameStyle style="font-weight:bold"
attr Anrufliste noheading 0
attr Anrufliste room Telefon
attr Anrufliste valueIcon { 'A0.incoming' => 'phone_ring_in@green', 'A0.incoming_noconnect' => 'phone_ring_in@red', 'A0.outgoing' => 'phone_ring_out@green', 'A0.outgoing_noconnect' => 'phone_ring_out@red', 'A0.AB' => 'phone_answersing@blue', 'E0.connected' => 'phone_ring@yellow', 'A1.incoming' => 'phone_ring_in@green', 'A1.incoming_noconnect' => 'phone_ring_in@red', 'A1.outgoing' => 'phone_ring_out@green', 'A1.outgoing_noconnect' => 'phone_ring_out@red', 'A1.AB' => 'phone_answersing@blue', 'E1.connected' => 'phone_ring@yellow', 'A2.incoming' => 'phone_ring_in@green', 'A2.incoming_noconnect' => 'phone_ring_in@red', 'A2.outgoing' => 'phone_ring_out@green', 'A2.outgoing_noconnect' => 'phone_ring_out@red', 'A2.AB' => 'phone_answersing@blue', 'E2.connected' => 'phone_ring@yellow', 'A3.incoming' => 'phone_ring_in@green', 'A3.incoming_noconnect' => 'phone_ring_in@red', 'A3.outgoing' => 'phone_ring_out@green', 'A3.outgoing_noconnect' => 'phone_ring_out@red', 'A3.AB' => 'phone_answersing@blue', 'E3.connected' => 'phone_ring@yellow', 'A4.incoming' => 'phone_ring_in@green', 'A4.incoming_noconnect' => 'phone_ring_in@red', 'A4.outgoing' => 'phone_ring_out@green', 'A4.outgoing_noconnect' => 'phone_ring_out@red', 'A4.AB' => 'phone_answersing@blue', 'E4.connected' => 'phone_ring@yellow' }

und die 99_myUtilsTM.pm

################################## # $Id: 99_myUtilsTM.pm 2014-8 by Elektrolurch $
# Version 1.61 05/03/2015 by Elektrolurch (JoWiemann)
# change: call information are stored in a hash, not in an array
# callID: can be anything
# answering_machine_1 is mapped to 'AB
# anwering_machine_2..n is mapped to AB2 ...ABn
# table is now updated during ring | call and not after disconnect
#
# events are handled:
# 1. ring | call
# 2. external_number | external | name ... -> stored in hash
# 3. call_id stores infos in %callmem{$callID} and updates table
#
# disconnect
# call_duration updates the appropriate line in table
#

# Version 1.2 now as Modul TM
# define myTM TM <fritzbox>
# <fristzbox must be of type FB_CALLMONITOR
#  a seperate  notify is  now not necessary!
# for visualization:
# values of calls are stored in A0..E0,...A4...E4
# use a readingsGroup for displaying values
# version 1.3
# methods for using calls to event "ring" and disconnect"
# acdepts perl-code and calls to fhem
# attr myTM method-ring set Lampe1 on
# attr myTM1 method-disconnect {TelefonAction($EXTERNAL_NAME);;;;}
# intern values for fhem: %EXTERNAL_NAME, %EXTERNAL_NUMBER, %INTERNAL_NUMBER
# for perl
# $EXTERNAL_NAME, $EXTERNAL_NUMBER, $INTERNAL_NUMBER
# Version 1.4
# added: set command
# set name [clear | monitor-type [all|incoming|outgoing|missed-call|all-after-disconnect]] 

# Version 1.51 (26.10.2014 18:00)
# Bugfix: AB in TM_SetValue -> requires eq not ==
# attrList added room

# Version 1.52 30.09.2014
# Bugfix: TM_UpdateValue: readingsSingleUpdate -> $update replaced 1

# Version 1.53
# alias to attrlist added

# Version  1.54
# smaller corrections handling monitor-type = 'missed-call'

# Version 1.6
# added:  attr line-filter accepts a list of ',' seperated incoming calling line numbers for filtering incoming or outgoing calls by calling line
# or a hash for mapping lines to text
# example
# attr myTM line-filter 304050,304060
# or
# attr myTM line-filter {'304050' => 'geschftl.', '304060' => 'priv'}
# line-information is stored in G0...G4
#
# added:
# $INTERNAL_CONNECTION / %INTERNAL_CONNECTION as variables for calling methods
# added: method-connect
#
# Version 1.61
# added:
# INTERNAL_CONNECTION is stored in H0...H4
# added: method-connect



package main;

use strict;
use warnings;
use POSIX;
use FritzBoxUtils;


##################################


# Symbols for call direction
# used as defaults, if appropiate Attributes are not defined
my $incoming = '->';
my $outgoing = '<-';
my $incoming_noconnect  = '0>';
my $outgoing_noconnect = '<0';
my $ab = 'AB';
my $connected = 'con';
# there is a poosible bug in updating scrren
# values are experimentell
# update = 0, use readingsBulkUpdate  for all lines
# update = 1 use readingsSingleUpdate for first line
# update = 2 use readingsSingleUpdate for all lines, causes a lot of traffic in fhem!!!

my $update = 0;

# 0...4  = 5 lines
# dont forget adapting definition of your readingsGroup!
my $maxlines = 4;

my $monitor_type = 'all';


# end default attributes
##################################

my %sets = (
'monitor-type' => 'all,incoming,outgoing,missed-call,all-after-disconnect',
'clear' => ''
);


sub myUtilsTM_Initialize($$)
{
   TM_Initialize($_[0],$_[1]);
}
################################################################


sub TM_Initialize($$)
{
   $modules{TM}{LOADED} = 1;
   my $hash = $modules{TM};
   $hash->{SetFn}     = "TM_Set";
   $hash->{DefFn}     = "TM_Define";
   $hash->{UndefFn}   = "TM_Undef";
   $hash->{NotifyFn}  = "TM_Notify";
   $hash->{AttrFn}    = "TM_Attr";
   $hash->{AttrList}  = "alias disable:0,1 line-filter maxlines monitor-type:all,incoming,outgoing,missed-call,all-after-disconnect room icon group symbol-incoming symbol-incoming-noconnect symbol-outgoing symbol-outgoing-noconnect symbol-answering-machine symbol-connected update:0,1,2 method-connect method-call method-ring method-disconnect verbose:0,1,2,3,4,5,6";

   return undef;
} # end sub TM_initialize
########################


sub TM_Define($$)
{
   my ($hash, $def) = @_;
   my @a = split("[ \t][ \t]*", $def);
   my $retval = undef;
   my $name = $a[0];

   if(!defined($a[2]))
   {
      $retval = "TM_define: you must specify a FB_CallMonitor object for using TM";
      return $retval;
   }
   
   if (!defined($defs{$a[2]}) || ($defs{$a[2]}->{TYPE} ne 'FB_CALLMONITOR'))
   {
      $retval = "TM_Define: $a[2] does not exists or ist not of type FB_CALLMONITOR";
      return $retval;
   }

   $hash->{FB} = $a[2];
   $hash->{STATE} = 'initialized';
   return undef;
} # end sub TM_Define
###############################


sub TM_Undef($$)
{                     
   my ( $hash, $arg ) = @_;       
   return undef;                 
} # end TM_Undef
################################

sub TM_Set($@)
{
   my ($hash, @a) = @_;

   my ($name,$rd,$val) = @a;

   return "\"TM set\" no set value specified" if((int(@a) < 2) && ($rd ne '?'));
   $val = 0 if ($rd eq '?');

   if ($rd eq 'monitor-type')
   {
      my %clist;
      foreach my $k (split(',',$sets{$rd})) {$clist{$k} = ''; }
      return "TM set monitor-type: $val must be of ".$sets{$rd} if(!exists($clist{$val}));
      readingsSingleUpdate($hash,$rd,$val,1);
      $attr{$name}{'monitor-type'} = $val;
   }
   elsif ($rd eq 'clear')
   {
      my ($i,$j);
      my $rhash = $hash->{READINGS};
      for ($i=AttrVal($name,"maxlines",$maxlines); $i>=0; $i--)
      {
         foreach $j ('A'..'H')
         {
            delete($rhash->{$j.$i});
         } # end j
      } # end i
   } # if clear
   else
   {
      my @cList;
      foreach my $k (sort keys %sets)
      {
         my $opts = undef;
         $opts = $sets{$k};
         if (defined($opts))
         {
            push(@cList,$k . ':' . $opts);
         }
         else
         {
            push (@cList,$k);
         }
      } # end foreach

      return "Unknown argument $rd, choose one of " . join(" ", @cList);
   } # end else -> error handling

   return undef;
} # end sub TM_set
############################


sub TM_Store($)
{
   my ($hash) = @_;
   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
   my $ID = $hash->{callID};
   my $name = $hash->{NAME};
   my $linefilter = AttrVal($name,'line-filter',undef);
   Log3($name,4,"TM_Store: linefilter $linefilter");

   if($linefilter)
   {
      if( $linefilter =~ m/^{.*}$/ )
      {
         my $lf = eval $linefilter;
         if( $lf &&(ref($lf) eq 'HASH'))
         {
            $linefilter = $lf ;
            Log3($name,4,"TM_Store: filter as hash: $linefilter");
         } # if valid
         else
         {
            Log3($name,2,"TM_Store: $linefilter (line-filter) is not a valid hash");
            $linefilter = undef;
         } # not a valid hash

      }
      else # list of filters
      {
         my %lines;
         foreach my $l ( split("[ \t,][ \t,]*",$linefilter)) {$lines{$l} = $l; }
         $linefilter = \%lines;
         Log3($name,4,"TM_Store: linefilter as list $linefilter");
      } # list of lines

   } # if $linefilter

   # linefilter is undef, if no filter or
   # hash contains valid internal_number
   my $innumber = $hash->{mem}{"internal_number"};

   if(!defined($linefilter)  ||  exists($linefilter->{$innumber}))
   {
      $hash->{callmem}{$ID} = {};
      my $rhash = $hash->{callmem}{$ID};
      my $dir = ($hash->{mem}{"direction"} eq 'incoming') ? AttrVal($name,'symbol-incoming',$incoming) : AttrVal($name,'symbol-outgoing',$outgoing);
      $rhash->{A} = $dir;
      $rhash->{B} = sprintf("%02d:%02d %02d.%02d.%4d",$hour,$min,$mday,($mon+1),($year+1900));
      $rhash->{C} = $hash->{mem}{"external_name"};
      $rhash->{D} = $hash->{mem}{"external_number"};
      $rhash->{E} = (defined($hash->{mem}{"call_duration"})) ? $hash->{mem}{"call_duration"}: AttrVal($name,'symbol-connected',$connected);
      # default call_duration, set after disconnect
      $rhash->{F} = $ID;
      if($linefilter)
      {
         $rhash->{G} = $linefilter->{$innumber};
      }
      else
      {
         $rhash->{G} = $innumber;
      }
      $rhash->{H} = $hash->{mem}{"internal_connection"};
      delete($hash->{mem});
      return 1; # valid call
   } # if linefilter
   else
   {
      Log3($name,3,"TM_Store: calls from $innumber are not store, not in attr line-filter");
      delete($hash->{mem});
      return undef;
   } #  if filtered out

   return undef;
} # end sub TM_Store
############################################

sub TM_UpdateTable($)
{
   my ($hash) = @_;
   my $name = $hash->{NAME};
   my $ID = $hash->{callID};
   my $up = AttrVal($name,'update',$update);

   Log3($name,4,"TM_UpdateTable: ID $ID");

   # shiften der alten Inhalte
   my $tt;
   my ($i,$j);
   my $rhash = $hash->{READINGS};
   if($up <= 1)
   {
      readingsBeginUpdate($hash);

      for ($i=AttrVal($name,"maxlines",$maxlines); $i>0; $i--)
      {
         foreach $j ('A'..'H')
         {
            my $k = $j . ($i-1);
            $tt = undef;
            $tt = $rhash->{$k}{VAL} if(exists($rhash->{$k}));
            next if(!defined($tt));
            readingsBulkUpdate($hash,$j.$i,$tt,1);
         } # end j
      } # end i
      readingsEndUpdate($hash,1);
   } # if BulkUpdate
   else
   {
      for ($i=AttrVal($name,"maxlines",$maxlines); $i>0; $i--)
      {
         foreach $j ('A'..'H')
         {
            my $k = $j . ($i-1);
            $tt = undef;
            $tt = $rhash->{$k}{VAL} if(exists($rhash->{$k}));
            next if(!defined($tt));
            readingsSingleUpdate($hash,$j.$i,$tt,1);
         } # end j
      } # end i
   } # else SingleUpdate

   # first line with new values
   if($up> 0)
   {
      foreach my $k ('A'..'H')
      {
         readingsSingleUpdate($hash,$k."0",$hash->{callmem}{$ID}{$k},1);
      }
   } # if SingleUpdate
   else
   {
      readingsBeginUpdate($hash);
      foreach my $k ('A'..'H')
      {
         readingsBulkUpdate($hash,$k."0",$hash->{callmem}{$ID}{$k},1);
      }
      readingsEndUpdate($hash, 1);
   } # if BulkUpdate

   return undef;
} # end TM_update
###########################

sub TM_UpdateValue($$$$)
{
   my ($hash,$ID,$col,$val) = @_;
   my $name = $hash->{NAME};
   my $rhash = $hash->{READINGS};
   Log3($name,5,"TM_UpdateValue: args callID: $ID col: $col val: $val");
   for (my $i = 0;  $i < AttrVal($name,'maxlines',$maxlines);$i++)
   {
      my $rdid= 'F' . $i; # stored callID
      Log3($name,6,"TM_updateValue: in loop i: $i callID: $rhash->{$rdid}{VAL}");
      if(defined($rhash->{$rdid}) && $rhash->{$rdid}{VAL} eq $ID)
      {
         my $rd = $col . $i;
         Log3($name,4,"TM_UpdateValue: updateingindex $rdid $rd $val");
         if(($col eq 'A') && ($val eq '0'))
         {
            $val = ($rhash->{$rd}{VAL} eq AttrVal($name,'symbol-incoming',$incoming)) ? AttrVal($name,'symbol-incoming-noconnect',$incoming_noconnect) : AttrVal($name,'symbol-outgoing-noconnect',$outgoing_noconnect);
         }

         readingsSingleUpdate($hash,$rd,$val,1);

         return undef;
      } # if update
   } # end i

   Log3($name,1,"TM_updateValue: not found col $col id $ID val $val");
   return "TM_UpdateValue: Error - ID not found";
} # end TM_UpdateValue
##########################


sub TM_Notify($$)
{
   my ($hash,$d) = @_;
   return "TM_notify: hash not defiened" if (!defined($hash));

   my $name = $hash->{NAME};
   return undef if(AttrVal($name, "disable", undef));
   # Abbruch wenn das Attribut disable gesetzt
   my $fb = $d->{NAME};
   if ($fb ne $hash->{FB})
   {
      return undef;
   } # if not fb

   my $rhash =  $d->{CHANGED};
   my $max = int(@$rhash);
   # number of events / changes

   for (my $i = 0; $i < $max; $i++)
   {
      my $s = $d->{CHANGED}[$i];
      TM_Monitor($hash,$s);
   } # end for i

}  # end sub TM_Notify
#####################################

sub TM_Proc($$)
{
   my ($hash,$proc) = @_;
   my $name = $hash->{NAME};

   my $external_name = $hash->{mem}{'external_name'};
   my $external_number = $hash->{mem}{'external_number'};
   my $internal_number = $hash->{mem}{'internal_number'};
   my $internal_connection = $hash->{mem}{'internal_connection'};

   my $EXTERNAL_NAME = $external_name;
   my $EXTERNAL_NUMBER = $external_number;
   my $INTERNAL_NUMBER = $internal_number;
   my $INTERNAL_CONNECTION = $internal_connection;

   $proc =~s/\%EXTERNAL_NAME/$external_name/g;
   $proc =~s/\%EXTERNAL_NUMBER/$external_number/g;
   $proc =~s/\%INTERNAL_NUMBER/$internal_number/g;
   $proc =~s/\%INTERNAL_CONNECTION/$internal_connection/g;

   if($proc =~ m/^{.*}$/)
   {
      $proc =~s/\$EXTERNAL_NAME/"$external_name"/g;
      $proc =~s/\$EXTERNAL_NUMBER/"$external_number"/g;
      $proc =~s/\$INTERNAL_NUMBER/"$internal_number"/g;
      $proc =~s/\$INTERNAL_CONNECTION/"$internal_connection"/g;
   } # if perl

   Log3($name,3,"TM_Proc:  action $proc");

   fhem($proc);

} # end sub TM_Proc
########################

sub TM_Monitor($$)
{
   my ($hash,$Ev) = @_;
   my $name = $hash->{NAME};

   if(!defined($hash))
   {
      Log(1,"TM_Monitorhash nicht gefunden");
      return "TM: $hash not found";
   } # if error

   my ($event,$arg) = split (':',$Ev);
   $arg = rtrim(ltrim($arg));
   $event = ltrim(rtrim($event));
   
   my $proc;

   if ($event eq "event")
   {
      $hash->{stat} = $arg;
      Log3($name,3,"TM_Monitor: status:  $arg");
      return undef;
   } # end if event
   Log3($name,4,"TM_Monitor: stat: $hash->{stat} event: $event arg: $arg");

   # store all subevents
   $hash->{mem}{$event} = $arg;

   if ($hash->{stat} eq "ring")
   {
      if ($event eq "call_id")
      {
         $hash->{callID} = $arg;
         Log3($name,3,"Anruf (ring) von $hash->{mem}{'external_name'} $hash->{mem}{'external_number'} callID: $arg");

         # hier koennen wir eine anrufgesteuerte Aktion starten
         $proc = AttrVal($name,'method-ring',undef);

         if($proc)
         {
            TM_Proc($hash,$proc);
         } # end method-ring

         my $mot = AttrVal($name,'monitor-type',$monitor_type);
         Log3($name,5,"Ring vor TM_UpdateTable mot $mot");

         if(($mot eq 'all') || ($mot eq 'incoming'))
         {
            TM_UpdateTable($hash) if(TM_Store($hash));
         } # if mode
      } # end if callid
      return undef;
   } # end if ring events

   if ($hash->{stat} eq "connect")
   {
      # handle answering machine
      if (($event eq"internal_connection") &&
         ($arg =~m/Answering_Machine_.*/))
      {
         my (undef,undef,$abnr) = split('_',$arg);
         $hash->{mem}{ab} = $abnr;
         Log3($name,3,"Anrufbeantworter Nr. $abnr angesprochen");
         return undef;
      } # end if internal_connection
      
      if ($event eq "call_id")
      {
         $hash->{callID} = $arg;
         # method-connect
         $proc = AttrVal($name,'method-connect',undef);
         if($proc)
         {
            TM_Proc($hash,$proc);
         } # end method-connect

         if (exists($hash->{mem}{ab}) && $hash->{mem}{ab} > 0)
         {
            $hash->{callmem}{$arg}{A} = AttrVal($name,'symbol-answering-machine',$ab);
            $hash->{callmem}{$arg}{A} .= $hash->{mem}{ab} if ($hash->{mem}{ab} > 1);
            if(AttrVal($name,'monitor-type',$monitor_type) =~m/(all|incoming)/)
            {
               # update value in table
               TM_UpdateValue($hash,$arg,'A',$hash->{callmem}{$arg}{A} );
               Log3($name,3,"in/out symbol in table change to Answering Machine");
            } # update AB,   

         } # if A set to AB
         delete($hash->{mem}{ab});
      } # end if  callID
      return undef;
   } # end if connect

   if ($hash->{stat} eq "call")
   {
      $hash->{mem}{$event} = $arg;
      
      # method-call
      $proc = AttrVal($name,'method-call',undef);
      if($proc)
      {
         TM_Proc($hash,$proc);
      } # end method-call

      if ($event eq "call_id")
      {
         $hash->{callID} = $arg;
         my $mot = AttrVal($name,'monitor-type',$monitor_type);
         Log3($name,5,"Call vor TM_UpdateTable mot $mot");
         if(($mot eq 'all') | ($mot eq 'outgoing'))
         {
            TM_UpdateTable($hash) if(TM_Store($hash));
         } # if mode
      } # end if callid
      return undef;
   } # end if call event


   if ($hash->{stat} eq "disconnect")
   {

      if ($event eq "call_duration")
      {
         $hash->{mem}{"call_duration"} = sprintf("%02d:%02d", ($arg/60),$arg%60);
         return undef;
      } # if call_duration

      if ($event eq "call_id")
      {
         $hash->{callID} = $arg;
         $hash->{callmem}{$arg}{E} = $hash->{mem}{"call_duration"};
         $proc = AttrVal($name,'method-disconnect',undef);

         if($proc)
         {
            TM_Proc($hash,$proc);
         } # end method-disconnect

         my $mot = AttrVal($name,'monitor-type',$monitor_type);
         Log3($name,5,"Disconnect vor TM_UpdateTable mot $mot");

         if($mot eq 'missed-call')
         {
            if(TM_Store($hash))
            {
               my $aktsym = $hash->{callmem}{$arg}{A};
               my $aktdur = $hash->{callmem}{$arg}{E};
               Log3($name,5,"TM_Monitor: $mot aktsym: $aktsym aktdur: $aktdur");

               if( ( ($aktsym eq AttrVal($name,'symbol-incoming',$incoming)) && ($aktdur  eq '00:00')) || ($aktsym eq AttrVal($name,'symbol-answering-machine',$ab))  )
               {
                  # korrekt incoming symbol
                  $hash->{callmem}{$arg}{A} = AttrVal($name,'symbol-incoming-noconnect',$incoming_noconnect) if($aktdur eq '00:00');
                  Log3($name,5,"mode = missed-call callID: $arg connnection in mem: $hash->{callmem}{$arg}{A} duration: $hash->{callmem}{$arg}{E} ");

                  TM_UpdateTable($hash);
               } # if TM_Store / line-filter
               delete($hash->{callmem}{$arg});
               delete($hash->{mem});
               return undef;
            }
         } # if missed-call
         elsif($mot eq 'all_after_disconnect')
         {
            Log3($name,5,"disconnect mode: all_after_disconnect");
            if(TM_Store($hash))
            {
               TM_UpdateTable($hash);
               delete($hash->{callmem}{$arg});
               delete($hash->{mem});
            } # if TM_Store / line-filter
         } # all_after_disconnect
         else
         {
            # update value call_duration in table
            TM_UpdateValue($hash,$arg,'E',$hash->{callmem}{$arg}{E} );
            # update symbols for in/outgoing with no connections
            TM_UpdateValue($hash,$arg,'A',0 ) if($hash->{callmem}{$arg}{E} =~m/(<->|00:00)/);

         } # update table for duration
         delete($hash->{callmem}{$arg});
         delete($hash->{mem});
         return undef;
      } # end if callid
   } # end if disconnect
   return undef;
} #end sub TM_Monitor
#####################################

sub TM_Attr(@)
{
   my ($cmd,$name,$aName,$aVal) = @_;
   my $hash = $defs{$name};

   return "\n TM_Attr: " .$name  . " does not exits" if (!defined($hash));

   # $cmd can be "del" or "set"
   # $name is device name
   # aName and aVal are Attribute name and value
   if ($cmd eq "set")
   {

   if ($aName eq 'disable')
   {
      $hash->{STATE} = ($aVal == 0)?'initialized':'disabled';
   }

   if ($aName eq 'monitor-type')
   {
      return TM_Set($hash,$name,$aName,$aVal);
   } # monitor-type
   else
   {
      my @attrs = split(' ',$modules{TM}->{AttrList});
      my %ats;
      for(my $i = 0; $i < int(@attrs); $i++)
      {
         my ($a,$v) = split(':',$attrs[$i]);
         $ats{$a} = $v;
      } # end i

      if(!exists($ats{$aName}))
      {
         return "TM_Attr: $aName must at least one of: ".join(',',sort keys %ats);
      } # error handling

   } # if else

   } # end if set
   return undef;
} # end ssub TM_Attr
######################

1;

aber die Anrufliste ist leer. Was könnte es sein ich habe auch die Updates gemacht. help help bitte danke bumbumb

cotecmania

Hallo,

wäre es machbar/denkbar, beim Klick auf das Lautsprechersymbol, die zugehörige Nachricht vom AB der Fritzbox auszugeben ?
FHEM läuft bei mir auf RaspPi und als Endgerät habe ich ein 10" Tablet (Android)

Gruss
Joe
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

JoWiemann

Zitat von: cotecmania am 15 März 2015, 17:02:01
Hallo,

wäre es machbar/denkbar, beim Klick auf das Lautsprechersymbol, die zugehörige Nachricht vom AB der Fritzbox auszugeben ?
FHEM läuft bei mir auf RaspPi und als Endgerät habe ich ein 10" Tablet (Android)

Hallo Joe,

das ist nicht so einfach. Die Fritte legt einen Eintrag in einer in der Datei meta1 ab, der u.a. eine Referenz auf die abgelegte Sprachnachricht beinhaltet. Vor dem Abspielen muss die Sprachnachricht dann noch encodiert werden.

Ich denke es ist einfacher, wenn Du Dir Sprachnachrichten von der Fritte per E-Mail auf einen Account schicken lässt, der nur vom 10" Tablet abgefragt wird. Es gibt in Fhem ein Modul, dass auf E-Mails prüft und diese wohl auch abholen kann.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

JoWiemann

Hallo,

ich habe das 99_myUtilsTM mal um command.ref Informationen ergänzt und es "frecherweise" nach "72_FB_CM_Extender.pm" umbenannt. (@Elektrolurch, ich hoffe Du bist einverstanden). Bitte hier auch einmal und vor allem den englische Part Korrektur lesen.

Am Besten das Modul vor einem update einspielen, das alte 99_myUtilsTM.pm löschen oder umbenennen und nicht vergessen das define anzupassen.

Nach dem Update und einem Neustart ist die Hilfe zum Modul über <help FB_CM_Extender DE> oder <help FB_CM_Extender EN> erreichbar.

Weiterhin habe ich die Umbenennung auch im Modul verankert. Somit ändert sich auch das define:

define <name> FB_CM_EXTENDER <FB_CALLMONITOR device>

Meine Hoffnung ist, dass es das wirklich super Modul in das Fhem-Repository schafft.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Elektrolurch

#142
Ok. Danke. Ich habe leider keinen Zugriff und mit der html-Doku für die Commandref dürfte ich vmtl. (siehe unten, wg. Screenreader) auch Probleme haben.
Ich hätte4 noch den EMONITOR, den man auch ins repository stellen könnte....

Elektrolurch
configDB und Windows befreite Zone!

JoWiemann

Hallo Elektrolurch,

habe leider auch keine Developer Rechte. Ich werde Markus mal fragen, er hat den FB_CALLMONITOR entwickelt, ob er uns hier helfen kann. Anbei noch einmal eine neue Version des Moduls, wo ich Fehler im command.ref Bereich beseitigt habe. Weiterhin habe ich Dir den command.ref Bereich mal als HTML beigefügt. Ich selber schreibe den command.ref Bereich mit KompoZer und kopiere ihn dann rüber in das Perl Modul.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Elektrolurch

Hallo zusammen,

kleines Gimick:


commands {'monitor-type' => 'monitor-type:','clear' => 'set $DEVICE clear', 'D0'  => "set fritzbox call $VALUE",'D1'  => "set fritzbox call $VALUE", 'D2'  => "set fritzbox call $VALUE",'D3'  => "set fritzbox call $VALUE",'D4'  => "set fritzbox call $VALUE"}

Anrufliste ist die rg, mit der der Telefonmonitor TM angezeigt wird.
"fritzbox" ist eine Instanz vom 72er - Modul FRITZBOX.
Damit werden die angezeigten Rufnummern zum Link und das bei der "fritzbox" hinterlegte interne Telefon  führt einen Anruf durch.
attr fritzbox ringWithIntern 1
Hier das angeschlossene analoge Telefon.


Elektrolurch
configDB und Windows befreite Zone!

JoWiemann

Hallo Elekrolurch,

irgendwie ist Dein kleines Gimick nicht vollständig gepostet worden. Zu sehen ist nur der Teil, der mit commands beginnt und mit "set fritzbox call $VALUE"} endet.

Als nächstes kommt dann "Anrufliste ist die rg ...

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

A.Harrenberg

Hallo Elektrolurch, hallo JoWiemann,

auch von mir erst mal vielen Dank für das hervorragenden Modul!

Ich nutze das umbenannte Modul aus Post #141 und habe mal versucht die method-attribute zu nutzen. Hierzu habe ich die Attribute definiert und eine "mini-Funktion" geschrieben die aufgerufen wird.


method-call {my_telefon_action("method-call");;}
method-connect {my_telefon_action("method-connect");;}
method-disconnect {my_telefon_action("method-disconnect");;}
method-ring {my_telefon_action("method-ring");;}


sub my_telefon_action ($){
my ($event) = @_;
Log 1, "Telefon Action: $event";

}


Das Problem ist nun, das "method-call" bei jedem Anruf immer jeweils 7 mal aufgerufen wird...

2015.03.26 19:36:49.163 1: Telefon Action: method-call
2015.03.26 19:36:49.164 1: Telefon Action: method-call
2015.03.26 19:36:49.164 1: Telefon Action: method-call
2015.03.26 19:36:49.164 1: Telefon Action: method-call
2015.03.26 19:36:49.164 1: Telefon Action: method-call
2015.03.26 19:36:49.165 1: Telefon Action: method-call
2015.03.26 19:36:49.165 1: Telefon Action: method-call
2015.03.26 19:36:55.769 1: Telefon Action: method-ring
2015.03.26 19:37:26.345 1: Telefon Action: method-disconnect
2015.03.26 19:37:45.140 1: Telefon Action: method-disconnect
2015.03.26 19:37:55.250 1: Telefon Action: method-call
2015.03.26 19:37:55.250 1: Telefon Action: method-call
2015.03.26 19:37:55.250 1: Telefon Action: method-call
2015.03.26 19:37:55.250 1: Telefon Action: method-call
2015.03.26 19:37:55.251 1: Telefon Action: method-call
2015.03.26 19:37:55.251 1: Telefon Action: method-call
2015.03.26 19:37:55.251 1: Telefon Action: method-call
2015.03.26 19:37:59.601 1: Telefon Action: method-ring
2015.03.26 19:38:13.343 1: Telefon Action: method-disconnect
2015.03.26 19:38:13.984 1: Telefon Action: method-disconnect


Irgendeine Idee was hier passiert? Kann ich noch was prüfen/loggen?
Soweit ich das in den Postings mitbekommen habe hat Jörg da etwas bei den method Sachen umgestellt, daher habe ich euch mal beide angesprochen.

Allerdings habe ich festgestellt, das ich kein attr verbose 5 auf das Modul machen kann... Fehlermeldung:

FB_CM_EXTENDER_Attr: verbose must at least one of: alias,disable,event-aggregator,event-min-interval,event-on-change-reading,event-on-update-reading,group,icon,line-filter,maxlines,method-call,method-connect,method-disconnect,method-ring,monitor-type,room,stateFormat,symbol-answering-machine,symbol-connected,symbol-incoming,symbol-incoming-noconnect,symbol-outgoing,symbol-outgoing-noconnect,update

Hierzu eine Idee?

Vielen Dank schon mal,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

A.Harrenberg

Hi,

ich habe jetzt mal verbose global auf 5 gestellt und die entsprechenden Zeilen aus dem Log rausgesucht...


2015.03.26 20:48:37.398 5: Notify loop for Fritz_Box event: call
2015.03.26 20:48:37.399 3: FB_CM_EXTENDER_Monitor: status:  call
2015.03.26 20:48:37.399 4: FB_CM_EXTENDER_Monitor: stat: call event: internal_connection arg: 0
2015.03.26 20:48:37.399 3: FB_CM_EXTENDER_Proc:  action {my_telefon_action("method-call");;}
2015.03.26 20:48:37.399 5: Cmd: >{my_telefon_action("method-call");}<
2015.03.26 20:48:37.400 1: Telefon Action: method-call

2015.03.26 20:48:37.400 4: FB_CM_EXTENDER_Monitor: stat: call event: direction arg: outgoing
2015.03.26 20:48:37.400 3: FB_CM_EXTENDER_Proc:  action {my_telefon_action("method-call");;}
2015.03.26 20:48:37.400 5: Cmd: >{my_telefon_action("method-call");}<
2015.03.26 20:48:37.400 1: Telefon Action: method-call

2015.03.26 20:48:37.400 4: FB_CM_EXTENDER_Monitor: stat: call event: external_name arg: Aldi-Stick
2015.03.26 20:48:37.400 3: FB_CM_EXTENDER_Proc:  action {my_telefon_action("method-call");;}
2015.03.26 20:48:37.400 5: Cmd: >{my_telefon_action("method-call");}<
2015.03.26 20:48:37.400 1: Telefon Action: method-call

2015.03.26 20:48:37.400 4: FB_CM_EXTENDER_Monitor: stat: call event: external_connection arg: SIP0
2015.03.26 20:48:37.400 3: FB_CM_EXTENDER_Proc:  action {my_telefon_action("method-call");;}
2015.03.26 20:48:37.400 5: Cmd: >{my_telefon_action("method-call");}<
2015.03.26 20:48:37.401 1: Telefon Action: method-call

2015.03.26 20:48:37.401 4: FB_CM_EXTENDER_Monitor: stat: call event: internal_number arg: 1
2015.03.26 20:48:37.401 3: FB_CM_EXTENDER_Proc:  action {my_telefon_action("method-call");;}
2015.03.26 20:48:37.401 5: Cmd: >{my_telefon_action("method-call");}<
2015.03.26 20:48:37.401 1: Telefon Action: method-call

2015.03.26 20:48:37.401 4: FB_CM_EXTENDER_Monitor: stat: call event: external_number arg: 0157*********
2015.03.26 20:48:37.401 3: FB_CM_EXTENDER_Proc:  action {my_telefon_action("method-call");;}
2015.03.26 20:48:37.401 5: Cmd: >{my_telefon_action("method-call");}<
2015.03.26 20:48:37.402 1: Telefon Action: method-call

2015.03.26 20:48:37.402 4: FB_CM_EXTENDER_Monitor: stat: call event: call_id arg: 0
2015.03.26 20:48:37.402 3: FB_CM_EXTENDER_Proc:  action {my_telefon_action("method-call");;}
2015.03.26 20:48:37.402 5: Cmd: >{my_telefon_action("method-call");}<
2015.03.26 20:48:37.402 1: Telefon Action: method-call


Sieht für mich so aus als ob da rekursiv für jeden Parameter eine Funktion aufgerufen wird. Meine Perl-Kenntnisse reichen aber noch nicht aus näher zu verstehen was da im Code passiert...

Gruß,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

JoWiemann

#148
UPDATE

Hallo Andreas,

danke für Deine Hinweise. Bei attr verbose ist noch ein Fehler in der Attribut-Prüfung drin. Anbei eine korrigierte Version.

Danke für das Log. Ich habe den Aufruf der Method in das Event "$event eq "call_id" " verschoben. Bitte einmal testen. Danke


Grüße Jörg


Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

JoWiemann

Hallo,

ich habe jetzt auch noch mal alle Log3 Aufrufe geprüft und an einigen Stellen den Eintrag: FB_CM_EXTENDER_Monitor: hinzugefügt, so dass jetzt alle Log-Einträge eindeutig dem FB_CM_EXTENDER zugeordnet werden können.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM