import subprocess import sys, inspect, os import wiringpi import time from time import sleep import lirc 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], "strobe":[190,255,255,255,0,0], "nini":[120,0,255,255,0,224], "black":[0,0,0,0,0,0] } 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], [190,255,255,255,0,0], [120,0,255,255,0,224] ] def setDmxScene(scene): cv = [0 for v in range(0, 512)] errorcode = [240,255,0,0,0,0] for index, val in enumerate(dmxScenes.get(scene,errorcode)): cv[index] = val dev.send_multi_value(1, cv) 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[dmxScene]): cv[index] = val dev.send_multi_value(1, cv) def setKugel(state): if state == 'on': wiringpi.digitalWrite(pin_kugel, 0) if state == 'off': wiringpi.digitalWrite(pin_kugel, 1) def setSun(state): if state == 'off': wiringpi.digitalWrite(pin_sun, 0) if state == 'on': wiringpi.digitalWrite(pin_sun, 1) 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 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(): 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(): 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 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() wiringpi.pinMode(pin_kugel, 1) # set Relay Disokugel mode to OUTPUT wiringpi.pinMode(pin_sun, 1) # set Relay Sun mode to OUTPUT # TODO: Set pin! wiringpi.pinMode(pin_pir, 0) # set PIR Sensor mode to INPUT dmxScene = 0 bootstrap() dev = pyudmx.uDMXDevice() dev.open() client = mpd.MPDClient() client.connect("localhost", 6600) tts = talkey.Talkey( preferred_languages=['en', 'de'], engine_preference=['pico'], ) pirstate = wiringpi.digitalRead(6) lirc.init("disco", "~/discobert/lircrc", blocking=False) lastUsed = time.time() inUse = True mode = "none" inUseBefore = True timeout = 2 * 60 volume = 80 isMuted = False initService() # Main event loop ... while True: sleep(0.2) pirstate = wiringpi.digitalRead(pin_pir) #print('pirstate: ', pirstate) if pirstate == 1: lastUsed = time.time() inUse = True else: if(time.time() > lastUsed + timeout): inUse = False 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_power"): setOnOff() #if(code == "mode_dmx_next"): if(code == "mode_music_play_1"): startMusic('1') if(code == "mode_music_play_2"): startMusic('2') if(code == "mode_music_play_3"): startMusic('3') if(code == "mode_music_play_4"): startMusic('4') if(code == "mode_music_play_5"): startMusic('5') if(code == "mode_play_fm4"): 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: initService() else: closeService() inUseBefore = inUse lirc.deinit() # Clean up lirc dev.close()