Skip to the content
2 layers112 × 90 mmSsr, the printed circuit board in 3D

Components for a CAN-bus home-automation system: relay/rollershutter/ light/button/sensor nodes on a shared CAN bus, bridged to MQTT (and from there to openHAB or Home Assistant) by a gateway.

Size
112 × 90 mm
Copper layers
2
Thickness
1.6 mm
Parts
111
Nets
131
Pads
433
Tracks, vias
865, 83
Pours
4
Routed
Yes
KiCad
KiCad 6 (file 20211014)
Created
14 Mar 2026
Updated
7 Nov 2026

Overview

Ssr is an open-source printed circuit board by Th3Link, from the Th3Link/homeautomation repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 112 × 90 mm with 111 parts on 131 nets, routed with 865 tracks and 83 vias.

It is built around the ESP32-WROOM-32, PCF8574AP and AQH3213A, with the PESD2CAN among its other parts. Its parts include 43 resistors, 23 ICs, 16 diodes, 11 capacitors and 8 connectors. It belongs with the home automation and IoT boards and the ESP32 boards of this library.

Main components

4

README

README.md

homeautomation

Components for a CAN-bus home-automation system: relay/rollershutter/ light/button/sensor nodes on a shared CAN bus, bridged to MQTT (and from there to openHAB or Home Assistant) by a gateway. This repository holds the hardware (KiCad), mechanics (3D-printable enclosures), and firmware for the whole system.

Start here: docs/index.md — the full documentation index (requirements, architecture decisions, protocol specs), also built into every crate's cargo doc output and published to GitHub Pages.

Software

