From d904ff50e961bbb04fc8de84706e52cdbc5b7cb6 Mon Sep 17 00:00:00 2001 From: ffenix113 <1863154+ffenix113@users.noreply.github.com> Date: Mon, 26 Jan 2026 19:59:54 +0100 Subject: [PATCH] feat: add TI INA219 sensor It requires slightly different set of devicetree properties. Not tested, as I don't have it on hand. --- examples/sensor_ina2xx/README.md | 2 +- examples/sensor_ina2xx/zigbee.yaml | 4 +++- sensor/ti/ina2xx.go | 29 +++++++++++++++++++++++++---- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/examples/sensor_ina2xx/README.md b/examples/sensor_ina2xx/README.md index 9b4f022..3b3c84c 100644 --- a/examples/sensor_ina2xx/README.md +++ b/examples/sensor_ina2xx/README.md @@ -2,4 +2,4 @@ Simple example with one TI INA226 sensor attached and using I2C interface. -This example should also work with other INA22X and INA23X chips as well. \ No newline at end of file +This example should also work with other INA2XX chips as well. \ No newline at end of file diff --git a/examples/sensor_ina2xx/zigbee.yaml b/examples/sensor_ina2xx/zigbee.yaml index 0a70af2..80733bb 100644 --- a/examples/sensor_ina2xx/zigbee.yaml +++ b/examples/sensor_ina2xx/zigbee.yaml @@ -18,7 +18,7 @@ sensors: - type: ina2xx # Must specify which model of sensor is being used. # Note that currently only INA226 was tested, - # but other INA22X and INA23X should work as well. + # but other INA2XX should work as well. model: ina226 # We also need to tell which I2C bus to use. # It must be defined in board.i2c configuration, @@ -29,6 +29,8 @@ sensors: # It tells how many measurements sensor will # use to average and return as result. # Can be from 1 to 1024, as a power of 2 (so 1, 2, 4, 8, 16, ...). + # + # Does nothing if model is 'ina219'. avg: 4 # Reuiqred configuration. # Value in milliohms of shunt resistor used together diff --git a/sensor/ti/ina2xx.go b/sensor/ti/ina2xx.go index 09eadc4..03bbb54 100644 --- a/sensor/ti/ina2xx.go +++ b/sensor/ti/ina2xx.go @@ -99,6 +99,7 @@ func (i *INA2XX) ApplyOverlay(overlay *dt.DeviceTree) error { // 1 lsb step in microvolts. LsbUvForModel := map[string]float32{ + "ina219": 10, // 10 uV "ina226": 2.5, // 2.5 uV "ina228": 0.3125, // 312.5 nV, ADCRANGE = 0 "ina230": 2.5, // 2.5 uV @@ -134,13 +135,18 @@ func (i *INA2XX) ApplyOverlay(overlay *dt.DeviceTree) error { dt.NewProperty(dt.PropertyNameCompatible, dt.Quoted("ti,"+i.Model)), dt.NewProperty("reg", dt.Angled(dt.String(i.I2C.Reg()))), - dt.NewProperty("avg-count", dt.FromValue(i.Avg)), - dt.NewProperty("rshunt-micro-ohms", dt.Angled(dt.String(shuntMicroOhmsStr))), - dt.NewProperty("current-lsb-microamps", dt.Angled(dt.String(currentMicroAmpsStr))), }, } - i2c.AddNodes(inaNode) + var modelProps []dt.Property + // INA219 needs some other (older?) properties + if i.Model == "ina219" { + modelProps = i.dtProperties_ina219(shuntMicroOhmsStr, currentMicroAmpsStr) + } else { + modelProps = i.dtProperties_ina2xx(shuntMicroOhmsStr, currentMicroAmpsStr) + } + + i2c.AddNodes(inaNode.AddProperties(modelProps...)) return nil } @@ -151,3 +157,18 @@ func (*INA2XX) Extenders() []generator.Extender { extenders.ElectricalMeasurement{}, } } + +func (i *INA2XX) dtProperties_ina219(shuntUOhms, currentUAmps string) []dt.Property { + return []dt.Property{ + dt.NewProperty("shunt-milliohm", dt.Angled(dt.String(shuntUOhms))), + dt.NewProperty("lsb-microamp", dt.Angled(dt.String(currentUAmps))), + } +} + +func (i *INA2XX) dtProperties_ina2xx(shuntUOhms, currentUAmps string) []dt.Property { + return []dt.Property{ + dt.NewProperty("avg-count", dt.FromValue(i.Avg)), + dt.NewProperty("rshunt-micro-ohms", dt.Angled(dt.String(shuntUOhms))), + dt.NewProperty("current-lsb-microamps", dt.Angled(dt.String(currentUAmps))), + } +}