Initial commit: PT1000 probe emulation bridge
Feeds third-party BBQ probes into a pellet grill's wired probe jacks by presenting the resistance a real PT1000 RTD would show at that temperature. The grill sees an ordinary wired probe, so its display, app, target-temp alarms and Keep Warm all work with no protocol reversing involved. Pluggable probe sources: ThermoWorks RFX (via ThermoWorks Cloud), MEATER (community-derived BLE decode), a synthetic simulator for hardware-free development, and a Combustion stub. Two safety invariants are load-bearing: - Stale, missing or implausible readings drive the channel cold, never hot. A stuck-hot channel could convince the grill a cook finished early. - Unimplemented sources raise rather than returning plausible numbers, since the grill acts on these values. Cloud sources are dated by the cloud's own timestamp rather than by fetch time, because ThermoWorks serves a dead probe's last value with a fresh 200. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
# Copy to config.yaml and edit.
|
||||
#
|
||||
# Start with the simulator source and --dry-run to exercise the pipeline with
|
||||
# no hardware at all, then swap in real sources once probes are talking.
|
||||
#
|
||||
# Find your probe ids with: smokescreen discover
|
||||
|
||||
update_interval_s: 2.0 # how often the jacks are re-driven
|
||||
i2c_bus: 1 # /dev/i2c-1 on a Raspberry Pi
|
||||
log_level: INFO
|
||||
|
||||
sources:
|
||||
# Synthetic cook curve. Safe to leave in while developing; remove for real cooks.
|
||||
- type: simulator
|
||||
probe_count: 2
|
||||
speed: 60 # 60x realtime, so a brisket runs in minutes
|
||||
|
||||
# ThermoWorks RFX, via ThermoWorks Cloud (there is no local gateway API).
|
||||
# Needs: pip install '.[thermoworks]'
|
||||
# Credentials come from THERMOWORKS_EMAIL / THERMOWORKS_PASSWORD in the
|
||||
# environment. Prefer that over putting them here — config.yaml is gitignored,
|
||||
# but it is still one `git add -f` away from being committed.
|
||||
# - type: thermoworks
|
||||
# poll_interval_s: 60 # 60s is what works in practice; faster just burns
|
||||
# # requests against an unofficial API
|
||||
# max_cloud_age_s: 300 # drop cloud values older than this, since the API
|
||||
# # serves a dead probe's last value with a 200
|
||||
|
||||
# MEATER / MEATER 2. Remember the probe accepts only ONE BLE connection --
|
||||
# the Pi cannot read it while your phone or the Block is connected.
|
||||
# Needs: pip install '.[ble]'
|
||||
# - type: meater
|
||||
# display_name: "Brisket point"
|
||||
# address: null # null = scan and take the first probe found
|
||||
|
||||
# Not implemented yet -- see the module docstring for what it needs.
|
||||
# - type: combustion
|
||||
|
||||
jacks:
|
||||
1:
|
||||
# Pin a specific probe here once you know its id. With more probes than
|
||||
# jacks (4 RFX probes, 2 jacks) pinning is how you choose which two matter.
|
||||
# Omit to auto-assign the first probe seen.
|
||||
# probe_id: "thermoworks:RFX123456:1"
|
||||
i2c_address: 0x2f
|
||||
# Must comfortably exceed your slowest source's poll interval, or the jack
|
||||
# flaps cold between polls. Rule of thumb: 3x. For 60s cloud polling use
|
||||
# 180s+; for BLE sources 30s is fine.
|
||||
stale_after_s: 180
|
||||
# Replace with output from: smokescreen calibrate ...
|
||||
calibration:
|
||||
r_offset_ohms: 1000.0
|
||||
step_ohms: 1.0
|
||||
|
||||
2:
|
||||
# probe_id: "thermoworks:RFX654321:1"
|
||||
i2c_address: 0x2c # second rheostat MUST be strapped to a different address
|
||||
stale_after_s: 180
|
||||
calibration:
|
||||
r_offset_ohms: 1000.0
|
||||
step_ohms: 1.0
|
||||
Reference in New Issue
Block a user