|
- 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()
|