diff --git a/fhem/CHANGED b/fhem/CHANGED index d6026da76..0e0b39a35 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # 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: new module FRITZBOX: controls Fritz!Box router and Fritz!Fon - feature: new module 52_I2C_EEPROM.pm added (klausw) - feature: readingsGroup: added ! flag, added visibility and cellStyle attributes @@ -12,13 +13,13 @@ - feature: 10_IT empfang (by bjoernh) - bugfix: PRESENCE: fix race condition, when delete disabled attribute and PRESENCE does not start to scan. - - added: OPENWEATHER: captures weather forecast from API of www.wetter.com + - feature: OPENWEATHER: captures weather forecast from API of www.wetter.com - fhem 5.6 released - 2014-11-09 (5.6) - bugfix: FB_CALLMONITOR: fixing race condition of missing events while performing multiple calls - - added: PROPLANTA: captures weather forecast from web page www.proplanta.de + - feature: PROPLANTA: captures weather forecast from web page www.proplanta.de - feature: 15_CUL_EM added attribute maxPeak (arnoaugustin) - bugfix: 10_IT changed "setstate" to avoid eventMap errors (arnoaugustin) - feature: new module 37_harmony.pm added (justme1968) diff --git a/fhem/FHEM/59_PROPLANTA.pm b/fhem/FHEM/59_PROPLANTA.pm index 65ec1df92..55927afe1 100644 --- a/fhem/FHEM/59_PROPLANTA.pm +++ b/fhem/FHEM/59_PROPLANTA.pm @@ -554,7 +554,10 @@ sub PROPLANTA_Run($) if ($attrURL eq "") { $URL = $hash->{URL2}; - foreach (4, 7, 11) + my @URL_days = (4, 7, 11); + unshift @URL_days, 0 + if @MyProplantaParser::texte == 0; + foreach (@URL_days) { $response = PROPLANTA_HtmlAcquire($hash,$URL . $_); $MyProplantaParser::startDay = $_; @@ -610,8 +613,11 @@ sub PROPLANTA_Done($) if (keys %values > 0) { - # Achtung! Um Mitternacht fehlen die aktuellen Werte - readingsBulkUpdate($hash, "state", "Tmin: " . $values{fc0_tempMin} . " Tmax: " . $values{fc0_tempMax} . " T: " . $values{temperature} . " H: " . $values{humidity} . " W: " . $values{wind} . " P: " . $values{pressure} ); + my $newState = "Tmin: " . $values{fc0_tempMin} . " Tmax: " . $values{fc0_tempMax}; + # Achtung! Nach Mitternacht fehlen für 1 h die aktuellen Werte + $newState .= " T: " . $values{temperature} . " H: " . $values{humidity} . " W: " . $values{wind} . " P: " . $values{pressure} + if defined $values{temperature}; + readingsBulkUpdate($hash, "state", $newState); readingsBulkUpdate( $hash, "lastConnection", keys( %values )." values captured" ); PROPLANTA_Log $hash, 4, keys( %values )." values captured"; } diff --git a/fhem/FHEM/72_FRITZBOX.pm b/fhem/FHEM/72_FRITZBOX.pm index 8ba460439..5b28328c9 100644 --- a/fhem/FHEM/72_FRITZBOX.pm +++ b/fhem/FHEM/72_FRITZBOX.pm @@ -41,8 +41,7 @@ use Blocking; sub FRITZBOX_Log($$$); sub FRITZBOX_Init($); -sub FRITZBOX_Init_Reading($$$@); -sub FRITZBOX_Ring($@); +sub FRITZBOX_Ring_Start($@); sub FRITZBOX_Exec($$); my %fonModel = ( @@ -130,6 +129,7 @@ FRITZBOX_Initialize($) $hash->{GetFn} = "FRITZBOX_Get"; $hash->{AttrFn} = "FRITZBOX_Attr"; $hash->{AttrList} = "disable:0,1 " + ."INTERVAL " ."ringWithIntern:0,1,2 " ."defaultCallerName " ."defaultUploadDir " @@ -151,12 +151,14 @@ FRITZBOX_Define($$) $hash->{NAME} = $name; $hash->{STATE} = "Initializing"; - $hash->{Message} = "FHEM"; $hash->{fhem}{modulVersion} = '$Date$'; - + $hash->{INTERVAL} = 300; + $hash->{fhem}{lastHour} = 0; + $hash->{fhem}{LOCAL} = 0; + RemoveInternalTimer($hash); # Get first data after 6 seconds - InternalTimer(gettimeofday() + 6, "FRITZBOX_Init", $hash, 0); + InternalTimer(gettimeofday() + 6, "FRITZBOX_Readout_Start", $hash, 0); return undef; } #end FRITZBOX_Define @@ -169,6 +171,12 @@ FRITZBOX_Undefine($$) RemoveInternalTimer($hash); + BlockingKill( $hash->{helper}{READOUT_RUNNING_PID} ) + if exists $hash->{helper}{READOUT_RUNNING_PID}; + + BlockingKill( $hash->{helper}{RING_RUNNING_PID} ) + if exists $hash->{helper}{RING_RUNNING_PID}; + return undef; } # end FRITZBOX_Undefine @@ -231,13 +239,15 @@ FRITZBOX_Set($$@) { if (int @val > 0) { - FRITZBOX_Ring $hash, @val; + FRITZBOX_Ring_Start $hash, @val; return undef; } } elsif( lc $cmd eq 'update' ) { - FRITZBOX_Init($hash); + $hash->{fhem}{LOCAL}=1; + FRITZBOX_Readout_Start($hash); + $hash->{fhem}{LOCAL}=0; return undef; } elsif ( lc $cmd eq 'startradio') @@ -292,117 +302,184 @@ FRITZBOX_Get($@) return "Unknown argument $cmd, choose one of $list"; } # end FRITZBOX_Get - # Starts the data capturing and sets the new timer sub ########################################## -FRITZBOX_Init($) +FRITZBOX_Readout_Start($) { my ($hash) = @_; my $name = $hash->{NAME}; + + $hash->{INTERVAL} = AttrVal( $name, "INTERVAL", $hash->{INTERVAL} ); + $hash->{INTERVAL} = 60 + if $hash->{INTERVAL} < 60 && $hash->{INTERVAL} != 0; + + if(!$hash->{fhem}{LOCAL} && $hash->{INTERVAL} != 0) { + RemoveInternalTimer($hash); + InternalTimer(gettimeofday()+$hash->{INTERVAL}, "FRITZBOX_Readout_Start", $hash, 1); + return undef if( AttrVal($name, "disable", 0 ) == 1 ); + } + + if ( exists( $hash->{helper}{READOUT_RUNNING_PID} ) && $hash->{fhem}{LOCAL} != 1 ) + { + FRITZBOX_Log $hash, 1, "Old readout process still running. Killing old process ".$hash->{helper}{READOUT_RUNNING_PID}; + BlockingKill( $hash->{helper}{READOUT_RUNNING_PID} ); + delete($hash->{helper}{READOUT_RUNNING_PID}); + } + + $hash->{helper}{READOUT_RUNNING_PID} = BlockingCall("FRITZBOX_Readout_Run", $name, + "FRITZBOX_Readout_Done", 55, + "FRITZBOX_Readout_Aborted", $hash) + unless exists( $hash->{helper}{READOUT_RUNNING_PID} ); + +} # end FRITZBOX_Readout_Start + +# Starts the data capturing and sets the new timer +sub ########################################## +FRITZBOX_Readout_Run($) +{ + my ($name) = @_; + my $hash = $defs{$name}; + my $result; my $rName; my @cmdArray; my @readoutArray; my $resultArray; + my @readoutReadings; + my $i; - FRITZBOX_Log $hash, 4, "Start update of device readings."; - readingsBeginUpdate($hash); - - # Box Firmware - push @readoutArray, [ "box_fwVersion", "ctlmgr_ctl r logic status/nspver", "fwupdate" ]; - # WLAN - push @readoutArray, [ "box_wlan", "ctlmgr_ctl r wlan settings/ap_enabled", "onoff" ]; - # Gäste WLAN - push @readoutArray, [ "box_guestWlan", "ctlmgr_ctl r wlan settings/guest_ap_enabled", "onoff" ]; - FRITZBOX_Array_Readout( $hash, \@readoutArray ); - - # Internetradioliste erzeugen - my $i = 0; - @radio = (); - $rName = "radio00"; - do + my $slowRun = 0; + if ( int(time/3600) != $hash->{fhem}{lastHour} || $hash->{fhem}{LOCAL} == 1) { - $result = FRITZBOX_Init_Reading($hash - , $rName - , "ctlmgr_ctl r configd settings/WEBRADIO".$i."/Name"); - push (@radio, $result) - if $result; - $i++; - $rName = sprintf ("radio%02d",$i); + push @readoutReadings, "fhem->lastHour|".int(time/3600); + $slowRun = 1; + FRITZBOX_Log $hash, 4, "Start update of slow changing device readings."; } - while ( $result ne "" || defined $hash->{READINGS}{$rName} ); - -# Dect Telefon - foreach (610..615) { delete $hash->{fhem}{$_} if defined $hash->{fhem}{$_}; } - - # Init Foncontrol - FRITZBOX_Exec ($hash, "ctlmgr_ctl r telcfg settings/Foncontrol"); - foreach (1..6) + else { - # Dect-Interne Nummer - my $intern = FRITZBOX_Init_Reading($hash, - "dect".$_."_intern", - "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/Intern"); - next - unless $intern ne ""; - # Dect-Telefonname - $result = FRITZBOX_Init_Reading($hash, - "dect".$_, - "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/Name"); - $hash->{fhem}{$intern}{name} = $result; - # Handset manufacturer - $result = FRITZBOX_Init_Reading($hash, - "dect".$_."_manufacturer", - "ctlmgr_ctl r dect settings/Handset".($_-1)."/Manufacturer"); - $hash->{fhem}{$intern}{brand} = $result; - if ($result eq "AVM") + FRITZBOX_Log $hash, 4, "Start update of fast changing device readings."; + } + my $returnStr = "$name|"; + + if ($slowRun == 1) + { + + # Init and Counters + push @readoutArray, ["", "ctlmgr_ctl r telcfg settings/Foncontrol"]; + push @readoutArray, ["", "ctlmgr_ctl r telcfg settings/Foncontrol/User/count"]; + push @readoutArray, ["", "ctlmgr_ctl r configd settings/WEBRADIO/count"]; + push @readoutArray, ["", "ctlmgr_ctl r user settings/user/count"]; + # Box Firmware + push @readoutArray, [ "box_fwVersion", "ctlmgr_ctl r logic status/nspver", "fwupdate" ]; + $resultArray = FRITZBOX_Readout_Query( $hash, \@readoutArray, \@readoutReadings ); + + my $dectCount = $resultArray->[1]; + my $radioCount = $resultArray->[2]; + my $userCount = $resultArray->[3]; + + + # Internetradioliste erzeugen + if ($radioCount > 0 ) { - # Internal Ring Tone Name - FRITZBOX_Init_Reading($hash - , "dect".$_."_intRingTone" - , "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/IntRingTone" - , "ringtone"); - # Alarm Ring Tone Name - FRITZBOX_Init_Reading($hash - , "dect".$_."_alarmRingTone" - , "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/AlarmRingTone0" - , "ringtone"); - # Radio Name - FRITZBOX_Init_Reading($hash - , "dect".$_."_radio" - , "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/RadioRingID" - , "radio"); - # Background image - FRITZBOX_Init_Reading($hash - , "dect".$_."_imagePath " - , "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/ImagePath "); - # Customer Ring Tone - FRITZBOX_Init_Reading($hash - , "dect".$_."_custRingTone" - , "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/G722RingTone"); - # Customer Ring Tone Name - FRITZBOX_Init_Reading($hash - , "dect".$_."_custRingToneName" - , "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/G722RingToneName"); - # Firmware Version - FRITZBOX_Init_Reading($hash - , "dect".$_."_fwVersion" - , "ctlmgr_ctl r dect settings/Handset".($_-1)."/FWVersion"); - # Phone Model - $result = FRITZBOX_Init_Reading($hash - , "dect".$_."_model" - , "ctlmgr_ctl r dect settings/Handset".($_-1)."/Model" - , "model"); - $hash->{fhem}{$intern}{model} = $result; + $i = 0; + @radio = (); + $rName = "radio00"; + do + { + push @readoutArray, [ $rName, "ctlmgr_ctl r configd settings/WEBRADIO".$i."/Name"]; + $i++; + $rName = sprintf ("radio%02d",$i); + } + while ( $radioCount > $i || defined $hash->{READINGS}{$rName} ); + + $resultArray = FRITZBOX_Readout_Query( $hash, \@readoutArray, \@readoutReadings ); + + for (0..$radioCount-1) + { + $radio[$_] = $result + if $resultArray->[$_] ne ""; + + } } - } -# Analog telefons - foreach (1..3) - { - push @readoutArray, ["fon".$_, "ctlmgr_ctl r telcfg settings/MSN/Port".($_-1)."/Name"]; - } + # Dect Phones + if ($dectCount>0) + { + for (610..615) { delete $hash->{fhem}{$_} if defined $hash->{fhem}{$_}; } + + for (1..6) + { + # 0 Dect-Interne Nummer + push @readoutArray, [ "dect".$_."_intern", "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/Intern" ]; + # 1 Dect-Telefonname + push @readoutArray, [ "dect".$_, "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/Name" ]; + # 2 Handset manufacturer + push @readoutArray, [ "dect".$_."_manufacturer", "ctlmgr_ctl r dect settings/Handset".($_-1)."/Manufacturer" ]; + # 3 Internal Ring Tone Name + push @readoutArray, [ "dect".$_."_intRingTone", "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/IntRingTone", "ringtone" ]; + # 4 Alarm Ring Tone Name + push @readoutArray, [ "dect".$_."_alarmRingTone", "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/AlarmRingTone0", "ringtone" ]; + # 5 Radio Name + push @readoutArray, [ "dect".$_."_radio", "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/RadioRingID", "radio" ]; + # 6 Background image + push @readoutArray, [ "dect".$_."_imagePath ", "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/ImagePath " ]; + # 7 Customer Ring Tone + push @readoutArray, [ "dect".$_."_custRingTone", "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/G722RingTone" ]; + # 8 Customer Ring Tone Name + push @readoutArray, [ "dect".$_."_custRingToneName", "ctlmgr_ctl r telcfg settings/Foncontrol/User".$_."/G722RingToneName" ]; + # 9 Firmware Version + push @readoutArray, [ "dect".$_."_fwVersion", "ctlmgr_ctl r dect settings/Handset".($_-1)."/FWVersion" ]; + # 10 Phone Model + push @readoutArray, [ "dect".$_."_model", "ctlmgr_ctl r dect settings/Handset".($_-1)."/Model", "model" ]; + } + $resultArray = FRITZBOX_Readout_Query( $hash, \@readoutArray, \@readoutReadings ); + foreach (0..5) + { + my $offset = $_ * 11; + my $intern = $resultArray->[ $offset ]; + if ( $intern ) + { + push @readoutReadings, "fhem->$intern->name|" . $resultArray->[ $offset + 1 ]; + push @readoutReadings, "fhem->$intern->brand|" . $resultArray->[ $offset + 2 ]; + push @readoutReadings, "fhem->$intern->model|" . FRITZBOX_Readout_Format($hash, "model", $resultArray->[ $offset + 10 ] ); + } + } + } + # Analog Fons Name + foreach (1..3) + { + push @readoutArray, ["fon".$_, "ctlmgr_ctl r telcfg settings/MSN/Port".($_-1)."/Name"]; + } + $resultArray = FRITZBOX_Readout_Query( $hash, \@readoutArray, \@readoutReadings ); + + # Analog Fons Number + foreach (1..3) + { + push @readoutReadings, "fon".$_."_intern", $_ + if $resultArray->[$_-1]; + } + + # user profiles + $i=0; + $rName = "user01"; + do + { + push @readoutArray, [$rName, "ctlmgr_ctl r user settings/user".$i."/name"]; + push @readoutArray, [$rName."_thisMonthTime", "ctlmgr_ctl r user settings/user".$i."/this_month_time", "timeinhours"]; + push @readoutArray, [$rName."_todayTime", "ctlmgr_ctl r user settings/user".$i."/today_time", "timeinhours"]; + push @readoutArray, [$rName."_type", "ctlmgr_ctl r user settings/user".$i."/type"]; + $i++; + $rName = sprintf ("user%02d",$i+1); + } + while ($i<$userCount || defined $hash->{READINGS}{$rName}); + $resultArray = FRITZBOX_Readout_Query( $hash, \@readoutArray, \@readoutReadings ); + } + +# WLAN + push @readoutArray, [ "box_wlan", "ctlmgr_ctl r wlan settings/ap_enabled", "onoff" ]; +# Gäste WLAN + push @readoutArray, [ "box_guestWlan", "ctlmgr_ctl r wlan settings/guest_ap_enabled", "onoff" ]; # Alarm clock foreach (0..2) { @@ -417,75 +494,87 @@ FRITZBOX_Init($) # Alarm clock weekdays push @readoutArray, ["alarm".($_+1)."_wdays", "ctlmgr_ctl r telcfg settings/AlarmClock".$_."/Weekdays", "aldays"]; } - $resultArray = FRITZBOX_Array_Readout( $hash, \@readoutArray ); -# Analog telefons number - foreach (1..3) - { - readingsBulkUpdate($hash, "fon".$_."_intern", $_) - if $resultArray->[$_-1]; - } - -# user profiles - $i=0; - $rName = "user01"; - do - { - push @readoutArray, [$rName, "ctlmgr_ctl r user settings/user".$i."/name"]; - push @readoutArray, [$rName."_thisMonthTime", "ctlmgr_ctl r user settings/user".$i."/this_month_time", "timeinhours"]; - push @readoutArray, [$rName."_todayTime", "ctlmgr_ctl r user settings/user".$i."/today_time", "timeinhours"]; - push @readoutArray, [$rName."_type", "ctlmgr_ctl r user settings/user".$i."/type"]; - $resultArray = FRITZBOX_Array_Readout( $hash, \@readoutArray ); - $i++; - $rName = sprintf ("user%02d",$i+1); - } - while ($i<100 && ($resultArray->[0] ne "" || defined $hash->{READINGS}{$rName} )); + $resultArray = FRITZBOX_Readout_Query( $hash, \@readoutArray, \@readoutReadings ); readingsEndUpdate( $hash, 1 ); - FRITZBOX_Log $hash, 4, "Update of device readings finished."; - - RemoveInternalTimer($hash); - # Get next data after 15 minutes - InternalTimer(gettimeofday() + 900, "FRITZBOX_Init", $hash, 1); -} + $returnStr .= join('|', @readoutReadings ); + + return $returnStr + +} # End FRITZBOX_Readout_Run sub ########################################## -FRITZBOX_Init_Reading($$$@) +FRITZBOX_Readout_Done($) { - my ($hash, $rName, $cmd, $rFormat) = @_; + my ($string) = @_; + return unless defined $string; + + my ($name, %values) = split("\\|", $string); + my $hash = $defs{$name}; - $rFormat = "" - unless defined $rFormat; - - my $rValue = FRITZBOX_Exec( $hash, $cmd); - - $rValue = FRITZBOX_Format_Readout( $hash, $rFormat, $rValue ); - if ($rValue) + # delete the marker for RUNNING_PID process + delete($hash->{helper}{READOUT_RUNNING_PID}); + + readingsBeginUpdate($hash); + + if ( defined $values{Error} ) { - readingsBulkUpdate($hash, $rName, $rValue) - } - elsif (defined $hash->{READINGS}{$rName} ) - { - delete $hash->{READINGS}{$rName}; + readingsBulkUpdate( $hash, "lastReadout", $values{Error} ); } - return $rValue; + else + { + my $x = 0; + while (my ($rName, $rValue) = each(%values) ) + { + if ($rName =~ /->/) + { + my ($rName1,$rName2,$rName3) = split /->/, $rName; + if (defined $rName3) + { + $hash->{$rName1}{$rName2}{$rName3} = $rValue; + } + else + { + $hash->{$rName1}{$rName2} = $rValue; + } + } + else + { + readingsBulkUpdate( $hash, $rName, $rValue ); + } + } + + readingsBulkUpdate( $hash, "lastReadout", keys( %values )." values captured" ); + FRITZBOX_Log $hash, 4, keys( %values )." values captured"; + } + + readingsEndUpdate( $hash, 1 ); } sub ########################################## -FRITZBOX_Array_Readout($$) +FRITZBOX_Readout_Aborted($) { - my ($hash, $readoutArray) = @_; + my ($hash) = @_; + delete($hash->{helper}{READOUT_RUNNING_PID}); + FRITZBOX_Log $hash, 1, "Timeout when reading Fritz!Box data."; +} + +sub ########################################## +FRITZBOX_Readout_Query($$$) +{ + my ($hash, $readoutArray, $readoutReadings) = @_; my @cmdArray; my $rValue; my $rName; my $rFormat; - my $count = int @{$readoutArray} -1; + my $count = int @{$readoutArray} - 1; for (0..$count) { push @cmdArray, $readoutArray->[$_][1]; } - + my $resultArray = FRITZBOX_Exec( $hash, \@cmdArray); $count = int @{$resultArray} -1; for (0..$count) @@ -493,17 +582,20 @@ FRITZBOX_Array_Readout($$) $rValue = $resultArray->[$_]; $rFormat = $readoutArray->[$_][2]; $rFormat = "" unless defined $rFormat; - $rValue = FRITZBOX_Format_Readout ($hash, $rFormat, $rValue); + $rValue = FRITZBOX_Readout_Format ($hash, $rFormat, $rValue); $rName = $readoutArray->[$_][0]; - if ($rValue ne "") + if ($rName ne "") { - FRITZBOX_Log $hash, 5, "$rName: $rValue"; - readingsBulkUpdate($hash, $rName, $rValue); - } - elsif (defined $hash->{READINGS}{$rName} ) - { - FRITZBOX_Log $hash, 5, "Delete $rName"; - delete $hash->{READINGS}{$rName}; + if ($rValue ne "") + { + FRITZBOX_Log $hash, 5, "$rName: $rValue"; + push @{$readoutReadings}, $rName."|".$rValue; + } + elsif (defined $hash->{READINGS}{$rName} ) + { + FRITZBOX_Log $hash, 5, "Delete $rName"; + delete $hash->{READINGS}{$rName}; + } } } @{$readoutArray} = (); @@ -512,10 +604,12 @@ FRITZBOX_Array_Readout($$) } sub ########################################## -FRITZBOX_Format_Readout($$$) +FRITZBOX_Readout_Format($$$) { my ($hash, $format, $readout) = @_; + return $readout + unless defined $format; return $readout unless $readout ne "" && $format ne "" ; @@ -535,14 +629,19 @@ FRITZBOX_Format_Readout($$$) } } } elsif ($format eq "alnumber") { - if (60 <= $readout && $readout <=65) { - my $intern = $readout + 550; - $readout = $hash->{fhem}{$intern}{name}." - DECT $intern"; + my $intern = $readout; + if (1 <= $readout && $readout <=2) { + $readout = "FON $intern"; } elsif ($readout == 9) { $readout = "all DECT"; + } elsif (60 <= $readout && $readout <=65) { + $intern = $readout + 550; + $readout = "DECT $intern"; } elsif ($readout == 50) { $readout = "all"; } + $readout .= " (".$hash->{fhem}{$intern}{name}.")" + if defined $hash->{fhem}{$intern}{name}; } elsif ($format eq "fwupdate") { my $update = FRITZBOX_Exec( $hash, "ctlmgr_ctl r updatecheck status/update_available_hint"); $readout .= " (old)" if $update == 1; @@ -555,18 +654,20 @@ FRITZBOX_Format_Readout($$$) } elsif ($format eq "radio") { $readout = $radio[$readout]; - + } elsif ($format eq "ringtone") { $readout = $ringTone{$readout}; } elsif ($format eq "timeinhours") { $readout = sprintf "%d h %d min", int $readout/3600, int( ($readout %3600) / 60); } + + $readout = "" unless defined $readout; return $readout; } - + sub ########################################## -FRITZBOX_Ring($@) +FRITZBOX_Ring_Start($@) { my ($hash, @val) = @_; my $name = $hash->{NAME}; @@ -574,21 +675,21 @@ FRITZBOX_Ring($@) $val[1] = 5 unless defined $val[1]; - if ( exists( $hash->{helper}{RUNNING_PID} ) ) + if ( exists( $hash->{helper}{RING_RUNNING_PID} ) ) { - FRITZBOX_Log $hash, 1, "Old process still running. Killing old process ".$hash->{helper}{RUNNING_PID}; - BlockingKill( $hash->{helper}{RUNNING_PID} ); - delete($hash->{helper}{RUNNING_PID}); + FRITZBOX_Log $hash, 1, "Old process still running. Killing old process ".$hash->{helper}{RING_RUNNING_PID}; + BlockingKill( $hash->{helper}{RING_RUNNING_PID} ); + delete($hash->{helper}{RING_RUNNING_PID}); } my $timeout = $val[1] + 30; my $handover = $name . "|" . join( "|", @val ); - $hash->{helper}{RUNNING_PID} = BlockingCall("FRITZBOX_Ring_Run", $handover, + $hash->{helper}{RING_RUNNING_PID} = BlockingCall("FRITZBOX_Ring_Run", $handover, "FRITZBOX_Ring_Done", $timeout, "FRITZBOX_Ring_Aborted", $hash) - unless exists $hash->{helper}{RUNNING_PID}; -} # end FRITZBOX_Ring + unless exists $hash->{helper}{RING_RUNNING_PID}; +} # end FRITZBOX_Ring_Start sub ########################################## FRITZBOX_Ring_Run($) @@ -707,7 +808,7 @@ FRITZBOX_Ring_Done($) my ($name, $success, $result) = split("\\|", $string); my $hash = $defs{$name}; - delete($hash->{helper}{RUNNING_PID}); + delete($hash->{helper}{RING_RUNNING_PID}); if ($success != 1) { @@ -723,7 +824,7 @@ sub ########################################## FRITZBOX_Ring_Aborted($) { my ($hash) = @_; - delete($hash->{helper}{RUNNING_PID}); + delete($hash->{helper}{RING_RUNNING_PID}); FRITZBOX_Log $hash, 1, "Timeout when ringing"; } diff --git a/fhem/MAINTAINER.txt b/fhem/MAINTAINER.txt index 9fd2f288e..b3408e10c 100644 --- a/fhem/MAINTAINER.txt +++ b/fhem/MAINTAINER.txt @@ -194,6 +194,7 @@ FHEM/70_PushNotifier.pm xusader http://forum.fhem.de Unterstue FHEM/71_YAMAHA_AVR.pm markusbloch http://forum.fhem.de Multimedia FHEM/71_YAMAHA_BD.pm markusbloch http://forum.fhem.de Multimedia FHEM/72_FB_CALLMONITOR.pm markusbloch http://forum.fhem.de Unterstuetzende Dienste +FHEM/72_FRITZBOX.pm tupol http://forum.fhem.de Unterstuetzende Dienste (PM: http://forum.fhem.de/index.php?action=pm;sa=send;u=5432) FHEM/73_PRESENCE.pm markusbloch http://forum.fhem.de Unterstuetzende Dienste FHEM/73_MPD.pm wzut http://forum.fhem.de Multimedia FHEM/75_MSG.pm ruebedo http://forum.fhem.de Automatisierung