Whoops, I left the most important one out...
*/Users/Username/weewx/weewx-data/bin/user/temp_fallback.py:*
import weewx
import weedb
from weewx.engine import StdService
class TempFallback(StdService):
def __init__(self, engine, config_dict):
super(TempFallback, self).__init__(engine, config_dict)
self.bind(weewx.NEW_LOOP_PACKET, self.new_loop_packet)
def new_loop_packet(self, event):
packet = event.packet
# If primary outTemp is missing/None, but extraTemp1 has data, use
it as fallback
if packet.get('outTemp') is None and packet.get('extraTemp1') is
not None:
packet['outTemp'] = packet['extraTemp1']
On Wednesday, September 9, 2026 at 12:12:07 PM UTC TheButterZone wrote:
> Unfortunately I could only proof of concept this to myself on
> Wunderground+APRS CWOP - turns out there is no place, no inexpensive way,
> that I can put the sensors around my home where they won't delta out of QC
> with neighboring stations for hours every day. Now they're inside 2
> refrigerators being received on their base stations & decoded by rtl_433.
>
> /*Users/Username/weewx/weewx-data/weewx.conf:*
> station_type = SDR *(instead of simulator)*
>
> [SDR]
> driver = user.sdr
> cmd = /usr/local/bin/rtl_433 -M utc -F json -f 433.92M -s 1024k -g 42.1
> [[sensor_map]]
> outTemp = temperature.0C23.AcuriteTowerPacketV2
> outHumidity = humidity.0C23.AcuriteTowerPacketV2
> extraTemp1 = temperature.112.LaCrosseTXPacket
>
> process_services = weewx.engine.StdConvert, weewx.engine.StdCalibrate,
> *user.temp_fallback.TempFallback*, weewx.engine.StdQC,
> weewx.wxservices.StdWXCalculate
>
> *weewx-data/bin/user/sdr.py (from https://github.com/matthewwall/weewx-sdr
> <https://github.com/matthewwall/weewx-sdr>):*
> IDENTIFIER = "LaCrosse-TX" *(instead of IDENTIFIER = "LaCrosse TX
> Sensor" which was out of date)*
>
> */Users/Username/weewx/weewx-venv/bin/weewxd-rebind:*
> #!/usr/bin/env python3
> import subprocess
> import json
> import re
> import os
>
> CONF_PATH = "/Users/Username/weewx/weewx-data/weewx.conf"
> WEEWXD_PATH = "/Users/Username/weewx/weewx-venv/bin/weewxd"
> RTL_CMD = [
> "/usr/local/bin/rtl_433",
> "-M", "utc",
> "-F", "json",
> "-f", "433.92M",
> "-s", "1024k",
> "-g", "42.1"
> ]
>
> def get_lacrosse_id():
> print("Sniffing SDR stream for active LaCrosse sensor ID...")
> proc = subprocess.Popen(RTL_CMD, stdout=subprocess.PIPE,
> stderr=subprocess.DEVNULL, text=True)
> try:
> stdout, _ = proc.communicate(timeout=10)
> except subprocess.TimeoutExpired:
> proc.terminate()
> stdout, _ = proc.communicate()
>
> for line in stdout.splitlines():
> if not line.strip():
> continue
> try:
> data = json.loads(line)
> model = data.get("model", "")
> if "LaCrosse" in model and "id" in data:
> sensor_id = str(data["id"])
> print(f"Detected LaCrosse sensor ID: {sensor_id}")
> return sensor_id
> except json.JSONDecodeError:
> continue
> return None
>
> def update_weewx_conf(new_id):
> if not os.path.exists(CONF_PATH):
> print(f"Config file not found at {CONF_PATH}")
> return
>
> with open(CONF_PATH, "r") as f:
> content = f.read()
>
> pattern =
> r"(extraTemp1\s*=\s*temperature\.)([^.]+)(\.LaCrosseTXPacket)"
> match = re.search(pattern, content)
>
> if match:
> old_id = match.group(2)
> if old_id == new_id:
> print(f"LaCrosse ID {new_id} is already up to date in
> weewx.conf.")
> return
>
> new_content = re.sub(pattern, rf"\g<1>{new_id}\g<3>", content)
> with open(CONF_PATH, "w") as f:
> f.write(new_content)
> print(f"Updated weewx.conf: swapped ID '{old_id}' -> '{new_id}'.")
> else:
> print("Warning: Could not find 'extraTemp1 =
> temperature.[id].LaCrosseTXPacket' pattern in weewx.conf.")
>
> if __name__ == "__main__":
> sensor_id = get_lacrosse_id()
> if sensor_id:
> update_weewx_conf(sensor_id)
> else:
> print("Warning: LaCrosse sensor ID not detected within timeout;
> launching with existing configuration.")
>
> os.execvp(WEEWXD_PATH, [WEEWXD_PATH, CONF_PATH])
>
> *Library/LaunchAgents/com.weewx.plist:*
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "
> http://www.apple.com/DTDs/PropertyList-1.0.dtd">
> <plist version="1.0">
> <dict>
> <key>Label</key>
> <string>com.weewx</string>
> <key>ProgramArguments</key>
> <array>
> <string>/Users/Username/weewx/weewx-venv/bin/weewxd-rebind</string>
> <string>/Users/Username/weewx/weewx-data/weewx.conf</string>
> </array>
> <key>RunAtLoad</key>
> <true/>
> <key>KeepAlive</key>
> <true/>
> <key>StandardOutPath</key>
> <string>/Users/Username/weewx/weewx-data/weewx.log</string>
> <key>StandardErrorPath</key>
> <string>/Users/Username/weewx/weewx-data/weewx.log</string>
> </dict>
> </plist>
>
>
>
--
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/ed2ec103-632e-4072-85f2-1f7c38002eb7n%40googlegroups.com.