-
-
Save kdorff/245ff51463b4845de6239deaaa21445e to your computer and use it in GitHub Desktop.
## | |
## 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
@wizardnl AWESOME! I'm glad you got it all running! Thanks for the heads up about changing address - very useful! I don't think the ESPHome driver did that when I first implemented this (or I missed it). I would have loved to have used just one.
Had to try it to see if it would work with 14 sensors. ;-) In theory, I can now control every step on my stairs individually. I still need to do some intensive testing, but for now, it works. Thanks again for sharing your code.
Hey @wizardnl , have you managed to actually implement this? What is the maximum cable length you have used?
In my experience vl53l0x will not work for long cables. I think i2c isn’t meant to be used that way :|
@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.