FHEM Forum

FHEM => Automatisierung => Thema gestartet von: SWhof321 am 23 Juli 2020, 11:41:15

Titel: Generisches DOIF schreiben, was in mehreren Räumen verwendet werden kann
Beitrag von: SWhof321 am 23 Juli 2020, 11:41:15
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!



Titel: Antw:Generisches DOIF schreiben, was in mehreren Räumen verwendet werden kann
Beitrag von: Damian am 23 Juli 2020, 12:27:40
siehe https://wiki.fhem.de/wiki/DOIF/Automatisierung
Titel: Antw:Generisches DOIF schreiben, was in mehreren Räumen verwendet werden kann
Beitrag von: MadMax-FHEM am 23 Juli 2020, 12:35:02
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
Titel: Antw:Generisches DOIF schreiben, was in mehreren Räumen verwendet werden kann
Beitrag von: SWhof321 am 24 Juli 2020, 10:40:04
Top, vielen Dank für die beiden super hilfreichen Antworten!