diff --git a/fhem/FHEM/72_FRITZBOX.pm b/fhem/FHEM/72_FRITZBOX.pm
index 918ba8cf0..9db3eebbc 100644
--- a/fhem/FHEM/72_FRITZBOX.pm
+++ b/fhem/FHEM/72_FRITZBOX.pm
@@ -46,6 +46,7 @@ sub FRITZBOX_Init($);
sub FRITZBOX_Ring_Start($@);
sub FRITZBOX_Exec($$);
sub FRITZBOX_Send_Mail($@);
+sub FRITZBOX_SetMOH($@);
sub FRITZBOX_Start_Radio($@);
our $telnet;
@@ -114,7 +115,7 @@ my %userType = (
, 4 => "Guest"
);
-my @mohtype = qw(announcement music customer);
+my @mohtype = qw(default sound customer);
my %landevice = ();
@@ -253,12 +254,13 @@ FRITZBOX_Set($$@)
my $resultStr = "";
my $list = "alarm"
+ . " convertMOH"
. " convertRingTone"
. " createPwdFile"
. " customerRingTone"
. " diversity"
. " guestWlan:on,off"
- . " message"
+ . " moh"
. " ring"
. " sendMail"
. " startRadio"
@@ -270,6 +272,7 @@ FRITZBOX_Set($$@)
{
if ( int @val == 2 && $val[0] =~ /^(1|2|3)$/ && $val[1] =~ /^(on|off)$/ )
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
my $state = $val[1];
$state =~ s/on/1/;
$state =~ s/off/0/;
@@ -278,9 +281,17 @@ FRITZBOX_Set($$@)
return undef;
}
+ } elsif ( lc $cmd eq 'convertmoh') {
+ if (int @val > 0)
+ {
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
+ return FRITZBOX_ConvertMOH $hash, @val;
+ }
+
} elsif ( lc $cmd eq 'convertringtone') {
if (int @val > 0)
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
return FRITZBOX_ConvertRingTone $hash, @val;
}
@@ -299,12 +310,14 @@ FRITZBOX_Set($$@)
} elsif ( lc $cmd eq 'customerringtone') {
if (int @val > 0)
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
return FRITZBOX_SetCustomerRingTone $hash, @val;
}
} elsif ( lc $cmd eq 'diversity') {
if ( int @val == 2 && defined( $hash->{READINGS}{"diversity".$val[0]} ) && $val[1] =~ /^(on|off)$/ )
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
my $state = $val[1];
$state =~ s/on/1/;
$state =~ s/off/0/;
@@ -316,6 +329,7 @@ FRITZBOX_Set($$@)
} elsif ( lc $cmd eq 'guestwlan') {
if (int @val == 1 && $val[0] =~ /^(on|off)$/)
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
my $state = $val[0];
$state =~ s/on/1/;
$state =~ s/off/0/;
@@ -324,24 +338,35 @@ FRITZBOX_Set($$@)
return undef;
}
}
- elsif ( lc $cmd eq 'message')
+
+ elsif ( lc $cmd eq 'moh')
{
if (int @val > 0)
{
- $hash->{Message} = substr (join(" ", @val),0,30) ;
- return undef;
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
+ $resultStr = FRITZBOX_SetMOH $hash, @val;
+ unless ($resultStr)
+ {
+ $hash->{fhem}{LOCAL}=2; #2 = short update without new trigger
+ FRITZBOX_Readout_Start($hash);
+ $hash->{fhem}{LOCAL}=0;
+ }
+ return $resultStr;
}
}
+
elsif ( lc $cmd eq 'ring')
{
if (int @val > 0)
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
FRITZBOX_Ring_Start $hash, @val;
return undef;
}
}
elsif ( lc $cmd eq 'sendmail')
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
FRITZBOX_Send_Mail $hash, @val;
return undef;
}
@@ -349,6 +374,7 @@ FRITZBOX_Set($$@)
{
if (int @val > 0)
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
return FRITZBOX_Start_Radio $hash, @val;
}
}
@@ -356,6 +382,7 @@ FRITZBOX_Set($$@)
{
if ( int @val == 2 && defined( $hash->{READINGS}{"tam".$val[0]} ) && $val[1] =~ /^(on|off)$/ )
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
my $state = $val[1];
$state =~ s/on/1/;
$state =~ s/off/0/;
@@ -366,6 +393,7 @@ FRITZBOX_Set($$@)
}
elsif( lc $cmd eq 'update' )
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
$hash->{fhem}{LOCAL}=1;
FRITZBOX_Readout_Start($hash);
$hash->{fhem}{LOCAL}=0;
@@ -375,6 +403,7 @@ FRITZBOX_Set($$@)
{
if (int @val == 1 && $val[0] =~ /^(on|off)$/)
{
+ Log3 $name, 3, "FRITZBOX $name: $cmd ".join(" ", @val);
my $state = $val[0];
$state =~ s/on/1/;
$state =~ s/off/0/;
@@ -383,7 +412,6 @@ FRITZBOX_Set($$@)
$hash->{fhem}{LOCAL}=2; #2 = short update without new trigger
FRITZBOX_Readout_Start($hash);
$hash->{fhem}{LOCAL}=0;
-
return undef;
}
}
@@ -493,7 +521,6 @@ FRITZBOX_Readout_Run($)
# Box model and firmware
push @readoutArray, [ "box_model", 'echo $CONFIG_PRODUKT_NAME' ];
push @readoutArray, [ "box_fwVersion", "ctlmgr_ctl r logic status/nspver", "fwupdate" ];
- push @readoutArray, [ "box_moh", "ctlmgr_ctl r telcfg settings/MOHType", "mohtype" ];
$resultArray = FRITZBOX_Readout_Query( $hash, \@readoutArray, \@readoutReadings);
my $dectCount = $resultArray->[1];
@@ -677,6 +704,8 @@ FRITZBOX_Readout_Run($)
# Gäste WLAN
push @readoutArray, [ "box_guestWlan", "ctlmgr_ctl r wlan settings/guest_ap_enabled", "onoff" ];
push @readoutArray, [ "box_guestWlanRemain", "ctlmgr_ctl r wlan settings/guest_time_remain", ];
+#Music on Hold
+ push @readoutArray, [ "box_moh", "ctlmgr_ctl r telcfg settings/MOHType", "mohtype" ];
# Alarm clock
for (0..2)
@@ -1091,8 +1120,86 @@ FRITZBOX_Ring_Aborted($)
FRITZBOX_Log $hash, 1, "Timeout when ringing";
}
-sub ############################################
-FRITZBOX_SetCustomerRingTone($@)
+############################################
+sub FRITZBOX_SetMOH($@)
+{
+ my ($hash, $type, @file) = @_;
+ my $returnStr;
+ my @cmdArray;
+ my $result;
+ my $name = $hash->{NAME};
+
+ if (lc $type eq lc $mohtype[0] || $type eq "0")
+ {
+ FRITZBOX_Exec ($hash, 'ctlmgr_ctl w telcfg settings/MOHType 0');
+ return undef;
+ }
+ elsif (lc $type eq lc $mohtype[1] || $type eq "1")
+ {
+ FRITZBOX_Exec ($hash, 'ctlmgr_ctl w telcfg settings/MOHType 1');
+ return undef;
+ }
+ return "Error: Unvalid parameter '$type'" unless lc $type eq lc $mohtype[2] || $type eq "2";
+
+# Load customer MOH file
+ my $uploadDir = AttrVal( $name, "defaultUploadDir", "" );
+ $uploadDir .= "/"
+ unless $uploadDir =~ /\/$|^$/;
+
+ my $inFile = join " ", @file;
+ $inFile = $uploadDir.$inFile
+ unless $inFile =~ /^\//;
+
+ return "Error: Please give a complete file path or define the attribute 'defaultUploadDir'"
+ unless $inFile =~ /^\//;
+
+ return "Error: Only MP3 files can be used for 'music on hold'."
+ unless $inFile =~ /\.mp3$/i;
+
+ $result = FRITZBOX_Open_Connection( $hash );
+ return "$name|0|$result"
+ if $result;
+
+ my $uploadFile = '/var/tmp/moh_upload';
+ my $mohFile = '/var/tmp/fx_moh';
+ push @cmdArray, '[ -f "'.$uploadFile.'" ] && rm "'.$uploadFile.'"';
+ push @cmdArray, '[ -f "'.$mohFile.'" ] && rm "'.$mohFile.'"';
+
+ if ($inFile =~ /^(ftp|http):\/\//)
+ {
+ push @cmdArray, 'wget -O "'.$uploadFile.'" "'.$inFile.'"';
+ } else {
+ push @cmdArray, 'cp "'.$inFile.'" "'.$uploadFile.'"';
+
+ }
+ push @cmdArray, '[ -f "'.$uploadFile.'" ] && echo 1 || echo 0';
+# Execute command array
+ $result = FRITZBOX_Exec ( $hash, \@cmdArray );
+ return "Could not access '$inFile'"
+ unless $result->[3] == 1;
+
+#Prepare 2nd command array
+ push @cmdArray, 'ffmpegconv -i "'.$uploadFile.'" -o "'.$mohFile.'" --limit 32 --type 6';
+ push @cmdArray, '[ -f "'.$mohFile.'" ] && echo 1 || echo 0';
+# Execute 2nd command array
+ $result = FRITZBOX_Exec ( $hash, \@cmdArray );
+ return "Could not convert '$inFile'"
+ unless $result->[1] == 1;
+
+#Prepare 3rd command array
+ push @cmdArray, 'cat "'.$mohFile.'" >/var/flash/fx_moh';
+ push @cmdArray, 'killall -sigusr1 telefon';
+ push @cmdArray, 'rm "'.$uploadFile.'"';
+ push @cmdArray, 'rm "'.$mohFile.'"';
+# Execute 3rd command array
+ $result = FRITZBOX_Exec ( $hash, \@cmdArray );
+
+ FRITZBOX_Close_Connection( $hash );
+ return undef;
+}
+
+############################################
+sub FRITZBOX_SetCustomerRingTone($@)
{
my ($hash, $intern, @file) = @_;
my $returnStr;
@@ -1137,8 +1244,39 @@ FRITZBOX_SetCustomerRingTone($@)
return $returnStr;
}
-sub ############################################
-FRITZBOX_ConvertRingTone ($@)
+############################################
+sub FRITZBOX_ConvertMOH ($@)
+{
+ my ($hash, @file) = @_;
+
+ my $name = $hash->{NAME};
+
+ my $uploadDir = AttrVal( $name, "defaultUploadDir", "" );
+ $uploadDir .= "/"
+ unless $uploadDir =~ /\/$|^$/;
+
+ my $inFile = join " ", @file;
+ $inFile = $uploadDir.$inFile
+ unless $inFile =~ /^\//;
+
+ return "Error: You have to give a complete file path or to set the attribute 'defaultUploadDir'"
+ unless $inFile =~ /^\//;
+
+ return "Error: only MP3 or WAV files can be converted"
+ unless $inFile =~ /\.mp3$|.wav$/i;
+
+ $inFile =~ s/file:\/\///;
+
+ my $outFile = $inFile;
+ $outFile = substr($inFile,0,-4)
+ if ($inFile =~ /\.(mp3|wav)$/i);
+ my $returnStr = FRITZBOX_Exec ($hash
+ , 'ffmpegconv -i "'.$inFile.'" -o "'.$outFile.'.moh" --limit 32 --type 6');
+ return $returnStr;
+} # end FRITZBOX_ConvertMOH
+
+############################################
+sub FRITZBOX_ConvertRingTone ($@)
{
my ($hash, @file) = @_;
@@ -1166,7 +1304,7 @@ FRITZBOX_ConvertRingTone ($@)
my $returnStr = FRITZBOX_Exec ($hash
, 'picconv.sh "file://'.$inFile.'" "'.$outFile.'.g722" ringtonemp3');
return $returnStr;
-}
+} # end FRITZBOX_ConvertRingTone
#'picconv.sh "'.$inFile.'" "'.$outFile.'.g722" ringtonemp3'
#picconv.sh "file://$dir/upload.mp3" "$dir/$filename" ringtonemp3
@@ -1177,8 +1315,6 @@ FRITZBOX_ConvertRingTone ($@)
#ctlmgr_ctl r user settings/user0/bpjm_filter_enable
#/usr/bin/pbd --set-ringtone-url --book="255" --id="612" --url="file:///var/InternerSpeicher/claydermann.g722" --name="Claydermann"
# /usr/bin/moh_upload
-# ffmpegconv -i $file -o fx_moh --limit 32 --type 6
-# cat fx_moh >/var/flash/fx_moh
# Opens a Telnet Connection to an external FritzBox
############################################
@@ -1503,7 +1639,7 @@ FRITZBOX_Start_Radio($@)
}
else
{
- foreach (keys $hash->{fhem}{radio})
+ foreach (keys %{$hash->{fhem}{radio}})
{
if (lc $hash->{fhem}{radio}{$_} eq lc $radioStationName)
{
@@ -1768,12 +1904,12 @@ sub FRITZBOX_fritztris($)
If the Fritz!Box is configured differently, the user name has to be defined with this attribute.
-
ringWithIntern <1 | 2 | 3 | 4>
+ ringWithIntern <1 | 2 | 3>
set <name> musicOnHold <fullFilePath>
+ set <name> moh <default|sound|customer> [<fullFilePath>]
set <name> ring <interneNummern> [Dauer [Klingelton]] [msg:Nachricht]
@@ -2009,12 +2142,12 @@ sub FRITZBOX_fritztris($)
Wenn die Fritz!Box anders konfiguriert ist, kann der Nutzer über dieses Attribut definiert werden.
ringWithIntern <1 | 2 | 3 | 4>
+ ringWithIntern <1 | 2 | 3>