As earlier mentioned I’m a big fan of local solutions, part because of security and knowing where your data is stored and part being ownership.
Too many times a cloud solution leads to sudden risk of privacy, data or even your devices. Last seen with Sonos excluding old devices.
Therefore I went for a local doorbell solution.

The parts I have been using is a cheap TP C100 security camera (with rtsp support) and an Aqara WXKG11LM button.
For weatherproofing I ordered this one. It’s not a perfect fit because it was ment for the TP KC100 but good enough.

The doorbell camera can also be included in a security system with rtsp. Can recommend Blue Iris and Milestone.

Adjust to your liking!

Pushover notification:

Lovelace:

camera_image: camera.main_door_cam_stream
image_click: play
entities:
  - binary_sensor.main_door_camera_motion
  - switch.street_lights
style: |
  ha-card {
    border-radius: 15px;
  }
title: Main door
type: picture-glance

Camera:

- platform: ffmpeg
  name: Main door cam stream
  input: -rtsp_transport tcp -i rtsp://xxxcam:looooongpassword@ip.ip.ip.ip:port/stream1

Script:

pause_media_doorbell:
  alias: Doorbell pause media
  sequence:
  - service: remote.send_command
    entity_id: remote.living_room_hub
    data:
      device: xxxxxx
      command: Pause
  - service: remote.send_command
    entity_id: remote.living_room_hub
    data:
      device: xxxxxx
      command: Pause

hallway_ceiling1_white_flash:
  alias: Hallway ceiling 1 white flash
  mode: single
  sequence:
  - service: light.turn_on
    target:
      entity_id: light.hallway_ceiling_1
    data:
      brightness: 255
      flash: long
  - delay: '5'
  - service: light.turn_off
    target:
      entity_id: light.hallway_ceiling_1
      
hallway_ceiling2_white_flash:
  alias: Hallway ceiling 2 white flash
  mode: single
  sequence:
  - service: light.turn_on
    target:
      entity_id: light.hallway_ceiling_2
    data:
      brightness: 255
      flash: long
  - delay: '5'
  - service: light.turn_off
    target:
      entity_id: light.hallway_ceiling_2

kitchen_lamp_purple_flash:
  alias: Kitchen lamp purple flash
  mode: single
  sequence:
  - service: light.turn_on
    data:
      xy_color: [0.291,0.141]
      brightness: 255
      flash: long
      entity: light.kitchen_lamp
  - delay: '5'
  - service: light.turn_off
    data:
      entity_id: light.kitchen_lamp

sofa_lamp_purple_flash:
  alias: Sofa lamp purple flash
  mode: single
  sequence:
  - service: light.turn_on
    data:
      xy_color: [0.291,0.141]
      brightness: 255
      flash: long
      entity: light.sofa_lamp
  - delay: '5'
  - service: light.turn_off
    data:
      entity_id: light.sofa_lamp

living_room_lamp_purple_flash:
  alias: Living room lamp purple flash
  sequence:
  - service: light.turn_on
    data:
        xy_color: [0.291,0.141]
        brightness: 255
        flash: long
        entity_id: light.living_room_lamp
              
office_ceiling_white_flash:
  alias: Office ceiling white flash
  mode: single
  sequence:
  - service: light.turn_on
    target:
      entity_id: light.office_ceiling
    data:
      brightness: 255
      flash: long
  - delay: '5'
  - service: light.turn_off
    target:
      entity_id: light.office_ceiling

Group:

doorbell_notification_script:
name: Doorbell script
entities:
- script.hallway_ceiling1_white_flash
- script.hallway_ceiling2_white_flash
- script.kitchen_lamp_purple_flash
- script.living_room_lamp_purple_flash
- script.sofa_lamp_purple_flash
- script.office_ceiling_white_flash

Automation:

# Doorbell notification lights and voice
- alias: Doorbell notification lights and voice
  id: doorbell_notification_lights_voice
  description: 'Flash lights light blue when someone presses the doorbell'
  trigger:
  - platform: state
    entity_id: sensor.doorbell_action
    to: hold
  - platform: state
    entity_id: sensor.doorbell_action
    to: release
  condition:
  - condition: state
    entity_id: group.all_people
    state: 'home'
  action:
  - service: homeassistant.turn_on
    entity_id: script.pause_media_doorbell
  - service: rest_command.rhasspy_speak
    data_template:
      payload_data: "You have visitors at the main door!"
  - service: scene.create
    data_template:
      scene_id: doorbell_notification_revert
      snapshot_entities: 
      - light.hallway_ceiling_1
      - light.hallway_ceiling_2
      - light.kitchen_lamp
      - light.sofa_lamp
      - light.living_room_lamp
      - light.office_ceiling
      - light.attic_ceiling
  - service: homeassistant.turn_on
    entity_id: group.doorbell_notification_script
  - delay: '20'
  - service: scene.turn_on
    data:
      entity_id: scene.doorbell_notification_revert
      
# Doorbell notification pushover and tv
- alias: Doorbell notification_pushover_tv
  id: doorbell_notification_pushover_tv
  trigger:
  - platform: state
    entity_id: sensor.doorbell_action
    to: hold
  - platform: state
    entity_id: sensor.doorbell_action
    to: release
  condition: []
  action:
  - choose:
# Tv off
    - conditions:
      - condition: and
        conditions:
          - condition: state
            entity_id: remote.living_room_hub
            state: 'off'
      sequence:
      - service: timer.cancel
        entity_id: timer.doorbell
      - service: timer.start
        entity_id: timer.doorbell
      - service: camera.snapshot
        data:
          entity_id: camera.main_door_cam_stream
          filename: '/config/www/snapshots/main_door_camera_snapshot.jpg'
      - service_template: notify.pushover
        data_template:
          title: "Doorbell rang!"
          message: "Visitors at the main door!"
          data:
            attachment: /config/www/snapshots/main_door_camera_snapshot.jpg
            html: "1"
            sound: "bike"
# User home and tv on
    - conditions:
      - condition: and
        conditions:
          - condition: state
            entity_id: group.all_people
            state: 'home'
          - condition: state
            entity_id: remote.living_room_hub
            state: 'on'
      sequence:
      - service: timer.cancel
        entity_id: timer.doorbell
      - service: timer.start
        entity_id: timer.doorbell
      - service: camera.snapshot
        data:
          entity_id: camera.main_door_cam_stream
          filename: '/config/www/snapshots/main_door_camera_snapshot.jpg'
      - service: notify.living_room_media_center
        data_template:
          title: "Doorbell rang!"
          message: "Visitors at the main door!"
          data: 
            duration: 15
            font-size: max
            transparency: 50%
            position: bottom-right
            image:
              path: "/config/www/snapshots/main_door_camera_snapshot.jpg"
      - service_template: notify.pushover
        data_template:
          title: "Doorbell rang!"
          message: "You have visitors at the main door!"
          data:
            attachment: /config/www/snapshots/main_door_camera_snapshot.jpg
            html: "1"
            sound: "bike"