Primeros pasos con HomeAssistant


No hay nada mas interesante que automatizar nuestro hogar con soluciones abiertas que no dependan de fabricantes o empresas que nos puedan apagar nuestras proyectos (como ha sucedido tantas y tantas veces a lo largo del pasado reciente).

Dentro de las soluciones abiertas sin depender de una infraestructura externa(nube) sin duda destaca el binomio HomeAssistant para la parte del servidor y ESP32Home para la parte de los clientes basados en microcontroladores muy asequibles como sin duda son los ESPXX. Veamos de forma practica como podemos empezar a crear nuestro propio sistema domótico sin depender de proveedores externos.

Photo by Frank Cone on Pexels.com

Instalación de HomeAssistant

Para la parte del servidor de HomeAsistant lo ideal es usar un equipo que consuma muy poca energia dado que debería estar encendido permanentemente. Para ello podemos usar un NUC (un mini-pc) , un placa Home Assistant Green o lo mas sencillo: Una Raspberry Pi. 

Básicamente pues necesitaremos los siguientes componentes :

  • Raspberry Pi 4 (Raspberry Pi 3 Modelo B también está bien, pero el Modelo A no tiene suficiente RAM). Las Raspberry Pi son actualmente difíciles de conseguir, utiliza RPilocator para encontrar distribuidores oficiales con stock.
  • Fuente de alimentación para Raspberry Pi 4 o Fuente de alimentación para Raspberry Pi 3.Por favor, recuerde que debe asegurarse de que está utilizando una fuente de alimentación adecuada con su Raspberry Pi. Los cargadores de móvil pueden no ser adecuados, ya que algunos están diseñados para proporcionar sólo la potencia máxima con los teléfonos de ese fabricante. Los puertos USB de su ordenador tampoco suministrarán suficiente energía y no deben utilizarse.
  • Tarjeta Micro SD. Lo ideal es conseguir una que sea Application Class 2 ya que manejan pequeñas E/S de forma mucho más consistente que las tarjetas no optimizadas para albergar aplicaciones. Se recomienda una tarjeta de 32 GB o más.
  • Lector de tarjetas SD. Esto ya forma parte de la mayoría de portátiles, pero puedes comprar un adaptador USB independiente si no tienes uno. La marca no importa, elige la más barata.
  • Cable Ethernet. Necesario para la instalación. Tras la instalación, el Asistente Doméstico puede funcionar con Wi-Fi, pero una conexión Ethernet es más fiable y muy recomendable.

Instalación del Sistema Operativo Home Assistant


Esta guía muestra cómo instalar el sistema operativo Home Assistant en su Raspberry Pi utilizando Raspberry Pi Imager. Si Raspberry Pi Imager no es compatible con su plataforma, puede utilizar Balena Etcher en su lugar.

ESCRIBIR LA IMAGEN EN SU TARJETA SD

1-Descargue e instale el Raspberry Pi Imager en su ordenador como se describe en https://www.raspberrypi.com/software/.

2-Abra el Raspberry Pi Imager y seleccione su dispositivo Raspberry Pi.

ACCEDER AL ASISTENTE DOMÉSTICO

Pocos minutos después de conectar la Raspberry Pi, podrás acceder a tu nuevo Asistente Doméstico.

-Elija el sistema operativo:

  • Seleccione Elegir SO.
  • Selecciona Otros SO específicos > Asistentes domésticos y domótica > Asistente doméstico.
  • Elige el sistema operativo del Asistente Doméstico que coincida con tu hardware (RPi 3 o RPi 4).

-Elija el almacenamiento: Inserte la tarjeta SD en el ordenador(el contenido de la tarjeta se sobrescribirá) y seleccione su tarjeta SD.

-Escriba el instalador en la tarjeta SD: Para iniciar el proceso, seleccione Siguiente. Espere a que el SO Home Assistant se escriba en la tarjeta SD. Una vez terminado el proceso expulse la tarjeta SD e Inserte la SD en su Raspberry PI. NO OLVIDE CONECTAR EL CABLE ETHERNET A SU RASPBERRY PI

ACCEDER AL ASISTENTE DOMÉSTICO

Pocos minutos después de conectar la Raspberry Pi, podrá acceder a su nuevo Asistente Doméstico desde un ordenador o tableta , para ello en el navegador de su sistema de sobremesa, introduzca homeassistant.local:8123.

