diff --git a/harmony/__main__.py b/harmony/__main__.py index 9dd2026..2624c6c 100644 --- a/harmony/__main__.py +++ b/harmony/__main__.py @@ -38,7 +38,7 @@ def show_config(args): client = harmony_client.create_and_connect_client( args.harmony_ip, args.harmony_port, token) pprint.pprint(client.get_config()) - client.disconnect(send_close=False) + client.disconnect(send_close=True) return 0 diff --git a/harmony/auth.py b/harmony/auth.py index 89ee912..8df40c7 100644 --- a/harmony/auth.py +++ b/harmony/auth.py @@ -67,7 +67,7 @@ def __init__(self, token): 'feature_mechanisms': {'unencrypted_plain': True}, } super(SwapAuthToken, self).__init__( - 'guest@x.com', 'guest', plugin_config=plugin_config) + 'guest@connect.logitech.com/gatorade.', 'gatorade.', plugin_config=plugin_config) self.token = token self.uuid = None diff --git a/harmony/client.py b/harmony/client.py index 9da45ba..146f94b 100644 --- a/harmony/client.py +++ b/harmony/client.py @@ -15,7 +15,7 @@ class HarmonyClient(sleekxmpp.ClientXMPP): """An XMPP client for connecting to the Logitech Harmony.""" def __init__(self, auth_token): - user = '%s@x.com' % auth_token + user = '%s@connect.logitech.com/gatorade.' % auth_token password = auth_token plugin_config = { # Enables PLAIN authentication which is off by default. @@ -45,6 +45,62 @@ def get_config(self): device_list = action_cmd.text return json.loads(device_list) + def get_current_activity(self): + """Retrieves the current activity. + + Returns: + A int with the activity ID. + """ + iq_cmd = self.Iq() + iq_cmd['type'] = 'get' + action_cmd = ET.Element('oa') + action_cmd.attrib['xmlns'] = 'connect.logitech.com' + action_cmd.attrib['mime'] = ( + 'vnd.logitech.harmony/vnd.logitech.harmony.engine?getCurrentActivity') + iq_cmd.set_payload(action_cmd) + result = iq_cmd.send(block=True) + payload = result.get_payload() + assert len(payload) == 1 + action_cmd = payload[0] + assert action_cmd.attrib['errorcode'] == '200' + activity = action_cmd.text.split("=") + return int(activity[1]) + + def start_activity(self, activity_id): + """Starts an activity. + + Args: + activity_id: An int or string identifying the activity to start + + Returns: + A nested dictionary containing activities, devices, etc. + """ + iq_cmd = self.Iq() + iq_cmd['type'] = 'get' + action_cmd = ET.Element('oa') + action_cmd.attrib['xmlns'] = 'connect.logitech.com' + action_cmd.attrib['mime'] = ('harmony.engine?startactivity') + cmd = 'activityId=' + str(activity_id) + ':timestamp=0' + action_cmd.text = cmd + iq_cmd.set_payload(action_cmd) + result = iq_cmd.send(block=True) + payload = result.get_payload() + assert len(payload) == 1 + action_cmd = payload[0] + return action_cmd.text + + def turn_off(self): + """Turns the system off if it's on, otherwise it does nothing. + + Returns: + True. + """ + activity = self.get_current_activity() + print activity + if activity != -1: + print "OFF" + self.start_activity(-1) + return True def create_and_connect_client(ip_address, port, token): """Creates a Harmony client and initializes session.