BIOS v2.6 — RepairmanRay Systems
Initializing kernel modules...
Mounting /home/ray .............. OK
Loading personality matrix ...... OK
System ready.
RepairmanRay
Repairman.  Builder.  Nerd.
ray@joplin:~$
scroll

About Me

I'm Ray — based in Joplin, MO. Repairman. Builder. Nerd.

I do apartment maintenance for a living, which mostly means the same things breaking in the same ways. Problem-solving is what I'm actually good at, and building is what I love. I have component-level electronics experience from back when people still got things repaired. Nobody does that anymore, but it turns out that background is a pretty good foundation for what's happening right now: ESP32s, Arduinos, Raspberry Pis, a flood of cheap sensors, and AI tools that mean I can build things I never could have written code for on my own. It's an embarrassment of riches and I'm spending every spare hour taking advantage of it.

I get why people are scared of AI. We don’t have a good track record lately of using technological improvements for the good of the many. But like it or not, the technology is here. The real question is what are we going to do with it? We as a society have a chance to shape things in a positive, as well as profitable direction for all.

My own experience has been astonishing: these tools let me build things I never could have built alone, and I work harder for it, not less. Nobody lost a job so I could do this — something new just got made that didn't exist before. Make the right choices as a society, and everyone gets to share in that kind of improvement without absorbing the downsides.

Location
Joplin, MO
Daily Driver OS
Linux
Current Obsession
ESP32 / LoRa mesh builds
Status
Online ▮

Projects

● Active
maintenance tool · ESP32 · self-calibrating acoustic positioning
Low-Battery Chirp Locator
A smoke detector in the building is chirping. This system pinpoints which unit it's coming from using two wireless mic nodes and radio-synced timing — no walking the hallway, no guessing, no wasted trip.

The problem

In long apartment hallways, one chirp sounds exactly like another no matter where you're standing. Without a system, finding the dead battery means walking 200 feet of corridor and pressing your ear to every unit door — sometimes multiple passes, sometimes needing the tenant home. A 30-minute service call for a $3 battery.

How it works

A coordinator ESP32 broadcasts a radio timing pulse via ESP-NOW every second. Two sensor nodes — mounted at opposite ends of the hallway — each run an INMP441 digital microphone through a tight bandpass filter centered on 3,300 Hz (the NFPA smoke detector chirp frequency). When a chirp arrives, each node records the exact microsecond offset from the nearest coordinator pulse. The coordinator compares those two timestamps: the time difference, combined with the known node spacing, resolves which unit the chirp came from — logged live with unit position, timestamp, and confidence to a dashboard the technician can check from anywhere. No walking required.

Self-ranging — no manual measuring

The two nodes measure their own separation acoustically instead of requiring a tape measure at install time: the coordinator fires a buzzer pulse from one node, times how long its partner takes to hear it, then reverses the shot. The round-trip pair resolves both distance and clock offset. A boot-time and periodic (6-hour) auto-recalibration keeps the system accurate even if a node gets bumped or repositioned, with an outlier-rejecting median-of-several-shots average smoothing out single-measurement noise.

Why the filter matters

HVAC noise, footsteps, voices, and slamming doors all compete with a 50 ms chirp. A biquad bandpass filter with Q=4 tuned to 3,150–3,500 Hz passes the chirp and rejects nearly everything else, making reliable detection possible in a working building.

Superhearing mode

When one node picks up a candidate chirp, it immediately broadcasts a prime signal to its partner via ESP-NOW. That node drops into high-sensitivity mode — tightened filter, lower detection threshold — ready for the next event. Low-battery chirps repeat on a fixed interval (typically every 30–60 seconds) and never stop, so the system learns exactly when to expect the next one, and confidence compounds with every confirmed pass.

Field results

Deployed at real hallway distance (10–14 m node spacing, self-measured via the ranging system above) with 81 confirmed alarms fired live during testing and development. An initial bench test (37 chirp events, controlled conditions) measured ±2.5 ft positioning accuracy; ongoing field work is refining that further — including ruling out a firmware sensitivity regression found via git archaeology, and a from-scratch waveform cross-correlation mode (in development) that resolves timing directly from the recorded chirp shape instead of a simple threshold crossing, to cut out amplitude-dependent jitter in the final few milliseconds of precision.

