Merge pull request #115 from robcalon/patch-1
asynchronous read_as_object method
This commit is contained in:
commit
041ac758f4
@ -95,3 +95,36 @@ class AsyncSerialReader(SerialReader):
|
|||||||
)
|
)
|
||||||
except ParseError as e:
|
except ParseError as e:
|
||||||
logger.warning('Failed to parse telegram: %s', e)
|
logger.warning('Failed to parse telegram: %s', e)
|
||||||
|
|
||||||
|
async def read_as_object(self, queue):
|
||||||
|
"""
|
||||||
|
Read complete DSMR telegram's from the serial interface
|
||||||
|
and return a Telegram object.
|
||||||
|
|
||||||
|
Instead of being a generator, Telegram objects are pushed
|
||||||
|
to provided queue for asynchronous processing.
|
||||||
|
|
||||||
|
:rtype: None
|
||||||
|
"""
|
||||||
|
|
||||||
|
# create Serial StreamReader
|
||||||
|
conn = serial_asyncio.open_serial_connection(**self.serial_settings)
|
||||||
|
reader, _ = await conn
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
# Read line if available or give control back to loop until new
|
||||||
|
# data has arrived.
|
||||||
|
data = await reader.readline()
|
||||||
|
self.telegram_buffer.append(data.decode('ascii'))
|
||||||
|
|
||||||
|
for telegram in self.telegram_buffer.get_all():
|
||||||
|
|
||||||
|
try:
|
||||||
|
queue.put_nowait(
|
||||||
|
Telegram(telegram, self.telegram_parser, self.telegram_specification)
|
||||||
|
)
|
||||||
|
except InvalidChecksumError as e:
|
||||||
|
logger.warning(str(e))
|
||||||
|
except ParseError as e:
|
||||||
|
logger.error('Failed to parse telegram: %s', e)
|
||||||
|
Loading…
Reference in New Issue
Block a user