FHEM Forum

FHEM => Automatisierung => Thema gestartet von: petervereecke am 08 April 2026, 19:07:47

Titel: length(string im notify
Beitrag von: petervereecke am 08 April 2026, 19:07:47
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
Titel: Aw: length(string im notify
Beitrag von: betateilchen am 08 April 2026, 19:41:33
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.
Titel: Aw: length(string im notify
Beitrag von: betateilchen am 08 April 2026, 20:05:37
Konkret gefragt:

Zitatmy $text = ReadingsVal("Anrufer_1_Telefonnummer","state","00");;

Was genau steht in dem reading "state" des device "Anrufer_1_Telefonnummer"?
Titel: Aw: length(string im notify
Beitrag von: petervereecke am 08 April 2026, 20:10:08
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
Titel: Aw: length(string im notify
Beitrag von: betateilchen am 08 April 2026, 20:17:13
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?
Titel: Aw: length(string im notify
Beitrag von: petervereecke am 08 April 2026, 20:23:14
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
Titel: Aw: length(string im notify
Beitrag von: petervereecke am 08 April 2026, 20:33:44
Ergebniss im Step 1 ist 02251866675 (Aber als Text)
Titel: Aw: length(string im notify
Beitrag von: betateilchen am 08 April 2026, 20:39:50
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?
Titel: Aw: length(string im notify
Beitrag von: petervereecke am 08 April 2026, 20:49:57
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
Titel: Aw: length(string im notify
Beitrag von: betateilchen am 08 April 2026, 20:58:49
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?
Titel: Aw: length(string im notify
Beitrag von: betateilchen am 08 April 2026, 20:59:43
Ich gebe auf, Du hast gewonnen.

Schönen Abend.
Titel: Aw: length(string im notify
Beitrag von: petervereecke am 08 April 2026, 21:05:48
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?
Titel: Aw: length(string im notify
Beitrag von: betateilchen am 08 April 2026, 21:09:27
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.
Titel: Aw: length(string im notify
Beitrag von: petervereecke am 08 April 2026, 21:19:21
Danke und für Deine Geduld.
Titel: Aw: length(string im notify
Beitrag von: betateilchen am 09 April 2026, 11:50:49
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.
Titel: Aw: length(string im notify
Beitrag von: Otto123 am 09 April 2026, 13:44:35
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.
Titel: Aw: length(string im notify
Beitrag von: Guybrush am 09 April 2026, 13:53:26
...mal davon abgesehen, dass #* auch definierte Bestandteile einer Nummer sein können und definitiv keine Zahl sind