#!/usr/bin/env python3 # -*- coding: utf-8 -*- import json import logging import os class SensorType: none = 0 temp = 1 # temperature bricklet humi = 2 # humidity bricklet ambi = 3 # ambient light bricklet baro = 4 # barometer bricklet rain = 5 # IO4 #TODO iram = 6 # temperature ir bricklet, ambient irob = 7 # temperature ir bricklet, object DEFAULTS = { "hosts": { "HOSTDESC_i": { "host": {"name": "HOSTNAME_OR_IP", "port": 4223}, "sensors": { "NAME": ["UID", "SensorType.TYPE"]} } }, "sensor_properties": { "SensorType.none": [0, 0, ""], "SensorType.temp": [30000, 100.0, "°C"], "SensorType.humi": [30000, 10.0, "%RH"], "SensorType.ambi": [60000, 10.0, "Lux"], "SensorType.baro": [60000, 1000, "mbar"], "SensorType.rain": [0, 2.5, "l/qm"], "SensorType.iram": [1000, 10.0, "°C"], "SensorType.irob": [1000, 10.0, "°C"]}, "tempmaxdiff": 200, "prev_temps_default": 20000, "logs": 'logs', "locks": 'locks', "records": 'records', "arch": 'arch', "lockname": "all.lock", "logname": "logging.log", "exceptionlog": "exceptions.xml", "recordlog": "record.log", "movelog": "move.log", "movelock": "last_move", "waitDelay": 10, "tempSensors": 0, "loglevel": "info", "datalog": "info", "dataecho": "info", "legacy_record": True } class Settings(dict): def __getattr__(self, name): if name in self: return self[name] return DEFAULTS[name] def __setattr__(self, name, value): self[name] = value def __delattr__(self, name): del self[name] def load_json(filename="config.json"): values = json.load(open(filename), object_hook=Settings) sensors_name = "hosts" if sensors_name in values: for host in values[sensors_name]: for sensor in values[sensors_name][host]["sensors"]: sensor = values[sensors_name][host]["sensors"][sensor] sensor[1] = eval(sensor[1]) sensor_props = "sensor_properties" if sensor_props in values: new_units = {} for unit in values[sensor_props]: new_units[eval(unit)] = values[sensor_props][unit] values[sensor_props] = new_units return values def setup_logger(): level = getattr(logging, settings.loglevel.upper(), logging.INFO) log = logging.getLogger("weatherstation") log.setLevel(level) ch = logging.StreamHandler() # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') formatter = logging.Formatter('%(asctime)s:[%(levelname)s] - %(message)s') ch.setFormatter(formatter) log.addHandler(ch) fh = logging.FileHandler(os.path.join(settings.logs, settings.logname)) fh.setFormatter(formatter) log.addHandler(fh) return log def setup_data_log(): level = getattr(logging, settings.datalog.upper(), logging.INFO) log = logging.getLogger("weatherstation.datalog") log.setLevel(level) fh = logging.FileHandler(os.path.join(settings.records, settings.recordlog)) fformat = logging.Formatter() fh.setFormatter(fformat) log.addHandler(fh) log.propagate = False return log def setup_data_echo(): level = getattr(logging, settings.dataecho.upper(), logging.INFO) log = logging.getLogger("weatherstation.data") log.setLevel(level) ch = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s:[DATA] - %(message)s') ch.setFormatter(formatter) log.addHandler(ch) log.propagate = False return log settings = load_json() """ 0: { "host": { "name": "192.168.2.60", "port": 4223 }, "sensors": { "temp1": ["7B5", SensorType.temp], "temp2": ["8js", SensorType.temp], "humi1": ["7RY", SensorType.humi], "ambi1": ["8Fw", SensorType.ambi], "ambi2": ["8DJ", SensorType.ambi], "baro1": ["bB7", SensorType.baro], "temp3": ["8ms", SensorType.temp], "humi2": ["9V5", SensorType.humi], } },"""