New ultimate doorbell

Hello everyone, here’s my acienne sonette my laché the moment we evolve and we pass on the formidable Doorbell of Reolink , well it all works as I want, in my search for a nice case and hiding the big holes I come across this

https://www.thingiverse.com/thing:6010258

with a slot for a fingerprint reader, ca well I have one that hangs in the drawers… we will integrate it then; but we will try to refine because I also have an RFId reader that pulls… and to finalize I would like to integrate a small oled to display the names.

well then what works perfectly,

The FingerReader

Finger	
uart:
  tx_pin: D0 # Or GPIO17 for ESP32
  rx_pin: D1 # Or GPIO16 for ESP32
  baud_rate: 57600

fingerprint_grow:
  sensing_pin: D2 # Or GPIO05 for ESP32
  on_finger_scan_matched:
    - switch.turn_on: trigger_relay
    - fingerprint_grow.aura_led_control:
        state: BREATHING
        speed: 200
        color: BLUE
        count: 1
    - text_sensor.template.publish:
        id: fingerprint_state
        state: "Authorized finger"
  on_finger_scan_unmatched:
    - fingerprint_grow.aura_led_control:
        state: FLASHING
        speed: 25
        color: RED
        count: 2
    - text_sensor.template.publish:
        id: fingerprint_state
        state: "Unauthorized finger"
  on_enrollment_scan:
    - fingerprint_grow.aura_led_control:
        state: FLASHING
        speed: 25
        color: BLUE
        count: 2
    - fingerprint_grow.aura_led_control:
        state: ALWAYS_ON
        speed: 0
        color: PURPLE
        count: 0
    - text_sensor.template.publish:
        id: fingerprint_state
        state: "Finger scanned"
  on_enrollment_done:
    - fingerprint_grow.aura_led_control:
        state: BREATHING
        speed: 100
        color: BLUE
        count: 2
    - text_sensor.template.publish:
        id: fingerprint_state
        state: "Enrolled fingerprint"
  on_enrollment_failed:
    - fingerprint_grow.aura_led_control:
        state: FLASHING
        speed: 25
        color: RED
        count: 4
    - text_sensor.template.publish:
        id: fingerprint_state
        state: "Failed to enroll fingerprint"

text_sensor:
  - platform: template
    id: fingerprint_state
    name: "Garage Fingerprint State"

sensor:
  - platform: fingerprint_grow
    fingerprint_count:
      name: "Garage Fingerprint Count"
      id: fingerprint_count
    last_finger_id:
      name: "Garage Fingerprint Last Finger ID"
    last_confidence:
      name: "Garage Fingerprint Last Confidence"
    status:
      name: "Garage Fingerprint Status"
    capacity:
      name: "Garage Fingerprint Capacity"
    security_level:
      name: "Garage Fingerprint Security Level"

api:
  password: !secret api_password
  
  services:
  - service: enroll
    variables:
      finger_id: int
      num_scans: int
    then:
      - fingerprint_grow.enroll:
          finger_id: !lambda 'return finger_id;'
          num_scans: !lambda 'return num_scans;'
  - service: enroll_next # Idea by Ralf Klüber (thanks!)
    variables:
      num_scans: int
    then:
      - fingerprint_grow.enroll:
          finger_id: !lambda 'return id(fingerprint_count).state;'
          num_scans: !lambda 'return num_scans;'
  - service: cancel_enroll
    then:
      - fingerprint_grow.cancel_enroll:
  - service: delete
    variables:
      finger_id: int
    then:
      - fingerprint_grow.delete:
          finger_id: !lambda 'return finger_id;'
  - service: delete_all
    then:
      - fingerprint_grow.delete_all:
	  

The adonno readerTag code:

# Insert your SSID and Your PWD after inital setup
wifi:
# networks:
#    - ssid: 'REPLACEME'          # Enter your WiFi SSID here. Example: `ssid: 'your_network_name'`
#      password: 'REPLACEME'      # Enter your wifi password here. Example: `password: 'abcde123456'`
  ap:
    ssid: ${name}

# Enable the captive portal for inital WiFi setup
captive_portal:

