Neues Modul Telefonmonitor (TM)

Begonnen von Elektrolurch, 20 September 2014, 14:17:38

Vorheriges Thema - Nächstes Thema

A.Harrenberg

Hallo Jörg,

schneller als die Polizei erlaubt...

Wollte auf Deine Nachricht antworten, plötzlich sah die anders aus... Hab' also das Modul noch mal neu runtergeladen und installiert.

Das mit dem Verbose funktioniert jetzt, und jetzt gibt es auch nur noch einen Aufruf von method-ring! Allerdings wird method-disconnect vor einem Anruf ausgeführt, allerdings nicht vor dem ersten...


2015.03.26 21:29:57.216 1: Telefon Action: method-call
2015.03.26 21:30:01.320 1: Telefon Action: method-ring
2015.03.26 21:30:31.871 1: Telefon Action: method-disconnect

2015.03.26 21:30:53.141 1: Telefon Action: method-disconnect
2015.03.26 21:31:04.107 1: Telefon Action: method-call
2015.03.26 21:31:07.801 1: Telefon Action: method-ring
2015.03.26 21:31:38.491 1: Telefon Action: method-disconnect

2015.03.26 21:31:56.863 1: Telefon Action: method-disconnect
2015.03.26 21:32:07.558 1: Telefon Action: method-call
2015.03.26 21:32:15.080 1: Telefon Action: method-ring
2015.03.26 21:32:45.626 1: Telefon Action: method-disconnect
2015.03.26 21:33:00.330 1: Telefon Action: method-disconnect


Oder relativ zeitverzögert ein zeitverzögert beim Disconnect. Hmm, sieht eigentlich eher aus als wenn es zwei mal disconnect wäre.

Vielleicht könntest Du da auch noch mal schauen?

Dann kann ich am WE mal sehen ob ich mit den Funktionsaufrufen meine "Anrufkette" hinbekomme.
Ich würde nämlich gerne einen Alarmanruf realisieren, so wie ihn meine Alarmanlage macht. Dort sind mehrere Rufnummer hinterlegt, bei Alarm wird die erste angerufen, wenn dort für x-sekunden niemand dran geht wird die nächste probiert. Wird aber abgehoben, so wird kein weiteter Anruf getätigt. Da werde ich am WE mal sehen ob ich es mit den Funktionsaufrufen hinbekomme mir meine "Anrufkette" zu bauen. Dazu muss ich dann noch irgendwie an den Status des Anrufs kommen, bzw. schauen ob zwischen "ring" und "disconnect" mal ein "connect" war...

Vielen Dank,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

JoWiemann

Zitat von: A.Harrenberg am 26 März 2015, 21:42:45

Allerdings wird method-disconnect vor einem Anruf ausgeführt, allerdings nicht vor dem ersten...

Oder relativ zeitverzögert ein zeitverzögert beim Disconnect. Hmm, sieht eigentlich eher aus als wenn es zwei mal disconnect wäre.

Dazu muss ich dann noch irgendwie an den Status des Anrufs kommen, bzw. schauen ob zwischen "ring" und "disconnect" mal ein "connect" war...

Für method-disconnect muss ich mir dann mal etwa mehr Zeit nehmen.

Für Deine Anrufkette kannst Du Dir ja einen Dummy bauen, dem Du mit     fhem("setreading <DummyName> <reading> $wert");
die letzte method übergibst. Mit ReadingsVal("<DummyName>", "<reading>", "<Default Rückgabe>"); liest Du den gespeicherten Werte dann aus und kannst dann prüfen welche method zuletzt aufgerufen worden ist.

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

A.Harrenberg

Hallo Jörg,

Kommando zurück für das disconnect!
Ich rufe mich ja testweise selber an, daher gibt es einmal das "call" und das "ring" und dann natürlich auch zwei mal das "disconnect"!
Sorry, mein Fehler. (Daher ist auch das zweite disconnect verzögert...)

Das mit dem Dummy bzw. der Anruflogik überlege ich mir mal am WE, das sollte hinzubekommen sein. Ich muss da allerdings natürlich auf die richtigen Rufnummer filtern und mir die Logik noch mal genau überlegen.

Vielen Dank,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

JoWiemann

Hallo Andreas,

Ok, dann leg ich mich jetzt wieder schlafen und Dir gutes gelingen.

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

A.Harrenberg

#154
Hallo Jörg,

noch ein kleines Problemchen...

Wenn ich $INTERNAL_CONNECTION nutze, gibt es bei den eingehenden Verbindungen eine Fehlermeldung im Log das die Variable "uninitialized" ist. Den Wert kann es natürlich auch nicht geben, aber wenn man das z.B. mit attribut method-disconnect nutzen möchte, gibt es bei jedem externen Anruf eine Fehlermeldung...

