Personal project · Deployed & running

Digitizing Residential Access Control

An 800m² property, two gates and a roller shutter door, controlled by three unreliable remotes that couldn't be shared. Rebuilt as one secure IoT system — automated, app-controlled, and accessible to the whole household.

3independently controlled doors
ESP32embedded controller
Signed requestsauthenticated, local-network onlyauthenticated, local-network
SwiftUInative iOS companion app
Residence Property 800 m² Enclosed property, single household Enclosed property Enclosed property,single household Gate 2 Secondary entrance Roller Shutter Garage door Gate 1 Main Gate

The Problem

One physical remote per door, for a household with 3 cars, 3 motorbikes, 4 bicycles, a UTV and an ATV.

Three separate entry points, three separate handheld remotes, and no way to share any of them. Whoever drove out with a remote took that door's only key with them — leaving everyone still at the property unable to open it, and anyone who left without one unable to get back in.

The solution

One opener.
Three doors. Every phone.

Phone Slide to open · Siri · Shortcuts Home Wi-Fi No cloud, no open ports ESP32 The Opener ESP32 wired to the 3 original remotes ESP32 wired tothe 3 original remotes The Doors Gate 1 · Gate 2 · Roller shutter
Live monitoring

An IoT system that reports on itself.

ESP32

Nothing goes unnoticed.

  • Daily check-inA status summary reaches the admin every day — uptime, activity, nothing needed from anyone.
  • Reboot notificationsPower cut, Wi-Fi drop, or a manual restart — every reboot is reported the moment it happens.
  • Live health for every userTemperature, uptime and connection status are visible from any phone, in real time, not just to one admin account.
85°C 85°C
20°C
Emergency alert — board temperature over threshold, notification sent to admin live.
Automation

The system is automated.

06:00 Opener ESP32 Property Residence Opener

Opens on schedule.

A door can open itself at a set time — the garage at 08:00 every morning — with nobody touching the app. It only runs while a phone is on the property's own Wi-Fi, so nothing opens by itself while the household is away.

Opens on arrival.

Drive back and the gate is already moving. The moment a phone rejoins the home Wi-Fi, the door it left through opens on its own — no app, no remote, no stopping at the gate.

Lost Wi-Fi triggers a reconnect attempt every 3 minutes until it's back. A power cut doesn't need a manual restart — the moment electricity returns, the system reboots itself and resumes running. No babysitting required.

The Opener

ESP32 D23 D19 D18 GND PC817 PC817 PC817 Gate 1 Gate 2 Roller shutter 5 V USB power A standard phone charger GPIO 23 · 19 · 18 One output pin per door 330 Ω resistor Limits the LED current PC817 optocoupler No shared electrical path Original remote Soldered across the button

One board.
Three isolated circuits.

An ESP32 runs the whole system. It joins the home Wi-Fi on boot, listens for signed requests, and drives one GPIO pin per door — 23, 19 and 18.

Each pin feeds an optocoupler through a current-limiting resistor. Inside the PC817, the signal crosses as light: there is no electrical connection between the two halves, so the ESP32 never shares a circuit with the remote it triggers.

On the far side, the optocoupler simply closes the remote's own button contacts for 700 milliseconds — the same thing a thumb does, and nothing more.

The 3D-printed opener enclosure, mounted

3D-printed for the wall.

  • Wall-mountedDesigned to mount on a wall and stay there, not sit loose on a shelf.
  • Grilles for ventilationOn the top and bottom of the cover, letting air in and out around the board.
  • Sealed power entryA cable hole feeds the 5V power lead straight to the ESP32.
  • Dedicated mountsThe ESP32 held in place, and each of the three remotes gets its own fixed spot — nothing floating loose, nothing resting on its wiring.
App home screen with three door controls App statistics screen showing uptime, temperature and memory

The App

One slide opens any door. Every phone in the household controls the same three entry points, safely and independently — no shared remote, no waiting on whoever has it.

  • Always connectedThe app and the opener exchange status live, over the local network — a real IoT link, not a one-shot command.
  • Healthy, at a glanceA green status means the opener answered just now and everything's normal.
  • Offline is shown tooLost Wi-Fi, no local network, or unreachable — the app says so, instead of pretending a door opened.

Always visible.

Live status from the opener itself, no separate dashboard.

  • UptimeHow long the opener has been running since it last rebooted.
  • ConnectionWi-Fi signal strength between the phone and the opener.
  • Signals sentTrigger count per door, since boot.
  • Board temperatureLive reading from the ESP32's own sensor.
  • Free memoryRemaining heap on the controller.
Firmware

Signed, single-use triggers over a local API.

The ESP32 issues a fresh nonce per request; the app signs it with a shared key over HMAC‑SHA256. A replayed or stale signature is rejected before anything touches a GPIO pin.

// shared by all three doors — cooldown + signature checked before firing
void handleTriggerFor(uint8_t door) {
  if (millis() - g_lastTriggerAt[door] < COOLDOWN_MS) {
    return respond(429, "cooldown");
  }
  if (!verifyNonceAndSignature()) {
    return respond(401, "unauthorized");
  }
  pulse(DOOR_PIN[door], PULSE_MS);
  g_lastTriggerAt[door] = millis();
  g_triggerCount[door]++;
}

Digitizing Residential Access Control

Designed, wired, and shipped end-to-end — hardware, firmware, and app.