Files
jdillenburg-esphome/components/adxl345/__init__.py
2025-03-02 20:07:36 -06:00

93 lines
2.9 KiB
Python

import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.const import CONF_ID, ICON_RULER, STATE_CLASS_MEASUREMENT
from esphome.components import i2c, sensor
DEPENDENCIES = ['i2c']
AUTO_LOAD = ['sensor']
MULTI_CONF = True
CODEOWNERS = ["@jdillenburg"]
adxl345_ns = cg.esphome_ns.namespace('adxl345')
ADXL345Component = adxl345_ns.class_('ADXL345Component', cg.PollingComponent, i2c.I2CDevice)
CONF_RANGE = "range"
RANGE_2G = 0
RANGE_4G = 1
RANGE_8G = 2
RANGE_16G = 3
CONF_OFF_VERTICAL = "off_vertical"
CONF_JITTER = "jitter"
CONF_ACCEL_X = "accel_x"
CONF_ACCEL_Y = "accel_y"
CONF_ACCEL_Z = "accel_z"
CONFIG_SCHEMA = cv.Schema({
cv.GenerateID(): cv.declare_id(ADXL345Component),
cv.Optional(CONF_RANGE, default="2G"): cv.enum({
"2G": RANGE_2G,
"4G": RANGE_4G,
"8G": RANGE_8G,
"16G": RANGE_16G,
}, upper=True),
cv.Optional(CONF_OFF_VERTICAL): sensor.sensor_schema(
unit_of_measurement="°",
icon=ICON_RULER,
accuracy_decimals=1,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_JITTER): sensor.sensor_schema(
unit_of_measurement="m/s²",
icon="mdi:vibrate",
accuracy_decimals=3,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_ACCEL_X): sensor.sensor_schema(
unit_of_measurement="m/s²",
icon="mdi:axis-x-arrow",
accuracy_decimals=3,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_ACCEL_Y): sensor.sensor_schema(
unit_of_measurement="m/s²",
icon="mdi:axis-y-arrow",
accuracy_decimals=3,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_ACCEL_Z): sensor.sensor_schema(
unit_of_measurement="m/s²",
icon="mdi:axis-z-arrow",
accuracy_decimals=3,
state_class=STATE_CLASS_MEASUREMENT,
),
}).extend(cv.polling_component_schema("100ms")).extend(i2c.i2c_device_schema(0x53))
async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await i2c.register_i2c_device(var, config)
# Configure the range
cg.add(var.set_range(config[CONF_RANGE]))
# Register sensors if configured
if CONF_OFF_VERTICAL in config:
sens = await sensor.new_sensor(config[CONF_OFF_VERTICAL])
cg.add(var.set_off_vertical_sensor(sens))
if CONF_JITTER in config:
sens = await sensor.new_sensor(config[CONF_JITTER])
cg.add(var.set_jitter_sensor(sens))
if CONF_ACCEL_X in config:
sens = await sensor.new_sensor(config[CONF_ACCEL_X])
cg.add(var.set_accel_x_sensor(sens))
if CONF_ACCEL_Y in config:
sens = await sensor.new_sensor(config[CONF_ACCEL_Y])
cg.add(var.set_accel_y_sensor(sens))
if CONF_ACCEL_Z in config:
sens = await sensor.new_sensor(config[CONF_ACCEL_Z])
cg.add(var.set_accel_z_sensor(sens))