Aufruf mehrerer set-Befehle in einer Unterfunktion mit mehreren Parametern

Begonnen von marcy_pb, 05 Oktober 2017, 15:10:29

Vorheriges Thema - Nächstes Thema

marcy_pb

Hallo zusammen,

für ein LED Status-Anzeigeboard führe ich in einem DOIF für viele Fälle immer wieder ähnlichen Befehle aus. Um dies zu vereinfachen, möchte ich gerne die Aufrufe der "set"-Befehle in eine Funktion überführen und mit Übergabeparametern aufrufen.

Beim eintretenden Ereignis wird einen Dummy auf einen Wert gesetzt (zB: "100 0 0") und ruft ein ECMDDevice mit einem Skript auf (zB: "ChangeColorToOnLedTest 100 0 0 10" (wobei "100 0 0" ist ein RGB Code und "10" die Nummer der LED ist))

Auszug zu dem, was ich ursprünglich hatte:
DOELSEIF ([GPIO23] =~ "on")({fhem("set DisplayLED10 100 0 0;set Display_Control ChangeColorToOnLedTest 100 0 0 10")}) DOELSEIF ([GPIO23] =~ "off")({fhem("set DisplayLED10 0 0 0;set Display_Control ChangeColorToOnLedTest 0 0 0 10")})

Dabei habe ich bereits versucht das ganze mit Variablen und Dummy (zB: LEDRot) für die Farbe zu "vereinfachen":

DOELSEIF ([GPIO_17] =~ "on")({my $nr = 10; fhem("set DisplayLED".$nr." ".Value("LEDRot").";set Display_Control ChangeColorToOnLedTest ".Value("LEDRot")." ".$nr."")}) DOELSEIF ([GPIO_17] =~ "off")({my $nr = 10; fhem("set DisplayLED".$nr." ".Value("LEDAus").";set Display_Control ChangeColorToOnLedTest ".Value("LEDAus")." ".$nr."")})


nun würde ich gerne etwas übersichtlicheres schaffen, in der Art:
DOELSEIF ([GPIO23] =~ "on")({fhem("set DisplayLED".$nr." ".Value("LEDRot").";set Display_Control ChangeColorToOnLedTest ".Value("LEDRot")." ".$nr."")})
ersetzen durch
DOELSEIF ([GPIO23] =~ "on")({fhem("aSimpleMethode(NR,FARBE)")})
und die Methode dann
"aSimpleMethode(NR,FARBE) {set DisplayLED".$Nr." ".$Farbe.";set Display_Control ChangeColorToOnLedTest ".$Farbe." ".$Nr."}

ich habe aber leider keine Idee, wie ich das umsetzen kann - der Code müsste ja außerhalb des DOIF liegen, oder? Hat da jemand eine Idee und könnte mir weiterhelfen?
Ich freue mich auf eure Ideen :)

*erster Post - große Erwartungen* :D

Beta-User

Hallo marcy_pb,

willkommen im Forum!

Irgendwie hat sich mir beim Lesen des Posts der Eindruck aufgedrängt, dass du dich villeicht etwas in perl einarbeiten solltest. Da wäre ein echter Funktionsaufrauf mit Parametrierung wie erwünscht kein größeres Problem. Startpunkt zum Einlesen vielleicht: https://wiki.fhem.de/wiki/99_myUtils_anlegen, in Verbindung mit https://fhem.de/commandref_DE.html#perl.

Bei Fragen: Melden...

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

marcy_pb

Hallo Beta-User,

vielen Dank für die Links - habe dort die notwendige Idee herholen können.

ich habe nun wie folgt umgesetzt - Ob der Weg sinnvoll ist, kann ich aber nicht sagen :D :

habe nun mit Notify ein Macro erstellt, das meine Set-Befehle mit Variablen beinhaltet:
ColorMacro {fhem("set DisplayLED".$EVTPART1." ".Value("LED".$EVTPART0."").";set Display_Control ChangeColorToOnLedTest ".Value("LED".$EVTPART0."")." ".$EVTPART1."")}

dies wird über das DOIF mit Argumenten ausgeführt/getriggert:
([GPIO_17] =~ "on")({fhem("trigger ColorMacro Rot 15")}) DOELSEIF ([GPIO_17] =~ "off")({fhem("trigger ColorMacro Aus 15")})

Nun habe ich die Möglichkeit mit weniger Aufwand meine LED-Anzeige zu konfigurieren und das DOIF bleibt viel übersichtlicher! :)

Vielen Dank nochmal :)

Gruß
marcy_pb

Beta-User

Hallo marcy_pb,

Danke für die Rückmeldung, das zeigt einmal mehr, dass es immer mehrere Möglichkeiten gibt, ein Ziel mit FHEM zu erreichen.
Eigentlich dürfte es statt des notify einfacher sein, direkt eine Routine in myUtils aufzurufen, aber so geht es natürlich auch.

Ich muß aber zugeben, dass ich in den Anfängen auch den Weg in die myUtils als "für Experten" angesehen habe und mich da erst später rangetraut. Ist aber viel einfacher als viele andere Wege, wenn man etwas programmieren kann und sich mal eingedacht hat.

Der Aufruf kann dann auch einfacher sein, z.B. über ein notify (ungetestet, bin auch nicht so der perl-Held, evtl. fehlt beim auslösenden Event noch ein ".", also  ":.(" ):

defmod n_GPIO_17_Anzeige notify GPIO_17:(on|off) {if ($EVENT eq "on") {Colormacro("Rot","15")} elsif ($EVENT eq "off") {Colormacro("Aus","15")}}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors