denolfe
1/28/2014 - 9:13 AM

Quick hack to make make Philips Hue light bulbs dim down when using Chromecast (or, more specifically, when certain apps are open).

Quick hack to make make Philips Hue light bulbs dim down when using Chromecast (or, more specifically, when certain apps are open).

#!/usr/bin/env python

import os
import requests
import libxml2
import time
import phue
import daemon
import lockfile
import signal

trigger_apps = ["Plex/Chromecast"]
sleep_interval = 10

class Chromecast(object):
    apps_url = "http://%s:8008/apps/"

    def __init__(s, device_name):
        s.device_name = device_name

    def runningApp(s):
        try:
            response = requests.get(s.apps_url % s.device_name, timeout=2.0)
            data = libxml2.parseDoc(response.text)

            context = data.xpathNewContext()
            context.xpathRegisterNs("root", "urn:dial-multiscreen-org:schemas:dial")
            context.xpathRegisterNs("cast", "urn:chrome.google.com:cast")

            description = context.xpathEval("//cast:description")

            return description[0].content
        except:
            return "None"

class Hue(object):
    def __init__(s, device_name):
        s.device_name = device_name
        s.bridge = phue.Bridge(device_name)
        s.bridge.connect()
        s.dimmed = False

    def dimUp(s):
        s.dimmed = False
        for light in s.lights:
            s.bridge.set_light(light['id'], {'transitiontime':20,'on':True,'bri':light['bri'],'hue':light['hue'],'sat':light['sat']})

    def dimDown(s):
        s.dimmed = True
        s.lights = []
        for light in s.bridge.lights:
            s.lights.append({'id':light.light_id,'hue':light.hue,'on':light.on,'bri':light.brightness,'sat':light.saturation})

        s.bridge.set_light([2,3], {'transitiontime':20,'on':False})
        s.bridge.set_light(1, {'transitiontime':20,'on':True,'bri':1,'hue':65535,'sat':255})

def cleanup():
    if hue.dimmed:
        hue.dimUp()

chromecast = Chromecast("chromecast")
hue = Hue("philips-hue")

context = daemon.DaemonContext(pidfile = lockfile.FileLock(os.path.join(os.environ['HOME'], ".chromelight")))
context.signal_map = {
    signal.SIGTERM: cleanup,
    signal.SIGHUP: 'terminate'
}

context.stdout = open(os.path.join(os.environ['HOME'], '.chromelight.log'), 'w+')
context.stderr = context.stdout

with context:
    while True:
        app = chromecast.runningApp()
        print "Running:", app

        if app in trigger_apps:
            if not hue.dimmed:
                hue.dimDown()
                print "Dimming down"
        elif hue.dimmed:
            hue.dimUp()
            print "Dimming up"

        time.sleep(sleep_interval)