Turn your Commodore 64 into a fully functional Home Assistant control interface.
Not just a dashboard — HomeTo64 lets you control lights, switches, locks, fans, covers and more directly from the C64 keyboard, while displaying live sensor data from your smart home in real time.

What is HomeTo64?
HomeTo64 is a Home Assistant custom integration that brings your smart home to a Commodore 64 (or C128) via the Ultimate 64 FPGA board or 1541 Ultimate II+ cartridge REST API.
Using DMA writes directly into C64 screen RAM, sensor values update live with no screen flicker, no reset, and no typing required. But the real breakthrough in v1.2 is bidirectional control — the C64 keyboard becomes a remote control for Home Assistant. Navigate your sensor pages with cursor keys, select any controllable entity, and press Return to toggle it. The response is near-instant.
This is believed to be the first Home Assistant integration to provide full bidirectional control with a Commodore 64.
Compatible Hardware
Primary platform:
- Ultimate 64 — a full FPGA reimplementation of the Commodore 64. The 6510 CPU, SID, VIC-II and RAM are all implemented in FPGA silicon, with the Ultimate REST API built in. The Ultimate 64 for the inspiration and test platform for HomeTo64.
Also supported (In theory):
- Original C64 / C64C / C128 with a 1541 Ultimate II+ cartridge in the expansion port. The cartridge adds its own ARM processor and network connectivity, exposing the same REST API.
Both platforms use identical API endpoints — HomeTo64 works the same on either. Probably.
Features
Control
- Toggle entities from the C64 keyboard — lights, switches, locks, fans, covers, scenes, automations, groups
- Near-instant response — optimistic display update in under 200ms
- ● cursor indicator on controllable sensors — navigate with up/down cursor keys, press Return to toggle the HA entity.
- Remote control from HA — Launch, make sensor changes, change headings, and navigate pages via 'Next Page' button in the HA intergation
Display
- 📺 Live sensor dashboard — values update without resetting or flickering the C64 screen
- 📑 Up to 10 pages of sensors, each with a custom heading and up to 10 sensors
- 🎬 Splash screen on launch featuring really bad HA logo ASCII art. I made it myself, and you can really tell!
- 🎨 Alternating white / light-blue sensor rows for easy reading
- 🔄 State translation — binary sensors show Open/Closed, Motion/Clear, Locked/Unlocked etc. Read from HA device class!
Navigation
- ⌨️ Left/right cursor keys cycle pages on the C64
- 🔁 Auto-cycle pages — automatically advance pages after configurable inactivity period
Management
- 🛑 Stop RAM Writes button — To instantly stop HA sending data when you want to change C64 programs or the C64 is off.
- ⏱️ Auto-stop timeout — stops RAM writes after configurable idle period because you will probably forget to turn it off.
- 🔒 Optional network password support - Because there's 1 person that changed the default for some reason.
Installation
Prerequisites
Enable network access on your Ultimate 64 or 1541 Ultimate II+
- Open the Ultimate menu → Network Settings
- Enable wired or WiFi network
- Note the IP address shown — you'll need it during setup
Install HomeTo64 via HACS (recommended)
- In HACS → Integrations → ⋮ → Custom repositories
- Add
https://github.com/JKnivesworthy/hometo64as an Integration - Install HomeTo64 and restart Home Assistant
Or install manually by copying
custom_components/hometo64into your HAcustom_componentsdirectory and restarting.
Setup
- Go to Settings → Devices & Services → Add Integration → search HomeTo64
- Enter your Ultimate IP address and optional network password
- Configure display settings:
- Refresh Interval — how often to update values (minimum 1 second)
- Auto-Stop RAM Writes — stop after N minutes idle (0 = never)
- Screen Saver / Auto-Cycle Pages — auto-advance pages after N seconds of keyboard inactivity (0 = off, Recommended = 30, max 255s)
- Number of Pages — 1 to 10 pages
- For each page: set a heading, pick up to 10 sensors, optionally rename them
- Press Run on C64 — the super professional splash screen appears, then your dashboard loads
Using the Dashboard
Navigating pages
| Input | Action |
|---|---|
| Right cursor key | Next page |
| Left cursor key | Previous page |
| Next Page button (HA) | Advance page remotely |
| Auto-cycle | Automatically advances after inactivity |
Controlling entities
Pages containing controllable entities display a ● indicator at column 19 of each controllable row.
| Input | Action |
|---|---|
| Down cursor key | Move ● to next controllable entity |
| Up cursor key | Move ● to previous controllable entity |
| Return / Enter | Toggle selected entity |
The value on screen updates optimistically within 100ms. If the toggle fails, the correct state returns on the next refresh cycle.
Note: Up to 8 sensors per page can be cursor-selected and toggled (byte-width bitmap limit). Sensors 9–10 display values but cannot be toggled. Split entities across pages if you need more than 8 toggleable per page.
Stopping updates
Press Stop RAM Writes when you are done. HA stops sending data immediately. Press Run on C64 again to resume.
HomeTo64 assumes the C64 is normally off and HA is always running. HA never writes to the C64 unsolicited — updates only begin after you press Run on C64.
Screen Layout
row 0: blank
row 1: -- HOME ASSISTANT DASHBOARD -- (heading, reverse video)
row 2: blank
row 3: LIVING ROOM TEMP ● 21.5 C (bone white — ● = controllable, cursor here)
row 4: blank
row 5: HUMIDITY 54 % (light blue)
row 6: blank
row 7: CEILING LIGHT ● On (bone white — controllable)
...
row 24: HOME ASSISTANT TO C64 (footer, always row 24)
Technical Notes
How it works
- Run on C64 pushes a tokenised C64 BASIC PRG via
POST /v1/runners:run_prg - The PRG draws the dashboard and enters a non-blocking keyboard poll loop (
GET K$) - HA writes sensor values directly to screen RAM via
PUT /v1/machine:writemem(DMA) - When Return is pressed, BASIC POKEs slot+1 to
$CFCC; HA reads it viaGET /v1/machine:readmem, calls the HA service, and writes the optimistic display value back — all within ~100ms - Page navigation uses
$CFFFas a shared index byte;$CFCDcarries the controllable bitmap;$CFCBcarries the auto-cycle interval
RAM memory map
| Address | Purpose |
|---|---|
$CFCB |
Auto-cycle interval in jiffies (HA writes) |
$CFCC |
Action byte — C64 writes slot+1 on Return, HA reads and clears |
$CFCD |
Controllable bitmap — HA writes per-page bitmask |
$CFFF |
Navigation byte — HA writes page index for remote nav |
API endpoints used
| Endpoint | Purpose |
|---|---|
GET /v1/info |
Connection test |
POST /v1/runners:run_prg |
Push and run the BASIC PRG |
PUT /v1/machine:writemem |
Write sensor values, bitmap, nav byte |
GET /v1/machine:readmem |
Poll for toggle requests from C64 keyboard |
Controllable entity domains
light · switch · input_boolean · fan · cover · lock · scene · automation · group
Troubleshooting
| Problem | Solution |
|---|---|
| Cannot connect | Check IP address and network connectivity |
| Values not updating | Press Run on C64 first; check HA logs for writemem errors |
| WiFi issues | Update Ultimate firmware to 3.11+; try refresh interval 5s+ |
| Screen scrambled | Press Run on C64 to reinitialise |
| ● cursor not appearing | Page has no controllable entities, or bitmap not yet written — wait one refresh interval |
| Toggle not responding | Check HA logs; confirm entity domain is supported |
| Sensor shows On/Off instead of Open/Closed | Confirm device_class is set on the entity in HA |
Planned Features
- 🎵 SID music playback during dashboard display? Seems crazy, but this integration is nuts already.
Comments