dashboard_import:
  package_import_url: github://adonno/tagreader/tagreader.yaml

improv_serial:


substitutions:
  name: tagreader
  friendly_name: TagReader

esphome:
  name: $name
  platform: ESP8266
  board: d1_mini

  # Automatically add the mac address to the name
  # so you can use a single firmware for all devices
  name_add_mac_suffix: true

  # This will allow for (future) project identification,
  # configuration and updates.
  project:
    name: adonno.tag_reader
    version: "1.4"
# If buzzer is enabled, notify on api connection success
  on_boot:
    priority: -10
    then:
    - wait_until:
        api.connected:
    - logger.log: API is connected!
    - rtttl.play: "success:d=24,o=5,b=100:c,g,b"
    - light.turn_on:
        id: activity_led
        brightness: 100%
        red: 0%
        green: 0%
        blue: 100%
        flash_length: 500ms
    - switch.turn_on: buzzer_enabled
    - switch.turn_on: led_enabled

# Define switches to control LED and buzzer from HA
switch:
- platform: template
  name: "${friendly_name} Buzzer Enabled"
  id: buzzer_enabled
  icon: mdi:volume-high
  optimistic: true
  restore_mode: RESTORE_DEFAULT_ON
  entity_category: config
- platform: template
  name: "${friendly_name} LED enabled"
  id: led_enabled
  icon: mdi:alarm-light-outline
  optimistic: true
  restore_mode: RESTORE_DEFAULT_ON
  entity_category: config
  
# Define buttons for writing tags via HA 
button:
  - platform: template
    name: Write Tag Random
    id: write_tag_random
    # Optional variables:
    icon: "mdi:pencil-box"
    on_press:
      then:
      - light.turn_on:
          id: activity_led
          brightness: 100%
          red: 100%
          green: 0%
          blue: 100%    
      - lambda: |-
          static const char alphanum[] = "0123456789abcdef";
          std::string uri = "https://www.home-assistant.io/tag/";
          for (int i = 0; i < 8; i++)
            uri += alphanum[random_uint32() % (sizeof(alphanum) - 1)];
          uri += "-";
          for (int j = 0; j < 3; j++) {
            for (int i = 0; i < 4; i++)
              uri += alphanum[random_uint32() % (sizeof(alphanum) - 1)];
            uri += "-";
          }
          for (int i = 0; i < 12; i++)
            uri += alphanum[random_uint32() % (sizeof(alphanum) - 1)];
          auto message = new nfc::NdefMessage();
          message->add_uri_record(uri);
          ESP_LOGD("tagreader", "Writing payload: %s", uri.c_str());
          id(pn532_board).write_mode(message);
      - rtttl.play: "write:d=24,o=5,b=100:b"
      - wait_until:
          not:
            pn532.is_writing:
      - light.turn_off:
          id: activity_led
      - rtttl.play: "write:d=24,o=5,b=100:b,b"
  - platform: template
    name: Clean Tag
    id: clean_tag
    icon: "mdi:nfc-variant-off"
    on_press:
      then:
      - light.turn_on:
          id: activity_led
          brightness: 100%
          red: 100%
          green: 64.7%
          blue: 0%    
      - lambda: 'id(pn532_board).clean_mode();'
      - rtttl.play: "write:d=24,o=5,b=100:b"
      - wait_until:
          not:
            pn532.is_writing:
      - light.turn_off:
          id: activity_led
      - rtttl.play: "write:d=24,o=5,b=100:b,b"
  - platform: template
    name: Cancel writing 
    id: cancel_writing
    icon: "mdi:pencil-off"
    on_press:
      then:
      - lambda: 'id(pn532_board).read_mode();'
      - light.turn_off:
          id: activity_led
      - rtttl.play: "write:d=24,o=5,b=100:b,b"

  - platform: restart
    name: "${friendly_name} Restart"
    entity_category: config
# Enable logging
logger:
  # level: VERY_VERBOSE
  # level: VERBOSE

# Enable Home Assistant API
api:
  services:
  - service: rfidreader_tag_ok
    then:
    - rtttl.play: "beep:d=16,o=5,b=100:b"

  - service: rfidreader_tag_ko
    then:
    - rtttl.play: "beep:d=8,o=5,b=100:b"

  - service: play_rtttl
    variables:
      song_str: string
    then:
    - rtttl.play: !lambda 'return song_str;'

  - service: write_tag_id
    variables:
      tag_id: string
    then:
    - light.turn_on:
        id: activity_led
        brightness: 100%
        red: 100%
        green: 0%
        blue: 0%    
    - lambda: |-
        auto message = new nfc::NdefMessage();
        std::string uri = "https://www.home-assistant.io/tag/";
        uri += tag_id;
        message->add_uri_record(uri);
        id(pn532_board).write_mode(message);
    - rtttl.play: "write:d=24,o=5,b=100:b"
    - wait_until:
        not:
          pn532.is_writing:
    - light.turn_off:
        id: activity_led
    - rtttl.play: "write:d=24,o=5,b=100:b,b"

  - service: write_music_tag
    variables:
      music_url: string
      music_info: string
    then:
    - light.turn_on:
        id: activity_led
        brightness: 100%
        red: 100%
        green: 0%
        blue: 0%    
    - lambda: |-
        auto message = new nfc::NdefMessage();
        std::string uri = "";
        std::string text = "";
        uri += music_url;
        text += music_info;
        if ( music_url != "" ) {
          message->add_uri_record(uri);
        }
        if ( music_info != "" ) {
          message->add_text_record(text);
        }
        id(pn532_board).write_mode(message);
    - rtttl.play: "write:d=24,o=5,b=100:b"
    - wait_until:
        not:
          pn532.is_writing:
    - light.turn_off:
        id: activity_led
    - rtttl.play: "write:d=24,o=5,b=100:b,b"

# Enable OTA upgrade
ota:
  - platform: esphome

i2c:
  scan: False
  frequency: 400kHz

globals:
  - id: source
    type: std::string
  - id: url
    type: std::string
  - id: info
    type: std::string

