summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/config.yaml9
-rwxr-xr-xweather-logger-receiver88
2 files changed, 66 insertions, 31 deletions
diff --git a/config/config.yaml b/config/config.yaml
index 332f6b9..6dc26a4 100644
--- a/config/config.yaml
+++ b/config/config.yaml
@@ -1,5 +1,8 @@
-log_file_path: /var/log/weather_logger/receiver.log
-pid_file_path: /run/weather_logger/receiver.log
+device_path: "/dev/ttyUSB0"
+database_path: "/usr/local/share/weather_logger/weather.db"
+log_file_path: "/var/log/weather_logger/receiver.log"
+pid_file_path: "/run/weather_logger/pid"
+
locations:
Berlin:
@@ -17,4 +20,4 @@ locations:
handle: "outside"
type: "THGR810, THGN800"
-active-location: Berlin
+active_location: Berlin
diff --git a/weather-logger-receiver b/weather-logger-receiver
index 389a9de..fd0c8e4 100755
--- a/weather-logger-receiver
+++ b/weather-logger-receiver
@@ -11,8 +11,8 @@ import yaml
from RFXtrx import PySerialTransport
-def setup_database(path="weather.db"):
- db_connection = sqlite3.connect(path)
+def setup_database(database_path, logger):
+ db_connection = sqlite3.connect(database_path)
db_cursor = db_connection.cursor()
try:
db_cursor.execute("CREATE TABLE weather( \
@@ -22,26 +22,19 @@ def setup_database(path="weather.db"):
temperature FLOAT, \
humidity FLOAT);")
except sqlite3.OperationalError:
+ logger.info("Not re-creating 'weather' table")
pass
return db_connection
-def setup_serial(device="/dev/ttyUSB0"):
- serial_connection = PySerialTransport(device)
+def setup_serial(device_path):
+ serial_connection = PySerialTransport(device_path)
serial_connection.reset()
return serial_connection
-def load_known_devices(location, path="known-devices.yaml"):
- known_devices = None
- with open(path, "r") as f:
- known_devices = yaml.safe_load(f.read())
-
- return known_devices[location]
-
-
def add_data_to_db(data, handle, db_connection):
db_cursor = db_connection.cursor()
db_cursor.execute(f"INSERT INTO weather \
@@ -53,24 +46,25 @@ def add_data_to_db(data, handle, db_connection):
db_connection.commit()
-def loop(serial_connection, db_connection, logger):
+def loop(config, serial_connection, db_connection, logger):
+ known_devices = config["known_devices"][config["active_location"]]
while True:
logger.info("(Re-)Starting receiver loop")
data = serial_connection.receive_blocking()
if data is None:
- logger.info("Received no data")
+ logger.info("Didn't receive data")
continue
logger.info(data)
try:
if data.device.id_string not in known_devices:
- logger.info(f"Unknown device with id {device_id} and type {device_type}, ignoring")
+ logger.info(f"Unknown device with id '{device_id}' and type '{device_type}', ignoring")
continue
except:
- logger.info("Device ID not found, likely no SensorEvent, ignoring")
+ logger.info("Device ID not found, likely not a 'SensorEvent', ignoring")
continue
handle = known_devices[data.device.id_string]["handle"]
@@ -78,35 +72,73 @@ def loop(serial_connection, db_connection, logger):
add_data_to_db(data, handle, db_connection)
+def write_pid_file(pid_file_path, logger):
+ if os.path.exists(pid_file_path):
+ with open(pid_file_path, "r") as pid_file:
+ pid = pid_file.read()
+ logger.error(f"Possibly already running with PID {pid}, exiting")
+ sys.exit(1)
+ with open(path, "w") as pid_file:
+ pid_file.write(str(os.getpid()))
+
+
+def load_config(config_file_path, logger):
+ with open(config_file_path, "r") as f:
+ config = yaml.safe_load(f.read())
+ logger.info(f"Loaded configuration from '{config_file_path}'")
+
+ return config
+
+
if __name__ == "__main__":
- logger = logging.getLogger("weather-logger-receiver")
+ # logger setup
logging.basicConfig(format='%(asctime)-2s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%dT%H:%M:%S',
level=logging.INFO)
+ logger = logging.getLogger("weather-logger-receiver")
- assert len(sys.argv) == 2
- location = sys.argv[1]
- known_devices = load_known_devices(location=location)
- logger.info(f"Loaded known devices for location {location}")
+ # load configuration
+ if len(sys.argv) != 2:
+ logger.error("Missing path to configuration file, exiting")
+ sys.exit(1)
+ config_file_path = sys.argv[1]
+ config = load_config(config_file_path, logger)
- db_connection = setup_database()
- logger.info("Set up database")
+ # get known devices
+ active_location = config["active_location"]
+ known_devices = config["locations"][active_location]
+ logger.info(f"Loaded known devices for location '{active_location}'")
- serial_connection = setup_serial()
- logger.info("Set up serial connection")
+ # write pid file
+ write_pid_file(config["pid_file_path"], logger)
+ logger.info("Wrote PID file to '{config{'pid_file_path']}'")
+ # database setup
+ db_connection = setup_database(config["database_path"], logger)
+ logger.info("Set up database '{config['database_path']}'")
+
+ # serial connection setup
+ serial_connection = setup_serial(config["device_path"])
+ logger.info("Set up serial connection to '{config['device_path']}'")
+
+ # handle shutdown
def shutdown(*args):
logger.info("Shutting down")
serial_connection.close()
db_connection.close()
+ try:
+ os.remove(config["pid_file_path"])
+ except FileNotFoundError:
+ pass
sys.exit(0)
signal.signal(signal.SIGINT, shutdown)
signal.signal(signal.SIGTERM, shutdown)
+ # start main loop
try:
- loop(serial_connection, db_connection, logger)
+ loop(known_devices, serial_connection, db_connection, logger)
except Exception as e:
- logger.error(f"Exception: {e}")
+ logger.error(f"Exception: '{e}'")
finally:
- shutdown(serial_connection, db_connection, logger)
+ shutdown(config, serial_connection, db_connection, logger)