Callmonitor für Anfänger

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

Vorheriges Thema - Nächstes Thema

Roaster

Wärst du so nett und hängst mal dein aktuellstes Modul rein, so dass ich mal vergleichen kann?

Nochmals nachgefragt, zur Sicherheit, bevor wir uns beide die Mühe machen: bei dir werden AB-Aufzeichnungen angezeigt?

Danke,
Michael

Roaster

Ich habe die Änderungen nun ergänzt bzw. überprüft

                    $tt = ReadingsVal( "FritzBox", $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 );
            readingsBulkUpdate( $my_callmonitor, "F0", $F[$callID],1 );

            readingsEndUpdate( $my_callmonitor, 1 );


aber um ehrlich zu sein das hat gar nichts gebracht. Ich hatte die Seite mit den aktuellen Anrufen offen und erneut einen Anruf (ausgehend) getätigt. Die Seite hat sich nicht automatisch aktualisiert - erst wieder nach F5.

MIchael

Elektrolurch

Hallo fhem-Gemeinde,

ich habe am Wochenende mein "Erstlingswerk" von 2013 überarbeitet.

Ergebnis:

Nach den events ring | call | connect | disconnect werden die Daten nun in einen hash %mem geschrieben.
Wenn das Event "call_id" kommt werden die Daten in einen hash %callmem{$callID} überführt (sub TM_Store).
Je nach Einstellung der globalen Variable:
# TelefonMonitor type: all | incoming | outgoing | missed_call | all_after_disconnect
# use sub TM_MonitorType('all'); for setting type
my $monitor_type = 'all';

werden nun alle,nur eingehende, nur ausgehende oder verpasste Anrufe in den Speicher übernommen.

Die Symbole für eingehende oder ausgehende Anrufe können im Modul (Bereich Adaption) auch geändert werden.

Die zuordnung der Werte erfolgt in TM_Store (Spalten A ... E). Die Übertragung der Werte in den Speicher, und damit das Update der Anzeige, erfolgt in Abhängigkeit der Variable $monitor_type mit TM_UpdateTable.

Da die Anzeige bei $monitor_type  = all @ incoming | outgoing sofort erfolgt, wird die Aktivierung des Anrufbeantworters und der Gesprächslänge beim "disconnect" nachträglich in die Anzeige geschrieben.

Anrufbeantworter: answering_machine_1 " wird als "AB" dargestellt, alle weiteren ABs mit ihrer Nummer hinter dem AB (getestet und funktioniert).

Aktualisierung der Anzeige:
Variable des Moduls: $update = 1
Alle Änderungen der readings werden an fhem übertragen. Damit sollte eigentlich ein Update der Anzeige sichergestellt sein. Für die web-Instanz muss natürlich das Attr. longpoll auf 1 gesetzt sein.
Allerdings hatte ich nach Klingeln des Anrufs auch kein Update der Anzeige (Firefox). longpoll aktualisiert wohl nur im Zeitintervall (?).
Der Code ist jedenfalls so programmiert ($update = 1), dass die Anzeige gem. fhem aktualisiert werden müsste.
Nachteil ist, das bei Anrufen fhem durch die erzeugten Events für eine kurze Zeit (ziemlich) belastet" ist.
Wer das vermeiden will, setzt $update auf 0.
Beim Neuaufbau einer Seite (F5) werden natürlich alle Werte weiterhin korrekt angezeigt.
Also: Das Problem "der sofortigen Aktualisierung der Anzeige" liegt nicht beim TelefonMonitor", sondern bei der verwendeten readingsGroup oder bei fhem.

So, viel Spaß beim testen. Der Code möge die Neueinsteiger auch dazu animieren, sich etwas mehr mit perl zu beschäftigen.

Gruß


Elektrolurch

configDB und Windows befreite Zone!

Roaster

Servus,

du kannst davon ausgehen, dass du es zumindest bei mir bereits erreicht hast, sich mit Perl zu beschäftigen, obwohl ich es am Anfang erst gar nicht vor hatte.

Aber im Zusammenhang mit fhem kommt man der Sache halt nicht aus. Das ist halt kein Produkt von der Stange, dafür aber flexibel. Nun, dann kommt jetzt zu Objekt Pascal, C#, Abap, Javascript... halt noch Perl dazu - was solls  ::)

Ich werde mir heute, spätestens morgen dann die Neufassung mal ansehen. Vielen Dank auf jeden Fal schon Mal vorab für die tolle Leistung!

Grüße,
Michael

Roaster

Servus,

ich hatte gerade etwas Zeit und bin das neu geschriebene Modul durchgegangen. Was mit aufgefallen ist, beziehungsweise was meines Erachtens neu drin ist sind die folgenden Zeilen
Log3($meineFB,3,"TM: event: $event arg: $arg");
Wird dadurch ein eigenes Sub Log3() aufgerufen das in der von dir angefügten Datei nicht enthalten ist?

Wo oder wie muss ich $meineFB definieren. Im alten Coding war dort noch die folgende Zeile zu finden
my $my_callmonitor = $defs{"FritzBox"};

Hier finde ich lediglich diese Zeile,
my ($meineFB,$ev) = @_;
die würde vielleicht passen, nur wo schreibe ich den Namen meines Gerätes (FritzBox) jetzt rein? Muss ich dort $meineFB, oder generell im ganzen Coding, durch $FritzBox ersetzen?

Muss ich deiner Meinung nach in meiner vorhandenen readingsGroup noch etwas anpassen. Ich habe bisher im Coding von 99_MyUtilsTelefon nur in dieser Zeile my $maxlines = 5; von vier auf fünf erhöht, da ich bisher immer die letzten fünf Anrufe angezeigt habe.

Ich gehe davon aus, dass ich in dieser Zeile meiner FritzBox Gerätedefinition dann noch die Variable F0 bis F4 ergänzen muss:

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

Ganz sicher bin ich mir nicht, weil in der F Variablen eine ID gespeichert wird. Aber ich denke die Frage kannst du sicher sofort klären  ;)

Danke und Grüße,
Michael

Elektrolurch

Hallo,

Log3($meineFB,3,"TM: event: $event arg: $arg");
ist eine fhem-Funktion und nicht von mir.

maxlines, siehe auch den Kommentar, geht von 0...4, also 5 Zeilen.


sub TelefonMonitor($$)
{
my ($meineFB,$ev) = @_;
my $hash = $defs{$meineFB};


Über das notify, siehe auch Kommentar im Modul, wird der Gerätename ja übergeben:

notify FritzBox:.* {TelefonMonitor($NAME,$EVENT);}

Daher ist im code auch nichts anzupassen.

Achtung: Weil ich heute einen früheren Beitrag gelesen hatte. Intern geht das Feld nun von A...F (nicht nur bis E).
In F speichere ich die CalllID, um nachträglich die Gesprächsdauer bzw. die Info, dass das Gespräch auf dem AB gelandet ist, noch dem Gespräch korrekt zuordnen zu könnnen.
Das Teil ist so programmiert, dass es auch bei beliebig vielen gleichzeitig geführten Gesprächen noch funktioniert.

Gruß

Elektrolurch
configDB und Windows befreite Zone!

Roaster

Danke Dir für die Antwort!

ich muss aber trotzdem nochmals nachfragen: Bei dir heist das Gerät in der fhem.cgh meineFB? Bei mir habe ich das Gerät als FritzBox benannt. Somit muss ich wohl im deinem Coding das meinFB durch FritzBox ersetzen. Oder liege ich hier falsch?

Ich könnte es jetzt einfach ausprobieren, aber dann muss ich es gegebenenfalls wieder rückgängig machen und die Arbeit möchte ich mir sparen  ;)

Grüße,
Michael

Puschel74

Hallo,

wenn du das notify richtig definierst und das regexp passt dann ist es doch egal wie eine Variable heisst  :o

Zitatund die Arbeit möchte ich mir sparen
Aufruf auf die neue sub umstellen und im Logfile die Fehlermeldungen durchlesen - jep, jede Menge Arbeit.

Grüße

P.S.: Lies dir mal die Sig von Elektrolurch durch - vielleicht fällt dir was auf  ;)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Roaster

Hi,

ich kenne seine Sig. Wenn du den ersten Teil meinst, dann gebe ich dir Recht, ich könnte es selbst probieren, nur weiß ich zuwenig über Perl, als dass ich in dem Coding eine RegEx erkennen könnte, die von meiner Gerätedefinition mit dem Namen FritzBox auf...ja, auf was genau kommen könnte.

Wenn ich es dann probiert habe und es funktioniert nicht, dann muss ich euch auch wieder belästigen. Also liber gleich gefragt und die Unklarheiten aus dem Weg geräumt.

Bei Elektrolurchs Coding finde ich einfach keinen Verweis auf die Gerätedefinition der FritzBox/des Callmonitors.

So, ich war jetzt so experimentierfreudig und habe das Coding einfach in meine vorhandenen 99_MyUtilsTelefon.pm kopiert und gespeichert.

Es sind dabei eine Reihe von Fehlern aufgetreten, die wohl ein Konvertierungsproblem als Ursache haben.

Die von dir, Elektrolurch, angehängte Datei hat ein paar Zeilen drin, die meines Erachtens nicht korrekt sind. Statt -> (Bindestrich Pfeil) wurde dort ein HTML Code gespeichert:

my $incoming = '->';
my $outgoing = '<-';


eingefügt. Auch hier:
$rhash->{A} = $dir;
    $rhash->{B} = sprintf("%02d:%02d %02d.%02d.%4d",$hour,$min,$mday,($mon+1),($year+1900));
    $rhash->{C} = $mem{"external_name"};
    $rhash->{D} = $mem{"external_number"};
    $rhash->{E} = "0:00"; # default call_duration, set after disconnect
    $rhash->{F} = $ID;


