diff --git a/README.md b/README.md index 3974970..8530a17 100644 --- a/README.md +++ b/README.md @@ -22,13 +22,15 @@ Setting switches and reading their manual/auto state is only possible via the BL ### Usage ```python +from pyblnet import test_blnet, BLNET, BLNETWeb, BLNETDirect + ip = '192.168.178.10' # Check if there is a blnet at given address test_blnet(ip) # -> True/False # Convenient high level interface -blnet = BLNET(ip, timeout=5) +blnet = BLNET(ip, password='pass', timeout=5) # Control a switch by its ID blnet.turn_on(10) @@ -44,12 +46,17 @@ print(blnet.fetch()) # note that the direct use of these modules is discouraged though # Fetch the latest data via web interface -blnet = BLNETWeb(ip, timeout=5) -print(blnet.read_analog_values()) -print(blnet.read_digital_values()) - -# For publishing values -blnet.set_digital_value('10', 'AUS') +# Note that manual log in and log out are required +# when not using the with statement +with BLNETWeb(ip, password='pass', timeout=5) as blnet_session: + print(blnet_session.read_analog_values()) + print(blnet_session.read_digital_values()) + + # For publishing values + blnet_session.set_digital_value('10', 'AUS') + # Note that without explicit log out, + # the BLNET will block any further web access for the next 150s + # this is handled automatically when using the with statement # Fetch data via the Protocol developed by TA blnet = BLNETDirect(ip) diff --git a/example.py b/example.py deleted file mode 100644 index 8210e6a..0000000 --- a/example.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" -Created on 12.08.2018 - -@author: Niels -""" - -from pyblnet import BLNETWeb, test_blnet, BLNETDirect, BLNET - -if __name__ == '__main__': - - ip = '192.168.178.10' - - # Check if there is a blnet at given address - print(test_blnet(ip)) - - # Easy to use high level interface - blnet = BLNET(ip, timeout=5) - print(blnet.turn_on(10)) - print(blnet.fetch()) - - # Fetch the latest data via web interface - blnet = BLNETWeb(ip, timeout=5) - print(blnet.read_analog_values()) - print(blnet.read_digital_values()) - - # For publishing values - #print(blnet.set_digital_value("10", 'AUS')) - #print(blnet.read_digital_values()) - - blnet = BLNETDirect(ip) - # Fetching the latest data from the backend - print(blnet.get_latest()) - # Still inofficial because unexplicably failing often - print(blnet._get_data(1)) diff --git a/pyblnet/blnet.py b/pyblnet/blnet.py index 54e79bd..6e30da9 100644 --- a/pyblnet/blnet.py +++ b/pyblnet/blnet.py @@ -80,12 +80,13 @@ def fetch(self, node=None): 'power': {}, } if self.blnet_web: - if node is not None: - self.blnet_web.set_node(node) - data['analog'] = self._convert_web( - self.blnet_web.read_analog_values()) - data['digital'] = self._convert_web( - self.blnet_web.read_digital_values()) + with self.blnet_web as blnet_session: + if node is not None: + blnet_session.set_node(node) + data['analog'] = self._convert_web( + blnet_session.read_analog_values()) + data['digital'] = self._convert_web( + blnet_session.read_digital_values()) if self.blnet_direct: direct = self.blnet_direct.get_latest(self.max_retries)[0] # Override values for analog and digital as values are @@ -124,15 +125,15 @@ def turn_auto(self, digital_id, can_node=None): def _turn(self, digital_id, value, can_node=None): if self.blnet_web: - if not self.blnet_web.log_in(): - raise ConnectionError('Could not log in') - if can_node is not None: - if not self.blnet_web.set_node(can_node): - raise ConnectionError('Could not set node') - if not self.blnet_web.set_digital_value(digital_id, value): - raise ConnectionError('Failed to set value') - else: - return True + with self.blnet_web as blnet_session: + if not blnet_session.logged_in(): + raise ConnectionError('Could not log in') + if can_node is not None: + if not blnet_session.set_node(can_node): + raise ConnectionError('Could not set node') + if not blnet_session.set_digital_value(digital_id, value): + raise ConnectionError('Failed to set value') + return True else: raise EnvironmentError('Can\'t set values with blnet web disabled') diff --git a/pyblnet/blnet_web.py b/pyblnet/blnet_web.py index 1c03c20..639337f 100644 --- a/pyblnet/blnet_web.py +++ b/pyblnet/blnet_web.py @@ -70,6 +70,13 @@ def __init__(self, ip, password=_def_password, timeout=5): self.password = password self._timeout = timeout + def __enter__(self): + self.log_in() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.log_out() + def logged_in(self): """ Determines whether the object is still connected to the BLNET @@ -153,10 +160,6 @@ def set_node(self, node): Return: Still logged in (indicating successful node change) """ - # ensure to be logged in - if not self.log_in(): - return False - # send the request to change the node try: r = requests.get( @@ -173,10 +176,6 @@ def read_analog_values(self): Reads all analog values (temperatures, speeds) from the web interface and returns list of quadruples of id, name, value, unit of measurement """ - # ensure to be logged in - if not self.log_in(): - return None - try: r = requests.get( self.ip + "/580500.htm", @@ -219,10 +218,6 @@ def read_digital_values(self): and returns list of quadruples of id, name, mode (AUTO/HAND), value (EIN/AUS) """ - # ensure to be logged in - if not self.log_in(): - return None - try: r = requests.get( self.ip + "/580600.htm", @@ -280,10 +275,6 @@ def set_digital_value(self, digital_id, value): raise ValueError( 'Device id can\'t be larger than 15, was {}'.format( digital_id)) - # ensure to be logged in - if not self.log_in(): - return False - # transform input value to 'EIN' or 'AUS' if isinstance(value, str): if value.lower() == 'AUTO'.lower() or value == '3': diff --git a/pyblnet/tests/test_web.py b/pyblnet/tests/test_web.py index 5c20ef0..5604aa5 100644 --- a/pyblnet/tests/test_web.py +++ b/pyblnet/tests/test_web.py @@ -147,45 +147,44 @@ def test_blnet_fetch_error(self): def test_blnet_web_analog(self): """ Test reading analog values """ - self.assertEqual( - BLNETWeb(self.url, password=PASSWORD, - timeout=10).read_analog_values(), STATE_ANALOG) + with BLNETWeb(self.url, password=PASSWORD, timeout=10) as blnet: + self.assertEqual( + blnet.read_analog_values(), STATE_ANALOG) def test_blnet_web_digital(self): """ Test reading digital values""" - self.assertEqual( - BLNETWeb(self.url, password=PASSWORD, - timeout=10).read_digital_values(), STATE_DIGITAL) + with BLNETWeb(self.url, password=PASSWORD, timeout=10) as blnet: + self.assertEqual(blnet.read_digital_values(), STATE_DIGITAL) def test_blnet_web_set_digital(self): """ Test setting digital values """ - blnet = BLNETWeb(self.url, password=PASSWORD, timeout=10) - blnet.set_digital_value(10, '2') - self.assertEqual(self.server.get_node('A'), '2') - blnet.set_digital_value(9, 'EIN') - self.assertEqual(self.server.get_node('9'), '2') - blnet.set_digital_value(8, 'auto') - self.assertEqual(self.server.get_node('8'), '3') - blnet.set_digital_value(1, 'on') - self.assertEqual(self.server.get_node('1'), '2') - blnet.set_digital_value(1, 'AUS') - self.assertEqual(self.server.get_node('1'), '1') - blnet.set_digital_value(5, 3) - self.assertEqual(self.server.get_node('5'), '3') - blnet.set_digital_value(4, True) - self.assertEqual(self.server.get_node('4'), '2') - blnet.set_digital_value(6, False) - self.assertEqual(self.server.get_node('6'), '1') - try: - blnet.set_digital_value(0, 'EIN') - self.fail("Didn't catch wrong id 0") - except ValueError: - pass - try: - blnet.set_digital_value(16, 'EIN') - self.fail("Didn't catch wrong id 16") - except ValueError: - pass + with BLNETWeb(self.url, password=PASSWORD, timeout=10) as blnet: + blnet.set_digital_value(10, '2') + self.assertEqual(self.server.get_node('A'), '2') + blnet.set_digital_value(9, 'EIN') + self.assertEqual(self.server.get_node('9'), '2') + blnet.set_digital_value(8, 'auto') + self.assertEqual(self.server.get_node('8'), '3') + blnet.set_digital_value(1, 'on') + self.assertEqual(self.server.get_node('1'), '2') + blnet.set_digital_value(1, 'AUS') + self.assertEqual(self.server.get_node('1'), '1') + blnet.set_digital_value(5, 3) + self.assertEqual(self.server.get_node('5'), '3') + blnet.set_digital_value(4, True) + self.assertEqual(self.server.get_node('4'), '2') + blnet.set_digital_value(6, False) + self.assertEqual(self.server.get_node('6'), '1') + try: + blnet.set_digital_value(0, 'EIN') + self.fail("Didn't catch wrong id 0") + except ValueError: + pass + try: + blnet.set_digital_value(16, 'EIN') + self.fail("Didn't catch wrong id 16") + except ValueError: + pass def tearDown(self): self.server_control.stop_server()