diff --git a/ambient7-arduino/serial2influxdb/config.cfg b/ambient7-arduino/serial2influxdb/config.cfg index d3b36c9..c9232cc 100644 --- a/ambient7-arduino/serial2influxdb/config.cfg +++ b/ambient7-arduino/serial2influxdb/config.cfg @@ -6,8 +6,8 @@ baud=9600 server=localhost port=8086 username=influxdb -passwork=pa$$word +password=pa$$word database=ambient7 [metrics] -prefix="ambient7_" +prefix=ambient7_ diff --git a/ambient7-arduino/serial2influxdb/serial2influxdb.py b/ambient7-arduino/serial2influxdb/serial2influxdb.py index e1ad21d..750fcd7 100755 --- a/ambient7-arduino/serial2influxdb/serial2influxdb.py +++ b/ambient7-arduino/serial2influxdb/serial2influxdb.py @@ -4,8 +4,11 @@ import configparser import logging import time +import re +import datetime import serial +import influxdb SERIAL_RETRY_DELAY = 5.0 @@ -31,7 +34,8 @@ def open_serial(config): return serial.Serial( port=config['serial']['tty'], baudrate=int(config['serial']['baud']), - timeout=1 + timeout=1, + exclusive=True ) except serial.SerialException as e: logger.warning('unable to open pyserial connection: {}'.format(e)) @@ -60,9 +64,35 @@ def resilient_line_generator(config): pass +def collect_data(key, value, measurement_prefix): + data = { + 'time': datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ'), + 'measurement': measurement_prefix + key + } + if key == 'uptime': + data['fields'] = {'value': int(value.rstrip('s'))} + else: + return None + return [data] + + +def build_influxdb_client(config): + opts = { + 'host': config['influxdb']['server'], + 'port': int(config['influxdb']['port']), + 'database': config['influxdb']['database'] + } + if 'username' in config['influxdb']: + opts['username'] = config['influxdb']['username'] + opts['password'] = config['influxdb']['password'] + return influxdb.InfluxDBClient(**opts) + + def main(args): cli_args, config = parse_args_and_config(args) + influxdb_client = build_influxdb_client(config) + logging.basicConfig( level=logging.DEBUG if cli_args.verbose else logging.INFO, stream=sys.stderr, @@ -70,7 +100,20 @@ def main(args): ) for line in resilient_line_generator(config): - logger.debug(line) + if logger.isEnabledFor(logging.DEBUG): + logger.debug("receive line: %r", line) + data_match = re.match(r'DATA: (?P[a-z0-9_]+)=(?P.+)', line, re.IGNORECASE) + if data_match is not None: + key = data_match.group('key') + raw_value = data_match.group('value') + logging.debug('Key=%s Value=%s', key, raw_value) + + data = collect_data(key, raw_value, measurement_prefix=config['metrics']['prefix']) + logger.info(data) + + if data is not None: + influxdb_client.write_points(data) + return 0