Created
August 16, 2017 08:33
-
-
Save tcastberg/b4ceb4763c2b6c86f8b8d22658281de3 to your computer and use it in GitHub Desktop.
Script to push chromecast playing state to Fibaro HC2/HCL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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