Hauptmenü

DOIF mit Perl Variable

Begonnen von SizZle, 10 Mai 2016, 23:18:07

Vorheriges Thema - Nächstes Thema

SizZle

Hallo zusammen,

ich hatte mein Problem schon im Anfängerforum gepostet, leider ohne Erfolg.
Vielleicht ist mein Thema hier besser angesiedelt:

Ich arbeite momentan an einer Visualisierung von Telefonanrufen mit einem RGB LED Streifen. Dieser soll bei einer bestimmten Anrufergruppe in einer bestimmten Farbe blinken.
Also abhängig vom Namen aus dem Fritzbox Telefonbuch gibt es jeweils ein DOIF, welches den LED Streifen blinken lässt, solange das Telefon klingelt.

Das Blinken klappt mittlerweile ohne Probleme. Leider hänge ich noch an einer Herausforderung, den ursprünglichen Zustand wiederherzustellen.
Ist der LED Streifen aus, dann tut alles was es soll. Wenn der LED Streifen aber vor einem Anruf an war, ist er nach dem Klingeln nach der DOIF Definition wieder aus.

Vorgestellt hatte ich mir die Lösung meines Problems etwa so, dass ich als erstes den zustand in Variable speicher und nach dem Klingeln den Zustand durch die Variablen wiederherstelle.
So sieht mein bisheriger Versuch aus:
([Fritz_Box:event] eq "ring" and [Fritz_Box:external_name] eq "<Name>")({
my $LED8hue= ReadingsVal("LED_8", "hue", "");
my $LED8saturation= ReadingsVal("LED_8", "saturation", "");
my $LED8brightness= ReadingsVal("LED_8", "brightness", "");
fhem("set LED_8 HSV 118,95,63 1 q;set LED_8 HSV 118,95,0 1 q")
})DOELSEIF(
[Fritz_Box:external_name] eq "<Name>")(
(set LED_8 HSV $LED8hue,$LED8saturation,$LED8brightness 1 q)
)


Leider funktioniert das so aber nicht. Nichtmal das Blinken geht mehr. Daher tippe ich mal auf einen Syntaxfehler.
Was die Perl Themen angeht bin ich leider noch blutiger Anfänger, daher habt bitte für "Dummheitsfehler" Verständnis :)

Wenn mir hierfür jemand einen Tipp geben könnte, wie ich mein Problem lösen könnte, wäre ich sehr dankbar!

igami

Variablen sind nur innerhalb der geschweiften Klammer gültig in der sie definiert wurden. Du definierst sie im DOIF Teil und willst im DOELSEIF Teil darauf zugreifen. Die beiden Teile haben aber nichts miteinander zu tun.

Du kannst den alten Zustand mittels setreading in das Device schreiben

...
  setreading LED_8 lastHue [LED_8:hue],
...


Zum Abrufen im DOELSEIF dann

...
(set LED_8 HSV [LED_8:lastHue],[...],[...] 1 q)
)


Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Ellert

Zitat(set LED_8 HSV $LED8hue,$LED8saturation,$LED8brightness 1 q)

Befehle werden durch Kommata getrennt. Wenn Sie selbst Kommata enthalten, dann müssen die Befehle zusätzlich mit einer runden Klammern umschlossen werden, s. http://fhem.de/commandref_DE.html#DOIF_Angaben_im_Ausfuehrungsteil

Zitat((set LED_8 HSV $LED8hue,$LED8saturation,$LED8brightness 1 q))

CoolTux

Das hat er ja. Er hat nur ne beschissene Formatierung  :D
Eine Runde Klammer oben und eine darunter.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Allerdings zählt das, was igami geschrieben hat. Perlvariablen auf der FHEM-Ebene gibt es nicht. Der Gültigkeitsbereich beschränkt sich auf {...}. Irgendwelche FHEM-Interna für globale Variablen würde ich nicht empfehlen, stattdessen Dinge mit setreading in Readings merken.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Dem stimme ich uneingeschränkt zu.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

