ESP32-CAM as doorbell with camera Topic is solved

Moderator: leecollings

Post Reply
stack
Posts: 36
Joined: Friday 17 July 2020 15:58
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.11794
Contact:

Re: ESP32-CAM as doorbell with camera

Post by stack »

hoeby wrote: Sunday 26 July 2020 8:06 It is not available in the code.
But i can look over it, if it can be added.

If i can add i will upload the beta code. You have to test it yourself, i don't have the time at the moment to do a full check of the code
that would be great! thanks
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

I added the OV2640 camera options.
But noticed, be carefull. First time commented all options. But my ESP32cam wasn't starting up anymore.
Could be the issue that it got its power from the programmer, which is maybe to low. But said, at the moment i don't have the time to test everything.
Therefor i commented a lot of options. Try it and see if it is what you are looking for.

Go to line 729, you will see this part of the code.
Try it, but be carefull. It is a beta function.

Code: Select all

  sensor_t * s = esp_camera_sensor_get();
  s->set_brightness(s, 0);     // -2 to 2
  s->set_contrast(s, 0);       // -2 to 2
//  s->set_saturation(s, 0);     // -2 to 2
//  s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
//  s->set_whitebal(s, 1);       // 0 = disable , 1 = enable
//  s->set_awb_gain(s, 1);       // 0 = disable , 1 = enable

The complete code

Code: Select all

// ESP32Cam Doorbell releases
// V1.1.1 (04-05-2020) - BETA - Start of code
// V1.1.2 (17-05-2020) - First release
// V1.2.1 (26-07-2020) - BETA - OV2640 camera options added


#include "esp_camera.h"
#include <WiFi.h>
#include "esp_timer.h"
#include "img_converters.h"
#include "Arduino.h"
#include "fb_gfx.h"
#include "soc/soc.h" 
#include "soc/rtc_cntl_reg.h"  
#include "esp_http_server.h"
#include <PubSubClient.h>
#ifndef MQTT_MAX_PACKET_SIZE 
 #define MQTT_MAX_PACKET_SIZE 512 
#endif
#include <HTTPClient.h>

//**************************************************************************************************************************************************
//**                                                         Welke URL worden aangemaakt                                                          **
//**************************************************************************************************************************************************
//   http://IP/stream  = live camera stream
//   http://IP/capture = capture image 
//   http://IP/on      = switch ledPin1 on (light from flash button, or standby light from rgb button)
//   http://IP/off     = switch ledPin1 off (light from flash button, or standby light from rgb button)

//   The idea about the last 2 functions, is to disable the led in the button at night situation. 

//**************************************************************************************************************************************************
//**                                                             START SETTINGS START                                                             **
//**************************************************************************************************************************************************

//**************************************************************************************************************************************************
//**                                                           Setting Wifi credentials                                                           **
//**************************************************************************************************************************************************
const char* ssid       = "WiFi-SSID";                           //Wifi SSID waarop ESP32-cam zich moet aanmelden.
const char* password   = "WiFi-Password";                       //Bijbehorend wachtwoord welke bij het gekozen SSID behoort.

//**************************************************************************************************************************************************
//**                                                              IP settings device                                                              **
//**************************************************************************************************************************************************
//#define FixedIP                                               //Haal de // weg om fixed IP te gebruiken, anders staat deze op DHCP.
#define IPaddr            192,168,***,***                       //Voer IP adres is, digits tussen komma's invoeren.
#define SubnetAddr        255,255,255,0                         //Voer subnet mask in, digits tussen de komma's invoeren.
#define GatewayAddr       192,168,***,***                       //Voer Gateway adres in, digits tussen de komma's invoeren. 
                                                                //Als device geen internet nodig heeft, voer een fake gateway in. 

//**************************************************************************************************************************************************
//**                                                          Setting Domotcz credentials                                                         **
//**************************************************************************************************************************************************
String DomoticzIP      = "192.168.***.***";                     //Domoticz Server IP adres.
String DomoticzPort    = "8080";                                //Domoticz Server poort adres.
#define DomoticzIDX      "***"                                  //Domoticz IDX nummer welke geschakeld moet worden.
String DomoticzSwitch  = "On";                                  //Domoticz IDX state. Bij activeren ingang, moet IDX dan On of Off gestuurd worden?  
//#define DomoticzResetSwitch                                     //Haal de // weg, dan wordt er een tegengesteld commando van DomoticzSwitch gestuurd 

//**************************************************************************************************************************************************
//**                                                         Setting Domoticz data-signal                                                         **
//**************************************************************************************************************************************************
#define DomoticzHttpJson                                        //Haal // weg om HTTP/JSON commando te gebruiken naar Domoticz
//#define DomoticzMQTT                                          //Haal // weg om MQTT commando te gebruiken naar Broker/Domoticz

