Hallo zusammen,
zunächst einmal vielen Dank an alle, die sich bei FHEM engagieren. Was für ein großartiges System!
Nun zu meiner Frage:
Ich habe in mehreren Räumen zur Lichtsteuerung Shelly i3 hinter Tastern verbaut.
Diese setzen per URL call den State von raumspezifischen Dummies, die wiederum über ein DOIF raumspezifische Dimmer ansprechen.
Als States gibt es aktuell
short
lighter
darker
Als Dummy Taster
badTaster
wcTaster
flurTaster
gangTaster
Generalisiert: <raum>Taster
Als Dimmer
badDimmer
wcDimmer
flurDimmer
gangDimmer
Generalisiert: <raum>Dimmer
Die Taster sind Bedingungen in einem DoIF. Hier der für das Bad:
{if([badTaster:"short"] and [badDimmer:state] eq "on") {
fhem_set "badDimmer off"; set_State("off")}
elsif ([badTaster:"short"] and [badDimmer:state] eq "off") {
fhem_set "badDimmer on"; set_State("on")}
elsif ([badTaster:"lighter"] and [badDimmer:pct:d] < 95) {
$_pct = [badDimmer:pct:d] + 20;
fhem_set "badDimmer pct $_pct";
set_State("lighter")}
elsif ([badTaster:"darker"] and [badDimmer:pct:d] > 15) {
$_pct = [badDimmer:pct:d] - 20;
fhem_set "badDimmer pct $_pct";
set_State("darker")}
}
Ich würde gerne das DOIF generalisieren, so dass ich nicht für jeden Raum ein eigens anlegen muss und bei Anpassungen alle wieder ändern muss.
Theoretisch, und wäre FHEM eine reine Programmierumgebung, würde ich eine Funktion definieren
DOIF_Taster (taster,dimmer) {
if([taster:"short"] and [dimmer:state] eq "on") {
fhem_set "dimmer off"; set_State("off")}
elsif ...
Wenn beim Taster ein Event ausgelöt wird, würde ich dann diese Funktion aufrufen.
z.B. beim BadTaster
DOIF_Taster (badTaster, badDimmer)
Wie lässt sich das in FHEM umsetzen?
Habe leider keine Dokumentation dazu gefunden oder die relevanten Stellen nicht verstanden.
Nach Meinem Verständnis könnte ich im DOIF die Condition mit einer RegEx so anpassen, dass sie für alle Räume funktioniert. Aber wie kann ich den Commandblock generalisieren?
Vielen Dank für eure Vorschläge!
siehe https://wiki.fhem.de/wiki/DOIF/Automatisierung
Mit DOIF weiß ich nicht aber das mit Funktion etc. geht ganz einfach mit einem notify...
In etwa so (sofern deine Namensgebung entsprechend gut gewählt ist/wird):
define nLichter notify .*Taster:(shorter|lighter|darker) {my_LightControl($NAME, $EVENT)}
Besser wäre eine Namensgebung wie:
Taster_Bad, Taster_XYZ, ...
Dimmer_Bad, Dimmer_XYZ, ...
Weil dann würde vieles "generischer" gehen ;)
Und auch das notify entsprechend:
define nLichter notify Taster_.*:(shorter|lighter|darker) {my_LightControl($NAME, $EVENT)}
https://wiki.fhem.de/wiki/Notify
https://wiki.fhem.de/wiki/Event_monitor
Dann eine Sub:
my_LightControl ($$)
{
my ($Device, $Event) = @_;
my $Light = (split(/_/, $Device))[0] . "Dimmer"; # wenn z.B. ein Trennzeichen zwischen Name und Art wäre, also: bad_Taster bzw. dann eben bad_Dimmer, weil dann würde man vorher "splitten" und dann eben zusammenbauen / bzw. bei anderer Namensgebung (siehe Vorschlag bzgl. notify) halt entsprechend andersrum...
Log3(undef, 3, "my_LightControl Device: $Device Light: $Light Event: $Event);
# hier dann eben entsprechend programmieren
}
https://wiki.fhem.de/wiki/99_myUtils_anlegen
Gruß, Joachim
Top, vielen Dank für die beiden super hilfreichen Antworten!