m 2 led-fader: init

This commit is contained in:
makefu 2017-05-11 12:07:03 +02:00
parent 06fd6f40b1
commit d6d2fff0b8
2 changed files with 105 additions and 0 deletions

View file

@ -0,0 +1,27 @@
{ config, lib, pkgs, ... }:
with import <stockholm/lib>;
let
mq = "192.168.8.11";
in {
systemd.services.led-fader = {
description = "Send led change to message queue";
environment = {
NIX_PATH = "/var/src";
};
wantedBy = [ "multi-user.target" ];
path = with pkgs; [
nix # nix-shell
mosquitto #mosquitto_pub
bash # nix-shell
];
serviceConfig = {
# User = "nobody"; # need a user with permissions to run nix-shell
ExecStart = pkgs.writeDash "run-fader" ''
${./fade.py} --add-empty --mode chain 3 loop --skip-unchanged 0.002 0.1 \
| mosquitto_pub -h ${mq} -p 1883 -l -t '/leds/nodemcu-switcher/set'
'';
PrivateTmp = true;
};
};
}

View file

@ -0,0 +1,78 @@
#! /usr/bin/env nix-shell
#! nix-shell -i python3 -p python3 python35Packages.docopt
""" usage: run [options] NUMLEDS (loop [--skip-unchanged] [STEP] [DELAY]|single STARTVAL)
--add-empty essentially add a single empty led in front, does not count into NUMLEDS
--mode=TYPE mode of fading (Default: chain)
--output=TYPE output type, either json or raw (Default: json)
--skip-unchanged if the value in the loop is unchanged, skip the output
running with loop this script essentially becomes a generator which outputs the
next value each "DELAY"
single returns a single output with STARTVAL as starting point for the first led
NUMLEDS is the number of leds to output data for (--add-empty does not count in here)
STEP defaults to 0.01
DELAY defaults to 1 second
"""
from docopt import docopt
import time
from colorsys import hsv_to_rgb
import json
import sys
def calc_chain(numleds,val):
divisor = 1.0 / numleds
ret = []
for i in range(numleds):
v = float(divisor * i + val) % 1
r,g,b = hsv_to_rgb(v,0.9,1)
ret.append([int(r*255),
int(g*255),
int(b*255)])
return ret
def calc_single(numleds,val):
ret = []
for i in range(numleds):
r,g,b = hsv_to_rgb(val,1,1)
ret.append([int(r*255),
int(g*255),
int(b*255)])
return ret
def main():
args = docopt(__doc__)
numleds = int(args['NUMLEDS'])
mode = args['--mode']
step = float(args['STEP'] or 0.01)
delay = float(args['DELAY'] or 1)
val = float(args['STARTVAL'] or 0)
last = []
while True:
if mode == "chain":
ret = calc_chain(numleds,val)
elif mode == "single":
ret = calc_single(numleds,val)
if args['--add-empty']:
ret.insert(0,[0,0,0])
# early serialization makes comparsion easy
ret = json.dumps(ret)
if not (args['--skip-unchanged'] and last == ret):
last = ret
print(ret)
sys.stdout.flush()
if args['single']:
break
else:
val += step % 1
time.sleep(delay)
if __name__ == "__main__":
main()