Lösung gesucht: unterschiedliche Sequenzen

Begonnen von igami, 15 Februar 2017, 20:21:49

Vorheriges Thema - Nächstes Thema

igami

Ich habe in vier Räumen Lautsprecher die ich alle einzeln ein und ausschalten kann.
Bad und Küche sind Lautsprecher A und B auf einem IR bedienbaren Verstärker
Wohnzimmer und Arbeitszimmer sind Zone 1 und 2 auf einem IP bedienbaren Verstärker

Damit A und/oder B etwas ausgeben muss Zone 2 eingeschaltet und nicht gemutet sein.

Momentan habe ich dafür ein recht langes DOIF und muss dies nun umstellen, da ich noch Dash Buttons für die Umschaltung der Lautsprecher nutzen will

defmod harmony_speaker_toggle_DOIF DOIF ### Badezimmer toggle ###\
  (["^GMYLE_[12]$:KEY_MUTE"] and\
   [harmony_room_DOIF:state] eq "Badezimmer" and\
   [HarmonyHub:currentActivity] !~ /PowerOff|Standby/\
  )(\
    IF\
    ([ONKYO_AVR_zone2:power] eq "off")(\
      set ONKYO_AVR_zone2 on,\
      setreading ONKYO_AVR_zone2 lastVolume [ONKYO_AVR_zone2:volume],\
      set ONKYO_AVR_zone2 volume 0\
    ),\
    IF \
    ([SB_PLAYER_000000000004:power] eq "off")(\
      set HarmonyHub command Denon.AVR-1603 PowerOn,\
      set SB_PLAYER_000000000007 on,\
      set SB_PLAYER_000000000004 on,\
      IF \
      ([SB_PLAYER_000000000007:power] eq "off" and\
       [SB_PLAYER_000000000004:power] eq "on"\
      )(\
        (defmod Denon_Speaker_at at +00:00:03 \
           set HarmonyHub command Denon.AVR-1603 Speaker;;;;\
           set HarmonyHub command Denon.AVR-1603 Speaker;;;;\
           set SB_PLAYER_000000000007 on;;;;\
           set SB_PLAYER_000000000004 off;;;;\
        )\
      )\
      ELSE(\
        IF\
        ([SB_PLAYER_000000000007:power] eq "on" and\
         [SB_PLAYER_000000000004:power] eq "on"\
        )(\
          (defmod Denon_Speaker_at at +00:00:03 \
             set HarmonyHub command Denon.AVR-1603 Speaker;;;;\
             set SB_PLAYER_000000000004 off;;;;\
          )\
        )\
      ) \
    )\
    ELSE(\
      IF \
      ([SB_PLAYER_000000000007:power] eq "off" and\
       [SB_PLAYER_000000000004:power] eq "on"   \
      )(\
        set HarmonyHub command Denon.AVR-1603 Speaker,\
        set SB_PLAYER_000000000007 on\
      )\
      ELSE(\
        IF \
        ([SB_PLAYER_000000000007:power] eq "on" and\
         [SB_PLAYER_000000000004:power] eq "off"   \
        )(\
          set HarmonyHub command Denon.AVR-1603 PowerOff,\
          set SB_PLAYER_000000000007 off,\
          set SB_PLAYER_000000000004 off,\
          IF\
          ([ONKYO_AVR_zone2:volume] == 0)(\
            set ONKYO_AVR_zone2 off\
          )\
        )\
        ELSE(\
          IF\
          ([SB_PLAYER_000000000007:power] eq "on" and\
           [SB_PLAYER_000000000004:power] eq "on"   \
          )(\
            set HarmonyHub command Denon.AVR-1603 Speaker,\
            set HarmonyHub command Denon.AVR-1603 Speaker,\
            set SB_PLAYER_000000000007 off\
          )\
        )\
      )\
    )\
  )\
### Küche toggle ###\
  DOELSEIF\
  (["^GMYLE_[12]$:KEY_MUTE"] and\
   [harmony_room_DOIF:state] eq "Küche" and\
   [HarmonyHub:currentActivity] !~ /PowerOff|Standby/\
  )(\
    IF\
    ([ONKYO_AVR_zone2:power] eq "off")(\
      set ONKYO_AVR_zone2 on,\
      setreading ONKYO_AVR_zone2 lastVolume [ONKYO_AVR_zone2:volume],\
      set ONKYO_AVR_zone2 volume 0\
    ),\
    IF\
    ([SB_PLAYER_000000000007:power] eq "off")(\
      set HarmonyHub command Denon.AVR-1603 PowerOn,\
      set SB_PLAYER_000000000007 on,\
      set SB_PLAYER_000000000004 on,\
      IF\
      ([SB_PLAYER_000000000007:power] eq "on" and\
       [SB_PLAYER_000000000004:power] eq "off"\
      )(\
        (defmod Denon_Speaker_at at +00:00:03\
           set HarmonyHub command Denon.AVR-1603 Speaker;;;;\
           set SB_PLAYER_000000000007 off;;;;\
           set SB_PLAYER_000000000004 on;;;;\
        )\
      )\
      ELSE(\
        IF\
        ([SB_PLAYER_000000000007:power] eq "on" and\
         [SB_PLAYER_000000000004:power] eq "on"\
        )(\
          (defmod Denon_Speaker_at at +00:00:03\
             set HarmonyHub command Denon.AVR-1603 Speaker;;;;\
             set HarmonyHub command Denon.AVR-1603 Speaker;;;;\
             set SB_PLAYER_000000000007 off;;;;\
          )\
        )\
      )\
    )\
    ELSE(\
      IF\
      ([SB_PLAYER_000000000007:power] eq "off" and\
       [SB_PLAYER_000000000004:power] eq "on"\
      )(\
        set HarmonyHub command Denon.AVR-1603 PowerOff,\
        set SB_PLAYER_000000000007 off,\
        set SB_PLAYER_000000000004 off,\
        IF\
        ([ONKYO_AVR_zone2:volume] == 0)(\
          set ONKYO_AVR_zone2 off\
        )\
      )\
      ELSE(\
        IF \
        ([SB_PLAYER_000000000007:power] eq "on" and\
         [SB_PLAYER_000000000004:power] eq "off"   \
        )(\
          set HarmonyHub command Denon.AVR-1603 Speaker,\
          set HarmonyHub command Denon.AVR-1603 Speaker,\
          set SB_PLAYER_000000000004 on\
        )\
        ELSE(\
          IF\
          ([SB_PLAYER_000000000007:power] eq "on" and\
           [SB_PLAYER_000000000004:power] eq "on"   \
          )(\
            set HarmonyHub command Denon.AVR-1603 Speaker,\
            set SB_PLAYER_000000000004 off\
          )\
        )\
      )\
    )\
  )\
### Arbeitszimmer toggle ###\
  DOELSEIF\
  (["^GMYLE_[12]$:KEY_MUTE"] and\
   [harmony_room_DOIF:state] eq "Arbeitszimmer" and\
   [HarmonyHub:currentActivity] !~ /PowerOff|Standby/\
  )(\
    IF\
    ([ONKYO_AVR_zone2:power] eq "off")(\
      set ONKYO_AVR_zone2 on,\
      IF\
      ([ONKYO_AVR_zone2:volume] == 0)(\
        set ONKYO_AVR_zone2 volume [ONKYO_AVR_zone2:lastVolume]\
      )    \
    )\
    ELSE(\
      IF\
      ([ONKYO_AVR_zone2:volume] == 0)(\
        set ONKYO_AVR_zone2 volume [ONKYO_AVR_zone2:lastVolume]\
      )\
      ELSE(\
        IF \
        ([SB_PLAYER_000000000007:power] eq "on" or\
         [SB_PLAYER_000000000004:power] eq "on"\
        )(\
          setreading ONKYO_AVR_zone2 lastVolume [ONKYO_AVR_zone2:volume],\
          set ONKYO_AVR_zone2 volume 0\
        )\
        ELSE(\
          set ONKYO_AVR_zone2 off\
        )\
      )\
    )\
  )\
### Wohnzimmer toggle ###\
  DOELSEIF\
  (["^GMYLE_[12]$:KEY_MUTE"] and\
   [harmony_room_DOIF:state] eq "Wohnzimmer" and\
   [HarmonyHub:currentActivity] !~ /PowerOff|Standby/\
  )(\
    IF\
    ([ONKYO_AVR_main:mute] eq "on")(\
      set ONKYO_AVR_main mute off\
    )\
    ELSE(\
      set ONKYO_AVR_main mute on\
    )\
  )
attr harmony_speaker_toggle_DOIF alias Harmony Smart Control: Lautsprecher Umschalter
attr harmony_speaker_toggle_DOIF cmdState Badezimmer toggle|kitchen toggle|office toggle|living room toggle
attr harmony_speaker_toggle_DOIF do always
attr harmony_speaker_toggle_DOIF group Harmony Smart Control
attr harmony_speaker_toggle_DOIF icon audio_volume_mute
attr harmony_speaker_toggle_DOIF room harmony

Überführen wollte ich das nun in eine sub in den myUtils welche eigentlich sehr ähnlich auch mit if Blöcken aufgebaut ist. Gibt es dafür noch andere, einfachere Möglichlkeiten?
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

igami

