[gelöst] FRITZBOX - Funktionserweiterung

Begonnen von pwlr, 23 Mai 2017, 14:46:36

Vorheriges Thema - Nächstes Thema

pwlr

Hi,

ich nutze das Modul Fritzbox sehr intensiv. Vielen Dank an alle, die daran gearbeitet haben !!

Ich habe einen Wunsch : Da meine IP-Telefonanaschlüsse öfter mal nicht funktionen, würde ich gern in den Readings eine Auswertemöglichkeit haben.
Auf der original Weboberfläche der Fritzbox in der Übersicht erscheint dann so etwas wie "6 Rufnummern aktiv, davon 5 nicht registriert".

Gibt es eine Möglicheit, diese Fehlermeldung mit dem Modul auszulesen und in den readings irgendwie darzustellen ? Ich würde gern im Fehlerfall einen Event auslösen um damit dann eine Info an mich zu generieren.

Schon mal vielen Dank vorab und moin
Bernd

nils_

hi,

vielleicht nicht ganz was du möchtest, aber evtl. kommst du damit näher ans ziel

https://wiki.fhem.de/wiki/FRITZBOX#TR-064
und dort dann die zeile mit 'x_voip'


grüße
nils
viele Wege in FHEM es gibt!

pwlr

Hi Nils,

danke für die Info!
Keine leichte Nuss für mich, hab mehrmals das fhem durch falsche Befehle zum Erliegen gebracht. :-\
Allerdings habe ich nur die Anzahl der definierten Nummern herausbekommen, ohne Infos zur Registrierung.

get <device> tr64Command X_VoIP:1 x_voip X_AVM-DE_GetNumberOfNumbers
Auch die Nummern habe ich alle in einer langen Liste lesen können, aber auch ohne Reg-Infos.

Schade
Bernd

nils_

ok schade...
ich dachte man könnte damit evtl. an die info's irgendwie rankommen.


dann musst du leider auf einen fritzbox experten warten, oder mal bei avm nachfragen ob es eine möglichkeit gibt da ran zu kommen.

X_AVM-DE_GetClient2
mal probiert?
aber ich glaube da liest man wirklich nur die einstellungen aus, und nicht den momentanen verbindungsstatus... :/
kenne mich da nicht so gut aus, aber genau dafür ist ja tr-064 auch nur gedacht, damit von "außen" deine box konfiguriert werden kann.


kommt man nicht irgendwie über den http-request an die seite ran?
die könntest du dann parsen und den string auswerten.... (nur mal so dahin gedacht...)

viele Wege in FHEM es gibt!

pwlr

ich habe mal probiert, mit den "Clients-Befehlen" kommt man nur an die definierten IP-Nebenstellen der Fritzbox ran.

get <device> tr64Command X_VoIP:1 x_voip X_AVM-DE_GetClient2 NewX_AVM-DE_ClientIndex 0

X_AVM-DE_GetClient2Response' => {
                                           'NewX_AVM-DE_ClientUsername' => '622',
                                           'NewX_AVM-DE_OutGoingNumber' => '04xxxxxxxx',
                                           'NewX_AVM-DE_PhoneName' => "BCS8-Br\x{fc}cke",
                                           'NewX_AVM-DE_ClientRegistrar' => 'xxx.xxx.xxx.xxx',
                                           'NewX_AVM-DE_InternalNumber' => '622',
                                           'NewX_AVM-DE_ClientRegistrarPort' => '5060',
                                           'NewX_AVM-DE_ClientId' => ''


Ja, irgendwie schade, Vielleicht bekommt ein Spezi das ja hin. Diese Telefonieausfälle nerven besonders, weil man es gar nicht so mitbekommt. Plötzlich ist man nicht mehr erreichbar. Ich finde, das ist ein wichtiger Punkt für eine Hausautomation bzw. Statusüberwachung.

Stimmt, HTTPMOD wäre eventuell noch eine Alternative - aber viel Aufwand, jedenfalls bei meinen bescheidenen Kentnissen.

Moin und danke für Deine guten Tipps !
Bernd

tupol

Probiere mal folgendes aus:
get <device> luaQuery sip:settings/sip/list(activated,displayname)

oder
get <device> luaQuery sip:status/sip/list(connect)
Eventuell kannst Du das dann über myUtils.pm auswerten.

pwlr

ja super  :) :)

