Files
jdillenburg-esphome/components/adxl345/__init__.py
John Dillenburg 7dc846a6eb matthiazzz - The current adxl345 component in ESPHome relies on multiple external Adafruit libraries (Adafruit Unified Sensor, Adafruit BusIO, Adafruit ADXL345). This causes unnecessary dependencies, compilation overhead, and sometimes incompatibilities when used with tca9548a multiplexers.
I modified the component to remove all Adafruit library dependencies and instead use a lightweight, self-contained ESPHome driver for ADXL345. After these changes, multiple ADXL345 sensors can be used in combination with a TCA9548A I²C multiplexer without conflicts.
2025-09-06 15:38:59 -05:00

91 lines
2.8 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
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("1s")).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)
cg.add(var.set_range(config[CONF_RANGE]))
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))