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

TomLee

Hallo,

wie würde das denn ein erfahrener Programmierer angehen?

FHEM blockiert für die Zeit eines rereadPhonebook, danach geht es direkt weiter mit einem cmdalias (fonbook2sipfilter) der die getPhonebookEntrieswritesip Funktion aufruft.

sub newspamentry {
my $cmdev = shift // return;    # FB_CALLMONITOR Name
my $fbdev = shift;            # FRITZBOX Name
my $entries= fhem("get $cmdev showPhonebookEntries 1",1);    # read current Spambook
my @numbers = $entries =~ m/(0\d+)/gm;                        # determine numbers
my $entriename = 'Spam'.(scalar(@numbers)+1);                # new entriename Spam+number numbers
Debug $entriename;
my $entrienumber = (ReadingsNum($cmdev,'external_number',-1) == 123456 ? ReadingsVal($cmdev,'internal_number','-1'):ReadingsVal($cmdev,'external_number','-1'));    # Don't use call forwarding number
Debug $entrienumber;
fhem("set $fbdev phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdev rereadPhonebook;fonbook2sipfilter");
}


sub getPhonebookEntrieswritesip {
my $cmdev     = shift;
my $sipdev     = shift;
my $strnrs     = fhem("get $cmdev showPhonebookEntries 1",1);
#Debug $strnrs;
fhem("sleep 2;attr $sipdev sip_filter ".join(",",$strnrs =~ m/(0\d+)/gm));
}

Das klappt alles wie ich mir vorstelle und über den "Umweg" cmdalias fand ich das bisher eigentlich auch gut gelöst.

Was mich jetzt bewegt nachdem ich mir den Code mal wieder anschaue: Wie, wenn nicht über den cmdalias, könnte ich denn dafür sorgen das die Funktion getPhonebookEntrieswritesip, direkt nach dem blockieren aufgerufen wird? Das geht doch gar nicht (edit: aufgrund der Abfolge) auf Perlebene, nur im FHEM-Kontext?

Wenn die Bedingung wäre alles in einer Sub umzusetzen, ginge das?
Das der zweite Aufruf von showPhonebookEntries in einem eigenen "Scope/Kontext" nach_dem_blockieren aufgerufen wird?

Kann da bitte wer was zu sagen ?

Gruß Thomas

TomLee

ZitatDas klappt alles wie ich mir vorstelle und über den "Umweg" cmdalias fand ich das bisher eigentlich auch gut gelöst.

Bin halt kein Programmierer, nachdem ich mich heute weiter mit beschäftigt habe, komm ich mit meinem Verständnis zu dem Schluss, das hier der "Umweg" über cmdalias (weiterer Sub-Aufruf im FHEM-Kontext) eine akzeptable Lösung ist wenn FHEM blockiert. Es geht einfach da weiter wo aufgehört wurde.
Wsl. 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.

JoWiemann

Hallo Thomas,

wenn eine Perl Sub, und dass gilt auch für eine set ..., aufgerufen wird und diese blockierend programmiert ist, dann wartet die Ausführung auf die Rückkehr aus der Sub und macht dann mit der nächsten Programmzeile weiter.

Da fhem() blockierend ist und showPhonebookEntries blockierend ist, wartet fhem() auf showPhonebookEntries.

Das von Dir geschilderte Problem gibt es nur bei einem nicht blockierenden Aufruf.

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

Zitat... dann wartet die Ausführung auf die Rückkehr aus der Sub und macht dann mit der nächsten Programmzeile weiter.

Weiß nicht.. Das ist doch gerade eben nicht so?
Nach dem rereadPhonebook in dem FHEM-Befehl der Sub newspamentry blockiert FHEM. Mit dem nachfolgenden cmdalias geht die Befehlsabfolge in der  fhem-Funktion nach dem blockieren weiter.
Alle Zeilen (zumindest hab ich es so nachgestellt) welche nach dem FHEM-Befehl kommen würden, werden nicht mehr ausgeführt.
(Bzw./oder ist es nicht so, das Fhem zwar blockiert, der Perl-Script-Ausführungsfluss aber schon weitergeführt wird, FHEM davon bloss nix mitbekommt? Ich weiß es halt nicht (genau), darum frag ich ja.)

