I have already googled and searched this forum for how to solve this
problem and wasn't able to find it. Some background is needed:
Some years ago I added a sensor to detect lake height, and at the Weewx
4.7.1 era time I thought I needed to add Lake Elevation ("LakeElev"). I
remember doing something to extend the schema, and the database browser
indeed showed the last column labeled "LakeElev". It was working fine. For
years. It continued to work fine when I had to rebuild my RPI4 because the
memory card was damaged (lightning, I'm guessing). That was about 2 years
ago. Rebuilt it, added things, and stuck my old weewx.sdb in there and (I
wont mention the struggle with owfs but eventually got them working again)
and the .sdb was logging all the parameters correctly. This was weewx 5.0.
Ffwd to the other day. Lightning struck nearby. Pi continued to appear
working, until 2 days later I rebooted it, it's boot section of the USB
stick was corrupted; I had backup of most things so started to rebuild. Got
the pi up w/ latest os (trixie), added the stuff I needed, then did a fresh
complete install of weewx 5.3.1 with the Davis plugged into the TTYUSB0, it
was reading / catching up / logging, everything looked good then I
remembered I this data didn't have Lake Data, so stopped weewx, replaced
the .sdb with the previous .sdb, and all weewx did was throw errors about
can't write to a read-only database (I made sure it was permissioned
properly, I can think of no reason weewx wouldn't archive to it). So I put
the new .sdb in and it continued to update, and at least weewx would
archive to it.
So now I've gotten my extensions.py incorporated where it reads cpu temps
from some processors on the network and puts them in the correct places in
the .sdb, and of course reads the lake elevation, tries to put it in
"LakeElev" but it doesn't exist.
I forgot how I added LakeElev column years ago, and something tells me the
correct way to do that has evolved anyway.
So my question revolved around how do I get the LakeElev column into my
.sdb so my extensions.py will place them there?
I'm enclosing copy of extensions.py and weewx.conf (I haven't reinstalled
my owfs hat yet, so no mention of owfs in the .conf)
I did read "Upgrade Guide" as Tom mentioned to someone, it mentions
"import schemas.wview_extended" must be replaced by
"import weewx.schemas.wview_extended", I had *neither* in the extensions.py
so I don't know how it worked with 5.0, and now I don't understand where
the new statement is supposed to go. Or how I add that column to my short
weewx.sdb.
-- Thank you --
--
You received this message because you are subscribed to the Google Groups
"weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/weewx-user/48ed9627-fa14-4356-9519-19ce1983f691n%40googlegroups.com.
#!/usr/bin/env python
# Copyright (c) 2009-2015 Tom Keffer <[email protected]>
#
# See the file LICENSE.txt for your full rights.
#
"""User extensions module
This module is imported from the main executable, so anything put here will be
executed before anything else happens. This makes it a good place to put user
extensions.
"""
import locale
# This will use the locale specified by the environment variable 'LANG'
# Other options are possible. See:
# http://docs.python.org/2/library/locale.html#locale.setlocale
locale.setlocale(locale.LC_ALL, '')
import weewx.units
#weewx.units.obs_group_dict['waterTemp'] = 'group_temperature'
#weewx.units.obs_group_dict['LakeElev'] = 'group_altitude'
import re
import os
import sys #added for troubleshooting
import weewx.schemas.wview_extended #WHAT IS THIS FOR AND HOW DID IT WORK PREVIOUISLY WITHOUT IT?
from weewx.engine import StdService
weewx.units.obs_group_dict['LakeElev'] = 'group_lake'
weewx.units.USUnits['group_lake'] = 'feetMSL'
weewx.units.default_unit_format_dict['feetMSL'] = '%.2f'
weewx.units.default_unit_label_dict['feetMSL'] = ' ftMSL'
class AddMyData(StdService):
def __init__(self, engine, config_dict):
# Initialize my superclass first:
super(AddMyData, self).__init__(engine, config_dict)
# Bind to any new archive record events:
self.bind(weewx.NEW_ARCHIVE_RECORD, self.new_archive_packet)
def new_archive_packet(self, event):
# putting / declaring a variable here crashes it
#(code that reads two measurements from a file)
#WTF is wrong here with '/home/pi/wxdata/weewxmbdata.dat'??? #WHY DO ANY OF THESE OPEN STATMENTS CRASH EXTENSIONS.PY FOR FILE RIGHTS? IT NEVER USED TO!
#Had to move the .dat files out of /home/pi ... and into the /etc/weewx/bin/user/ so extensions.py could open them!
# with open("/home/pi/wxdata/weewxmbdata.dat","r") as f:
with open("/etc/weewx/bin/user/weewxmbdata.dat","r") as f:
value1 = 600.00 #initialize anyway
value2 = 123.45 #initialize anyway
for line in f:
numbers_str = line.split()
numbers_float = [float(x) for x in numbers_str]
value1 = numbers_float[0]
value2 = numbers_float[1]
event.record['LakeElev'] = value1
# event.record['lakeWaveheight'] = value2
print("value1= ", value1)
with open("/etc/weewx/bin/user/cputemp-pi4b1.dat") as f:
value3 = 50.0
for line in f:
numbers_str = line.split()
numbers_float = [float(x) for x in re.findall("\d+\.\d+", line)]
value3 = numbers_float[0]
value3 = (value3 * 9/5) + 32
event.record['extraTemp3'] = value3
#
with open("/etc/weewx/bin/user/cputemp-pi3b2.dat") as f:
value4 = 50.0
for line in f:
numbers_str = line.split()
numbers_float = [float(x) for x in re.findall("\d+\.\d+", line)]
value4 = numbers_float[0]
value4 = (value4 * 9/5) + 32
event.record['extraTemp4'] = value4
# #weewx was -occasionally- complaining about "UnboundLocalError: local variable 'value5' referenced before assignment"
# I couldn't find a clue as to what was different about value5 from 4 or 3 ... so try changing to 5x!
with open("/etc/weewx/bin/user/cputemp-pi5r.dat") as f:
value5x = 80.0 # initialize a "ringer" value, just in case
for line in f:
numbers_str = line.split()
numbers_float = [float(x) for x in re.findall("\d+\.\d+", line)]
value5x = numbers_float[0]
value5x = (value5x * 9/5) + 32
event.record['extraTemp5'] = value5x
#
# orangepi5B now places actual float in its .dat, necessitating cast as float
#Modify this and place in RPI3 extraTemp2
with open('/etc/weewx/bin/user/cputemp-opi5.dat') as f: #sensors -f requested temps in F
degf = 80.0 # initialize a "ringer" value, just in case
degf = float(float(f.read())) #this is OPI5B
event.record['extraTemp6'] = degf
with open('/etc/weewx/bin/user/cputemp-opi5p.dat') as f: #sensors -f requested temps in F
try:
degf2 = 80.0 # initialize a "ringer" value, just in case
degf2 = float(float(f.read())) #this is OPI5P
print("degf2 okay")
except:
degf2 = 100.0
print("degf2 exception!")
finally:
event.record['extraTemp7'] = degf2
# with open('/etc/weewx/bin/user/cputemp-ser8.dat') as f: #sensors -f requested temps in F
# degf3 = float(float(f.read())) #this is SER8
# event.record['extraTemp8'] = degf3
with open('/etc/weewx/bin/user/cputemp-DW3.dat') as f: #sensors -f requested temps in F
degf3 = float(float(f.read())) #this is DW3
event.record['extraTemp8'] = degf3 #extraTemp8 is now DW3
# WEEWX CONFIGURATION FILE
#
# Copyright (c) 2009-2024 Tom Keffer <[email protected]>
# See the file LICENSE.txt for your rights.
##############################################################################
# This section is for general configuration information.
# Set to 1 for extra debug info, otherwise comment it out or set to zero.
debug = 0
# Whether to log successful operations. May get overridden below.
log_success = True
# Whether to log unsuccessful operations. May get overridden below.
log_failure = True
# This configuration file was created by ...
version = 5.3.1
##############################################################################
# This section is for information about the station.
[Station]
# Description of the station location, such as your town.
location = PlaygrndShores
# Latitude in decimal degrees. Negative for southern hemisphere.
latitude = 34.0
# Longitude in decimal degrees. Negative for western hemisphere.
longitude = -86.0
# Altitude of the station, with the unit it is in. This is used only
# if the hardware cannot supply a value.
altitude = 615, foot # Choose 'foot' or 'meter' for unit
# Set to type of station hardware. There must be a corresponding stanza
# in this file, which includes a value for the 'driver' option.
station_type = Vantage
# If you have a website, you may specify an URL. The URL is required if you
# intend to register your station. The URL must include the scheme, for
# example, "http://" or "https://"
#station_url = https://www.example.com
# The start of the rain year (1=January; 10=October, etc.). This is
# downloaded from the station if the hardware supports it.
rain_year_start = 1
# Start of week (0=Monday, 6=Sunday)
week_start = 6
##############################################################################
[Vantage]
# This section is for the Davis Vantage series of weather stations.
# Connection type: serial or ethernet
# serial (the classic VantagePro)
# ethernet (the WeatherLinkIP or Serial-Ethernet bridge)
type = serial
# If the connection type is serial, a port must be specified:
# Debian, Ubuntu, Redhat, Fedora, and SuSE:
# /dev/ttyUSB0 is a common USB port name
# /dev/ttyS0 is a common serial port name
# BSD:
# /dev/cuaU0 is a common serial port name
port = /dev/ttyUSB0
# If the connection type is ethernet, an IP Address/hostname is required:
host = 1.2.3.4
######################################################
# The rest of this section rarely needs any attention.
# You can safely leave it "as is."
######################################################
# Serial baud rate (usually 19200)
baudrate = 19200
# TCP port (when using the WeatherLinkIP)
tcp_port = 22222
# TCP send delay (when using the WeatherLinkIP):
tcp_send_delay = 0.5
# The type of LOOP packet to request: 1 = LOOP1; 2 = LOOP2; 3 = both
loop_request = 1
# The id of your ISS station (usually 1). If you use a wind meter connected
# to a anemometer transmitter kit, use its id
iss_id = 1
# How long to wait for a response from the station before giving up (in
# seconds; must be greater than 2)
timeout = 4
# How long to wait before trying again (in seconds)
wait_before_retry = 1.2
# How many times to try before giving up:
max_tries = 4
# Vantage model Type: 1 = Vantage Pro; 2 = Vantage Pro2
model_type = 2
# The driver to use:
driver = weewx.drivers.vantage
##############################################################################
[Simulator]
# This section is for the weewx weather station simulator.
# The time (in seconds) between LOOP packets.
loop_interval = 2.5
# The simulator mode can be either 'simulator' or 'generator'.
# Real-time simulator. Sleep between each LOOP packet.
mode = simulator
# Generator. Emit LOOP packets as fast as possible (useful for testing).
#mode = generator
# The start time. Format is YYYY-mm-ddTHH:MM. If not specified, the
# default is to use the present time.
#start = 2011-01-01T00:00
# The driver to use.
driver = weewx.drivers.simulator
##############################################################################
# This section is for uploading data to Internet sites
[StdRESTful]
# Uncomment and change to override logging for uploading services.
# log_success = True
# log_failure = True
[[StationRegistry]]
# To register this weather station at weewx.com, set this to true, and
# set option 'station_url', located in the [Station] section above.
register_this_station = True
[[AWEKAS]]
# This section is for configuring posts to AWEKAS.
# If you wish to post to AWEKAS, set the option 'enable' to true, then
# specify a username and password.
# Use quotes around the password to guard against parsing errors.
//deleted//
[[CWOP]]
# This section is for configuring posts to CWOP.
# If you wish to post to CWOP, set the option 'enable' to true,
# then specify the station ID (e.g., CW1234).
//deleted//
[[PWSweather]]
# This section is for configuring posts to PWSweather.com.
# If you wish to post to PWSweather.com, set the option 'enable' to
# true, then specify a station and password.
# Use quotes around the password to guard against parsing errors.
enable = false
station = replace_me
password = replace_me
[[WOW]]
# This section is for configuring posts to WOW (wow.metoffice.gov.uk).
# If you wish to post to WOW, set the option 'enable' to true, then
# specify a station and password.
# Use quotes around the password to guard against parsing errors.
//deleted//
[[WOW-BE]]
# This section is for configuring WeeWX to upload to WOW-BE
(wow.meteo.be)
# If you wish to post to WOW-BE, set the option 'enable' to true, then
# specify a station and password.
# Use quotes around the password to guard against parsing errors.
enable = false
station = replace_me
password = replace_me
[[Wunderground]]
# This section is for configuring posts to the Weather Underground.
# If you wish to post to the Weather Underground, set the option
# 'enable' to true, then specify a station (e.g., 'KORHOODR3'). Use
# the station key (find it at
# https://www.wunderground.com/member/devices) for the password.
enable = false
station = replace_me
password = replace_me
# Set the following to True to have weewx use the WU "Rapidfire"
# protocol. Not all hardware can support it. See the User's Guide.
rapidfire = False
##############################################################################
# This section specifies what reports, using which skins, to generate.
[StdReport]
# Where the skins reside, relative to WEEWX_ROOT
SKIN_ROOT = skins
# Where the generated reports should go, relative to WEEWX_ROOT
HTML_ROOT = /var/www/html/weewx
# Uncomment and change to override logging for reports.
# log_success = True
# log_failure = True
# The database binding indicates which data should be used in reports.
data_binding = wx_binding
# Each of the following subsections defines a report that will be run.
# See the customizing guide to change the units, plot types and line
# colors, modify the fonts, display additional sensor data, and other
# customizations. Many of those changes can be made here by overriding
# parameters, or by modifying templates within the skin itself.
[[SeasonsReport]]
# The SeasonsReport uses the 'Seasons' skin, which contains the
# images, templates and plots for the report.
skin = Seasons
enable = true
[[SmartphoneReport]]
# The SmartphoneReport uses the 'Smartphone' skin, and the images and
# files are placed in a dedicated subdirectory.
skin = Smartphone
enable = false
HTML_ROOT = /var/www/html/weewx/smartphone
[[MobileReport]]
# The MobileReport uses the 'Mobile' skin, and the images and files
# are placed in a dedicated subdirectory.
skin = Mobile
enable = false
HTML_ROOT = /var/www/html/weewx/mobile
[[StandardReport]]
# This is the old "Standard" skin. By default, it is not enabled.
skin = Standard
enable = false
[[FTP]]
# FTP'ing the results to a webserver is treated as just another report,
# albeit one with an unusual report generator!
skin = Ftp
# If you wish to use FTP, set "enable" to "true", then fill out the
# next four lines.
# Use quotes around the password to guard against parsing errors.
enable = false
user = replace_me
password = replace_me
server = replace_me # The ftp server name, e.g, www.myserver.org
path = replace_me # The destination directory, e.g., /weather
# Set to True for an FTP over TLS (FTPS) connection. Not all servers
# support this.
secure_ftp = False
# To upload files from something other than what HTML_ROOT is set
# to above, specify a different HTML_ROOT here.
#HTML_ROOT = /var/www/html/weewx
# Most FTP servers use port 21.
port = 21
# Set to 1 to use passive mode, zero for active mode
passive = 1
[[RSYNC]]
# rsync'ing to a webserver is treated as just another report.
skin = Rsync
# If you wish to use rsync, you must configure passwordless ssh using
# public/private key authentication from the user account that weewx
# runs to the user account on the remote machine where the files
# will be copied.
#
# If you wish to use rsync, set "enable" to "true", then
# fill out server, user, and path.
# The server should appear in your .ssh/config file.
# The user is the username used in the identity file.
# The path is the destination directory, such as /var/www/html/weather.
# Be sure that the user has write permissions on the destination!
enable = false
server = replace_me
user = replace_me
path = replace_me
# To upload files from something other than what HTML_ROOT is set
# to above, specify a different HTML_ROOT here.
#HTML_ROOT = /var/www/html/weewx
# Rsync can be configured to remove files from the remote server if
# they don't exist under HTML_ROOT locally. USE WITH CAUTION: if you
# make a mistake in the remote path, you could could unintentionally
# cause unrelated files to be deleted. Set to 1 to enable remote file
# deletion, zero to allow files to accumulate remotely.
delete = 0
# Options in the [[Defaults]] section below will apply to all reports.
# What follows are a few of the more popular options you may want to
# uncomment, then change.
[[Defaults]]
# Which language to use for all reports. Not all skins support all
# languages. You can override this for individual reports.
lang = en
# Which unit system to use for all reports. Choices are 'us', 'metric',
# or 'metricwx'. You can override this for individual reports.
unit_system = us
[[[Units]]]
# Option "unit_system" above sets the general unit system, but
# overriding specific unit groups is possible. These are popular
# choices. Uncomment and set as appropriate. The unit is always
# in the singular, e.g., 'mile_per_hour', NOT 'miles_per_hour'
[[[[Groups]]]]
# group_altitude = meter # Options are 'foot'
or 'meter'
# group_pressure = mbar # Options are 'inHg',
'mmHg', 'mbar', or 'hPa'
# group_rain = mm # Options are 'inch',
'cm', or 'mm'
# group_rainrate = mm_per_hour # Options are
'inch_per_hour', 'cm_per_hour', or 'mm_per_hour'
# group_temperature = degree_C # Options are
'degree_C', 'degree_F', or 'degree_K'
# The following line is used to keep the above lines indented
# properly. It can be ignored.
unused = unused
# Uncommenting the following section frequently results in more
# attractive formatting of times and dates, but may not work in
# your locale.
[[[[TimeFormats]]]]
# day = %H:%M
# week = %H:%M on %A
# month = %d-%b-%Y %H:%M
# year = %d-%b-%Y %H:%M
# rainyear = %d-%b-%Y %H:%M
# current = %d-%b-%Y %H:%M
# ephem_day = %H:%M
# ephem_year = %d-%b-%Y %H:%M
# The following line is used to keep the above lines indented
# properly. It can be ignored.
unused = unused
[[[Labels]]]
# Users frequently change the labels for these observation types.
[[[[Generic]]]]
inHumidity = NEMA Humidity
inTemp = NEMA Box Temp
LakeElev = Lake Elevation
extraTemp3 = RPiWX
extraTemp4 = PI3B2
extraTemp5 = RPi5
extraTemp6 = OPI5B
extraTemp7 = OPI5P
extraTemp8 = DW3
soilTemp1 = Probe1 #front / shallow
leafTemp1 = LAKEWATER AVG TEMP
soilTemp2 = Probe2 #front deeper
soilTemp3 = Fridge
soilTemp4 = Freezer
# outHumidity = Outside Humidity
outTemp = Outside Temp
extraTemp1 = Attic
extraTemp2 = Probe3 #deep / corner
# extraTemp3 = Temperature3
# The following line is used to keep the above lines indented
properly.
# It can be ignored.
unused = unused
##############################################################################
# This service converts the unit system coming from the hardware to a unit
# system in the database.
[StdConvert]
# The target_unit affects only the unit system in the database. Once
# chosen it cannot be changed without converting the entire database.
# Modification of target_unit after starting weewx will result in
# corrupt data - the database will contain a mix of US and METRIC data.
#
# The value of target_unit does not affect the unit system for
# reporting - reports can display US, Metric, or any combination of units.
#
# In most cases, target_unit should be left as the default: US
#
# In particular, those migrating from a standard wview installation
# should use US since that is what the wview database contains.
# DO NOT MODIFY THIS VALUE UNLESS YOU KNOW WHAT YOU ARE DOING!
target_unit = US # Options are 'US', 'METRICWX', or 'METRIC'
##############################################################################
# This section can adjust data using calibration expressions.
[StdCalibrate]
[[Corrections]]
# For each type, an arbitrary calibration expression can be given.
# It should be in the units defined in the StdConvert section.
# Example:
foo = foo + 0.2
leafTemp1 = (soilTemp1 + soilTemp2 + extraTemp2) / 3
##############################################################################
# This section is for quality control checks. If units are not specified,
# values must be in the units defined in the StdConvert section.
[StdQC]
[[MinMax]]
barometer = 26, 32.5, inHg
pressure = 24, 34.5, inHg
outTemp = -40, 120, degree_F
inTemp = 10, 120, degree_F
outHumidity = 0, 100
inHumidity = 0, 100
windSpeed = 0, 120, mile_per_hour
rain = 0, 10, inch
##############################################################################
# This section controls the origin of derived values.
[StdWXCalculate]
[[Calculations]]
# How to calculate derived quantities. Possible values are:
# hardware - use the value provided by hardware
# software - use the value calculated by weewx
# prefer_hardware - use value provide by hardware if available,
# otherwise use value calculated by weewx
pressure = prefer_hardware
altimeter = prefer_hardware
appTemp = prefer_hardware
barometer = prefer_hardware
cloudbase = prefer_hardware
dewpoint = prefer_hardware
ET = prefer_hardware
heatindex = prefer_hardware
humidex = prefer_hardware
inDewpoint = prefer_hardware
maxSolarRad = prefer_hardware
rainRate = prefer_hardware
windchill = prefer_hardware
windrun = prefer_hardware
##############################################################################
# For hardware that supports it, this section controls how often the
# onboard clock gets updated.
[StdTimeSynch]
# How often to check the weather station clock for drift (in seconds)
clock_check = 14400
# How much it can drift before we will correct it (in seconds)
max_drift = 5
##############################################################################
# This section is for configuring the archive service.
[StdArchive]
# If the station hardware supports data logging then the archive interval
# will be downloaded from the station. Otherwise, specify it (in seconds).
archive_interval = 300
# If possible, new archive records are downloaded from the station
# hardware. If the hardware does not support this, then new archive
# records will be generated in software.
# Set the following to "software" to force software record generation.
record_generation = hardware
# Whether to include LOOP data in hi/low statistics.
loop_hilo = True
# Uncomment and change to override logging for archive operations.
# log_success = True
# log_failure = True
# The data binding used to save archive records.
data_binding = wx_binding
##############################################################################
# This section binds a data store to a database.
[DataBindings]
[[wx_binding]]
# The database must match one of the sections in [Databases].
# This is likely to be the only option you would want to change.
database = archive_sqlite
# The name of the table within the database.
table_name = archive
# The manager handles aggregation of data for historical summaries.
manager = weewx.manager.DaySummaryManager
# The schema defines the structure of the database.
# It is *only* used when the database is created.
schema = weewx.schemas.wview_extended.schema
##############################################################################
# This section defines various databases.
[Databases]
# A SQLite database is simply a single file.
[[archive_sqlite]]
database_name = weewx.sdb
database_type = SQLite
# MySQL
[[archive_mysql]]
database_name = weewx
database_type = MySQL
##############################################################################
# This section defines defaults for the different types of databases.
[DatabaseTypes]
# Defaults for SQLite databases.
[[SQLite]]
driver = weedb.sqlite
# Directory in which database files are located, relative to WEEWX_ROOT
SQLITE_ROOT = /var/lib/weewx
# Defaults for MySQL databases.
[[MySQL]]
driver = weedb.mysql
# The host where the database is located.
host = localhost
# The user name for logging in to the host.
user = weewx
# Use quotes around the password to guard against parsing errors.
password = weewx
##############################################################################
# This section configures the internal weewx engine.
[Engine]
# This section specifies which services should be run and in what order.
[[Services]]
prep_services = weewx.engine.StdTimeSynch
data_services = user.extensions.AddMyData
process_services = weewx.engine.StdConvert, weewx.engine.StdCalibrate,
weewx.engine.StdQC, weewx.wxservices.StdWXCalculate
xtype_services = weewx.wxxtypes.StdWXXTypes,
weewx.wxxtypes.StdPressureCooker, weewx.wxxtypes.StdRainRater,
weewx.wxxtypes.StdDelta
archive_services = weewx.engine.StdArchive
restful_services = weewx.restx.StdStationRegistry,
weewx.restx.StdWunderground, weewx.restx.StdPWSweather, weewx.restx.StdCWOP,
weewx.restx.StdWOW, weewx.restx.StdWOWBE, weewx.restx.StdAWEKAS
report_services = weewx.engine.StdPrint, weewx.engine.StdReport