VEML7700 in ESPHome
I have a VEML7700 digital light level sensor, which is not supported by ESPHome, but can be used as a custom i2c component. This is how:
espnode.yaml
esphome:
...
includes:
- veml7700_custom_sensor.h
libraries:
- "https://github.com/adafruit/Adafruit_VEML7700"
sensor:
- platform: custom
lambda: |-
auto veml7700 = new VEML7700CustomSensor();
App.register_component(veml7700);
return {veml7700, veml7700->lux_sensor, veml7700->white_sensor, veml7700->als_sensor};
sensors:
- name: "VEML7700 Light" # Required dummy sensor
- name: "VEML770 Lux"
unit_of_measurement: Lux
accuracy_decimals: 0
- name: "VEML770 White"
unit_of_measurement: raw
accuracy_decimals: 0
- name: "VEML770 ALS"
unit_of_measurement: raw
accuracy_decimals: 0
veml7700_custom_sensor.h
#include "esphome.h"
#include "Adafruit_VEML7700.h"
// Requires this lib installed: $ platformio lib --global install "Adafruit BusIO"
// based on https://github.com/adafruit/Adafruit_VEML7700/blob/master/examples/veml7700_test/veml7700_test.ino
class VEML7700CustomSensor : public PollingComponent, public Sensor {
public:
Adafruit_VEML7700 veml = Adafruit_VEML7700();
Sensor *lux_sensor = new Sensor();
Sensor *white_sensor = new Sensor();
Sensor *als_sensor = new Sensor();
VEML7700CustomSensor() : PollingComponent(15000) {}
void setup() override {
Wire.begin();
veml.begin();
veml.setGain(VEML7700_GAIN_1);
veml.setIntegrationTime(VEML7700_IT_800MS);
// veml.powerSaveEnable(true);
// veml.setPowerSaveMode(VEML7700_POWERSAVE_MODE4);
// veml.setLowThreshold(10000);
// veml.setHighThreshold(20000);
// veml.interruptEnable(true);
}
void update() override {
float lux = veml.readLux();
float white = veml.readWhite();
float als = veml.readALS();
ESP_LOGD("VEML7700", "The value of sensor lux is: %.0f", lux);
ESP_LOGD("VEML7700", "The value of sensor white is: %.0f", white);
ESP_LOGD("VEML7700", "The value of sensor ALS is: %.0f", als);
lux_sensor->publish_state(lux);
white_sensor->publish_state(white);
als_sensor->publish_state(als);
}
};