length(string im notify

Begonnen von petervereecke, 08 April 2026, 19:07:47

Vorheriges Thema - Nächstes Thema

petervereecke

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Konkret gefragt:

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

Was genau steht in dem reading "state" des device "Anrufer_1_Telefonnummer"?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

petervereecke

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

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

petervereecke

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

petervereecke

Ergebniss im Step 1 ist 02251866675 (Aber als Text)

betateilchen

#7
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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

petervereecke

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

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Ich gebe auf, Du hast gewonnen.

Schönen Abend.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

petervereecke

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?

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

petervereecke

Danke und für Deine Geduld.

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!