Irgendwie hat mich das Thema nun wieder eingeholt und ich habe immer noch keine einfache Lösung gefunden :(
Dann doch mal eine längere sub bauen.
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

igami

#2
Hier nun das notify

defmod Versta.rker_Umschalter notify ((Arbeitszimmer|Badezimmer|Ku.che|Wohnzimmer).._Lautsprecher:(on|off)|HarmonyHub:mediaType:..+) {\
  my %amp_A = (NAME => "ONKYO_AVR_main");;\
  my %amp_B = (NAME => "ONKYO_AVR_zone2");;\
  my %amp_C = (NAME => "Badezimmerc.Ku.che.._AV_.Versta.rker");;\
  my @cmds;;\
\
  if(ReadingsVal("HarmonyHub", "mediaType", "") eq "audio"){\
    my %speaker_6 = (NAME => "Arbeitszimmer.._Lautsprecher");;\
    my %speaker_7 = (NAME => "Badezimmer.._Lautsprecher");;\
    my %speaker_4 = (NAME => "Ku.che.._Lautsprecher");;\
    my %speaker_9 = (NAME => "Wohnzimmer.._Lautsprecher");;\
\
    $speaker_6{power} = ReadingsVal($speaker_6{NAME}, "state", "off");;\
    $speaker_7{power} = ReadingsVal($speaker_7{NAME}, "state", "off");;\
    $speaker_4{power} = ReadingsVal($speaker_4{NAME}, "state", "off");;\
    $speaker_9{power} = ReadingsVal($speaker_9{NAME}, "state", "off");;\
\
    push(@cmds, "setreading $amp_A{NAME},$amp_B{NAME} presence present");;\
    push(@cmds, ($speaker_9{power} eq "on" ? "set $amp_A{NAME} mute off" : "set $amp_A{NAME} mute on"));;\
    push(\
      @cmds, \
      (\
        (\
          $speaker_6{power} eq "on" || \
          $speaker_7{power} eq "on" || \
          $speaker_4{power} eq "on"\
        ) ?\
          "set $amp_B{NAME} on"\
        : \
          "set $amp_B{NAME} off"\
      )\
    );;\
    push(\
      @cmds, \
      (\
        $speaker_6{power} eq "on" ? \
          "set $amp_B{NAME} volume [$amp_B{NAME}:lastVolume]" \
        : \
          "setreading $amp_B{NAME} lastVolume [$amp_B{NAME}:volume];; set $amp_B{NAME} volume 0" \
      )\
    );;\
    if(\
      $speaker_7{power} eq "on" || \
      $speaker_4{power} eq "on"\
    ){\
      push(@cmds, "set $amp_C{NAME} on;; setreading $amp_C{NAME} power on");;\
      $amp_C{speaker} = ReadingsVal($amp_C{NAME}, "speaker", "A");;\
      if(\
        $speaker_7{power} eq "on" && \
        $speaker_4{power} eq "on"\
      ){\
        if($amp_C{speaker} eq "A"){\
          push(@cmds, "set $amp_C{NAME} command Speaker;; set $amp_C{NAME} command Speaker");;\
        }\
        elsif($amp_C{speaker} eq "B"){\
          push(@cmds, "set $amp_C{NAME} command Speaker");;\
        }\
        push(@cmds, "setreading $amp_C{NAME} speaker AB");;\
      }\
      elsif(\
        $speaker_7{power} eq "on" && \
        $speaker_4{power} eq "off"\
      ){\
        if($amp_C{speaker} eq "B"){\
          push(@cmds, "set $amp_C{NAME} command Speaker;;set $amp_C{NAME} command Speaker");;\
        }\
        elsif($amp_C{speaker} eq "AB"){\
          push(@cmds, "set $amp_C{NAME} command Speaker");;\
        }\
        push(@cmds, "setreading $amp_C{NAME} speaker A");;\
      }\
      elsif(\
        $speaker_7{power} eq "off" && \
        $speaker_4{power} eq "on"\
      ){\
        if($amp_C{speaker} eq "AB"){\
          push(@cmds, "set $amp_C{NAME} command Speaker;;set $amp_C{NAME} command Speaker");;\
        }\
        elsif($amp_C{speaker} eq "A"){\
          push(@cmds, "set $amp_C{NAME} command Speaker");;\
        }\
        push(@cmds, "setreading $amp_C{NAME} speaker B");;\
      }\
    }\
    else{\
      push(@cmds, "set $amp_C{NAME} off;; setreading $amp_C{NAME} power off");;\
    }\
  }\
  else{\
    push(@cmds, "set $amp_A{NAME} mute off");;\
    push(@cmds, "set $amp_B{NAME} off");;\
    push(@cmds, "set $amp_C{NAME} PowerOff, setreading $amp_C{NAME} power off");;\
  }\
  \
  fhem(join(";;", @cmds));;\
}
attr Versta.rker_Umschalter alias Verstärker Umschalter
attr Versta.rker_Umschalter devStateIcon {ReadingsVal($name, "state", "inactive") eq "active" ? ".*:ios-on-green:inactive" : ".*:ios-off:active"}
attr Versta.rker_Umschalter group Lautsprecher - Hilfsgeräte
attr Versta.rker_Umschalter icon logic
attr Versta.rker_Umschalter room Lautsprecher
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