Hello,
No problems with Vantage (Pro) and Weewx 4!
But I also have a 1-wire sensor. OWFS isn't Python3 ready yet, so I tried
to do that myself.
The result seemed not so bad. It is running on Python3!
It's also running on Python2.7: I copied it back to the 'production' system
running weewx 3.9.2.
Later the Weewx 4 test environment was switched back to Python2 resulting
in:
CRITICAL weewx.engine: Caught unrecoverable exception:
CRITICAL weewx.engine: **** in method 'init', argument 1 of type 'char
const *'
CRITICAL weewx.engine: **** Traceback (most recent call last):
CRITICAL weewx.engine: **** File "/home/weewx/bin/weewx/engine.py",
line 886, in main
CRITICAL weewx.engine: **** engine = StdEngine(config_dict)
CRITICAL weewx.engine: **** File "/home/weewx/bin/weewx/engine.py",
line 83, in __init__
CRITICAL weewx.engine: **** self.loadServices(config_dict)
CRITICAL weewx.engine: **** File "/home/weewx/bin/weewx/engine.py",
line 143, in loadServices
CRITICAL weewx.engine: **** obj =
weeutil.weeutil.get_object(svc)(self,config_dict)
CRITICAL weewx.engine: **** File "/home/weewx/bin/user/owfs.py",
line 488, in __init__
CRITICAL weewx.engine: **** ow.init(self.interface)
CRITICAL weewx.engine: **** File
"/usr/lib/python2.7/dist-packages/ow/__init__.py", line 220, in init
CRITICAL weewx.engine: **** if not _OW.init( iface ):
CRITICAL weewx.engine: **** TypeError: in method 'init', argument 1 of
type 'char const *'
CRITICAL weewx.engine: **** Exiting.
The logging (attached) is from a (virtual) Debian10 environment and Weewx4
+ Simulator driver. But it also occurs with Ubuntu 19.04 and Weewx4 +
Vantage driver.
Best wishes,
Jaap
--
You received this message because you are subscribed to the Google Groups
"weewx-development" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/weewx-development/a160e60b-57fd-444f-bfb2-7bb9fb139366%40googlegroups.com.
Dec 23 21:27:55 debian10 systemd[1]: Started weewx weather system.
Dec 23 21:27:55 debian10 weewx[2960] INFO weewx.engine: Initializing weewx
version 4.0.0b5
Dec 23 21:27:55 debian10 weewx[2960] INFO weewx.engine: Using Python 3.7.3
(default, Apr 3 2019, 05:39:12) #012[GCC 8.3.0]
Dec 23 21:27:56 debian10 weewx[2960] INFO weewx.engine: Platform
Linux-4.19.0-6-amd64-x86_64-with-debian-10.2
Dec 23 21:27:56 debian10 weewx[2960] INFO weewx.engine: Locale is 'nl_NL.UTF-8'
Dec 23 21:27:56 debian10 weewx[2960] INFO weewx.engine: PID file is
/run/weewx.pid
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.engine: Using configuration
file /home/weewx/weewx.conf
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Debug is 1
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Initializing engine
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.engine: Loading station type
Simulator (weewx.drivers.simulator)
Dec 23 21:27:56 debian10 systemd[1]: weewx.service: Supervising process 2964
which is not our child. We'll most likely not notice when it exits.
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.engine.StdTimeSynch
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.engine.StdTimeSynch
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
user.owfs.OWFSService
Dec 23 21:27:56 debian10 /weewxd: owfs: service version is 0.22
Dec 23 21:27:56 debian10 /weewxd: owfs: binding is loop
Dec 23 21:27:56 debian10 /weewxd: owfs: interface is 192.168.54.9:4304
Dec 23 21:27:56 debian10 /weewxd: owfs: sensor map is {'extraTemp1':
'/28.64B673060000/temperature'}
Dec 23 21:27:56 debian10 /weewxd: owfs: sensor type map is {}
Dec 23 21:27:56 debian10 /weewxd: owfs: sensor unit system is metric
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service user.owfs.OWFSService
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.engine.StdConvert
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.engine: StdConvert target unit
is 0x1
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.engine.StdConvert
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.engine.StdCalibrate
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.engine.StdCalibrate
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.engine.StdQC
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.engine.StdQC
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.wxservices.StdWXCalculate
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.manager: Daily summary version
is 2.0
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.wxservices: The following
values will be calculated: altimeter=prefer_hardware, appTemp=prefer_hardware,
barometer=prefer_hardware, beaufort=prefer_hardware, cloudbase=prefer_hardware,
dewpoint=prefer_hardware, ET=prefer_hardware, heatindex=prefer_hardware,
humidex=prefer_hardware, inDewpoint=prefer_hardware,
maxSolarRad=prefer_hardware, pressure=prefer_hardware,
rainRate=prefer_hardware, windchill=prefer_hardware, windrun=prefer_hardware
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.wxservices: The following
algorithms will be used for calculations: altimeter=aaASOS, maxSolarRad=RS
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.wxservices.StdWXCalculate
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.engine.StdArchive
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.engine: Archive will use data
binding wx_binding
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.engine: Record generation will
be attempted in 'hardware'
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.engine: Using archive interval
of 300 seconds (specified in weewx configuration)
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Use LOOP data in
hi/low calculations: 1
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.engine.StdArchive
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.restx.StdStationRegistry
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.restx: StationRegistry:
Registration not requested.
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.restx.StdStationRegistry
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.restx.StdWunderground
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.restx: Wunderground: Posting
not enabled.
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.restx.StdWunderground
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.restx.StdPWSweather
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.restx: PWSweather: Posting not
enabled.
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.restx.StdPWSweather
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.restx.StdCWOP
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.restx: CWOP: Posting not
enabled.
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.restx.StdCWOP
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.restx.StdWOW
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.restx: WOW: Posting not enabled.
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.restx.StdWOW
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.restx.StdAWEKAS
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.restx: AWEKAS: Posting not
enabled.
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.restx.StdAWEKAS
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.engine.StdPrint
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.engine.StdPrint
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Loading service
weewx.engine.StdReport
Dec 23 21:27:56 debian10 weewx[2964] DEBUG weewx.engine: Finished loading
service weewx.engine.StdReport
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.engine: Starting up weewx
version 4.0.0b5
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.engine: Clock error is -0.05
seconds (positive is fast)
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.engine: Using binding
'wx_binding' to database 'weewx.sdb'
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.manager: Starting backfill of
daily summaries
Dec 23 21:27:56 debian10 weewx[2964] INFO weewx.engine: Starting main packet
loop.
# WEEWX CONFIGURATION FILE
#
# Copyright (c) 2009-2019 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 = 1
# Root directory of the weewx data file hierarchy for this station
WEEWX_ROOT = /home/weewx
# Whether to log successful operations
log_success = True
# Whether to log unsuccessful operations
log_failure = True
# How long to wait before timing out a socket (FTP, HTTP) connection
socket_timeout = 20
# Do not modify this. It is used when installing and updating weewx.
version = 4.0.0b5
##############################################################################
# This section is for information about the station.
[Station]
# Description of the station location
location = ""
# Latitude and longitude in decimal degrees
latitude = 90.000
longitude = 0.000
# Altitude of the station, with unit it is in. This is downloaded from
# from the station if the hardware supports it.
altitude = 0, meter # Choose 'foot' or 'meter' for unit
# Set to type of station hardware. There must be a corresponding stanza
# in this file with a 'driver' parameter indicating the driver to be used.
station_type = Simulator
# If you have a website, you may specify an URL
#station_url = http://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
##############################################################################
[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]
[[StationRegistry]]
# To register this weather station with weewx, set this to true
register_this_station = false
[[AWEKAS]]
# This section is for configuring posts to AWEKAS.
# If you wish to do this, set the option 'enable' to true,
# and specify a username and password.
# To guard against parsing errors, put the password in quotes.
enable = false
username = replace_me
password = replace_me
[[CWOP]]
# This section is for configuring posts to CWOP.
# If you wish to do this, set the option 'enable' to true,
# and specify the station ID (e.g., CW1234).
enable = false
station = replace_me
# If this is an APRS (radio amateur) station, uncomment
# the following and replace with a passcode (e.g., 12345).
#passcode = replace_me (APRS stations only)
[[PWSweather]]
# This section is for configuring posts to PWSweather.com.
# If you wish to do this, set the option 'enable' to true,
# and specify a station and password.
# To guard against parsing errors, put the password in quotes.
enable = false
station = replace_me
password = replace_me
[[WOW]]
# This section is for configuring posts to WOW.
# If you wish to do this, set the option 'enable' to true,
# and specify a station and password.
# To guard against parsing errors, put the password in quotes.
enable = false
station = replace_me
password = replace_me
[[Wunderground]]
# This section is for configuring posts to the Weather Underground.
# If you wish to do this, set the option 'enable' to true,
# and specify a station (e.g., 'KORHOODR3') and password.
# To guard against parsing errors, put the password in quotes.
enable = false
station = replace_me
password = replace_me
# If you plan on using wunderfixer, set the following
# to your API key:
api_key = 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 = public_html
# The database binding indicates which data should be used in reports.
data_binding = wx_binding
# Whether to log a successful operation
log_success = True
# Whether to log an unsuccessful operation
log_failure = False
# 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 = public_html/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 = public_html/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 passwords 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 = public_html
# 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 = public_html
# 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
####
# Various options for customizing your reports.
[[Defaults]]
[[[Units]]]
# The following section sets what unit to use for each unit group.
# NB: The unit is always in the singular. I.e., 'mile_per_hour',
# NOT 'miles_per_hour'
[[[[Groups]]]]
group_altitude = meter # Options are 'foot' or 'meter'
group_degree_day = degree_C_day # Options are 'degree_F_day'
or 'degree_C_day'
group_distance = km # Options are 'mile' or 'km'
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_speed = meter_per_second # Options are
'mile_per_hour', 'km_per_hour', 'knot', or 'meter_per_second'
group_speed2 = meter_per_second2 # Options are
'mile_per_hour2', 'km_per_hour2', 'knot2', or 'meter_per_second2'
group_temperature = degree_C # Options are 'degree_F' or
'degree_C'
# The following section sets the formatting for each type of unit.
[[[[StringFormats]]]]
centibar = %.0f
cm = %.2f
cm_per_hour = %.2f
degree_C = %.1f
degree_F = %.1f
degree_compass = %.0f
foot = %.0f
hPa = %.1f
hour = %.1f
inHg = %.3f
inch = %.2f
inch_per_hour = %.2f
km = %.1f
km_per_hour = %.0f
km_per_hour2 = %.1f
knot = %.0f
knot2 = %.1f
mbar = %.1f
meter = %.0f
meter_per_second = %.1f
meter_per_second2 = %.1f
mile = %.1f
mile_per_hour = %.0f
mile_per_hour2 = %.1f
mm = %.1f
mmHg = %.1f
mm_per_hour = %.1f
percent = %.0f
second = %.0f
uv_index = %.1f
volt = %.1f
watt_per_meter_squared = %.0f
NONE = " N/A"
# The following section sets the label for each type of unit
[[[[Labels]]]]
day = " day", " days"
hour = " hour", " hours"
minute = " minute", " minutes"
second = " second", " seconds"
NONE = ""
# The following section sets the format for each time scale.
# The values below will work in every locale, but they may not look
# particularly attractive.
[[[[TimeFormats]]]]
hour = %H:%M
day = %X
week = %X (%A)
month = %x %X
year = %x %X
rainyear = %x %X
current = %x %X
ephem_day = %X
ephem_year = %x %X
[[[[Ordinates]]]]
# Ordinal directions. The last one is for no wind direction
directions = N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW,
W, WNW, NW, NNW, N/A
# The following section sets the base temperatures used for the
# calculation of heating and cooling degree-days.
[[[[DegreeDays]]]]
# Base temperature for heating days, with unit:
heating_base = 65, degree_F
# Base temperature for cooling days, with unit:
cooling_base = 65, degree_F
# Base temperature for growing days, with unit:
growing_base = 50, degree_F
# A trend takes a difference across a time period. The following
# section sets the time period, and how big an error is allowed to
# still be counted as the start or end of a period.
[[[[Trend]]]]
time_delta = 10800 # 3 hours
time_grace = 300 # 5 minutes
# The labels to be used for each observation type
[[[Labels]]]
# Set to hemisphere abbreviations suitable for your location:
hemispheres = N, S, E, W
# Formats to be used for latitude whole degrees, longitude whole
# degrees, and minutes:
latlon_formats = %02d, %03d, %05.2f
# Generic labels, keyed by an observation type.
[[[[Generic]]]]
barometer = Barometer
dewpoint = Dew Point
ET = ET
heatindex = Heat Index
inHumidity = Inside Humidity
inTemp = Inside Temperature
outHumidity = Humidity
outTemp = Outside Temperature
radiation = Radiation
rain = Rain
rainRate = Rain Rate
UV = UV Index
windDir = Wind Direction
windGust = Gust Speed
windGustDir = Gust Direction
windSpeed = Wind Speed
windchill = Wind Chill
windgustvec = Gust Vector
windvec = Wind Vector
extraTemp1 = Temperature1
extraTemp2 = Temperature2
extraTemp3 = Temperature3
# Sensor status indicators
rxCheckPercent = Signal Quality
txBatteryStatus = Transmitter Battery
windBatteryStatus = Wind Battery
rainBatteryStatus = Rain Battery
outTempBatteryStatus = Outside Temperature Battery
inTempBatteryStatus = Inside Temperature Battery
consBatteryVoltage = Console Battery
heatingVoltage = Heating Battery
supplyVoltage = Supply Voltage
referenceVoltage = Reference Voltage
[[[Almanac]]]
# The labels to be used for the phases of the moon:
moon_phases = New, Waxing crescent, First quarter, Waxing gibbous,
Full, Waning gibbous, Last quarter, Waning crescent
##############################################################################
# This service acts as a filter, converting 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
##############################################################################
# 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
barometer = prefer_hardware
altimeter = prefer_hardware
windchill = prefer_hardware
heatindex = prefer_hardware
dewpoint = prefer_hardware
inDewpoint = prefer_hardware
rainRate = 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
# 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.wxmanager.WXDaySummaryManager
# The schema defines the structure of the database.
# It is *only* used when the database is created.
schema = schemas.wview.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 the database files are located
SQLITE_ROOT = %(WEEWX_ROOT)s/archive
# 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
# The password for the user name (quotes guard against parsing errors)
password = weewx
##############################################################################
# This section configures the internal weewx engine.
[Engine]
[[Services]]
# This section specifies the services that should be run. They are
# grouped by type, and the order of services within each group
# determines the order in which the services will be run.
prep_services = weewx.engine.StdTimeSynch
#data_services = ,
data_services = user.owfs.OWFSService
process_services = weewx.engine.StdConvert, weewx.engine.StdCalibrate,
weewx.engine.StdQC, weewx.wxservices.StdWXCalculate
archive_services = weewx.engine.StdArchive
restful_services = weewx.restx.StdStationRegistry,
weewx.restx.StdWunderground, weewx.restx.StdPWSweather, weewx.restx.StdCWOP,
weewx.restx.StdWOW, weewx.restx.StdAWEKAS
report_services = weewx.engine.StdPrint, weewx.engine.StdReport
# Options for extension 'owfs'
[OWFS]
#interface = u
interface = 192.168.54.9:4304
#interface = localhost:4304
driver = user.owfs
binding = loop
[[sensor_type]]
[[sensor_map]]
#extraTemp1 = /uncached/28.64B673060000/temperature
extraTemp1 = /28.64B673060000/temperature
#!/usr/bin/python
# $Id: owfs.py 1700 2017-08-15 11:02:18Z mwall $
#
# Copyright 2013 Matthew Wall
# Thanks to Mark Cressey (onewireweewx) and Howard Walter (TAI code).
#
# 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/
"""Classes and functions for interfacing with one-wire sensors via owfs.
This file contains both a weewx driver and a weewx service. Either will
read raw data from owfs, then the weewx calibration can be used to adjust
raw values as needed. Mapping from one-wire device and attribute to weewx
database field is done in the OWFS section of weewx.conf.
This module requires the python bindings for owfs. The owfs software itself
can be installed if you like, but it is not necessary; the owftpd, owhttpd,
and owserver services are not used and do not need to be running. In fact,
it is safer to leave those services disabled to ensure that they do not
conflict with weewx when it attempts to read one-wire devices.
On debian systems, install the python bindings with something like this:
sudo apt-get install python-ow
Put this file, owfs.py, in the weewx 'user' directory, then modify weewx.conf
with something like this:
[OWFS]
interface = u
driver = user.owfs
[[sensor_map]]
inTemp = /uncached/28.8A071E050000/temperature
To use as a driver:
[Station]
station_type = OWFS
To use as a service:
[Engine]
[[Service]]
data_services = user.owfs.OWFSService
The service can be bound to LOOP or ARCHIVE. The default binding is archive;
when a new archive record is created, this service is invoked to collect data
from the one-wire bus. The other option is loop binding; when loop data are
collected, this service is invoked to collect data from the one-wire bus.
Beware that a slow one-wire bus can adversely affect the performance and
behavior of weewx, especially when using loop binding.
Use the binding parameter to indicate LOOP or ARCHIVE binding. For example,
[OWFS]
binding = loop
Only numeric sensor values are supported.
By default, data from each sensor are treated as gauge. Data types include:
gauge - record the value as it is read from the sensor
delta - difference between current and last reading
average - time average by calculating the delta divided by time period
counter - difference between current and last, always increasing
By default, the units of the sensors is assumed to be metric. If the sensors
have been configured to output in US units, use the unit_system option. For
example,
[OWFS]
unit_system = US
The interface indicates where the one-wire devices are attached. The default
value is u, which is shorthand for 'usb'. This is the option to use for a
DS9490R USB adaptor. Other options include a serial port such as /dev/ttyS0,
or remote_system:3003 to get data from a remote host running owserver. For
example,
[OWFS]
interface = /dev/ttyS0
The sensor map is simply a list of database field followed by full path to the
desired sensor reading. Only sensor values that can be converted to float
are supported at this time.
Some devices support caching. To use raw, uncached values, preface the path
with /uncached.
To find out what devices are actually attached:
sudo PYTHONPATH=/home/weewx/bin python /home/weewx/bin/user/owfs.py --sensors
To display the names of data fields for each sensor, as well as actual data:
sudo PYTHONPATH=/home/weewx/bin python /home/weewx/bin/user/owfs.py --readings
To display the value from a single sensor:
sudo PYTHONPATH=bin python bin/user/owfs.py --reading /path/to/sensor
Details about the python bindings are at the owfs project on sourceforge:
http://owfs.sourceforge.net/owpython.html
Example Configurations
AAG TAI8515 V3 weather station
[OWFS]
[[sensor_map]]
outTemp = /uncached/XX.YYYYYYYYYYYY/temperature
windDir = /uncached/XX.YYYYYYYYYYYY # volt.ALL
windSpeed = /uncached/XX.YYYYYYYYYYYY # counters.A
[[sensor_type]]
windDir = aag_windvane
windSpeed = aag_windspeed
Hobby-Boards ADS wind instrument, lightning sensor, solar radiation
sensor, and rainwise rain instrument
[OWFS]
[[sensor_map]]
inTemp = /XX.YYYYYYYYYYYY/temperature
UV = /XX.YYYYYYYYYYYY/UVI/UVI
luminosity = /XX.YYYYYYYYYYYY/S3-R1-A/luminosity
lightning = /XX.YYYYYYYYYYYY/counters.A
rain = /XX.YYYYYYYYYYYY # counters.B
windDir = /XX.YYYYYYYYYYYY # VAD
windSpeed = /XX.YYYYYYYYYYYY # counters.A
[[sensor_type]]
lightning = counter
rain = rainwise_bucket
windDir = ads_windvane
windSpeed = ads_windspeed
[StdCalibrate]
[[Corrections]]
radiation = luminosity * 1.730463
Hobby-Boards with Inspeed wind instrument
[OWFS]
[[sensor_map]]
windDir = /XX.YYYYYYYYYYYY # VAD / VDD
windSpeed = /XX.YYYYYYYYYYYY # counters.A
[[sensor_type]]
windDir = inspeed_windvane
windSpeed = inspeed_windspeed
"""
# FIXME: automatically detect each sensor type
# FIXME: automatically detect per-sensor units
import syslog
import time
import ow
import weewx
from weewx.drivers import AbstractDevice
from weewx.engine import StdService
DRIVER_NAME = 'OWFS'
DRIVER_VERSION = "0.22"
def logmsg(level, msg):
syslog.syslog(level, 'owfs: %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_float(path):
sv = ow.owfs_get(path)
sv = sv.replace(',','.')
v = float(sv)
return v
def gauge(key, path, last_data, ts):
return get_float(path)
def delta(key, path, last_data, ts):
v = get_float(path)
if key in last_data:
x = v - last_data.get(key)
else:
x = None
last_data[key] = v
return x
def counter(key, path, last_data, ts):
v = get_float(path)
if key in last_data and v >= last_data.get(key):
x = v - last_data.get(key)
# if x < 0:
# maxcnt = 0x10000 # 16-bit counter
# if x + maxcnt < 0:
# maxcnt = 0x100000000 # 32-bit counter
# if x + maxcnt < 0:
# maxcnt = 0x10000000000000000 # 64-bit counter
# x += maxcnt
else:
x = None
last_data[key] = v
return x
def average(key, path, last_data, ts):
v = get_float(path)
if key in last_data:
(oldv, oldt) = last_data.get(key)
if ts > oldt:
x = (v - oldv)/(ts - oldt)
else:
x = None
else:
x = None
last_data[key] = (v, ts)
return x
def rainwise_bucket(key, path, last_data, ts):
cnt = counter(key, "%s%s" % (path, "/counters.B"), last_data, ts)
if cnt is not None:
cnt *= 0.0254 # rainwise bucket is 0.01 inches per tip, convert to cm
return cnt
def ads_windspeed(key, path, last_data, ts):
ws = average(key, "%s%s" % (path, "/counters.A"), last_data, ts)
if ws is not None:
ws *= 2.01168 # convert to kph
return ws
def ads_winddir(key, path, last_data, ts):
"""Calculate wind direction for Hobby-Boards ADS wind instrument.
Get wind direction from the VAD register fo the DS2438.
Formula from the Hobby-Boards ADS anemometer user manual."""
v = get_float('%s%s' % (path, '/VAD'))
wdir = None
if 2.66 <= v <= 2.72:
wdir = 0 # N
elif 6.49 <= v <= 6.55:
wdir = 22.5 # NNE
elif 5.96 <= v <= 6.55:
wdir = 45 # NE
elif 9.35 <= v <= 9.41:
wdir = 67.5 # ENE
elif 9.27 <= v <= 9.33:
wdir = 90 # E
elif 9.50 <= v <= 9.56:
wdir = 112.5 # ESE
elif 8.48 <= v <= 8.54:
wdir = 135 # SE
elif 8.98 <= v <= 9.04:
wdir = 157.5 # SSE
elif 7.57 <= v <= 7.63:
wdir = 180 # S
elif 7.95 <= v <= 8.01:
wdir = 202.5 # SSW
elif 4.28 <= v <= 4.34:
wdir = 225 # SW
elif 4.59 <= v <= 4.65:
wdir = 247.5 # WSW
elif 0.89 <= v <= 0.95:
wdir = 270 # W
elif 2.20 <= v <= 2.26:
wdir = 292.5 # WNW
elif 1.54 <= v <= 1.60:
wdir = 315 # NW
elif 3.54 <= v <= 3.60:
wdir = 337.5 # NNW
return wdir
def inspeed_windspeed(key, path, last_data, ts):
ws = average(key, "%s%s" % (path, "/counters.A"), last_data, ts)
if ws is not None:
ws *= 4.02336 # convert to kph
return ws
def inspeed_winddir(key, path, last_data, ts):
"""Calculate wind direction for Hobby-Boards Inspeed wind instrument.
Get wind direction from the VDD and VAD register of DS2438.
Formula from the Hobby-Boards Inspeed anemometer user manual."""
vdd = get_float('%s%s' % (path, '/VDD'))
vad = get_float('%s%s' % (path, '/VAD'))
return (400*(vad-0.05*vdd))/vdd if vdd else None
def aag_windspeed(key, path, last_data, ts):
ws = average(key, "%s%s" % (path, "/counters.A"), last_data, ts)
if ws is not None:
ws *= 3.948 / 2 # speed in mph is 2.453 * cnt / 2; convert to kph
return ws
def aag_winddir(key, path, last_data, ts):
"""Calculate wind direction for AAG TAI8515 V3 wind instrument.
Contributed by Howard Walter, based on oww C implementation."""
w = ow.owfs_get("%s%s" % (path, "/volt.ALL"))
wd = w.split(',')
wd = [float(x) for x in wd]
mx = max(x for x in wd)
wd = [x/mx for x in wd]
if wd[0] < 0.26:
if wd[1] < 0.505:
wdir = 11
else:
if wd[3] < 0.755:
wdir = 13
else:
wdir = 12
else:
if wd[1] < 0.26:
if wd[2] < 0.505:
wdir = 9
else:
wdir = 10
else:
if wd[2] < 0.26:
if wd[3] < 0.505:
wdir = 7
else:
wdir = 8
else:
if wd[3] < 0.26:
if wd[0] < 0.755:
wdir = 5
else:
wdir = 6
else:
if wd[3] < 0.84:
if wd[2] < 0.84:
wdir = 15
else:
wdir = 14
else:
if wd[0] < 0.845:
if wd[1] < 0.845:
wdir = 3
else:
wdir = 4
else:
if wd[1] > 0.84:
wdir = 0
else:
if wd[2] > 0.845:
wdir = 2
else:
wdir = 1
return 22.5 * wdir
SENSOR_TYPES = {
'gauge': gauge,
'delta': delta,
'average': average,
'counter': counter,
'ads_windvane': ads_winddir,
'ads_windspeed': ads_windspeed,
'inspeed_windvane': inspeed_winddir,
'inspeed_windspeed': inspeed_windspeed,
'aag_windvane': aag_winddir,
'aag_windspeed': aag_windspeed,
'rainwise_bucket': rainwise_bucket,
}
def loader(config_dict, engine):
return OWFSDriver(**config_dict['OWFS'])
class OWFSDriver(weewx.drivers.AbstractDevice):
"""Driver for one-wire sensors via owfs."""
def __init__(self, **stn_dict) :
"""Initialize the driver.
interface: Where to find the one-wire sensors. Options include
u, /dev/ttyS0
[Required. Default is u (usb)]
sensor_map: Associate sensor values with database fields.
[Required]
sensor_type: Indicate how data should be processed before saving.
[Optional. Default is gauge]
polling_interval: How often to poll for data, in seconds.
[Optional. Default is 10]
unit_system: The unit system the data are assumed to be in. Can
be one of 'METRIC' or 'US'. This assumes that all sensors are
reporting data in the same unit system.
[Optional. Default is METRIC]
"""
self.sensor_map = stn_dict['sensor_map']
self.sensor_type = stn_dict.get('sensor_type', {})
self.interface = stn_dict.get('interface', 'u')
self.polling_interval = int(stn_dict.get('polling_interval', 10))
self.unit_system = stn_dict.get('unit_system', 'METRIC').lower()
self.last_data = {}
self.units = weewx.US if self.unit_system == 'us' else weewx.METRIC
loginf('driver version is %s' % DRIVER_VERSION)
loginf('interface is %s' % self.interface)
loginf('sensor map is %s' % self.sensor_map)
loginf('sensor type map is %s' % self.sensor_type)
loginf('polling interval is %s' % str(self.polling_interval))
loginf('sensor unit system is %s' % self.unit_system)
ow.init(self.interface)
# open all 1-wire channels on a Hobby Boards 4-channel hub. see:
# http://owfs.org/index.php?page=4-channel-hub
# ow.owfs_put("%s/hub/branch.BYTE" % hubpath, 15)
@property
def hardware_name(self):
return 'OWFS'
def genLoopPackets(self):
while True:
last_data = dict(self.last_data)
p = {'usUnits': self.units,
'dateTime': int(time.time() + 0.5)}
for s in self.sensor_map:
p[s] = None
st = 'gauge'
if s in self.sensor_type:
st = self.sensor_type[s]
if st in SENSOR_TYPES:
try:
func = SENSOR_TYPES[st]
p[s] = func(s, self.sensor_map[s],
last_data, p['dateTime'])
except (ow.exError, ValueError) as e:
logerr("Failed to get sensor data for %s (%s): %s" %
(s, st, e))
else:
logerr("unknown sensor type '%s' for %s" % (st, s))
self.last_data.update(last_data)
yield p
time.sleep(self.polling_interval)
def closePort(self):
ow.finish()
class OWFSService(weewx.engine.StdService):
"""Collect data from one-wire devices via owfs."""
def __init__(self, engine, config_dict):
"""
interface: Where to find the one-wire sensors. Options include
u, /dev/ttyS0
[Required. Default is u (usb)]
sensor_map: Associate sensor values with database fields.
[Required]
sensor_type: Indicates how data should be processed before saving.
[Optional. Default is gauge]
"""
super(OWFSService, self).__init__(engine, config_dict)
d = config_dict.get('OWFS', {})
self.sensor_map = d['sensor_map']
self.sensor_type = d.get('sensor_type', {})
self.interface = d.get('interface', 'u')
self.unit_system = d.get('unit_system', 'METRIC').lower()
self.binding = d.get('binding', 'archive')
self.last_data = {}
self.units = weewx.US if self.unit_system == 'us' else weewx.METRIC
loginf('service version is %s' % DRIVER_VERSION)
loginf('binding is %s' % self.binding)
loginf('interface is %s' % self.interface)
loginf('sensor map is %s' % self.sensor_map)
loginf('sensor type map is %s' % self.sensor_type)
loginf('sensor unit system is %s' % self.unit_system)
ow.init(self.interface)
if self.binding == 'loop':
self.bind(weewx.NEW_LOOP_PACKET, self.handle_new_loop)
else:
self.bind(weewx.NEW_ARCHIVE_RECORD, self.handle_new_archive)
def shutDown(self):
ow.finish()
def handle_new_loop(self, event):
data = self.getData(event.packet)
event.packet.update(data)
def handle_new_archive(self, event):
delta = time.time() - event.record['dateTime']
if delta > event.record['interval'] * 60:
logdbg("Skipping record: time difference %s too big" % delta)
return
data = self.getData(event.record)
event.record.update(data)
# this implementation assumes that data from one-wire sensors are metric.
# if the packets to which we append are something other than metric, then
# we do a conversion after we have all the data.
def getData(self, packet):
last_data = dict(self.last_data)
p = {'usUnits': self.units}
for s in self.sensor_map:
p[s] = None
st = 'gauge'
if s in self.sensor_type:
st = self.sensor_type[s]
if st in SENSOR_TYPES:
func = SENSOR_TYPES[st]
try:
p[s] = func(s, self.sensor_map[s],
last_data, packet['dateTime'])
except (ow.exError, ValueError) as e:
logerr("Failed to get onewire data for %s (%s): %s" %
(s, st, e))
else:
logerr("unknown sensor type '%s' for %s" % (st, s))
self.last_data.update(last_data)
if packet['usUnits'] != self.units:
p['usUnits'] = self.units
converter = weewx.units.StdUnitConverters[packet['usUnits']]
p = converter.convertDict(p)
if 'usUnits' in p:
del p['usUnits']
return p
# define a main entry point for basic testing without weewx engine and service
# overhead. invoke this as follows from the weewx root dir:
#
# PYTHONPATH=bin python bin/user/owfs.py
if __name__ == '__main__':
usage = """%prog [options] [--debug] [--help]"""
def main():
import optparse
syslog.openlog('wee_owfs', syslog.LOG_PID | syslog.LOG_CONS)
parser = optparse.OptionParser(usage=usage)
parser.add_option('--version', dest='version', action='store_true',
help='display driver version')
parser.add_option('--debug', dest='debug', action='store_true',
help='display diagnostic information while running')
parser.add_option("--iface", dest="iface", type=str, metavar="IFACE",
help="specify the interface, e.g., u or /dev/ttyS0")
parser.add_option('--sensors', dest='sensors', action='store_true',
help='display list attached sensors')
parser.add_option('--readings', dest='readings', action='store_true',
help='display sensor readings')
parser.add_option('--reading',dest='reading',type=str,metavar="SENSOR",
help='display output of specified sensor')
(options, args) = parser.parse_args()
if options.version:
print ("owfs version %s" % DRIVER_VERSION)
exit(1)
# default to usb for the interface
iface = options.iface if options.iface is not None else 'u'
if options.debug is not None:
syslog.setlogmask(syslog.LOG_UPTO(syslog.LOG_DEBUG))
else:
syslog.setlogmask(syslog.LOG_UPTO(syslog.LOG_INFO))
if options.sensors:
ow.init(iface)
traverse(ow.Sensor('/'), identify_sensor)
elif options.readings:
ow.init(iface)
traverse(ow.Sensor('/'), display_sensor_info)
elif options.reading:
ow.init(iface)
print ('%s: %s' % (options.reading, ow.owfs_get(options.reading)))
def identify_sensor(s):
print ('%s: %s %s' % (s.id, s._path, s._type))
def display_sensor_info(s):
print (s.id)
display_dict(s.__dict__)
def display_dict(d, level=0):
for k in d:
if isinstance(d[k], dict):
display_dict(d[k], level=level+1)
elif k == 'alias':
pass
elif k.startswith('_'):
print ('%s%s: %s' % (' '*level, k, d[k]))
else:
v = 'UNKNOWN'
try:
v = ow.owfs_get(d[k])
except ow.exError as e:
v = 'FAIL: %s' % e
print ('%s%s: %s' % (' '*level, d[k], v))
def traverse(device, func):
for s in device.sensors():
if s._type in ['DS2409']:
traverse(s, func)
else:
func(s)
if __name__ == '__main__':
main()
Dec 23 21:31:33 debian10 systemd[1]: Started weewx weather system.
Dec 23 21:31:33 debian10 weewx[3114] INFO weewx.engine: Initializing weewx
version 4.0.0b5
Dec 23 21:31:33 debian10 weewx[3114] INFO weewx.engine: Using Python 2.7.16
(default, Oct 10 2019, 22:02:15) #012[GCC 8.3.0]
Dec 23 21:31:33 debian10 weewx[3114] INFO weewx.engine: Platform
Linux-4.19.0-6-amd64-x86_64-with-debian-10.2
Dec 23 21:31:33 debian10 weewx[3114] INFO weewx.engine: Locale is 'nl_NL.UTF-8'
Dec 23 21:31:33 debian10 weewx[3114] INFO weewx.engine: PID file is
/run/weewx.pid
Dec 23 21:31:33 debian10 weewx[3118] INFO weewx.engine: Using configuration
file /home/weewx/weewx.conf
Dec 23 21:31:33 debian10 weewx[3118] DEBUG weewx.engine: Debug is 1
Dec 23 21:31:33 debian10 weewx[3118] DEBUG weewx.engine: Initializing engine
Dec 23 21:31:33 debian10 weewx[3118] INFO weewx.engine: Loading station type
Simulator (weewx.drivers.simulator)
Dec 23 21:31:33 debian10 weewx[3118] DEBUG weewx.engine: Loading service
weewx.engine.StdTimeSynch
Dec 23 21:31:33 debian10 weewx[3118] DEBUG weewx.engine: Finished loading
service weewx.engine.StdTimeSynch
Dec 23 21:31:33 debian10 weewx[3118] DEBUG weewx.engine: Loading service
user.owfs.OWFSService
Dec 23 21:31:33 debian10 weewxd: owfs: service version is 0.22
Dec 23 21:31:33 debian10 weewxd: owfs: binding is loop
Dec 23 21:31:33 debian10 weewxd: owfs: interface is 192.168.54.9:4304
Dec 23 21:31:33 debian10 weewxd: owfs: sensor map is {u'extraTemp1':
u'/28.64B673060000/temperature'}
Dec 23 21:31:33 debian10 weewxd: owfs: sensor type map is {}
Dec 23 21:31:33 debian10 weewxd: owfs: sensor unit system is metric
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: Caught
unrecoverable exception:
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: **** in method
'init', argument 1 of type 'char const *'
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: **** Traceback
(most recent call last):
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: **** File
"/home/weewx/bin/weewx/engine.py", line 886, in main
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: ****
engine = StdEngine(config_dict)
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: **** File
"/home/weewx/bin/weewx/engine.py", line 83, in __init__
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: ****
self.loadServices(config_dict)
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: **** File
"/home/weewx/bin/weewx/engine.py", line 143, in loadServices
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: **** obj =
weeutil.weeutil.get_object(svc)(self,config_dict)
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: **** File
"/home/weewx/bin/user/owfs.py", line 488, in __init__
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: ****
ow.init(self.interface)
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: **** File
"/usr/lib/python2.7/dist-packages/ow/__init__.py", line 220, in init
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: **** if
not _OW.init( iface ):
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: ****
TypeError: in method 'init', argument 1 of type 'char const *'
Dec 23 21:31:33 debian10 weewx[3118] CRITICAL weewx.engine: **** Exiting.
Dec 23 21:31:33 debian10 systemd[1]: weewx.service: Succeeded.
Dec 23 21:32:46 debian10 dbus-daemon[941]: [session uid=1000 pid=941]
Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract'
unit='tracker-extract.service' requested by ':1.49' (uid=1000 pid=1204
comm="/usr/lib/tracker/tracker-miner-fs ")
Dec 23 21:32:46 debian10 systemd[922]: Starting Tracker metadata extractor...
Dec 23 21:32:46 debian10 dbus-daemon[941]: [session uid=1000 pid=941]
Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract'