Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion harmony/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
2 changes: 1 addition & 1 deletion harmony/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
58 changes: 57 additions & 1 deletion harmony/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down