ATM90E26 Power Sensor

The atm90e26 sensor platform allows you to use your ATM90E26 voltage/current and power sensors (datasheet) with ESPHome. This sensor is found in the DitroniX GTEM ESP32 energy meter and other devices.

Communication with the device is done via an SPI bus, so you need to have an spi: entry in your configuration with both mosi_pin and miso_pin set.

The ATM90E26 IC measures a single phase’s voltage (using a transformer) and current (using a shunt or CT clamp) and additionally provides active, reactive, and apparent power, frequency, power factor and phase angle measurements.

Configuration variables:

  • cs_pin (Required, Pin Schema): The pin CS is connected to. For the 6 channel meter main board, this will always be 5 and 4. For the add-on boards a jumper can be selected for each CS pin, but default to 0 and 16.

  • line_frequency (Required, string): The AC line frequency of the supply voltage. One of 50Hz, 60Hz.

  • meter_constant (Required, float): The number of pulses per kWh. The ATM90E26 internally works based on pulses and this value converts a pulse into Wh, which are emitted as forward_active_energy etc. Matching it against an existing meter is useful in that it allows visual confirmation for some devices that blink an LED for each pulse. Common values are 1000 pulses/kWh, 1666.66 pulses/kWh, or 3200 pulses/kWh. See also gain_metering which determines after how much energy a pulse is emitted.

  • voltage (Optional): Use the voltage value of this phase in V (RMS). All options from Sensor.

  • current (Optional): Use the current value of this phase in amperes. All options from Sensor.

  • power (Optional): Use the power value on this phase in watts. All options from Sensor.

  • reactive_power (Optional): Use the reactive power value on this phase. All options from Sensor.

  • power_factor (Optional): Use the power factor value on this phase. All options from Sensor.

  • forward_active_energy (Optional): Use the forward active energy value on this phase in watt-hours. All options from Sensor.

  • reverse_active_energy (Optional): Use the reverse active energy value on this phase in watt-hours. All options from Sensor.

  • frequency (Optional): Use the frequency value calculated by the meter. All options from Sensor.

  • pl_const (Optional, int): A constant derived from the physical characteristics of your measurement setup. See the Calibration section. Defaults to 1429876.

  • gain_metering (Optional, int): This value determines how quickly internal energy registers accumulate and hence defines the value of a “pulse”. Matching it against an existing meter is useful in that it allows visual confirmation for some devices that blink an LED for each pulse. See also the meter_constant. Defaults to 7481.

  • gain_voltage (Optional, int): Voltage gain to scale the low voltage AC power back to household mains feed. Defaults to 26400.

  • gain_ct (Optional, int): CT clamp calibration value. Defaults to 31251.

  • gain_pga (Optional, string): The gain for the CT clamp. Valid values are 1X, 4X, 8X, 16X, and 24X. Defaults to 1X.

  • update_interval (Optional, Time): The interval to check the sensor. Defaults to 60s.

  • spi_id (Optional, ID): Manually specify the ID of the SPI Component if you want to use multiple SPI buses.


This sensor needs calibration to show correct values. In order to calibrate your AC-AC transformer and CT clamp it is easiest to start with the default values and then adjust them as necessary while measuring a known current. For a more accurate calibration you can use a Kill-A-Watt or similar meter.

Voltage is adjusted linearly to bring the observed value in agreement with a reference measurement. If your Kill-A-Watt shows 241 Volts and the ATM90E26 shows 234 Volts using the default gain_voltage of 26400, it would need to be adjusted to 241 / 234 * 26400 = 27190.

Current is best measured with an ideal load (e.g. a space heater). The process is the same as for voltage, but you modify the gain_ct value instead. For a SCT-013-000 clamp a value of 28621 worked well for me but you should calibrate your specific clamp. Note that the ATM90E26 can output a maximum current of 65A. If you expect to measure higher current, simply “mis-calibrate” the CT clamp by a factor of e.g. 2 so that the ATM90E26 thinks it is measuring a lower current (e.g. 10A when 20A are flowing) and multiply the sensor’s output by 2.

PL Constant is computed using the physical characteristics of the device we use. We compute the constant as as 838860800 * gain_pga * <mV at 1A current> * <mV at ref voltage> / (<pulse constant> * <ref voltage>). See Section 3.2.2 in the application note for additional details. Say we use a SCT-013-000 CT clamp, which has an output of 50mA for 100A input current. Our burden has a value of 12 Ohm. We therefore expect to measure 6mV per amp of input current. Say our AC-AC transformer outputs 19.3V at 230V and we use a 100:1 voltage divider in front of the ATM90E26. We would therefore expect to measure 193 mV at a line voltage of 230V. The resulting PL Constant is, assuming a meter constant of 3200 pulses/kWh (see below): 838860800 * 1 * 6 * 193 / (3200 * 230) = 1319838.

Meter Calibration is completed by matching the ATM90E26’s CF1 (active energy) pulse to those of your electricity meter by adjusting the gain_metering value until the pulses match. Next, set the meter_constant, which defines how many pulses make up one kWh of energy. If you are matching an existing meter, typical values may be 3200 pulses/kWh, 1000 pulses/kWh, or for some rotating meters 1666.66 pulses per kWh. If you’re not matching against a meter you may want to calibrate this value to emit 1000 pulses per kWh, or whatever other value is useful for your project.

If your current clamp or voltage transformer aren’t well matched to the specific A90E26-based device you’re using it may be necessary to multiply values, to stay within the value ranges specified in the datasheet and application note. This component will enforce the stated maxima. In the example below, the AC-AC transformer used read 230V line voltage as 86.6V with default settings. This would imply a gain_voltage value of 230 / 86.6 * 26400 = 70115. However, the chip’s application note says this value must be below 32768. If we divide the gain_voltage by 4, we stay within the specified range, but must then multiply the voltage output as well as the power reading, which are off by a factor of 4. This is due to the width of registers in the chip and is not necessary if your components can be calibrated within the specified range.

Keeping the calibration values at the top of your yaml might make editing easier.

  plconst_cal: '1429876' # default: 1429876, compute as 838860800 * (gain_pga * <sampled voltage (mV) at 1Amp current> * <sampled voltage (mV) at reference voltage> / (<pulse constant (e.g. 3200 pulses/kWh)> * <reference voltage, e.g. 230V>))
  current_cal: '32801'   # default: 31251
  voltage_cal: '17528'   # default: 26400 - Application note says this should be < 32768, maybe for some internal computation?
  metering_cal: '7481'   # default: 7481 - Calibrate this to match your meter based on the CF1 (CFx) pulse.

  clk_pin: 18
  miso_pin: 19
  mosi_pin: 23

    - platform: atm90e26
        cs_pin: 5
            name: House Voltage
            accuracy_decimals: 1
                - multiply: 4
            name: House Amps
  # The max value for current that the meter can output is 65.535. If you expect to measure current over 65A,
  # divide the gain_ct by 2 (120A CT) or 4 (200A CT) and multiply the current and power values by 2 or 4 by uncommenting the filter below
  #      filters:
  #        - multiply: 2
            name: House Watts
            accuracy_decimals: 1
                - multiply: 4
            name: House Reactive Power
            name: House Power Factor
            accuracy_decimals: 2
            name: House Forward Active Energy
            name: House Reverse Active Energy
            name: House Freq
        line_frequency: 50Hz
        pl_const: ${plconst_cal}
        meter_constant: '3200.0'  # My old rotating-disc meter has a meter constant of 1666.66
        gain_metering: ${metering_cal}
        gain_voltage: ${voltage_cal}
        gain_ct: ${current_cal}
        gain_pga: 1X
        update_interval: '10s'

See Also