Si está ejecutando una versión anterior de Windows o tiene una configuración de red más estricta, puede que tenga que acceder al Asistente Doméstico en homeassistant:8123 o http://X.X.X.X:8123 (sustituya X.X.X.X por la dirección IP de su Raspberry Pi).
El tiempo que tarda esta página en estar disponible depende de su hardware. En una Raspberry Pi 4, esta página debería estar disponible en un minuto.

Si no aparece después de 5 minutos en una Pi 4, tal vez la imagen no se escribió correctamente. Intente flashear la tarjeta SD de nuevo, posiblemente incluso pruebe con una tarjeta SD diferente.Si esto no ayuda, vea la salida de la consola en la Raspberry Pi.Para ello, conecte un monitor a través de HDMI.¡Enhorabuena! ¡Ha terminado la configuración de la Raspberry Pi!

Con el sistema operativo del Asistente Domiciliario instalado y accesible, ya puede continuar con la incorporación y configuracion inicial

CONFIGURACION INICIAL DE HOME ASSISTANT

Muy bien, has llegado hasta aquí. La parte difícil está hecha. Como último paso del procedimiento de instalación específico para su dispositivo, has introducido la dirección del dispositivo del Asistente Domiciliario en la barra de direcciones de tu navegador. Normalmente, se trata de http://homeassistant.local:8123/.Si utiliza una versión anterior de Windows o tienes una configuración de red más estricta, puede que tengas que acceder al Asistente Domiciliario a través de homeassistant:8123 o http://X.X.X.X:8123 (sustituye X.X.X.X por la dirección IP de tu dispositivo).Resultado: Ahora verá la pantalla de bienvenida. Dependiendo de su hardware, la preparación puede tardar un poco.

Dependiendo de la versión del software preinstalado, es posible que vea una versión ligeramente diferente de la pantalla de bienvenida. Para ver los archivos de registro, seleccione el punto azul parpadeante.

Una vez instalado el Asistente Hogar, es hora de configurar lo básico.

Ahora crearemos la cuenta del propietario del Asistente Domiciliario. Esta cuenta es una cuenta de administrador. Siempre será capaz de cambiar todo.

1 – Si desea restaurar desde una copia de seguridad de una instalación anterior, seleccione Restaurar desde copia de seguridad. Continúe con el procedimiento de restauración desde copia de seguridad. Ignore el resto de este procedimiento. os siguientes pasos describen cómo crear una nueva instalación, no cómo restaurar a partir de una copia de seguridad.

2 -Si ésta es su instalación inicial, seleccione Crear mi casa inteligente.

3- Introduzca un nombre, un nombre de usuario y una contraseña. Guarde el nombre, el nombre de usuario y la contraseña en un gestor de contraseñas. No hay forma de recuperar las credenciales de propietario. Seleccione Crear cuenta.

4-Introduzca la ubicación de su domicilio. La ubicación se utiliza para rellenar ajustes como la zona horaria, el sistema de unidades y la moneda. También se utiliza para información basada en la ubicación y automatizaciones: por ejemplo, mostrar la previsión meteorológica, abrir las persianas al amanecer o poner en marcha la aspiradora cuando sales de casa.
Si prefiere no enviar su ubicación, puede elegir un lugar alejado de donde vives: siempre podrá cambiar esta información más adelante en los ajustes.

5- Seleccione la información que desea compartir. La opción de compartir está desactivada por defecto. Sin embargo, nos gustaría animarte a compartir algunos de estos datos. Esta información nos ayuda a averiguar qué plataformas necesitamos apoyar y dónde centrar nuestros esfuerzos. Los datos son anónimos y agregados.

6-Una vez que haya terminado, seleccione Siguiente. El Asistente Hogar mostrará todos los dispositivos que haya detectado en tu red. No se alarmes si ves menos elementos de los que se muestran a continuación; siempre puedes añadir dispositivos manualmente más adelante.

7-Por último, seleccione Finalizar. Ahora accederá a la interfaz web del Asistente Domiciliario. Si algunos de sus dispositivos fueron detectados y configurados automáticamente, es posible que este panel predeterminado ya muestre algunos de sus dispositivos.

MANEJO DE HOMEASSISTANT

Ahora que ya estás en el Asistente Hogar, veamos los conceptos más importantes.

Integraciones