SizZle

Nichts gegen meine beschissene Formatierung :P

Vielen Dank an igami für den entscheidenden Hinweis!!!

Habe nun folgenden DOIF für den Telefonblinker:

([Fritz_Box:event] eq "ring" and [Fritz_Box:external_name] eq "<NAME>")(
(setreading LED_8 lastHue [LED_8:hue])
(setreading LED_8 lastsaturation [LED_8:saturation])
(setreading LED_8 lastbrightness [LED_8:brightness])
(set LED_8 HSV 118,95,63 1 q)
(set LED_8 HSV 118,95,0 1 q)
(set LED_8 HSV [LED_8:lastHue],[LED_8:lastsaturation],[LED_8:lastbrightness] 0 q)
)DOELSEIF([Fritz_Box:external_name] eq "<NAME>")(
(set LED_8 HSV [LED_8:lastHue],[LED_8:lastsaturation],[LED_8:lastbrightness] 1 q)
)


Die letzte Zeile vor dem DOELSEIF ist allerdings eine unschöne Lösung...
Die musste ich setzen, da wegen der mehrfachen Ausführung des DOIFs die readings ja beim 2. Durchlauf auf aus gestellt werden... Ist ja dann auhc nicht sinn der Sache :)

Hat da vielleich jemand einen eleganteren Ansatz?
Gerne auch mit Verbesserungsvorschlägen der Formatierung

CoolTux

Ich habe etwas ähnliches, nur nicht mit Licht sondern mit Durchsage wer anruft.
Persönlich würde ich sowas, und habe es auch, in eine eigene Sub stopfen und einfach ein notify basteln welches die Sub aufruft und dann weiter die Sache auswertet.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

igami

Man muss zwar einzelne Befehle in extra Klammern packen wenn in ihnen ein Komma vorkommt, aber ansonsten dürfen die Befehle auch mit einem Komma abgegrenzt werden.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Damian

Zitat von: SizZle am 11 Mai 2016, 18:29:34
Nichts gegen meine beschissene Formatierung :P

Vielen Dank an igami für den entscheidenden Hinweis!!!

Habe nun folgenden DOIF für den Telefonblinker:

([Fritz_Box:event] eq "ring" and [Fritz_Box:external_name] eq "<NAME>")(
(setreading LED_8 lastHue [LED_8:hue])
(setreading LED_8 lastsaturation [LED_8:saturation])
(setreading LED_8 lastbrightness [LED_8:brightness])
(set LED_8 HSV 118,95,63 1 q)
(set LED_8 HSV 118,95,0 1 q)
(set LED_8 HSV [LED_8:lastHue],[LED_8:lastsaturation],[LED_8:lastbrightness] 0 q)
)DOELSEIF([Fritz_Box:external_name] eq "<NAME>")(
(set LED_8 HSV [LED_8:lastHue],[LED_8:lastsaturation],[LED_8:lastbrightness] 1 q)
)


Die letzte Zeile vor dem DOELSEIF ist allerdings eine unschöne Lösung...
Die musste ich setzen, da wegen der mehrfachen Ausführung des DOIFs die readings ja beim 2. Durchlauf auf aus gestellt werden... Ist ja dann auhc nicht sinn der Sache :)

Hat da vielleich jemand einen eleganteren Ansatz?
Gerne auch mit Verbesserungsvorschlägen der Formatierung

Die Befehle einzeln in Klammern zu packen ist keine gute Idee, wenn sie nicht einzeln verzögert werden sollen. Damit produzierst du Zwischenzustände, die jeweils Events produzieren und damit dein System unnötig belasten. Daher einfach definieren:

...
(setreading LED_8 lastHue [LED_8:hue],
setreading LED_8 lastsaturation [LED_8:saturation],
setreading LED_8 lastbrightness [LED_8:brightness],
set LED_8 HSV 118,95,63 1 q,
set LED_8 HSV 118,95,0 1 q)
....

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF