Skip to content

Commit

Permalink
Ensure manual log ins
Browse files Browse the repository at this point in the history
  • Loading branch information
nielstron committed Jun 8, 2020
1 parent 383eae1 commit 7afbf5c
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 107 deletions.
21 changes: 14 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
36 changes: 0 additions & 36 deletions example.py

This file was deleted.

31 changes: 16 additions & 15 deletions pyblnet/blnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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')

Expand Down
23 changes: 7 additions & 16 deletions pyblnet/blnet_web.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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(
Expand All @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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':
Expand Down
65 changes: 32 additions & 33 deletions pyblnet/tests/test_web.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down

0 comments on commit 7afbf5c

Please sign in to comment.