Ich denke das soll wohl eher $rhash->{B} heißen, oder? Es gibt noch weitere Fälle dazu. Ich habe die Datei genommen, im Editor (Notepad++) geöffnet und diese Stellen gefunden, die fhem jetzt beim Speichern anmahnt.

Grüße,
Michael

Roaster

So, jetzt habe ich es gewagt und das Coding reinkopiert.

Es scheint soweit zu funktionieren, bis auf dass die Anzeige wieder nicht aufgefrischt wird. Neustart habe ich zur Sicherheit durchgeführt.

Was dann dummerweise noch hinzukommt ist, dass ich bisher aufgrund der Anrufereignisse in_connected, out_connected usw. das Attribut valueIcon gesetzt habe:

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' =>...

Das funktioniert jetzt leider nicht mehr, es wird ja nur mehr -> beziehungsweise <- zurückgegeben  :(

Wäre es möglich das irgendwie wieder ins Coding mit aufzunehmen? Ich möchte ja nicht nur die Richtung angezeigt bekommen, sondern auch ob angenommen wurde oder nicht. Bisher war dies kein Problem...

Grüße,
Michael

Roaster

Zum Thema Auffrischen in der readingsGorup steht in der Anleitung

ZitatFor internal values and attributes longpoll update is not possible. Refresh the page to update the values

Bedeutet dies, dass ich hier warten kann bis ich schwarz werde? Gibt es möglicherweise gar kein Refresh? Das wäre Schade, denn wenn ich die readingsGroup für ein Dashboard verwenden möchte, das sich automatisch bei Ereignissen aktualisiert, dann kann ich das Ganze wohl vergessen.

Obwohl, ich verwende eine readingsGroup auch für die Zustandsanzeige der Batterien meiner Fensterkontakte und die aktualisieren sich fast minütlich...

Also ich weiß jetzt auch nicht mehr was Sache ist...

Michael

Roaster

Nach einigen Missversuchen, die Ereignisse out_connected, in_connected und so weiter wieder einzubauen, habe ich jetzt das alte Coding wieder reinkopiert.

Da funktionierte wenigstens die Anzeige der Symbole wie ich mir das vorstelle. Der Refresh funktioniert bei beiden nicht, also habe ich keinen Nachteil mit dem alten Coding. Den Anrufbeantworter habe ich dann auch nicht mehr getestet,

Danke jedenfall für das Update!

Michael

Elektrolurch

Hallo,

soviel ich weiß, habe ich extra auf die Kommentare zu Beginn meiner Datei verwiesen.

# adaptions
# please change values for your own apllication
#
# for using this code, define:
# define #TelefonMonitor_not notify <yourFritzbox>:.* {TelefonMonitor($NAME,$EVENT);}

# change to 0 to avoid call of undef subs
my $Elektrolurch = 1;
# Symbols for call direction
my $incoming = '->';
my $outgoing = '<-';


Da kannst Du die Symbole so setzen, wie Du möchtest, ohne Deine rg abzuändern.

Die Werte werden mit readingsBulkUpdate(...,1) und readingsEndUpdate(...,1) in readings geschrieben, sind also keine "internal" values. Warum die Aktualisierung nicht sofort angezeigt wird, verstehe ich auch nicht, denn in den readings stehen sie sofort, wenns klingelt.

Und die fhem-WEB Instanz hat bei mir auch das gesetzte Attribut longpoll.

Meine Datei ist korrekt, vermutlich ist der Fehler bei Dir beim Kopieren (copy,paste) passiert.

Gruß


Elektrolurch
configDB und Windows befreite Zone!

Roaster

Servus,

Ich habe die Datei herunterladen und im Notepad++ geöffnet. Da hatte ich noch gar kein Copy und Paste angewandt.

Den Anfang zu Beginn deines Codings habe ich natürlich gelesen, und könnte dort auch Anpassungen vornehmen. Nur sind dann immer lediglich zwei Events möglich: in und out. Esgab aber in der alten Version noch in_connected, out_connected, in_notconnected, out_notconnected und so weiter. Dementsprechend habe ich dann mehrerer Symbole verwenden können umd diese Zustände simulieren zu können

Es wäre prima, wenn dies auch wieder so möglich wäre, eventuell als weiteres Reading im Buchstaben G?

Ich habe gesehen dass du wegen des Refresh im Thread der readingsGroup nachgefragt hast. Ich werde mal Firebug bemühen und mir auch das HTML mal reinziehen. Mal sehen, ob ich das was justme geschrieben hat bei mir feststellen kann.

Mal eine Frage noch am Rande:wie programmiert ihr eigentlich in Perl? Ich meine ich versuche das so gut es geht im Notepad++, kopiere das Ganze dann nach fhem in dessen Editor und hoffe dass es läuft. Ziemlich mühsam das Vorgehen.

Grüße,
Michael

Roaster

Ok,  das mit den fehlerhaften Zeichen ist ein Notepad Problem! Habe die Datei nun auf meinem Android Tablet geöffnet und das Coding stimmt jetzt.

Michael