# This is a custom firmware for Human Presence Sensor 2A # https://screek.io/2a esphome: name: screek-humen-sensor-2a comment: Screek Human Sensor 2A friendly_name: Human Sensor 2A name_add_mac_suffix: True platformio_options: board_build.flash_mode: dio project: name: Screek.Human_Presence_Sensor version: 2A on_boot: - priority: 900 then: lambda: |- id(cpu_speed) = ESP.getCpuFreqMHz(); external_components: - source: type: git url: https://github.com/screekworkshop/custom_components_support_for_screek_2a ref: main components: [esp32, uart] esp32: board: lolin_c3_mini framework: type: arduino version: 2.0.9 platform_version: 6.3.0 globals: - id: cpu_speed type: int restore_value: no initial_value: '0' - id: last_update_ld2450 type: unsigned long restore_value: no initial_value: '0' improv_serial: # Enable logging logger: # level: VERY_VERBOSE debug: update_interval: 30s text_sensor: - platform: debug reset_reason: name: "Reset Reason" disabled_by_default: True - platform: wifi_info mac_address: name: ESP MAC entity_category: "diagnostic" disabled_by_default: True # Enable Home Assistant API api: # encryption: # key: "b1b1F1ArnSZmIvk7WLL9oG19gjPTCmBP1irQlSlSDGY=" ota: password: "all-things-in-their-being-are-good-for-something" # words by Socrates safe_mode: False wifi: power_save_mode: NONE reboot_timeout: 10min ap: ssid: "HUMAN-SENSOR 2A" captive_portal: web_server: port: 80 binary_sensor: - platform: status name: Online id: ink_ha_connected i2c: sda: GPIO7 scl: GPIO11 scan: true id: bus_a sensor: - platform: template name: "ESP CPU Speed" accuracy_decimals: 0 unit_of_measurement: Mhz lambda: |- return (id(cpu_speed)); entity_category: "diagnostic" update_interval: 600s - platform: template id: sys_esp_temperature name: ESP Temperature lambda: return temperatureRead(); unit_of_measurement: °C device_class: TEMPERATURE update_interval: 45s entity_category: "diagnostic" - platform: uptime name: Uptime id: sys_uptime update_interval: 60s - platform: wifi_signal name: RSSI id: wifi_signal_db update_interval: 60s entity_category: "diagnostic" - platform: template id: esp_memory icon: mdi:memory name: ESP Free Memory lambda: return heap_caps_get_free_size(MALLOC_CAP_INTERNAL) / 1024; unit_of_measurement: 'kB' state_class: measurement entity_category: "diagnostic" update_interval: 60s - platform: bh1750 name: "Illuminance" update_interval: 1s - platform: template name: "Target1 X" id: target1_x accuracy_decimals: 0 unit_of_measurement: 'mm' state_class: measurement device_class: distance - platform: template name: "Target1 Y" id: target1_y accuracy_decimals: 0 unit_of_measurement: 'mm' state_class: measurement device_class: distance - platform: template name: "Target1 Speed" id: target1_speed accuracy_decimals: 0 unit_of_measurement: 'm/s' state_class: measurement device_class: speed - platform: template name: "Target1 Resolution" id: target1_resolution accuracy_decimals: 0 unit_of_measurement: 'mm' state_class: measurement device_class: distance - platform: template name: "Target2 X" id: target2_x accuracy_decimals: 0 unit_of_measurement: 'mm' state_class: measurement device_class: distance - platform: template name: "Target2 Y" id: target2_y accuracy_decimals: 0 unit_of_measurement: 'mm' state_class: measurement device_class: distance - platform: template name: "Target2 Speed" id: target2_speed accuracy_decimals: 0 unit_of_measurement: 'm/s' state_class: measurement device_class: speed - platform: template name: "Target2 Resolution" id: target2_resolution accuracy_decimals: 0 unit_of_measurement: 'mm' state_class: measurement device_class: distance - platform: template name: "Target3 X" id: target3_x accuracy_decimals: 0 unit_of_measurement: 'mm' state_class: measurement device_class: distance - platform: template name: "Target3 Y" id: target3_y accuracy_decimals: 0 unit_of_measurement: 'mm' state_class: measurement device_class: distance - platform: template name: "Target3 Speed" id: target3_speed accuracy_decimals: 0 unit_of_measurement: 'm/s' state_class: measurement device_class: speed - platform: template name: "Target3 Resolution" id: target3_resolution accuracy_decimals: 0 unit_of_measurement: 'mm' state_class: measurement device_class: distance light: - platform: status_led name: sys_status pin: GPIO13 internal: True restore_mode: ALWAYS_OFF - platform: binary name: "Red Info Light" output: board_info_ed entity_category: "config" restore_mode: ALWAYS_OFF time: - platform: sntp id: time_now output: - platform: gpio id: board_info_ed pin: GPIO12 uart: id: uart_bus tx_pin: number: GPIO5 mode: input: true pullup: true rx_pin: number: GPIO4 mode: input: true pullup: true baud_rate: 256000 parity: NONE stop_bits: 1 data_bits: 8 debug: direction: BOTH dummy_receiver: True after: delimiter: [0X55, 0XCC] sequence: # - lambda: UARTDebug::log_hex(direction, bytes, ' '); - lambda: |- if ((millis() - id(last_update_ld2450)) <= 1000) { return; }; id(last_update_ld2450) = millis(); int16_t p1_x = (uint16_t((bytes[5] << 8) | bytes[4] )); if ((bytes[5] & 0x80) >> 7){ p1_x -= pow(2, 15); }else{ p1_x = 0 - p1_x; } int16_t p1_y = (uint16_t((bytes[7] << 8) | bytes[6] )); if ((bytes[7] & 0x80) >> 7){ p1_y -= pow(2, 15); }else{ p1_y = 0 - p1_y; } int p1_speed = (bytes[9] << 8 | bytes[8] ); if ((bytes[9] & 0x80) >> 7){ p1_speed -= pow(2, 15); }else{ p1_speed = 0 - p1_speed; } int16_t p1_distance_resolution = (uint16_t((bytes[11] << 8) | bytes[10] )); int16_t p2_x = (uint16_t((bytes[13] << 8) | bytes[12] )); if ((bytes[13] & 0x80) >> 7){ p2_x -= pow(2, 15); }else{ p2_x = 0 - p2_x; } int16_t p2_y = (uint16_t((bytes[15] << 8) | bytes[14] )); if ((bytes[15] & 0x80) >> 7){ p2_y -= pow(2, 15); }else{ p2_y = 0 - p2_y; } int p2_speed = (bytes[17] << 8 | bytes[16] ); if ((bytes[17] & 0x80) >> 7){ p2_speed -= pow(2, 15); }else{ p2_speed = 0 - p2_speed; } int16_t p2_distance_resolution = (uint16_t((bytes[19] << 8) | bytes[18] )); int16_t p3_x = (uint16_t((bytes[21] << 8) | bytes[20] )); if ((bytes[21] & 0x80) >> 7){ p3_x -= pow(2, 15); }else{ p3_x = 0 - p3_x; } int16_t p3_y = (uint16_t((bytes[23] << 8) | bytes[22] )); if ((bytes[23] & 0x80) >> 7){ p3_y -= pow(2, 15); }else{ p3_y = 0 - p3_y; } int p3_speed = (bytes[25] << 8 | bytes[24] ); if ((bytes[25] & 0x80) >> 7){ p3_speed -= pow(2, 15); }else{ p3_speed = 0 - p3_speed; } int16_t p3_distance_resolution = (uint16_t((bytes[19] << 8) | bytes[18] )); id(target1_x).publish_state(p1_x); id(target1_y).publish_state(p1_y); id(target1_speed).publish_state(p1_speed); id(target1_resolution).publish_state(p1_distance_resolution); id(target2_x).publish_state(p2_x); id(target2_y).publish_state(p2_y); id(target2_speed).publish_state(p2_speed); id(target2_resolution).publish_state(p2_distance_resolution); id(target3_x).publish_state(p3_x); id(target3_y).publish_state(p3_y); id(target3_speed).publish_state(p3_speed); id(target3_resolution).publish_state(p3_distance_resolution); button: - platform: restart icon: mdi:power-cycle name: "ESP Reboot" - platform: factory_reset disabled_by_default: True name: Factory Reset id: factory_reset_all