Vielen Dank! Meine Tests funktionieren einwandfrei, das sind genau die Infos, die ich brauche.
Jetzt habe ich als "Perl-Lehrling" nur noch das Problem, die Daten irgendwie zu lesen und in Variablen zu kriegen. Die Ausgabe scheint mir eine zweidimensionale Matrix zu sein. (meine 5 tatsächlichen Sips und zwei interne von anderen FritzBoxen).
Da hab ich noch keine Erfahrung....
$VAR1 = [
          {
            'activated' => '1',
            'connect' => '2',
            'displayname' => '04xxxxxxxx',
            '_node' => 'sip0'
          },
          {
            'connect' => '0',
            'activated' => '0',
            '_node' => 'sip1',
            'displayname' => '624'
          },
          {
            '_node' => 'sip2',
            'displayname' => '04xxxxxxxx',
            'connect' => '2',
            'activated' => '1'
          },
          {
            'activated' => '1',
            'connect' => '2',
            'displayname' => '04xxxxxxxx',
            '_node' => 'sip3'
          },
          {
            'connect' => '2',
            'activated' => '1',
            '_node' => 'sip4',
            'displayname' => '04xxxxxxxx'
          },
          {
            '_node' => 'sip5',
            'displayname' => '04xxxxxxxx',
            'connect' => '2',
            'activated' => '1'
          },
          {
            '_node' => 'sip6',
            'displayname' => '626',
            'connect' => '0',
            'activated' => '0'
          }
        ];


Oder kann man auch eine Antfrage mit diesen luaQuery nur gezielt für eine sip machen ?

Nochmals vielen Dank und moin
Bernd

tupol

sip:settings/sip1/activated
oder
sip:settings/sip1/connect

Weiss aber nicht, was der Unterschied ist. ???

pwlr

Moin,

Zitatsip:settings/sip1/activated
oder
sip:settings/sip1/connect
krieg ich irgendwie nicht hin...

Durch Versuche habe ich rausbekommen, dass
# activated = 0 => sip ist definiert aber Haken "Internetrufnummer verwenden" ist nicht gesetzt
# activated = 1 => sip ist definiert und Haken "Internetrufnummer verwenden" ist gesetzt
#
# connect = 0 => sip nicht activated und (somit) nicht registriert
# connect = 1 => sip activated aber nicht registriert
# connect = 2 => sip activated und registriert


die Sache bleibt weiterhin erfolgsversprechend !

Was mache ich bloß in Perl falsch, ich bekomme die Daten nicht eingelesen. Auszug aus dem Test-Code:

my@VAR=(); # empty array
@VAR={fhem("get <device> luaQuery sip:status/sip/list(activated,connect,displayname,registrar)")};
Log3 $name, 3, "$name $sub_name: VAR = @VAR";
Log3 $name, 3, "$name $sub_name: VAR[1] = $VAR[1]";
Log3 $name, 3, "$name $sub_name: VAR[5] = $VAR[5]";

Ergebnis im Log:
$VAR1 = [
          {
            'registrar' => 'xxxxxxxxxxx',
            '_node' => 'sip0',
            'displayname' => '04xxxxxx',
            'connect' => '2',
            'activated' => '1'
          },
          {
            'activated' => '0',
            'connect' => '0',
... und so weiter, alle Sips

2018.03.23 01:50:14 3: <device> provider_check_01: VAR = HASH(0x58cb6f0)
2018.03.23 01:50:14 3: <device> provider_check_01: VAR[1] =
2018.03.23 01:50:14 3: <device> provider_check_01: VAR[5] =


Ich komme irgendwie nicht weiter  >:(
Moin
Bernd

fiedel

@VAR={fhem("get <device> luaQuery sip:status/sip/list(activated,connect,displayname,registrar)")};
Auf jeden Fall musst du <device> durch deinen FRITZBOX- Definitionsnamen ersetzen. <device> ist quasi eine "Erklärvariable" die dir sagt, dass hier dein entsprechendes Gerät hin gehört.
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

pwlr

Hi fiedel,

ja, den richtigen Devicenamen habe ich hier im Forum nur zur besseren Verständlichkeit auf <device> geändert. Mit meinen Bezeichnungen kann ja keiner was anfangen.
Trotzdem Danke für Deine Info !

Moin
Bernd

tupol

#11
Man bekommt von get einen String, kein Array. Schau Dir in der Wiki den Abschnitt zur Fritzbox und die Verwendung von userreadings an

https://wiki.fhem.de/wiki/FRITZBOX#userReadings_per_get_tr064Command_oder_get_luaQuery

pwlr

moin tupol,
DANKE !  :)

"...wer lesen kann, ist klar im Vorteil" - sorry, aber ich hatte das nicht gefunden / überlesen.

Also, um festzustellen, ob definierte Sip-Accounts aktuell beim Provider aufgrund eines Fehlers etc. nicht registriert sind, habe ich die folgende sub in 99_myUtils eingetragen:

sub sip_connect_check($) {

# Doc
# target : Check max 20 sip accounts for sip in error ( no registration )
# returns the amount of unregistrated sips
#
# displayname from sips in error will be shown in log (loglevel 2)
# start and stop information will be shown in log with loglevel 3
# debugging information will be shown in log with loglevel 5
#
# used modul : FRITZBOX - see reference in https://wiki.fhem.de/wiki/FRITZBOX
# used hardware : Fritz!Box 7490
#
# activated = 0 => sip ist definiert aber Haken "Internetrufnummer verwenden" ist nicht gesetzt
# activated = 1 => sip ist definiert und Haken "Internetrufnummer verwenden" ist gesetzt
#
# connect = 0 => sip nicht activated und (somit) nicht registriert
# connect = 1 => sip activated aber nicht registriert
# connect = 2 => sip activated und registriert
#
# some samples for luaQuery commands :
#  <device>  must be set to devicename of the FritzBox
#  <sip>     must be set to the sip-number as defined within the FritzBox  e.g. sip0
# get <device> luaQuery sip:settings/<sip>/connect
# get <device> luaQuery sip:settings/<sip>/displayname
# get <device> luaQuery sip:settings/<sip>/activated
# get <device> luaQuery sip:settings/<sip>/registrar
# get <device> luaQuery sip:status/sip/list(activated,connect,displayname,registrar)

my($name) = @_;
my$sub_name = "sip_connect_check";
my$sip_count = 0;
my$sip_in_error = 0;
my$sip_raw = "nix";
my$laenge = 0;
my$connect = 99;
my$display_name = "nix";

my$index = 0;
my$sip_max = 20;

Log3 $name, 3, "$name $sub_name: start";

for($index = 0;$index <= $sip_max;$index++) {
$sip_raw=fhem("get $name luaQuery sip:settings/sip$index/connect",1);
$laenge = length($sip_raw);
$connect=substr($sip_raw,$laenge-1,1);
$connect =~/([0-9])$/;

if ($1 eq "") {
$index=$sip_max;
next;
} else {
$sip_count++;
};

# debugging
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count connect = $connect";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count laenge = $laenge";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count Dollar1 = $1";

if ($connect == 1) { # error condition for unregistrated sips
$sip_in_error++;
$sip_raw=fhem("get $name luaQuery sip:settings/sip$index/displayname",1);
$laenge = length($sip_raw);
$display_name=substr($sip_raw,$laenge-20,20);
$display_name =~/([0-9]{0,20})$/;
Log3 $name, 2, "$name $sub_name: sip $1 connect error $connect - no registration";

# debugging
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count sip_in_error = $sip_in_error";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count displayname = $display_name";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count Dollar1 = $1";
};

};
Log3 $name, 3, "$name $sub_name: end";
return $sip_in_error;
};



Der Aufruf erfolgt per userReading im Device der FritzBox

attr <device> userReadings sip_error:(lastReadout.*) {sip_connect_check($name)}


und die events werden aktiviert mit

attr <device> event-on-update-reading  lastReadout


Die Logeinträge können nach Bedarf per verbose geesteuert werden. Eine Alarmierung im Fehlerfall kann dann per notify oder wie auch immer über den Trigger sip_error (vom userReading) erfolgen.

Alles super, nochmals vielen Dank !!
Moin
Bernd






jackyno.71986

Hallo pwlr,

was müsste ich ergänzen um die anzahl der registrierten Rufnummern anzuzeigen?

Schönen Gruß

Matthias

pwlr

Moin Matthias,

ich habe mal eine kleine Erweiterung in die sub eingetragen


sub sip_connect_check($) {

# Doc
# target : Check max 20 sip accounts for sip in error ( no registration )
# returns the amount of unregistrated sips
#
# displayname from sips in error will be shown in log (loglevel 2)
# start and stop information will be shown in log with loglevel 3
# debugging information will be shown in log with loglevel 5
#
# used modul : FRITZBOX - see reference in https://wiki.fhem.de/wiki/FRITZBOX
# used hardware : Fritz!Box 7490
#
# activated = 0 => sip ist definiert aber Haken "Internetrufnummer verwenden" ist nicht gesetzt
# activated = 1 => sip ist definiert und Haken "Internetrufnummer verwenden" ist gesetzt
#
# connect = 0 => sip nicht activated und (somit) nicht registriert
# connect = 1 => sip activated aber nicht registriert
# connect = 2 => sip activated und registriert
#
# some samples for luaQuery commands :
#  <device>  must be set to devicename of the FritzBox
#  <sip>     must be set to the sip-number as defined within the FritzBox  e.g. sip0
# get <device> luaQuery sip:settings/<sip>/connect
# get <device> luaQuery sip:settings/<sip>/displayname
# get <device> luaQuery sip:settings/<sip>/activated
# get <device> luaQuery sip:settings/<sip>/registrar
# get <device> luaQuery sip:status/sip/list(activated,connect,displayname,registrar)

my($name) = @_;
my$sub_name = "sip_connect_check";
my$sip_count = 0;
my$sip_register = 0;
my$sip_in_error = 0;
my$sip_raw = "nix";
my$laenge = 0;
my$connect = 99;
my$display_name = "nix";

my$index = 0;
my$sip_max = 20;

Log3 $name, 3, "$name $sub_name: start";

for($index = 0;$index <= $sip_max;$index++) {
$sip_raw=fhem("get $name luaQuery sip:settings/sip$index/connect",1);
$laenge = length($sip_raw);
$connect=substr($sip_raw,$laenge-1,1);
$connect =~/([0-9])$/;

if ($1 eq "") {
# PERL WARNING: Use of uninitialized value $1 in string eq at ./FHEM/99_Test_Utils.pm line 2327.
$index=$sip_max;
next;
} else {
$sip_count++;
};

# debugging
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count connect = $connect";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count laenge = $laenge";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count Dollar1 = $1";

$sip_raw=fhem("get $name luaQuery sip:settings/sip$index/displayname",1);
$laenge = length($sip_raw);
$display_name=substr($sip_raw,$laenge-20,20);
$display_name =~/([0-9]{0,20})$/;

if ($connect == 2) { # sip activated und registriert
Log3 $name, 4, "$name $sub_name: sip $1 registration ok";
$sip_register++;
};
if ($connect == 0) { # sip not activated
Log3 $name, 4, "$name $sub_name: sip $1 not aktivated";
};
if ($connect == 1) { # error condition for aktivated and unregistrated sips
$sip_in_error++;
Log3 $name, 2, "$name $sub_name: sip $1 connect error $connect - no registration";

# debugging
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count sip_in_error = $sip_in_error";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count displayname = $display_name";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count Dollar1 = $1";
};

};
# debugging
Log3 $name, 3, "$name $sub_name: $sip_count defined sips detected";
Log3 $name, 3, "$name $sub_name: $sip_register sips registered";
Log3 $name, 3, "$name $sub_name: $sip_in_error sips in error";

Log3 $name, 3, "$name $sub_name: end";
return $sip_in_error;
};


Verbose an Deinem Fritz-Box Device auf 3 setzen, dann siehst Du im Log die 3 möglichen Werte in den 3 Variablen:
$sip_count         -> defined sips detected
$sip_register     -> sips registered
$sip_in_error     -> sips in error

Du kannst jetzt die für Dich passende Variable mit return $sip_register übergeben (als Beispiel, letztes Statement im Code bitte selbst ändern).
Das userReading ändern in
sip_register:(lastReadout.*) {sip_connect_check($name)}

Ideal wäre es natürlich alle 3 Variablen in 3 readings an fhem zu übergeben, kann ich aber leider nicht....
Als Workaround eventuell diese Sub mehrfach (modifiziert und mit unterscheidlichen Namen) speichern, jeweils mit unterschiedlichen Variablen im return und per userReading mehrfach aufrufen.

Hoffe, dass es Dir hilft.
Moin
Bernd


jackyno.71986

Hallo Bernd,

Danke für deine Hilfe, hab es eingepflegt bekomme aber leider 0 angezeigt im Log is auch ein fehler:

2019.10.09 20:18:20 1: PERL WARNING: Use of uninitialized value $1 in string eq at ./FHEM/99_myUtils.pm line 115.
2019.10.09 20:18:20 3: eval: {sip_connect_check($name)}
2019.10.09 20:18:20 1: stacktrace:
2019.10.09 20:18:20 1:     main::__ANON__                      called by ./FHEM/99_myUtils.pm (115)
2019.10.09 20:18:20 1:     main::sip_connect_check             called by (eval 239) (1)
2019.10.09 20:18:20 1:     (eval)                              called by fhem.pl (4678)
2019.10.09 20:18:20 1:     main::readingsEndUpdate             called by ./FHEM/72_FRITZBOX.pm (1920)
2019.10.09 20:18:20 1:     main::FRITZBOX_Readout_Process      called by ./FHEM/72_FRITZBOX.pm (1776)
2019.10.09 20:18:20 1:     main::FRITZBOX_Readout_Done         called by (eval 238) (1)
2019.10.09 20:18:20 1:     (eval)                              called by fhem.pl (1135)
2019.10.09 20:18:20 1:     main::AnalyzePerlCommand            called by fhem.pl (1160)
2019.10.09 20:18:20 1:     main::AnalyzeCommand                called by fhem.pl (1089)
2019.10.09 20:18:20 1:     main::AnalyzeCommandChain           called by ./FHEM/98_telnet.pm (255)
2019.10.09 20:18:20 1:     main::telnet_Read                   called by fhem.pl (3754)
2019.10.09 20:18:20 1:     main::CallFn                        called by fhem.pl (748)
2019.10.09 20:18:20 3: FritzBox sip_connect_check: 0 defined sips detected
2019.10.09 20:18:20 3: FritzBox sip_connect_check: 0 sips registered
2019.10.09 20:18:20 3: FritzBox sip_connect_check: 0 sips in error
2019.10.09 20:18:20 3: FritzBox sip_connect_check: end


Hier meine 99_myUtils.pm
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.

####### Netzwerk Gerät über Fritzbox abfragen ############
sub
NetDevDa($)
{
    my $n = 0;
    my ($Reading) = @_;
    $Reading =~ tr/:/_/;
    my @fbs = devspec2array("TYPE=FRITZBOX");
       foreach( @fbs ) {
          my $Name = ReadingsVal($_,"mac_" . $Reading,"");
          if( ($Name ne "") && ($Name ne "inactive") ) {
              $n++;
          }
       }
    if( $n == 0) {
        return 0;
    } else {
        return 1;
    }
}
1;
# [http://www.somacon.com/p114.php http://www.somacon.com/p114.php]
# Perl trim function to remove whitespace from the start and end of the string
sub trim($)
{
  my $string = shift;
  $string =~ s/^\s+//;
  $string =~ s/\s+$//;
  return $string;
}
# Left trim function to remove leading whitespace
sub ltrim($)
{
  my $string = shift;
  $string =~ s/^\s+//;
  return $string;
}
# Right trim function to remove trailing whitespace
sub rtrim($)
{
  my $string = shift;
  $string =~ s/\s+$//;
  return $string;
}
sub sip_connect_check($) {

# Doc
# target : Check max 20 sip accounts for sip in error ( no registration )
# returns the amount of unregistrated sips
#
# displayname from sips in error will be shown in log (loglevel 2)
# start and stop information will be shown in log with loglevel 3
# debugging information will be shown in log with loglevel 5
#
# used modul : FRITZBOX - see reference in https://wiki.fhem.de/wiki/FRITZBOX
# used hardware : Fritz!Box 7490
#
# activated = 0 => sip ist definiert aber Haken "Internetrufnummer verwenden" ist nicht gesetzt
# activated = 1 => sip ist definiert und Haken "Internetrufnummer verwenden" ist gesetzt
#
# connect = 0 => sip nicht activated und (somit) nicht registriert
# connect = 1 => sip activated aber nicht registriert
# connect = 2 => sip activated und registriert
#
# some samples for luaQuery commands :
#  <device>  must be set to devicename of the FritzBox
#  <sip>     must be set to the sip-number as defined within the FritzBox  e.g. sip0
# get <device> luaQuery sip:settings/<sip>/connect
# get <device> luaQuery sip:settings/<sip>/displayname
# get <device> luaQuery sip:settings/<sip>/activated
# get <device> luaQuery sip:settings/<sip>/registrar
# get <device> luaQuery sip:status/sip/list(activated,connect,displayname,registrar)

my($name) = @_;
my$sub_name = "sip_connect_check";
my$sip_count = 0;
my$sip_register = 0;
my$sip_in_error = 0;
my$sip_raw = "nix";
my$laenge = 0;
my$connect = 99;
my$display_name = "nix";

my$index = 0;
my$sip_max = 20;

Log3 $name, 3, "$name $sub_name: start";

for($index = 0;$index <= $sip_max;$index++) {
$sip_raw=fhem("get $name luaQuery sip:settings/sip$index/connect",1);
$laenge = length($sip_raw);
$connect=substr($sip_raw,$laenge-1,1);
$connect =~/([0-9])$/;

if ($1 eq "") {
$index=$sip_max;
next;
} else {
$sip_count++;
};

# debugging
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count connect = $connect";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count laenge = $laenge";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count Dollar1 = $1";

$sip_raw=fhem("get $name luaQuery sip:settings/sip$index/displayname",1);
$laenge = length($sip_raw);
$display_name=substr($sip_raw,$laenge-20,20);
$display_name =~/([0-9]{0,20})$/;

if ($connect == 2) { # sip activated und registriert
Log3 $name, 4, "$name $sub_name: sip $1 registration ok";
$sip_register++;
};
if ($connect == 0) { # sip not activated
Log3 $name, 4, "$name $sub_name: sip $1 not aktivated";
};
if ($connect == 1) { # error condition for aktivated and unregistrated sips
$sip_in_error++;
Log3 $name, 2, "$name $sub_name: sip $1 connect error $connect - no registration";

# debugging
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count sip_in_error = $sip_in_error";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count displayname = $display_name";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count Dollar1 = $1";
};

};
# debugging
Log3 $name, 3, "$name $sub_name: $sip_count defined sips detected";
Log3 $name, 3, "$name $sub_name: $sip_register sips registered";
Log3 $name, 3, "$name $sub_name: $sip_in_error sips in error";

Log3 $name, 3, "$name $sub_name: end";
return $sip_count;
};


Wenn ich die Fehlermeldung richtig teut, vermute ich dass $1 nicht definiert ist

Schönen Gruß

Matthias

JoWiemann

Hast Du das Attribut allowTR064Command gesetzt?

Grüße Jörg


Gesendet von iPad 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

pwlr

moin,

allowTR064Command wird wirklich benötigt !

meine Attr:
Attributes:
   DbLogInclude box_connect
   INTERVAL   120
   allowShellCommand 1
   allowTR064Command 1


Diese $1 Variable ist in der Tat nicht explizit in der sub definiert. Ich glaube, es ist eine temporäre Variable.... Ich nix Ahnung, wo die herkommt. Vieleicht kann uns ein Perl-Spezi mal aufklären - würde mich freuen.

Mein Log:
2019.10.10 00:48:33 3: FRITZBOX: set my_FB update
2019.10.10 00:48:35 3: my_FB sip_connect_check: start
2019.10.10 00:48:35 3: FRITZBOX: get my_FB luaQuery sip:settings/sip0/connect
2019.10.10 00:48:35 3: FRITZBOX: get my_FB luaQuery sip:settings/sip0/displayname
2019.10.10 00:48:35 3: FRITZBOX: get my_FB luaQuery sip:settings/sip1/connect
2019.10.10 00:48:36 3: FRITZBOX: get my_FB luaQuery sip:settings/sip1/displayname
2019.10.10 00:48:36 3: FRITZBOX: get my_FB luaQuery sip:settings/sip2/connect
2019.10.10 00:48:36 3: FRITZBOX: get my_FB luaQuery sip:settings/sip2/displayname
2019.10.10 00:48:37 3: FRITZBOX: get my_FB luaQuery sip:settings/sip3/connect
2019.10.10 00:48:37 3: FRITZBOX: get my_FB luaQuery sip:settings/sip3/displayname
2019.10.10 00:48:37 3: FRITZBOX: get my_FB luaQuery sip:settings/sip4/connect
2019.10.10 00:48:38 3: FRITZBOX: get my_FB luaQuery sip:settings/sip4/displayname
2019.10.10 00:48:38 3: FRITZBOX: get my_FB luaQuery sip:settings/sip5/connect
2019.10.10 00:48:38 3: FRITZBOX: get my_FB luaQuery sip:settings/sip5/displayname
2019.10.10 00:48:39 3: FRITZBOX: get my_FB luaQuery sip:settings/sip6/connect
2019.10.10 00:48:39 3: my_FB sip_connect_check: 6 defined sips detected
2019.10.10 00:48:39 3: my_FB sip_connect_check: 5 sips registered
2019.10.10 00:48:39 3: my_FB sip_connect_check: 0 sips in error
2019.10.10 00:48:39 3: my_FB sip_connect_check: end


wenn Du my_FB in Deinen FB-Namen änderst, kannst Du die get-Befehle auch in der Commandzeile eingeben.

Moin und viel Erfolg
Bernd




JoWiemann

Die Perl Variablen $1, $2, ... werden z.B. durch RegEx Funktionen mit Inhalt gefüllt, wenn diese etwas finden. Hier ist die RegEx nicht erfolgreich, weil ohne das Attribut keine Rückgabe, die durchsucht werden kann, erfolgt. Das kann man Programmtechnisch abfangen.

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

JoWiemann

#19
Hallo,

ich habe den Code um eine Fehlerbehandlung für fehlendes allowTR064Command erweitert.


sub sip_connect_check($) {

# Doc
# target : Check max 20 sip accounts for sip in error ( no registration )
# returns the amount of unregistrated sips or (-1) if allowTR064Command not defined or (-2) if error on calling TR064
#
# displayname from sips in error will be shown in log (loglevel 2)
# start and stop information will be shown in log with loglevel 3
# debugging information will be shown in log with loglevel 5
#
# used modul : FRITZBOX - see reference in https://wiki.fhem.de/wiki/FRITZBOX
# used hardware : Fritz!Box 7490
#
# activated = 0 => sip ist definiert aber Haken "Internetrufnummer verwenden" ist nicht gesetzt
# activated = 1 => sip ist definiert und Haken "Internetrufnummer verwenden" ist gesetzt
#
# connect = 0 => sip nicht activated und (somit) nicht registriert
# connect = 1 => sip activated aber nicht registriert
# connect = 2 => sip activated und registriert
#
# some samples for luaQuery commands :
#  <device>  must be set to devicename of the FritzBox
#  <sip>     must be set to the sip-number as defined within the FritzBox  e.g. sip0
# get <device> luaQuery sip:settings/<sip>/connect
# get <device> luaQuery sip:settings/<sip>/displayname
# get <device> luaQuery sip:settings/<sip>/activated
# get <device> luaQuery sip:settings/<sip>/registrar
# get <device> luaQuery sip:status/sip/list(activated,connect,displayname,registrar)

my($name) = @_;
my $sub_name = "sip_connect_check";
my $sip_count = 0;
my $sip_in_error = 0;
my $sip_raw = "nix";
my $laenge = 0;
my $connect = 99;
my $display_name = "nix";

my $index = 0;
my $sip_max = 20;

Log3 $name, 3, "$name $sub_name: start";
my $TestAttr = AttrVal($name, "allowTR064Command", -1);

if($TestAttr <= 0) {
Log3 $name, 2, "$name $sub_name: attr allowTR064Command not defined or define with 0";
return (-1);
}


for($index = 0; $index <= $sip_max; $index++) {
$sip_raw =  fhem("get $name luaQuery sip:settings/sip$index/connect", 1);

        # Log3 $name, 3, "$name $sub_name: $sip_raw";

$laenge  =  length($sip_raw);
$connect =  substr($sip_raw,$laenge-1,1);
if($connect =~ /([0-9])$/) {
if ($1 eq "") {
$index=$sip_max;
next;
} else {
$sip_count++;
};
} else {
Log3 $name, 2, "$name $sub_name: error while calling TR064";
return (-2);
};


# debugging
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count connect = $connect";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count laenge = $laenge";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count Dollar1 = $1";

if ($connect == 1) { # error condition for unregistrated sips
$sip_in_error++;
$sip_raw=fhem("get $name luaQuery sip:settings/sip$index/displayname",1);
$laenge = length($sip_raw);
$display_name=substr($sip_raw,$laenge-20,20);
$display_name =~/([0-9]{0,20})$/;
Log3 $name, 2, "$name $sub_name: sip $1 connect error $connect - no registration";

# debugging
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count sip_in_error = $sip_in_error";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count displayname = $display_name";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count Dollar1 = $1";
};

};
Log3 $name, 3, "$name $sub_name: end";
return $sip_in_error;
};


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

pwlr

Moin Jörg,

erstmal vielen Dank für Deine Erklärung zum $1 ! Ist also das Ergebnis aus
$connect =~/([0-9])$/; Jetzt versteh ich auch meine eigene sub wieder  :)

Danke auch für Deine Ergänzung, das ist sicherlich sehr hilfreich.
Allerdings habe ich Probleme mit dem 2. Check, weil immer die Fehlermeldung "$name $sub_name: error while calling TR064" am Ende der Liste kommt und die sub mit -2 ended.
Grund ist m.E. die Endebedingung der Liste mit if ($1 eq ""), diese Bedingung kann aber niemals durch die regEx
if($connect =~ /([0-9])$/) { usw...
erfüllt werden.

Zum Erkennen eines Laufzeitfehlers müsste man den tatsächlichen Fehlercode beim Aufruf kennen, der dann wohl in $sip_raw stehen müsste. Hast Du da Infos oder nen Link auf eine Doku ? Ich würde Deine Idee gern weiter verfolgen.

Hier der geänderte Code Deiner Erweiterung. Den Loglevel der letzten Infos habe ich wieder auf 5 gesetzt.

sub sip_connect_check($) {

# Doc
# Version 02 with good extensions by JoWiemann - thx
# target : Check max 20 sip accounts for sip in error ( no registration )
# returns :
# -> the amount of unregistrated sips
# -> (-1) if attr allowTR064Command not defined
# -> (-2) if error on calling TR064 occurs
#
# displayname from sips in error will be shown in log with verbose >= 2
# error conditions while calling TR64Command will be shown in log with verbose >= 2
# start and stop information will be shown in log with verbose >= 3
# debugging information will be shown in log with verbose >= 5
#
# used modul : FRITZBOX - see reference in https://wiki.fhem.de/wiki/FRITZBOX
# used hardware : Fritz!Box 7490
# used attr : allowTR064Command 1
#
# activated = 0 => sip ist definiert aber Haken "Internetrufnummer verwenden" ist nicht gesetzt
# activated = 1 => sip ist definiert und Haken "Internetrufnummer verwenden" ist gesetzt
#
# connect = 0 => sip nicht activated und (somit) nicht registriert
# connect = 1 => sip activated aber nicht registriert
# connect = 2 => sip activated und registriert
#
# some samples for luaQuery commands :
#  <device>  must be set to devicename of the FritzBox
#  <sip>     must be set to the sip-number as defined within the FritzBox  e.g. sip0
# get <device> luaQuery sip:settings/<sip>/connect
# get <device> luaQuery sip:settings/<sip>/displayname
# get <device> luaQuery sip:settings/<sip>/activated
# get <device> luaQuery sip:settings/<sip>/registrar
# get <device> luaQuery sip:status/sip/list(activated,connect,displayname,registrar)

my($name) = @_;
my$sub_name = "sip_connect_check";
my$sip_count = 0;
my$sip_register = 0;
my$sip_in_error = 0;
my$sip_raw = "nix";
my$laenge = 0;
my$connect = 99;
my$display_name = "nix";

my$index = 0;
my$sip_max = 20;
my$TestAttr = AttrVal($name, "allowTR064Command", -1);

Log3 $name, 3, "$name $sub_name: start";

if($TestAttr <= 0) {
Log3 $name, 2, "$name $sub_name: attr allowTR064Command not defined or defined with 0";
Log3 $name, 3, "$name $sub_name: abend";
return (-1); #error attr allowTR064Command not defined or set to 0
};

for($index = 0;$index < $sip_max;$index++) {
$sip_raw=fhem("get $name luaQuery sip:settings/sip$index/connect",1);

# hier returncode für Laufzeitfehler abfragen if($sip_raw == ?? oder so etwas in der Art... {
#Log3 $name, 2, "$name $sub_name: error while calling TR064";
#Log3 $name, 2, "$name $sub_name: abend";
#return (-2);
#};

$laenge = length($sip_raw);
$connect=substr($sip_raw,$laenge-1,1);

if($connect =~ /([0-9])$/) {
Log3 $name, 5, "$name $sub_name: sip$index found";
$sip_count++;
} else {
Log3 $name,5, "$name $sub_name: last entry = sip$index not found";
last;
};

# debugging
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count connect = $connect";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count laenge = $laenge";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count Dollar1 = $1";

$sip_raw=fhem("get $name luaQuery sip:settings/sip$index/displayname",1);
$laenge = length($sip_raw);
$display_name=substr($sip_raw,$laenge-20,20);
$display_name =~/([0-9]{0,20})$/;

if ($connect == 2) { # sip activated und registriert
Log3 $name, 4, "$name $sub_name: sip $1 registration ok";
$sip_register++;
};
if ($connect == 0) { # sip not activated
Log3 $name, 4, "$name $sub_name: sip $1 not aktivated";
};
if ($connect == 1) { # error condition for aktivated and unregistrated sips
$sip_in_error++;
Log3 $name, 2, "$name $sub_name: sip $1 connect error $connect - no registration";

# debugging
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count sip_in_error = $sip_in_error";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count displayname = $display_name";
Log3 $name, 5, "$name $sub_name: sip_count = $sip_count Dollar1 = $1";
};

};

# debugging
Log3 $name, 5, "$name $sub_name: $sip_count defined sips detected";
Log3 $name, 5, "$name $sub_name: $sip_register sips registered";
Log3 $name, 5, "$name $sub_name: $sip_in_error sips in error";

Log3 $name, 3, "$name $sub_name: end";
return $sip_in_error;
};


Moin
Bernd


JoWiemann

Hallo Bernd,

das

if ($1 eq "") {
$index=$sip_max;
next;
} else {
$sip_count++;
};


ist nicht von mir. Stand so schon im ersten Post der Sub.

Ich habe zur Absicherung das

if($connect =~ /([0-9])$/) {

dann darüber gelegt.

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

jackyno.71986

#22
So, heute hatte ich nun endlich mal wieder zeit zum testen,
lag tasächlich am fehlenden allowTR64Command.

Jetzt funktioniert es wie gewünscht.

Allerdings schaffe ich es nicht die Fehlermeldung bezüglich des $1 zu unterbinden. Habe die zwei letzten Codes versucht einmal bekomme ich dann -2 und das andere mal 21 angezeigt antstatt 9

Danke für eure Hilfe.