47 lines
1.1 KiB
Python
47 lines
1.1 KiB
Python
"""Gaming animation – strong pulse through gaming colors."""
|
||
|
||
from __future__ import annotations
|
||
|
||
import colorsys
|
||
|
||
from .base import Animation
|
||
|
||
|
||
class GamingAnimation(Animation):
|
||
name = "gaming"
|
||
interval = 0.09
|
||
|
||
# HSB hues
|
||
COLORS = [
|
||
220 / 360, # blue
|
||
190 / 360, # cyan
|
||
275 / 360, # violet
|
||
300 / 360, # magenta
|
||
]
|
||
|
||
def on_start(self) -> None:
|
||
super().on_start()
|
||
self._color_idx = 0
|
||
self._brightness = 40.0
|
||
self._direction = 1.0
|
||
|
||
def tick(self) -> None:
|
||
self._brightness += self._direction * 4
|
||
|
||
if self._brightness >= 95:
|
||
self._brightness = 95
|
||
self._direction = -1
|
||
if self._brightness <= 25:
|
||
self._brightness = 25
|
||
self._direction = 1
|
||
self._color_idx = (self._color_idx + 1) % len(self.COLORS)
|
||
|
||
h = self.COLORS[self._color_idx]
|
||
r, g, b = colorsys.hsv_to_rgb(h, 1.0, 1.0)
|
||
self.shelly.set_color(
|
||
int(r * 255),
|
||
int(g * 255),
|
||
int(b * 255),
|
||
gain=int(self._brightness),
|
||
)
|