+import argparse
+import asyncio
+import logging
+
+import serial_asyncio # pyserial-asyncio Debian: python3-serial-asyncio
+
+
+log = logging.getLogger(__name__)
+
+
+class LineBuffer:
+ def __init__(self):
+ self.buffer = ''
+
+ def write(self, data: bytes):
+ self.buffer += data.decode()
+
+
+class Receiver(asyncio.Protocol):
+ def __init__(self):
+ self.transport = None
+
+ def connection_made(self, transport):
+ self.transport = transport
+ log.debug('port opened')
+
+ def data_received(self, data):
+ data = data.decode()
+ print(data, end='')
+
+ def connection_lost(self, exc):
+ log.debug('port closed')
+ self.transport.loop.stop()
+
+
+def main():
+ parser = argparse.ArgumentParser('Logs CO2 and temperature from MH-Z19B sensor.')
+ parser.add_argument('--device', '-d', default='/dev/ttyACM0', help='Device where Arduino is connected to')
+ args = parser.parse_args()
+ logging.basicConfig(level=logging.INFO, format='%(asctime)-15s %(message)s')
+ loop = asyncio.get_event_loop()
+ coro = serial_asyncio.create_serial_connection(loop, Receiver, args.device, baudrate=115200)
+ loop.run_until_complete(coro)
+ loop.run_forever()
+ loop.close()
+
+
+if __name__ == '__main__':
+ main()