Skip to content

Commit 903d3de

Browse files
committed
v0.0.2 - added timeout
1 parent 857378b commit 903d3de

3 files changed

Lines changed: 128 additions & 98 deletions

File tree

afsapi/__init__.py

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@
44
"""
55
import asyncio
66
import aiohttp
7+
import logging
8+
import traceback
9+
710
from lxml import objectify
811

912
# pylint: disable=R0904
1013
class AFSAPI():
1114
"""Builds the interface to a Frontier Silicon device."""
1215

16+
DEFAULT_TIMEOUT_IN_SECONDS = 1
17+
1318
# states
1419
PLAY_STATES = {
1520
0: 'stopped',
@@ -43,9 +48,11 @@ class AFSAPI():
4348
'duration': 'netRemote.play.info.duration',
4449
}
4550

46-
def __init__(self, fsapi_device_url, pin):
51+
def __init__(self, fsapi_device_url, pin, timeout=DEFAULT_TIMEOUT_IN_SECONDS):
4752
self.fsapi_device_url = fsapi_device_url
4853
self.pin = pin
54+
self.timeout = timeout
55+
4956
self.sid = None
5057
self.__webfsapi = None
5158
self.__modes = None
@@ -62,7 +69,7 @@ def __del__(self):
6269
@asyncio.coroutine
6370
def get_fsapi_endpoint(self):
6471
"""Parse the fsapi endpoint from the device url."""
65-
endpoint = yield from self.__session.get(self.fsapi_device_url)
72+
endpoint = yield from self.__session.get(self.fsapi_device_url, timeout = self.timeout)
6673
text = yield from endpoint.text(encoding='utf-8')
6774
doc = objectify.fromstring(text)
6875
return doc.webfsapi.text
@@ -71,38 +78,46 @@ def get_fsapi_endpoint(self):
7178
def create_session(self):
7279
"""Create a session on the frontier silicon device."""
7380
req_url = '%s/%s' % (self.__webfsapi, 'CREATE_SESSION')
74-
sid = yield from self.__session.get(req_url, params=dict(pin=self.pin))
81+
sid = yield from self.__session.get(req_url, params=dict(pin=self.pin),
82+
timeout = self.timeout)
7583
text = yield from sid.text(encoding='utf-8')
7684
doc = objectify.fromstring(text)
7785
return doc.sessionId.text
7886

7987
@asyncio.coroutine
8088
def call(self, path, extra=None):
8189
"""Execute a frontier silicon API call."""
82-
if not self.__webfsapi:
83-
self.__webfsapi = yield from self.get_fsapi_endpoint()
84-
85-
if not self.sid:
86-
self.sid = yield from self.create_session()
90+
try:
91+
if not self.__webfsapi:
92+
self.__webfsapi = yield from self.get_fsapi_endpoint()
8793

88-
if not isinstance(extra, dict):
89-
extra = dict()
94+
if not self.sid:
95+
self.sid = yield from self.create_session()
9096

91-
params = dict(pin=self.pin, sid=self.sid)
92-
params.update(**extra)
97+
if not isinstance(extra, dict):
98+
extra = dict()
9399

94-
req_url = ('%s/%s' % (self.__webfsapi, path))
95-
result = yield from self.__session.get(req_url, params=params)
96-
if result.status == 200:
97-
text = yield from result.text(encoding='utf-8')
98-
else:
99-
self.sid = yield from self.create_session()
100100
params = dict(pin=self.pin, sid=self.sid)
101101
params.update(**extra)
102-
result = yield from self.__session.get(req_url, params=params)
103-
text = yield from result.text(encoding='utf-8')
104102

105-
return objectify.fromstring(text)
103+
req_url = ('%s/%s' % (self.__webfsapi, path))
104+
result = yield from self.__session.get(req_url, params=params,
105+
timeout = self.timeout)
106+
if result.status == 200:
107+
text = yield from result.text(encoding='utf-8')
108+
else:
109+
self.sid = yield from self.create_session()
110+
params = dict(pin=self.pin, sid=self.sid)
111+
params.update(**extra)
112+
result = yield from self.__session.get(req_url, params=params,
113+
timeout = self.timeout)
114+
text = yield from result.text(encoding='utf-8')
115+
116+
return objectify.fromstring(text)
117+
except Exception as e:
118+
logging.info('AFSAPI Exception: ' +traceback.format_exc())
119+
120+
return None
106121

107122
# Helper methods
108123

async_tests.py

Lines changed: 91 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,136 +1,151 @@
11
"""Test of the asynchronous Frontier Silicon interface."""
22
import asyncio
3+
import traceback
4+
import logging
5+
36
from afsapi import AFSAPI
47

5-
URL = 'http://192.168.1.180:80/device'
8+
URL = 'http://192.168.1.39:80/device'
69
PIN = 1234
7-
10+
TIMEOUT = 2 # in seconds
811

912

1013
@asyncio.coroutine
1114
def test_sys():
1215
""" Test sys functions."""
13-
afsapi = AFSAPI(URL, PIN)
16+
try:
17+
afsapi = AFSAPI(URL, PIN, TIMEOUT)
1418

15-
set_power = yield from afsapi.set_power(True)
16-
print('Set power succeeded? - %s' % set_power)
19+
set_power = yield from afsapi.set_power(True)
20+
print('Set power succeeded? - %s' % set_power)
1721

18-
power = yield from afsapi.get_power()
19-
print('Power on: %s' % power)
22+
power = yield from afsapi.get_power()
23+
print('Power on: %s' % power)
2024

21-
end_point = yield from afsapi.get_fsapi_endpoint()
22-
print('Endpoint: %s' % end_point)
25+
end_point = yield from afsapi.get_fsapi_endpoint()
26+
print('Endpoint: %s' % end_point)
2327

24-
set_friendly_name = yield from afsapi.set_friendly_name('Badezimmer')
25-
print('Set friendly name? - %s' % set_friendly_name)
28+
set_friendly_name = yield from afsapi.set_friendly_name('Badezimmer')
29+
print('Set friendly name? - %s' % set_friendly_name)
2630

27-
friendly_name = yield from afsapi.get_friendly_name()
28-
print('Friendly name: %s' % friendly_name)
31+
friendly_name = yield from afsapi.get_friendly_name()
32+
print('Friendly name: %s' % friendly_name)
2933

30-
modes = yield from afsapi.get_modes()
31-
print('Modes: %s' % modes)
34+
modes = yield from afsapi.get_modes()
35+
print('Modes: %s' % modes)
3236

33-
mode_list = yield from afsapi.get_mode_list()
34-
print('Mode List: %s' % mode_list)
37+
mode_list = yield from afsapi.get_mode_list()
38+
print('Mode List: %s' % mode_list)
3539

36-
equalisers = yield from afsapi.get_equalisers()
37-
print('Equaliser: %s' % equalisers)
40+
equalisers = yield from afsapi.get_equalisers()
41+
print('Equaliser: %s' % equalisers)
3842

39-
equaliser_list = yield from afsapi.get_equaliser_list()
40-
print('Equaliser List: %s' % equaliser_list)
43+
equaliser_list = yield from afsapi.get_equaliser_list()
44+
print('Equaliser List: %s' % equaliser_list)
4145

42-
mode = yield from afsapi.get_mode()
43-
print('Mode: %s' % mode)
46+
mode = yield from afsapi.get_mode()
47+
print('Mode: %s' % mode)
4448

45-
power = yield from afsapi.set_power(False)
46-
print('Set power succeeded? - %s' % set_power)
49+
power = yield from afsapi.set_power(False)
50+
print('Set power succeeded? - %s' % set_power)
4751

48-
set_sleep = yield from afsapi.set_sleep(10)
49-
print('Set sleep succeeded? - %s' % set_sleep)
52+
set_sleep = yield from afsapi.set_sleep(10)
53+
print('Set sleep succeeded? - %s' % set_sleep)
5054

51-
sleep = yield from afsapi.get_sleep()
52-
print('Sleep: %s' % sleep)
55+
sleep = yield from afsapi.get_sleep()
56+
print('Sleep: %s' % sleep)
5357

54-
power = yield from afsapi.get_power()
55-
print('Power on: %s' % power)
58+
power = yield from afsapi.get_power()
59+
print('Power on: %s' % power)
60+
except Exception as e:
61+
logging.error(traceback.format_exc())
5662

5763
@asyncio.coroutine
5864
def test_volume():
5965
""" Test volume functions."""
60-
afsapi = AFSAPI(URL, PIN)
66+
try:
67+
afsapi = AFSAPI(URL, PIN, TIMEOUT)
6168

62-
set_power = yield from afsapi.set_power(True)
63-
print('Set power succeeded? - %s' % set_power)
69+
set_power = yield from afsapi.set_power(True)
70+
print('Set power succeeded? - %s' % set_power)
6471

65-
power = yield from afsapi.get_power()
66-
print('Power on: %s' % power)
72+
power = yield from afsapi.get_power()
73+
print('Power on: %s' % power)
6774

68-
volume = yield from afsapi.get_volume()
69-
print('Volume: %s' % volume)
75+
volume = yield from afsapi.get_volume()
76+
print('Volume: %s' % volume)
7077

71-
set_volume = yield from afsapi.set_volume(3)
72-
print('Set volume succeeded? - %s' % set_volume)
78+
set_volume = yield from afsapi.set_volume(3)
79+
print('Set volume succeeded? - %s' % set_volume)
7380

74-
volume_steps = yield from afsapi.get_volume_steps()
75-
print('Volume steps: % s' % volume_steps)
81+
volume_steps = yield from afsapi.get_volume_steps()
82+
print('Volume steps: % s' % volume_steps)
7683

77-
mute = yield from afsapi.get_mute()
78-
print('Is muted: %s' % mute)
84+
mute = yield from afsapi.get_mute()
85+
print('Is muted: %s' % mute)
7986

80-
power = yield from afsapi.set_power(False)
81-
print('Set power succeeded? - %s' % set_power)
87+
power = yield from afsapi.set_power(False)
88+
print('Set power succeeded? - %s' % set_power)
8289

83-
power = yield from afsapi.get_power()
84-
print('Power on: %s' % power)
90+
power = yield from afsapi.get_power()
91+
print('Power on: %s' % power)
92+
except Exception as e:
93+
logging.error(traceback.format_exc())
8594

8695
@asyncio.coroutine
8796
def test_info():
8897
""" Test info functions."""
89-
afsapi = AFSAPI(URL, PIN)
98+
try:
99+
afsapi = AFSAPI(URL, PIN, TIMEOUT)
90100

91-
set_power = yield from afsapi.set_power(True)
92-
print('Set power succeeded? - %s' % set_power)
101+
set_power = yield from afsapi.set_power(True)
102+
print('Set power succeeded? - %s' % set_power)
93103

94-
power = yield from afsapi.get_power()
95-
print('Power on: %s' % power)
104+
power = yield from afsapi.get_power()
105+
print('Power on: %s' % power)
96106

97-
name = yield from afsapi.get_play_name()
98-
print('Name: %s' % name)
107+
name = yield from afsapi.get_play_name()
108+
print('Name: %s' % name)
99109

100-
text = yield from afsapi.get_play_text()
101-
print('Text: %s' % text)
110+
text = yield from afsapi.get_play_text()
111+
print('Text: %s' % text)
102112

103-
artist = yield from afsapi.get_play_artist()
104-
print('Artist: %s' % artist)
113+
artist = yield from afsapi.get_play_artist()
114+
print('Artist: %s' % artist)
105115

106-
album = yield from afsapi.get_play_album()
107-
print('Album: %s' % album)
116+
album = yield from afsapi.get_play_album()
117+
print('Album: %s' % album)
108118

109-
graphic = yield from afsapi.get_play_graphic()
110-
print('Graphic: %s' % graphic)
119+
graphic = yield from afsapi.get_play_graphic()
120+
print('Graphic: %s' % graphic)
111121

112-
duration = yield from afsapi.get_play_duration()
113-
print('Duration: %s' % duration)
122+
duration = yield from afsapi.get_play_duration()
123+
print('Duration: %s' % duration)
114124

115-
power = yield from afsapi.set_power(False)
116-
print('Set power succeeded? - %s' % set_power)
125+
power = yield from afsapi.set_power(False)
126+
print('Set power succeeded? - %s' % set_power)
117127

118-
power = yield from afsapi.get_power()
119-
print('Power on: %s' % power)
128+
power = yield from afsapi.get_power()
129+
print('Power on: %s' % power)
130+
except Exception as e:
131+
logging.error(traceback.format_exc())
120132

121133
@asyncio.coroutine
122134
def test_play():
123135
""" Test play functions."""
124-
afsapi = AFSAPI(URL, PIN)
136+
try:
137+
afsapi = AFSAPI(URL, PIN, TIMEOUT)
125138

126-
status = yield from afsapi.get_play_status()
127-
print('Status: %s' % status)
139+
status = yield from afsapi.get_play_status()
140+
print('Status: %s' % status)
128141

129-
anext = yield from afsapi.next()
130-
print('Next succeeded? - %s' % anext)
142+
anext = yield from afsapi.next()
143+
print('Next succeeded? - %s' % anext)
131144

132-
prev = yield from afsapi.prev()
133-
print('Prev succeeded? - %s' % prev)
145+
prev = yield from afsapi.prev()
146+
print('Prev succeeded? - %s' % prev)
147+
except Exception as e:
148+
logging.error(traceback.format_exc())
134149

135150
LOOP = asyncio.get_event_loop()
136151
LOOP.run_until_complete(test_sys())

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
]
2727

2828
setup(name='afsapi',
29-
version='0.0.1',
29+
version='0.0.2',
3030
description='Asynchronous Implementation of the Frontier Silicon API',
3131
author='Krasimir Zhelev',
3232
author_email='krasimir.zhelev@gmail.com',

0 commit comments

Comments
 (0)