diff --git a/hue_remote/__pycache__/config.cpython-38.pyc b/hue_remote/__pycache__/config.cpython-38.pyc new file mode 100644 index 0000000..02d91d3 Binary files /dev/null and b/hue_remote/__pycache__/config.cpython-38.pyc differ diff --git a/hue_remote/__pycache__/hue_controller.cpython-38.pyc b/hue_remote/__pycache__/hue_controller.cpython-38.pyc new file mode 100644 index 0000000..c378753 Binary files /dev/null and b/hue_remote/__pycache__/hue_controller.cpython-38.pyc differ diff --git a/hue_remote/__pycache__/presets.cpython-38.pyc b/hue_remote/__pycache__/presets.cpython-38.pyc new file mode 100644 index 0000000..bba3543 Binary files /dev/null and b/hue_remote/__pycache__/presets.cpython-38.pyc differ diff --git a/hue_remote/hue_controller.py b/hue_remote/hue_controller.py index b7777b5..20bd133 100644 --- a/hue_remote/hue_controller.py +++ b/hue_remote/hue_controller.py @@ -13,140 +13,140 @@ LIGHTS = {} # dictionary of all the lights loop = asyncio.get_event_loop() # ASync loop def genUrl(params: str): - return "http://" + config.address + "/api/" + config.username + params + return "http://" + config.address + "/api/" + config.username + params class APIrequest: - # Get Req - async def get( dest: str="", payload: str="" ): - try: - apiReq = req.get( genUrl(dest), data = payload ) + # Get Req + async def get( dest: str="", payload: str="" ): + try: + apiReq = req.get( genUrl(dest), data = payload ) - if( apiReq.status_code != 200 ): # print out the error if the status code is not 200 - print(apiReq) - print(apiReq.text) + if( apiReq.status_code != 200 ): # print out the error if the status code is not 200 + print(apiReq) + print(apiReq.text) - return apiReq + return apiReq - except req.exceptions.RequestException as err: - print(err) + except req.exceptions.RequestException as err: + print(err) - # PUT Req - async def put( dest: str="", payload: str="" ): - try: - apiReq = req.put( genUrl(dest), data = payload ) # send the payload + # PUT Req + async def put( dest: str="", payload: str="" ): + try: + apiReq = req.put( genUrl(dest), data = payload ) # send the payload - if( apiReq.status_code != 200 ): - print(apiReq) - print(apiReq.text) + if( apiReq.status_code != 200 ): + print(apiReq) + print(apiReq.text) - return apiReq + return apiReq - except req.exceptions.RequestException as err: - print(err) + except req.exceptions.RequestException as err: + print(err) class controller: - # Internal get functions - async def getLights(): - return await APIrequest.get("/lights") - - async def getLight(index: int=1): - return await APIrequest.get( "/lights/" + str(index) ) - - # Lower level light manipulation (async) - async def toggleLight(index: int=1, isOn: bool=True): - await APIrequest.put( "/lights/" + str(index) + "/state", '{"on":' + boolToString(isOn) + '}' ) - - async def toggleLights(isOn: bool=True): - for key in LIGHTS: - await controller.toggleLight(key, isOn) - - async def setLightRGB( index: int, r:int, g:int, b:int ): - h, s, v = rgbToHsv(r, g, b) - payload = '{"sat":' + str(s) + ', "bri":' + str(v) + ', "hue":' + str(h) + '}' - - await APIrequest.put( "/lights/" + str(index) + "/state", payload ) - - # Normal functions - def switchLight( index: int=1 ): - key = LIGHTS.get(str(index)) - if(key): - if( key.get("state") ): - curPower = LIGHTS[str(index)]["state"]["on"] - loop.run_until_complete( controller.toggleLight(index, not curPower)) - else: - print("Error: Light index '" + str(index) + "' out of range") - - def switchLights(): - for key in LIGHTS: - controller.switchLight(key) - - # Light control - def setLightColor( index:int, r:int, g:int, b:int ): - if( LIGHTS.get(str(index)) ): - loop.run_until_complete( controller.setLightRGB(index, r, g, b) ) - else: - print("Error: Light index '" + str(index) + "' out of range") - - def setLightBrightness( index:int, b:int ): - if( LIGHTS.get(str(index)) ): - payload = '{"bri":' + str(b) + '}' - loop.run_until_complete( APIrequest.put( "/lights/" + str(index) + "/state", payload ) ) - else: - print("Error: Light index '" + str(index) + "' out of range") - - def setBrightness( b:int ): - for key in LIGHTS: - controller.setLightBrightness( key, b ) - - def setAllLightsColor( r:int, g:int, b:int ): - for key in LIGHTS: - controller.setLightColor( key, r, g, b ) - - def Power(isOn:bool=True): # Controlling the power of the lights - loop.run_until_complete( controller.toggleLights(isOn) ) - - def powerLight( index:int, isOn:bool=True ): - loop.run_until_complete( controller.toggleLight( index, isOn ) ) - - # Presets - def setLightPreset( index:int, p:str ): - if( LIGHTS.get(str(index)) ): - if( PRESETS.get(p) ): - preset = PRESETS[p] - r, g, b = preset["color"] - brightness = preset["brightness"] - - controller.setLightColor( index, r, g, b ) - controller.setLightBrightness( index, brightness ) - else: - print("Error: Unknown preset '" + p + "'") - else: - print("Error: Light index '" + str(index) + "' out of range") - - def setPreset( presetID:str, index:int=-1 ): - if( PRESETS.get(presetID) ): - if( index == -1 ): - for key in LIGHTS: - controller.setLightPreset( key, presetID ) - else: - controller.setLightPreset( index, presetID ) - else: - print("Error: Unknown preset '" + presetID + "'") - - def countLights(): - return len(LIGHTS) - - # Controller "system" functions - def delay(n:int): - time.sleep(n) - - def init(): - jsonLights = loop.run_until_complete(APIrequest.get("/lights")) - - global LIGHTS - LIGHTS = json.loads(jsonLights.text) - - def end(): - loop.close() + # Internal get functions + async def getLights(): + return await APIrequest.get("/lights") + + async def getLight(index: int=1): + return await APIrequest.get( "/lights/" + str(index) ) + + # Lower level light manipulation (async) + async def toggleLight(index: int=1, isOn: bool=True): + await APIrequest.put( "/lights/" + str(index) + "/state", '{"on":' + boolToString(isOn) + '}' ) + + async def toggleLights(isOn: bool=True): + for key in LIGHTS: + await controller.toggleLight(key, isOn) + + async def setLightRGB( index: int, r:int, g:int, b:int ): + h, s, v = rgbToHsv(r, g, b) + payload = '{"sat":' + str(s) + ', "bri":' + str(v) + ', "hue":' + str(h) + '}' + + await APIrequest.put( "/lights/" + str(index) + "/state", payload ) + + # Normal functions + def switchLight( index: int=1 ): + key = LIGHTS.get(str(index)) + if(key): + if( key.get("state") ): + curPower = LIGHTS[str(index)]["state"]["on"] + loop.run_until_complete( controller.toggleLight(index, not curPower)) + else: + print("Error: Light index '" + str(index) + "' out of range") + + def switchLights(): + for key in LIGHTS: + controller.switchLight(key) + + # Light control + def setLightColor( index:int, r:int, g:int, b:int ): + if( LIGHTS.get(str(index)) ): + loop.run_until_complete( controller.setLightRGB(index, r, g, b) ) + else: + print("Error: Light index '" + str(index) + "' out of range") + + def setLightBrightness( index:int, b:int ): + if( LIGHTS.get(str(index)) ): + payload = '{"bri":' + str(b) + '}' + loop.run_until_complete( APIrequest.put( "/lights/" + str(index) + "/state", payload ) ) + else: + print("Error: Light index '" + str(index) + "' out of range") + + def setBrightness( b:int ): + for key in LIGHTS: + controller.setLightBrightness( key, b ) + + def setAllLightsColor( r:int, g:int, b:int ): + for key in LIGHTS: + controller.setLightColor( key, r, g, b ) + + def Power(isOn:bool=True): # Controlling the power of the lights + loop.run_until_complete( controller.toggleLights(isOn) ) + + def powerLight( index:int, isOn:bool=True ): + loop.run_until_complete( controller.toggleLight( index, isOn ) ) + + # Presets + def setLightPreset( index:int, p:str ): + if( LIGHTS.get(str(index)) ): + if( PRESETS.get(p) ): + preset = PRESETS[p] + r, g, b = preset["color"] + brightness = preset["brightness"] + + controller.setLightColor( index, r, g, b ) + controller.setLightBrightness( index, brightness ) + else: + print("Error: Unknown preset '" + p + "'") + else: + print("Error: Light index '" + str(index) + "' out of range") + + def setPreset( presetID:str, index:int=-1 ): + if( PRESETS.get(presetID) ): + if( index == -1 ): + for key in LIGHTS: + controller.setLightPreset( key, presetID ) + else: + controller.setLightPreset( index, presetID ) + else: + print("Error: Unknown preset '" + presetID + "'") + + def countLights(): + return len(LIGHTS) + + # Controller "system" functions + def delay(n:int): + time.sleep(n) + + def init(): + jsonLights = loop.run_until_complete(APIrequest.get("/lights")) + + global LIGHTS + LIGHTS = json.loads(jsonLights.text) + + def end(): + loop.close() diff --git a/hue_remote/hue_remote.py b/hue_remote/hue_remote.py index 65005ff..d0bf730 100755 --- a/hue_remote/hue_remote.py +++ b/hue_remote/hue_remote.py @@ -8,100 +8,100 @@ import hue_controller as hue # Actual controller cmd = "hue" def help(): - print("--Help page--") + print("--Help page--") - print( "'" + cmd + "' : Display this help page" ) - print( "'" + cmd + " light (index)' ... : Specify light target, from 1-" + str(hue.controller.countLights()) ) - print( "'" + cmd + " lights' ... : Specify all lights\n" ) + print( "'" + cmd + "' : Display this help page" ) + print( "'" + cmd + " light (index)' ... : Specify light target, from 1-" + str(hue.controller.countLights()) ) + print( "'" + cmd + " lights' ... : Specify all lights\n" ) - print("--Commands--") - print( "'on'/'off' : Turn light(s) on/off" ) - print( "'switch' : Switch the light(s) power" ) - print( "'set ...'" ) - print( " 'preset (preset ID)' : Set the preset (from presets.py)" ) - print( " 'color (red) (green) (blue)' : Set the color, from 0-255" ) - print( " 'brightness (brightness)' : Set the brightness, from 0-255" ) + print("--Commands--") + print( "'on'/'off' : Turn light(s) on/off" ) + print( "'switch' : Switch the light(s) power" ) + print( "'set ...'" ) + print( " 'preset (preset ID)' : Set the preset (from presets.py)" ) + print( " 'color (red) (green) (blue)' : Set the color, from 0-255" ) + print( " 'brightness (brightness)' : Set the brightness, from 0-255" ) - print("\nExamples:\n'hue light 2 on' : Turn on light 2\n'hue lights set color 255 255 255' : Set all lights colors to white") + print("\nExamples:\n'hue light 2 on' : Turn on light 2\n'hue lights set color 255 255 255' : Set all lights colors to white") boolConvert = { - "on": True, - "off": False + "on": True, + "off": False } # this is the most spaghetti-ish code I have ever written but it works def parseCommand( cmd:list, pos:int, i=-1 ): - index = int(i) - try: - if( cmd[pos] == "on" or cmd[pos] == "off" ): - if( index == -1 ): - hue.controller.Power( boolConvert[cmd[pos]] ) - else: - hue.controller.powerLight( index, boolConvert[cmd[pos]] ) + index = int(i) + try: + if( cmd[pos] == "on" or cmd[pos] == "off" ): + if( index == -1 ): + hue.controller.Power( boolConvert[cmd[pos]] ) + else: + hue.controller.powerLight( index, boolConvert[cmd[pos]] ) - return + return - elif( cmd[pos] == "switch" ): - if(index == -1): - hue.controller.switchLights() - else: - hue.controller.switchLight(index) + elif( cmd[pos] == "switch" ): + if(index == -1): + hue.controller.switchLights() + else: + hue.controller.switchLight(index) - return + return - elif( cmd[pos] == "set" ): - if( cmd[pos+1] == "preset" ): - hue.controller.setPreset( cmd[pos+2], index ) - return + elif( cmd[pos] == "set" ): + if( cmd[pos+1] == "preset" ): + hue.controller.setPreset( cmd[pos+2], index ) + return - elif( cmd[pos+1] == "color" ): - if( len(cmd) > pos+4 ): - r, g, b = int(cmd[pos+2]), int(cmd[pos+3]), int(cmd[pos+4]) + elif( cmd[pos+1] == "color" ): + if( len(cmd) > pos+4 ): + r, g, b = int(cmd[pos+2]), int(cmd[pos+3]), int(cmd[pos+4]) - if( index == -1 ): - hue.controller.setAllLightsColor( r, g, b ) # this code is bad - else: - hue.controller.setLightColor( index, r, g, b ) + if( index == -1 ): + hue.controller.setAllLightsColor( r, g, b ) # this code is bad + else: + hue.controller.setLightColor( index, r, g, b ) - return - else: - print("Error: Missing parameters") - help() + return + else: + print("Error: Missing parameters") + help() - elif( cmd[pos+1] == "brightness" ): - if( len(cmd) > pos+2 ): - bri = int(cmd[pos+2]) + elif( cmd[pos+1] == "brightness" ): + if( len(cmd) > pos+2 ): + bri = int(cmd[pos+2]) - if( index == -1 ): - hue.controller.setBrightness(bri) - else: - hue.controller.setLightBrightness( index, bri ) + if( index == -1 ): + hue.controller.setBrightness(bri) + else: + hue.controller.setLightBrightness( index, bri ) - return - help() # display help if function did nothing + return + help() # display help if function did nothing - except (RuntimeError, TypeError, NameError, IndexError) as err: - help() # display the help page if parameters are missing (it will give out an IndexError) - print( "\n\nError: " + str(err) ) + except (RuntimeError, TypeError, NameError, IndexError) as err: + help() # display the help page if parameters are missing (it will give out an IndexError) + print( "\n\nError: " + str(err) ) def parseCommandline(): - cmd = sys.argv + cmd = sys.argv - if( len(cmd) > 1 ): - if( cmd[1] == "light" ): - parseCommand( cmd, 3, cmd[2] ) + if( len(cmd) > 1 ): + if( cmd[1] == "light" ): + parseCommand( cmd, 3, cmd[2] ) - elif( cmd[1] == "lights" ): - parseCommand( cmd, 2 ) - else: - help() + elif( cmd[1] == "lights" ): + parseCommand( cmd, 2 ) + else: + help() def init(): - hue.controller.init() # very important to initialize the controller - parseCommandline() - hue.controller.end() # also to end it + hue.controller.init() # very important to initialize the controller + parseCommandline() + hue.controller.end() # also to end it init() # actually call the init function