FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: SGi am 10 Juni 2015, 13:16:24

Titel: [gelöst] DOIF - Verwendung von Arrayvariablen im Ausführungsteil
Beitrag von: SGi am 10 Juni 2015, 13:16:24
Hallo zusammen,

ich benutze seit längerem erfolgreich die an anderer Stelle beschriebene Anrufansage per Fritzbox, FHEM2FHEM und TTS-Modul.
Da die Rufnummern im Telefonbuch jedoch in der Form "Nachname, Vorname" abgelegt sind, wollte ich für die Ansage nun mit Hlfe eines split-Befehls den String teilen und über die entstandenen Array-Elemente die Reihenfolge in "Vorname Nachname" ändern.

Ich kriege es aber auch nach zahllosen Eck- und Schweifklammerversuchen nicht hin, das im Ausführungsteil des DOIF umzusetzen.
Entweder liefert FHEM eine Fehlermeldung der Kategorie "strict subs" oder ich bekomme die Variablennamen selbst angesagt.

Der String "Nachname, Vorname" steht in der Dummy-Variablen Anrufname. Ich habe nachfolgend der Übersichtlichkeit halber
alle zusätzlichen Klammern erst mal weggelassen. Daß ich z.B. die einzelnen Blöcke mit SPLIT und SET im DOIF selbst noch mal in () Klammerpaare setzen muß, ist mir klar.
Das gewünschte Konstrukt sieht vom Prinzip so aus (es geht nur um den Ausführungsteil):


DOIF (Bedingung) (my @Name=split(/,/,Anrufname),set JARVIS tts Anruf von $Name[1] $Name[0])


Geht so eine Operation (wegen der offenbar mehrfachen nötigen Wechsel der PERL/FHEM-Ebene) überhaupt direkt im DOIF oder muß ich den String vor Aufruf des DOIF zerlegen?
Den Split-Befehl muß ich ja vermutlich über {} rausheben, DOIF erwartet aber andererseits Readings oder Variablenargumente immer in [], hier also etwa [Name[0]].
Das führt beispielsweise aber zur Ansage von "Name[0]" und nicht des Inhalts davon.

Mag mir jemand mit DOIF- und PERL-Erfahrung mit einem syntaktischen "Klammertip" helfen ?
Oder aber sagen "geht nicht, mach's separat vorher" ? :-)

Vielen Dank !

Sven
Titel: Antw:DOIF - Verwendung von Arrayvariablen im Ausführungsteil
Beitrag von: Damian am 10 Juni 2015, 17:46:03
Zitat von: SGi am 10 Juni 2015, 13:16:24
Hallo zusammen,

ich benutze seit längerem erfolgreich die an anderer Stelle beschriebene Anrufansage per Fritzbox, FHEM2FHEM und TTS-Modul.
Da die Rufnummern im Telefonbuch jedoch in der Form "Nachname, Vorname" abgelegt sind, wollte ich für die Ansage nun mit Hlfe eines split-Befehls den String teilen und über die entstandenen Array-Elemente die Reihenfolge in "Vorname Nachname" ändern.

Ich kriege es aber auch nach zahllosen Eck- und Schweifklammerversuchen nicht hin, das im Ausführungsteil des DOIF umzusetzen.
Entweder liefert FHEM eine Fehlermeldung der Kategorie "strict subs" oder ich bekomme die Variablennamen selbst angesagt.

Der String "Nachname, Vorname" steht in der Dummy-Variablen Anrufname. Ich habe nachfolgend der Übersichtlichkeit halber
alle zusätzlichen Klammern erst mal weggelassen. Daß ich z.B. die einzelnen Blöcke mit SPLIT und SET im DOIF selbst noch mal in () Klammerpaare setzen muß, ist mir klar.
Das gewünschte Konstrukt sieht vom Prinzip so aus (es geht nur um den Ausführungsteil):


DOIF (Bedingung) (my @Name=split(/,/,Anrufname),set JARVIS tts Anruf von $Name[1] $Name[0])


Geht so eine Operation (wegen der offenbar mehrfachen nötigen Wechsel der PERL/FHEM-Ebene) überhaupt direkt im DOIF oder muß ich den String vor Aufruf des DOIF zerlegen?
Den Split-Befehl muß ich ja vermutlich über {} rausheben, DOIF erwartet aber andererseits Readings oder Variablenargumente immer in [], hier also etwa [Name[0]].
Das führt beispielsweise aber zur Ansage von "Name[0]" und nicht des Inhalts davon.

Mag mir jemand mit DOIF- und PERL-Erfahrung mit einem syntaktischen "Klammertip" helfen ?
Oder aber sagen "geht nicht, mach's separat vorher" ? :-)

Vielen Dank !

Sven

Das, was du hier vorhast ist reines Perl. Daher musst du alles in geschweifte Klammern packen, wie beim notify auch und dann gelten die Regeln der Perlwelt. Da bei Arrays in eckigen Klammern nur Zahlen vorkommen, erkennt DOIF das und wird es nicht durch ein Reading versuchen zu ersetzen.

({my @Name=split(/,/,ReadingsVal("Anrufname","state",""));;fhem("set JARVIS ....")})

Gruß

Damian
Titel: Antw:DOIF - Verwendung von Arrayvariablen im Ausführungsteil
Beitrag von: SGi am 10 Juni 2015, 22:19:10
Hallo Damian,

diverse Varianten mit {} und dementsprechend ReadingsVal etc. hatte ich auch schon probiert, war aber noch nicht auf den Trichter gekommen, alles innerhalb der Ausführung nur in eine komplette Gesamt-{} zu fassen.

Jetzt gehts, vielen Dank !

Sven