Könnte man hier evtl. einen leeren String zurückgeben um die Fehlermeldung zu vermeiden? Meine perl- und FHEM-Kenntnisse reichen leider bei weitem nicht aus, ich finde ja nicht mal die Stelle an der diesen externen Variablen Ihr Wert zugewiesen wird.

Edit:
Die Fehlermeldung tritt nur einmal auf, ich hatte wegen anderer Sachen FHEM neu gestartet und war deshalb der Meinung das dies bei jedem Funktionsaufruf passiert... D.h. das Problemchen wird noch mal kleiner. Mittlerweile bin ich aber auch zu der Erkenntnis gekommen das die Variablen gar nicht im CM_EXTENDER gebildet werden, sondern im FB_CALLMONITOR und nur vom CM_EXTENDER exportiert werden. Änderungen müssten demnach im FB_CALLMONITOR gemacht werden.

2015.03.27 20:21:28.216 1: Telefon Action: method-call, Aldi-Stick, 0157********, 1, 0
2015.03.27 20:21:31.470 1: PERL WARNING: Use of uninitialized value $internal_connection in concatenation (.) or string at ./FHEM/72_FB_CM_Extender.pm line 461.
2015.03.27 20:21:31.471 1: Telefon Action: method-ring, Andreas FN, 0241********, 0049157********,
2015.03.27 20:22:01.992 1: Telefon Action: method-disconnect, Andreas FN, 0241********, 0049157********,
2015.03.27 20:22:24.133 1: Telefon Action: method-disconnect, Aldi-Stick, 0157*******, 1, 0


Edit2:
Sobald eine Verbindung zustande gekommen ist, ist auch beim eingehenden Anruf das $INTERNAL_CONNECTION richtig gesetzt, bei mir hier "DECT_1".

2015.03.28 07:18:25.389 1: Telefon Action: method-call, Aldi-Stick, 0157********, 1, 0
2015.03.28 07:18:31.226 1: Telefon Action: method-ring, Andreas FN, 0241*********, 0049157********,
2015.03.28 07:18:34.352 1: Telefon Action: method-connect, Andreas FN, 0241********, 0049157********, DECT_1
2015.03.28 07:18:35.014 1: Telefon Action: method-connect, Aldi-Stick, 0157********, 1, 0
2015.03.28 07:18:37.530 1: Telefon Action: method-disconnect, Andreas FN, 0241********, 0049157********, DECT_1
2015.03.28 07:18:38.823 1: Telefon Action: method-disconnect, Aldi-Stick, 0157********, 1, 0


Edit3:
Wenn man im FB_CALLMONITOR die Variable entsprechend (vor-)definiert, z.B. mit "not_connected", wird sie auch schon bei method-ring angezeigt und es gibt keine Fehlermeldung mehr:

2015.03.28 07:36:22.055 1: Telefon Action: method-call, Aldi-Stick, 0157********, 1, 0
2015.03.28 07:36:28.967 1: Telefon Action: method-ring, Andreas FN, 0241********, 0049157********, not_conncected
2015.03.28 07:36:34.490 1: Telefon Action: method-disconnect, Andreas FN, 0241********, 0049157********, not_conncected
2015.03.28 07:36:35.792 1: Telefon Action: method-disconnect, Aldi-Stick, 0157********, 1, 0


72_FB_CALLMONIOTR.pm ab Zeile 332
        if($array[1] eq "RING")
        {
            $hash->{helper}{TEMP}{$array[2]}{external_number} = (defined($external_number) ? $external_number : "unknown");
            $hash->{helper}{TEMP}{$array[2]}{external_name} = (defined($reverse_search) ? $reverse_search : "unknown");
            $hash->{helper}{TEMP}{$array[2]}{internal_number} = $array[4];
            $hash->{helper}{TEMP}{$array[2]}{external_connection} = $array[5];
            # ah: "initialize" variable with value, will be overwritten with "good" value if connection is established
            $hash->{helper}{TEMP}{$array[2]}{internal_connection} =  "not_conncected";
            $hash->{helper}{TEMP}{$array[2]}{direction} = "incoming";
        }


method-call {my_telefon_action("method-call", $EXTERNAL_NAME,$EXTERNAL_NUMBER,$INTERNAL_NUMBER,$INTERNAL_CONNECTION);;}
method-connect {my_telefon_action("method-connect", $EXTERNAL_NAME,$EXTERNAL_NUMBER,$INTERNAL_NUMBER,$INTERNAL_CONNECTION);;}
method-disconnect {my_telefon_action("method-disconnect",$EXTERNAL_NAME,$EXTERNAL_NUMBER,$INTERNAL_NUMBER,$INTERNAL_CONNECTION);;}
method-ring {my_telefon_action("method-ring",$EXTERNAL_NAME,$EXTERNAL_NUMBER,$INTERNAL_NUMBER,$INTERNAL_CONNECTION);;}


