text: #!/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 weather data from a file.  The file is specified using
  # the path parameter.  Each line of the file is a name=value pair, for example:
  #
  # temperature=50
  # humidity=54
  # in_temperature=75
  #
  # The units must be weewx.US:
  #   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 weewx, then
  # create a mapping such as this:
  #
  # [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_VERSION = "0.5"
  
  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 FileParse(**config_dict['FileParse'])
  
  class FileParse(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, do the following:
  #   PYTHONPATH=/home/weewx/bin python /home/weewx/bin/user/fileparse.py
  if __name__ == "__main__":
      import weeutil.weeutil
      station = FileParse()
      for packet in station.genLoopPackets():
          print weeutil.weeutil.timestamp_to_string(packet['dateTime']), packet
  