Files
smokescreen/config.example.yaml
steveandClaude Opus 5 ba0c3b58b6 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]>
2026-08-16 22:46:14 -04:00

62 lines
2.4 KiB
YAML

# 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