//**************************************************************************************************************************************************
//**                                                                 Setting MQTT                                                                 **
//**************************************************************************************************************************************************
const char* mqtt_server = "192.168.***.***";                    //MQTT Broker IP adres
#define mqtt_port 1883                                          //MQTT Broker port adres
#define MQTT_USER ""                                            //MQTT username
#define MQTT_PASSWORD ""                                        //MQTT password
const char* Subscriber  = "ESP32CAM/Input";                     //MQTT Subscriber name
const char* topicin     = "domoticz/in";                        //MQTT Topic name
// For switching ledPin1 ON, payload = on
// For switching ledPin1 OFF, payload = off
 
//**************************************************************************************************************************************************
//**                                                              Setting PUSH button                                                             **
//**************************************************************************************************************************************************
#define FlashButton                                             //Verwijder de // om Button met enkele LED te gebruiken
//#define RgbButton                                            //Verwijder de // om RGB LED Button te gebruiken
const int buttonPin1 = 12;                                      //GPIO nummer voor de ingang van drukknop.
#define ButtonTimer 10000                                       //De tijd dat LED aangestuurd is. 

//**************************************************************************************************************************************************
//**                                                              Setting LED button                                                              **
//**************************************************************************************************************************************************
const int ledPin1 =  13;                                        //ledPin1 is gebruikt voor flashbutton en standby licht RGB knop
const int ledPin2 =  14;                                        //ledPin2 schakelt bij drukken RGB knop
const int ledPin3 =  15;                                        //ledPin3 schakelt bij drukken RGB knop

//**************************************************************************************************************************************************
//**                                                              Setting Camera type                                                             **
//**************************************************************************************************************************************************
#define CAMERA_MODEL_AI_THINKER
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WITHOUT_PSRAM

// Not tested with this model
//#define CAMERA_MODEL_WROVER_KIT

//**************************************************************************************************************************************************
//**                                                                END SETTINGS END                                                              **
//**************************************************************************************************************************************************

char msgToDomoticZ[120];  
const char* msgContact  = "{\"command\": \"switchlight\", \"idx\": ";  
const char* msgContactOn = ", \"switchcmd\": \"On\"}";  
const char* msgContactOff = ", \"switchcmd\": \"Off\"}";  

int buttonState1 = 0;        
String ledState;
WiFiClient wifiClient;
PubSubClient client(wifiClient);
unsigned long check_wifi = 30000;
int repeatflash;

#define PART_BOUNDARY "123456789000000000000987654321"

typedef struct {
        httpd_req_t *req;
        size_t len;
} jpg_chunking_t;

static size_t jpg_encode_stream(void * arg, size_t index, const void* data, size_t len){
    jpg_chunking_t *j = (jpg_chunking_t *)arg;
    if(!index){
        j->len = 0;
    }
    if(httpd_resp_send_chunk(j->req, (const char *)data, len) != ESP_OK){
        return 0;
    }
    j->len += len;
    return len;
}

#if defined(CAMERA_MODEL_WROVER_KIT)
  #define PWDN_GPIO_NUM    -1
  #define RESET_GPIO_NUM   -1
  #define XCLK_GPIO_NUM    21
  #define SIOD_GPIO_NUM    26
  #define SIOC_GPIO_NUM    27
  
  #define Y9_GPIO_NUM      35
  #define Y8_GPIO_NUM      34
  #define Y7_GPIO_NUM      39
  #define Y6_GPIO_NUM      36
  #define Y5_GPIO_NUM      19
  #define Y4_GPIO_NUM      18
  #define Y3_GPIO_NUM       5
  #define Y2_GPIO_NUM       4
  #define VSYNC_GPIO_NUM   25
  #define HREF_GPIO_NUM    23
  #define PCLK_GPIO_NUM    22

#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     25
  #define SIOC_GPIO_NUM     23
  
  #define Y9_GPIO_NUM       19
  #define Y8_GPIO_NUM       36
  #define Y7_GPIO_NUM       18
  #define Y6_GPIO_NUM       39
  #define Y5_GPIO_NUM        5
  #define Y4_GPIO_NUM       34
  #define Y3_GPIO_NUM       35
  #define Y2_GPIO_NUM       32
  #define VSYNC_GPIO_NUM    22
  #define HREF_GPIO_NUM     26
  #define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_M5STACK_WITHOUT_PSRAM)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     25
  #define SIOC_GPIO_NUM     23
  
  #define Y9_GPIO_NUM       19
  #define Y8_GPIO_NUM       36
  #define Y7_GPIO_NUM       18
  #define Y6_GPIO_NUM       39
  #define Y5_GPIO_NUM        5
  #define Y4_GPIO_NUM       34
  #define Y3_GPIO_NUM       35
  #define Y2_GPIO_NUM       17
  #define VSYNC_GPIO_NUM    22
  #define HREF_GPIO_NUM     26
  #define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_AI_THINKER)
  #define PWDN_GPIO_NUM     32
  #define RESET_GPIO_NUM    -1
  #define XCLK_GPIO_NUM      0
  #define SIOD_GPIO_NUM     26
  #define SIOC_GPIO_NUM     27
  
  #define Y9_GPIO_NUM       35
  #define Y8_GPIO_NUM       34
  #define Y7_GPIO_NUM       39
  #define Y6_GPIO_NUM       36
  #define Y5_GPIO_NUM       21
  #define Y4_GPIO_NUM       19
  #define Y3_GPIO_NUM       18
  #define Y2_GPIO_NUM        5
  #define VSYNC_GPIO_NUM    25
  #define HREF_GPIO_NUM     23
  #define PCLK_GPIO_NUM     22
