Skip to content

Repository files navigation

AAP ESL-2 Keypad Interface

ESPHome firmware and a custom PCB to talk to the keypad bus of an Arrowhead Alarm Products EliteControl ESL-2 panel, so it can be integrated into Home Assistant through the crow_alarm_panel external component. It builds on my crow_alarm_panel implementation, which handles the AAP keypad bus protocol.

PCB PCB with Atom Lite Side View
Custom PCB Custom PCB with Atom Lite Custom PCB on the side

The ESL-2 keypad bus is a shared clock/data bus that regular AAP keypads talk to. This project adds an M5Stack Atom Lite or M5Stack AtomS3 Lite to the bus as an extra keypad, so it can read zone/arm state and issue arm/disarm/output commands over Wi-Fi, without touching the panel's existing keypads.

Installed

How it works

The panel supplies +12V to power the bus, but the clock/data lines themselves run at 5V, while the AtomS3 Lite module's GPIOs are 3.3V. The custom PCB sits between the two:

  • An AP63205WU-7 buck converter steps the bus's +12V supply down to +5V, used as the CLK/DATA logic-high reference and to power the module.
  • Two BSS138 MOSFETs form bidirectional logic-level shifters for the CLK and DATA lines, translating between the bus side (5V) and the module side (3.3V).
  • The PCB's pin header/Grove-compatible footprint matches the Atom Lite, so it plugs straight onto the PCB with no jumper wires — only the bus connection (panel to PCB) needs wiring, covered in Connection diagram.

The header footprint matches the M5Stack ATOM family in general, so the original M5Stack Atom Lite (ESP32) works as a drop-in alternative to the AtomS3 Lite — it needs the plain esp32 variant instead of esp32s3, plus different clock_pin/data_pin values in the YAML, since the Atom Lite exposes a different set of GPIOs than the AtomS3 Lite.

There is no dedicated address pin/DIP switch — the keypad address used on the bus is set entirely in the ESPHome YAML (see Configuration below).

Custom PCB

All manufacturing files (schematic, gerbers, BOM, pick-and-place, and the EasyEDA source project) are in docs/pcb, ready to order from a board house such as JLCPCB.

Schematics

Files required to order boards from JLCPCB:

Board layout

The top side mounts the AtomS3 Lite and carries the buck converter and level shifters. The bottom side breaks out the bus connection, silkscreened with the wire colors used on the ESL-2 keypad harness:

Silkscreen Signal Wire color
+12V Bus power Red
GND Ground Black
CLK Clock Yellow
DAT Data Blue
Top Bottom
2D Top 2D Bottom
3D Top 3D Bottom
3D Top

Two options are provided for connecting to the bus:

  • CN1 — a 4-pin screw terminal (Phoenix Contact 1861959), for connecting bare wires directly.
  • CN2 — a 5-pin pluggable connector (Molex 22035055), for a crimped/pre-made harness — compatible with AAP's Keypad Bus Connection Cables. ARR14, ARR15, or the cheaper AliExpress 5-pin, double-head cable

Some AliExpress listings let you pick the wiring type — choose straight-through (pin 1 to pin 1), not rollover/mirrored (pin 1 to pin 5). Not all sellers offer that option though, so you may still receive a rollover cable and need to depin and re-seat the wires to match before plugging in:

Correct (cable_ok.png) Wrong (cable_nok.png)
Cable wired correctly Cable wired incorrectly

Connection diagram

+--------------------+                +-----------------+
|    ESL-2 Panel     |                |    Custom PCB   |
|                    |                |                 |
| +12V (red)    o---------------------o +12V            |
| GND  (black)  o---------------------o GND             |
| CLK  (yellow) o---------------------o CLK             |
| DAT  (blue)   o---------------------o DAT             |
+--------------------+                +-----------------+

3D-Printable Case

An open-top OpenSCAD enclosure for the custom PCB lives in docs/case:

Case With PCB fitted (reference)
Case render Case render with PCB

The board has no mounting holes, so it's held by 4 press-fit support posts plus 4 snap-fit edge clips instead of screws. Print the case in PETG or ABS, not PLA — the edge clips flex on insertion and PLA is too brittle for the strain involved (one already cracked in PLA during testing). This design is still a work in progress: the clips have only been test-printed once, and CN2 (the pluggable bus connector) doesn't yet have wall access if it turns out to need it — see the repo's docs/TODO.md for open items.

Configuration

Two example YAML configs are provided, both using the same PCB and wiring. Copy the one you need (dropping .example) and fill in your own zone/keypad names — the copy is gitignored so your real panel layout doesn't end up in the repo:

  • aap_esl_keypad_interface.example.yaml → aap_esl_keypad_interface.yaml — registers as an active keypad on the bus (address: 5) and exposes arm/disarm/stay, zone sensors, and switch outputs to Home Assistant.
  • aap_esl_keypad_monitor.example.yaml → aap_esl_keypad_monitor.yaml — passive/listen-only variant (no address claimed on the bus), useful for monitoring bus traffic without presenting as a keypad.

Both use clock_pin: GPIO7, data_pin: GPIO5 for the AtomS3 Lite (GPIO23/GPIO22 instead if using an original Atom Lite, along with esp32 instead of esp32s3) with the crow_alarm_panel external component. For everything else — keypads, zones, passive monitor mode, outputs, bypass switches, the full option reference — see the component's own README, which documents the schema in more detail than duplicated here.

If you notice odd log lines or occasional retry/timing behavior after setting this up, check the component's known quirks page first — it covers benign bus/panel quirks (retransmission noise, watchdog re-announces, CURRENT_TIME glitches, etc.) that are already understood and don't indicate a problem with this integration.

Create a secrets.yaml (gitignored) alongside your copy with:

wifi_ssid: "..."
wifi_password: "..."
fallback_hotspot_password: "..."
alarm_code: 1234
api_encryption_key: "..."

Flash

Two ways to get this onto the device:

Local CLI — this project uses uv to manage the ESPHome dependency (see pyproject.toml). Install uv if you don't have it, then:

uv sync
uv run esphome config aap_esl_keypad_interface.yaml  # to validate configuration
uv run esphome run aap_esl_keypad_interface.yaml

ESPHome Builder (Home Assistant add-on) — no local ESPHome install needed:

  1. In Home Assistant, open the ESPHome dashboard and + NEW DEVICE to create a device and flash the stub firmware over USB (this sets up wifi, api, and ota for you, with the encryption key stored by the add-on).
  2. Once the device shows up and adopts, EDIT it and replace the generated YAML's esp32, logger, external_components, and crow_alarm_panel/text_sensor/alarm_control_panel/button/switch blocks with the equivalent sections from aap_esl_keypad_interface.example.yaml, filled in with your own zones/keypads.
  3. Leave the wizard-generated wifi/api/ota sections as-is — no need to bring in secrets.yaml since the add-on manages Wi-Fi credentials and the encryption key itself.
  4. INSTALL to push the update over-the-air.

Credits

crow_alarm_panel was built on the work done by jallier and jesserockz

About

No description or website provided.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors