summaryrefslogtreecommitdiffstats
path: root/makefu/2configs/home/ham/media/remote_sound_arbeitszimmer.nix
blob: f59f022f4c42b8f493d4c73bd8b524eea69df07e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
{ lib, ...}:
let
  statecond = cond: { # cond must be a list
    condition = "template";
    value_template = "{{ trigger.to_state.state in ( " +
      (lib.concatMapStringsSep "," (x: "'${x}'") cond) + ") }}";
    };
  vol_change = 0.030;

  max_repeat = "30"; # max loops to repeat before bailing out
  remote = "sensor.arbeitszimmer_sound1_action";
  player = "media_player.office";
  last_state_sensor_name = "last_rotation_action_arbeitszimmer";
  last_state_sensor = "input_text.${last_state_sensor_name}";
  #      - service: media_player.volume_set
  #    target:
  #      entity_id: media_player.kitchen
  #    data:
  #      volume_level: {{ state_attr('media_player.kitchen', 'volume_level') + 0.02 }}
  rotate_stop = "brightness_stop";
  rotate_right = "brightness_move_up";
  rotate_left = "brightness_move_down" ;
  
  single_click = "toggle";
  double_click = "brightness_step_up";
  triple_click = "brightness_step_down";
in {
  services.home-assistant.config.input_text."${last_state_sensor_name}".name = "Last action of the arbeitszimmer";
  services.home-assistant.config.automation = [
    {
      trigger = {
        platform = "state";
        entity_id = remote;
        to = [ rotate_stop ];
      };
      action = [
          { service = "input_text.set_value";
            target.entity_id = last_state_sensor;
            data.value = "stop";
          }
      ];
    }
    {
      alias = "Perform Actions with ${remote}";
      trigger = {
        platform = "state";
        entity_id = remote;
        to = [ single_click double_click triple_click rotate_left rotate_right ];
      };
      #mode = "queued";
      #max = 5;
      mode = "single";
      #max_exceeded = "silent";
      action = [
        {
          choose = [
            {
              conditions = statecond [ single_click ];
              sequence = [
                { service = "media_player.media_play_pause";
                target.entity_id = player;
                }
              ];
            }
            {
              conditions = statecond [ rotate_left rotate_right ];
              sequence = let
                vol_up = toString vol_change;
                vol_down = toString (-1 * vol_change);
              in [
                {
                  variables.nextvol = ''{% if trigger.to_state.state in ( "${rotate_left}" ) -%} ${vol_down} {% else -%} ${vol_up} {% endif -%}'';
                  variables.state = ''{% if trigger.to_state.state in ( "${rotate_left}" ) -%} left {% else -%} right {% endif -%}'';
                }
                { service = "input_text.set_value";
                  target.entity_id = last_state_sensor;
                  data.value = ''{{ state }}'';
                }
                {
                  repeat = {
                    sequence = [
                      { service = "media_player.volume_set";
                        target.entity_id = player;
                        data.volume_level = ''{{ state_attr("${player}","volume_level")  + (nextvol|float) }}'';
                      }
                      { delay.milliseconds = "150"; }
                    ];
                    while = [
                      {
                          condition = "template";
                          value_template = ''{{ states("${last_state_sensor}") == state }}'';
                      }
                      {
                        condition = "template";
                        value_template = "{{ repeat.index <= ${max_repeat}}}";
                      }
                    ];
                  };
                }
              ];
            }
          ];
        }
      ];
    }
  ];
}