Hallo Community,
habe aktuell etwas Zeit und bin wieder an meinem Lieblingsprojekt: KNX -- FHEM -- SIP
Über eine VISU wird mittels 0/5/1:dpt16 die Telefonummer an FHEM übergeben.
Diese wird natürlich als String übergeben...beim umwandeln geht die führende 0 verloren...soweit korrekt
hilft mir aber nicht weiter...über die Stringlänge kann man das fixen...
Hintergrund wäre die Rufnummer direkt in den SIP Befehl zu intergrieren.
Habe mir folgenden notify ausgedacht (der in Teilen auch funktioniert -- bin ja Perl und FHEM Anfänger??
define Telefonummer notify Anrufer_1_Telefonnummer:.* { my $text = ReadingsVal("Anrufer_1_Telefonnummer","state","00");; $text = $text + 0;; $text = sprintf("%0"."length($text"."d", $text);; fhem("setreading Telnr state $text");; }
Wenn ich an der Stelle "length($text)" zum Beispiel "12" (bei entsprechender Länge des Strings einsetze) dann funktioniert das ganze
Kann ich den %0(länge des Strings)d im sprintf irgendwie automatisieren?
Habe schon einige Versuche (20-25) hinter mir...vielleicht kann mir einer der Profis einen Tipp geben?
VG Peter
Da fehlt zumindest mal eine schließende Klammer an der Funktion length().
Genau verstanden, was Du da machen möchtest, habe ich auch nach mehrfachem Lesen noch nicht.
Beschreibe doch mal ein konkretes Beispiel mit Eingangswerten und was Du daraus gerne als Ergebnis haben möchtest.
Konkret gefragt:
Zitatmy $text = ReadingsVal("Anrufer_1_Telefonnummer","state","00");;
Was genau steht in dem reading "state" des device "Anrufer_1_Telefonnummer"?
Hallo betateilchen :-)
Die abschliessende Klammer war beim kopieren verloren gegangen...sorry dafür
Also ich möchte die Telefonummer als Zahl.
Über das notify wird wird bei einer Änderung der "Anrufer_1_Telefonummer" (String vom KNX kommend) zum Beispiel 02251866675
zuerst der Text übertragen dieser dann über; $text = $text + 0 in eine Zahl mit abgeschnittender 0 am Anfang gewandelt zum Beispiel 2251866675
im $text = sprintf("%012d, $text) würde ich dann gerne die führende 0 wieder einfügen. da aber %0xxd xx von der Länge der Rufnummer abhängig
ist würde ich das xx gerne über length($text) ermitteln.
Hoffe aber mich etwas verständlicher ausgedrückt...?
VG
Vermutlich denkst Du viel zu kompliziert.
Das mit dem $text+0 kannst Du Dir sparen, wenn Du statt ReadingsVal() die Funktion ReadingsNum() verwendest.
Zitat von: petervereecke am 08 April 2026, 20:10:08zuerst der Text übertragen
Welcher Text kommt denn da tatsächlich an? Ich denke, da kommt "02251866675" an?
Perl unterscheidet nicht großartig zwischen "Zahl" und "Text".
Warum/wozu brauchst Du die Telefonnummer als "Zahl"?
Was spricht denn gegen die Variante:
{my $text = ReadingsVal("Anrufer_1_Telefonnummer","state","00");; fhem("setreading Telnr state $text");;}
Was bekommst Du da als Ergebnis?
Also bin ja kein Profi in Perl und Fhem aber meines erachtens ist dies nur Text...?
Ich bräuchte aber für das einsetzen in den SIP Befehl die Telefonummer als Zahl -- so jedenfalls die Vermutung
Ergebniss im Step 1 ist 02251866675 (Aber als Text)
Ich verstehe immer noch nicht, was Du als Ergebnis möchtest.
Vergiss doch mal bitte das verkrampfte Denken in "Zahl" und "Text".
fhem("setreading Telnr state $text")
Was soll da als das von Dir erwartete Ergebnis rauskommen?
Also was soll im device "Telnr" im reading "state" stehen?
Ich möchte in Telnr die Telefonnummer als Zahl die ich später in
define Anruf_Text_Changed notify VAR_Nachrichten_Text:.* set mySIP call 01714......7 30 !$EVENT
einfügen möchte.
Sprich die VISU überträgt über das KNX Objekt die Telefonnummer (String) den ich später anrufen möchte
Zitat von: petervereecke am 08 April 2026, 20:49:57Ich möchte in Telnr die Telefonnummer als Zahl
WARUM? nur, um daraus dann wieder einen String zu machen?
Perl ist es in diesem Kontext pupsegal, ob Text oder Zahl, das wird nicht unterschieden.
Ist das wirklich so schwer zu begreifen?
Ich gebe auf, Du hast gewonnen.
Schönen Abend.
Sorry wenn ich mich etwas blöd anstelle...und dich verärgere
sicherlich muss man das nicht umwandeln.
Die Frage die sich mir final stellt:
Kann ich im SIP Befehl die Rufnummer als als String übergeben?
Zum 728. Mal: perl unterscheidet das nicht.
Probier es doch einfach aus.
Nein, Du verärgerst mich nicht. Irgendwann ist es mir halt nur noch egal.
Danke und für Deine Geduld.
Zitat von: betateilchen am 08 April 2026, 20:58:49Perl ist es in diesem Kontext pupsegal, ob Text oder Zahl, das wird nicht unterschieden.
Vielleicht wird das so klarer:
Der Aufruf folgender Funktion in der 99_myUtils.pm
sub ii {
my $text = "12345";
Debug "Das ist eine Ausgabe mit TEXT: $text";
$text = 12345;
Debug "Das ist eine Ausgabe mit ZAHL: $text";
return;
}
liefert im Logfile:
2026.04.09 11:47:52 1: DEBUG>Das ist eine Ausgabe mit TEXT: 12345
2026.04.09 11:47:52 1: DEBUG>Das ist eine Ausgabe mit ZAHL: 12345
Also zerbrich Dir nicht unnötig den Kopf über Datentypen oder Typkonvertierungen.
Im Zusammenhang mit Telefonnummern über Zahl nachzudenken ist meines Erachtens völlig am Thema vorbei. Eine Rufnummer ist genau genommen keine Zahl (auch wenn sie so aussehen kann) sondern immer im datentechnischen Begriff ein Text bzw. String.
Insofern ist doch das, was die KNX da liefert exakt richtig? Warum sollte man das wandeln? Oder habe ich das falsch verstanden?
Der im ersten Post verwendete Code gibt doch auch das richtige zurück? Abgewandelt zum Test:
{ my $text = ReadingsVal("Anrufer_1_Telefonnummer","state","004934112345678");;return $text}In der Hilfe zu SIP steht auch: "Nummer" nicht Zahl :)
Zitatset <name> call <nummer> [<maxtime>] [<nachricht>]
Damit es dann auch wirklich wählt, müsste man noch beachten, ob man die Anlagen Rufkonfiguration berücksichtigen muss! Braucht sie die komplette Nummer oder kommt sie mit "Abkürzungen" zurecht?
Beispiele
004934112345678 wäre eine Nummer die überall aus der Welt die Rufnummer 12345678 in Deutschland Leipzig anruft. (Landesvorwahl 0049)
034112345678 wäre eine Nummer die in Deutschland die Rufnummer 12345678 in Leipzig anruft. (Ortsvorwahl 0341)
12345678 wäre eine Nummer die in Leipzig die Rufnummer 12345678 in Leipzig anruft.
Gruß Otto
Vorausgesetzt die jeweilige "Anlage" ist im jeweiligen Ortsnetzt richtig konfiguriert.
...mal davon abgesehen, dass #* auch definierte Bestandteile einer Nummer sein können und definitiv keine Zahl sind