The firmware is Rust (#![no_std], embassy async, esp-hal), organized as one Cargo workspace under software/:

  • common-core / common-hardware — CAN wire-format types and ESP32 hardware-support helpers shared by both firmware lines.
  • gateway-core / gateway-hardware — the CAN↔MQTT bridge: web config UI, /control.json RPC, self- and CAN-bus OTA update, over wired Ethernet (DHCPv4 + SLAAC, no WiFi).
  • cancomponents-core / cancomponents-hardware — the node firmware living on the bus: relays, rollershutters, buttons, lights.
  • tools/mqtt-log-reader — a small Python tool for reading back the gateway's MQTT log/debug topics.
  • sim/ — ./sim up: the unchanged gateway and node firmware in QEMU, several gateways with their nodes on virtual CAN buses; press buttons, set what the sensors measure, watch relays and frames, in a TUI, from Python scripts or in pytest.
  • legacy/ — the original C++/ESP-IDF implementation, kept for reference. No longer built by CI.

Building

The *-core crates are hardware-independent and build/test on any machine with stable Rust:

bash
cargo test -p gateway-core -p cancomponents-core -p common-core

The *-hardware crates target Xtensa (ESP32) and need Espressif's Rust toolchain fork, installed via espup:

bash
cargo install espup
espup install
source "$HOME/export-esp.sh"   # needed once per new shell

Then, from a *-hardware crate directory (e.g. software/gateway-hardware/):

bash
cargo run --release

cargo run flashes over USB serial and opens a monitor, via espflash (configured as each crate's custom runner in its own .cargo/config.toml).

Hardware

Relais

Disclaimer: if you put mains voltage on a relais board, make sure you know what you are doing. These components are experimental and you are in charge of your own actions. Be safe — if you're unsure, get an expert or leave it.

Three PCBs, one shared firmware, to switch power on and off:

  • Solid-state relais (SSR) — mains voltage only (~230V @ 50-60Hz), up to 1A per relay, six relais sharing one 1A fuse. Be careful with capacitive/inductive loads; handles small rollershutters, heating actuators, and electro-magnetic contactors fine.
  • Regular relais — up to 16A each, no on-board fuse (protect your own circuits). No arc-quenching chamber, so an electro-magnetic contactor is a better choice for heavy inductive loads (motors, frequency drives).
  • Rollershutter — two cascaded relais per channel (power, then up/down), with software interlocking so up and down are never active at once.

All three use the same firmware and the same ESP32 pinning, and each has one extension port for up to 4 additional relay or sensor boards.

Lightswitch, sensors, CAN header/hub, UART adapter

Additional boards in hardware/ — see each board's own KiCad project for details; written documentation for these is still a work in progress.

CAN bus and MQTT protocol

See docs/protocol-can.md for the byte-level CAN wire format shared by every component, and software/gateway-core/docs/protocol-mqtt.md for the gateway's MQTT topic scheme. (Extension-board channel/button numbering conventions used by the node firmware — e.g. which CAN NO/button-id ranges map to which extension address — are documented at the node firmware level; docs/protocol-can.md covers the CAN frame format itself.)

CI

  • CI — cargo fmt / cargo clippy for every crate, cargo nextest with coverage and an MSRV check for the *-core crates.
  • Docs — cargo doc for every crate, published to GitHub Pages.
  • Security audit — cargo-audit against the RustSec advisory database, on every dependency change and once daily.
  • Renovate — automated dependency-update PRs, once daily.

software/legacy/ (the original C++/ESP-IDF code) is no longer built by CI — see its own README.md for the ESP-IDF build steps if you need to reproduce it.

License

GNU General Public License v3.0 (or later) — see LICENSE.

This is meant to be freely buildable, flashable, and modifiable hardware and firmware. GPLv3 was chosen deliberately: its copyleft means anything built on this stays open, and its Section 6 "Installation Information" requirement means anyone who conveys a modified version as part of a physical product also has to provide what's needed to install your own modified firmware on it — nobody gets to lock you out of hardware you own. All schematics, layouts, mechanics, tools, and software are provided so you can fix things yourself rather than throwing them away.

Contribution

Feel free to report issues or open a pull request.

Parts

111
QtyValueFootprintReferences
161KResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR5, R6, R7, R8, R9, R10, R24, R25, R26, R28, R29, R30, R37, R38, R39, R40
16330RResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR11, R12, R13, R20, R22, R23, R31, R32, R33, R34, R35, R36, R41, R42, R43, R44
16AQH3213APackage_SO:SSO-7-8_6.4x9.78mm_P2.54mmU7, U8, U10, U11, U12, U13, U14, U15, U16, U17, U18, U19, U20, U21, U22, U23
16LEDLED_SMD:LED_0603_1608Metric_Pad1.05x0.95mm_HandSolderD1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16
7100nCapacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolderC1, C4, C5, C8, C9, C10, C11
4100RResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR16, R17, R18, R19
4MountingHoleMountingHole:MountingHole_3.2mm_M3_DIN965H1, H2, H3, H5
310KResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR4, R14, R21
310uCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC3, C6, C7
21A sehr trägeFuse:Fuseholder_Cylinder-5x20mm_Schurter_0031_8201_Horizontal_OpenF1, F2
22K2Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR45, R46
2IRDAConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ5, J6
2PCF8574APackage_SO:SOIC-16W_7.5x10.3mm_P1.27mmU5, U6
2RJ45-CANConnector_RJ:RJ45_OST_PJ012-8P8CX_VerticalJ7, J12
2SolderJumper_2_OpenJumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP5, JP6
2SolderJumper_3_Bridged12Jumper:SolderJumper-3_P1.3mm_Open_RoundedPad1.0x1.5mmA1, A2
2WAGO2604-1108awesome:WAGO2604-1108J2, J3
1*120RResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR27
11uCapacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolderC2
14K7Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR15
1Button-Sensors-MicroMatch2X03awesome:02x03MicroMatchJ1
1ESP32-WROOM-32awesome:ESP32-WROOM-32U3
1MCP1703A-3302_SOT89Package_TO_SOT_SMD:SOT-89-3_HandsolderingU4
1MCP2562-E-SNPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU2
1PESD2CANPackage_TO_SOT_SMD:SOT-23U1
1WAGO2604-1102awesome:WAGO2604-1102J13
1wuerthDebug6awesome:wuerthDebug6U9

More from Th3Link/homeautomation

8
  • 2 layers188 × 97 mmRelais, the printed circuit board in 3D

    Relais

    Th3Link/homeautomation

    Components for a CAN-bus home-automation system: relay/rollershutter/ light/button/sensor nodes on a shared CAN bus, bridged to MQTT (and from there to openHAB or Home Assistant) by a gateway.

    101 partsGPL-3.0
  • 2 layers48 × 49 mmSwitch, the printed circuit board in 3D

    Switch

    Th3Link/homeautomation

    Components for a CAN-bus home-automation system: relay/rollershutter/ light/button/sensor nodes on a shared CAN bus, bridged to MQTT (and from there to openHAB or Home Assistant) by a gateway.

    67 partsGPL-3.0
  • 4 layers75 × 51 mmMqtt gateway, the printed circuit board in 3D

    Mqtt gateway

    Th3Link/homeautomation

    Components for a CAN-bus home-automation system: relay/rollershutter/ light/button/sensor nodes on a shared CAN bus, bridged to MQTT (and from there to openHAB or Home Assistant) by a gateway.

    64 partsGPL-3.0
  • 2 layers80 × 86 mmPwm adapter, the printed circuit board in 3D

    Pwm adapter

    Th3Link/homeautomation

    Components for a CAN-bus home-automation system: relay/rollershutter/ light/button/sensor nodes on a shared CAN bus, bridged to MQTT (and from there to openHAB or Home Assistant) by a gateway.

    60 partsGPL-3.0
  • 2 layers48 × 49 mmSensors, the printed circuit board in 3D

    Sensors

    Th3Link/homeautomation

    Components for a CAN-bus home-automation system: relay/rollershutter/ light/button/sensor nodes on a shared CAN bus, bridged to MQTT (and from there to openHAB or Home Assistant) by a gateway.

    58 partsGPL-3.0
  • 2 layers126.5 × 42 mmCanhubstar, the printed circuit board in 3D

    Canhubstar

    Th3Link/homeautomation

    Components for a CAN-bus home-automation system: relay/rollershutter/ light/button/sensor nodes on a shared CAN bus, bridged to MQTT (and from there to openHAB or Home Assistant) by a gateway.

    17 partsGPL-3.0
  • 2 layers61 × 32 mmCanHeader, the printed circuit board in 3D

    CanHeader

    Th3Link/homeautomation

    Components for a CAN-bus home-automation system: relay/rollershutter/ light/button/sensor nodes on a shared CAN bus, bridged to MQTT (and from there to openHAB or Home Assistant) by a gateway.

    12 partsGPL-3.0
  • 2 layers22 × 36 mmDebug adapter, the printed circuit board in 3D

    Debug adapter

    Th3Link/homeautomation

    Components for a CAN-bus home-automation system: relay/rollershutter/ light/button/sensor nodes on a shared CAN bus, bridged to MQTT (and from there to openHAB or Home Assistant) by a gateway.

    11 partsGPL-3.0

Similar boards

  • 2 layers98 × 187 mmProjet, the printed circuit board in 3D

    Projet

    FranklinBerger/Polonise-Inverse

    Projet électronique de calculatrice en Polonaise Inversse. Bassée sur un ESP32 sur firmware MicroPython, elle a été initialement conçue dans le cadre d'un stage de découverte de l'électronique durant 1 mois.

    137 parts1
  • 2 layers93.4 × 87.4 mmNODE, the printed circuit board in 3D

    NODE

    maivananh111/NODE_PCB

    NODE_PCB

    138 parts
  • 4 layers50 × 50 mmHSCanT, the printed circuit board in 3D

    HSCanT

    cherry-embedded/HSCanT-hardware

    HSCanT is a USB to 4-channel CAN FD tool designed based on the HPM5321 chip.

    130 parts52Apache-2.0
  • 2 layers26 × 13.6 mmCFDC embedded, the printed circuit board in 3D

    CFDC embedded

    ucandevices/CFDC_embedded

    Embedded code and PCB for CAN FD to USB converter

    36 parts15LGPL-3.0
  • 4 layers55 × 35 mmCarrier, the printed circuit board in 3D

    Carrier

    jonsole/toyotune

    Daughter-board for reprogramming 1990's Toyota ECUs

    30 parts8GPL-3.0
  • 2 layers52 × 109 mmGlasgow can, the printed circuit board in 3D

    Glasgow can

    attie/glasgow-can

    CAN Interface addon for Glasgow

    46 parts6BSD-3-Clause
  • 4 layers50 × 50 mmBusted umbrella, the printed circuit board in 3D

    Busted umbrella

    useless-branch/busted-umbrella

    USB to CAN FD

    45 parts2Apache-2.0
  • 2 layers29 × 26.5 mmCAN Shield, the printed circuit board in 3D

    CAN Shield

    X1L3F/ESP32-CAN-Shield

    Can Shield for the ESP32-S3

    15 parts2

Questions

How big is the Ssr PCB?

It measures 112 × 90 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Ssr use?

111 parts, built around the ESP32-WROOM-32, PCF8574AP, AQH3213A and PESD2CAN. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Ssr KiCad files?

From the Th3Link/homeautomation repository on GitHub, at the commit this page was made from: the board is hardware/ssrModule/ssr.kicad_pcb and its schematic hardware/canheader/canHeader.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Ssr design in my own project?

Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).