FRITZBOX: Best Practice automatisiert Anrufe in Spam-Telefonbuch&sip_filter-Attribut

Begonnen von TomLee, 30 November 2024, 16:38:13

Vorheriges Thema - Nächstes Thema

frober

D.h. prinzipiell funktioniert es, nur dass anstelle von 30s es 6s Wartezeit sind?

Hmm, was passiert mit dem Timer während FHEM blockiert? Evtl. stimmt der timestamp im Log durch die Blockade nicht. Kannst du das Ergebnis verifizieren, stimmt es oder wird die Sub wirklich zu früh ausgeführt.

Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

TomLee

Die Sub wird wirklich zu früh aufgerufen, die Liste enthält nicht die zu ergänzende neue Nummer.

JoWiemann

Hallo Thomas,

ich glaube Dir bleibt nichts anderes übrig als Dich mit: https://wiki.fhem.de/wiki/Blocking_Call zu beschäftigen.

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

TomLee

Also wsl. dann doch wie vermutet:

Zitat von: TomLee am 01 Dezember 2024, 21:27:19Wsl. wird man irgendwie im Perl-Script-Ausführungsfluss auch weiter machen können, ist aber dann bestimmt mehr Aufwand, für das gleiche Ergebnis wie mit der cmdalias-Variante.

Weil die Stimmung derzeit passt, besteht die Möglichkeit, das ich mich in das Blocking_Call eindenken/einarbeiten werde...

TomLee

Hi,

bin jetzt um die Erfahrung reicher wie so ein Blocking_Call-Aufruf umzusetzen wäre. Wie er mir aber bei meinem Anliegen nützlich und möglichst nicht umständlich weiterhelfen soll ist mir nicht klar oder ich bin mir mal wieder selbst im Weg. Verstehe es so das man aus dem geforkten Prozess die Rückgabe des letzten fhem("get $cmdevice showPhonebookEntries 1",1) an die finishFN übergeben müsste. In dem geforkten Prozess hab ich aber doch genau das gleiche Problem nach dem rereadPhonebook wie jetzt auch. Ist mir to much.



Hab mich weiter damit beschäftigt warum das mit InternalTimer nicht klappt. Da hat sich rausgestellt das wenn ich eine normale Sub (keine anonyme) angebe, alles funzt wie gedacht. Dabei stört mich aber das ich eine extra Sub brauch und der auch die Devices via Parameter übergeben muss.

Also hab ich mir das mit der anonymen Sub nochmal genauer angeschaut. Da hat sich rausgestellt das man die Referenz auf die anonyme Sub in InternalTimer angeben muss das es funzt  ::) :

##############################################
# $Id: myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z 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;

sub Alexa_Routines_Utils_Initialize {
  my $hash = shift//return;
  return;
}

# Enter you functions below _this_ line.


sub newspamentrie {
my $cmdevice = shift // return; # FB_CALLMONITOR Name
my $fbdevice = shift; # FRITZBOX Name
my $sipdev = shift; # SIP Name
my $callforwardingnumber = shift; # call forwarding number
my $entries= fhem("get $cmdevice showPhonebookEntries 1",1); # read current Spambook
my @numbers = $entries =~ m/^.{3}(0\d+)/gm; # determine numbers
my $entriename = 'Spam'.(scalar(@numbers)+1); # new entriename Spam+number of numbers
my $entrienumber = (ReadingsVal($cmdevice,'external_number',-1) eq "$callforwardingnumber"?ReadingsVal($cmdevice,'internal_number','-1'):ReadingsVal($cmdevice,'external_number','-1')); # Don't use call forwarding number

my $sub = sub {
my $newentries = fhem("get $cmdevice showPhonebookEntries 1",1);#read updated Spambook
$newentries = join(',',$newentries =~ m/^.{3}(0\d+)/gm); # create comma separated list of numbers
fhem("sleep 2;attr -silent $sipdev sip_filter $newentries"); # push list in SIP-Device
};

fhem("set $fbdevice phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdevice rereadPhonebook"); # add last call to spam book and reread Phonebook
InternalTimer(gettimeofday() + 30, \&$sub, undef); # call Sub in 30s
}

1;


Den regulären Ausdruck zum ermitteln der Nummern hab ich angepasst.
Als ich mich das erste mal damit beschäftigt hatte kam bei einem showPhonebookEntries 1 :
Phonebook: Spam / Id: 1

   Number           Name
   -------------------------------
   04042236852   - Spam1
   04085599911    - Spam10
   0721509531027  - Spam11
   039155721386   - Spam12
   ...

Jetzt kommt hinter dem Name noch eine Nummer:

Phonebook: Spam / Id: 1

   Number           Name
   -------------------------------
   04042236852   - Spam1 [<122>]
   04085599911    - Spam10 [<140>]
   0721509531027  - Spam11 [<141>]
   039155721386   - Spam12 [<142>]
   ...

Spätestens beim 100. Eintrag im Spambook oder einer Nummer hinter dem Name mit 0+numerischer Wert als Inhalt hätte der bisherige reguläre Ausdruck versagt.


Wär cool wenn das jemand bei sich nachvollziehen würde.