Bedside hardware companion for the Olumide OpenClaw plugin.
Olumide is a self-hosted chronic-disease companion you message from WhatsApp, Telegram, or any channel your OpenClaw gateway supports. This repository contains the Arduino firmware that turns an Arduino Uno into the optional bedside device - a low-friction physical layer for medication adherence and daily check-ins.
Olumide is an open-source personal-health tool, not a medical device. It does not diagnose, prescribe, or replace clinical care. See
docs/SAFETY.md.
Plugged into the laptop or home server running your OpenClaw gateway, the device:
- Logs medication doses - tap an RFID-tagged pill bottle on the reader and the dose is logged into your Olumide logbook.
- Surfaces reminders - the LCD shows your next dose and the RGB LED ambient-codes your day (green = on track, yellow = something due, red = attention).
- Triggers a check-in - short-press the button to tell Olumide "I need you"; it opens a session in your default chat channel.
- Triggers a panic event - long-press the button (>3s) to fire a crisis hook; Olumide notifies your designated circle.
- Tracks ambient conditions - DHT11 reports room temp/humidity (medication storage); photoresistor dims the LEDs at night.
- Survives gateway downtime - the DS1302 RTC keeps accurate time and the device can hold up to 24 hours of pre-loaded reminders if the USB or gateway drops.
Everything else lives in the gateway. The firmware itself is small and boring on purpose.
olumide-firmware/
├── README.md # you are here
├── LICENSE # MIT
├── firmware/
│ └── olumide_firmware.ino # the sketch
├── docs/
│ ├── WIRING.md # pin map + breadboard guide
│ ├── PROTOCOL.md # JSON line protocol over USB serial
│ ├── BUILD.md # build, flash, and verify
│ ├── SAFETY.md # scope and disclaimers
│ └── TROUBLESHOOTING.md # common problems
├── examples/
│ ├── tag_writer.ino # one-off sketch to write tag IDs to RFID cards
│ └── protocol_demo.py # talk to the device from a host script
└── assets/
└── wiring.txt # ASCII wiring diagram
- Wire the board - see
docs/WIRING.md. - Install Arduino libraries - see
docs/BUILD.md. - Flash the firmware - open
firmware/olumide_firmware.inoin Arduino IDE, select your Uno + serial port, click Upload. - Tag your pill bottles - run
examples/tag_writer.inoonce per bottle; stick the RFID tag on it; record the tag ID in your Olumide profile (profile.yaml). - Connect to the gateway - install the Olumide plugin and point it at the device's serial port. The gateway will auto-detect the device on the next handshake.
That's it. Tap a tagged bottle on the reader and watch the dose appear in your logbook.
The standard Arduino "Uno R3 Super Starter Kit" covers everything. Specifically:
| Component | Purpose |
|---|---|
| Arduino Uno (or CH340G clone) | Microcontroller |
| 830-tie breadboard + jumper wires | Wiring |
| Push button | Check-in / panic |
| RC522 RFID module + tags/cards | Dose logging |
| 1602 LCD (I2C backpack recommended) | Status display |
| Active buzzer | Reminder beeps |
| Passive buzzer | Escalation tones |
| RGB LED module | Ambient status |
| DHT11 | Room temp / humidity |
| DS1302 RTC + CR2032 cell | Offline-accurate clock |
| Photoresistor (5528) | Night dimming |
| Resistors: 220Ω, 1KΩ, 10KΩ | Pull-ups + LED current-limit |
Optional but recommended: an I2C backpack on the 1602 LCD frees up six digital pins. The wiring docs assume one.
- Arduino IDE 2.x (or
arduino-cli) - Libraries (install via Library Manager - exact names in
docs/BUILD.md):MFRC522- RC522 RFIDLiquidCrystal_I2C- 1602 over I2CDHT sensor library(Adafruit) - DHT11Rtc by Makuna- DS1302 RTCArduinoJson- line protocol parsing
- A laptop or home server running OpenClaw with the Olumide plugin installed. The plugin opens the device's USB serial port and bridges it to the gateway.
The firmware speaks a tiny line-delimited JSON protocol over USB serial at 115200 baud. The Olumide plugin opens the port, reads events, and sends commands.
A taste:
// device → host (events)
{"t":"EVT","e":"BTN_SHORT","ts":1745000000}
{"t":"EVT","e":"RFID","tag":"AMLO_5MG","ts":1745000100}
{"t":"TELE","temp":28.4,"hum":62,"lux":412,"ts":1745000060}
// host → device (commands)
{"t":"CMD","id":"c1","c":"REMIND","label":"Amlodipine 5mg","color":"GREEN","beep":"SHORT"}
{"t":"CMD","id":"c2","c":"LCD","l1":"Next: 20:00","l2":"Metformin 1g"}
{"t":"CMD","id":"c3","c":"ALERT","reason":"HYPO"}
Full spec: docs/PROTOCOL.md.
This device sees:
- Which RFID tag was tapped, and when.
- Button presses.
- Room temperature, humidity, light level.
It does not see medication names, patient identity, or anything else - those live in the gateway's plugin config. Tags are opaque IDs (e.g. AMLO_5MG); the device cannot map them back to a drug. Cut the USB cable and the device is just a beeping breadboard.
Pre-1.0. Useful as-is for one person; expect rough edges. Issues and PRs welcome.
MIT - see LICENSE.