Las integraciones son piezas de software que permiten al Asistente Doméstico conectarse a otros programas y plataformas. Por ejemplo, un producto de Philips llamado Hue utilizaría la integración Philips Hue y permitiría al Asistente Domiciliario comunicarse con el controlador de hardware Hue Bridge. Todos los dispositivos compatibles con el Asistente Doméstico conectados al Hue Bridge aparecerían en el Asistente Doméstico como dispositivos.

Para consultar la lista completa de integraciones compatibles consulte la documentación de las integraciones.

Una vez añadida una integración el hardware y/o los datos se representan en el Asistente Domiciliario como dispositivos y entidades.

Entidades
Las entidades son los bloques de construcción básicos para contener datos en Home Assistant. Una entidad representa un sensor actor o función en el Asistente Domiciliario. Las entidades se utilizan para supervisar propiedades físicas o controlar otras entidades.
. Una entidad suele formar parte de un dispositivo o un servicio
. Las entidades tienen estados
.

Dispositivos
Los dispositivos son una agrupación lógica de una o varias entidades. Un dispositivo puede representar un dispositivo físico, que puede tener uno o más sensores. Los sensores aparecen como entidades asociadas al dispositivo. Por ejemplo, un sensor de movimiento se representa como un dispositivo. Puede proporcionar detección de movimiento, temperatura y niveles de luz como entidades. Las entidades tienen estados como detectado cuando se detecta movimiento y despejado cuando no hay movimiento.

En todo el Asistente Domiciliario se utilizan dispositivos y entidades. Por citar algunos ejemplos:

  • Los cuadros de mando pueden mostrar el estado de una entidad . Por ejemplo, si una luz está encendida o apagada.
  • Una automatización puede activarse a partir de un cambio de estado en una entidad. Por ejemplo, una entidad con sensor de movimiento detecta movimiento y activa el encendido de una luz.
  • Una configuración predefinida de color y brillo para una luz guardada como escena.

Automatizaciones
Conjunto de acciones repetibles que se pueden configurar para que se ejecuten automáticamente. Las automatizaciones constan de tres componentes clave:

  • Desencadenantes – eventos que inician una automatización. Por ejemplo, cuando se pone el sol o se activa un sensor de movimiento.
  • Condiciones – pruebas opcionales que deben cumplirse para que pueda ejecutarse una acción pueda ejecutarse. Por ejemplo, si hay alguien en casa.
  • Acciones – interactúan con los dispositivos, como encender una luz.


Para conocer los fundamentos de las automatizaciones consulte la página de conceptos básicos de automatización o intente crear una automatización usted mismo.

Guiones(SCRIPTS)
Al igual que las automatizaciones los scripts son acciones repetibles que pueden ejecutarse. La diferencia entre scripts es que los scripts son componentes que permiten a los usuarios especificar una secuencia de acciones que ejecutará el Asistente Domiciliario al activarse.
y las automatizaciones es que los scripts no tienen disparadores. Esto significa que los scripts no pueden ejecutarse automáticamente a menos que se utilicen en una automatización.
. Los scripts son especialmente útiles si realiza las mismas acciones en diferentes automatizaciones o las desencadena desde un panel de control.

Escenas
Las escenas te permiten crear configuraciones predefinidas para tus dispositivos. De forma similar al modo de conducción de los teléfonos o a los perfiles de conductor de los coches, puede cambiar un entorno para adaptarlo a ti. Por ejemplo, la escena de ver películas
puede atenuar la iluminación, encender el televisor y subir el volumen. Esto puede guardarse como una escena y utilizarla sin tener que configurar cada dispositivo.

Complementos (ADD-ONS)
Dependiendo del tipo de instalación, puedes instalar complementos de terceros. Los complementos suelen ser aplicaciones que pueden ejecutarse con el Asistente Doméstico, pero proporcionan una forma rápida y sencilla de instalar, configurar y ejecutar dentro del Asistente Doméstico. Los complementos proporcionan funciones adicionales, mientras que las integraciones conectan el Asistente Domiciliario con otras aplicaciones.

Timbre a distancia por wifi


Hoy en dia es relativamente asequible poder abordar proyectos con un nivel de acabado excepcional usando tecnologia de impresión 3d por ejemplo , y al mismo tiempo emplear componentes muy compactos, económicos y muy sencillos de programar además sin necesidad de soldar nada.

En este post vamos a ver un interesante proyecto de Giovanni Aggiustatutto en su proyecto de timbre a distancia por Wifi , que básicamente se compone de un módulo de micrófono de detección compatible con Arduino y dos módulos compatibles con ESP8266 : uno para la parte de transmisión y otro para la parte de recepción. Además el circuito se completa con dos cajas impresas en 3D , aunque por su tamaño se puede usar cualquier otro soporte.

El resultado desde luego queda totalmente sorprendente como podemos ver en la imagen.

Obviamente este proyecto puede servir para reenviar el timbre a otro lugar gracias a la cobertura wifi, lo cual lo hace muy versatil por ejemplo para extender la llamada del clasico interfono, la llamada de un intercomunicador, la llamada normal de un telefono fijo/inalambrico y como no como sencilla alarma por sonido.

La electrónica de este proyecto, aunque nos pueda asustar, en realidad es bastante sencilla porque todo pasa por el módulo detector que viene ya ensamblado pero que debemos ajustar al nivel de ruido en que sea detectado la señal de timbre que generara un pulso de disparo que será recogido por un ESP8266 y enviado hacia el otro ESP8266 que presentara una alerta.

El AZDelivery KY038 es un módulo de detección de sonido de alta sensibilidad ideal para muchos proyectos y aplicaciones, por ejemplo para sistemas de alarma sonora (como el de este proyecto).

El Modulo de micrófono cuenta con un micrófono de condensador eléctrico y una salida de señal de un solo canal. La señal de salida de bajo nivel se utiliza para la luz de control de sonido. Este módulo utiliza un micrófono en miniatura para detectar los niveles de sonido. Es crucial que dispone de un comparador basado en un CI LM393 con un potenciómetro para ajustar el nivel disparo para producir una salida digital de nivel alto, que es el que utilizaremos para transmitir la señal de alarma.

Componentes

Estos son los componentes del proyecto:

2 mini placas ESP8266 Wemos D1 (en realidad puede usarse también un ESP32 adaptando el código y las librerías correspondientes)
5 LEDs rojos
1 LED verde
6 resistencias de 330 ohmios para los LEDs
1 zumbador fuerte
1 interruptor
1 módulo sensor de sonido Arduino
Conector JST de 3 pines
Cable de JST a puente
Conectores Jumper
Perfboard
Cable
8 insertos roscados M3
8 tornillos M3x12 mm

El circuito

El receptor no puede ser mas sencillo pues básicamente se compone de un pequeño display de 5 leds conectados directamente a los 5 puertos (configurados como salidas digitales del ESP8266) mediante sendas resistencias de 680 ohmios . Además también para que sea perceptible realmente la llamada, usaremos un pequeño zumbador piezoeléctrico de alta potencia conectado también a un puerto del microcontrolador con un interruptor en serie para poder cortar el sonido y no moleste si es persistente porque si lo veremos con una indicación luminosa.

La parte del transmisor es si cabe mas simple pues únicamente se compone del detector de sonido cuya salida se conecta a un pin de entrada digital del ESp8266.

En este punto es importante estudiar la parte que detecta cuando suena algun sonido fuerte como el timbre del teléfono o del interfono, pues para detectar cuando suena el teléfono, se utiliza un módulo sensor de sonido hecho para Arduino, que lleva un pequeño micrófono.

Estos módulos son muy sencillos de usar porque en los pines hay conexiones para la alimentación y una salida digital, que se activa cuando el ruido que escucha el micrófono es superior a un cierto umbral, que fijamos con el potenciómetro. Este micrófono se colocará cerca de la base del teléfono o interfono lo mas cerca del timbre o altavoz interno (en el caso de un telefono convencional) o en caso de un interfono cerca del altavoz del micro teléfono o del zumbador, por lo que activará el timbre adicional cuando haya una llamada.

Montaje

La caja exterior que contendrá la placa transmisora ESP8266 conectada al micrófono será igual que la caja del timbre, pero en la parte trasera tendrá un conector para conectar el micrófono y en la parte delantera sólo tendrá un LED, para indicar cuando se detecta un sonido y es transmitido al otro modulo receptor.

De forma practica soldamos un conector JST de 3 pines en un pequeño trozo de placa perforada , al que conectamos tres cables para 3,3v, GND y la señal digital del módulo del micrófono. Estos tres cables van a los pines correspondientes de la placa.Para conectarle el módulo de micrófono utilizamos un cable JST a jumper, con el conector JST enchufado a la caja que acabamos de hacer y el conector jumper enchufado a GND, positivo y salida digital del módulo de micrófono.

La caja para la placa conectada al receptor es exactamente igual a la del transmisor, para dar continuidad al diseño. El otro ESP8266 configurado como receptor puede ir en una placa de prototipos y encaminar los pines del ESP8266 necesarios para el módulo del micrófono y los LEDs de estado que conectaremos a la placa mediante conectores jumper. Esta vez la resistencia para el LED en la placa, y dos cables directamente entre los dos pines de un LED rojo y los dos puentes correspondientes de la placa. También esta vez pegamos el LED en el soporte del LED, y pegamos también el soporte a la caja. Luego pegamos el conector JST en el agujero del panel trasero de la caja. Al igual que con el timbre, pegamos la placa dentro de la caja con un trozo de plástico debajo, para que el puerto USB quede alineado con el agujero del panel. Como última cosa cerramos la tapa con tornillos M3 atornillados en los agujeros roscados, y podemos decir que también el sensor de sonido está terminado.

ESP-Now

Antes de realizar cualquier conexión eléctrica, primero tenemos que subir el código a las dos placas ESP8266. Para conectar el ESP8266 que estará cerca del teléfono al que está conectado al zumbador y a los LEDs, utilizamos el protocolo de comunicación WiFi ESP-NOW, que es una librería proporcionada por Espressif, el fabricante del chip ESP.

ESP-Now es otro protocolo de comunicación inalámbrica desarrollado por Lexin, que puede permitir que múltiples dispositivos se comuniquen sin Wi-Fi sin usar Wi-Fi. Este protocolo es similar a un bajo consumo de energía de una conexión inalámbrica de 2.4GHz comúnmente común en el dispositivo de ratón inalámbrico debe emparejarse antes de comunicarse. Después del emparejamiento, la conexión entre los dispositivos es continua, punto a punto, y no se requiere un protocolo de apretón de manos. Es una breve transmisión de datos y una tecnología de comunicación rápida no conectada que permite que los controladores de baja potencia controlen directamente todos los dispositivos inteligentes sin conectar enrutadores. Es adecuado para luces inteligentes, control remoto y retorno de datos del sensor.

Después de usar la comunicación ESP-Now, si un determinado dispositivo se apaga repentinamente, siempre que se reinicie, se conecta automáticamente al nodo correspondiente para volver a comunicarse.

ESP-Now admite las siguientes características:

  • Paquete de paquete de transmisión única o paquete de transmisión única sin comunicación cifrada;
  • Uso mixto de equipos de emparejamiento de cifrado y equipos no cifrados;
  • Se pueden transportar datos de carga útil que pueden transportar hasta 250 bytes;
  • Configuración de soporte para enviar una función de devolución de llamada para notificar a la fallas o éxito de envío de envío o éxito de envío de la capa de aplicación.

Del mismo modo, hay algunas restricciones en ESP-Now:

  • Los paquetes de transmisión no son compatibles temporalmente;
  • Hay restricciones en el dispositivo de emparejamiento cifrado, y el modo de estación admite hasta 10 dispositivos de emparejamiento encriptados; el modo híbrido SoftAP o SoftAP + Station admite hasta 6 dispositivos de emparejamiento cifrados en el modo mixto. Los dispositivos de emparejamiento no cifrados admiten varios, y el número total de dispositivos de cifrado no es más de 20;
  • La carga útil efectiva se limita a 250 bytes.

Elegimos esta biblioteca porque es muy fácil de usar configurando ambos ESP como una comunicación unidireccional.

FIRMWARE

En la parte transmisora usaremos los pines 12 (ledPin) y el pin 14 ( pic Pin), respectivamente el pin 12 al que conectaremos el led indicador de detección de sonido y el pin 14 al que conectaremos la salida digital del modulo detector de sonido.

Antes de subir el código a las dos placas, necesitamos saber la dirección MAC de la placa que usaremos como receptor. Para ello, podemos subir el siguiente boceto a través del IDE de Arduino.

#include "WiFi.h"

//#include <ESP8266WiFi.h>

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_MODE_STA);
  //WiFi.mode(WIFI_AP_STA);
  Serial.println(WiFi.macAddress());
}

void loop() {
}

Una vez subido el sketch, abrimos el monitor serie y esperamos a que aparezca la dirección MAC de la placa. Esta dirección hay que copiarla de ahí y pegarla en el código de la placa transmisora, antes de subirla.

#include <ESP8266WiFi.h>
#include <espnow.h>

//Aquí es donde se inserta la dirección MAC en el código.
// REPLACE WITH RECEIVER MAC Address (example 34:94:54:8E:13:20)
uint8_t broadcastAddress[] = {0x34, 0x94, 0x54, 0x8E, 0x13, 0x20};


// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
  bool isRinging;
} struct_message;


// Create a struct_message called myData
struct_message myData;


unsigned long lastTime = 0;  
unsigned long timerDelay = 800;  // send readings timer


int micStatus = 0;


const int micPin = 14;  // D5
const int ledPin = 12;  // D6


// Callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("Last Packet Send Status: ");
  if (sendStatus == 0){
    Serial.println("Delivery success");
  }
  else{
    Serial.println("Delivery fail");
  }
}

void setup() {
  // Set microphone pin as input
  pinMode(micPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);

  // Init Serial Monitor
  Serial.begin(74880);

  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);


  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }


  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_register_send_cb(OnDataSent);

  // Register peer
  esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}

void loop() {
  if (digitalRead(micPin) == HIGH) {
    micStatus = 1;
    digitalWrite(ledPin, HIGH);
  }

  if ((millis() - lastTime) > timerDelay) {
    if (micStatus == 0) {
      myData.isRinging = false;
      digitalWrite(ledPin, LOW);
    }


    if (micStatus == 1) {
      myData.isRinging = true;
      micStatus = 0;
    }


    // Send message via ESP-NOW
    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

Respecto al receptor conectaremos cuatro leds indicadores de presencia de sonido en los pines 12,14,0 y 4 conformando así una especie de vu-meter . Además en el pin 13 conectaremos un led de estado , y para terminar , para que sea de verdad perceptible, en el pin 5 conectaremos un zumbador de alta potencia.

El código de la placa receptora es el siguiente, y puede cargarse sin modificaciones.

#include <ESP8266WiFi.h> 
#include <espnow.h>


// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
  bool isRinging; 
} struct_message;


// Create a struct_message called myData
struct_message myData;


const int led1 = 12;  // LEDs from the top to the bottom of the device
const int led2 = 14;
const int led3 = 0;
const int led4 = 4;
const int statusLed = 13;
const int buzzer =  5;
const long buzzerTime = 200 ;
long timeFromLastUpdate = 0;
unsigned long previousMillis = 0;
const long interval = 500;


bool produceSound = false;
bool produceLight = false;
bool flag = false;
bool previousFlag = false;
bool hasIncremented = false;
int numberOfBlinks = 10;


// Callback function that will be executed when data is received
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.println("Data received!");


  if (myData.isRinging == false) {
    produceSound = false;

    digitalWrite(statusLed, LOW);
    timeFromLastUpdate = millis();
  }


  if (myData.isRinging == true) {
    digitalWrite(statusLed, LOW);
    timeFromLastUpdate = millis();
    //produceSound = true;
    //produceLight = true;


    //numberOfBlinks = 0;
  }
}

void setup() {
  // Set LED and ring pin as output
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(statusLed, OUTPUT);
  pinMode(buzzer, OUTPUT);

  // Initialize Serial Monitor
  Serial.begin(74880);

  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);


  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  esp_now_register_recv_cb(OnDataRecv);
}


void loop() {
  unsigned long currentMillis = millis();

  if ((timeFromLastUpdate + 10000) < millis()) {
    digitalWrite(statusLed, HIGH);
  } 


  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    flag = !flag;
  }

  callRoutine();
  blinkLeds();
  soundBuzzer();
}


void blinkLeds() {
  if (flag == true && (produceLight == true || numberOfBlinks <= 5) && hasIncremented == false) {
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    numberOfBlinks++;
    hasIncremented = true;

    produceLight = false;

    Serial.print("on ");
    Serial.println(numberOfBlinks);
  }


  if (flag == false) {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    Serial.println("off");


    hasIncremented = false;
  }
}


void soundBuzzer() {
  if (flag == true && produceSound == true) {
    digitalWrite(buzzer, HIGH);
    produceSound = false;
  }


  if (flag == false) {
    digitalWrite(buzzer, LOW);
  }
}


void callRoutine() {
  if (myData.isRinging == true && previousFlag != flag) {
    produceSound = true;
    produceLight = true;
    numberOfBlinks = 0;
  }


  else {
    previousFlag = flag;
  }
}

Mas información en https://www.instructables.com/Wireless-Loud-Phone-Ringer-Help-Elderly-With-Elect/