#else
  #error "Camera model not selected"
#endif

static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";

httpd_handle_t stream_httpd = NULL;

static esp_err_t stream_handler(httpd_req_t *req){
  camera_fb_t * fb = NULL;
  esp_err_t res = ESP_OK;
  size_t _jpg_buf_len = 0;
  uint8_t * _jpg_buf = NULL;
  char * part_buf[64];

  res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
  if(res != ESP_OK){
    return res;
  }

  while(true){
    fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("------- New message: Camera failure -----");
      Serial.println("Camera capture failed");
      Serial.println("");
      res = ESP_FAIL;
    } else {
      if(fb->width > 400){
        if(fb->format != PIXFORMAT_JPEG){
          bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
          esp_camera_fb_return(fb);
          fb = NULL;
          if(!jpeg_converted){
            Serial.println("------- New message: JPEG Compression -----");
            Serial.println("JPEG compression failed");
            Serial.println("");
            res = ESP_FAIL;
          }
        } else {
          _jpg_buf_len = fb->len;
          _jpg_buf = fb->buf;
        }
      }
    }
    if(res == ESP_OK){
      size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
      res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
    }
    if(fb){
      esp_camera_fb_return(fb);
      fb = NULL;
      _jpg_buf = NULL;
    } else if(_jpg_buf){
      free(_jpg_buf);
      _jpg_buf = NULL;
    }
    if(res != ESP_OK){
      break;
    }
    //Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
  }
  return res;
}

static esp_err_t on_handler(httpd_req_t *req){
        #define OKon "HTTP/1.1 200 OK, Output On"
        httpd_resp_send(req, OKon, strlen(OKon));
        GpioVarOn();
        }  

static esp_err_t off_handler(httpd_req_t *req){
        #define OKoff "HTTP/1.1 200 OK, Output OFF"
        httpd_resp_send(req, OKoff, strlen(OKoff));
        GpioVarOff();
        }  

static esp_err_t capture_handler(httpd_req_t *req){
    camera_fb_t * fb = NULL;
    esp_err_t res = ESP_OK;
    int64_t fr_start = esp_timer_get_time();

    fb = esp_camera_fb_get();
    if (!fb) {
        Serial.println("------- New message: Camera capture failure -----");
        Serial.println("Camera capture failed");
        Serial.println("");
        httpd_resp_send_500(req);
        return ESP_FAIL;
    }

    httpd_resp_set_type(req, "image/jpeg");
    httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg");

    size_t out_len, out_width, out_height;
    uint8_t * out_buf;
    bool s;
    {
        size_t fb_len = 0;
        if(fb->format == PIXFORMAT_JPEG){
            fb_len = fb->len;
            res = httpd_resp_send(req, (const char *)fb->buf, fb->len);
        } else {
            jpg_chunking_t jchunk = {req, 0};
            res = frame2jpg_cb(fb, 80, jpg_encode_stream, &jchunk)?ESP_OK:ESP_FAIL;
            httpd_resp_send_chunk(req, NULL, 0);
            fb_len = jchunk.len;
        }
        esp_camera_fb_return(fb);
        int64_t fr_end = esp_timer_get_time();
        Serial.println("------- New message: Camera capture return -----");
        Serial.printf("JPG: %uB %ums\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)/1000));
        Serial.println("");
        return res;
    }
}

void startCameraServer(){
  httpd_config_t config = HTTPD_DEFAULT_CONFIG();
  config.server_port = 80;

  httpd_uri_t stream_uri = {
    .uri       = "/stream",
    .method    = HTTP_GET,
    .handler   = stream_handler,
    .user_ctx  = NULL
  };

  httpd_uri_t capture_uri = {
    .uri       = "/capture",
    .method    = HTTP_GET,
    .handler   = capture_handler,
    .user_ctx  = NULL
  };

  httpd_uri_t on_uri = {
    .uri       = "/on",
    .method    = HTTP_GET,
    .handler   = on_handler,
    .user_ctx  = NULL
  };

  httpd_uri_t off_uri = {
    .uri       = "/off",
    .method    = HTTP_GET,
    .handler   = off_handler,
    .user_ctx  = NULL
  };

  //Serial.printf("Starting web server on port: '%d'\n", config.server_port);
  if (httpd_start(&stream_httpd, &config) == ESP_OK) {
    httpd_register_uri_handler(stream_httpd, &stream_uri);
    httpd_register_uri_handler(stream_httpd, &on_uri);  //voor LED ON
    httpd_register_uri_handler(stream_httpd, &off_uri); //voor LED OFF
    httpd_register_uri_handler(stream_httpd, &capture_uri); //Still image capture
  }
}

void GpioVarOn() {
   Serial.println("------- New message: GpioVarON -----");
   Serial.println("Output On");   
   Serial.println("");
   digitalWrite(ledPin1, HIGH);
 }

void GpioVarOff() {
   Serial.println("------- New message: GpioVarOFF -----");
   Serial.println("Output Off");   
   Serial.println("");
   digitalWrite(ledPin1, LOW);
 }

void RgbBut(){
   Serial.println("------- New message: RGB Button start -----");
   Serial.println("Start RGB Button Pushed");   
   Serial.println("");
     digitalWrite(ledPin1, HIGH);
     digitalWrite(ledPin2, HIGH);
     digitalWrite(ledPin3, HIGH);
       #if defined(DomoticzHttpJson)
       Serial.println("------- New message: RGB Button HTTP/JSON Command  -----");
       Serial.println("Send HTTP/JSON command to Domoticz for switch controle"); 
       Serial.println("");  
       HTTPClient http;   
       String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=" + DomoticzSwitch + "";
       http.begin(url);  //Specify destination for HTTP request
       http.addHeader("Content-Type", "text/plain");             
       int httpResponseCode = http.POST("POSTING from ESP32");   
     #elif defined(DomoticzMQTT)
       if (DomoticzSwitch == "On") {
         Serial.println("------- New message: RGB Button MQTT On Command -----");
         Serial.println("Send MQTT command to Domoticz for switch ON");
         Serial.println("");
         strcpy(msgToDomoticZ, msgContact); 
         strcat(msgToDomoticZ, DomoticzIDX);  
         strcat(msgToDomoticZ, msgContactOn);  
         client.publish(topicin, msgToDomoticZ);
       } else {    
         Serial.println("------- New message: RGB Button MQTT Off Command -----");
         Serial.println("Send MQTT command to Domoticz for switch OFF");
         Serial.println("");
         strcpy(msgToDomoticZ, msgContact); 
         strcat(msgToDomoticZ, DomoticzIDX);  
         strcat(msgToDomoticZ, msgContactOff);  
         client.publish(topicin, msgToDomoticZ);
        }
     #endif
     delay(ButtonTimer);
     digitalWrite(ledPin2, LOW);
     digitalWrite(ledPin3, LOW);
     #if defined(DomoticzHttpJson)
       #if defined(DomoticzResetSwitch)
         if (DomoticzSwitch == "On") {
           Serial.println("------- New message: RGB Button HTTP/JSON Command  -----");
           Serial.println("Send HTTP/JSON command to Domoticz for switch OFF");   
           Serial.println("");
           String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=Off";
           http.begin(url); 
           http.addHeader("Content-Type", "text/plain");            
           int httpResponseCode = http.POST("POSTING from ESP32");  
       } else {
           Serial.println("------- New message: RGB Button HTTP/JSON Command  -----");
           Serial.println("Send HTTP/JSON command to Domoticz for switch ON");   
           Serial.println("");
           String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=On";
           http.begin(url); 
           http.addHeader("Content-Type", "text/plain");            
           int httpResponseCode = http.POST("POSTING from ESP32");  
       }    
       #endif
      #elif defined(DomoticzMQTT) 
       #if defined(DomoticzResetSwitch)
         if (DomoticzSwitch == "On") {
           Serial.println("------- New message: RGB Button MQTT Off Command -----");
           Serial.println("Send MQTT command to Domoticz switch OFF command");
           Serial.println("");
           strcpy(msgToDomoticZ, msgContact); 
           strcat(msgToDomoticZ, DomoticzIDX);  
           strcat(msgToDomoticZ, msgContactOff);  
           client.publish(topicin, msgToDomoticZ);
         } else {    
           Serial.println("------- New message: RGB Button MQTT On Command -----");
           Serial.println("Send MQTT command to Domoticz switch ON command");
           Serial.println("");
           strcpy(msgToDomoticZ, msgContact); 
           strcat(msgToDomoticZ, DomoticzIDX);  
           strcat(msgToDomoticZ, msgContactOn);  
           client.publish(topicin, msgToDomoticZ);
         }
       #endif 
     #endif
   Serial.println("------- New message: RGB Button end -----");
   Serial.println("End RGB Button Pushed"); 
   Serial.println("");
}

void FlashBut(){
   Serial.println("------- New message: Flash Button start -----");
   Serial.println("Start Flash Button Pushed");   
   Serial.println("");
     #if defined(DomoticzHttpJson)
       Serial.println("------- New message: Flash Button HTTP/JSON Command  -----");
       Serial.println("Send HTTP/JSON command to Domoticz for switch controle");   
       Serial.println("");
       HTTPClient http;   
       String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=" + DomoticzSwitch + "";
       http.begin(url);  //Specify destination for HTTP request
       http.addHeader("Content-Type", "text/plain");             
       int httpResponseCode = http.POST("POSTING from ESP32");   
     #elif defined(DomoticzMQTT)
       if (DomoticzSwitch == "On") {
         Serial.println("------- New message: Flash Button MQTT On Command  -----");
         Serial.println("Send MQTT command to Domoticz for switch ON");
         Serial.println("");
         strcpy(msgToDomoticZ, msgContact); 
         strcat(msgToDomoticZ, DomoticzIDX);  
         strcat(msgToDomoticZ, msgContactOn);  
         client.publish(topicin, msgToDomoticZ);  
       } else {    
         Serial.println("------- New message: Flash Button MQTT Off Command  -----");
         Serial.println("Send MQTT command to Domoticz for switch OFF");
         Serial.println("");
         strcpy(msgToDomoticZ, msgContact); 
         strcat(msgToDomoticZ, DomoticzIDX);  
         strcat(msgToDomoticZ, msgContactOff);  
         client.publish(topicin, msgToDomoticZ);
        }
     #endif  
      int Flashcount = (ButtonTimer / 1000) * 2;
      for (int i = 0; i <= Flashcount; i++) {
      digitalWrite(ledPin1, LOW);  
      delay(300);
      digitalWrite(ledPin1, HIGH); 
      delay(300);
      }
      #if defined(DomoticzHttpJson)
       #if defined(DomoticzResetSwitch)
         if (DomoticzSwitch == "On") {
           Serial.println("------- New message: Flash Button HTTP/JSON Command  -----");
           Serial.println("Send HTTP/JSON command to Domoticz for switch OFF");   
           Serial.println("");
           String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=Off";
           http.begin(url); 
           http.addHeader("Content-Type", "text/plain");            
           int httpResponseCode = http.POST("POSTING from ESP32");  
       } else {
           Serial.println("------- New message: Flash Button HTTP/JSON Command  -----");
           Serial.println("Send HTTP/JSON command to Domoticz for switch ON");   
           Serial.println("");
           String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=On";
           http.begin(url); 
           http.addHeader("Content-Type", "text/plain");            
           int httpResponseCode = http.POST("POSTING from ESP32");  
       }    
       #endif
      #elif defined(DomoticzMQTT) 
       #if defined(DomoticzResetSwitch)
         if (DomoticzSwitch == "On") {
           Serial.println("------- New message: Flash Button MQTT Off Command  -----");
           Serial.println("Send MQTT command to Domoticz switch OFF");
           Serial.println("");
           strcpy(msgToDomoticZ, msgContact); 
           strcat(msgToDomoticZ, DomoticzIDX);  
           strcat(msgToDomoticZ, msgContactOff);  
           client.publish(topicin, msgToDomoticZ);
         } else {    
          Serial.println("------- New message: Flash Button MQTT On Command  -----");
           Serial.println("Send MQTT command to Domoticz switch ON");
           Serial.println("");
           strcpy(msgToDomoticZ, msgContact); 
           strcat(msgToDomoticZ, DomoticzIDX);  
           strcat(msgToDomoticZ, msgContactOn);  
           client.publish(topicin, msgToDomoticZ);
         }
       #endif 
      #endif 
   Serial.println("------- New message: Flash Button end  -----");
   Serial.println("End Flash Button Pushed"); 
   Serial.println("");
}

void startWIFI(void) {
    Serial.println("------- New message: Wifi Disconnect  -----");
    Serial.println("WiFi Disconnected, trying restart connection.");
    Serial.println("");
    WiFi.disconnect();
    delay(5000);
    WiFi.begin(ssid, password);
    
    #if defined(FixedIP)
      IPAddress ip(IPaddr);   
      IPAddress gateway(GatewayAddr);   
      IPAddress subnet(SubnetAddr);   
      WiFi.config(ip, gateway, subnet);
    #endif

    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(500);
        int WaitFlash = 1;
          for (int i = 0; i <= WaitFlash; i++) {
          digitalWrite(ledPin1, HIGH);   // Turn the LED on (Note that LOW is the voltage level
          delay(150);
          digitalWrite(ledPin1, LOW);  // Turn the LED off by making the voltage HIGH
          delay(150);
          WaitFlash = 1;
        }
   
    Serial.println("Trying reconnect WiFi void startWifi");
    Serial.println("");
    delay(300);
    check_wifi = millis() + 30000;

    if (WiFi.status() == WL_CONNECTED) {
        Serial.print(".");
        Serial.println("WiFi reconnected void startWifi");
        delay(500);
    }
    
    }
}

void wififlash(){
  for (int j = 0; j <= repeatflash; j++) {
    int WaitFlash = 1;
    for (int i = 0; i <= WaitFlash; i++) {
      digitalWrite(ledPin1, HIGH);   // Turn the LED on (Note that LOW is the voltage level
      delay(150);
      digitalWrite(ledPin1, LOW);  // Turn the LED off by making the voltage HIGH
      delay(150);
      WaitFlash = 1;
      }
    delay(800);
  }
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP32-Cam-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str(),MQTT_USER,MQTT_PASSWORD)) {
      Serial.println("connected");
      client.subscribe(Subscriber);
    } else {
      for (int i = 0; i <= 4; i++) {
      digitalWrite(ledPin1, HIGH);  
      delay(200);
      digitalWrite(ledPin1, LOW); 
      delay(200);
      }
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void callback(char* topic, byte *payload, unsigned int length) {
    Serial.println("------- new message from broker -------");
    Serial.print("channel:");
    Serial.println(topic);
    Serial.print("data:");  
    Serial.write(payload, length);
    Serial.println("");
    Serial.println("");

    char rawvalue[length];
    for (int i = 0; i < length; i++)
    {
    //Serial.print((char)payload[i]);
    rawvalue[i] = (char)payload[i];
    }

    rawvalue[length]= '\0';
    String svalue = String((char*)rawvalue);
    //Serial.print(svalue);

    if (svalue == "on"){
      Serial.println("------- New message: MQTT On -------");
      Serial.println("Output on by MQTT");
      Serial.println("");
        digitalWrite(ledPin1, HIGH);
    }

    if (svalue == "off"){
      Serial.println("------- New message: MQTT Off -------");
      Serial.println("Output off by MQTT");
      Serial.println("");
        digitalWrite(ledPin1, LOW);
    }
}

void setup() {
  //WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector

  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  
  Serial.begin(115200);
  Serial.setDebugOutput(false);
  Serial.println();
 
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG; 
  
  if(psramFound()){
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_VGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }
  
  // Camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  s->set_brightness(s, 0);     // -2 to 2
  s->set_contrast(s, 0);       // -2 to 2
//  s->set_saturation(s, 0);     // -2 to 2
//  s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
//  s->set_whitebal(s, 1);       // 0 = disable , 1 = enable
//  s->set_awb_gain(s, 1);       // 0 = disable , 1 = enable
//  s->set_wb_mode(s, 0);        // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home)
//  s->set_exposure_ctrl(s, 1);  // 0 = disable , 1 = enable
//  s->set_aec2(s, 0);           // 0 = disable , 1 = enable
//  s->set_ae_level(s, 0);       // -2 to 2
//  s->set_aec_value(s, 300);    // 0 to 1200
//  s->set_gain_ctrl(s, 1);      // 0 = disable , 1 = enable
//  s->set_agc_gain(s, 0);       // 0 to 30
//  s->set_gainceiling(s, (gainceiling_t)0);  // 0 to 6
//  s->set_bpc(s, 0);            // 0 = disable , 1 = enable
//  s->set_wpc(s, 1);            // 0 = disable , 1 = enable
//  s->set_raw_gma(s, 1);        // 0 = disable , 1 = enable
//  s->set_lenc(s, 1);           // 0 = disable , 1 = enable
//  s->set_hmirror(s, 0);        // 0 = disable , 1 = enable
//  s->set_vflip(s, 0);          // 0 = disable , 1 = enable
//  s->set_dcw(s, 1);            // 0 = disable , 1 = enable
//  s->set_colorbar(s, 0);       // 0 = disable , 1 = enable

 
  // Wi-Fi connection
  repeatflash = 0;
  wififlash();
  WiFi.begin(ssid, password);
  
  #if defined(FixedIP)
    IPAddress ip(IPaddr);   
    IPAddress gateway(GatewayAddr);   
    IPAddress subnet(SubnetAddr);   
    WiFi.config(ip, gateway, subnet);
  #endif

  repeatflash = 3;
  wififlash();
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  randomSeed(micros());
  Serial.println("");
  Serial.println("WiFi connected void setup");
  
  Serial.print("Camera Stream Ready! Go to: http://");
  Serial.print(WiFi.localIP());
  Serial.println("");

  #if defined(DomoticzMQTT)
    client.setServer(mqtt_server, mqtt_port);
    client.setCallback(callback);
    reconnect();
  #endif
  
  startCameraServer();
  digitalWrite(ledPin1, HIGH);  
    
}

void loop() {
  buttonState1 = digitalRead(buttonPin1);
  
  if ((WiFi.status() != WL_CONNECTED) && (millis() > check_wifi)) {
    startWIFI();
    return;
  } else {
    if (buttonState1 == LOW) {
      #if defined(RgbButton)
         RgbBut();
      #elif defined(FlashButton)
         FlashBut();
      #endif
    }
  }
  
  #if defined(DomoticzMQTT) 
    if (!client.connected()){
      reconnect();
    } else {
    client.loop();
    }
  #endif
}  
Last edited by hoeby on Tuesday 12 January 2021 21:51, edited 1 time in total.
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
stack
Posts: 36
Joined: Friday 17 July 2020 15:58
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.11794
Contact:

Re: ESP32-CAM as doorbell with camera

Post by stack »

top i'm going to test it out on my 2 esp32 cam. when this works well i put it in my doorbell
stack
Posts: 36
Joined: Friday 17 July 2020 15:58
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.11794
Contact:

Re: ESP32-CAM as doorbell with camera

Post by stack »

I put on the esp32 cam seems to run stable. Now see how I get a clearer picture.
Can I also arrange this with web interface?
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

stack wrote: Tuesday 28 July 2020 18:16 Can I also arrange this with web interface?
No sorry, this is something for version 2, where i want to use more the web interface to setup things. That is also not something which is added in an evening. The V2 is only on paper what there needs to be changed to V1, i didn't start with it. Don't expect it soon

I would advice to put the esp32cam code (not the doorbell code) on your esp. This has the web interface. Play with it and write down your settings. After that you can set those settings in the doorbell code and shoot in the esp. This prevent you to shoot multi-times the code in the esp with little changes
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
stack
Posts: 36
Joined: Friday 17 July 2020 15:58
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.11794
Contact:

Re: ESP32-CAM as doorbell with camera

Post by stack »

Have it running for a few days now and works well, although look forward to v2.
Is it possible to switch on or off on LED light via domoticz after a certain time?
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

stack wrote: Friday 31 July 2020 19:17 Is it possible to switch on or off on LED light via domoticz after a certain time?
You can use the commands:
http://IP/on = switch ledPin1 on
http://IP/off = switch ledPin1 off
Be aware, it only works when the camera stream is not active/opened. The esp only supports 1 stream. Switching on/off by http is also a stream for the code.
With open/active i mean that you can set the live view on your screen.

It can be send from domoticz.
Example: you can make a script, which is activated by the push button, that switches off the led after X time.
The led goes automatically on, when pushing the button and it was off

Write the scenario down how you like it to work, maybe there are already option in it, but have make a script for it.

The V2 will take some time. It is a new world for me, to make a webpage with this kind of code. I am not a programmer so Google is my best vriend, and sometimes that takes a lot of time to find the answer/solution
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
stack
Posts: 36
Joined: Friday 17 July 2020 15:58
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.11794
Contact:

Re: ESP32-CAM as doorbell with camera

Post by stack »

hoeby wrote: Friday 31 July 2020 21:46
stack wrote: Friday 31 July 2020 19:17 Is it possible to switch on or off on LED light via domoticz after a certain time?
You can use the commands:
http://IP/on = switch ledPin1 on
http://IP/off = switch ledPin1 off
thanks, unfortunately this doesn't work for me i also linked the esp32cam to motioneye.

want to use motioneye for motion detection
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

The HTTP links can't work. And we can't change anything to it, because the limit of 1 stream.

But it maybe could be made in the code.
You can't work with time, for example it needs to go off at 22:00hour. Because there is no time server in it.
But it can work with timers, off after 10 seconds for example
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
stack
Posts: 36
Joined: Friday 17 July 2020 15:58
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.11794
Contact:

Re: ESP32-CAM as doorbell with camera

Post by stack »

that's fine, then I google what the code looks like
joostnl
Posts: 68
Joined: Wednesday 03 February 2016 19:22
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: ESP32-CAM as doorbell with camera

Post by joostnl »

Cool project! I have ordered the parts. Did someone test the response time of notification using domoticz and telegram? Or is there faster way to send photo
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

When i test it, i receive the photo in a few seconds.

But with third party service you never can say when you receive the message. It also depends on your own situation, does your phone have always have enough internet signal (4g/5g or wifi). I know wifi is not the same as internet, but you know what i mean.

@ everyone,
I noticed that the rgb buttons with build in resistor can't make all colours. When activating all colours on the button, only the red goes on. When disconnect the red, then the green lights up. Looks like the can't do all colours at once.
I ordered now a button without resistor, to look if that makes the difference
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
stack
Posts: 36
Joined: Friday 17 July 2020 15:58
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.11794
Contact:

Re: ESP32-CAM as doorbell with camera

Post by stack »

Have a nice extension done on my doorbell.
connect with toon that is rooted, when someone rings, see an image on my toon ,very nice.
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

The rooted toon only supports image view?
Or could it stream your doorbell camera?
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
stack
Posts: 36
Joined: Friday 17 July 2020 15:58
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.11794
Contact:

Re: ESP32-CAM as doorbell with camera

Post by stack »

working with stream
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

I made this dzvents script.
The idea is that when receiving a image on telegram, when doorbell is pushed. That there are buttons displayed in telegram, with a push on the button in telegram, you will receive a new front door image (without that the doorbell is pushed again).
After 30 seconds the buttons will be removed by the script

This is the basic code die doing this.
To get this working you will need dgtbot or esp universal telegram. I will run it on esp universal telegram, on a separated esp, not the esp32cam. This ESP doens't need to be in the front-door, just somewhere indoor. Without 1 of those 2, it will not work.
The code is not complete finished, because it depends which one of those 2 you will use, what kind of commands can be chosen .

This is the one i use
https://github.com/witnessmenow/Univers ... legram-Bot

When you use this universal telegram bot. Add this undernead the row #include <UniversalTelegramBot.h>

Code: Select all

#include <ESP8266HTTPClient.h>
Then you can let de ESP send commands to domoticz, when it received a telegram message which triggers the esp-bot

Code: Select all

   if (text == "/lighton") {
       HTTPClient http;   
       String url="http://192.168.XXX.XXX:8080/json.htm?type=command&param=switchlight&idx=24&switchcmd=On";
       http.begin(url); 
       http.addHeader("Content-Type", "text/plain");             
       int httpResponseCode = http.POST("POSTING from ESP8266-telegram");   
    }
The DZ-vents code

Code: Select all

return {
    on = { 
       customEvents = { 'myCustomEvent',},
       --devices         = {'Trigger device'},                             -- De switch die dit scripts triggerd
       httpResponses   = { "Telegram_Callback"}                          -- Niet aanpassen
         },
     
--[[
Custom event trigger json:
192.168.XXX.XXX:8080/json.htm?type=command&param=customevent&event=myCustomEvent&data=myData
]]--      

    execute = function(dz, item)
        
    local teleTok        = 'xxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'    -- Jouw telegram token
    local chatId         = 'xxxxxxxxx'                                        -- Jouw telegram ChatId
    
    local tekstpost      = 'Kies een optie.'                                  -- De tekst voor het telegram tekst bericht
    local tekstremove    = 'KeuzeMenuWeg'
    
    local disable_notify = 'true'                                             -- Als het telegram bericht geen geluid mag maken, dan 'true'
                                                                              -- Anders op 'false' zetten
    local KeuzeMenuWeg   = 30                                  -- Aantal seconden, waarna het keuzemenu verwijdert dient te worden.                                                                 
                                                                         
    debug = false                                                             -- Als debug nodig is, deze op true zetten, anders false
            
        if item.isHTTPResponse then
            if (item.ok) then
                local id_message   = item.json.result.message_id
                if debug then
                    print (id_message)
                end
                os.execute('curl -s -X POST "https://api.telegram.org/bot'..teleTok..'/deleteMessage?chat_id='..chatId..'&message_id='..id_message..'"')
            else
                if debug then
                print ('niet goed')
                end
            end
    
        else
    
            local myurl1 = 'https://api.telegram.org/bot'..teleTok..'/sendMessage?chat_id='..chatId..'&text='..tekstpost..'&reply_markup={"keyboard":[["Yes"],["No"]],"one_time_keyboard":true,"resize_keyboard":true}'
            if debug then
                print (myurl1)
            end
        
            dz.openURL(
                {
                url         = myurl1,
                method      = "POST",
                })
        
            local myurl2 = 'https://api.telegram.org/bot'..teleTok..'/sendMessage?chat_id='..chatId..'&text='..tekstremove..'&reply_markup={"remove_keyboard":true}&disable_notification='..disable_notify..''
            if debug then
                print (myurl2)
            end
        
            dz.openURL(
                {
                url         = myurl2,
                method      = "GET",
                callback    = "Telegram_Callback", 
                }).afterSec(KeuzeMenuWeg)
        end
    end
}
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

Today i received the new black buttons without build in resistor.
I was hoping they worked like the metal one i have, but bad luck.

The metal one works like:
All led get power = white light

The black one works like:
All led get power = red light
When i disconnect the red light. Then it gives green. When i disconnect the green, then i am back to blue.

It is not possible to use all colours at the same moment.
Could be a safe functions for the build in led. Bad luck.

But after knowing this, i want to get the part for an other colour out of the code. Just the colour you bought and flashing when pushed. Is this a good idea?
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

I found a new board. A brother or sister from the esp32cam, it is the esp-eye.

Somebody heart from it?
What do you all think about this board?

I ordered one. It doesn't have gpio solder points, but there are options with the onboard buttons and led. But must to solder work, small solder work. If that is not your hobby, stay off this board.

The code for the esp-eye can be compatible with the esp32cam. 1 code, 2 boards :D
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

I received the esp-eye.
Made a quick render what could be possible in size compared to the esp32cam
It has the same highed as the esp32cam housing, because it is the same camera that is used.
The highed can't be smaller. The 160 degree camera lens is smaller, but you will need the space for the button.
Or the housing needs to be longer, that the button is undernead the pcb. If that is the option, then it will be the same length as the esp-32-cam housing.

To do this you must use a short button. see link which button i mean
https://nl.aliexpress.com/item/40008043 ... 5392%23198

The render is just an idea. It is not finished.
The camera looks more in the middle, but that has to do that the lengthed is smaller.
With the standard button, this will be the position. Otherwise you need to search for one with a longer flatcable, but i don't think you will find one with only 1 á 2 cm longer flatcable. Then it will be 5cm, but that is to much to place in the housing.

The esp-eye will only be an in- and output. Then all gpio's are used (the are already used, but the code will change that
On the esp-32-cam you will have more gpio's and more option if you would like

Image

Image
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

Today i made a prototype housing for the esp-eye
It is even smaller than the preview i posted. Maybe to tied, there is not much room for cables.
height is 1mm smaller than the big brother/sister

Now have to start on version 2 to make everything work.
Have some ideas, but still have to start. :oops:

Pictures say more then words
Inside, tied fit for the pcb
Image

Front side with a 16mm button (16mm drilhole, button is 18mm outside)
Image

Compare with the bigger brother/sister
Image

Compared with a normal front door push button
ESP-eye <<-->> ESP-32-cam
Image
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest