Callmonitor für Anfänger

Begonnen von coolice, 25 Januar 2014, 13:07:36

Vorheriges Thema - Nächstes Thema

Markus Bloch

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

aktives Mitglied des FHEM e.V. (Technik)

mrabdip

Guten Abend,

ich habe mich nun auch an den Callmonitor herangewagt und bis jetzt hat alles funktioniert. Ich stelle die Anruferliste auf einem Infodisplay (kleines billigesTablet) über Webviewcontrol auf dem Dashboard dar. Allerdings aktualisiert sich die Anzeige bei Änderung der Anrufliste nicht.
Bei Änderungen von Lichtern (auch wenn diese nicht über fhem direkt geschalten werden) o.ä. sehe ich sofort die Änderung am Dashboard.
Was muss ich tun, damit dies auch bei Anrufen so ist.

Vielen Dank schon einmal.

Grüße
mrabdip
Fhem 5.8 auf Raspberry 3, KNX-Vollinstallation, Weinzierl-IP/KNX-Interface über KNXD, USB-RFXTRX, Youless110, SmartPI2, IP-Cams, FritzBox/DECT200, Tablet UI

fiedel

Hi mrabdip,

eigentlich sollte Longpoll dafür sorgen, dass sofort aktualisiert wird. Allerdings scheint bei dir Longpoll schon aktiv zu sein, sonst wäre das mit den Lichtern nicht so. Was auf jeden Fall geht: Mit der "Pageswap- Funktion" einen Aufruf der gleichen Seite (=eventgesteuerter Refresh) ausführen.

Gruß

Frank
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

Elektrolurch

Hallo,

schau mal in den Code des CallMonitors und suche mal nach "readingsBulkUpdate".
Damit wird zeilen- und spaltenweisekopiert und die vorhandenen Eintragungen nach unten verschoben.
Wenn ich mich recht erinnere, habe ich für den letzten Parameter eine 0 angegeben, damit nicht für jedes einzelne Kopieren ein Event in den fhem-Baum geschoben wird. Ersetze mal das durch eine 1. Vielleicht wird dann die Anzeige ja aktualisiert.
Und kurz darauf wird dann noch readingsEndUpdate(..,1) aufgerufen. Da muss dann auch eine 1 statt einer 0 stehen.

Gruß


Elektrolurch

configDB und Windows befreite Zone!

mrabdip

Hallo,

also bei readingsBulkUpdate finde ich ein paar Zeilen, jedoch keine 0.

    readingsBulkUpdate($hash, "event", lc($array[1]));
    readingsBulkUpdate($hash, "external_number", (defined($external_number) ? $external_number : "unknown")) if($array[1] eq "RING" or $array[1] eq "CALL");
    readingsBulkUpdate($hash, "external_name",(defined($reverse_search) ? $reverse_search : "unknown")) if($array[1] eq "RING" or $array[1] eq "CALL");
    readingsBulkUpdate($hash, "internal_number", $array[4]) if($array[1] eq "RING" or $array[1] eq "CALL");
    readingsBulkUpdate($hash, "external_connection", $array[5]) if($array[1] eq "RING");
    readingsBulkUpdate($hash, "external_connection", $array[6]) if($array[1] eq "CALL");
    readingsBulkUpdate($hash, "internal_connection", $connection_type{$array[3]}) if($array[1] eq "CALL" or $array[1] eq "CONNECT" and defined($connection_type{$array[3]}));
    readingsBulkUpdate($hash, "call_duration", $array[3]) if($array[1] eq "DISCONNECT");
            readingsBulkUpdate($hash, "missed_call", $hash->{helper}{MISSED_CALL_DETECTION}{$array[2]}{NUMBER});
            readingsBulkUpdate($hash, "missed_call_line", $hash->{helper}{MISSED_CALL_DETECTION}{$array[2]}{LINE})
        readingsBulkUpdate($hash, "call_id", $hash->{helper}{CALLID}{$array[2]});
        readingsBulkUpdate($hash, "call_id", $array[2]);


Und bei readingsEndUpdate steht bereits eine 1.


readingsEndUpdate($hash, 1);


Ich tappe da gerade etwas im Dunkeln

Grüße
mrabdip
Fhem 5.8 auf Raspberry 3, KNX-Vollinstallation, Weinzierl-IP/KNX-Interface über KNXD, USB-RFXTRX, Youless110, SmartPI2, IP-Cams, FritzBox/DECT200, Tablet UI

Elektrolurch

Hallo,

wo hast Du denn da nachgeschaut?
Ich meine den Code, der in einer 99_myUtils... steht und von dem notify des Call-Monitors aufgerufen wird.
Das ist so eine Schleife mit for(....
und da werden $A[$i]...$E[$i] umkopiert.

Leider weiß ich natürlich nicht, was aus dem von mir hier ursprünglich mal eingestellten Code geworden ist.

Gruß

Elektrolurch
configDB und Windows befreite Zone!

mrabdip

Hallo,

ich war leider in der 72_FB_CALLMONITOR.pm. Nun in der richtigen. Also readingsEndUpdate ist auf 1

readingsEndUpdate( $my_callmonitor, 1 );

bei readingsBulkUpdate finde ich keine 1 und weiß auch nicht wo man die setzen muss

            for ( $i = 4 ; $i > 0 ; $i-- ) {
                foreach $j ( 'A' .. 'E' ) {

                    #   $defs{"my_callmonitor"}{READINGS}{$j.($i-1)}{VAL};

                    $tt = ReadingsVal( "my_callmonitor", $j . ( $i - 1 ), "-" );
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );
                }    # end j
            }    # end i
            $E[$callID] = $callDuration;
            readingsBulkUpdate( $my_callmonitor, "A0", $A[$callID] );
            readingsBulkUpdate( $my_callmonitor, "B0", $B[$callID] );
            readingsBulkUpdate( $my_callmonitor, "C0", $C[$callID] );
            readingsBulkUpdate( $my_callmonitor, "D0", $D[$callID] );
            readingsBulkUpdate( $my_callmonitor, "E0", $E[$callID] );


Gruß
mrabdip
Fhem 5.8 auf Raspberry 3, KNX-Vollinstallation, Weinzierl-IP/KNX-Interface über KNXD, USB-RFXTRX, Youless110, SmartPI2, IP-Cams, FritzBox/DECT200, Tablet UI

Elektrolurch

                foreach $j ( 'A' .. 'E' ) {

                    #   $defs{"my_callmonitor"}{READINGS}{$j.($i-1)}{VAL};

                    $tt = ReadingsVal( "my_callmonitor", $j . ( $i - 1 ), "-" );
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt,1 );
                }    # end j
            }    # end i
            $E[$callID] = $callDuration;
            readingsBulkUpdate( $my_callmonitor, "A0", $A[$callID],1 );
            readingsBulkUpdate( $my_callmonitor, "B0", $B[$callID] ,1);
            readingsBulkUpdate( $my_callmonitor, "C0", $C[$callID],1 );
            readingsBulkUpdate( $my_callmonitor, "D0", $D[$callID],1 );
            readingsBulkUpdate( $my_callmonitor, "E0", $E[$callID],1 );

Ob dann wirklich der Bildschirm auch aktualisiert wird, kann ich nicht sagen.
Was aber leider passiert, ist das für jedes der aktualisierten readings ein Event generiert wird.

Gruß
Elektrolurch
configDB und Windows befreite Zone!

Roaster

Hi,

Ich habe (versucht) den Callmonitor und die Anrufbeantworterfunktion von hier http://forum.fhem.de/index.php/topic,16370.msg113765.html#msg113765 zu verheiraten (Ausschnitt aus der fhem.cfg):
define FritzBox FB_CALLMONITOR 192.168.6.1:1012
attr FritzBox local-area-code 09931
attr FritzBox event-on-change-reading missed_call
attr FritzBox reverse-search all
attr FritzBox reverse-search-cache 1
attr FritzBox reverse-search-cache-file ./log/FritzBox_Cache.txt
attr FritzBox reverse-search-phonebook-file ./log/FritzBox_Telefonbuch.xml
#attr FritzBox room Telefon
attr FritzBox userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4 F0 F1 F2 F3 F4
attr FritzBox verbose 0
attr FritzBox unique-call-ids 1
#attr FritzBox sortby A01


define FileLog_FritzBox FileLog ./log/FritzBox-%Y.log FritzBox
attr FileLog_FritzBox logtype text

# Normale Anrufe
define not.FBCallNotify notify FritzBox:.* { FB_TelefonMonitor ($EVENT);; }
attr not.FBCallNotify room Telefon
attr not.FBCallNotify sortby C01

# Anrufbeantworter
define not.FBCallNotify.AB notify FritzBox:missed_call.* { FB_ABCall( );; }
attr not.FBCallNotify.AB room Telefon
attr not.FBCallNotify.AB sortby C02


Die Folge ist jetzt, dass gar keine Anrufe mehr in der Anrufliste erscheinen. In der Definition der Anrufliste habe ich jedoch nichts verändert.
Ich gehe davon aus, dass die Ursache hier
attr FritzBox event-on-change-reading missed_call
liegt und somit das Notify
define not.FBCallNotify notify FritzBox:.* { FB_TelefonMonitor ($EVENT);; }
nicht mehr aufgerufen wird.

Wenn dem so ist, wie müsste die Definition für attr FritzBox event-on-change-reading missed_call korrekt lauten damit sowohl "normale" als auch Anrufe am AB aufgezeichnet bzw. getriggert werden? Oder kann ich die Anweisung event-on-change-reading auch weglassen?

Noch eine andere Frage zum Anrufbeantworter: Zum Zeitpunkt als mein Testanruf durch den AB angenommen wurde, hätte ich auch einen Eintrag im Log der Fritzbox erwartet. Das Log ist wie folgt definiert define FileLog_FritzBox FileLog ./log/FritzBox-%Y.log FritzBox
attr FileLog_FritzBox logtype text

aber es wird dort keine Aufzeichnung für den AB geloggt.


Was bedeutet eigentlich ganz genau die Angabe von missed_call bei dem o.g. Attribut? Sollte dieser Text im Log der FritzBox erscheinen?
Weder dort noch in meiner 99_MyUtilsTelefon.pm konnte ich diesen Text finden. Also entweder wir der nicht ins Log geschrieben, oder durch die vielen Versionen von Coding hier das ich versucht habe zu sortieren und an meine FBF anzupassen,  ist da etwas ein klein wenig durcheinander geraten  :-\

Grüße,
Michael

Roaster

Ich glaube ich antworte mir mal selbst  ;)

Also das was ich ursprünglich vor hatte, die Aufzeichnungen des ABs darzustellen war wohl 'ne Ente. Das Coding das ich gefunden hatte ist wohl eine andere Art, eine Anrufliste darzustellen. Die habe ich aber schon definiert, mit Hilfe diverser Postings hier und als readingsGroup gelöst.

Nichtsdestotrotz werden aber Aufzeichnungen des ABs nicht in der readingsGroup dargestellt.