Schau das Log zu meinem Beispiel aus dem ersten Post, alles funzt wie vorgesehen:
2024.12.02 13:40:04 3: [cm_xxx | Get.290] - EVENT: get cm_xxx showPhonebookEntries 1
2024.12.02 13:40:04 1: DEBUG>sipnumbers015783050318,04085599911,0721509531027...
2024.12.02 13:40:04 1: DEBUG>Spam29
2024.12.02 13:40:04 1: DEBUG>123456
2024.12.02 13:40:04 3: [Fritzbox1 | 7490 | 113.07.57 | Set.2124] - BASIC:set Fritzbox1 phoneBookEntry new 1 0 Spam29 work: 123456
2024.12.02 13:40:09 3: set Fritzbox1 phoneBookEntry new 1 0 Spam29 work: 123456;sleep 2;set cm_xxx rereadPhonebook;fonbook2sipfilter : set new phonebook entry: Spam29 with NewPhonebookEntryUniqueID: 191
2024.12.02 13:40:09 3: {newspamentry('cm_xxx','Fritzbox1','sip_Telefon')} : set new phonebook entry: Spam29 with NewPhonebookEntryUniqueID: 191
2024.12.02 13:40:11 3: [cm_xxx | Set.427] - EVENT: set cm_xxx rereadPhonebook
2024.12.02 13:40:28 3: [cm_xxx | readPhonebook.1410] - EVENT: read 0 contacts from remote phonebook "Telefonbuch"
2024.12.02 13:40:29 3: [cm_xxx | readPhonebook.1410] - EVENT: read 29 contacts from remote phonebook "Spam"
2024.12.02 13:40:31 3: [cm_xxx | readPhonebook.1410] - EVENT: read 191 contacts from remote phonebook "Mobil"
2024.12.02 13:40:34 3: [cm_xxx | readPhonebook.1410] - EVENT: read 123 contacts from remote phonebook "Iphone-Kontakte"
2024.12.02 13:40:37 3: [cm_xxx | Get.290] - EVENT: get cm_xxx showPhonebookEntries 1
2024.12.02 13:40:37 3: get cm_xxx showPhonebookEntries 1 : Phonebook: Spam / Id: 1

   Number           Name
   -------------------------------
   015783050318   - Spam1 [<122>]
   04085599911    - Spam10 [<140>]
   0721509531027  - Spam11 [<141>]
   ...

2024.12.02 13:40:40 1: Timeout for SIP_ListenStart reached, terminated process 538047

Wie man sieht wird nach dem rereadPhonebook (blockieren) auch der cmdalias ausgeführt, das sip_filter Attribut auch gesetzt:
...
2024.12.02 13:40:37 3: [cm_xxx | Get.290] - EVENT: get cm_xxx showPhonebookEntries 1
2024.12.02 13:40:37 3: get cm_xxx showPhonebookEntries 1 : Phonebook: Spam / Id: 1
...


Wenn es sich so verhalten würde wie Du beschreibst, dann müsste ja sowas klappen:
...
fhem("set $fbdevice phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdevice rereadPhonebook");
my $newentries = fhem("get $cmdevice showPhonebookEntries 1",1);
$newentries = join(",",$newentries =~ m/(0\d+)/gm);
fhem("sleep 2;attr $sipdev sip_filter $newentries ");

Aber alles was in der Sub nach der ersten fhem-Funktion deklariert ist, wird nicht mehr ausgeführt nach dem blockieren.

Hier das Log dazu, nach dem rereadPhonebook passiert nix mehr:
2024.12.02 13:30:56 3: [cm_xxx | Get.290] - EVENT: get cm_xxx showPhonebookEntries 1
2024.12.02 13:30:56 1: DEBUG>sipnumbers015783050318,04085599911,0721509531027...
2024.12.02 13:30:56 1: DEBUG>Spam28
2024.12.02 13:30:56 1: DEBUG>123456
2024.12.02 13:30:56 3: [Fritzbox1 | 7490 | 113.07.57 | Set.2124] - BASIC:set Fritzbox1 phoneBookEntry new 1 0 Spam28 work: 123456
2024.12.02 13:31:02 3: set Fritzbox1 phoneBookEntry new 1 0 Spam28 work: 123456;sleep 2;set cm_xxx rereadPhonebook : set new phonebook entry: Spam28 with NewPhonebookEntryUniqueID: 189
2024.12.02 13:31:02 3: {newspamentry('cm_xxx','Fritzbox1','sip_Telefon')} : set new phonebook entry: Spam28 with NewPhonebookEntryUniqueID: 189
2024.12.02 13:31:04 3: [cm_xxx | Set.427] - EVENT: set cm_xxx rereadPhonebook
2024.12.02 13:31:19 3: [cm_xxx | readPhonebook.1410] - EVENT: read 0 contacts from remote phonebook "Telefonbuch"
2024.12.02 13:31:20 3: [cm_xxx | readPhonebook.1410] - EVENT: read 28 contacts from remote phonebook "Spam"
2024.12.02 13:31:24 3: [cm_xxx | readPhonebook.1410] - EVENT: read 191 contacts from remote phonebook "Mobil"
2024.12.02 13:31:26 3: [cm_xxx | readPhonebook.1410] - EVENT: read 123 contacts from remote phonebook "Iphone-Kontakte"



JoWiemann

Hm,

das wird durch folgende Programmzeile verursacht:
fhem("sleep 2;attr $sipdev sip_filter ".join(",",$strnrs =~ m/(0\d+)/gm));
Ein sleep in einem fhem() Aufruf führt zum non Blocking Aufruf der nachfolgenden Befehle im fhem() Aufruf. Damit bist Du nicht mehr in der sequentiellen Ausführung, sondern in der parallelen Ausführung.

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

Zitat von: JoWiemann am 02 Dezember 2024, 15:35:29Hm,

das wird durch folgende Programmzeile verursacht:
Code Auswählen Erweitern
fhem("sleep 2;attr $sipdev sip_filter ".join(",",$strnrs =~ m/(0\d+)/gm));

Glaube wir reden aneinander vorbei :-\
Die Zeile die Du zeigst stammt aus der Sub die von dem cmdalias aufgerufen wird. Und wie gesagt funzt die Lösung genauso wie ich mir das vorgestellt und die Abläufe bisher verstanden habe.

Bleiben wir mal dabei:
Zitat...dann wartet die Ausführung auf die Rückkehr aus der Sub und macht dann mit der nächsten Programmzeile weiter.
und dem Beispiel das ich dazu gezeigt habe, welches demnach dann doch funktionieren sollte:
Zitat von: TomLee am 02 Dezember 2024, 14:17:38Wenn es sich so verhalten würde wie Du beschreibst, dann müsste ja sowas klappen:
Code Auswählen Erweitern
...
fhem("set $fbdevice phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdevice rereadPhonebook");
my $newentries = fhem("get $cmdevice showPhonebookEntries 1",1);
$newentries = join(",",$newentries =~ m/(0\d+)/gm);
fhem("sleep 2;attr $sipdev sip_filter $newentries ");

Nochmal dann komplett:
sub newspamentry {
my $cmdevice = shift // return;
my $fbdevice = shift;
my $sipdev = shift;
my $entries= fhem("get $cmdevice showPhonebookEntries 1",1);
my @numbers = $entries =~ m/(0\d+)/gm;
my $sipnumbers = join(",",@numbers);
Debug 'sipnumbers'.$sipnumbers;
my $entriename = 'Spam'.(scalar(@numbers)+1);
Debug $entriename;
my $entrienumber = (ReadingsNum($cmdevice,'external_number',-1) == 123456 ? ReadingsVal($cmdevice,'internal_number','-1'):ReadingsVal($cmdevice,'external_number','-1'));
Debug $entrienumber;
#my $sub = sub {
#    my $newentries = fhem("get $cmdevice showPhonebookEntries 1",1);
#    $newentries = join(",",$newentries =~ m/(0\d+)/gm);
#    Debug 'newentries '.$newentries;
#    fhem("attr $sipdev sip_filter $newentries");
    #    };
fhem("set $fbdevice phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdevice rereadPhonebook");
my $newentries = fhem("get $cmdevice showPhonebookEntries 1",1);
Debug $newentries;
$newentries = join(",",$newentries =~ m/(0\d+)/gm);
Debug $newentries;
fhem("sleep 2;attr $sipdev sip_filter $newentries");
}

