Current Temperature Switch to °F
—
°C
Temperature (8h)
Loading...
Dashed lines show the last known reading from a sensor that is offline.
Current Humidity
—
%
Humidity (8h)
Loading...
Dashed lines show the last known reading from a sensor that is offline.
GPS Track (72h)
Location Trail
Live Events
borkbus / SQS event stream will land here once the camper agent is publishing.
Contact
See the camper in the wild? Say hello.
Send a messageChangelog
2026-10-02
- Fixed YoLink sensors (the Electrical Closet, Battery and Outside sensors especially) flipping between online and offline roughly every hour. A quiet YoLink sensor only reports about once an hour, and the dashboard and alerts called a sensor offline after 45 minutes of silence, so a perfectly healthy one looked offline for about 15 minutes of each hour. The cutoff is now 70 minutes, which clears the hourly check-in while still catching a truly silent sensor. The dashboard, the offline chart lines, the "has not reported" alert and the camper-status tool all use the same cutoff (the camper-status tool had been using 30 minutes).
- Sensors now carry
location(interior or exterior) androom(main, bedroom, bathroom) labels in the metrics store, so a query can pick out, say, every interior sensor at once. Camper Interior is interior/main, Bedroom is interior/bedroom, and the Electrical Closet (an outside storage closet), the Battery box and the Outside sensor are exterior. There is no visible change on the dashboard. Placement is set by one config line,SENSOR_PLACEMENT, next to the Govee sensor list.
2026-09-30
- Hid the two Battery Voltage panels (the current reading and the chart) from the dashboard. There are no battery voltage readings to show until the camper's battery monitor hardware is upgraded. The data endpoints are untouched, so the panels can be switched back on later.
- No visible change: internal cleanup of the code that draws each sensor's colored dot in the Current Temperature and Current Humidity lists, so both now share one copy (and one check that only valid colors are ever used).
- Fixed the humidity chart showing an offline sensor as if it were still reporting. A sensor that has stopped reporting (for example the Battery sensor) drew a flat line at its last humidity reading, looking current, while the temperature chart correctly showed it as a dashed, dimmed "(offline)" line. The humidity chart now does the same as temperature: a dashed, dimmed line in the sensor's own color for the stretch where it was offline, with the same caption underneath.
- Renamed the Govee Bluetooth sensor from "Outdoor" to "Bedroom" (it had been named by mistake). Its readings keep flowing without interruption, but the dashboard charts treat a renamed sensor as a new line, so the chart history from before the rename stays under the old "Outdoor" name.
- Every sensor now has one color that is used everywhere on the dashboard. Previously the temperature chart, the humidity chart, and the per-sensor lists each picked colors on their own (the lists had none), so the same sensor could be orange in one place and blue in another, and colors shifted as sensors came and went. Now the charts and a small colored dot beside each sensor's name in the Current Temperature and Current Humidity lists (including the main sensor's name) all agree, and a sensor keeps its color when others are added or removed. The colors were chosen by measuring how different they look — including for people with red-green and blue-yellow color blindness — so lines are easy to tell apart (the closest pair is now about twice as distinguishable as before in the worst case). The Bedroom sensor keeps the color it had when it was named Outdoor, so its earlier chart history looks like the same line.
- Fixed the Govee sensor scanner not starting on the hub after its first update: the sensor software ran as a user the hub's Bluetooth service refused to talk to. It now runs as the standard unprivileged
nobodyuser, which the hub accepts, while still being unable to do anything beyond scanning for sensors. - Fixed the sensor software failing to update on the hub: the last two updates never went live (the new version couldn't start because the old one was still holding its metrics port). Updates now stop the old version first, so there is a brief gap of a few seconds in metrics at each update. Until this ships, the Govee sensor support from earlier today is not running on the hub.
- Under the hood, the hub's Bluetooth sensor scanner is more robust and easier to diagnose: it now counts the sensor broadcasts it has to discard (and why), remembers each sensor's model so a broadcast that omits it is still understood, and if it ever crashes unexpectedly it retries with growing delays instead of hammering every second.
- Govee Bluetooth temperature/humidity sensors now show up on the dashboard alongside the YoLink ones. The hub listens for their Bluetooth broadcasts directly (no pairing, no Govee account), so they keep working when the camper is offline. Each registered Govee sensor appears in the temperature and humidity charts and in the per-sensor lists, with its battery percentage next to its reading (red when low, under 15%), and it is marked "offline" if it hasn't been heard from for 10 minutes — much sooner than the 45 minutes YoLink sensors get, since Govee sensors broadcast every couple of seconds.
- New alerts for Govee sensors: silent for 10+ minutes (critical), never heard at all (critical), battery under 15% for an hour (warning), and the hub's Bluetooth scanner being down (warning). The camper-status tool now also reports the Govee sensors' readings.
- Govee sensors nearby that haven't been registered (a new sensor, or a neighbor's) are recorded in the metrics store so a new sensor's address can be found there, but never appear on the dashboard or trigger alerts. Adding a sensor is one config change: see the puptent README.
- The Bluetooth radio on the hub is now unblocked and powered on at every boot by the hub's provisioning, so sensor readings resume on their own after a power cut.
- A Govee sensor that is set up but has never been heard since the hub's software last restarted (dead battery, out of range) is no longer silently missing: it shows as "⚠ no reading" in the temperature and humidity lists and in the camper-status tool, and a critical alert names it after 10 minutes. Previously a dead sensor could vanish after a restart while another sensor kept reporting.
- The sensor software on the hub now runs as a non-root user. It needs access to the hub's Bluetooth service, and as root that access would have been far broader than necessary.
2026-09-28
- The header timestamp used to be the page's load time (it said "updated X ago" regardless of the data). It now shows when the main sensor last reported ("Camper Interior reported 2 min ago"), turns red with a ⚠ if that sensor isn't reporting reliably, and has an ⓘ tooltip explaining what it means.
- The Current Temperature and Current Humidity widgets now label the big number with its sensor name (Camper Interior), and the per-sensor list below no longer repeats that sensor — it only lists the others.
- The Current Humidity widget now works like Current Temperature: the big number is the Camper Interior sensor's own reading (not an average), it shows "—" with a stale warning if Camper Interior goes offline, and other offline sensors are flagged "⚠ offline" (number hidden) in the per-sensor list only.
- Added a time window selector (1h / 8h / 24h / 72h) at the top of the dashboard that sets the range for the temperature, humidity and battery voltage charts together. It defaults to 8h; the choice lives in the URL (
?range=), so it resets to 8h when you land on the page fresh. The GPS track still shows 72h. - The big Current Temperature number is now the Camper Interior sensor's own reading (the one that reflects what the animals experience) instead of an average of all sensors. If Camper Interior goes offline the number shows "—" with a stale warning rather than falling back to another sensor; the per-sensor list below still shows every sensor.
- Fixed the temperature chart tooltip listing a sensor as both online and "(offline)" at the moment it dropped out. The dashed offline line starts at the last real reading so the two lines join, which made both series report a value at that timestamp; the tooltip now shows only the live entry there.
2026-09-27
- Safety fix: temperature/humidity readings could look perpetually current even from a dead sensor. YoLink sensor values never expire once received, and the dashboard/API were using the wrong timestamp (query time, not report time) to show "last updated." The bridge now polls YoLink's own authoritative online/offline status for each sensor independently of its MQTT feed; the dashboard shows a loud, impossible-to-miss warning (not a subtle gray-out) when a reading is stale or a sensor is reported offline, and a new alert pages when a sensor goes dark for 5+ minutes.
- Fixed the temperature dashboard and camper-status MCP tool showing no data after the edge-hub migration: both hardcoded
device_name="Temp Humidity Sensor", a device name specific to the old camphq-connected YoLink hub. The new hub reports three different devices (Battery, Camper Electrical Closet, Camper Interior), none of which matched. The dashboard chart now shows all reporting devices instead of filtering to one hardcoded name; the MCP tool's single-value "indoor temperature" reading now targets "Camper Interior" specifically.
2026-09-26
- Migrated the YoLink temperature bridge off camphq (macOS) to a new always-on edge hub (Raspberry Pi Zero 2 W, Debian 13 trixie). Deploy target is now
edge.tail9b1fe.ts.net; the deploy image cross-builds for arm64 remotely on mothman. Vector and node_exporter now run on the edge hub via a new Ansible playbook (infra/ansible/puptent/edge.yml), with read-only-root, hardware watchdog, and several memory-headroom optimizations for the Pi's 512MB budget. No dashboard changes — temperature data flows through the same self-hosted VictoriaMetrics pipeline as before.
2026-06-27
- Added GPS Track (72h) panel: queries
gps_latitude_degreesandgps_longitude_degreesfrom VictoriaMetrics, zips by timestamp into a 72-hour position track, and renders it as a Leaflet polyline above the manual Location Trail. Current position shown as a green marker with timestamp popup. Auto-refreshes every 60s. Shows an empty state when GPS has no fix or data.
2026-06-05
- Added visitor contact form at
/contact. Anyone who sees the camper sticker can visit the site and send a message. Owner receives an email at buddy@furrycoc.com with the message, visitor name (if provided), and reply-to address (if provided). Honeypot field prevents bot submissions. Dashboard homepage now links to the form.
2026-05-20
- Added gps-bridge: USB GPS receiver → Prometheus metrics bridge. Reads from gpsd and exposes
gps_fix_mode,gps_latitude_degrees,gps_longitude_degrees,gps_altitude_meters,gps_speed_mps, andgps_heading_degreeson:9140. Scraped by Vector and shipped to Grafana Cloud. New GPS private dashboard in Grafana. Ansible role provisions gpsd + gps-bridge as launchd services on CampHQ. - Fixed deploys to CampHQ: added
/usr/local/binto~/.zshenvvia Ansible so Kamal can find Docker in non-interactive SSH sessions (OrbStack on macOS Apple Silicon).
2026-05-16
- Added Location Trail: a token-guarded check-in form at
/checkin?k=<token>captures GPS coordinates via the browser Geolocation API and saves them to thepuptent_locationstable. - Added
/locations.jsonpublic endpoint returning the full trail (ordered oldest → newest) plus the current (latest) location. - Added Location Trail map panel to the dashboard — renders a Leaflet polyline and circle markers, highlights the current position in green, shows name/note/time popups, and auto-refreshes every 30s.
2026-04-30
- Current temperature/humidity panels now dedupe sensors across deploys (the dashboard was listing the same sensor twice when overlapping series remained in Prometheus).
- Removed the in-deploy Prometheus accessory; metrics now flow through Vector running natively on the camper host (configured by
infra/ansible/puptent). Puptent's:9110metrics endpoint is now published on127.0.0.1for Vector to scrape. - Added
CLAUDE.mdwith the rule that every PR must include a changelog entry. - Migrated from mothman to camper server.
- Sensors that report under multiple device names are now deduplicated in the readout tiles.
2026-04-21
- Added live temperature and humidity readout tiles with a °C/°F toggle.
- Big-number readouts round to whole numbers; chart tooltips round to one decimal.
2026-04-18
- Chart series are labeled by metric type (temperature, humidity) instead of device name.
2026-04-17
- Default dashboard window expanded to 72 hours of history.
- Sensor series aggregated by device name to collapse duplicate lines on charts.
- Hub uplink status is now polled every 5 minutes and surfaced as the header status pill.
2026-04-14
- Initial release: YoLink → Prometheus bridge with Grafana Cloud remote-write.
- Replaced the embedded Grafana iframe with native Chartkick line charts on the dashboard.
- Shipped via Kamal with a Prometheus accessory; encrypted deploy secrets via SOPS.
2026-04-12
- Stood up the
puptent.noawoo.comnamespace and the public Grafana camper dashboard.