[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.
FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwickler von: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

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. ???
FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwickler von: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

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
FHEM 5.5 auf RPi B Rev.2 (mit LCD4Linux, BMP180 und CUL v3 868.35 MHz), FB7490, Fritz!DECT 200, FS20, FHT80TF-2, S300TH, KS300, Homematic, PRESENCE
Modul-Entwickler von: FRITZBOX, statistics, PROPLANTA, OPENWEATHER, JSONMETER, LUXTRONIK2

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