Skip to content

Commit

Permalink
v0.0.2 - added timeout
Browse files Browse the repository at this point in the history
  • Loading branch information
zhelev committed Feb 18, 2018
1 parent 857378b commit 903d3de
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 98 deletions.
57 changes: 36 additions & 21 deletions afsapi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,17 @@
"""
import asyncio
import aiohttp
import logging
import traceback

from lxml import objectify

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

DEFAULT_TIMEOUT_IN_SECONDS = 1

# states
PLAY_STATES = {
0: 'stopped',
Expand Down Expand Up @@ -43,9 +48,11 @@ class AFSAPI():
'duration': 'netRemote.play.info.duration',
}

def __init__(self, fsapi_device_url, pin):
def __init__(self, fsapi_device_url, pin, timeout=DEFAULT_TIMEOUT_IN_SECONDS):
self.fsapi_device_url = fsapi_device_url
self.pin = pin
self.timeout = timeout

self.sid = None
self.__webfsapi = None
self.__modes = None
Expand All @@ -62,7 +69,7 @@ def __del__(self):
@asyncio.coroutine
def get_fsapi_endpoint(self):
"""Parse the fsapi endpoint from the device url."""
endpoint = yield from self.__session.get(self.fsapi_device_url)
endpoint = yield from self.__session.get(self.fsapi_device_url, timeout = self.timeout)
text = yield from endpoint.text(encoding='utf-8')
doc = objectify.fromstring(text)
return doc.webfsapi.text
Expand All @@ -71,38 +78,46 @@ def get_fsapi_endpoint(self):
def create_session(self):
"""Create a session on the frontier silicon device."""
req_url = '%s/%s' % (self.__webfsapi, 'CREATE_SESSION')
sid = yield from self.__session.get(req_url, params=dict(pin=self.pin))
sid = yield from self.__session.get(req_url, params=dict(pin=self.pin),
timeout = self.timeout)
text = yield from sid.text(encoding='utf-8')
doc = objectify.fromstring(text)
return doc.sessionId.text

@asyncio.coroutine
def call(self, path, extra=None):
"""Execute a frontier silicon API call."""
if not self.__webfsapi:
self.__webfsapi = yield from self.get_fsapi_endpoint()

if not self.sid:
self.sid = yield from self.create_session()
try:
if not self.__webfsapi:
self.__webfsapi = yield from self.get_fsapi_endpoint()

if not isinstance(extra, dict):
extra = dict()
if not self.sid:
self.sid = yield from self.create_session()

params = dict(pin=self.pin, sid=self.sid)
params.update(**extra)
if not isinstance(extra, dict):
extra = dict()

req_url = ('%s/%s' % (self.__webfsapi, path))
result = yield from self.__session.get(req_url, params=params)
if result.status == 200:
text = yield from result.text(encoding='utf-8')
else:
self.sid = yield from self.create_session()
params = dict(pin=self.pin, sid=self.sid)
params.update(**extra)
result = yield from self.__session.get(req_url, params=params)
text = yield from result.text(encoding='utf-8')

return objectify.fromstring(text)
req_url = ('%s/%s' % (self.__webfsapi, path))
result = yield from self.__session.get(req_url, params=params,
timeout = self.timeout)
if result.status == 200:
text = yield from result.text(encoding='utf-8')
else:
self.sid = yield from self.create_session()
params = dict(pin=self.pin, sid=self.sid)
params.update(**extra)
result = yield from self.__session.get(req_url, params=params,
timeout = self.timeout)
text = yield from result.text(encoding='utf-8')

return objectify.fromstring(text)
except Exception as e:
logging.info('AFSAPI Exception: ' +traceback.format_exc())

return None

# Helper methods

Expand Down
167 changes: 91 additions & 76 deletions async_tests.py
Original file line number Diff line number Diff line change
@@ -1,136 +1,151 @@
"""Test of the asynchronous Frontier Silicon interface."""
import asyncio
import traceback
import logging

from afsapi import AFSAPI

URL = 'http://192.168.1.180:80/device'
URL = 'http://192.168.1.39:80/device'
PIN = 1234

TIMEOUT = 2 # in seconds


@asyncio.coroutine
def test_sys():
""" Test sys functions."""
afsapi = AFSAPI(URL, PIN)
try:
afsapi = AFSAPI(URL, PIN, TIMEOUT)

set_power = yield from afsapi.set_power(True)
print('Set power succeeded? - %s' % set_power)
set_power = yield from afsapi.set_power(True)
print('Set power succeeded? - %s' % set_power)

power = yield from afsapi.get_power()
print('Power on: %s' % power)
power = yield from afsapi.get_power()
print('Power on: %s' % power)

end_point = yield from afsapi.get_fsapi_endpoint()
print('Endpoint: %s' % end_point)
end_point = yield from afsapi.get_fsapi_endpoint()
print('Endpoint: %s' % end_point)

set_friendly_name = yield from afsapi.set_friendly_name('Badezimmer')
print('Set friendly name? - %s' % set_friendly_name)
set_friendly_name = yield from afsapi.set_friendly_name('Badezimmer')
print('Set friendly name? - %s' % set_friendly_name)

friendly_name = yield from afsapi.get_friendly_name()
print('Friendly name: %s' % friendly_name)
friendly_name = yield from afsapi.get_friendly_name()
print('Friendly name: %s' % friendly_name)

modes = yield from afsapi.get_modes()
print('Modes: %s' % modes)
modes = yield from afsapi.get_modes()
print('Modes: %s' % modes)

mode_list = yield from afsapi.get_mode_list()
print('Mode List: %s' % mode_list)
mode_list = yield from afsapi.get_mode_list()
print('Mode List: %s' % mode_list)

equalisers = yield from afsapi.get_equalisers()
print('Equaliser: %s' % equalisers)
equalisers = yield from afsapi.get_equalisers()
print('Equaliser: %s' % equalisers)

equaliser_list = yield from afsapi.get_equaliser_list()
print('Equaliser List: %s' % equaliser_list)
equaliser_list = yield from afsapi.get_equaliser_list()
print('Equaliser List: %s' % equaliser_list)

mode = yield from afsapi.get_mode()
print('Mode: %s' % mode)
mode = yield from afsapi.get_mode()
print('Mode: %s' % mode)

power = yield from afsapi.set_power(False)
print('Set power succeeded? - %s' % set_power)
power = yield from afsapi.set_power(False)
print('Set power succeeded? - %s' % set_power)

set_sleep = yield from afsapi.set_sleep(10)
print('Set sleep succeeded? - %s' % set_sleep)
set_sleep = yield from afsapi.set_sleep(10)
print('Set sleep succeeded? - %s' % set_sleep)

sleep = yield from afsapi.get_sleep()
print('Sleep: %s' % sleep)
sleep = yield from afsapi.get_sleep()
print('Sleep: %s' % sleep)

power = yield from afsapi.get_power()
print('Power on: %s' % power)
power = yield from afsapi.get_power()
print('Power on: %s' % power)
except Exception as e:
logging.error(traceback.format_exc())

@asyncio.coroutine
def test_volume():
""" Test volume functions."""
afsapi = AFSAPI(URL, PIN)
try:
afsapi = AFSAPI(URL, PIN, TIMEOUT)

set_power = yield from afsapi.set_power(True)
print('Set power succeeded? - %s' % set_power)
set_power = yield from afsapi.set_power(True)
print('Set power succeeded? - %s' % set_power)

power = yield from afsapi.get_power()
print('Power on: %s' % power)
power = yield from afsapi.get_power()
print('Power on: %s' % power)

volume = yield from afsapi.get_volume()
print('Volume: %s' % volume)
volume = yield from afsapi.get_volume()
print('Volume: %s' % volume)

set_volume = yield from afsapi.set_volume(3)
print('Set volume succeeded? - %s' % set_volume)
set_volume = yield from afsapi.set_volume(3)
print('Set volume succeeded? - %s' % set_volume)

volume_steps = yield from afsapi.get_volume_steps()
print('Volume steps: % s' % volume_steps)
volume_steps = yield from afsapi.get_volume_steps()
print('Volume steps: % s' % volume_steps)

mute = yield from afsapi.get_mute()
print('Is muted: %s' % mute)
mute = yield from afsapi.get_mute()
print('Is muted: %s' % mute)

power = yield from afsapi.set_power(False)
print('Set power succeeded? - %s' % set_power)
power = yield from afsapi.set_power(False)
print('Set power succeeded? - %s' % set_power)

power = yield from afsapi.get_power()
print('Power on: %s' % power)
power = yield from afsapi.get_power()
print('Power on: %s' % power)
except Exception as e:
logging.error(traceback.format_exc())

@asyncio.coroutine
def test_info():
""" Test info functions."""
afsapi = AFSAPI(URL, PIN)
try:
afsapi = AFSAPI(URL, PIN, TIMEOUT)

set_power = yield from afsapi.set_power(True)
print('Set power succeeded? - %s' % set_power)
set_power = yield from afsapi.set_power(True)
print('Set power succeeded? - %s' % set_power)

power = yield from afsapi.get_power()
print('Power on: %s' % power)
power = yield from afsapi.get_power()
print('Power on: %s' % power)

name = yield from afsapi.get_play_name()
print('Name: %s' % name)
name = yield from afsapi.get_play_name()
print('Name: %s' % name)

text = yield from afsapi.get_play_text()
print('Text: %s' % text)
text = yield from afsapi.get_play_text()
print('Text: %s' % text)

artist = yield from afsapi.get_play_artist()
print('Artist: %s' % artist)
artist = yield from afsapi.get_play_artist()
print('Artist: %s' % artist)

album = yield from afsapi.get_play_album()
print('Album: %s' % album)
album = yield from afsapi.get_play_album()
print('Album: %s' % album)

graphic = yield from afsapi.get_play_graphic()
print('Graphic: %s' % graphic)
graphic = yield from afsapi.get_play_graphic()
print('Graphic: %s' % graphic)

duration = yield from afsapi.get_play_duration()
print('Duration: %s' % duration)
duration = yield from afsapi.get_play_duration()
print('Duration: %s' % duration)

power = yield from afsapi.set_power(False)
print('Set power succeeded? - %s' % set_power)
power = yield from afsapi.set_power(False)
print('Set power succeeded? - %s' % set_power)

power = yield from afsapi.get_power()
print('Power on: %s' % power)
power = yield from afsapi.get_power()
print('Power on: %s' % power)
except Exception as e:
logging.error(traceback.format_exc())

@asyncio.coroutine
def test_play():
""" Test play functions."""
afsapi = AFSAPI(URL, PIN)
try:
afsapi = AFSAPI(URL, PIN, TIMEOUT)

status = yield from afsapi.get_play_status()
print('Status: %s' % status)
status = yield from afsapi.get_play_status()
print('Status: %s' % status)

anext = yield from afsapi.next()
print('Next succeeded? - %s' % anext)
anext = yield from afsapi.next()
print('Next succeeded? - %s' % anext)

prev = yield from afsapi.prev()
print('Prev succeeded? - %s' % prev)
prev = yield from afsapi.prev()
print('Prev succeeded? - %s' % prev)
except Exception as e:
logging.error(traceback.format_exc())

LOOP = asyncio.get_event_loop()
LOOP.run_until_complete(test_sys())
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
]

setup(name='afsapi',
version='0.0.1',
version='0.0.2',
description='Asynchronous Implementation of the Frontier Silicon API',
author='Krasimir Zhelev',
author_email='[email protected]',
Expand Down

0 comments on commit 903d3de

Please sign in to comment.