Just remove the slash from the “user_1” sensor name in the yaml config.
Ahh, right, what a change (I think it’s completely realistic that someone wants to have slash in the sensor name…).
Thank you!
Hi all! I’ve been lurking in this forum for a few weeks now with the intention of implementing this on my DSC alarm. I got everything I’m in the process of getting this set up.
I’ve seen you have helped several people that, like me, had never touched an ESP board or even seen/understood a schematic. Still through perseveration (and quite a lot of your feedback) they were able to get things running.
I got an ESP32 D1 MINI CP2104 which seemed compatible with the project and already ran all the wiring. Which I think is good to go.
here’s my wiring using a 4 channel mosfet level shifter:
Now, the thing that I have not been able to find here (at least not for my board model) is where exactly I should be connecting the 12V to 5V convertes so that I can power the ESP32 directly from the DSC panel instead of having to use a USB-C with a power adapter and bulk things up.
Finally, I think I would eventually like to have a PCB made for getting rid of all this wiring. But it looks like the schematics on the github page are all for ESP8266 which, from the information that I have gathered here, might no longer be recommended due to insufficient processing power. Is that correct? If so, are there any schematics that use a ESP32?
Thanks everyone in advance for any help and for making this project a reality.
P.S. I REALLY tried look up for everything in this thread and not to ask for help but I am hitting a dead end here. I hope I’m not the #100 person asking this things…
The IN+ and IN- of the LM2596 DC-DC voltage regulator should be connect to the AUX+ (red) and AUX- (black) terminal of the DSC panel accordingly. Please be remind that before you connect the OUT+ and OUT- to you ESP32 D1 MINI (no matter Vcc or 3.3V), you need to adjust the output voltage of LM2596 first (as they are usually tuned to maximum output voltage), or else you would fry your ESP32 D1 MINI.
We normally suggest to output 3.3V from the LM2596 DC-DC converter so that the onboard regulator will not be overheated.
If you want to have a PCB made, ESP32 D1 MINI is pin to pin compatible (at least for the pins needed in this project) with the ESP8266 D1 MINI. As a matter of fact, I used exactly the same ESP32 D1 MINI board in the first place. Though I upgraded now to ESP32-S2 MINI (same board size) now.
Also, if you would like to use those existing PCB designs in the git repository, I recall they either use resistor divider or opto-coupler, not the level shifter that you are using now.
Honestly, using a pcb for the level shifter circuit is overkill in my opinion but it’s up to you. You can just mount the 3 components (dc-dc regulator, level-shifter and esp32) on a piece of protoboard and solder the connections together with a few pieces of wire and you are done. You can’t get a more simple circuit than that. As wkchick indicated though you can use the esp32 d1 mini you have with any of the esp8266 d1 mini pcb’s designs but you will need to modify your config as the design will use the inside row of pins.
Hi all, thank you very much for the prompt response. I finally figured it out, ended up using a usb cable to wire it directly to the LM2596 and after frying one ESP32
I got a new one installed and connected to HA.
Now, for some reason, I am not getting any sensor activity records nor am I capable of arming/disarming the system from HA. It seems something is not working properly…
Things I have attempted so far are:
- checking cable connections and wiring.
- Checking the YAML for errors
- Checking the LOGS looking for errors.
So far, I have not found any errors at all…
P.S I have set up all secret.yaml configs properly as well.
For context I have 3 sensors set up on Partition 1. z1 door, z2 motion and z3 door. That’s the entire alarm set up…
Does anybody now what could be going on here?
YAML:
substitutions:
name: "dscalarm" #unique network name
friendlyName: "DSCAlarm" #friendly name for this device
panelId: DSCAlarm #used as the service variable name.
dsc_alarm_panel:
id: $panelId
#you can enter a list of user codes mapped to their names for display in armed/disarmed event messages
usercodes: "1:Mariano,2:Empleado,3:Limpieza,4:Invitados" #
#Only comes into effect if a password prompt occurs when arming eg. night mode
accesscode: !secret access_code
#used to select the default partition associated with the alarm panel messages
defaultpartition: "1"
maxzones: "32" # maximum amount of zones your system supports
# dsc debug level: 0 = off, 1 = minimal, 2 = all packets shown on console 3 = + serial port debugging
dscdebuglevel: "2"
#zone expander addresses:
# 9 - zones 9-16
# 10 - zones 17-24
# 11 - zones 25-32
# 12 - zones 33-40 (for systems with 64 zone support)
# 13 - zones 41-48 (for systems with 64 zone support)
# 14 - zones 49-56 (for systems with 64 zone support)
# 16 - zones 57-64 (for systems with 64 zone support)
expanderaddr1: "0" # 1st zone expander emulator address to use . Set to 0 to disable.
expanderaddr2: "0" # 2nd expander emulator address to use . Set to 0 to disable.
##ESP32 Pins
dscclockpin: "22"
dscreadpin: "21"
dscwritepin: "21"
#periodic check for trouble messages in seconds. Minium 30s. Defaults to 120s (2 minutes)
trouble_fetch_update_time: 120
#flag to have the esp check for trouble statuses for devices/zones when the trouble light goes on or off
#Note: It will prevent the physical panel from beeping to let you know as the check resets the beep.
#Sends *21 and *27 to the panel. Default: true
trouble_fetch: true
#if true the available states will be:
#triggered,armed_home,armed_away,armed_night,pending,arming,disarmed,ready,not_ready
#if false the states will be:
#triggered,armed_home,armed_away,armed_night,pending,arming,disarmed
#the default is "false"
detailed_partition_state: false
clean_build: "false" #default is false. set to true if getting duplication errors in linking step.
esp32:
board: nodemcu-32s
framework:
type: arduino
version: recommended
external_components:
- source: github://Dilbert66/esphome-components@main #uncomment to use github repository (main branch selected)
#- source: my_components #uncomment to use local directory
components: [dsc_alarm_panel,mg_lib]
refresh: 10min
esphome:
name: $name
friendly_name: $friendlyName
#Example of how to set the panel time from the esp time on bootup
#on_boot:
#priority: 600
#then:
#- lambda: |-
# $panelId->set_panel_time();
#output sympols to output.map for debugging. You can remove if not needed
platformio_options:
build_flags:
- "-Wl,-Map,output.map"
#you can remove/disable this section if you don't want your panel time updated automatically.
#interval:
#- interval: 7200s
# then:
# - lambda: |-
# $panelId->set_panel_time();
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "$name"
password: !secret wifi_password
logger:
baud_rate: 115200
level: DEBUG
api:
encryption:
key: !secret encryption_key
custom_services: true
#mqtt:
#broker: 192.168.2.175
#port: 1883
#username: mqttuser
#password: mqttuser
#discovery_prefix: "homeassistant"
#topic_prefix: $name
safe_mode:
ota:
password: !secret ota_password
platform: esphome
#on_begin: #disabled due to bug in esphome
#switch.turn_off: connection_status_switch
time:
- platform: sntp
################################################################################
# Edit binary and text sensors below to suit your alarm setup.
# The id code is entered using the "id:" tag. Alternatively you can
# add the id code in round brackets at the end of the sensor name: eg. (z1)
# You can safely add or remove any sensors as needed.
binary_sensor:
### zone setup ###
# zone status open/close for each zone
# zone id code = z+zone number
- platform: dsc_alarm_panel
id: z1
name: "Front door z1"
device_class: door
- platform: dsc_alarm_panel
id: z2
name: "Main room z2"
device_class: motion
- platform: dsc_alarm_panel
id: z3
name: "Back door z3"
device_class: door
### non zone sensors ###
# partition ready indicators
# ready id code = rdy_ + partition number
- platform: dsc_alarm_panel
id: rdy_1
name: "Ready partition 1"
- platform: dsc_alarm_panel
id: rdy_2
name: "Ready partition 2"
# partition arm indicators
# arm id code = arm_ + partition number
- platform: dsc_alarm_panel
id: arm_1
name: "Armed partition 1"
- platform: dsc_alarm_panel
id: arm_2
name: "Armed partition 2"
# panel trouble status indicator
# trouble id code = tr
- platform: dsc_alarm_panel
id: tr
name: "Trouble Status"
device_class: problem
# bat id code = bat
# panel battery status indicator
- platform: dsc_alarm_panel
id: bat
name: "Battery Status"
device_class: problem
# ac id code = ac
# panel AC power indicator
- platform: dsc_alarm_panel
id: ac
name: "AC Status"
device_class: plug
# partition fire alarm indicators
# fire id code = fa_ + partition number
- platform: dsc_alarm_panel
id: fa_1
device_class: smoke
name: "Fire Status partition 1"
- platform: dsc_alarm_panel
id: fa_2
device_class: smoke
name: "Fire Status partition 2"
# partition in alarm indicators
# alarm id code = al_ + partition number
- platform: dsc_alarm_panel
id: al_1
name: "Alarm Status partition 1"
- platform: dsc_alarm_panel
id: al_2
name: "Alarm Status partition 2"
# relay PGM channels. Will show the state of the activate relay channel on/off
# relay id code = r + channel number
- platform: dsc_alarm_panel
id: r1
name: "PGM 1"
- platform: dsc_alarm_panel
id: r2
name: "PGM 2"
- platform: dsc_alarm_panel
id: r3
name: "PGM 3"
- platform: dsc_alarm_panel
id: r4
name: "PGM 4"
#- platform: dsc_alarm_panel
# name: "PGM 5"
#- platform: dsc_alarm_panel
# name: "PGM 6"
#- platform: dsc_alarm_panel
# name: "PGM 7"
#- platform: dsc_alarm_panel
# name: "PGM 8"
text_sensor:
# general system status online/disconnected
# system status id code = ss
- platform: dsc_alarm_panel
id: ss
name: "System Status"
icon: "mdi:shield"
# battery level status for wireless channels, tamper , in alarm, etc for individual zones
# zone status id code = zs
- platform: dsc_alarm_panel
id: zs
name: "Zone Status"
icon: "mdi:shield"
# partition status ie ready/not ready, triggered, etc
# partition status id code = ps_ + partition number
- platform: dsc_alarm_panel
id: ps_1
name: "Status partition 1"
icon: "mdi:shield"
# sample filter to change "not_ready" status to "disarmed" for use in HA Alarm Panel
# filters:
# - lambda: |-
# if (x == "not_ready") x="disarmed";
# return x;
- platform: dsc_alarm_panel
id: ps_2
name: "Status partition 2"
icon: "mdi:shield"
# more verbose message regarding the partition status. ie zones open, bypassed, etc
# partition message id code = msg_ + partition number
- platform: dsc_alarm_panel
id: msg_1
name: "Msg partition 1"
icon: "mdi:alert-box"
- platform: dsc_alarm_panel
id: msg_2
name: "Msg partition 2"
icon: "mdi:alert-box"
# virtual lcd keypad line1 and line2 messages for each partition
# partition line1 id code = ln1_ + partition number
# partition line2 id code = ln2_ + partition number
# partition 1
- platform: dsc_alarm_panel
id: ln1_1
name: "line1 partition 1"
icon: "mdi:alert-box"
- platform: dsc_alarm_panel
id: ln2_1
name: "line2 partition 1"
icon: "mdi:alert-box"
# partition 2
- platform: dsc_alarm_panel
id: ln1_2
name: "line1 partition 2"
icon: "mdi:alert-box"
- platform: dsc_alarm_panel
id: ln2_2
name: "line2 partition 2"
icon: "mdi:alert-box"
# generic event messages from panel
# panel event id code = evt
- platform: dsc_alarm_panel
id: evt
name: "event"
icon: "mdi:alert-box"
# partition beeps
# beeps id code = bp_ + partition number
- platform: dsc_alarm_panel
id: bp_1
name: "beeps partition 1"
icon: "mdi:alert-box"
- platform: dsc_alarm_panel
id: bp_2
name: "beeps partition 2"
icon: "mdi:alert-box"
# panel trouble messages
# panel msg id code = tr_msg
- platform: dsc_alarm_panel
id: tr_msg
name: "Trouble Msg"
icon: "mdi:alert-box"
# name of the zone that triggered the last alarm
# zone alarm id code = (za_ + partition number)
- platform: dsc_alarm_panel
id: za_1
name: zone alarm (za_1)
icon: "mdi:alert-box"
# name or id of the user that last armed/disarmed the partition
# user id code = (user_ + partition number)
- platform: dsc_alarm_panel
id: user_1
name: Arming_Disarming user (user_1)
icon: "mdi:alert-box"
#optional. Example button config to send a keypad cmd. This one sends a PGM1 relay on cmd on partition 1
button:
- platform: template
name: Gate Button
id: gate1
icon: "mdi:emoticon-outline"
on_press:
- lambda: |-
$panelId->alarm_keypress_partition("*71",1);
# this sensor below is optional - example use of pin d8 as a zone trigger pin for the emulated zone expander
# this emulates the hardware connection for a pc5108 board. Use a pull down/pull up resistor. Adjust logic accordingly for the correct logic output. ie invert
# - platform: gpio
# pin: D8
# device_class: window
# on_press: #pin high=on(open), pin low=off(closed)
# - lambda: |-
# $panelId->setZoneFault(17,1); #set zone 17 as open
# on_release:
# - lambda: |-
# $panelId->setZoneFault(17,0); #set zone 17 as closed
# end of panel sensor setup - no need to edit anything below.
##########################################################################################
switch:
#shows status of connection status to panel. You can disconnect before upload using the switch.
- platform: template
name: "Connection"
id: connection_status_switch
optimistic: true
restore_mode: DISABLED
lambda: |-
return dsc.keybusConnected;
icon: "mdi:shield-link-variant"
turn_on_action:
- switch.toggle: restart_switch
turn_off_action:
- lambda: |-
disconnectKeybus();
- platform: restart
id: restart_switch
- platform: safe_mode
name: "Safe Mode"
LOGS:
INFO ESPHome 2026.4.1
INFO Reading configuration /config/esphome/dscalarm.yaml…
INFO Detected timezone ‘America/Argentina/Buenos_Aires’
WARNING WiFi AP is configured but neither captive_portal nor web_server is enabled. The AP will not be usable for configuration or monitoring. Add ‘captive_portal:’ or ‘web_server:’ to your configuration.
INFO Starting log output from dscalarm.local using esphome API
INFO Successfully resolved dscalarm.local in 0.172s
INFO Successfully connected to dscalarm @ 192.168.1.28 in 0.019s
INFO Successful handshake with dscalarm @ 192.168.1.28 in 0.075s
[11:29:01.262][I][app:154]: ESPHome version 2026.4.1 compiled on 2026-04-27 20:06:56 -0300
[11:29:01.262][I][app:161]: ESP32 Chip: ESP32 rev3.1, 2 core(s)
[11:29:01.262][W][app:174]: Chip rev >= 3.0 detected. Set minimum_chip_revision: “3.1” under esp32 > framework > advanced to reduce binary size
[11:29:01.262][W][app:201]: Bootloader supports SRAM1 as IRAM (+40KB). Set sram1_as_iram: true under esp32 > framework > advanced
[11:29:01.262][C][logger:219]: Logger:
[11:29:01.262][C][logger:219]: Max Level: DEBUG
[11:29:01.262][C][logger:219]: Initial Level: DEBUG
[11:29:01.263][C][logger:226]: Log Baud Rate: 115200
[11:29:01.263][C][logger:226]: Hardware UART: UART0
[11:29:01.263][C][logger:235]: Task Log Buffer Size: 768 bytes
[11:29:01.292][C][template.switch:088]: Template Switch ‘Connection’
[11:29:01.292][C][template.switch:088]: Restore Mode: disabled
[11:29:01.298][C][template.switch:223]: Icon: ‘mdi:shield-link-variant’
[11:29:01.298][C][template.switch:055]: Optimistic: YES
[11:29:01.302][C][time:051]: Timezone: UTC-3:00
[11:29:01.321][C][time:055]: Current time: 2026-04-28 11:29:01
[11:29:01.321][C][restart:088]: Restart Switch ‘restart_switch’
[11:29:01.321][C][restart:088]: Restore Mode: always OFF
[11:29:01.321][C][restart:223]: Icon: ‘mdi:restart’
[11:29:01.329][C][safe_mode.switch:088]: Safe Mode Switch ‘Safe Mode’
[11:29:01.329][C][safe_mode.switch:088]: Restore Mode: always OFF
[11:29:01.350][C][safe_mode.switch:223]: Icon: ‘mdi:restart-alert’
[11:29:01.350][C][wifi:1505]: WiFi:
[11:29:01.350][C][wifi:1505]: Local MAC: 00:70:07:E5:DD:20
[11:29:01.350][C][wifi:1505]: Connected: YES
[11:29:01.351][C][wifi:1216]: IP Address: 192.168.1.28
[11:29:01.354][C][wifi:1227]: SSID: ‘Personal-596’[redacted]
[11:29:01.354][C][wifi:1227]: BSSID: 7A:EB:46:F9:8B:4C[redacted]
[11:29:01.354][C][wifi:1227]: Hostname: ‘dscalarm’
[11:29:01.354][C][wifi:1227]: Signal strength: -50 dB ▂▄▆█
[11:29:01.354][C][wifi:1227]: Channel: 11
[11:29:01.354][C][wifi:1227]: Subnet: 255.255.255.0
[11:29:01.354][C][wifi:1227]: Gateway: 192 168.1 1
[11:29:01.354][C][wifi:1227]: DNS1: 192 168.1 1
[11:29:01.354][C][wifi:1227]: DNS2: 0.0.0.0
[11:29:01.355][C][sntp:059]: SNTP Time:
[11:29:01.355][C][sntp:062]: Server 0: ‘0.pool ntp org’
[11:29:01.357][C][sntp:062]: Server 1: ‘1.pool ntp org’
[11:29:01.387][C][sntp:062]: Server 2: ‘2.pool ntp org’
[11:29:01.387][C][time:051]: Timezone: UTC-3:00
[11:29:01.387][C][time:055]: Current time: 2026-04-28 11:29:01
[11:29:01.387][C][esphome.ota:071]: Over-The-Air updates:
[11:29:01.387][C][esphome.ota:071]: Address: dscalarm.local:3232
[11:29:01.387][C][esphome.ota:071]: Version: 2
[11:29:01.393][C][esphome.ota:078]: Password configured
[11:29:01.417][C][safe_mode:026]: Safe Mode:
[11:29:01.417][C][safe_mode:026]: Successful after: 60s
[11:29:01.417][C][safe_mode:026]: Invoke after: 10 attempts
[11:29:01.417][C][safe_mode:026]: Duration: 300s
[11:29:01.417][C][safe_mode:043]: Bootloader rollback: support unknown
[11:29:01.417][C][api:235]: Server:
[11:29:01.417][C][api:235]: Address: dscalarm.local:6053
[11:29:01.417][C][api:235]: Listen backlog: 4
[11:29:01.417][C][api:235]: Max connections: 8
[11:29:01.428][C][api:242]: Noise encryption: YES
[11:29:01.473][C][mdns:194]: mDNS:
[11:29:01.473][C][mdns:194]: Hostname: dscalarm
If your ESP32 D1 Mini connection is exactly like that in your photo posted before, you would never get signals from IO21 and IO22. As Dilbert pointed out in previous post, you are using the outer row of pins on the ESP32 D1 MINI module! You must use the inner row of pin on the module in order to access Vcc, GND, IO16 (not used), IO22 and IO21. That row of pins highlighted in white. You are now connected to IO25 (Orange), IO32 (Red) and IO00 (Brown) instead, if connection has not been changed.
Hey, thanks for pointing that out but I switched to a nodemcu ESP32 with the yellow cable on P22 and green on P21, Im using the GND next to P21. So I think that should be sorted out
I probably should have asked this before but what alarm panel model are you connecting this to? FYI, the circuit will not work with the dsc neo or classic versions
It’s a 1832 powerseries ![]()
The intriguing thing is that I am seeing the status of some things like battery status, and power status. But it will not pick up sensor status or alarm activation status for some reason
One final thing I tried is to comment out anything that is not in use in an attempt to narrow down possible causes… After updating the yaml I am seein the following activity in the logs.
It seems like the Panel keybus is reconnecting every 2 minutes… And after attempting to arm away the system (it already is armed) nothing happens
[17:34:40.912][D][dscalarm:1618]: Panel keybus connected...
[17:34:40.919][I][Panel :1072]: [2026-04-28 17:34] FF: FF 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 (10)
[17:34:41.008][S][text_sensor]: 'System Status' >> 'online'
[17:34:41.008][S][text_sensor]: 'line1 partition 1' >> 'Secure System'
[17:34:41.008][S][text_sensor]: 'line2 partition 1' >> ' Before Arming <>'
[17:34:41.008][S][text_sensor]: 'zone alarm (za_1)' >> ' '
[17:34:41.008][S][text_sensor]: 'Status partition 1' >> 'disarmed'
[17:34:41.009][S][text_sensor]: 'Zone Status' >> ''
[17:34:41.009][S][text_sensor]: 'Trouble Msg' >> ''
[17:36:40.916][D][dscalarm:1618]: Panel keybus connected...
[17:36:40.923][I][Panel :1072]: [2026-04-28 17:36] FF: FF 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 (10)
[17:36:41.032][S][text_sensor]: 'System Status' >> 'online'
[17:36:41.032][S][text_sensor]: 'line1 partition 1' >> 'Secure System'
[17:36:41.032][S][text_sensor]: 'line2 partition 1' >> ' Before Arming <>'
[17:36:41.032][S][text_sensor]: 'zone alarm (za_1)' >> ' '
[17:36:41.032][S][text_sensor]: 'Status partition 1' >> 'disarmed'
[17:36:41.032][S][text_sensor]: 'Zone Status' >> ''
[17:36:41.032][S][text_sensor]: 'Trouble Msg' >> ''
[17:36:49.453][D][wifi:2413]: Roam scan (-50 dBm, attempt 2/3)
[17:37:05.179][I][dscalarm:993]: Setting Alarm state: W to partition 1
[17:37:05.201][I][dscalarm:1014]: Arming away
[17:38:40.926][D][dscalarm:1618]: Panel keybus connected...
[17:38:40.932][I][Panel :1072]: [2026-04-28 17:38] FF: FF 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 (10)
[17:38:41.025][S][text_sensor]: 'System Status' >> 'online'
[17:38:41.025][S][text_sensor]: 'line1 partition 1' >> 'Secure System'
[17:38:41.025][S][text_sensor]: 'line2 partition 1' >> ' Before Arming <>'
[17:38:41.025][S][text_sensor]: 'zone alarm (za_1)' >> ' '
[17:38:41.025][S][text_sensor]: 'Status partition 1' >> 'disarmed'
[17:38:41.025][S][text_sensor]: 'Zone Status' >> ''
[17:38:41.025][S][text_sensor]: 'Trouble Msg' >> ''
Your panel data is gibberish. You have a pin configuration or connection issue.
Ok, thanks for the feedback. I forgot to supply power to the mosftet ![]()
It’s working now! Thank you very much for all the help 🫰🏼
I’m curious. For the first time in forever, I tried to push a button on the virtual panel which presented the following error:
The Large Lying Models suggest that there’s a service missing from the ESPHome code API section, something like :
services:
- service: alarm_keypress_partition
variables:
key: string
partition: int
then:
- lambda: |-
$panelId->alarm_keypress_partition(key.c_str(), partition);
Before I go poking around some more, I wanted to check if anyone else has seen this.
Not fussed about it. More for my own edification than anything else. I do so enjoy learning something new every day.
The services used in this component are in the external component, not in the yaml config. Make sure you have the line below under your api section:
custom_services: true
I think your Large lying model is lying to you ![]()
Super weird. The line is in there
api:
encryption:
key: "supersecretkey"
custom_services: true
Them Liars I use for direction only, then try to figure out stuff for myself. Learning potential is much higher !
I did change the ESP32 name within ESPHome for consistency reasons. That meant a few automations needed updating as well. So maybe I need to drop a fresh install end-to-end on the ESP and see the result. Till then, I’m off to touch some grass for a few days ![]()
Really great project!
Two questions from me:
- will it work older DSC PowerSeries alarm PC5020 (other model name is “864”, not 1864)?
- I’d like to use ESP32-C3 Supermini (ESP32 C3 Supermini Pinout - #7 by Experimentalist - 3rd Party Boards - Arduino Forum) in Mosfet connection - what pins shall be used? Pin 21 for Yellow line and pin 7 for Green line will be ok?
Thanks in advance
- Yes, it will work with the pc5020 perfectly.
- The C3 runs great with it and yes, those pins are fine. Any of the green colored pins will work.
Hey everyone, and thanks Alain for building this! I’ve been working at this for a bit and have run into a wall, I just don’t know exactly how to troubleshoot this, just hoping someone can look at my logs and see if they make sense? It’s the serial output via USB.
I’m using the little mosfet board and the dev branch.
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;32m[I][Panel :1072]: [2026-05-02 19:24] 80: 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (12)e[0m
e[0;32m[I][Module:1072]: [2026-05-02 19:24] 80: B7 01 07 00 00 00 00 00 00 00 00 00 00 00 00 00 (12)e[0m
e[0;32m[I][Module:1072]: [2026-05-02 19:24] 80: B7 01 07 00 00 00 00 00 00 00 00 00 00 00 00 00 (12)e[0m
e[0;32m[I][Module:1072]: [2026-05-02 19:24] 80: B7 01 07 00 00 00 00 00 00 00 00 00 00 00 00 00 (12)e[0m
e[0;32m[I][Module:1072]: [2026-05-02 19:24] 80: 37 01 07 00 00 00 00 00 00 00 00 00 00 00 00 00 (12)e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
���������������������������������������������������������������� keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:352]e[1;31m[setupTask]e[0;36m: High water stack level: 1096e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;32m[I][Panel :1072]: [2026-05-02 19:28] 01: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (8)e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;36m[D][dscalarm:1618]: Panel keybus connected...e[0m
e[0;32m[I][Panel :1072]: [2026-05-02 19:30] A0: A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (9)e[0m
e[0;32m[I][Module:1072]: [2026-05-02 19:30] A0: 5F 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (9)e[0m
e[0;36m[D][dscalarm:352]e[1;31m[setupTask]e[0;36m: High water stack level: 1096e[0m
It seems to be connecting, but I’m not getting anything in the keypad web UI, Here’s my yaml in case that helps as well.
#for documentation see project at https://github.com/Dilbert66/esphome-dsckeybus
substitutions:
name: esphome-web-2762a8 #unique network name
friendlyName: Security DSC ESP32 #friendly name for this device
panelId: DSCAlarm #used as the service variable name.
ota:
- platform: esphome
logger:
baud_rate: 0
level: DEBUG
api:
encryption:
key: !secret encryption_key
custom_services: true
dsc_alarm_panel:
id: $panelId
#you can enter a list of user codes mapped to their names for display in armed/disarmed event messages
usercodes: "1:John,2:Sally,3:Bob" #
#Only comes into effect if a password prompt occurs when arming eg. night mode
accesscode: !secret access_code
#used to select the default partition associated with the alarm panel messages
defaultpartition: "1"
maxzones: "32" # maximum amount of zones your system supports
# dsc debug level: 0 = off, 1 = minimal, 2 = all packets shown on console 3 = + serial port debugging
dscdebuglevel: "2"
#virtual zone expander addresses:
# 9 - zones 9-16
# 10 - zones 17-24
# 11 - zones 25-32
# 12 - zones 33-40 (for systems with 64 zone support)
# 13 - zones 41-48 (for systems with 64 zone support)
# 14 - zones 49-56 (for systems with 64 zone support)
# 16 - zones 57-64 (for systems with 64 zone support)
# !! Note: if you already have real zone expanders on the bus (pc5108), ensure you do use the same addresses here.
expanderaddr1: "0" # 1st zone expander emulator address to use . Set to 0 to disable.
expanderaddr2: "0" # 2nd expander emulator address to use . Set to 0 to disable.
##ESP32 Pins
dscclockpin: "19"
dscreadpin: "18"
dscwritepin: "18"
##WT32-ETH01 Pins
#dscclockpin: "15"
#dscreadpin: "14"
#dscwritepin: "4"
#periodic check for trouble messages in seconds. Minium 30s. Defaults to 120s (2 minutes)
trouble_fetch_update_time: 120
#flag to have the esp check for trouble statuses for devices/zones when the trouble light goes on or off
#Note: It will prevent the physical panel from beeping to let you know as the check resets the beep.
#Sends *21 and *27 to the panel. Default: true
trouble_fetch: true
#if true the available states will be:
#triggered,armed_home,armed_away,armed_night,pending,arming,disarmed,ready,not_ready
#if false the states will be:
#triggered,armed_home,armed_away,armed_night,pending,arming,disarmed
#the default is "false"
detailed_partition_state: false
clean_build: "false" #default is false. set to true if getting duplication errors in linking step.
esp32:
variant: esp32
framework:
type: esp-idf
#location of alarm panel code. You can use the github release version or
#copy the code to directory "my_components" in your main esphome directory
# see here for more info: https://esphome.io/components/external_components
external_components:
- source: github://Dilbert66/esphome-components@dev #uncomment to use github repository (dev branch selected)
#- source: my_components #uncomment to use local directory
components: [dsc_alarm_panel,web_keypad,mg_lib]
refresh: 10min
# web keypad component. Remove or comment if not needed
# each included files will be downloaded automatically and compiled within the flash.
# there will be no need for internet access when running.
# For www.js build details and source: https://github.com/Dilbert66/esphome-webserver-custom/tree/keypad
# Component source: https://github.com/Dilbert66/esphome-components/tree/keypad/components/web_keypad
### Note: this is an ESP32 only component. The esp8266 does not support the resources needed.
web_keypad:
port: 80
partitions: 1 # a keypad will be shown for each partition
log: false
auth: #this section is optional. Enable if you need authentication/encryption
username: test
password: test
encryption: true #set true to use AES256HMAC encryption/auth for sent keys and returned LCD messages
#set to false to use Digest authentication - no encryption
config_url: https://dilbert66.github.io/config_files/config_dsc.yml
js_url: https://dilbert66.github.io/js_files/www.js
## If you prefer to use locally hosted compile time files comment the two lines above and uncomment below
#config_local: ./config_dsc.yml
#js_local: ./www.js
## custom function call to send keypresses if other than dsc/vista components are used. Parmeters are a string keys and int partition
#service_lambda: |-
#$panelId->alarm_keypress_partition(keys,partition);
esphome:
name: $name
friendly_name: $friendlyName
#Example of how to set the panel time from the esp time on bootup
#on_boot:
#priority: 600
#then:
#- lambda: |-
# $panelId->set_panel_time();
#output sympols to output.map for debugging. You can remove if not needed
platformio_options:
build_flags:
- "-Wl,-Map,output.map"
#you can remove/disable this section if you don't want your panel time updated automatically.
#interval:
#- interval: 7200s
# then:
# - lambda: |-
# $panelId->set_panel_time();
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Configuration for WT32-ETH01. Also comment out wifi section
# ethernet:
# type: LAN8720
# mdc_pin: GPIO23
# mdio_pin: GPIO18
# clk_mode: GPIO0_IN
# phy_addr: 1
# power_pin: GPIO16
#to use mqtt disable the api: section above. This enables you to use esphome with
#non homeassistant systems
#modify the mqtt section to your needs
#See: https://esphome.io/components/mqtt.html
#mqtt:
#broker: 192.168.2.175
#port: 1883
#username: mqttuser
#password: mqttuser
#discovery_prefix: "homeassistant"
#topic_prefix: $name
safe_mode:
time:
- platform: sntp
################################################################################
# Edit binary and text sensors below to suit your alarm setup.
# The id code is entered using the "id:" tag. Alternatively you can
# add the id code in round brackets at the end of the sensor name: eg. (z1)
# You can safely add or remove any sensors as needed.
binary_sensor:
### zone setup ###
# zone status open/close for each zone
# zone id code = z+zone number
- platform: dsc_alarm_panel
id: z1
name: "01 Suite Door"
device_class: door
- platform: dsc_alarm_panel
id: z2
name: "02 Suite Window"
device_class: window
- platform: dsc_alarm_panel
id: z3
name: "03 Garage Mandoor"
device_class: door
- platform: dsc_alarm_panel
id: z4
name: "04 Garage OH Door"
device_class: door
- platform: dsc_alarm_panel
id: z5
name: "05 Garage Glass Break"
device_class: window
### non zone sensors ###
# partition ready indicators
# ready id code = rdy_ + partition number
- platform: dsc_alarm_panel
id: rdy_1
name: "Ready partition 1"
- platform: dsc_alarm_panel
id: rdy_2
name: "Ready partition 2"
# partition arm indicators
# arm id code = arm_ + partition number
- platform: dsc_alarm_panel
id: arm_1
name: "Armed partition 1"
- platform: dsc_alarm_panel
id: arm_2
name: "Armed partition 2"
# panel trouble status indicator
# trouble id code = tr
- platform: dsc_alarm_panel
id: tr
name: "Trouble Status"
device_class: problem
# bat id code = bat
# panel battery status indicator
- platform: dsc_alarm_panel
id: bat
name: "Battery Status"
device_class: problem
# ac id code = ac
# panel AC power indicator
- platform: dsc_alarm_panel
id: ac
name: "AC Status"
device_class: plug
# partition fire alarm indicators
# fire id code = fa_ + partition number
- platform: dsc_alarm_panel
id: fa_1
device_class: smoke
name: "Fire Status partition 1"
- platform: dsc_alarm_panel
id: fa_2
device_class: smoke
name: "Fire Status partition 2"
# partition in alarm indicators
# alarm id code = al_ + partition number
- platform: dsc_alarm_panel
id: al_1
name: "Alarm Status partition 1"
- platform: dsc_alarm_panel
id: al_2
name: "Alarm Status partition 2"
# relay PGM channels. Will show the state of the activate relay channel on/off
# relay id code = r + channel number
- platform: dsc_alarm_panel
id: r1
name: "PGM 1"
- platform: dsc_alarm_panel
id: r2
name: "PGM 2"
- platform: dsc_alarm_panel
id: r3
name: "PGM 3"
- platform: dsc_alarm_panel
id: r4
name: "PGM 4"
#- platform: dsc_alarm_panel
# name: "PGM 5"
#- platform: dsc_alarm_panel
# name: "PGM 6"
#- platform: dsc_alarm_panel
# name: "PGM 7"
#- platform: dsc_alarm_panel
# name: "PGM 8"
text_sensor:
# general system status online/disconnected
# system status id code = ss
- platform: dsc_alarm_panel
id: ss
name: "System Status"
icon: "mdi:shield"
# battery level status for wireless channels, tamper , in alarm, etc for individual zones
# zone status id code = zs
- platform: dsc_alarm_panel
id: zs
name: "Zone Status"
icon: "mdi:shield"
# partition status ie ready/not ready, triggered, etc
# partition status id code = ps_ + partition number
- platform: dsc_alarm_panel
id: ps_1
name: "Status partition 1"
icon: "mdi:shield"
- platform: dsc_alarm_panel
id: ps_2
name: "Status partition 2"
icon: "mdi:shield"
# more verbose message regarding the partition status. ie zones open, bypassed, etc
# partition message id code = msg_ + partition number
- platform: dsc_alarm_panel
id: msg_1
name: "Msg partition 1"
icon: "mdi:alert-box"
- platform: dsc_alarm_panel
id: msg_2
name: "Msg partition 2"
icon: "mdi:alert-box"
# virtual lcd keypad line1 and line2 messages for each partition
# partition line1 id code = ln1_ + partition number
# partition line2 id code = ln2_ + partition number
# partition 1
- platform: dsc_alarm_panel
id: ln1_1
name: "line1 partition 1"
icon: "mdi:alert-box"
- platform: dsc_alarm_panel
id: ln2_1
name: "line2 partition 1"
icon: "mdi:alert-box"
# partition 2
- platform: dsc_alarm_panel
id: ln1_2
name: "line1 partition 2"
icon: "mdi:alert-box"
- platform: dsc_alarm_panel
id: ln2_2
name: "line2 partition 2"
icon: "mdi:alert-box"
# generic event messages from panel
# panel event id code = evt
- platform: dsc_alarm_panel
id: evt
name: "event"
icon: "mdi:alert-box"
# partition beeps
# beeps id code = bp_ + partition number
- platform: dsc_alarm_panel
id: bp_1
name: "beeps partition 1"
icon: "mdi:alert-box"
- platform: dsc_alarm_panel
id: bp_2
name: "beeps partition 2"
icon: "mdi:alert-box"
# panel trouble messages
# panel msg id code = tr_msg
- platform: dsc_alarm_panel
id: tr_msg
name: "Trouble Msg"
icon: "mdi:alert-box"
# name of the zone that triggered the last alarm
# zone alarm id code = (za_ + partition number)
- platform: dsc_alarm_panel
id: za_1
name: zone alarm (za_1)
icon: "mdi:alert-box"
# name or id of the user that last armed/disarmed the partition
# user id code = (user_ + partition number)
- platform: dsc_alarm_panel
id: user_1
name: Arming_Disarming user (user_1)
icon: "mdi:alert-box"
switch:
#shows status of connection status to panel. You can disconnect before upload using the switch.
- platform: template
name: "Connection"
id: connection_status_switch
optimistic: true
restore_mode: DISABLED
lambda: |-
return dsc.keybusConnected;
icon: "mdi:shield-link-variant"
turn_on_action:
- switch.toggle: restart_switch
turn_off_action:
- lambda: |-
disconnectKeybus();
- platform: restart
id: restart_switch
- platform: safe_mode
name: "Safe Mode"
All my connections appear to be solid, but reading through the comments here, it may be a wiring issue?
What panel are you connected to? Only PowerSeries panels are supported.




