Last active
June 7, 2024 16:39
-
-
Save kdorff/245ff51463b4845de6239deaaa21445e to your computer and use it in GitHub Desktop.
Break beam sensor using VL53L0X for Home Assistant using ESPHome
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## | |
## A standard "break beam sensor" uses a laser or LED with a device on both | |
## sides of an opening and is triggered when something breaks the beam | |
## (such as a customer walking through the beam). Some garage doors use them. | |
## Stores often use them at the entrace to ring a chime when a customer enters | |
## or leaves. | |
## | |
## This is my attempt at using a VL53L0X i2c Time of Flight sensor | |
## as a break beam sensor in Home Assistant using ESPHome. | |
## | |
## The binary sensor 'breakbeam_sensor' is | |
## * A synthetic break beam that is controlled by changes | |
## to 'breakbeam_sensor_dist'. | |
## * Should only send changes when the 'beam is broken': | |
## * 'breakbeam_sensor_dist' becomes < 'minTripDistance' (or) | |
## * 'breakbeam_sensor_dist' becomes to greater than 'minTripDistance' | |
## | |
## The sensor 'breakbeam_sensor_dist' is the actual VL53L0X sensor. | |
## * The maximum reliable "open" distance seems to be to about 1.5 meters. | |
## * This sensor is marked intnernal as to not send distance data to HA. | |
## * When distance first falls less that 'minTripDistance', | |
## 'breakbeam_sensor' will turned on. | |
## * When the distance is first greater than 'minTripDistance', the | |
## 'breakbeam_sensor' will be turned off. | |
## * This will poll at 0.1s. This seems fast enough, but 1s was not. | |
## | |
esphome: | |
name: distance-sensor-0 | |
esp8266: | |
board: esp01_1m | |
# Logging (DEBUG is the standard level) | |
logger: | |
level: INFO | |
# Enable Home Assistant API | |
api: | |
ota: | |
password: "XXXXX" | |
wifi: | |
ssid: !secret wifi_ssid | |
password: !secret wifi_password | |
fast_connect: true | |
# Enable fallback hotspot (captive portal) in case wifi connection fails | |
ap: | |
ssid: "Distance-Sensor-0" | |
password: "XXXXX" | |
captive_portal: | |
# the vl53l0x is i2c | |
i2c: | |
scan: true | |
## | |
## The virutal break beam sensor. | |
## The state of this will be controlled | |
## by breakbeam_sensor_dist's lambda as necessary. | |
## | |
binary_sensor: | |
- name: "Breakbeam Sensor" | |
id: breakbeam_sensor | |
platform: template | |
device_class: motion | |
## | |
## The actual sensor. | |
## This sensor's lambda will control the state of our | |
## virtual break beam sensor, breakbeam_sensor. | |
## | |
sensor: | |
- name: "Breakbeam Sensor Dist" | |
id: breakbeam_sensor_dist | |
platform: vl53l0x | |
address: 0x29 | |
update_interval: 0.1s | |
long_range: true | |
internal: true | |
# | |
# Only send a value back if breakbeam_sensor changes. | |
# | |
filters: | |
- lambda: !lambda |- | |
/** | |
* YOU MIGHT WANT TO CONFIGURE THIS. | |
* Distance below which to trip the virtual break beam sensor. | |
* '0.5' meters is about 20 inches. | |
*/ | |
static double minTripDistance = 0.5; | |
if (x <= minTripDistance) { | |
if (id(breakbeam_sensor).state == true) { | |
// Beam was already broken | |
return {}; | |
} | |
// Beam was just broken | |
id(breakbeam_sensor).publish_state(true); | |
ESP_LOGI("breakbeam_sensor_dist", "Set breakbeam_sensor to Detected"); | |
return {}; | |
} | |
else { | |
if (id(breakbeam_sensor).state == false) { | |
// Beam was already un-broken | |
return {}; | |
} | |
// Beam was just un-broken | |
id(breakbeam_sensor).publish_state(false); | |
ESP_LOGI("breakbeam_sensor_dist", "Set breakbeam_sensor to Cleared"); | |
return {}; | |
} |
I'am using your script and I'am very satisfied. I would like more people to know about that, so I ask you for permission to publish the script on Home Assistant community blog. Of course all attribution goes to you, I will hide my littleness :-)
I found that HA 2024.6.0 asked for i2c for attribution to GPIO so I write
#the vl53l0x is i2c
i2c:
sda: GPIO2
scl: GPIO3
scan: true
p.s.
If I use code it brings oneliner?
# the vl53l0x is i2c i2c: sda: GPIO2 scl: GPIO3 scan: true
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@wizardnl Looks like you picked up the ball and ran with it. Sure would be appreciated if you shared the code you came up with in a new gist.