emonhub/emonhub_setup.py

164 lines
4.7 KiB
Python
Executable File

"""
This code is released under the GNU Affero General Public License.
OpenEnergyMonitor project:
http://openenergymonitor.org
"""
import time
import logging
from configobj import ConfigObj
"""class EmonHubSetup
User interface to setup the hub.
The settings attribute stores the settings of the hub. It is a
dictionary with the following keys:
'hub': a dictionary containing the hub settings
'interfacers': a dictionary containing the interfacers
'reporters': a dictionary containing the reporters
The hub settings are:
'loglevel': the logging level
interfacers and reporters are dictionaries with the following keys:
'Type': class name
'init_settings': dictionary with initialization settings
'runtimesettings': dictionary with runtime settings
Initialization and runtime settings depend on the interfacer and
reporter type.
The run() method is supposed to be run regularly by the instantiater, to
perform regular communication tasks.
The check_settings() method is run regularly as well. It checks the settings
and returns True is settings were changed.
This almost empty class is meant to be inherited by subclasses specific to
each setup.
"""
class EmonHubSetup(object):
def __init__(self):
# Initialize logger
self._log = logging.getLogger("EmonHub")
# Initialize settings
self.settings = None
def run(self):
"""Run in background.
To be implemented in child class.
"""
pass
def check_settings(self):
"""Check settings
Update attribute settings and return True if modified.
To be implemented in child class.
"""
class EmonHubFileSetup(EmonHubSetup):
def __init__(self, filename):
# Initialization
super(EmonHubFileSetup, self).__init__()
# Initialize update timestamp
self._settings_update_timestamp = 0
self._retry_time_interval = 5
# create a timeout message if time out is set (>0)
if self._retry_time_interval > 0:
self.retry_msg = " Retry in " + str(self._retry_time_interval) + " seconds"
else:
self.retry_msg = ""
# Initialize attribute settings as a ConfigObj instance
try:
self.settings = ConfigObj(filename, file_error=True)
# Check the settings file sections
self.settings['hub']
self.settings['interfacers']
self.settings['reporters']
except IOError as e:
raise EmonHubSetupInitError(e)
except SyntaxError as e:
raise EmonHubSetupInitError(
'Error parsing config file \"%s\": ' % filename + str(e))
except KeyError as e:
raise EmonHubSetupInitError(
'Configuration file error - section: ' + str(e))
def check_settings(self):
"""Check settings
Update attribute settings and return True if modified.
"""
# Check settings only once per second
now = time.time()
if now - self._settings_update_timestamp < 0:
return
# Update timestamp
self._settings_update_timestamp = now
# Backup settings
settings = dict(self.settings)
# Get settings from file
try:
self.settings.reload()
except IOError as e:
self._log.warning('Could not get settings: ' + str(e) + self.retry_msg)
self._settings_update_timestamp = now + self._retry_time_interval
return
except SyntaxError as e:
self._log.warning('Could not get settings: ' +
'Error parsing config file: ' + str(e) + self.retry_msg)
self._settings_update_timestamp = now + self._retry_time_interval
return
except Exception:
import traceback
self._log.warning("Couldn't get settings, Exception: " +
traceback.format_exc() + self.retry_msg)
self._settings_update_timestamp = now + self._retry_time_interval
return
if self.settings != settings:
# Check the settings file sections
try:
self.settings['hub']
self.settings['interfacers']
self.settings['reporters']
except KeyError as e:
self._log.warning("Configuration file missing section: " + str(e))
else:
return True
"""class EmonHubSetupInitError
Raise this when init fails.
"""
class EmonHubSetupInitError(Exception):
pass