/
ambipi.py
executable file
·135 lines (101 loc) · 3.75 KB
/
ambipi.py
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env python
# encoding: utf-8
import os
import sys
import time
import math
import logging
from optparse import OptionParser
from random import randrange
import patterns
from daemon import Daemon
from LedStrip_WS2801 import LedStrip_WS2801
# Set this to your number of leds
NUM_LEDS = 250
# Get directory of this python script
DIR_SCRIPT = os.path.dirname(os.path.realpath(__file__))
# Setup files
PIDFILE = os.path.join(DIR_SCRIPT, "ambipi.pid")
LOGFILE = os.path.join(DIR_SCRIPT, "ambipi.log")
# Setup Logging
LOGFORMAT = "%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s"
logFormatter = logging.Formatter(LOGFORMAT)
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# Setup file log handler
fileHandler = logging.FileHandler(LOGFILE)
fileHandler.setFormatter(logFormatter)
logger.addHandler(fileHandler)
# Setup console log handler
consoleHandler = logging.StreamHandler(sys.stdout)
consoleHandler.setFormatter(logFormatter)
logger.addHandler(consoleHandler)
# Color Code
def rainbowAllWithBrighnessMover(ledStrip, times=10000):
for t in range(0, times):
for i in range(0, ledStrip.nLeds):
ledStrip.setPixel(i, patterns.rainbow((1.1 * math.pi * (i + t)) / ledStrip.nLeds, (i + t) % 255))
ledStrip.update()
time.sleep(0.01)
# Main loop, either run from console or daemonized
def _main(options, args):
logger.info("ambipi: %s leds, options=%s, args=%s", NUM_LEDS, options, args)
ledStrip = LedStrip_WS2801(NUM_LEDS)
while True:
(r, g, b) = (randrange(255), randrange(255), randrange(255))
# patterns.knight_rider(ledStrip, 7, (r, g, b), 1, 0.01)
# patterns.antialisedPoint(ledStrip, (r, g, b), step=0.7, dscale=0.1)
# patterns.rainbowAll(ledStrip, 100, 0)
rainbowAllWithBrighnessMover(ledStrip)
# time.sleep(1)
# patterns.fillAll(ledStrip, [0, 255, 0], delayTime)
# patterns.rainbowAll(ledStrip, 200, 0.01)
# patterns.fillAll(ledStrip, [255, 0, 0], 0.01)
# patterns.fillAll(ledStrip, [0, 255, 0], 0.01)
# patterns.fillAll(ledStrip, [0, 0, 255], 0.01)
# patterns.antialisedPoint(ledStrip, [255, 0, 0], 0.5, 0.3)
# patterns.antialisedPoint(ledStrip, [0, 255, 0], 0.5, 0.3)
# patterns.antialisedPoint(ledStrip, [0, 0, 255], 0.5, 0.3)
# patterns.rainbowAll(ledStrip, 500, 0.01)
# patterns.knight_rider(ledStrip)
# Wrapper for main loop with exception logging
def main(options, args):
try:
_main(options, args)
except KeyboardInterrupt:
logger.info("KeyboardInterrupt")
except:
logger.exception(sys.exc_info()[0])
raise
finally:
logger.info("bye")
# Simple Daemonization
class MyDaemon(Daemon):
def __init__(self, pidfile, options, args):
self.options = options
self.args = args
Daemon.__init__(self, pidfile)
def run(self):
main(self.options, self.args)
# Handle run from command line
if __name__ == "__main__":
# Prepare help and options
usage = """usage: %prog [options]"""
desc = ("Bits Working AmbiPi")
parser = OptionParser(usage=usage, description=desc)
parser.add_option("-d", "--daemon", dest="daemon", action="store_true", help="Daemonize. -d [start|stop|restart]")
parser.add_option("-v", "--version", dest="version", action="store_true", help="Show version")
(options, args) = parser.parse_args()
if options.version:
print __version__
exit(0)
if options.daemon:
daemon = MyDaemon(PIDFILE, options, args)
if "start" == args[0]:
daemon.start()
elif "stop" == args[0]:
daemon.stop()
elif "restart" == args[0]:
daemon.restart()
else:
main(options, args)