pn532_i2c:
  id: pn532_board
  on_tag:
    then:
    - if:
        condition:
          switch.is_on: led_enabled
        then:
        - light.turn_on:
            id: activity_led
            brightness: 100%
            red: 0%
            green: 100%
            blue: 0%
            flash_length: 500ms
    
    - delay: 0.15s #to fix slow component
        
    - lambda: |-
        id(source)="";
        id(url)="";
        id(info)="";
        if (tag.has_ndef_message()) {
          auto message = tag.get_ndef_message();
          auto records = message->get_records();
          for (auto &record : records) {
            std::string payload = record->get_payload();
            std::string type = record->get_type();
            size_t hass = payload.find("https://www.home-assistant.io/tag/");
            size_t applemusic = payload.find("https://music.apple.com");
            size_t spotify = payload.find("https://open.spotify.com");
            size_t sonos = payload.find("sonos-2://");

            size_t mass_deezer = payload.find("deezer://");
            size_t mass_filesystem_local = payload.find("filesystem_local://");
            size_t mass_filesystem_smb = payload.find("filesystem_smb://");
            size_t mass_plex = payload.find("plex://");
            size_t mass_qobuz = payload.find("qobuz://");
            size_t mass_radiobrowser = payload.find("radiobrowser://");
            size_t mass_soundcloud = payload.find("soundcloud://");
            size_t mass_spotify = payload.find("spotify://");
            size_t mass_tidal = payload.find("tidal://");
            size_t mass_tunein = payload.find("tunein://");
            size_t mass_ytmusic = payload.find("ytmusic://");

            if (type == "U" and hass != std::string::npos ) {
              ESP_LOGD("tagreader", "Found Home Assistant tag NDEF");
              id(source)="hass";
              id(url)=payload;
              id(info)=payload.substr(hass + 34);
            }
            else if (type == "U" and applemusic != std::string::npos ) {
              ESP_LOGD("tagreader", "Found Apple Music tag NDEF");
              id(source)="amusic";
              id(url)=payload;
            }
            else if (type == "U" and spotify != std::string::npos ) {
              ESP_LOGD("tagreader", "Found Spotify tag NDEF");
              id(source)="spotify";
              id(url)=payload;
            }
            else if (type == "U" and sonos != std::string::npos ) {
              ESP_LOGD("tagreader", "Found Sonos app tag NDEF");
              id(source)="sonos";
              id(url)=payload;
            }
            else if (type == "U" && (mass_deezer != std::string::npos ||
                    mass_filesystem_local != std::string::npos ||
                    mass_filesystem_smb != std::string::npos ||
                    mass_plex != std::string::npos ||
                    mass_qobuz != std::string::npos ||
                    mass_radiobrowser != std::string::npos ||
                    mass_soundcloud != std::string::npos ||
                    mass_spotify != std::string::npos ||
                    mass_tidal != std::string::npos ||
                    mass_tunein != std::string::npos ||
                    mass_ytmusic != std::string::npos)) {
              ESP_LOGD("tagreader", "Found Music Assistant tag NDEF");
              id(source) = "mass";
              id(url) = payload;
            }
            else if (type == "T" ) {
              ESP_LOGD("tagreader", "Found music info tag NDEF");
              id(info)=payload;
            }
            else if ( id(source)=="" ) {
              id(source)="uid";
            }
          }
        }
        else {
          id(source)="uid";
        }
    
    - if:
        condition:
          lambda: 'return ( id(source)=="uid" );'
        then:
          - homeassistant.tag_scanned: !lambda |-
              ESP_LOGD("tagreader", "No HA NDEF, using UID");
              return x;
        else:
        - if:
            condition:
              lambda: 'return ( id(source)=="hass" );'
            then:
            - homeassistant.tag_scanned: !lambda 'return id(info);'
            else:
            - homeassistant.event:
                event: esphome.music_tag
                data:
                  reader: !lambda |-
                    return App.get_name().c_str();
                  source: !lambda |-
                    return id(source);
                  url: !lambda |-
                    return id(url);
                  info: !lambda |-
                    return id(info);
    
    - if:
        condition:
          switch.is_on: buzzer_enabled
        then:
        - rtttl.play: "success:d=24,o=5,b=100:c,g,b"
  on_tag_removed:
    then:
    - homeassistant.event:
        event: esphome.tag_removed
# Define the buzzer output
output:
- platform: esp8266_pwm
  pin: D7
  id: buzzer

binary_sensor:
  - platform: status
    name: "${friendly_name} Status"
    entity_category: diagnostic


text_sensor:
  - platform: version
    hide_timestamp: true
    name: "${friendly_name} ESPHome Version"
    entity_category: diagnostic
  - platform: wifi_info
    ip_address:
      name: "${friendly_name} IP Address"
      icon: mdi:wifi
      entity_category: diagnostic
    ssid:
      name: "${friendly_name} Connected SSID"
      icon: mdi:wifi-strength-2
      entity_category: diagnostic

# Define buzzer as output for RTTTL
rtttl:
  output: buzzer

# Configure LED
light:
- platform: neopixelbus
  variant: WS2812
  pin: D8
  num_leds: 1
  flash_transition_length: 500ms
  type: GRB
  id: activity_led
  name: "${friendly_name} LED"
  restore_mode: ALWAYS_OFF

for the display i found that

i2c:              
  sda: GPIO21
  scl: GPIO22
  
display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    rotation: 180°
    lambda: |-
      // Draw rectangle
      // it.rectangle(0, 0, 128, 64);
      it.print(2, 12, id(kaushanscript), "<your name here>");

font:
  # gfonts://family[@weight]
  - file: "gfonts://Kaushan Script"
    id: kaushanscript
    size: 33
################

I would need your help for the code and do only one for all, especially since we have to see at the level of pins because they use the same…

I believe it is possible by the following evidence:

https://www.youtube.com/watch?v=lx3SpkEEaVg

it works well in its demo, but with its codes I do not know because the mr did not post his code
:frowning:

finally here thanks for your help

There is a great fingerprint reader thread here.

1 Like

Try to go bit by bit. First make the fingerprint sensor work, then the display, and finally the rfid reader. Or in another order, whatever is most important to you.