hardwareHeltec ESP32 · INMP441 I2S · 3-board arch
methodTDOA · ESP-NOW RF marker · µs timestamps
target3,150–3,500 Hz · biquad bandpass Q=4
rangingself-calibrating · acoustic two-shot · auto-recal every 6h
accuracy±2.5 ft bench baseline · field-refinement in progress
serverself-hosted · live dashboard · OTA
ESP32 INMP441 I2S ESP-NOW TDOA Signal Processing C++ Python OTA
● Active
security · scan-traffic · self-hosted
Who's Knocking
Every public IP on the internet gets scanned constantly — WordPress exploit probes, leaked .env/.git credential hunts, router-botnet RCE checks, none of it targeted, all of it automated. This server was already classifying each request's source IP as residential vs. datacenter for its own logs; this panel just makes that visible instead of letting it rot in a log file that rotates out after a few days.
classificationipinfo.io org lookup · cached per /24
categorieswordpress · secrets · router-exploit · recon
serverCT 100 · Python · SQLite
last knock
→ open live dashboard
Python SQLite ipinfo.io
● Active
homelab
Beelink Proxmox Node
The hardware everything runs on. A Beelink Mini PC running Proxmox VE — webserver, Pi-hole, and Home Assistant all live here. No cloud, no rent, no monthly bill.
hostBeelink Mini PC
hypervisorProxmox VE
containersCT 100 webserver · CT 101 Pi-hole
vmVM 102 Home Assistant
egressCloudflare Tunnel · no open ports
Proxmox VE LXC Debian 13
◌ In Progress
home automation
Smart Home Stack
Home Assistant is up and running — locally hosted, no cloud account, no subscription. The foundation is solid. Zigbee, MQTT, and automations are next; this is the part of the stack that's actively being built out rather than just maintained.
platformHome Assistant OS · VM 102
hostinglocal-only · no cloud account
nextZigbee · MQTT · automations
Home Assistant HAOS Pi-hole local-first
● Active
networking
Pi-hole DNS
Network-wide ad blocking and DNS filtering for the whole home — LAN and IoT. The OpenWrt router pushes Pi-hole as the DNS server to every device on the network. 92,000+ domains blocked, no per-device configuration needed.
versionPi-hole v6
hostLXC CT 101 · Proxmox
scopeLAN + IoT · network-wide
domains blocked92,000+
routerOpenWrt · DHCP pushes Pi-hole
Pi-hole v6 LXC DNS OpenWrt
● Active
self-hosted · web
RepairmanRay.com
A personal site served from a home server over a Cloudflare Tunnel — no hosting provider, no managed platform. The terminal aesthetic fits the stack: plain HTML/CSS/JS, a Python HTTP server, and a self-hosted pipeline that gets the job done without a cloud bill.
serverCT 100 · Python HTTP
tunnelCloudflare · no open ports
stackHTML · CSS · JS
hosting cost$0
HTML CSS JS Python Cloudflare Tunnel
◌ In Progress
electronics · LoRa
LoRa Alarm Mesh
A LoRa mesh network for monitoring doors and passageways across an apartment complex — magnetic switches, PIR motion detectors, and temperature sensors feeding back through a network of nodes and repeaters. Alert outputs via piezo buzzers. No WiFi, no cloud, no subscriptions — the mesh handles its own routing within radio range. Off-grid capable by design.
mcuHeltec ESP32 LoRa V3
radioLoRa 915MHz · mesh
sensorsreed switches · PIR · temperature
alertspiezo · local, no cloud
poweroff-grid capable
ESP32 LoRa Reed Switches PIR C++
◑ Prototype
electronics
Outdoor Firepit Weather Interlock Controller
A WiFi-connected relay controller built on an ESP32. Fetches live wind speed and temperature from OpenWeatherMap, enforces user-defined operating hours via NTP scheduling, and controls a relay with fail-safe logic — if WiFi drops, data goes stale, or conditions exceed limits, the relay locks out. Configured through a built-in web dashboard with auto-refresh. Settings persist across reboots via ESP32 NVS. Field deployment would require hardened relay switching and proper web authentication.
mcuESP32-WROOM-32
weather apiOpenWeatherMap · wind + temp
schedulingNTP · user-defined hours
fail-saferelay locks on WiFi loss / stale data
configbuilt-in web dashboard · NVS
ESP32 Arduino OpenWeatherMap Relay
◇ Concept
smartthings · iot
AC Freeze Monitor
Set Point 72°F
Current 79°F
Runtime 47min

$Monitors HVAC units via SmartThings API and personal access tokens. If a unit runs too long without the room temperature meaningfully dropping toward the set point, a fault is raised — the classic signature of a frozen evaporator coil killing airflow while the compressor keeps grinding.

// known constraints

Samsung controls the token lifecycle, and it's gotten stricter: personal access tokens issued after December 2024 now expire in 24 hours, so anything meant to run unattended needs a full OAuth2.0 flow instead of a PAT. Starting October 2026, Samsung is also ending free API access — non-commercial developers get a grace period through Q3, then a $4.99/month "Personal Plan" becomes the price of admission, a change big enough that even Home Assistant is scrambling to figure out how it affects their SmartThings integration. On top of that, there's still no true polling model: sensor data lives behind Samsung's cloud, so you're dependent on their infrastructure and now their billing. A SmartThings outage — or an unpaid invoice — is silently also your monitoring outage. You're always a guest in their ecosystem, and soon a paying one.

apiSmartThings · personal access tokens
detectionruntime vs. temp delta toward setpoint
token lifespan24h (PAT) · OAuth2.0 for production
api costfree through Q3 2026 → $4.99/mo (Oct 2026)
languagePython
Python SmartThings API HVAC IoT
◇ Concept
electronics · power quality
Utility Voltage Monitor
A mains voltage monitor built around the ZMPT101B sensor and an ADS1115 16-bit ADC feeding an ESP32. Samples the 60Hz waveform at 860 SPS, computes true RMS, and raises alerts on sags below 105V or overvoltage above 126V. Events publish to MQTT — timestamps, duration, and min/max voltage — and feed into Home Assistant. Designed to catch the kind of slow sags that don't trip breakers but do kill compressors.
sensorZMPT101B (isolated)
adcADS1115 · 16-bit · I²C
mcuESP32-WROOM-32
sag threshold< 105V RMS
overvoltage threshold> 126V RMS
reportingMQTT → Home Assistant
ESP32 ZMPT101B ADS1115 MQTT true-RMS C++

Contact

Got a project, a question, or something broken that needs a second opinion? Send a packet my way.