Files
weewx/examples/fileparse/bin/user/fileparse.py
2017-03-14 12:17:11 -04:00

132 lines
4.0 KiB
Python

#!/usr/bin/python
#
# Copyright 2014 Matthew Wall
#
# weewx driver that reads data from a file
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.
#
# See http://www.gnu.org/licenses/
# This driver will read data from a file. Each line of the file is a
# name=value pair, for example:
#
# temperature=50
# humidity=54
# in_temperature=75
#
# The units must be in the weewx.US unit system:
# degree_F, inHg, inch, inch_per_hour, mile_per_hour
#
# To use this driver, put this file in the weewx user directory, then make
# the following changes to weewx.conf:
#
# [Station]
# station_type = FileParse
# [FileParse]
# poll_interval = 2 # number of seconds
# path = /var/tmp/wxdata # location of data file
# driver = user.fileparse
#
# If the variables in the file have names different from those in the database
# schema, then create a mapping section called label_map. This will map the
# variables in the file to variables in the database columns. For example:
#
# [FileParse]
# ...
# [[label_map]]
# temp = outTemp
# humi = outHumidity
# in_temp = inTemp
# in_humid = inHumidity
from __future__ import with_statement
import syslog
import time
import weewx.drivers
DRIVER_NAME = 'FileParse'
DRIVER_VERSION = "0.6"
def logmsg(dst, msg):
syslog.syslog(dst, 'fileparse: %s' % msg)
def logdbg(msg):
logmsg(syslog.LOG_DEBUG, msg)
def loginf(msg):
logmsg(syslog.LOG_INFO, msg)
def logerr(msg):
logmsg(syslog.LOG_ERR, msg)
def _get_as_float(d, s):
v = None
if s in d:
try:
v = float(d[s])
except ValueError, e:
logerr("cannot read value for '%s': %s" % (s, e))
return v
def loader(config_dict, engine):
return FileParseDriver(**config_dict[DRIVER_NAME])
class FileParseDriver(weewx.drivers.AbstractDevice):
"""weewx driver that reads data from a file"""
def __init__(self, **stn_dict):
# where to find the data file
self.path = stn_dict.get('path', '/var/tmp/wxdata')
# how often to poll the weather data file, seconds
self.poll_interval = float(stn_dict.get('poll_interval', 2.5))
# mapping from variable names to weewx names
self.label_map = stn_dict.get('label_map', {})
loginf("data file is %s" % self.path)
loginf("polling interval is %s" % self.poll_interval)
loginf('label map is %s' % self.label_map)
def genLoopPackets(self):
while True:
# read whatever values we can get from the file
data = {}
try:
with open(self.path) as f:
for line in f:
eq_index = line.find('=')
name = line[:eq_index].strip()
value = line[eq_index + 1:].strip()
data[name] = value
except Exception, e:
logerr("read failed: %s" % e)
# map the data into a weewx loop packet
_packet = {'dateTime': int(time.time() + 0.5),
'usUnits': weewx.US}
for vname in data:
_packet[self.label_map.get(vname, vname)] = _get_as_float(data, vname)
yield _packet
time.sleep(self.poll_interval)
@property
def hardware_name(self):
return "FileParse"
# To test this driver, run it directly as follows:
# PYTHONPATH=/home/weewx/bin python /home/weewx/bin/user/fileparse.py
if __name__ == "__main__":
import weeutil.weeutil
driver = FileParseDriver()
for packet in driver.genLoopPackets():
print weeutil.weeutil.timestamp_to_string(packet['dateTime']), packet