Das Protokoll das während eines Anrufs mit Einschaltung des AB aufgezeichnet wurde ich bei mir wie folgt:
Zitat2014-08-22_21:40:24 FritzBox event: ring
2014-08-22_21:40:24 FritzBox direction: incoming
2014-08-22_21:40:24 FritzBox external_name: Handy Papa
2014-08-22_21:40:24 FritzBox external_number: 015xxxxxx
2014-08-22_21:40:24 FritzBox external_connection: POTS
2014-08-22_21:40:24 FritzBox internal_number:
2014-08-22_21:40:24 FritzBox call_id: e092ecc9d19f78ab55d78851a591d8c2
2014-08-22_21:40:29 FritzBox event: connect
2014-08-22_21:40:29 FritzBox direction: incoming
2014-08-22_21:40:29 FritzBox internal_connection: Answering_Machine_1
2014-08-22_21:40:29 FritzBox external_name: Handy Papa
2014-08-22_21:40:29 FritzBox external_number: 015xxxxxx
2014-08-22_21:40:29 FritzBox external_connection: POTS
2014-08-22_21:40:29 FritzBox internal_number:
2014-08-22_21:40:29 FritzBox call_id: 54009df7ff0f26e71c7722c3fa4891b8
2014-08-22_21:40:47 FritzBox event: disconnect
2014-08-22_21:40:47 FritzBox direction: incoming
2014-08-22_21:40:47 FritzBox internal_connection: Answering_Machine_1
2014-08-22_21:40:47 FritzBox external_name: Handy Papa
2014-08-22_21:40:47 FritzBox external_number: 015xxxxxx
2014-08-22_21:40:47 FritzBox external_connection: POTS
2014-08-22_21:40:47 FritzBox internal_number:
2014-08-22_21:40:47 FritzBox call_duration: 19
2014-08-22_21:40:47 FritzBox call_id: 622a5b820ee5362f355b2b3d638938fe

So wie ich das Coding in der 99_MyUtilsTelefon.pm deute, müsste eigentlich eigene Readings auch für den AB erstellt werden. Nur irgendwie erscheinen diese Art von Einträge nicht in der readingsGroup, die bei mir wie folgt definiert ist:
define FritzBox FB_CALLMONITOR 192.168.6.1:1012
attr FritzBox local-area-code 09xxx
attr FritzBox reverse-search all
attr FritzBox reverse-search-cache 1
attr FritzBox reverse-search-cache-file ./log/FritzBox_Cache.txt
attr FritzBox reverse-search-phonebook-file ./log/FritzBox_Telefonbuch.xml
#attr FritzBox room Telefon
attr FritzBox userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4 F0 F1 F2 F3 F4
attr FritzBox verbose 0
attr FritzBox unique-call-ids 1
#attr FritzBox sortby A01


define FileLog_FritzBox FileLog ./log/FritzBox-%Y.log FritzBox
attr FileLog_FritzBox logtype text

# Normale Anrufe
define not.FBCallNotify notify FritzBox:.* { FB_TelefonMonitor ($EVENT);; }
attr not.FBCallNotify room Telefon
attr not.FBCallNotify sortby C01

define Anrufliste readingsGroup FritzBox:A0,B0,C0,D0,E0 FritzBox:A1,B1,C1,D1,E1 FritzBox:A2,B2,C2,D2,E2 FritzBox:A3,B3,C3,D3,E3 FritzBox:A4,B4,C4,D4,E4
attr Anrufliste mapping &nbsp
attr Anrufliste nameStyle style="font-weight:bold"
attr Anrufliste noheading 0
attr Anrufliste nolinks 1
attr Anrufliste nostate 1
attr Anrufliste notime 1
attr Anrufliste room Telefon
attr Anrufliste sortby A02
attr Anrufliste style style="font-size:20px"
attr Anrufliste valueIcon {'A0.out_connected' => 'phone_ring_out@green', 'A0.in_connected' => 'phone_ring_in@green', 'A0.AB' => 'audio_volume_mid@lightgreen', 'A0.in_notconnected' => 'phone_ring_in@red', 'A0.out_notconnected' => 'phone_ring_out@red', 'A1.out_connected' => 'phone_ring_out@green', 'A1.in_connected' => 'phone_ring_in@green', 'A1.AB' => 'audio_volume_mid@lightgreen', 'A1.in_notconnected' => 'phone_ring_in@red', 'A1.out_notconnected' => 'phone_ring_out@red', 'A2.out_connected' => 'phone_ring_out@green', 'A2.in_connected' => 'phone_ring_in@green', 'A2.AB' => 'audio_volume_mid@lightgreen', 'A2.in_notconnected' => 'phone_ring_in@red', 'A2.out_notconnected' => 'phone_ring_out@red', 'A3.out_connected' => 'phone_ring_out@green', 'A3.in_connected' => 'phone_ring_in@green', 'A3.AB' => 'audio_volume_mid@lightgreen', 'A3.in_notconnected' => 'phone_ring_in@red', 'A3.out_notconnected' => 'phone_ring_out@red', 'A4.out_connected' => 'phone_ring_out@green', 'A4.in_connected' => 'phone_ring_in@green', 'A4.AB' => 'audio_volume_mid@lightgreen','A4.in_notconnected' => 'phone_ring_in@red', 'A4.out_notconnected' => 'phone_ring_out@red', }


