/
/
/
Ansible role that deployes services on my runner machine
1# The room's lights, and what they do.
2#
3# Deployed to the media root as `lights.yml`, beside `cues.yml` and
4# `atmosphere.yml`. This copy is the reference; the one on the share is the one
5# that is read, so it can be retuned between sessions without a redeploy.
6#
7# Addresses live here rather than in Ansible because a light that gets
8# re-addressed on the network should not need a deploy to follow it.
9
10# --- Fixtures ----------------------------------------------------------------
11#
12# host / channel where it is. The RGBW PM is one host with four channels.
13# kind dimmer | relay
14# floor / ceiling hard limits policy must respect
15# curve optional per-fixture shape over the four brightness levels,
16# superposed on the role default in mapping.py
17# response this lamp's own calibration -- see curve.py. Omit to use
18# the measured default for the role.
19# flickerable whether a behaviour may pick this light
20
21fixtures:
22 main:
23 # The table. People read character sheets by it, so it never goes really
24 # dark: the floor is what keeps a level-1 scene legible.
25 host: 192.168.34.231
26 channel: 0
27 kind: dimmer
28 floor: 40
29 # Measured 2026-08-11: 3.5 W at 1% and 25.7 W at 100%, with the bottom 8%
30 # of the scale spanning half a watt. The floor of 10 skips that dead zone.
31 response: {floor: 10, top: 100, gamma: 1.6}
32 # Never the light that gutters. It is the one being read by.
33 flickerable: false
34
35 gallery:
36 # The accent wall. Carries most of the room's dynamic range, because it is
37 # the one that can go properly dark without costing anybody their sheet.
38 #
39 # NOT flickerable, and this is a fact about the lamps rather than a choice:
40 # these are GU10 retrofits, each with its own driver and smoothing
41 # capacitors, so the bulb coasts after the dimmer cuts. Tried with the
42 # device transition at 0 and the command genuinely instant -- it still read
43 # as a slow sag. It does smooth work well, which is what it now gets.
44 host: 192.168.34.230
45 channel: 0
46 kind: dimmer
47 response: {floor: 8, top: 100, gamma: 1.4}
48 flickerable: false
49
50 wall_1:
51 host: 192.168.34.236
52 channel: 0
53 kind: relay
54
55 wall_2:
56 host: 192.168.34.238
57 channel: 0
58 kind: relay
59
60 # The two shelf channels are the ONLY fixtures in this room that can produce
61 # a believable flicker. A bare 24 V supply with the Shelly PWM-ing DC straight
62 # into the strip: no per-lamp driver to coast, and a visible step. Measured
63 # 17.9 W -> 3.6 W complete within 60 ms, and confirmed by eye.
64 #
65 # Because they are the only ones, flicker behaviours fire them TOGETHER --
66 # see `together` below. Half a shelf guttering reads as a fault in a corner;
67 # the whole shelf going dark reads as an event.
68 #
69 # The strip is close to perfectly linear (0.9 W at 5 %, 17.9 W at 100 %), so
70 # the response here is mostly about skipping the very bottom of the range.
71
72 shelf_down:
73 # RGBW PM channel 0. In `profile: light` this is four independent white
74 # channels, not a colour device -- colour belongs to the ceiling wash.
75 host: 192.168.34.229
76 channel: 0
77 kind: dimmer
78 response: {floor: 5, top: 100, gamma: 1.3}
79
80 shelf_booze:
81 host: 192.168.34.229
82 channel: 1
83 kind: dimmer
84 response: {floor: 5, top: 100, gamma: 1.3}
85
86# --- Behaviours --------------------------------------------------------------
87#
88# What the room DOES while the party is somewhere. Selected by the scene, then
89# performed on the driver's own schedule -- the model never says "flicker now".
90#
91# kind still | flicker | swell
92# every [lo, hi] seconds between events. Uniform, so there is a
93# guaranteed minimum spacing and no rhythm.
94# fixtures which roles may be picked. `main` is excluded regardless.
95# depth how far down the event goes, 0-1 of current brightness
96# duration [lo, hi] seconds spent down there
97# fade 0 snaps (omits transition_duration); >= 0.5 ramps. The firmware
98# rejects anything between, so there is no such thing as a 0.2s fade.
99#
100# ADD LIBERALLY, RENAME NEVER. A renamed behaviour breaks the scene map above
101# it; a retuned one is free and invisible. Same rule as the wash's scenes.yml.
102
103behaviours:
104 still:
105 # The default, and what most scenes should get. A library keyed on facets
106 # will miss constantly and a miss must be stillness -- the dominant output
107 # is no action, exactly as for sound.
108 kind: still
109
110 # --- Flicker: the shelf, both channels, together ------------------------
111 # These are deliberately deeper than the first draft. The shelf is the only
112 # thing in the room that can gutter, so when it does it has to carry the
113 # moment on its own -- a subtle flicker on one accent channel is invisible
114 # from the table.
115
116 guttering:
117 # Torches and failing lamps. The signature indoor behaviour: a few
118 # irregular dips, none of them alike.
119 kind: flicker
120 effect: gutter
121 every: [22, 60]
122 fixtures: [shelf_down, shelf_booze]
123 together: true
124
125 haunted:
126 # Abandoned houses, crypts, anywhere that should feel wrong. `stutter`
127 # accelerates and then drops for a second, which reads as something getting
128 # worse rather than as texture -- a story beat, so it wants to be rare.
129 kind: flicker
130 effect: stutter
131 every: [45, 120]
132 fixtures: [shelf_down, shelf_booze]
133 together: true
134
135 failing:
136 # The light is actually going out. Guttering, a full drop, and a slow
137 # catch. The strongest thing in the library, so it is mapped to almost
138 # nothing -- see the scene map, where it is deliberately absent. Fire it
139 # from an event or by hand.
140 kind: flicker
141 effect: dying
142 every: [90, 240]
143 fixtures: [shelf_down, shelf_booze]
144 together: true
145
146 hearth:
147 # Taverns and inns. A fire in the room: shallower and more frequent than a
148 # failing torch, but still a real step.
149 kind: flicker
150 effect: gutter
151 depth: 0.45
152 every: [14, 38]
153 fixtures: [shelf_down, shelf_booze]
154 together: true
155
156 # --- Swell: the gallery, which is good at exactly this ------------------
157 # The GU10s cannot flicker, but their slow response is an asset here: a fade
158 # on a lamp that coasts is smoother than one on a strip that steps.
159
160 storm:
161 # Outdoors in weather. Several sine periods with the amplitude drifting
162 # between them, so it reads as a condition rather than a single gust.
163 kind: swell
164 effect: wave
165 every: [25, 70]
166 fixtures: [gallery]
167
168 breeze:
169 # Mild outdoors. One rise and fall, and then quiet for a while.
170 kind: swell
171 effect: swell
172 every: [45, 110]
173 fixtures: [gallery]
174
175 alive:
176 # Somewhere that should feel present rather than static -- a library, a
177 # ship's cabin, anywhere the party is resting. Almost unnoticeable by
178 # design: nobody should see it happening, only notice when it stops.
179 kind: swell
180 effect: breathe
181 every: [30, 60]
182 fixtures: [gallery]
183
184 dawning:
185 # Light arriving: a door opening onto somewhere brighter, magic gathering,
186 # sunrise. The only effect that goes UP, which is what makes it stand out
187 # after an evening of things dipping.
188 kind: swell
189 effect: surge
190 every: [60, 180]
191 fixtures: [gallery]
192
193# --- Scene map ---------------------------------------------------------------
194#
195# Judge facet value -> behaviour. Checked biome, then civ, then action, then
196# mood: that is the order in which a facet says something about the ROOM rather
197# than about the story. A swamp is a place; `dramatic` is a feeling, and
198# feelings drift constantly in narration.
199#
200# Keys may be bare (`forest`) or qualified (`biome:forest`). Qualified wins, and
201# is worth using where a value appears in more than one facet.
202#
203# Anything absent is `still`, which is most things.
204
205scenes:
206 # Weather and the outdoors
207 weather: storm
208 biome:forest: breeze
209 mountains: breeze
210 desert: breeze
211
212 # Underground and ruins
213 underground: guttering
214 ruins: haunted
215 civ:interiors: guttering
216
217 # Places with a fire in them
218 public: hearth
219 outposts: hearth
220
221 # Moods, consulted last and deliberately sparse. Most moods should not
222 # change what the room does -- only the ones that are really about a place.
223 mysterious: haunted
224