| @@ -11,11 +11,15 @@ import mpd | |||
| from pyudmx import pyudmx | |||
| import talkey | |||
| # GPIO | |||
| pin_kugel = 2 | |||
| pin_sun = 4 | |||
| pin_pir = 0 | |||
| dmxScenes = { | |||
| "fadecolors":[255,255,255,255,255,192], | |||
| "plain-red":[255,255,0,0,0,0], | |||
| @@ -26,10 +30,10 @@ dmxScenes = { | |||
| dmxUserScenes = [ | |||
| [255,255,255,255,255,192], | |||
| [255,0,180,180,0,0], | |||
| [255,255,0,0,0,0], | |||
| [255,0,255,0,0,0], | |||
| [255,0,0,255,0,0], | |||
| [255,0,180,180,0,0], | |||
| [190,255,255,255,0,0], | |||
| [120,0,255,255,0,224] | |||
| ] | |||
| @@ -42,9 +46,14 @@ def setDmxScene(scene): | |||
| 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)] | |||
| for index, val in enumerate(dmxUserScenes[scene]): | |||
| for index, val in enumerate(dmxUserScenes[dmxScene]): | |||
| cv[index] = val | |||
| 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.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.play() # play | |||
| 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(): | |||
| setSun('off') | |||
| sleep(0.3) | |||
| setKugel('on') | |||
| 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(): | |||
| setSun('on') | |||
| sleep(0.3) | |||
| setKugel('off') | |||
| setDmxScene('black') | |||
| setMode('work') | |||
| def setOff(): | |||
| def closeService(): | |||
| setSun('off') | |||
| sleep(0.3) | |||
| setKugel('off') | |||
| 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(): | |||
| wiringpi.wiringPiSetup() | |||
| @@ -106,29 +220,33 @@ def bootstrap(): | |||
| dmxScene = 0 | |||
| bootstrap() | |||
| dev = pyudmx.uDMXDevice() | |||
| dev.open() | |||
| #connect to MPD | |||
| client = mpd.MPDClient() | |||
| client.connect("localhost", 6600) | |||
| tts = talkey.Talkey( | |||
| preferred_languages=['en', 'de'], | |||
| engine_preference=['pico'], | |||
| ) | |||
| pirstate = wiringpi.digitalRead(6) | |||
| defaultscene = 1 | |||
| lirc.init("disco", "~/discobert/lircrc", blocking=False) | |||
| lastUsed = time.time() | |||
| inUse = True | |||
| inUseBefore = False | |||
| mode = "none" | |||
| inUseBefore = True | |||
| timeout = 2 * 60 | |||
| volume = 80 | |||
| isMuted = False | |||
| dmxScene = 0 | |||
| initService() | |||
| lirc.init("disco", "./lircrc", blocking=False) | |||
| # Main event loop ... | |||
| @@ -146,21 +264,17 @@ while True: | |||
| remotesignal = lirc.nextcode() | |||
| if remotesignal: | |||
| lastUsed = time.time() # user is active! | |||
| inUse = True | |||
| for code in remotesignal: | |||
| print('received code:', code) | |||
| if(code == "mode_disco"): | |||
| setDiscoMode() | |||
| if(code == "mode_work"): | |||
| 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"): | |||
| startMusic('1') | |||
| if(code == "mode_music_play_2"): | |||
| @@ -172,20 +286,29 @@ while True: | |||
| if(code == "mode_music_play_5"): | |||
| startMusic('5') | |||
| 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"): | |||
| 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): | |||
| print("State change inUse:", inUseBefore, inUse) | |||
| if (inUse): | |||
| setDiscoMode() | |||
| if inUse: | |||
| initService() | |||
| else: | |||
| setOff() | |||
| inUseBefore = inUse | |||
| closeService() | |||
| inUseBefore = inUse | |||
| lirc.deinit() # Clean up lirc | |||