Ich habe meine 99_MyUtilsTelefon.pm mal angefügt, der Vollständigkeithalber.

Ich habe aktuell zwei Probleme: die fehlende Anzeige von AB Aufzeichnungen und zweitens was auch andere schon geschrieben haben, die readingsGroup aktualisiert sich nicht automatisch, wenn der Anruf beendet(?) wurde. Erst ein F5 im Browser (Firefox) aktualisiert die Anzeige.

Hat hier jemand eine Funktionierende Anrufbeantworter-Lösung. Ich stelle mir erstens vor, dass die Aufzeichnungen in der readingsGroup erscheinen und dass man dann die Aufzeichnung auch über fhem abhören kann.

Grüße,
Michael

Markus Bloch

Das liegt daran, dass die Call-ID's nicht gleich sind. Das ist ein Bug im FB_CALLMONITOR. Habe ich aber soeben gefixt und ist via update ab morgen verfügbar.

Viele Grüße

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)

Roaster

#221
Hast du dann noch eine Idee, warum bei einem beendeten Anruf die readingsGroup nicht umgehend aufgefrischt wird. Habe gerade einen neuen Test hinter mir, bei dem ich erst nach einem Refresh mit F5, die aktuellste Anzeige bekam...

Nach dem Update steht jetzt zumindest der Anruf, der auf den AB umgeleitet wurde in der Anzeige. NUR es gab offensichtlich keinen Hinweis darauf, dass es ein "AB"-Event war. Das Symbol, das ich für eine AB Aufzeichnung verwende habe, wird nicht dargestellt. Stattdessen das "normale" Anrufsymbol.

Wieder das Protokoll dazu mit den jetzt korrekten Call-IDs:
Zitat2014-08-23_10:22:47 FritzBox event: ring
2014-08-23_10:22:47 FritzBox direction: incoming
2014-08-23_10:22:47 FritzBox external_name: Handy Papa
2014-08-23_10:22:47 FritzBox external_number: 0151xxxxx
2014-08-23_10:22:47 FritzBox external_connection: POTS
2014-08-23_10:22:47 FritzBox internal_number:
2014-08-23_10:22:47 FritzBox call_id: 9aafed0dc142c3e91b99717c1280305c
2014-08-23_10:22:53 FritzBox event: connect
2014-08-23_10:22:53 FritzBox direction: incoming
2014-08-23_10:22:53 FritzBox internal_connection: Answering_Machine_1
2014-08-23_10:22:53 FritzBox external_name: Handy Papa
2014-08-23_10:22:53 FritzBox external_number: 0151xxxxx
2014-08-23_10:22:53 FritzBox external_connection: POTS
2014-08-23_10:22:53 FritzBox internal_number:
2014-08-23_10:22:53 FritzBox call_id: 9aafed0dc142c3e91b99717c1280305c
2014-08-23_10:23:12 FritzBox event: disconnect
2014-08-23_10:23:12 FritzBox external_name: Handy Papa
2014-08-23_10:23:12 FritzBox external_number: 0151xxxxx
2014-08-23_10:23:12 FritzBox internal_number:
2014-08-23_10:23:12 FritzBox call_duration: 20
2014-08-23_10:23:12 FritzBox direction: incoming
2014-08-23_10:23:12 FritzBox internal_connection: Answering_Machine_1
2014-08-23_10:23:12 FritzBox external_connection: POTS
2014-08-23_10:23:12 FritzBox call_id: 9aafed0dc142c3e91b99717c1280305c

Die valueIcons werden folgendermassen definiert:
attr Anrufliste valueIcon {'A0.out_connected' => 'phone_ring_out@green', 'A0.in_connected' => 'phone_ring_in@green', 'A0.AB' => 'audio_volume_mid@lightgreen'...

Erwartet hätte ich jetzt das audio_volume_mid Symbol. Angezeigt wird jedoch phone_ring_in.

Irgendetwas im Utility Modul scheint nicht ganz so zu funktionieren wie gewünscht (Auszug):
} elsif ( $ab eq "AB" )
            {
                $A[$callID] = "AB";
                $F[$callID] = "audio_volume_mid\@lightgreen";
               
                $ab = undef;

                # hier notieren was passieren soll, wenn der AB dranging

                $intCallDuration = undef;
            } elsif ($intCallDuration gt 0 )
            {
                $A[$callID] = "in_connected";
                $F[$callID] = "phone_ring_in\@green";
               
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war,
                # der angenommen wurde
               
                $intCallDuration = undef;
            }
        }
       
        # hier notieren was generell passieren soll, sobald ein Anruf beendet wurde
        # (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)

        if ( $event eq "call_id" )
        {
            $callID = $arg;

            # shiften der alten Inhalte
            my $tt;
            readingsBeginUpdate($my_callmonitor);

            for ( $i = 4 ; $i > 0 ; $i-- ) {
                foreach $j ( 'A' .. 'F' ) {

                    #   $defs{"my_callmonitor"}{READINGS}{$j.($i-1)}{VAL};

                    $tt = ReadingsVal( "FritzBox", $j . ( $i - 1 ), "-" );
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );
                }    # end j
            }    # end i
            $E[$callID] = $callDuration;
            readingsBulkUpdate( $my_callmonitor, "A0", $A[$callID] );
            readingsBulkUpdate( $my_callmonitor, "B0", $B[$callID] );
            readingsBulkUpdate( $my_callmonitor, "C0", $C[$callID] );
            readingsBulkUpdate( $my_callmonitor, "D0", $D[$callID] );
            readingsBulkUpdate( $my_callmonitor, "E0", $E[$callID] );
            readingsBulkUpdate( $my_callmonitor, "F0", $F[$callID] );

            readingsEndUpdate( $my_callmonitor, 1 );
            $stat = "";

            return( true );
        }    # end if callid


Ich habe mir an der Stelle des Coding, bei der der AB registriert wird einen Log Eintrag erstellt:
} elsif ( $ab eq "AB" )
            {
                $A[$callID] = "AB";
                $F[$callID] = "audio_volume_mid\@lightgreen";
               
                $ab = undef;

                # hier notieren was passieren soll, wenn der AB dranging
                Log(3,"!!! AB angenommen !!!");


                $intCallDuration = undef;


Dieser wird im Log aufgezeichnet:
Zitat2014.08.23 10:32:50 3: !!! AB angenommen !!!

So, jetzt bin ich ratlos. AB geht ran, Anruf wird in der readingsGroup angezeigt (wenn auch kein Refresh stattfindet), aber das Symbol wechselt nicht.

Michael

Elektrolurch

#222
Hallo,

zu 2:
...hatte ich weiter oben auch schon geschrieben:
Bei den readingsBulkUpdate noch einen Parameter vor der schliessenden Klammer anhängen: ,1)
Damit werden (leider) die ganzen Events, die durch das Umkopieren der Zeilen/Zellen entstehen in den fhem-Baum gepushed, vielleicht gibt es dann aber auch eine sofortige Aktualisierung des Bildschirms.
readingsEndUpdate muss dann natürlich auch mit 1 aufgerufen werden.

Zum AB:
ok. Nochmals hingeschaut. Saudummer Fehler:

} elsif ( $ab eq "AB" )

weiter oben wird aber $ab = 'ab'; gesetzt!

Leider sagt mein Screenreader nicht Groß- und Kleinschreibung an, wenn ich nicht explizit danach frage.
Also in dem elsif 'ab' schreiben und dann soltte es gehen.
Man verzeihe mir den Anfängerfehler, war so mein erster Code für fhem... vor einem Jahr.

Gruß

Elektrolurch
configDB und Windows befreite Zone!

Roaster

Zitat von: Elektrolurch am 23 August 2014, 11:23:15
Bei den readingsBulkUpdate noch einen Parameter vor der schliessenden Klammer anhängen: ,1)
Damit werden (leider) die ganzen Events, die durch das Umkopieren der Zeilen/Zellen entstehen in den fhem-Baum gepushed, vielleicht gibt es dann aber auch eine sofortige Aktualisierung des Bildschirms.
readingsEndUpdate muss dann natürlich auch mit 1 aufgerufen werden.
Da habe ich jetzt zu wenig Hintergrundwissen um zu beurteilen welchen Vor- oder Nachteil dies hat.

Das mit der Groß-Kleinschreibweise ist bei mir nicht der Fall. Ich glaube ich habe dies, wie ich mir den Code angesehen habe, bereits geändert:
sub FB_TelefonMonitor($)
{
    our $extnum;
    our $intnum;
    our $extname;
    our $callID;
    our $callDuration;
    # Anrufdauer als Integervariable speichern
    our $intCallDuration; 
    our $stat;
    our @lastPhoneEvent;
    my $i;
    my $j;
    our $ab;
    my $my_callmonitor = $defs{"FritzBox"};


    my ( $event, $arg ) = split( ':', $_[0] );
    $arg = ltrim($arg);

    #Log(3,"TM: event: $event arg: $arg");
    if ( $event eq "event" ) {
        $stat = $arg;
        return;
    }    # end if event

    if ( $stat eq "ring" ) {
        if ( $event eq "external_number" ) {
            $extnum = $arg;
            return;
        }    # if external number

        if ( $event eq "external_name" ) {
            $extname = $arg;
            return;
        }
        if ( $event eq "internal_number" ) {
            $intnum = $arg;
            return;
        }    # end if intnum

        if ( $event eq "call_id" ) {
            $callID = $arg;
           
            $lastPhoneEvent[$callID] = $stat;
           
            # hier koennen wir eine anrufgesteuerte Aktion starten
            FB_TelefonAktion( $extname, $intnum );

            $B[$callID] = EventZeit();
            $C[$callID] = $extname;
            $D[$callID] = $extnum;
            $F[$callID] = "phone_ring";
            return;
        }    # end if callid
        return;
    }    # end if ring loop

    if ( $stat eq "connect" ) {
        if ( ( $event eq "internal_connection" ) && ( $arg =~ m/Answering_Machine_.*/ ) )
        {
            $ab = "AB";
        }    # end if internal_connection
    }    # end if connect

    if ( $stat eq "call" ) {
        if ( $event eq "external_number" ) {
            $extnum = $arg;
            return;
        }    # if external number

        if ( $event eq "external_name" ) {
            $extname = $arg;
            return;
        }
        if ( $event eq "call_id" ) {
            $callID     = $arg;

            $B[$callID] = EventZeit();
            $C[$callID] = $extname;
            $D[$callID] = $extnum;
           
            $lastPhoneEvent[$callID] = $stat;
            return;
        }    # end if callid
        return;
    }    # end if callloop

    if ( $stat eq "disconnect" ) {

        if ( $event eq "call_duration" ) {
            $intCallDuration = $arg;
            $callDuration = sprintf( "%2d:%02d", ( $arg / 60 ), $arg % 60 );
            return;
        }    # if call_duration
       
        if ( $lastPhoneEvent[$callID] eq "call" )
        {
            if ( $intCallDuration eq 0 )
            {
                $A[$callID] = "out_notconnected";
                $F[$callID] = "phone_ring_out\@red";
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war,
                # der nicht angenommen wurde
            } elsif ( $intCallDuration gt 0 )
            {
                $A[$callID] = "out_connected";
                $F[$callID] = "phone_ring_out\@green";
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war,
                # der angenommen wurde
            }
        } elsif ( $lastPhoneEvent[$callID] eq "ring")
        {
            if ( $intCallDuration eq 0 )
            {
                $A[$callID] = "in_notconnected";
                $F[$callID] = "phone_call\@red";
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war,
                # der nicht angenommen wurde

                $intCallDuration = undef;
            } elsif ( $ab eq "AB" )
            {
                $A[$callID] = "AB";
                $F[$callID] = "audio_volume_mid\@lightgreen";
               
                $ab = undef;

                # hier notieren was passieren soll, wenn der AB dranging
                #Log(3,"!!! AB angenommen !!!");


                $intCallDuration = undef;
            } elsif ($intCallDuration gt 0 )
            {
                $A[$callID] = "in_connected";
                $F[$callID] = "phone_ring_in\@green";
               
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war,
                # der angenommen wurde
               
                $intCallDuration = undef;
            }
        }
       
        # hier notieren was generell passieren soll, sobald ein Anruf beendet wurde
        # (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)

        if ( $event eq "call_id" )
        {
            $callID = $arg;

            # shiften der alten Inhalte
            my $tt;
            readingsBeginUpdate($my_callmonitor);

            for ( $i = 4 ; $i > 0 ; $i-- ) {
                foreach $j ( 'A' .. 'F' ) {

                    #   $defs{"my_callmonitor"}{READINGS}{$j.($i-1)}{VAL};

                    $tt = ReadingsVal( "FritzBox", $j . ( $i - 1 ), "-" );
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );
                }    # end j
            }    # end i
            $E[$callID] = $callDuration;
            readingsBulkUpdate( $my_callmonitor, "A0", $A[$callID],1 );
            readingsBulkUpdate( $my_callmonitor, "B0", $B[$callID],1 );
            readingsBulkUpdate( $my_callmonitor, "C0", $C[$callID],1 );
            readingsBulkUpdate( $my_callmonitor, "D0", $D[$callID],1 );
            readingsBulkUpdate( $my_callmonitor, "E0", $E[$callID],1 );
            readingsBulkUpdate( $my_callmonitor, "F0", $F[$callID],1 );

            readingsEndUpdate( $my_callmonitor, 1 );
            $stat = "";

            return( true );
        }    # end if callid

    }    # end if disconnect
}    #end sub FB_TelefonMonitor


Dies würde aber nach wie vor bedeuten, dass ich keine AB Event bekomme, weil die Schreibweise bei mir schon immer korrekt ist, es muss an etwas anderem liegen - Funktioniert dies bei dir korrekt?

Michael

Elektrolurch

Hallo,

AB geht jetzt, nachdem ich die Schreibweise korrigiert hatte. Da wurde bezüglich meiner ursprünglichen Version ein wenig umgestellt (!), so dass ich das jetzt so auf die schnelle nicht nachvollziehen kann, warum es bei Dir immer noch nicht geht.

                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );
da gehört auch noch eine 1 in die Klammer
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt,1 );

sonst wird nur die erste Zeile aktualisiert und man sieht nicht, wie die anderen Zeilen nach unten geschoben werden.

Gruß

Elektrolurch
configDB und Windows befreite Zone!