Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@tcastberg
Created August 16, 2017 08:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tcastberg/b4ceb4763c2b6c86f8b8d22658281de3 to your computer and use it in GitHub Desktop.
Save tcastberg/b4ceb4763c2b6c86f8b8d22658281de3 to your computer and use it in GitHub Desktop.
Script to push chromecast playing state to Fibaro HC2/HCL
#!/usr/bin/env python
import pychromecast
import time
import requests
import logging
import sys
import daemon
# Delay between each search for new chromecasts
delay = 60
# Values needed to connect to Fibaro HC2
hostname = "<FIBARO HOSTNAME>"
username = "<FIBARO USERNAME>"
password = "<FIBARO PASSWORD>"
logger = None
class DeviceStatusUpdater:
def __init__(self, device):
self.device = device
self.thumbnail = ""
self.sendDeviceStatus()
self.device.media_controller.register_status_listener(self)
def new_media_status(self, status):
self.sendDeviceStatus()
def addDeviceInfo(self, topic, payload):
logger.info("%s info: %s - %s", str(self.device.name), topic, payload)
return {topic: payload}
def sendDeviceStatus(self):
deviceInfo = {}
deviceInfo.update(self.addDeviceInfo("name", self.device.name))
deviceInfo.update(self.addDeviceInfo("host", self.device.host))
if len(str(self.device.app_display_name)):
deviceInfo.update(self.addDeviceInfo("app", self.device.app_display_name))
else:
deviceInfo.update(self.addDeviceInfo("app", "None"))
if self.device.media_controller is not None:
if self.device.media_controller.status is not None:
if self.device.media_controller.status.player_state in [pychromecast.controllers.media.MEDIA_PLAYER_STATE_PLAYING, pychromecast.controllers.media.MEDIA_PLAYER_STATE_BUFFERING]:
deviceInfo.update(self.addDeviceInfo("is_playing", "True"))
else:
deviceInfo.update(self.addDeviceInfo("is_playing", "False"))
deviceInfo.update(self.addDeviceInfo("title", self.device.media_controller.status.title))
deviceInfo.update(self.addDeviceInfo("series_title", self.device.media_controller.status.series_title))
logger.info("Updating cc_%s with play status %s" % (deviceInfo['name'].replace(' ', '_'), deviceInfo['is_playing']))
hc2Url = 'http://%s/api/globalVariables/cc_%s' % (hostname, deviceInfo['name'].replace(' ', '_'))
hc2Data = '{"value":"%s","invokeScenes":true}' % deviceInfo['is_playing']
logger.debug(hc2Url)
logger.debug(hc2Data)
req = requests.put(hc2Url, data=hc2Data, auth=(username, password))
if req.status_code is not 200:
logger.error("HC2 connection status code is %d" % req.status_code)
def chromecast_loop():
global logger
myDevices = []
while True:
ccNames = [o.device.name for o in myDevices]
devices = pychromecast.get_chromecasts(tries=3)
for device in devices:
logger.info("Discovered device: %s (%s) - %s", device.device.friendly_name, device.host, device.model_name)
if device.device.friendly_name not in ccNames:
logger.info("%s is not in myDevices", device.device.friendly_name)
myDevices.append(DeviceStatusUpdater(device))
else:
logger.debug("Disconnecting unused socket")
device.disconnect()
newCcNames = [o.device.friendly_name for o in devices]
for device in myDevices:
if device.device.name not in newCcNames:
logger.info("%s no longer exists!", device.device.name)
try:
device.disconnect()
myDevices.remove(device)
except:
logger.info("Exception caught")
logger.debug("Sleeping for %d seconds...", delay)
time.sleep(delay)
def run():
global logger
fh = logging.FileHandler("./cc2hc2.log")
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger = logging.getLogger('cc2hc2')
logger.setLevel(logging.INFO)
logger.addHandler(fh)
context = daemon.DaemonContext(
files_preserve = [
fh.stream,
],
)
with context:
chromecast_loop()
if __name__ == "__main__":
run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment