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 try to stay engaged with what's happening in my community too — because communities are systems, and systems don't fix themselves. Yet.

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

Projects

● Active
rf · self-hosted
RF Spectrum Observatory
An RTL-SDR dongle on the home server continuously sweeps 88–1300 MHz every 5 minutes, averaging multiple hardware passes for a clean noise floor. Signal strength across FM broadcast, aviation, weather satellite, amateur radio, ISM, and ADS-B bands is recorded in SQLite — full resolution for 24 hours, hourly averages beyond that. A canvas-based spectrogram viewer renders a color-graded waterfall: frequency on X, time on Y, dark green to yellow as power climbs.
hardwareRTL-SDR · RTL2838 · R820T tuner
range88–1300 MHz · ~175 kHz bins
interval5 min · 5 min integration average
serverCT 100 · Flask · SQLite
last sweep
→ open spectrogram
RTL-SDR Python Flask SQLite Canvas API
● 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 — personal access tokens expire on their schedule, requiring periodic manual re-auth with no programmatic renewal path. More critically, there's no true polling model: sensor data lives behind Samsung's cloud, so you're dependent on their infrastructure availability and whatever latency they introduce. A SmartThings outage is silently also your monitoring outage. You're always a guest in their ecosystem.

apiSmartThings · personal access tokens
detectionruntime vs. temp delta toward setpoint
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.