WeeWX 5.5.2 配置参数详解

逐段详解 WeeWX 5.5.2 主配置文件 weewx.conf:15 个配置段的全部关键参数语义、默认值与 8 组改配置实测闭环(站点信息、debug、归档间隔、标定校正、质量过滤、换库、报告目录权限),附可直接套用的北京站点生产模板。

WeeWXPythonLinux气象数据采集2026/10/31

WeeWX 5.5.2 配置参数详解

目标:逐段讲透 WeeWX 5.5.2 主配置文件 weewx.conf 的全部配置段与关键参数——每个参数给出官方语义、默认值与实测验证结论。全文参数改动均在 Ubuntu 22.04 + WeeWX 5.5.2 实机上完成「改配置 → 重启 → 看日志/查数据库」闭环验证,涉及 8 组对照实验(站点信息、debug、归档间隔、标定校正、质量过滤、换库、报告目录权限)。

一、环境信息

  • 操作系统:Ubuntu 22.04(x86_64),WeeWX 5.5.2-1(官方 apt 仓库安装,DEB 形态)
  • 配置文件:/etc/weewx/weewx.conf(DEB 形态的 WEEWX_ROOT;pip 形态为 <数据区>/weewx.conf,参数语义完全一致,仅路径前缀不同)
  • 验证手段:systemctl restart weewx 后用 journalctl -u weewx 核对启动日志、sqlite3 /var/lib/weewx/weewx.sdb 核对落库数据、ls /var/www/html/weewx/ 核对报告产物
  • 实测时区:服务器为 UTC 时区,日志与数据库时间戳均为 UTC;换算北京时间加 8 小时
  • 参数语义溯源:官方文档 5.5 版 Reference / Application options 各页(https://weewx.com/docs/5.5/reference/),查询日期 2026-10-31

二、前置条件

  1. 已按官方 apt 方式安装 WeeWX 5.5.2 且服务处于 active(安装步骤见 《Ubuntu 22.04 安装 WeeWX 5.5.2 指南》);
  2. root 或 sudo 权限(配置文件属主为 weewx:weewx,编辑用 sudo);
  3. 已安装 sqlite3 命令行客户端(sudo apt install -y sqlite3),用于核对参数改动后的落库效果;
  4. 理解 WeeWX 的服务链模型:一次数据落库要顺序穿过「预处理 → 单位转换 → 标定校正 → 质量控制 → 派生量计算 → 归档 → 上传 → 报告」八组服务,配置段与服务一一对应(见 5.14 节)。

三、参数查看与修改方式

3.1 配置文件位置与读取

DEB 形态下一切配置集中在一个文件:

ls -l /etc/weewx/weewx.conf
wc -l /etc/weewx/weewx.conf

实测回显:

-rw-r----- 1 root weewx 20000 Oct 30 22:59 /etc/weewx/weewx.conf
516 /etc/weewx/weewx.conf

文件约 516 行、20 KB,分两大块:顶部无段名的「通用参数」(debug、log_success 等)与 [段名] 组织的 15 个配置段。快速浏览段结构:

grep -n '^\[' /etc/weewx/weewx.conf

实测回显:

[26]#[Station]
[58]#[Simulator]
[81]#[StdRESTful]
[162]#[StdReport]
[332]#[StdConvert]
[354]#[StdCalibrate]
[367]#[StdQC]
[383]#[StdWXCalculate]
[412]#[StdTimeSynch]
[424]#[StdArchive]
[450]#[DataBindings]
[468]#[Databases]
[484]#[DatabaseTypes]
[506]#[Engine]

(grep 输出格式为「行号#内容」,实际终端显示 [26]:[Station] 等;另有由 weectl station reconfigure 注入的 [Vantage] 段位于 76 行附近,见 5.15 节。)

3.2 configobj 语法规则

weewx.conf 由 Python 库 configobj 解析,语法规则只有三条,但每条都踩过坑:

  1. 段名顶格:[Station]、[[SeasonsReport]](二层子段)、[[[Units]]](三层子段),方括号数量即层级;
  2. 键值对逐级缩进:一层段内键缩进 4 空格,二层子段内缩进 8 空格,以此类推;
  3. 每行必须是段名或「键 = 值」,注释以 # 开头。

实测踩坑记录:在 [Station] 段内插入一行没有等号的文本 broken option without value,重启服务必然失败:

systemctl status weewx

实测回显(节选):

● weewx.service - WeeWX weather system
     Loaded: loaded (/lib/systemd/system/weewx.service; enabled; preset: enabled)
     Active: failed (Result: exit-code)

journalctl -u weewx --no-pager | tail -5 中的关键报错:

CRITICAL __main__: Caught unrecoverable exception in initializer
CRITICAL __main__: Reason: configobj.ParseError: Invalid line ('    broken option without value') (matched as neither section nor keyword) at line 52. File '/etc/weewx/weewx.conf'.

报错把「文件名 + 行号 + 原文」全给了出来,定位很直接。同时 systemd 把该失败标记为 status=3/NOTIMPLEMENTED。修复语法后 systemctl restart weewx 即恢复 active。

💡 技术拓展:configobj 是 Python 生态里带「段层级」的 INI 解析库(相比 configparser 的平面 section,configobj 用双重/三重方括号表达嵌套,且保留注释与顺序)。WeeWX 4.x 用的是自家 config 模块,5.x 起切换到 configobj——所以从 4.x 升级后手工合并旧配置时,缩进错误会在 5.x 首次启动就暴露,而不是静默忽略。

3.3 修改方式一:手工编辑 + 重启生效

WeeWX 启动时读取一次配置文件,运行中不监听文件变化。标准生效流程是「编辑 → 重启 → 看日志确认」:

sudo systemctl restart weewx
journalctl -u weewx --no-pager | tail -20

服务重启后日志会重新打印完整启动序列(Using archive interval of ...、Using binding 'wx_binding' to database ... 等行都是配置自述),逐行核对即可确认新参数已被接受。

3.4 修改方式二:weectl station reconfigure(推荐用于站点级改动)

站点元数据(位置/经纬度/海拔/驱动)建议用 weectl station reconfigure 改而不是手编:该命令会先把旧配置备份为带时间戳的副本,再修改指定参数;切换驱动时若配置中缺少对应驱动段,还会自动注入完整段定义。实测切换驱动到 Davis Vantage:

sudo systemctl stop weewx
sudo weectl station reconfigure --driver=weewx.drivers.vantage --no-prompt

实测回显:

Saved old configuration file as /etc/weewx/weewx.conf.20261030151326

随后配置文件中出现了约 60 行的 [Vantage] 段(含 type = serial、port = /dev/ttyUSB0、baudrate = 19200 等十几个参数),手工很难写全。weectl 全部子命令详见 《WeeWX 常用 CLI 命令与排障详解》。

3.5 用 debug 开关核验配置

顶层 debug = 1 是排查配置问题的第一开关。实测把第 11 行 debug = 0 改为 debug = 1 并重启后,journalctl 中多出大量 DEBUG 行:

DEBUG weewx.engine: Finished loading service weewx.restx.StdStationRegistry
DEBUG weewx.engine: Finished loading service weewx.restx.StdWunderground

同时报告服务的跳过动作也变得可见:

DEBUG weewx.reportengine: Report 'SmartphoneReport' not enabled. Skipping.
DEBUG weewx.reportengine: Report 'MobileReport' not enabled. Skipping.
DEBUG weewx.reportengine: Report 'StandardReport' not enabled. Skipping.
DEBUG weewx.reportengine: Report 'FTP' not enabled. Skipping.
DEBUG weewx.reportengine: Report 'RSYNC' not enabled. Skipping.

官方文档说明 debug 支持三档:0(关闭,默认)、1(额外检查与日志)、2(更详细)。排障时打开,结束后关回 0,避免日志膨胀。

四、参数总览

weewx.conf 各配置段与服务的对应关系(顺序即数据流顺序):

配置段对应服务职责日常改动频率
顶层(无段名)引擎全局debug、日志开关、版本号低
[Station]站点抽象位置/经纬度/海拔/驱动类型装完必改一次
[Simulator] 等驱动段硬件驱动驱动自身参数随驱动
[StdRESTful]restful 服务组上传公共气象网络用到才改
[StdReport]报告服务皮肤、输出目录、单位、语言中
[StdConvert]StdConvert入库单位制只能定一次
[StdCalibrate]StdCalibrate传感器标定校正表达式按需
[StdQC]StdQC观测值合理区间过滤按需
[StdWXCalculate]StdWXCalculate派生量来源选择低
[StdTimeSynch]StdTimeSynch站钟校时低
[StdArchive]StdArchive归档间隔、记录生成方式中
[DataBindings]—数据源与库/表/管理器绑定低
[Databases]—具体数据库实例定义换库时改
[DatabaseTypes]—数据库类型默认参数换 MySQL 时改
[Engine]引擎本体七组服务链的组成与顺序高级定制

前四组服务(prep/data/process)在数据进入数据库之前工作,后四组(archive/restful/report)在数据落库之后工作。每个 [StdXxx] 段就是同名服务的行为开关。

五、核心参数分类详解

5.1 顶层通用参数

文件开头不属于任何段落的参数,作用于整个引擎:

debug = 0
log_success = True
log_failure = True
version = 5.5.2
参数默认语义(官方 Reference / General options)
debug01 输出额外调试信息(强烈建议排障时开),2 更详细
log_successTrue成功操作(报告生成完成、上传成功等)写 syslog
log_failureTrue失败操作写 syslog
version—创建该配置文件的 WeeWX 版本号,标识用
WEEWX_ROOT配置文件所在目录站点数据区根路径,相对路径都基于它解析;DEB 形态为 /etc/weewx,通常无需显式写
USER_ROOTbin/user用户扩展目录,扩展安装到这下面
socket_timeout20FTP/上传等服务 socket 超时秒数
gc_interval10800Python 垃圾回收间隔秒数(3 小时)
loop_on_initfalse驱动加载失败时是否无限重试;false = 直接退出(默认,配置错误时重试无意义),网络型驱动间歇失败场景可开 true
retry_wait60配合 loop_on_init 的重试等待秒数

注意 log_success/log_failure 是「可被覆盖」的分层设计:顶层设全局默认,[StdRESTful]、[StdReport]、[StdArchive] 段内可各自覆盖,只影响本组操作。

5.2 [Station]:站点元数据

[Station]
    location = "Santa's Workshop, North Pole"
    latitude = 90.0
    longitude = 0.0
    altitude = 0, meter
    station_type = Simulator
    rain_year_start = 1
    week_start = 6
参数默认语义
location无(安装向导填)站点描述文本,UTF-8,显示在报告页标题
latitude / longitude无十进制度;南半球纬度取负、西半球经度取负
altitude无「数值, 单位」二元组,单位 foot 或 meter;硬件不报海拔时使用
station_typeSimulator驱动类型名,必须存在同名配置段;官方内置 13 种(Simulator/AcuRite/CC3000/FineOffsetUSB/TE923/Ultimeter/Vantage/WMR100/WMR300/WMR9x8/WS1/WS23xx/WS28xx)
station_url注释态站点主页 URL,注册站 Registry 与 RSS 输出会用到
rain_year_start1雨季年起始月(1-12),硬件支持时从站上下载
week_start6周起始日,0=周一 … 6=周日,影响周报表统计口径

实测(E2,站点信息改动):把默认「北极圣诞老人工坊」改成北京海淀:

location = Beijing Haidian
latitude = 39.9042
longitude = 116.4074
altitude = 44, meter

sudo systemctl restart weewx 后等下一个归档边界,检查报告页:

grep -c 'Beijing Haidian' /var/www/html/weewx/index.html

实测回显:

2

主页标题与页脚两处同步更新为新站名,无需手工清理旧 HTML(Seasons 皮肤每次归档全量重生成)。

⚠️ 高层建筑注意(官方原文提醒):altitude 应填气象主机(压力传感器所在处)的海拔,不是地面海拔——高层楼房两者差异会直接影响气压换算。

5.3 [Simulator]:模拟器驱动段(驱动段的样板)

station_type 指向哪个驱动,就需要哪个同名段。默认安装自带 [Simulator]:

[Simulator]
    loop_interval = 2.5
    mode = simulator
    #start = 2011-01-01T00:00
    driver = weewx.drivers.simulator
参数默认语义
loop_interval2.5LOOP 包间隔秒数(驱动向引擎推送实时数据的节奏)
modesimulatorsimulator=实时模拟(包间休眠);generator=全速生成(压测用)
start注释态generator 模式的起始时间,格式 YYYY-mm-ddTHH:MM,不填用当前时间
driverweewx.drivers.simulatorPython 驱动模块路径

mode = generator 配合 start 可回放历史时段数据,是验证归档与报告链路最省时的组合。

5.4 [StdRESTful]:上传公共气象网络

该段下每个二层子段对应一个上传目标,默认全部关闭(enable = false 或 register_this_station = False),服务启动日志会逐个报 Posting not enabled.:

INFO weewx.restx: StationRegistry: Posting not enabled.
INFO weewx.restx: Wunderground: Posting not enabled.
INFO weewx.restx: PWSweather: Posting not enabled.
INFO weewx.restx: CWOP: Posting not enabled.
INFO weewx.restx: WOW: Posting not enabled.
INFO weewx.restx: WOW-BE: Posting not enabled.
INFO weewx.restx: AWEKAS: Posting not enabled.

七个子段的关键参数:

子段启用开关凭据参数特色参数
[[StationRegistry]]register_this_station = True无(匿名注册)station_url(必填,须 http/https 开头)、description;每天上报一次心跳,一个月不上报自动除名
[[Wunderground]]enable = truestation(如 KORHOODR3)+ password(设备 Key)rapidfire = False(Rapidfire 协议,部分硬件不支持)
[[PWSweather]]enable = truestation + password—
[[CWOP]]enable = truestation(如 CW1234)passcode(仅业余无线电 APRS 站需要)、post_interval
[[WOW]]enable = truestation + password英国气象局观测网
[[WOW-BE]]enable = truestation + password比利时 WOW
[[AWEKAS]]enable = trueusername + passwordlanguage = en、retry_login = 3600、post_interval = 0

通用规律:所有子段都支持 log_success/log_failure 覆盖;post_interval = 0 表示每条归档记录都上报(AWEKAS 默认),设成非零则按秒数节流。凭据口令建议加引号(官方注释反复强调「Use quotes around the password to guard against parsing errors」——密码含 # 或特殊字符时 configobj 会把后半截当注释)。

5.5 [StdReport]:报告生成

[StdReport]
    SKIN_ROOT = skins
    HTML_ROOT = /var/www/html/weewx
    data_binding = wx_binding

    [[SeasonsReport]]
        skin = Seasons
        enable = true
    [[SmartphoneReport]]
        skin = Smartphone
        enable = false
        HTML_ROOT = /var/www/html/weewx/smartphone
    ...
    [[Defaults]]
        lang = en
        unit_system = us

段级参数:

参数默认语义
SKIN_ROOTskins皮肤目录,相对路径基于 WEEWX_ROOT
HTML_ROOT/var/www/html/weewx(DEB)报告输出目录
data_bindingwx_binding报告取数的数据绑定
report_timing未设置类 cron 语法的报告调度;未设置 = 每个归档间隔都跑

官方内置六种「报告」:四个出 HTML/图片的皮肤(SeasonsReport/SmartphoneReport/MobileReport/StandardReport)加两个纯传输报告(FTP/RSYNC)。执行顺序固定「先生成后传输」。每个报告子段可用 enable 开关、可用 lang(en / en_GB / en_GB.utf8 三段式)、unit_system(US/METRIC/METRICWX)覆盖全局。[[Defaults]] 子段的设置作用于所有报告,其下 [[[Units]]][[[[Groups]]]] 可逐单位组细调(如 group_temperature = degree_C),[[[Labels]]][[[[Generic]]]] 改观测项显示名。

实测(E8,HTML_ROOT 换目录 + 权限排障):把 HTML_ROOT 从 /var/www/html/weewx 改为 /var/www/html/weewx-test,重启后报告全部生成失败,journalctl 刷出两类错误:

ERROR weewx.reportengine: ****  Generator terminated

追根有两处:cheetahgenerator 报 FileNotFoundError: [Errno 2] No such file or directory: '/var/www/html/weewx-test/NOAA/NOAA-2026-10.txt.tmp',reportengine 报 PermissionError: [Errno 13] Permission denied: '/var/www/html/weewx-test'——根因是 weewxd 以 weewx 低权用户运行,而 /var/www/html 根目录归 root 所有,新目录既不存在也无写权限。修复:

sudo mkdir -p /var/www/html/weewx-test
sudo chown weewx:weewx /var/www/html/weewx-test
sudo systemctl restart weewx

重启后 journalctl 出现正常生成序列:

Generated 8 files for report SeasonsReport in 0.21 seconds
Generated 60 images for report SeasonsReport in 0.28 seconds
Copied 5 files to /var/www/html/weewx-test

ls /var/www/html/weewx-test | wc -l 实测 71 个文件。结论:换 HTML_ROOT 必须同步 chown weewx:weewx,否则权限错误会淹没在每 5 分钟一次的归档触发里。

5.6 [StdConvert]:入库单位制(一次性决定)

[StdConvert]
    target_unit = US

三选一:US(华氏度/英寸汞柱/英里每小时)、METRICWX(摄氏度/毫米等,降水按气象惯例)、METRIC(公制)。

官方在注释里用全大写反复警告:DO NOT MODIFY THIS VALUE UNLESS YOU KNOW WHAT YOU ARE DOING。原因有两层:

  1. target_unit 只决定数据库里的单位,报告端可用 unit_system 任意切换显示单位——所以「想看公制」不需要动它;
  2. 中途修改会让库里出现 US 与 METRIC 混存的烂数据,官方原话「will result in corrupt data」,唯一解法是导出重建库。

从 wview 迁移的用户必须保持 US(wview 库就是 US 单位)。

5.7 [StdCalibrate]:传感器标定校正

[StdCalibrate]
    [[Corrections]]
        foo = foo + 0.2

[[Corrections]] 下每个键是一个观测类型,值是一个 Python 表达式(可用该记录的其他字段参与运算),结果直接覆盖原值入库。这是修正传感器系统偏差(如温度计偏高 2 度)的正确入口。

实测(E5,校正表达式 + 服务顺序证明):模拟器输出约 32.7°F。先加一个夸张的偏移:

[[Corrections]]
    outTemp = outTemp + 100

重启后下一条归档记录的 outTemp 竟然是 NULL 而不是 132.6:

sqlite3 /var/lib/weewx/weewx.sdb "SELECT datetime(dateTime,'unixepoch'), outTemp FROM archive ORDER BY dateTime DESC LIMIT 2;"

实测回显:

2026-10-30 15:06:00|
2026-10-30 15:05:00|32.7

132.6 超出了 [StdQC] 默认 outTemp = -40, 120, degree_F 的上限,被质量过滤拦下置 NULL。这个「副作用」反向证明了服务链中 StdCalibrate 先于 StdQC 执行(见 5.14 节 process_services 顺序)。把偏移改成合理的 outTemp = outTemp + 20 后,15:07 记录落库 52.7(= 32.7 + 20),校正生效。

5.8 [StdQC]:质量过滤

[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

每行是「最小值, 最大值[, 单位]」三元组,缺单位时用 StdConvert 的库单位。超出区间的观测值被置 NULL 入库。默认区间覆盖八大常用观测项。

实测(E6,收紧上限):把 outTemp = -40, 120, degree_F 改为 outTemp = -40, 30, degree_F,重启后模拟器 32.7°F 附近的数据有部分被拦:

sqlite3 /var/lib/weewx/weewx.sdb "SELECT COUNT(*) FROM archive WHERE outTemp IS NULL;"

实测回显:

1

新落库记录中 outTemp 为 NULL 的条数随超限次数增长,而其余字段(barometer、windSpeed)不受影响——QC 是逐字段拦截,不是整条丢弃。写好 [[Corrections]] 后务必核对 QC 区间是否会把校正值误杀(E5 的教训)。

5.9 [StdWXCalculate]:派生量来源

[StdWXCalculate]
    [[Calculations]]
        pressure = prefer_hardware
        dewpoint = prefer_hardware
        ...

体感温度、露点、风寒、蒸散量等 14 个派生量,每个可独立选值:

取值语义
hardware只信硬件给的值
software只用 WeeWX 软件计算
prefer_hardware硬件有就用硬件,缺了用软件补(默认)

全部 14 项默认 prefer_hardware。廉价站硬件算力弱、公式粗糙,追求一致性可整体改成 software(用 WeeWX 内置气象公式统一计算)。

5.10 [StdTimeSynch]:站钟校时

[StdTimeSynch]
    clock_check = 14400
    max_drift = 5

每 14400 秒(4 小时)检查一次气象主机的硬件时钟,漂移超过 5 秒就校正。只对支持远程校时的硬件(如 Davis Vantage)生效;启动日志中 Clock error is -0.02 seconds (positive is fast) 就是它的工作痕迹。

5.11 [StdArchive]:归档节奏(核心段)

[StdArchive]
    archive_interval = 300
    record_generation = hardware
    loop_hilo = True
    data_binding = wx_binding
参数默认语义
archive_interval300归档间隔秒数,必须能被 60 整除;硬件支持记录器时以硬件为准
archive_delay15归档边界后延迟多少秒取数(给硬件留内部写盘时间)
record_generationhardwarehardware=优先从硬件记录器下载归档记录;software=软件按 LOOP 统计生成为(Simulator 这类无记录器驱动自动走软件生成)
record_augmentationtrue硬件记录生成时尝试用 LOOP 包补充额外观测字段
no_catchupfalsetrue = 启动时不回补硬件记录器里积压的历史数据
loop_hiloTrueLOOP 数据是否参与高低值统计;传感器毛刺多可设 False 只用归档数据
data_bindingwx_binding归档目标数据绑定

实测(E4,300 秒改 60 秒):archive_interval = 300 改为 60,重启后启动日志立即变化:

INFO weewx.archive: Using archive interval of 60 seconds (specified in weewx configuration)

随后连续四条记录的时间戳严格每 60 秒一条:

sqlite3 /var/lib/weewx/weewx.sdb "SELECT datetime(dateTime,'unixepoch') FROM archive ORDER BY dateTime DESC LIMIT 4;"

实测回显:

2026-10-30 15:04:00
2026-10-30 15:03:00
2026-10-30 15:02:00
2026-10-30 15:01:00

日志里 (specified in weewx configuration) 括号说明该值来自配置文件而非硬件——有硬件记录器时这里会变成 (specified by hardware),此时改配置无效,需改硬件或改用 record_generation = software。

5.12 [DataBindings]:数据绑定

[DataBindings]
    [[wx_binding]]
        database = archive_sqlite
        table_name = archive
        manager = weewx.manager.DaySummaryManager
        schema = weewx.schemas.wview_extended.schema

绑定 = 「哪张库 + 哪张表 + 哪个管理器 + 哪套表结构」四元组:

参数默认语义
databasearchive_sqlite指向 [Databases] 段的实例名,换 MySQL 就改这里
table_namearchive归档大平表的表名,一般不改
managerweewx.manager.DaySummaryManager表管理器类,负责维护日汇总表,一般不改
schemaweewx.schemas.wview_extended.schema建库时用的表结构定义(wview 兼容超集),仅建库时生效,之后改它不影响已存在的库

5.13 [Databases] 与 [DatabaseTypes]:数据库定义

[Databases]
    [[archive_sqlite]]
        database_name = weewx.sdb
        database_type = SQLite
    [[archive_mysql]]
        database_name = weewx
        database_type = MySQL

[DatabaseTypes]
    [[SQLite]]
        driver = weedb.sqlite
        SQLITE_ROOT = /var/lib/weewx
    [[MySQL]]
        driver = weedb.mysql
        host = localhost
        user = weewx
        password = weewx

[Databases] 列实例(SQLite 是单文件库,database_name 是文件名,相对路径基于 SQLITE_ROOT;MySQL 是库名),[DatabaseTypes] 列类型默认参数(SQLite 的 timeout=5 秒锁等待、MySQL 的 port=3306/engine=INNODB)。

💡 技术拓展:WeeWX 的存储后端选型——SQLite(单文件、零运维、默认)适合单机个人站,实测库文件初始 512000 字节、常驻内存 15.5 MB 的进程开销下完全够用;MySQL/MariaDB 适合数据量大(多年历史 + 高频归档)、需要远程库或与其他系统共享数据的场景(官方文档单独有 MySQL/MariaDB 章节讲解建库授权)。PostgreSQL 无官方支持但社区有扩展。切换姿势:[DataBindings] 的 database = archive_mysql 一行即可,两套实例定义并存互不干扰。

实测(E7,换库名):把 [[archive_sqlite]] 的 database_name = weewx.sdb 改为 weewx_exp.sdb,重启:

INFO weewx.engine: Using binding 'wx_binding' to database 'weewx_exp.sdb'
INFO weewx.manager: Empty database
ls -l /var/lib/weewx/

实测回显:

-rw-r--r-- 1 weewx weewx 512000 Oct 30 15:03 weewx_exp.sdb

新库从零建表(Empty database + 日志 Created and initialized table 'archive'),旧 weewx.sdb 原样保留——用「换库名」可以低成本做配置/驱动实验,验证完删掉实验库回滚即可。

5.14 [Engine]:服务链(理解的钥匙)

[Engine]
    [[Services]]
        prep_services = weewx.engine.StdTimeSynch
        data_services = ,
        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

七组服务按固定顺序执行:

服务组时机默认成员
prep_services主循环启动前StdTimeSynch(站钟校时)
data_services数据处理前增补(默认空)
process_services逐条处理数据StdConvert → StdCalibrate → StdQC → StdWXCalculate
xtype_services派生类型注册StdWXXTypes/StdPressureCooker/StdRainRater/StdDelta
archive_services落库StdArchive
restful_services落库后上传七个公共气象网上传服务
report_services最后StdPrint(控制台)+ StdReport(报告)

process_services 的排列顺序解释了 E5 的实验现象:StdConvert 先统一单位,StdCalibrate 再做表达式校正,StdQC 最后把关——校正表达式产出的值必须落在 QC 区间内才能入库。写扩展(如自定义过滤服务)时,插进哪一组、组内排第几,直接决定它「看得到什么数据」。

5.15 硬件驱动段:以 [Vantage] 为例

weectl station reconfigure --driver=... 注入的 Davis Vantage 段(节选):

[Vantage]
    type = serial
    port = /dev/ttyUSB0
    host = 1.2.3.4
    baudrate = 19200
    tcp_port = 22222
    tcp_send_delay = 0.5
    loop_request = 1
    iss_id = 1
    timeout = 4
    wait_before_retry = 1.2
    max_tries = 4
    model_type = 2
    driver = weewx.drivers.vantage

type = serial 时用 port(串口路径),type = ethernet 时用 host + tcp_port(WeatherLinkIP 网桥)。其余是串口重试策略与 ISS 传感器站 ID,官方注释明说「rarely needs any attention」。没有真实硬件时切到该驱动,服务会因打不开 /dev/ttyUSB0 反复崩溃(CRITICAL ... SerialException: could not open port /dev/ttyUSB0),评估期保留 Simulator 驱动最稳。

六、生产配置模板

一套可直接套用的北京站点公制模板(场景:单机 Ubuntu 22.04、模拟器先行验证后接真实硬件、公制显示、不上传公网、SQLite 存储;资源占用实测常驻内存 15.5 MB,1 核 512 MB / 2 GB 磁盘余量即可承载多年数据——SQLite 库每年增量在百 MB 量级):

debug = 0
log_success = True
log_failure = True

[Station]
    location = "Beijing Haidian"
    latitude = 39.9042
    longitude = 116.4074
    altitude = 44, meter
    station_type = Simulator          # 接真硬件时用 weectl station reconfigure --driver=... 切换
    rain_year_start = 1
    week_start = 6

[StdReport]
    SKIN_ROOT = skins
    HTML_ROOT = /var/www/html/weewx   # 确认属主 weewx:weewx
    data_binding = wx_binding
    [[SeasonsReport]]
        skin = Seasons
        enable = true
    [[Defaults]]
        lang = en
        unit_system = METRICWX        # 公制显示;只影响报告,不影响库

[StdConvert]
    target_unit = US                  # 装机时定死,永不再改;显示公制靠上一行

[StdCalibrate]
    [[Corrections]]
        # outTemp = outTemp - 0.5     # 传感器偏差校正示例,值须落在 StdQC 区间内

[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

[StdWXCalculate]
    [[Calculations]]
        pressure = prefer_hardware
        # ... 其余 13 项保持 prefer_hardware

[StdArchive]
    archive_interval = 300            # 5 分钟一条,须被 60 整除
    record_generation = hardware
    loop_hilo = True
    data_binding = wx_binding

[DataBindings]
    [[wx_binding]]
        database = archive_sqlite
        table_name = archive
        manager = weewx.manager.DaySummaryManager
        schema = weewx.schemas.wview_extended.schema

[Databases]
    [[archive_sqlite]]
        database_name = weewx.sdb
        database_type = SQLite

[DatabaseTypes]
    [[SQLite]]
        driver = weedb.sqlite
        SQLITE_ROOT = /var/lib/weewx

[Engine]
    [[Services]]
        prep_services = weewx.engine.StdTimeSynch
        data_services = ,
        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

模板要点:target_unit 与 unit_system 解耦(库存 US、显示公制);公网上传段整体省略即等于全部关闭;改动任一参数后 systemctl restart weewx 并核对启动日志自述行。

七、常见问题

Q1:改了配置为什么没生效? WeeWX 只在启动时读一次配置。手工改完必须 sudo systemctl restart weewx,并在 journalctl -u weewx --no-pager | head -30 里核对自述行(如 Using archive interval of 60 seconds)。有硬件记录器时 archive_interval 以硬件为准,改配置无效。

Q2:重启失败,报 configobj.ParseError? 配置缩进或语法错误。报错自带文件名、行号、原文(见 3.2 节实录),按行号修复:段名顶格、子段方括号翻倍、键值对必须有等号和值。修复前服务无法启动。

Q3:报告目录空或 Generator terminated? 九成是 HTML_ROOT 指向的目录不存在或属主不是 weewx。sudo mkdir -p <目录> && sudo chown weewx:weewx <目录> 后重启,见 5.5 节 E8 实录。

Q4:加了大偏移校正后温度变成 NULL? 校正值被 [StdQC] 区间拦截置 NULL(服务顺序 StdCalibrate 先于 StdQC)。把校正量改小或同步放宽 QC 区间,见 5.7/5.8 节 E5/E6 实录。

Q5:想改库里的温度单位为摄氏度? 不要改 target_unit(会混存损坏数据)。库单位在首次建库时定死;改显示单位用 [StdReport]/[[Defaults]] 的 unit_system。已建成 US 库确需换成公制存储,只能用 weectl database transfer 迁移到新库(命令见 《WeeWX 常用 CLI 命令与排障详解》)。

Q6:换了 station_type 启动就崩溃? 新驱动段不存在或硬件不可达。驱动段缺失用 weectl station reconfigure --driver=... 自动注入;无硬件时崩溃是预期行为(串口不存在),切回 --driver=weewx.drivers.simulator 恢复。

Q7:上传服务的密码写法有什么讲究? 加双引号:password = "my#pass"。裸写含 # 或空格的密码会被 configobj 截断,导致认证失败且不易察觉。

八、参考链接