from esphome import pins import esphome.codegen as cg from esphome.components import spi import esphome.config_validation as cv from esphome.const import CONF_ID, CONF_REFERENCE_VOLTAGE MULTI_CONF = True CONF_DRDY_PIN = "drdy_pin" CONF_SYNC_RESET_PIN = "sync_reset_pin" CONF_CLOCK_FREQUENCY = "clock_frequency" CONF_ADS131M08_ID = "ads131m08_id" CONF_OVERSAMPLING_RATIO = "oversampling_ratio" CONF_POWER_MODE = "power_mode" CONF_GLOBAL_CHOP = "global_chop" CONF_GLOBAL_CHOP_DELAY = "global_chop_delay" CONF_DCBLOCK_FILTER = "dcblock_filter" CONF_CURRENT_DETECT = "current_detect" CONF_CURRENT_DETECT_ALL = "current_detect_all" CONF_CURRENT_DETECT_NUMBER = "current_detect_number" CONF_CURRENT_DETECT_LENGTH = "current_detect_length" CONF_CURRENT_DETECT_THRESHOLD = "current_detect_threshold" DEPENDENCIES = ["spi"] ads131m08_ns = cg.esphome_ns.namespace("ads131m08") ADS131M08Hub = ads131m08_ns.class_("ADS131M08Hub", cg.Component, spi.SPIDevice) POWER_MODE = ads131m08_ns.enum("ADC_POWERMODE") POWER_MODES = { 0: POWER_MODE.VERY_LOW_POWER, 1: POWER_MODE.LOW_POWER, 2: POWER_MODE.HIGH_RESOLUTION, # default 3: POWER_MODE.HIGH_RESOLUTION2, "very_low": POWER_MODE.VERY_LOW_POWER, "very_low_power": POWER_MODE.VERY_LOW_POWER, "low": POWER_MODE.LOW_POWER, "low_power": POWER_MODE.LOW_POWER, "high": POWER_MODE.HIGH_RESOLUTION, "high_resolution": POWER_MODE.HIGH_RESOLUTION, "very low": POWER_MODE.VERY_LOW_POWER, "very low power": POWER_MODE.VERY_LOW_POWER, "low power": POWER_MODE.LOW_POWER, "high resolution": POWER_MODE.HIGH_RESOLUTION, } GLOBAL_CHOP_DELAY = ads131m08_ns.enum("ADC_GLOBAL_CHOP_DELAY") GLOBAL_CHOP_DELAYS = { 2: GLOBAL_CHOP_DELAY.GC_DEL2, 4: GLOBAL_CHOP_DELAY.GC_DEL4, 8: GLOBAL_CHOP_DELAY.GC_DEL8, 16: GLOBAL_CHOP_DELAY.GC_DEL16, # default 32: GLOBAL_CHOP_DELAY.GC_DEL32, 64: GLOBAL_CHOP_DELAY.GC_DEL64, 128: GLOBAL_CHOP_DELAY.GC_DEL128, 256: GLOBAL_CHOP_DELAY.GC_DEL256, 512: GLOBAL_CHOP_DELAY.GC_DEL512, 1024: GLOBAL_CHOP_DELAY.GC_DEL1024, 2048: GLOBAL_CHOP_DELAY.GC_DEL2048, 4096: GLOBAL_CHOP_DELAY.GC_DEL4096, 8192: GLOBAL_CHOP_DELAY.GC_DEL8192, 16384: GLOBAL_CHOP_DELAY.GC_DEL16384, 32768: GLOBAL_CHOP_DELAY.GC_DEL32768, 65536: GLOBAL_CHOP_DELAY.GC_DEL65536, } CURRENT_DETECT_NUMBER = ads131m08_ns.enum("ADC_CURRENT_DETECT_NUMBER") CURRENT_DETECT_NUMBERS = { 1: CURRENT_DETECT_NUMBER.CD_NUM1, # default 2: CURRENT_DETECT_NUMBER.CD_NUM2, 4: CURRENT_DETECT_NUMBER.CD_NUM4, 8: CURRENT_DETECT_NUMBER.CD_NUM8, 16: CURRENT_DETECT_NUMBER.CD_NUM16, 32: CURRENT_DETECT_NUMBER.CD_NUM32, 64: CURRENT_DETECT_NUMBER.CD_NUM64, 128: CURRENT_DETECT_NUMBER.CD_NUM128, } CURRENT_DETECT_LENGTH = ads131m08_ns.enum("ADC_CURRENT_DETECT_LENGTH") CURRENT_DETECT_LENGTHS = { 128: CURRENT_DETECT_LENGTH.CD_LEN128, # default 256: CURRENT_DETECT_LENGTH.CD_LEN256, 512: CURRENT_DETECT_LENGTH.CD_LEN512, 768: CURRENT_DETECT_LENGTH.CD_LEN768, 1280: CURRENT_DETECT_LENGTH.CD_LEN1280, 1792: CURRENT_DETECT_LENGTH.CD_LEN1792, 2560: CURRENT_DETECT_LENGTH.CD_LEN2560, 3584: CURRENT_DETECT_LENGTH.CD_LEN3584, } OSR = ads131m08_ns.enum("ADS131M08_OVERSAMPLING_RATIO") OSRS = { 128: OSR.OSR_128, 256: OSR.OSR_256, 512: OSR.OSR_512, 1024: OSR.OSR_1024, 2048: OSR.OSR_2048, 4096: OSR.OSR_4096, 8192: OSR.OSR_8192, 16256: OSR.OSR_16256, } CLOCK_FREQUENCIES = { 2048000: 2048000, 4096000: 4096000, 8192000: 8192000, "2048kHz": 2048000, "4096kHz": 4096000, "8192kHz": 8192000, "2.048MHz": 2048000, "4.096MHz": 4096000, "8.192MHz": 8192000, } CONFIG_SCHEMA = ( cv.Schema( { cv.GenerateID(): cv.declare_id(ADS131M08Hub), cv.Required(CONF_DRDY_PIN): pins.internal_gpio_input_pin_schema, cv.Optional(CONF_SYNC_RESET_PIN): pins.internal_gpio_input_pin_schema, cv.Optional(CONF_CLOCK_FREQUENCY, default="8192kHz"): cv.All( cv.frequency, cv.one_of(*CLOCK_FREQUENCIES.keys()) ), cv.Optional(CONF_OVERSAMPLING_RATIO, default=1024): cv.enum( OSRS, int=True ), cv.Optional(CONF_REFERENCE_VOLTAGE, default=1.2): cv.float_range( min=1.1, max=1.3 ), cv.Optional(CONF_DCBLOCK_FILTER, default=0): cv.int_range(min=0, max=15), cv.Optional(CONF_POWER_MODE, default=2): cv.enum(POWER_MODES, int=False), cv.Optional(CONF_GLOBAL_CHOP, default=False): cv.boolean, cv.Optional(CONF_GLOBAL_CHOP_DELAY, default=16): cv.enum(GLOBAL_CHOP_DELAYS, int=True), cv.Optional(CONF_CURRENT_DETECT, default=False): cv.boolean, cv.Optional(CONF_CURRENT_DETECT_ALL, default=False): cv.boolean, cv.Optional(CONF_CURRENT_DETECT_NUMBER, default=1): cv.enum(CURRENT_DETECT_NUMBERS, int=True), cv.Optional(CONF_CURRENT_DETECT_LENGTH, default=128): cv.enum(CURRENT_DETECT_LENGTHS, int=True), cv.Optional(CONF_CURRENT_DETECT_THRESHOLD, default=0):cv.int_range(min=-8388608, max=8388607), } ) .extend(cv.COMPONENT_SCHEMA) .extend(spi.spi_device_schema(cs_pin_required=True, default_data_rate="10MHz")) ) async def to_code(config): id = config[CONF_ID] var = cg.new_Pvariable(id) await cg.register_component(var, config) await spi.register_spi_device(var, config) cg.add(var.set_id(str(id))) drdy = await cg.gpio_pin_expression(config[CONF_DRDY_PIN]) if CONF_SYNC_RESET_PIN in config: sync_reset = await cg.gpio_pin_expression(config[CONF_SYNC_RESET_PIN]) cg.add(var.set_sync_reset_pin(sync_reset)) clock_frequency = CLOCK_FREQUENCIES[config[CONF_CLOCK_FREQUENCY]] cg.add(var.set_clock_frequency(clock_frequency)) osr = config[CONF_OVERSAMPLING_RATIO] cg.add(var.set_osr(osr)) reference_voltage = config[CONF_REFERENCE_VOLTAGE] cg.add(var.set_reference_voltage(reference_voltage)) dcblock_filter = config[CONF_DCBLOCK_FILTER] cg.add(var.set_dcblock_filter(dcblock_filter)) power_mode = config[CONF_POWER_MODE] cg.add(var.set_power_mode(power_mode)) global_chop = config[CONF_GLOBAL_CHOP] cg.add(var.set_global_chop(global_chop)) global_chop_delay = config[CONF_GLOBAL_CHOP_DELAY] cg.add(var.set_global_chop_delay(global_chop_delay)) current_detect = config[CONF_CURRENT_DETECT] cg.add(var.set_current_detect(current_detect)) current_detect_all = config[CONF_CURRENT_DETECT_ALL] cg.add(var.set_current_detect_all(current_detect_all)) current_detect_number = config[CONF_CURRENT_DETECT_NUMBER] cg.add(var.set_current_detect_number(current_detect_number)) current_detect_length = config[CONF_CURRENT_DETECT_LENGTH] cg.add(var.set_current_detect_length(current_detect_length)) current_detect_threshold = config[CONF_CURRENT_DETECT_THRESHOLD] cg.add(var.set_current_detect_threshold(current_detect_threshold)) cg.add(var.set_drdy_pin(drdy))