| @@ -11,11 +11,15 @@ import mpd | |||||
| from pyudmx import pyudmx | from pyudmx import pyudmx | ||||
| import talkey | |||||
| # GPIO | # GPIO | ||||
| pin_kugel = 2 | pin_kugel = 2 | ||||
| pin_sun = 4 | pin_sun = 4 | ||||
| pin_pir = 0 | pin_pir = 0 | ||||
| dmxScenes = { | dmxScenes = { | ||||
| "fadecolors":[255,255,255,255,255,192], | "fadecolors":[255,255,255,255,255,192], | ||||
| "plain-red":[255,255,0,0,0,0], | "plain-red":[255,255,0,0,0,0], | ||||
| @@ -26,10 +30,10 @@ dmxScenes = { | |||||
| dmxUserScenes = [ | dmxUserScenes = [ | ||||
| [255,255,255,255,255,192], | [255,255,255,255,255,192], | ||||
| [255,0,180,180,0,0], | |||||
| [255,255,0,0,0,0], | [255,255,0,0,0,0], | ||||
| [255,0,255,0,0,0], | [255,0,255,0,0,0], | ||||
| [255,0,0,255,0,0], | [255,0,0,255,0,0], | ||||
| [255,0,180,180,0,0], | |||||
| [190,255,255,255,0,0], | [190,255,255,255,0,0], | ||||
| [120,0,255,255,0,224] | [120,0,255,255,0,224] | ||||
| ] | ] | ||||
| @@ -42,9 +46,14 @@ def setDmxScene(scene): | |||||
| dev.send_multi_value(1, cv) | dev.send_multi_value(1, cv) | ||||
| def setUserDmxScene(scene): | |||||
| def setUserDmxScene(): | |||||
| global dmxScene | |||||
| if dmxScene < len(dmxUserScenes)-1: | |||||
| dmxScene += 1 | |||||
| else: | |||||
| dmxScene = 0 | |||||
| cv = [0 for v in range(0, 512)] | cv = [0 for v in range(0, 512)] | ||||
| for index, val in enumerate(dmxUserScenes[scene]): | |||||
| for index, val in enumerate(dmxUserScenes[dmxScene]): | |||||
| cv[index] = val | cv[index] = val | ||||
| dev.send_multi_value(1, cv) | dev.send_multi_value(1, cv) | ||||
| @@ -64,37 +73,142 @@ def setSun(state): | |||||
| def startMusic(playlist): | |||||
| client.clear() # clear playlist | |||||
| def startMusic(playlist, single=False, shuffle=True, repeat=True): | |||||
| try: | |||||
| client.clear() # clear playlist | |||||
| except Exception: | |||||
| client.connect("localhost", 6600) | |||||
| client.clear() # clear playlist | |||||
| client.add(playlist) # add file/directory to playlist | client.add(playlist) # add file/directory to playlist | ||||
| client.shuffle() # shuffle playlist | |||||
| client.repeat(1) # set playback mode repeat | |||||
| if shuffle: | |||||
| client.shuffle() # shuffle playlist | |||||
| if repeat: | |||||
| client.repeat(1) # set playback mode repeat | |||||
| else: | |||||
| client.repeat(0) # set playback mode repeat | |||||
| if single: | |||||
| client.repeat(0) # set playback mode repeat | |||||
| client.single(1) # set playback mode single | |||||
| else: | |||||
| client.single(0) # set playback mode single | |||||
| client.setvol(80)# set volume | client.setvol(80)# set volume | ||||
| client.play() # play | client.play() # play | ||||
| def stopMusic(): | def stopMusic(): | ||||
| client.stop() | |||||
| try: | |||||
| client.stop() | |||||
| except Exception: | |||||
| client.connect("localhost", 6600) | |||||
| client.stop() | |||||
| def muteMusic(): | |||||
| global volume | |||||
| global isMuted | |||||
| try: | |||||
| currentvol = int(client.status()['volume']) | |||||
| except Exception: | |||||
| client.connect("localhost", 6600) | |||||
| currentvol = int(client.status()['volume']) | |||||
| if currentvol != 0: | |||||
| volume = currentvol | |||||
| if isMuted: | |||||
| try: | |||||
| client.setvol(volume) | |||||
| except Exception: | |||||
| client.connect("localhost", 6600) | |||||
| client.setvol(volume) | |||||
| else: | |||||
| try: | |||||
| client.setvol(0) | |||||
| except Exception: | |||||
| client.connect("localhost", 6600) | |||||
| client.setvol(0) | |||||
| isMuted = not isMuted | |||||
| def changeVolume(change=5): | |||||
| global volume | |||||
| global isMuted | |||||
| isMuted = False | |||||
| newvol = volume + change | |||||
| if newvol > 100: | |||||
| newvol = 100 | |||||
| if newvol < 0: | |||||
| newvol = 0 | |||||
| try: | |||||
| client.setvol(newvol) | |||||
| except Exception: | |||||
| client.connect("localhost", 6600) | |||||
| client.setvol(newvol) | |||||
| volume = newvol | |||||
| def setMode(string): | |||||
| global mode | |||||
| mode = string | |||||
| def setDiscoMode(): | def setDiscoMode(): | ||||
| setSun('off') | |||||
| sleep(0.3) | |||||
| setKugel('on') | setKugel('on') | ||||
| setDmxScene('fadecolors') | setDmxScene('fadecolors') | ||||
| setUserDmxScene() | |||||
| sleep(0.3) | |||||
| setSun('off') | |||||
| setMode('disco') | |||||
| def getTrackInfo(): | |||||
| try: | |||||
| currentsong = client.currentsong() | |||||
| except Exception: | |||||
| client.connect("localhost", 6600) | |||||
| currentsong = client.currentsong() | |||||
| print(currentsong) | |||||
| global volume | |||||
| try: | |||||
| currentvol = int(client.status()['volume']) | |||||
| except Exception: | |||||
| client.connect("localhost", 6600) | |||||
| currentvol = int(client.status()['volume']) | |||||
| changeVolume(-30) | |||||
| try: | |||||
| tts.say(currentsong['artist'] + ', ' + currentsong['title']) | |||||
| except Exception: | |||||
| tts.say('Willkommen am Discoklo!') | |||||
| client.setvol(currentvol) | |||||
| volume = currentvol | |||||
| def setWorkingMode(): | def setWorkingMode(): | ||||
| setSun('on') | setSun('on') | ||||
| sleep(0.3) | sleep(0.3) | ||||
| setKugel('off') | setKugel('off') | ||||
| setDmxScene('black') | setDmxScene('black') | ||||
| setMode('work') | |||||
| def setOff(): | |||||
| def closeService(): | |||||
| setSun('off') | setSun('off') | ||||
| sleep(0.3) | sleep(0.3) | ||||
| setKugel('off') | setKugel('off') | ||||
| setDmxScene('black') | setDmxScene('black') | ||||
| stopMusic() | |||||
| setMode('off') | |||||
| def initService(): | |||||
| startMusic('0', True) | |||||
| setDiscoMode() | |||||
| def setOnOff(): | |||||
| global mode | |||||
| stopMusic() | |||||
| if mode is not 'work': | |||||
| setWorkingMode() | |||||
| else: | |||||
| initService() | |||||
| def bootstrap(): | def bootstrap(): | ||||
| wiringpi.wiringPiSetup() | wiringpi.wiringPiSetup() | ||||
| @@ -106,29 +220,33 @@ def bootstrap(): | |||||
| dmxScene = 0 | |||||
| bootstrap() | bootstrap() | ||||
| dev = pyudmx.uDMXDevice() | dev = pyudmx.uDMXDevice() | ||||
| dev.open() | dev.open() | ||||
| #connect to MPD | |||||
| client = mpd.MPDClient() | client = mpd.MPDClient() | ||||
| client.connect("localhost", 6600) | client.connect("localhost", 6600) | ||||
| tts = talkey.Talkey( | |||||
| preferred_languages=['en', 'de'], | |||||
| engine_preference=['pico'], | |||||
| ) | |||||
| pirstate = wiringpi.digitalRead(6) | pirstate = wiringpi.digitalRead(6) | ||||
| defaultscene = 1 | |||||
| lirc.init("disco", "~/discobert/lircrc", blocking=False) | |||||
| lastUsed = time.time() | lastUsed = time.time() | ||||
| inUse = True | inUse = True | ||||
| inUseBefore = False | |||||
| mode = "none" | |||||
| inUseBefore = True | |||||
| timeout = 2 * 60 | timeout = 2 * 60 | ||||
| volume = 80 | |||||
| isMuted = False | |||||
| dmxScene = 0 | |||||
| initService() | |||||
| lirc.init("disco", "./lircrc", blocking=False) | |||||
| # Main event loop ... | # Main event loop ... | ||||
| @@ -146,21 +264,17 @@ while True: | |||||
| remotesignal = lirc.nextcode() | remotesignal = lirc.nextcode() | ||||
| if remotesignal: | if remotesignal: | ||||
| lastUsed = time.time() # user is active! | lastUsed = time.time() # user is active! | ||||
| inUse = True | |||||
| for code in remotesignal: | for code in remotesignal: | ||||
| print('received code:', code) | print('received code:', code) | ||||
| if(code == "mode_disco"): | if(code == "mode_disco"): | ||||
| setDiscoMode() | setDiscoMode() | ||||
| if(code == "mode_work"): | if(code == "mode_work"): | ||||
| setWorkingMode() | setWorkingMode() | ||||
| if(code == "mode_off"): | |||||
| setOff() | |||||
| if(code == "mode_dmx_next"): | |||||
| print("dmxScene", dmxScene) | |||||
| setUserDmxScene(dmxScene) | |||||
| if dmxScene < len(dmxUserScenes)-1: | |||||
| dmxScene += 1 | |||||
| else: | |||||
| dmxScene = 0 | |||||
| if(code == "mode_power"): | |||||
| setOnOff() | |||||
| #if(code == "mode_dmx_next"): | |||||
| if(code == "mode_music_play_1"): | if(code == "mode_music_play_1"): | ||||
| startMusic('1') | startMusic('1') | ||||
| if(code == "mode_music_play_2"): | if(code == "mode_music_play_2"): | ||||
| @@ -172,20 +286,29 @@ while True: | |||||
| if(code == "mode_music_play_5"): | if(code == "mode_music_play_5"): | ||||
| startMusic('5') | startMusic('5') | ||||
| if(code == "mode_play_fm4"): | if(code == "mode_play_fm4"): | ||||
| startMusic('http://185.85.28.144:8000/') | |||||
| startMusic('http://185.85.29.141:8000') | |||||
| if(code == "mode_play_oe1"): | |||||
| startMusic('http://185.85.29.142:8000') | |||||
| if(code == "mode_music_stop"): | if(code == "mode_music_stop"): | ||||
| stopMusic() | stopMusic() | ||||
| if(code == "mode_music_mute"): | |||||
| muteMusic() | |||||
| if(code == "mode_volume_up"): | |||||
| changeVolume(5) | |||||
| if(code == "mode_volume_down"): | |||||
| changeVolume(-5) | |||||
| if(code == "mode_music_info"): | |||||
| getTrackInfo() | |||||
| if(inUseBefore != inUse): | if(inUseBefore != inUse): | ||||
| print("State change inUse:", inUseBefore, inUse) | print("State change inUse:", inUseBefore, inUse) | ||||
| if (inUse): | |||||
| setDiscoMode() | |||||
| if inUse: | |||||
| initService() | |||||
| else: | else: | ||||
| setOff() | |||||
| inUseBefore = inUse | |||||
| closeService() | |||||
| inUseBefore = inUse | |||||
| lirc.deinit() # Clean up lirc | lirc.deinit() # Clean up lirc | ||||