Integrating Vintage Doorbell w/ Button/Chime Control

I have a vintage doorbell in my house but wanted the button + chime decoupled so I could sense the button and control the chime through HA. I saw other solutions but none that worked with my classic lighted button + mechanical “impact” chime. Circuits are below.

A little background: Most chimes I have seen use the AC signal to trigger the coil to smack the chime and then retract (and maybe smack the other chime) when the wave collapses. To make life easy, I just used a DC supply in place of the existing transformer and handled the “turn off” of the power to the coil in software.

To make the button work I made my own lighted switch, but that isn’t necessary. An off the shelf LED switch will work. Using an LM317 configured as a constant current source, I run it from the circuit power and supply a little current to turn on the LED. So on one side of the LED is ground and the other is a few volts. I tie the high side also into the optocoupler input on the relay board. So now when the button is pressed the lighted button turns off and the optocoupler stops conducting, telling the controller the button is pressed. From there, can do pretty much anything, in my case, send a signal to HA and if all is well, ring the chime, though the chime ring could be done entirely in the esp code.

The chime is simply wired from the power side of the relay board through the NO contacts on the relay. So when the relay closes it energizes the coil in the doorball and it hits the chime – tens of ms later the relay deengerzies and the coil hits the other bell.

This way, I can also trigger things on the sonos, lights, etc or whatever, and can mute the chime at night.

The circuit is pretty forgiving, R is probably ok at 500-1K, and perhaps you want to throw in a ceramic cap across the input of the regulator, but for this it will work without.

The one caveat is because the pin on the ESP is strapped, you do need to be a bit careful when flashing esphome, I did it by just power cycling and then starting the flasher.

esphome:
  name: doorbell-interface
  friendly_name: Front Door Doorbell
  comment: Door Bell Button and Chime Relay
  
esp8266:
  board: esp12e 

# Enable Home Assistant API
api:
  encryption:
    key: ""

ota:
  password: ""
  num_attempts: 3
  reboot_timeout: 1min

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  domain: .home

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Doorbell-Interface"
    password: ""

# Enable Web server.
web_server:
  port: 80

captive_portal:

logger:
  level: DEBUG

light:
  - platform: status_led
    pin: 
      number: GPIO2
      inverted: True
    id: led_status_light
    restore_mode: ALWAYS_ON
    #internal: true  #hide from front end
    effects:
    - strobe:
        name: "Slow Blink" # 0.1s on, 2s off
        colors:
          - state: true
            brightness: 100%
            duration: 100ms
          - state: false
            duration: 2s
    on_turn_on:
      - light.turn_on:
          id: led_status_light
          effect: "Slow Blink"
  
# One sensor input
binary_sensor:
  - platform: gpio
    filters:
      - delayed_on_off: 100ms
    pin: 
      number: GPIO5
      inverted: false
      mode:
        input: true
        pullup: true
    name: "doorbell_button"
    device_class: door
    
    
# One  relay outputs, exposed as switches in Home Assistant
switch:
  - platform: gpio
    pin: GPIO4
    name: "doorbell_chime_relay"
    icon: "mdi:icon-bell"
    id: chime_relay
    on_turn_on:
    - delay: 600ms
    - switch.turn_off: chime_relay
    

# Text sensors with general information.
text_sensor:
  # Expose ESPHome version as sensor.
  - platform: version
    name: ESPHome Version
  # Expose WiFi information as sensors.
  - platform: wifi_info
    ip_address:
      name: IP
    ssid:
      name: SSID
    bssid:
      name: BSSID

# Sensors with general information.
sensor:
  # Uptime sensor.
  - platform: uptime
    name: Uptime

  # WiFi Signal sensor.
  - platform: wifi_signal
    name: WiFi Signal
    update_interval: 60s
1 Like