Kannst mir bitte erläutern, was genau hier die Ursache dafür ist, das die Debug-Ausgaben und der folgende fhem-Funktionsaufruf, nach dem ersten fhem-Funktionsaufruf, nicht ausgeführt werden?

Ich bin immer noch dabei:
Zitat(Bzw./oder ist es nicht so, das Fhem zwar blockiert, der Perl-Script-Ausführungsfluss aber schon weitergeführt wird, FHEM davon bloss nix mitbekommt? Ich weiß es halt nicht (genau), darum frag ich ja.)

Wie, wenn nicht über den cmdalias, komm ich in der Sub an die aktualisierte "Liste" nach einem rereadPhonebook?

Sry wenn ich mich zu doof anstelle, es ist aber bestimmt auch nicht einfach alle Zusammenhänge zu verstehen.


TomLee

Wie lange blockiert wird, vermute ich (weiß es aber nicht), ist hier nicht unbedingt relevant ...
Mir kommt aber gerade das ich vlt. erwähnen sollte,  das mein System (Pi4) rd. 20 Sekunden blockiert bei dem rereadPhonebook.

JoWiemann

Hallo,

der Reihe nach, damit ich Dich verstehe.
Ist das der erste fhem() Aufruf, nachdem die Abarbeitung nicht mehr durchgeführt wir: my $entries= fhem("get $cmdevice showPhonebookEntries 1",1);

oder sprichst Du von diesem Aufruf: fhem("set $fbdevice phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdevice rereadPhonebook");

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

Kurz:

von dem zweiten ...
edit:sorry, den Aufruf ganz oben hab ich irgendwie ignoriert...

(ich mag doch eigentlich nur den cmdalias ersetzen in meiner 99_.*Utils.pm, am liebsten in nur einer Sub umgesetzt und keine zwei Subs/Routinen dafür benötigen)

TomLee

Das funzende Beispiel aus meinem ersten Post muss ja nicht die Basis sein für die im Threadttitel genannte Aufgabe. Der FHEM-Kasper hat sich das zusammengepuzzelt.

Wie würdest du die Aufgabe angehen, angenommen die wäre, einen setter in einem Deiner Module dafür bereitzustellen?

Bei mir triggert die Routine bspw. ein Sprachbefehl (Alexa-Routine->"Rufnummer sperren")

JoWiemann

Hier ein Beispiel zur Erklärung:

Zunächst einen Dummy definieren:
defmod sleepDummy dummy
attr sleepDummy readingList schlafe_1 schlafe_2 schlafe_3 schlafe_4

sub TestSleep() {

fhem("sleep 10; set sleepDummy schlafe_1 10; set sleepDummy schlafe_2 10");
# fhem() wird aufgerufen und die beiden Kommandos werden durch sleep in eine 10 Sekunden Warteschleife gestellt
# nach dem Einstellen in die Warteschleife kommt die Funktion fhem() sofort zurück

fhem("sleep 5; set sleepDummy schlafe_3 5");
# fhem() wird aufgerufen und nur das eine Kommando wird in die Warteschleife gestellt
# nach dem Einstellen in die Warteschleife kommt die Funktion fhem() sofort zurück

fhem("set sleepDummy schlafe_4 nicht");
# fhem() wird "gefühlt" sofort ausgeführt
}

Das ganze kannst Du gut in den Timestamps der readings beobachten. Ich hoffe, dass beantwortet Deine Frage.

PS: siehe auch die Beschreibung von sleep in der commandRef: https://fhem.de/commandref_DE.html#sleep

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

Danke für die Mühe des Beispielscodes zum nachstellen. Das ist aber alles klar.


ZitatKannst mir bitte erläutern, was genau hier die Ursache dafür ist, das die Debug-Ausgaben und der folgende fhem-Funktionsaufruf, nach dem ersten fhem-Funktionsaufruf, nicht ausgeführt werden?
Hab den Grund dazu gefunden. In meinem Code hatte ich noch ein return vor:
fhem("set $fbdevice phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdevice rereadPhonebook");...
Darum wurde danach nix mehr ausgeführt  ::)