sub my_telefon_action ($$$$$){
# {my_telefon_action("method-call", $EXTERNAL_NAME,$EXTERNAL_NUMBER,$INTERNAL_NUMBER,$INTERNAL_CONNECTION);;}

my ($event, $ext_name, $ext_number, $int_number, $int_con) = @_;
Log 1, "Telefon Action: $event, $ext_name, $ext_number, $int_number, $int_con";

}


Edit4:
Problemchen ist also "gelöst", ich werde mal den Maintainer von FB_CALLMONITOR anschreiben ob das eingebaut werden kann/sollte...

Gruß,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

ulli

Wann wandert denn das spitzen Module in die svn?

moonsorrox

was sollen mir diese Fehlermeldungen sagen, sind mir durch Zufall heute aufgefallen..?

Zitat2015.03.28 00:15:01 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/99_myUtilsTM.pm line 473.
2015.03.28 00:15:01 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/99_myUtilsTM.pm line 458.
2015.03.28 00:15:01 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/99_myUtilsTM.pm line 426.
2015.03.28 00:15:01 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/99_myUtilsTM.pm line 401.
2015.03.28 00:15:01 1: PERL WARNING: Use of uninitialized value $arg in concatenation (.) or string at ./FHEM/99_myUtilsTM.pm line 392.
2015.03.28 00:15:01 1: PERL WARNING: Use of uninitialized value $string in substitution (s///) at ./FHEM/99_Utils.pm line 144.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

JoWiemann

Zitat von: moonsorrox am 28 März 2015, 12:38:00
was sollen mir diese Fehlermeldungen sagen, sind mir durch Zufall heute aufgefallen..?

Hallo,

nimm doch einfach die letzte gepostete 72_FB_CM_Extender.pm. Da habe ich die Hinweise gefixed.

Grüße Jörg

PS: Ich hab das Modul 99_myUtilsTM.pm so umbenannt, das mit Elektrolurch abgestimmt und ein paar Fehler bereinigt. Im aktuellen Modul sind auch die Hilfetexte gepflegt, sollten allerdings auch noch mal Korrektur gelesen werden.
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

A.Harrenberg

Hallo Jörg,

Zitat von: JoWiemann am 28 März 2015, 14:34:46
ich glaube, dass Deine Lösung besser ist, da im 72_FB_CALLMONITOR die nicht initialisierte vielleicht gar kein Problem darstellt. Von daher, poste doch einfach Deine korrigierte Version.

ich habe die Änderung aber im 72_FB_CALLMONITOR gemacht...
Ich habe dort in der Routine für "ring" einfach die Variable auf "not_connected" gesetzt.

Ich habe das mal an den Maintainer von 72_FB_CALLMONITOR, Markus Bloch, geschickt und gefragt ob das evtl. Seiteneffekte hätte und ob er das so oder ähnlich übernehmen würde.

Der eigentliche Fehler tritt in der sub FB_CM_EXTENDER_Proc auf, die Routine wird ja für jede "method" aufgerufen.

sub FB_CM_EXTENDER_Proc($$)
{
my ($hash,$proc) = @_;
my $name = $hash->{NAME};

my $external_name = $hash->{mem}{'external_name'};
my $external_number = $hash->{mem}{'external_number'};
my $internal_number = $hash->{mem}{'internal_number'};
my $internal_connection = $hash->{mem}{'internal_connection'};
       
my $EXTERNAL_NAME = $external_name;
my $EXTERNAL_NUMBER = $external_number;
my $INTERNAL_NUMBER = $internal_number;
my $INTERNAL_CONNECTION = $internal_connection;

$proc =~s/\%EXTERNAL_NAME/$external_name/g;
$proc =~s/\%EXTERNAL_NUMBER/$external_number/g;
$proc =~s/\%INTERNAL_NUMBER/$internal_number/g;
$proc =~s/\%INTERNAL_CONNECTION/$internal_connection/g;

if($proc =~ m/^{.*}$/)
{
$proc =~s/\$EXTERNAL_NAME/"$external_name"/g;
$proc =~s/\$EXTERNAL_NUMBER/"$external_number"/g;
$proc =~s/\$INTERNAL_NUMBER/"$internal_number"/g;
$proc =~s/\$INTERNAL_CONNECTION/"$internal_connection"/g;
} # if perl

Log3($name,3,"FB_CM_EXTENDER_Proc:  action $proc");

fhem($proc);

} # end sub FB_CM_EXTENDER_Proc
########################


Wenn das Problem innerhalb von FB_CM_EXTENDER gelöst werden soll, müsste meiner Meinung nach ein weiterer Parameter mit der "method" für die sub definiert werden, damit dann bei "ring" der Parameter entsprechend vordefiniert werden.

Oder man könnte in der sub prüfen ob $internal_connection definiert ist und es mit einem Default belegen?



    A new operator // (defined-or) has been implemented. The following expression:

     $a // $b

    is merely equivalent to

    defined $a ? $a : $b

    and the statement

    $c //= $d;

    can now be used instead of

    $c = $d unless defined $c;



Ich könnte da morgen mal ein wenig herumexperimentieren, ist aber eher try-and-error  ;D

Gruß,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

Markus Bloch

#159
Zitat von: A.Harrenberg am 28 März 2015, 15:30:59

Oder man könnte in der sub prüfen ob $internal_connection definiert ist und es mit einem Default belegen?


Das ist der richtige Weg, zwar nicht umbedingt mit dem //-Operator, der in älteren Perl-Versionen nicht zur Verfügung steht, sondern eher:

in Zeile 445 von FB_CM_Extender einfügen:

$external_name = "" unless(defined($hash->{mem}{'external_name'}));
$external_number = "" unless(defined($hash->{mem}{'external_number'}));
$internal_number = "" unless(defined($hash->{mem}{'internal_number'}));
$internal_connection = "" unless(defined($hash->{mem}{'internal_connection'}));


Was soll eigentlich der folgende Block?
my $EXTERNAL_NAME = $external_name;
my $EXTERNAL_NUMBER = $external_number;
my $INTERNAL_NUMBER = $internal_number;
my $INTERNAL_CONNECTION = $internal_connection;


soweit ich das sehe wird der nirgends benutzt und ist nur unnötig verbrauchter Speicher.

Ein "not_connected" für internal_connection möchte ich nicht einführen, da das Reading ausschließlich Zahlen bisher enthält und viele User bei Notify's entsprechend nur numerische Vergleiche des Inhalts machen. Ein String in diesem Reading würde dann zu vielen Perl-Warnings und nicht funktionierenden notify's, Logiken, etc. führen.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

A.Harrenberg

Hallo Markus,



Zitat von: Markus Bloch am 28 März 2015, 15:47:46
Das ist der richtige Weg, zwar nicht umbedingt mit dem //-Operator, der in älteren Perl-Versionen nicht zur Verfügung steht, sondern eher:

in Zeile 445 von FB_CM_Extender einfügen:

$external_name = "" unless(defined($hash->{mem}{'external_name'}));
$external_number = "" unless(defined($hash->{mem}{'external_number'}));
$internal_number = "" unless(defined($hash->{mem}{'internal_number'}));
$internal_connection = "" unless(defined($hash->{mem}{'internal_connection'}));

Ich werde mir das mal einbauen und mein "not_connected" entfernen und schauen ob das funktioniert. Eigentlich sollte es reichen das für $internal_connection zu machen, die anderen Variablen sind ja bei "ring" bereits definiert.

Das $internal_connection in Deinem Modul nur Zahlen enthält hatte ich gar nicht beachtet, sollte mit der obigen Lösung aber auch nicht mehr relevant sein.

Vielen Dank für die Rückmeldung und den Hinweis auf "unless(defined...",
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

JoWiemann

Hallo Markus,

auch meinen Dank für die Rückmeldung. Anbei nun die neue Version.

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

A.Harrenberg

Hallo Jörg, hallo Markus,

tja, so funktioniert das aber leider doch nicht...

Jetzt sind alle Variablen leer bzw. = "".

2015.03.28 16:54:26.500 1: Telefon Action: method-call, , , ,
2015.03.28 16:54:34.252 1: Telefon Action: method-ring, , , ,
2015.03.28 16:54:36.341 1: Telefon Action: method-disconnect, , , ,
2015.03.28 16:54:37.827 1: Telefon Action: method-disconnect, , , ,


Ich habe aber auch gerade etwas schwierigkeiten beim Verständnis mit dem $hash->{mem}{...}. Auf was reagiert den defined hier eigentlich? $hash ist ja selber schon eine Variable, was passiert denn bei defined und einem hash?

Gruß,
Andreas.
FB 7360, Homematic und ZWave
Support for ZWave-SECURITY

JoWiemann

Hallo Andreas,

nach meinem Verständnis wird bei:

$internal_connection = "" unless(defined($hash->{mem}{'internal_connection'}));

die Variable $internal_connection auf "" gesetzt, wenn der hash->{mem}{'internal_connection'} nicht initialisiert ist.

Nimm mal die angehängte Version. In der Vorherigen ist mir ein copy/paste Fehler unterlaufen.

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

JoWiemann

Hallo Markus,

müsste nicht auch

my $internal_connection = defined($hash->{mem}{'internal_connection'}) ? $hash->{mem}{'internal_connection'} : "";


funktionieren?

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