import requests import xmltodict import urllib3 def grab_xml(host, token=None): """Grab XML data from Gateway, returned as a dict.""" urllib3.disable_warnings() if token: scheme = "https" if not token: scheme = "http" token = "1234567890" url = ( scheme + '://' + host + '/gwr/gop.php?cmd=GWRBatch&data=RoomGetCarousel1' + token + 'name,status&fmt=xml') response = requests.get(url, verify=False) parsed = xmltodict.parse(response.content, force_list={'room', 'device'}) parsed = parsed['gwrcmds']['gwrcmd']['gdata']['gip']['room'] return parsed def set_brightness(host, did, value, token=None): """Set brightness of a bulb or fixture.""" urllib3.disable_warnings() if token: scheme = "https" if not token: scheme = "http" token = "1234567890" url = ( scheme + '://' + host + '/gwr/gop.php?cmd=DeviceSendCommand&data=1' + token + '' + did + '' + str( value) + 'level&fmt=xml') response = requests.get(url, verify=False) if response.status_code == '200': return True else: return False def hass_brightness(device): """Home Assistant logic for determining brightness""" if 'level' in device: level = int((int(device['level']) / 100) * 255) return level else: return 0 def turn_on(host, did, token=None): """Turn on bulb or fixture""" urllib3.disable_warnings() if token: scheme = "https" if not token: scheme = "http" token = "1234567890" url = ( scheme + '://' + host + '/gwr/gop.php?cmd=DeviceSendCommand&data=1' + token + '' + did + '1&fmt=xml') response = requests.get(url, verify=False) if response.status_code == '200': return True else: return False def turn_off(host, did, token=None): """Turn off bulb or fixture""" urllib3.disable_warnings() if token: scheme = "https" if not token: scheme = "http" token = "1234567890" url = ( scheme + '://' + host + '/gwr/gop.php?cmd=DeviceSendCommand&data=1' + token + '' + did + '0&fmt=xml') response = requests.get(url, verify=False) if response.status_code == '200': return True else: return False def check_online(device): """Home Assistant Logic for Determining Device Availability""" return 'offline' not in device def grab_token(host, email, password): """Grab token from gateway. Press sync button before running.""" urllib3.disable_warnings() url = ('https://' + host + '/gwr/gop.php?cmd=GWRLogin&data=1' + str(email) + '' + str(password) + '&fmt=xml') response = requests.get(url, verify=False) if '404' in response.text: raise PermissionError('Not In Pairing Mode') parsed = xmltodict.parse(response.content) parsed = parsed['gip']['token'] return parsed def grab_bulbs(host, token=None): """Grab XML, then add all bulbs to a dict. Removes room functionality""" xml = grab_xml(host, token) bulbs = {} for room in xml: for device in room['device']: bulbs[int(device['did'])] = device return bulbs