Die Frage ist und bleibt aber wie man es ohne cmdalias hinbekommt, der ist ja der Schlüssel dafür, das wenn man in der parallelen Ausführung ist, direkt nach dem blockieren weitergemacht werden kann.

Mit einer Verzögerung größer der Blockierungszeit käme man an die aktualisierte Liste und könnte das Attribut setzen. Problem dabei ist, das join wird ja aber immer "sofort" bei Aufruf der Sub ausgeführt:
...
fhem("set $fbdevice phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdevice rereadPhonebook");
my $newentries = fhem("sleep 30;get $cmdevice showPhonebookEntries 1",1);
Debug $newentries;
$newentries = join(",",$newentries =~ m/(0\d+)/gm);
Debug $newentries;
fhem("sleep 31;attr $sipdev sip_filter $newentries");
...


Man könnte das holen der aktualisierten Liste auch in eine anonyme Sub auslagern. Doch wie bekommt man die erst nach dem rereadPhonebook in dem zweiten fhem()-Funktions aufgerufen?
sub newspamentry {
my $cmdevice = shift // return;
my $fbdevice = shift;
my $sipdev = shift;
my $entries= fhem("get $cmdevice showPhonebookEntries 1",1);
my @numbers = $entries =~ m/(0\d+)/gm;
my $sipnumbers = join(",",@numbers);
Debug 'sipnumbers'.$sipnumbers;
my $entriename = 'Spam'.(scalar(@numbers)+1);
Debug $entriename;
my $entrienumber = (ReadingsNum($cmdevice,'external_number',-1) == 123456 ? ReadingsVal($cmdevice,'internal_number','-1'):ReadingsVal($cmdevice,'external_number','-1'));
Debug $entrienumber;
my $sub = sub {
    my $newentries = fhem("get $cmdevice showPhonebookEntries 1",1);
$newentries = join(",",$newentries =~ m/(0\d+)/gm);
Debug 'newentries '.$newentries;
fhem("sleep 2;attr $sipdev sip_filter $newentries");
};


#return fhem("set $fbdevice phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdevice rereadPhonebook;fonbook2sipfilter");
fhem("set $fbdevice phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdevice rereadPhonebook");
return $sub->();
}


TomLee

Jetzt war die Freude schon groß, das es mit InternalTimer klappen sollte. Ätschi, Bätschi!

Egal was ich angebe, die anonyme Sub wird immer 6 Sekunden nach Aufruf der newspamentry-Funktion ausgeführt:

sub newspamentry {
my $cmdevice = shift // return;
my $fbdevice = shift;
my $sipdev = shift;
my $entries= fhem("get $cmdevice showPhonebookEntries 1",1);
my @numbers = $entries =~ m/(0\d+)/gm;
my $sipnumbers = join(",",@numbers);
Debug 'sipnumbers'.$sipnumbers;
my $entriename = 'Spam'.(scalar(@numbers)+1);
Debug $entriename;
my $entrienumber = (ReadingsNum($cmdevice,'external_number',-1) == 123456 ? ReadingsVal($cmdevice,'internal_number','-1'):ReadingsVal($cmdevice,'external_number','-1'));
Debug $entrienumber;
my $sub = sub {
    my $newentries = fhem("get $cmdevice showPhonebookEntries 1",1);
$newentries = join(",",$newentries =~ m/(0\d+)/gm);
Debug 'newentries '.$newentries;
fhem("sleep 2;attr $sipdev sip_filter $newentries");
};

fhem("set $fbdevice phoneBookEntry new 1 0 $entriename work: $entrienumber;sleep 2;set $cmdevice rereadPhonebook");
InternalTimer(30, $sub->(), undef);
}

frober

Hallo Thomas,

wenn ich das richtig sehe, kannst du bei InternalTimer nicht einfach 30(s) angeben.
Lt. https://wiki.fhem.de/wiki/DevelopmentModuleAPI#Timer

müsste das so gettimeofday() + 30 heißen. D.h. InternalTimer benötigt einen timestamp!

Grüße
Bernd
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

Habs halt probiert. Mit {time + 30}, {gettimeofday() + 30} und einfach nur der Sekundenangabe.

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.