Dear community,
Need some help regarding geiger counter integration for Weewx.
Below is code which works fine and give output to console.
Routine is pretty simple -serial port initialization, sending special hex string to device, then decoding some bytes range in hex string answer. Code is below.
import serial
import struct
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
ser.isOpen()
packet = bytearray(b'\x7b\xff\x20\x00\x06\x00\x0a\x00\x00\x00\x54\x00\x00\x08\x0c\x00\xf3\xf7')
ser.write(packet)
raw_rate = ""
raw_cpm = ""
for x in range(0, 34):
c = ser.read()
# print '{0:x}'.format(ord(c), 10), " ",
if x in range(20, 22):
raw_rate = raw_rate + c
if x in range(28, 30):
raw_cpm = raw_cpm + c
print ""
[doserate] = struct.unpack('<h', raw_rate)
print "Dose rate uSv/h: " + str(doserate / 100.0)
[cpm] = struct.unpack('<h', raw_cpm)
print "Counts per minute: " + str(cpm)
Console output is like this:
Dose rate uSv/h: 0.16
Counts per minute: 24But I stuck when creating proper data service for weewx.
import struct
import serial
import syslog
import weewx
import weewx.manager
from weewx.wxengine import StdService
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
VERSION = "0.6"
if weewx.__version__ < "3.2":
raise weewx.UnsupportedFeature("weewx 3 is required, found %s" %
weewx.__version__)
schema = [('dateTime', 'INTEGER NOT NULL UNIQUE PRIMARY KEY'),
('usUnits', 'INTEGER NOT NULL'),
('interval', 'INTEGER NOT NULL'),
('DRate', 'REAL'),
('Counter', 'INTEGER')]
def get_default_binding_dict():
return {'database': 'radex',
'manager': 'weewx.manager.Manager',
'table_name': 'archive',
'schema': 'user.radex.schema'}
def logmsg(level, msg):
syslog.syslog(level, 'radex: %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)
class Radexwx(StdService):
def __init__(self, engine, config_dict):
# call our parent's initialisation
super(Radexwx, self).__init__(engine, config_dict)
loginf("service version is %s" % VERSION)
# get the database binding to use
data_binding = svc_dict.get('data_binding', None)
loginf("data_binding=%s" % data_binding)
# obtain a database manager from our binding
self.dbm = self.engine.db_binder.get_manager(data_binding=data_binding,
initialize=True)
# be sure schema in database matches the schema we have
if self.dbm:
# get the columns in our archive table
dbcol = self.dbm.connection.columnsOf(self.dbm.table_name)
# get a database manager dict
dbm_dict = weewx.manager.get_manager_dict(config_dict['DataBindings'],
config_dict['Databases'],
data_binding,
default_binding_dict=get_default_binding_dict())
# get a list of the columns from the database manager dict
memcol = [x[0] for x in dbm_dict['schema']]
# if the two don't match raise an exception
if dbcol != memcol:
raise Exception('radex: schema mismatch: %s != %s' % (dbcol, memcol))
# bind ourself to the NEW_ARCHIVE_RECORD event
self.bind(weewx.NEW_ARCHIVE_RECORD, self.new_archive_record)
def new_archive_record(self, event):
# read Radex data
self.read_data(event)
# save the Radex data to our database
self.dbm.addRecord(event.record)
def read_data(self, event):
"""read Radex data and augment the archive record"""
# initialise a dict to hold our data
data = {}
try:
ser.isOpen()
packet = bytearray(b'\x7b\xff\x20\x00\x06\x00\x0a\x00\x00\x00\x54\x00\x00\x08\x0c\x00\xf3\xf7')
ser.write(packet)
raw_rate = ""
raw_cps = ""
for x in range(0, 34):
c = ser.read()
if x in range(20, 22):
raw_rate = raw_rate + c
if x in range(28, 30):
raw_cpm = raw_cpm + c
print ""
[doserate] = struct.unpack('<h', raw_rate)
except TypeError:
doserate = None
data['DRate'] = + str(doserate / 100.0)
[cpm] = struct.unpack('<h', raw_cpm)
except TypeError:
cpm = None
data['Counter'] = + str(cpm)
# now augment the event record with our data
event.record.update(data)
def shutDown(self):
Got Invalid Syntax for function for x in range(0, 34):
Big Thanks!