So after searching for a doorbell camera with battery and wireless I came to the conclusion that even we are in 2025 there is no good solution that is cost efficent, can work with HA and is local.
So i took the cheapest blink doorbell and and gave it a simple hardware mod for this scenario:
When the doorbell is pressed I get a message on my smartphone with video.
When the doorbell is pressed, our stationary HA display get a pop up and plays a ringtone.
The blink doorbell have to beconfigurated that it triggers the normal chime → the relais inside gets triggered.
For that I used a ESP32-C3 Super Mini that is connected to the battery that it only is powered and starts when the button on the blink is pressed.
The ESP32-C3 Super fits on the empty part where the reset button is.
When it gets powered, it connects to the local wifi and sends a webhook request to HA.
Here is the code that have to be uploaded on the ESP32:
I created an automation that uses a webhook as trigger. Important here: It have to be a GET webhook.
When triggered our stationary HA client gets a pop up (addon Browser Mod) and plays a ringtone (play song on mediaplayer on the client)
Conclusion: 25€ paid for the blink doorbell + 3€ for the ESP32. Now the doorbell can also ring when there is no internet (without video but it can still play a sound).
I have done everything as described however when I push the doorbell I hear the relay click however the esp32 does not run, if I plug in the esp32 to a power supply using usb c it works fine, my guess is that it doesnt get enough power when the bell is pressed? Does this look correct
mine is not working? Any idea what can be wrong ? i dont have any experience with electricity but tried to build the same with the board. with USB cable connected to the board everything works fine, but not with the board connected to screws and batteries … how can i activate the 12v in the app ?
Jus to be clear, there are some things that need to be clarified:
In the Blink App you need yo configure the ring to allow a Digital Chime integration. Then you configure the chime to last 5 seconds. What this actually does is to close the circuit between both screws.
You connect the ESP32-C6 (this is what I used) 3V to the battery in the right positive and the ground to the screw in the right. Then you connect the screw in the left to the negative connection in the battery in the left.
The actual configuration of the script needs to be a “POST” webhook intead of “GET”.
This is the actual code:
#include <WiFi.h>
#include <HTTPClient.h>
// Wi-Fi credentials
const char* ssid = "YOUR SSID";
const char* password = "YOURPASS";
// Home Assistant Webhook URL
const char* webhook_url = "http://HASSIPADDRESS:8123/api/webhook/WEBHOOKID";
void enableExternalAntenna() {
// Set GPIO3 LOW to enable RF switch control
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
// Set GPIO14 HIGH to select external antenna
pinMode(14, OUTPUT);
digitalWrite(14, HIGH);
}
void setup() {
Serial.begin(115200);
delay(100); // Give Serial time to start
enableExternalAntenna(); // Enable external antenna
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(ssid, password);
// Wait for connection
int retries = 0;
while (WiFi.status() != WL_CONNECTED && retries < 40) {
delay(250);
Serial.print(".");
retries++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nâś… WiFi connected");
Serial.println("IP address: " + WiFi.localIP().toString());
} else {
Serial.println("\n❌ Failed to connect to Wi-Fi");
return;
}
delay(1000); // Optional delay to ensure stable connection
// Send Webhook
HTTPClient http;
http.begin(webhook_url);
http.setTimeout(5000); // 5s timeout
http.addHeader("Content-Type", "application/json");
// JSON payload
String body = "{\"device\":\"esp32\",\"event\":\"ping\"}";
int httpCode = http.POST(body);
Serial.printf("HTTP status: %d\n", httpCode);
if (httpCode > 0) {
String payload = http.getString();
Serial.println("Response: " + payload);
} else {
Serial.printf("Request failed: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
void loop() {
// Nothing here for now
}
you get the webhook from automations in HASS where you need to create the automation script:
when WEBHOOK is received
if
then
In my code I used the external antenna of the ESP32-C6 since in my case the doorbell is not that close of the acces-point, thats why I recommend this one since the ESP32-C6 support wireless antenna connector ( IPEX MHF‑1) and it’s small enough to fit inside the blink.
If you have issues it’s probably because the integrated antenna in the ESP32 is way too small to reach the wireless access-point.
If everything is ok, when the doorbell button is pressed, the relay inside the blink closes the circuit and the ESP32 gets power. It gets connect to the wireless network and immediately “POSTS” the webhook.
That’s it. It works perfectly. I use a Ring Chime that is integrated with HASS and it’s chimes inside whe the Blink doorbell button is pressed.