mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
96_SIP: add readings call_time and caller_time
git-svn-id: https://svn.fhem.de/fhem/trunk@13923 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
0575652fd1
commit
81edd718d2
@ -54,14 +54,14 @@ use Net::Domain qw(hostname hostfqdn);
|
|||||||
use Blocking; # http://www.fhemwiki.de/wiki/Blocking_Call
|
use Blocking; # http://www.fhemwiki.de/wiki/Blocking_Call
|
||||||
#use Data::Dumper;
|
#use Data::Dumper;
|
||||||
|
|
||||||
my $sip_version ="V1.52 / 02.04.17";
|
my $sip_version ="V1.54 / 07.04.17";
|
||||||
my $ua; # SIP user agent
|
my $ua; # SIP user agent
|
||||||
my @fifo;
|
my @fifo;
|
||||||
|
|
||||||
my %sets = (
|
my %sets = (
|
||||||
"call" => "",
|
"call" => "",
|
||||||
"listen:noArg" => "",
|
"listen:noArg" => "",
|
||||||
"reject:noArg" => "",
|
"reject:noArg" => "",
|
||||||
"reset:noArg" => "",
|
"reset:noArg" => "",
|
||||||
"fetch:noArg" => "",
|
"fetch:noArg" => "",
|
||||||
"password" => ""
|
"password" => ""
|
||||||
@ -383,6 +383,7 @@ sub SIP_CALLStart($)
|
|||||||
my $dtmf = 'ABCD*#123--4567890';
|
my $dtmf = 'ABCD*#123--4567890';
|
||||||
my $port = AttrVal($name,"sip_port",0);
|
my $port = AttrVal($name,"sip_port",0);
|
||||||
my $delay = AttrVal($name,"sip_call_audio_delay",0); # Verzoegerung in 1/4 Sekunden Schritten
|
my $delay = AttrVal($name,"sip_call_audio_delay",0); # Verzoegerung in 1/4 Sekunden Schritten
|
||||||
|
my $w = ($delay) ? -1 : 0;
|
||||||
my $fi = 0;
|
my $fi = 0;
|
||||||
#$repeat = 0 if (!$repeat);
|
#$repeat = 0 if (!$repeat);
|
||||||
my $packets = int($delay)*50;
|
my $packets = int($delay)*50;
|
||||||
@ -398,6 +399,8 @@ sub SIP_CALLStart($)
|
|||||||
my $call_established;
|
my $call_established;
|
||||||
my @files;
|
my @files;
|
||||||
my $anz;
|
my $anz;
|
||||||
|
my $stat;
|
||||||
|
my $ph_ok = 0;
|
||||||
my $sound_of_silence = sub
|
my $sound_of_silence = sub
|
||||||
{
|
{
|
||||||
return unless $packets-- > 0;
|
return unless $packets-- > 0;
|
||||||
@ -426,7 +429,11 @@ sub SIP_CALLStart($)
|
|||||||
$codec = "PCMU/8000" if ($msg =~ /\.ul(.+)$/);
|
$codec = "PCMU/8000" if ($msg =~ /\.ul(.+)$/);
|
||||||
return $name."|0|CallStart: please use filetype .alaw (for a-law) or .ulaw (for u-law)" if !defined($codec);
|
return $name."|0|CallStart: please use filetype .alaw (for a-law) or .ulaw (for u-law)" if !defined($codec);
|
||||||
|
|
||||||
|
|
||||||
push @files,$sound_of_silence if ($delay);
|
push @files,$sound_of_silence if ($delay);
|
||||||
|
|
||||||
|
if ($repeat < 0) { $repeat = $repeat * -1; $ph_ok= 1; }
|
||||||
|
|
||||||
for(my $i=0; $i<=$repeat; $i++) { push @files,$msg; }
|
for(my $i=0; $i<=$repeat; $i++) { push @files,$msg; }
|
||||||
$anz = @files;
|
$anz = @files;
|
||||||
Log3 $name,4,"$logname, CallStart with $anz files - first file : $files[0] - $codec , repeat $repeat";
|
Log3 $name,4,"$logname, CallStart with $anz files - first file : $files[0] - $codec , repeat $repeat";
|
||||||
@ -436,6 +443,7 @@ sub SIP_CALLStart($)
|
|||||||
cb_rtp_done => \$rtp_done,
|
cb_rtp_done => \$rtp_done,
|
||||||
cb_final => sub { my ($status,$self,%info) = @_;
|
cb_final => sub { my ($status,$self,%info) = @_;
|
||||||
$final = $info{code};
|
$final = $info{code};
|
||||||
|
$stat = $status;
|
||||||
Log3 $name,4,"$logname, cb_final - status : $status" if (!defined($final));
|
Log3 $name,4,"$logname, cb_final - status : $status" if (!defined($final));
|
||||||
Log3 $name,4,"$logname, cb_final - status : $status - final : $final" if (defined($final));
|
Log3 $name,4,"$logname, cb_final - status : $status - final : $final" if (defined($final));
|
||||||
if (($status eq "FAIL") && defined($final))
|
if (($status eq "FAIL") && defined($final))
|
||||||
@ -529,7 +537,9 @@ sub SIP_CALLStart($)
|
|||||||
) || return $name."|0|reinvite failed: ".$ua->error;
|
) || return $name."|0|reinvite failed: ".$ua->error;
|
||||||
|
|
||||||
$ua->loop( \$rtp_done,\$peer_hangup2,\$peer_hangup,\$stopvar );
|
$ua->loop( \$rtp_done,\$peer_hangup2,\$peer_hangup,\$stopvar );
|
||||||
}
|
Log3 $name,4,"$logname, loop rtp_done : $rtp_done" if defined($rtp_done);
|
||||||
|
$w++;
|
||||||
|
}
|
||||||
|
|
||||||
$timeout = 1 if defined($stopvar); # nach eventuellen reinvte nochmal testen
|
$timeout = 1 if defined($stopvar); # nach eventuellen reinvte nochmal testen
|
||||||
# timeout or dtmf done, hang up
|
# timeout or dtmf done, hang up
|
||||||
@ -546,6 +556,8 @@ sub SIP_CALLStart($)
|
|||||||
Log3 $name,5,"$logname, Hangup2 : $peer_hangup2" if defined($peer_hangup2);
|
Log3 $name,5,"$logname, Hangup2 : $peer_hangup2" if defined($peer_hangup2);
|
||||||
Log3 $name,5,"$logname, Timeout : $timeout";
|
Log3 $name,5,"$logname, Timeout : $timeout";
|
||||||
Log3 $name,5,"$logname, Final : $final" if defined($final);
|
Log3 $name,5,"$logname, Final : $final" if defined($final);
|
||||||
|
Log3 $name,5,"$logname, while : $w" if defined($w);
|
||||||
|
Log3 $name,5,"$logname, Status : $stat" if defined($stat);
|
||||||
|
|
||||||
if (defined($rtp_done))
|
if (defined($rtp_done))
|
||||||
{
|
{
|
||||||
@ -571,6 +583,8 @@ sub SIP_CALLStart($)
|
|||||||
$final = "peer hangup" if defined($peer_hangup);
|
$final = "peer hangup" if defined($peer_hangup);
|
||||||
$final = "peer_hangup" if defined($peer_hangup2); # ts,ts hat der doch glatt im reinvite noch abgebochen
|
$final = "peer_hangup" if defined($peer_hangup2); # ts,ts hat der doch glatt im reinvite noch abgebochen
|
||||||
|
|
||||||
|
# geben wir doch ok zurueck wenn er sich die Nachricht min 1x angehört hat
|
||||||
|
return $name."|1|ok peer hangup" if ($ph_ok && defined($peer_hangup2) && ($stat eq "OK") && ($w>0)); # bei delay 1x mehr !
|
||||||
return $name."|1|".$final;
|
return $name."|1|".$final;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -580,24 +594,29 @@ sub SIP_CALLDone($)
|
|||||||
return unless(defined($string));
|
return unless(defined($string));
|
||||||
|
|
||||||
my @r = split("\\|",$string);
|
my @r = split("\\|",$string);
|
||||||
my $hash = $defs{$r[0]};
|
my $hash = $defs{$r[0]};
|
||||||
my $error = (defined($r[1])) ? $r[1] : "0";
|
my $error = (defined($r[1])) ? $r[1] : "0";
|
||||||
my $final = (defined($r[2])) ? $r[2] : "???";
|
my $final = (defined($r[2])) ? $r[2] : "???";
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
|
my $success = (substr($final,0,2) eq "ok") ? 1 : 0;
|
||||||
my @a;
|
my @a;
|
||||||
|
|
||||||
Log3 $name, 4,"$name, CALLDone -> $string";
|
Log3 $name, 4,"$name, CALLDone -> $string";
|
||||||
|
|
||||||
|
my $calltime = time() - $hash->{helper}{CALL_START};
|
||||||
delete($hash->{helper}{CALL_PID}) if (defined($hash->{helper}{CALL_PID}));
|
delete($hash->{helper}{CALL_PID}) if (defined($hash->{helper}{CALL_PID}));
|
||||||
delete($hash->{CPID}) if (defined($hash->{CPID}));
|
delete($hash->{CPID}) if (defined($hash->{CPID}));
|
||||||
delete $hash->{lastnr} if (defined($hash->{lastnr}));
|
delete $hash->{lastnr} if (defined($hash->{lastnr}));
|
||||||
|
delete($hash->{helper}{CALL_START}) if (defined($hash->{helper}{CALL_START}));
|
||||||
|
|
||||||
if ($error ne "1")
|
if ($error ne "1")
|
||||||
{
|
{
|
||||||
readingsBeginUpdate($hash);
|
readingsBeginUpdate($hash);
|
||||||
readingsBulkUpdate($hash, "call","done");
|
readingsBulkUpdate($hash, "call","done");
|
||||||
|
readingsBulkUpdate($hash, "call_time",$calltime) if defined($calltime);
|
||||||
readingsBulkUpdate($hash, "last_error",$final);
|
readingsBulkUpdate($hash, "last_error",$final);
|
||||||
readingsBulkUpdate($hash, "call_state","fail");
|
readingsBulkUpdate($hash, "call_state","fail");
|
||||||
|
readingsBulkUpdate($hash, "call_success","0");
|
||||||
readingsBulkUpdate($hash, "state",$hash->{'.oldstate'}) if defined($hash->{'.oldstate'});
|
readingsBulkUpdate($hash, "state",$hash->{'.oldstate'}) if defined($hash->{'.oldstate'});
|
||||||
readingsEndUpdate($hash, 1);
|
readingsEndUpdate($hash, 1);
|
||||||
}
|
}
|
||||||
@ -606,17 +625,20 @@ sub SIP_CALLDone($)
|
|||||||
readingsBeginUpdate($hash);
|
readingsBeginUpdate($hash);
|
||||||
readingsBulkUpdate($hash, "call","done");
|
readingsBulkUpdate($hash, "call","done");
|
||||||
readingsBulkUpdate($hash, "call_state",lc($final));
|
readingsBulkUpdate($hash, "call_state",lc($final));
|
||||||
|
readingsBulkUpdate($hash, "call_success",$success);
|
||||||
|
readingsBulkUpdate($hash, "call_time",$calltime) if defined($calltime);
|
||||||
readingsBulkUpdate($hash, "state",$hash->{'.oldstate'}) if defined($hash->{'.oldstate'});
|
readingsBulkUpdate($hash, "state",$hash->{'.oldstate'}) if defined($hash->{'.oldstate'});
|
||||||
readingsEndUpdate($hash, 1);
|
readingsEndUpdate($hash, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
my (undef,$nr,$ringtime,$msg,$repeat,$force) = split("\\|",$hash->{CALL}); # zerlegen wir den Original Call
|
my (undef,$nr,$ringtime,$msg,$repeat,$force) = split("\\|",$hash->{CALL}); # zerlegen wir den Original Call
|
||||||
|
|
||||||
if ($force && (lc($final) ne "ok"))
|
if ($force && !$success)
|
||||||
{
|
{
|
||||||
$repeat = "0" if (!$repeat);
|
#$repeat = "0" if (!defined($repeat) || ($repeat eq "")) ;
|
||||||
|
$repeat++; $repeat--;
|
||||||
$force =~ s/^\&//;
|
$force =~ s/^\&//;
|
||||||
$force ++; $force --;
|
$force++; $force--;
|
||||||
|
|
||||||
my $nr2 = $nr;
|
my $nr2 = $nr;
|
||||||
$nr2 =~ tr/0-9//cd;
|
$nr2 =~ tr/0-9//cd;
|
||||||
@ -778,7 +800,7 @@ sub SIP_Set($@)
|
|||||||
|
|
||||||
Log3 $name, 4, "$name, call -> ".$hash->{CALL};
|
Log3 $name, 4, "$name, call -> ".$hash->{CALL};
|
||||||
Log3 $name, 5, "$name, call has pid ".$hash->{CPID};
|
Log3 $name, 5, "$name, call has pid ".$hash->{CPID};
|
||||||
|
$hash->{helper}{CALL_START} = time();
|
||||||
readingsBeginUpdate($hash);
|
readingsBeginUpdate($hash);
|
||||||
readingsBulkUpdate($hash, "call_state","invite");
|
readingsBulkUpdate($hash, "call_state","invite");
|
||||||
readingsBulkUpdate($hash, "call",$nr);
|
readingsBulkUpdate($hash, "call",$nr);
|
||||||
@ -864,6 +886,11 @@ sub SIP_Set($@)
|
|||||||
readingsSingleUpdate($hash, "call_state",$subcmd,1);
|
readingsSingleUpdate($hash, "call_state",$subcmd,1);
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
elsif ($cmd eq "caller_time")
|
||||||
|
{
|
||||||
|
readingsSingleUpdate($hash, "caller_time",$subcmd,1);
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
elsif ($cmd eq "password")
|
elsif ($cmd eq "password")
|
||||||
{
|
{
|
||||||
return SIP_storePassword($name,$subcmd);
|
return SIP_storePassword($name,$subcmd);
|
||||||
@ -1108,7 +1135,8 @@ sub SIP_ListenStart($)
|
|||||||
{
|
{
|
||||||
my ($event) = @_;
|
my ($event) = @_;
|
||||||
Log3 $name, 5, "$logname, SIP_bye : $event";
|
Log3 $name, 5, "$logname, SIP_bye : $event";
|
||||||
SIP_telnet($hash, "set $name caller none\nset $name caller_state hangup\nexit\n") ;
|
my $calltime = time()-$hash->{CALL_START};
|
||||||
|
SIP_telnet($hash, "set $name caller none\nset $name caller_state hangup\nset $name caller_time $calltime\nexit\n") ;
|
||||||
$byebye = 1;
|
$byebye = 1;
|
||||||
return 1;
|
return 1;
|
||||||
};
|
};
|
||||||
@ -1129,7 +1157,7 @@ sub SIP_ListenStart($)
|
|||||||
$hash->{dtmf} = 0;
|
$hash->{dtmf} = 0;
|
||||||
$hash->{dtmf_event} = "";
|
$hash->{dtmf_event} = "";
|
||||||
$hash->{old} ="-";
|
$hash->{old} ="-";
|
||||||
|
|
||||||
SIP_telnet($hash, "set $name caller none\nset $name caller_state waitting\nexit\n") ;
|
SIP_telnet($hash, "set $name caller none\nset $name caller_state waitting\nexit\n") ;
|
||||||
|
|
||||||
$ua->listen (cb_create => \&$sub_create,
|
$ua->listen (cb_create => \&$sub_create,
|
||||||
@ -1144,7 +1172,10 @@ sub SIP_ListenStart($)
|
|||||||
cb_established => sub {
|
cb_established => sub {
|
||||||
(my $status,$call) = @_;
|
(my $status,$call) = @_;
|
||||||
if (!$block_it)
|
if (!$block_it)
|
||||||
{ SIP_telnet($hash,"set $name caller_state established\nexit\n"); return 1; }
|
{
|
||||||
|
$hash->{CALL_START} = time();
|
||||||
|
SIP_telnet($hash,"set $name caller_state established\nexit\n"); return 1;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
sleep 1;
|
sleep 1;
|
||||||
#SIP_telnet($hash, "set $name caller none\nset $name caller_state waitting\nexit\n") ;
|
#SIP_telnet($hash, "set $name caller none\nset $name caller_state waitting\nexit\n") ;
|
||||||
@ -1194,7 +1225,8 @@ sub SIP_ListenStart($)
|
|||||||
$byebye = 1;
|
$byebye = 1;
|
||||||
}
|
}
|
||||||
else { $dtmf_loop = ((AttrVal($name,"sip_dtmf_loop","once") eq 'once')) ? 0 : 1;
|
else { $dtmf_loop = ((AttrVal($name,"sip_dtmf_loop","once") eq 'once')) ? 0 : 1;
|
||||||
SIP_telnet($hash, "set $name caller_state hangup\nexit\n") if(!$dtmf_loop);
|
my $calltime = time()-$hash->{CALL_START};
|
||||||
|
SIP_telnet($hash, "set $name caller_state hangup\nset $name caller_time $calltime\nexit\n") if(!$dtmf_loop);
|
||||||
} # führt ggf. zum Schleifenende
|
} # führt ggf. zum Schleifenende
|
||||||
} # end inner loop
|
} # end inner loop
|
||||||
|
|
||||||
@ -1210,7 +1242,8 @@ sub SIP_ListenStart($)
|
|||||||
{
|
{
|
||||||
$ua->listen(
|
$ua->listen(
|
||||||
cb_create => \&$sub_create,
|
cb_create => \&$sub_create,
|
||||||
cb_invite => \&$sub_invite_wfp,
|
cb_invite => \&$sub_invite_wfp,
|
||||||
|
cb_established => sub { $hash->{CALL_START} = time(); },
|
||||||
filter => \&$sub_filter,
|
filter => \&$sub_filter,
|
||||||
recv_bye => \&$sub_bye,
|
recv_bye => \&$sub_bye,
|
||||||
init_media => $ua->rtp('send_recv',($msg3) ? $msg3 : $send_something),
|
init_media => $ua->rtp('send_recv',($msg3) ? $msg3 : $send_something),
|
||||||
@ -1230,6 +1263,7 @@ sub SIP_ListenStart($)
|
|||||||
sleep int(AttrVal($name, "sip_ringtime", 3)); #Anrufer hört das typische Klingeln wenn die Gegenseite nicht abnimmt
|
sleep int(AttrVal($name, "sip_ringtime", 3)); #Anrufer hört das typische Klingeln wenn die Gegenseite nicht abnimmt
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
cb_established => sub { $hash->{CALL_START} = time(); },
|
||||||
init_media => $ua->rtp( 'recv_echo',undef,0 ),
|
init_media => $ua->rtp( 'recv_echo',undef,0 ),
|
||||||
rtp_param => [8, 160, 160/8000, 'PCMA/8000'],
|
rtp_param => [8, 160, 160/8000, 'PCMA/8000'],
|
||||||
recv_bye => \&$sub_bye,
|
recv_bye => \&$sub_bye,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user