| @@ -21,7 +21,7 @@ The Setup is pretty custom. It includes: | |||||
| Use Debian, install apt dependencies | Use Debian, install apt dependencies | ||||
| ``` | ``` | ||||
| sudo apt install git samba mpd libttspico-utils python3-pip python3-lirc python3-rpi.gpio | |||||
| sudo apt install git samba mpd libttspico-utils python3-pip python3-lirc python3-rpi.gpio nginx | |||||
| ``` | ``` | ||||
| maybe also: `wiringpi espeak mpc` | maybe also: `wiringpi espeak mpc` | ||||
| @@ -14,6 +14,22 @@ from pyudmx import pyudmx | |||||
| import talkey | import talkey | ||||
| # HTTP Server | |||||
| from twisted.web import server, resource | |||||
| from twisted.internet import reactor | |||||
| class Simple(resource.Resource): | |||||
| isLeaf = True | |||||
| def render_GET(self, request): | |||||
| statustext = "" | |||||
| if inUse: | |||||
| statustext = "Disco in use!" | |||||
| else: | |||||
| statustext = "Ready to Disco!" | |||||
| html = '<html><body style="min-height:100vh;display:flex;flex-grow:1;align-items:center;justify-content:center;"><div style="display:flex;font-size:10vw">%s</div></body></html>' % statustext | |||||
| return html.encode('utf-8') | |||||
| # GPIO | # GPIO | ||||
| pin_kugel = 2 | pin_kugel = 2 | ||||
| pin_sun = 4 | pin_sun = 4 | ||||
| @@ -323,6 +339,10 @@ tts = talkey.Talkey( | |||||
| ) | ) | ||||
| site = server.Site(Simple()) | |||||
| reactor.listenTCP(8080, site) | |||||
| reactor.startRunning(False) | |||||
| lirc.init("disco", "~/discobert/lircrc", blocking=False) | lirc.init("disco", "~/discobert/lircrc", blocking=False) | ||||
| @@ -341,8 +361,6 @@ setSun('off') | |||||
| print(timestamp(), "Ready!") | print(timestamp(), "Ready!") | ||||
| # Main event loop ... | # Main event loop ... | ||||
| while True: | while True: | ||||
| sleep(0.25) | sleep(0.25) | ||||
| @@ -420,6 +438,9 @@ while True: | |||||
| startTimeoutCountdown() | startTimeoutCountdown() | ||||
| inUseBefore = inUse | inUseBefore = inUse | ||||
| # Webserver | |||||
| reactor.iterate() | |||||
| lirc.deinit() # Clean up lirc | lirc.deinit() # Clean up lirc | ||||
| @@ -1,104 +0,0 @@ | |||||
| # | |||||
| # example.py | |||||
| # Copyright 2018 by Dave Hocker | |||||
| # | |||||
| # This program is free software: you can redistribute it and/or modify | |||||
| # it under the terms of the GNU General Public License as published by | |||||
| # the Free Software Foundation, version 3 of the License. | |||||
| # | |||||
| # See the LICENSE file for more details. | |||||
| # | |||||
| # Example of how to use pyudmx with a Thinpar 64 light | |||||
| # http://venuelightingeffects.com/wp-content/uploads/manuals/Venue_Thinpar_64_Manual_HR.pdf | |||||
| # 7 channel mode | |||||
| # Channels 1-3 are RGB | |||||
| # Channel 7 is the dimmer | |||||
| # | |||||
| # Requirements | |||||
| # A virtual environment meeting the requirements defined in requirements.txt works best. | |||||
| # Specifically the pyusb module must be installed. | |||||
| # | |||||
| from pyudmx import pyudmx | |||||
| from time import sleep | |||||
| def send_rgb(dev, dimmer, red, green, blue, effect): | |||||
| """ | |||||
| Send a set of RGB values to the light | |||||
| """ | |||||
| cv = [0 for v in range(0, 512)] | |||||
| cv[0] = dimmer | |||||
| cv[1] = red | |||||
| cv[2] = green | |||||
| cv[3] = blue | |||||
| cv[4] = effect | |||||
| print(cv) | |||||
| print(type(cv)) | |||||
| sent = dev.send_multi_value(1, cv) | |||||
| return sent | |||||
| def main(): | |||||
| """ | |||||
| How to control a DMX light through an Anyma USB controller | |||||
| """ | |||||
| # Channel value list for channels 1-512 | |||||
| cv = [0 for v in range(0, 512)] | |||||
| # Create an instance of the DMX controller and open it | |||||
| print("Opening DMX controller...") | |||||
| dev = pyudmx.uDMXDevice() | |||||
| # This will automagically find a single Anyma-type USB DMX controller | |||||
| dev.open() | |||||
| # For informational purpose, display what we know about the DMX controller | |||||
| print(dev.Device) | |||||
| # Send messages to the light changing it to red, then green, then blue | |||||
| # This is the "hard way" to do it, but illustrates how it's done | |||||
| print("Setting to red...") | |||||
| cv[0] = 255 # dimmer to half value | |||||
| cv[1] = 255 # red | |||||
| sent = dev.send_multi_value(1, cv) | |||||
| print("Set to red") | |||||
| sleep(3.0) | |||||
| print("Setting to green...") | |||||
| cv[0] = 255 # dimmer to half value | |||||
| cv[1] = 0 # red | |||||
| cv[2] = 255 # green | |||||
| sent = dev.send_multi_value(1, cv) | |||||
| print("Set to green") | |||||
| sleep(3.0) | |||||
| print("Setting to blue...") | |||||
| cv[0] = 255 # dimmer to half value | |||||
| cv[1] = 0 # red | |||||
| cv[2] = 0 # green | |||||
| cv[3] = 255 # blue | |||||
| sent = dev.send_multi_value(1, cv) | |||||
| print("Set to blue") | |||||
| sleep(3.0) | |||||
| # Here's an easier way to do it | |||||
| print("And, again the easier way") | |||||
| send_rgb(dev, 255, 255, 0, 0, 0) | |||||
| sleep(3.0) | |||||
| send_rgb(dev, 255, 0, 255, 0, 0) | |||||
| sleep(3.0) | |||||
| send_rgb(dev, 255, 0, 0, 255, 0) | |||||
| sleep(3.0) | |||||
| print("Reset all channels and close..") | |||||
| # Turns the light off | |||||
| cv = [0 for v in range(0, 512)] | |||||
| dev.send_multi_value(1, cv) | |||||
| dev.close() | |||||
| if __name__ == "__main__": | |||||
| main() | |||||
| print("Done") | |||||
| @@ -1,24 +0,0 @@ | |||||
| #!/usr/bin/env python3 | |||||
| import mpd | |||||
| import os | |||||
| client = mpd.MPDClient() | |||||
| client.connect("localhost", 6600) | |||||
| client.clear() # clear playlist | |||||
| client.add('1') # add file/directory to playlist | |||||
| client.shuffle() # shuffle playlist | |||||
| client.repeat(1) # set playback mode repeat | |||||
| client.random(1) # set playback mode random | |||||
| client.setvol(80)# set volume | |||||
| client.play() # play | |||||
| #client.stop() # stop | |||||
| for entry in client.lsinfo("1"): | |||||
| print("%s" % entry) | |||||
| for key, value in client.status().items(): | |||||
| print("%s: %s" % (key, value)) | |||||
| print(client.currentsong()) | |||||
| @@ -1,13 +0,0 @@ | |||||
| import os, inspect | |||||
| import subprocess | |||||
| musicdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))+"/music"+"/1" | |||||
| for (path, dirnames, filenames) in os.walk(musicdir): | |||||
| #folders.extend(os.path.join(path, name) for name in dirnames) | |||||
| for name in filenames: | |||||
| file = os.path.join(path, name) | |||||
| #os.system("mpg123 " + "'" + file + "'") | |||||
| #os.system("") | |||||
| subprocess.run(["mpg123", file]) | |||||
| @@ -0,0 +1,12 @@ | |||||
| from twisted.web import server, resource | |||||
| from twisted.internet import reactor | |||||
| class Simple(resource.Resource): | |||||
| isLeaf = True | |||||
| def render_GET(self, request): | |||||
| request.setHeader("Content-Type", "text/html; charset=utf-8") | |||||
| return "<html>Hello, world!</html>".encode('utf-8') | |||||
| site = server.Site(Simple()) | |||||
| reactor.listenTCP(8081, site) | |||||
| reactor.run() | |||||