ESPHome 2026.5.0b1
Loading...
Searching...
No Matches
ade7880.h
Go to the documentation of this file.
1#pragma once
2
3// This component was developed using knowledge gathered by a number
4// of people who reverse-engineered the Shelly 3EM:
5//
6// @AndreKR on GitHub
7// Axel (@Axel830 on GitHub)
8// Marko (@goodkiller on GitHub)
9// Michaƫl Piron (@michaelpiron on GitHub)
10// Theo Arends (@arendst on GitHub)
11
13#include "esphome/core/hal.h"
16
17#include "ade7880_registers.h"
18
19namespace esphome::ade7880 {
20
22 void set_current(sensor::Sensor *sens) { this->current = sens; }
23
25
28};
29
31 void set_current(sensor::Sensor *sens) { this->current = sens; }
32 void set_voltage(sensor::Sensor *sens) { this->voltage = sens; }
33 void set_active_power(sensor::Sensor *sens) { this->active_power = sens; }
34 void set_apparent_power(sensor::Sensor *sens) { this->apparent_power = sens; }
35 void set_power_factor(sensor::Sensor *sens) { this->power_factor = sens; }
38
43
57};
58
59// Store data in a class that doesn't use multiple-inheritance (no vtables in flash!)
61 volatile bool reset_done{false};
62 bool reset_pending{false};
64
65 static void gpio_intr(ADE7880Store *arg);
66};
67
68class ADE7880 : public i2c::I2CDevice, public PollingComponent {
69 public:
70 void set_irq0_pin(InternalGPIOPin *pin) { this->irq0_pin_ = pin; }
71 void set_irq1_pin(InternalGPIOPin *pin) { this->irq1_pin_ = pin; }
72 void set_reset_pin(InternalGPIOPin *pin) { this->reset_pin_ = pin; }
74 void set_channel_n(NeutralChannel *channel) { this->channel_n_ = channel; }
75 void set_channel_a(PowerChannel *channel) { this->channel_a_ = channel; }
76 void set_channel_b(PowerChannel *channel) { this->channel_b_ = channel; }
77 void set_channel_c(PowerChannel *channel) { this->channel_c_ = channel; }
78
79 void setup() override;
80
81 void loop() override;
82
83 void update() override;
84
85 void dump_config() override;
86
87 protected:
97
98 void calibrate_s10zp_reading_(uint16_t a_register, int16_t calibration);
99 void calibrate_s24zpse_reading_(uint16_t a_register, int32_t calibration);
100
101 void init_device_();
102
103 // each of these functions allow the caller to pass in a lambda (or any other callable)
104 // which modifies the value read from the register before it is passed to the sensor
105 // the callable will be passed a 'float' value and is expected to return a 'float'
106 template<typename F> void update_sensor_from_s24zp_register16_(sensor::Sensor *sensor, uint16_t a_register, F &&f);
107 template<typename F> void update_sensor_from_s16_register16_(sensor::Sensor *sensor, uint16_t a_register, F &&f);
108 template<typename F> void update_sensor_from_s32_register16_(sensor::Sensor *sensor, uint16_t a_register, F &&f);
109
110 void reset_device_();
111
112 uint8_t read_u8_register16_(uint16_t a_register);
113 int16_t read_s16_register16_(uint16_t a_register);
114 uint16_t read_u16_register16_(uint16_t a_register);
115 int32_t read_s24zp_register16_(uint16_t a_register);
116 int32_t read_s32_register16_(uint16_t a_register);
117 uint32_t read_u32_register16_(uint16_t a_register);
118
119 void write_u8_register16_(uint16_t a_register, uint8_t value);
120 void write_s10zp_register16_(uint16_t a_register, int16_t value);
121 void write_u16_register16_(uint16_t a_register, uint16_t value);
122 void write_s24zpse_register16_(uint16_t a_register, int32_t value);
123 void write_s32_register16_(uint16_t a_register, int32_t value);
124 void write_u32_register16_(uint16_t a_register, uint32_t value);
125};
126
127} // namespace esphome::ade7880
uint16_le_t frequency
Definition bl0942.h:6
ESPDEPRECATED("set_retry is deprecated and will be removed in 2026.8.0. Use set_timeout or set_interval instead.", "2026.2.0") void set_retry(const std uint32_t uint8_t std::function< RetryResult(uint8_t)> && f
Definition component.h:454
Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
Definition gpio.h:92
This class simplifies creating components that periodically check a state.
Definition component.h:602
void update_sensor_from_s24zp_register16_(sensor::Sensor *sensor, uint16_t a_register, F &&f)
Definition ade7880.cpp:71
int16_t read_s16_register16_(uint16_t a_register)
int32_t read_s32_register16_(uint16_t a_register)
PowerChannel * channel_b_
Definition ade7880.h:95
void dump_config() override
Definition ade7880.cpp:163
void set_irq0_pin(InternalGPIOPin *pin)
Definition ade7880.h:70
void write_u8_register16_(uint16_t a_register, uint8_t value)
InternalGPIOPin * irq1_pin_
Definition ade7880.h:90
void set_reset_pin(InternalGPIOPin *pin)
Definition ade7880.h:72
uint16_t read_u16_register16_(uint16_t a_register)
void write_s32_register16_(uint16_t a_register, int32_t value)
int32_t read_s24zp_register16_(uint16_t a_register)
void set_frequency(float frequency)
Definition ade7880.h:73
void update_sensor_from_s32_register16_(sensor::Sensor *sensor, uint16_t a_register, F &&f)
Definition ade7880.cpp:91
void set_irq1_pin(InternalGPIOPin *pin)
Definition ade7880.h:71
void calibrate_s24zpse_reading_(uint16_t a_register, int32_t calibration)
Definition ade7880.cpp:250
void write_s24zpse_register16_(uint16_t a_register, int32_t value)
void update_sensor_from_s16_register16_(sensor::Sensor *sensor, uint16_t a_register, F &&f)
Definition ade7880.cpp:81
uint32_t read_u32_register16_(uint16_t a_register)
PowerChannel * channel_a_
Definition ade7880.h:94
void set_channel_c(PowerChannel *channel)
Definition ade7880.h:77
ADE7880Store store_
Definition ade7880.h:88
void set_channel_a(PowerChannel *channel)
Definition ade7880.h:75
void update() override
Definition ade7880.cpp:100
void setup() override
Definition ade7880.cpp:22
void set_channel_b(PowerChannel *channel)
Definition ade7880.h:76
InternalGPIOPin * irq0_pin_
Definition ade7880.h:89
void loop() override
Definition ade7880.cpp:56
void write_s10zp_register16_(uint16_t a_register, int16_t value)
void write_u16_register16_(uint16_t a_register, uint16_t value)
uint8_t read_u8_register16_(uint16_t a_register)
void set_channel_n(NeutralChannel *channel)
Definition ade7880.h:74
void write_u32_register16_(uint16_t a_register, uint32_t value)
void calibrate_s10zp_reading_(uint16_t a_register, int16_t calibration)
Definition ade7880.cpp:242
InternalGPIOPin * reset_pin_
Definition ade7880.h:91
NeutralChannel * channel_n_
Definition ade7880.h:93
PowerChannel * channel_c_
Definition ade7880.h:96
This Class provides the methods to read/write bytes from/to an i2c device.
Definition i2c.h:132
Base-class for all sensors.
Definition sensor.h:47
mopeka_std_values val[3]
static void uint32_t
static void gpio_intr(ADE7880Store *arg)
Definition ade7880.cpp:20
ISRInternalGPIOPin irq1_pin
Definition ade7880.h:63
void set_current_gain_calibration(int32_t val)
Definition ade7880.h:24
void set_current(sensor::Sensor *sens)
Definition ade7880.h:22
void set_voltage(sensor::Sensor *sens)
Definition ade7880.h:32
sensor::Sensor * active_power
Definition ade7880.h:46
sensor::Sensor * reverse_active_energy
Definition ade7880.h:50
void set_phase_angle_calibration(int32_t val)
Definition ade7880.h:42
void set_forward_active_energy(sensor::Sensor *sens)
Definition ade7880.h:36
sensor::Sensor * current
Definition ade7880.h:44
void set_voltage_gain_calibration(int32_t val)
Definition ade7880.h:40
sensor::Sensor * voltage
Definition ade7880.h:45
void set_power_factor(sensor::Sensor *sens)
Definition ade7880.h:35
void set_reverse_active_energy(sensor::Sensor *sens)
Definition ade7880.h:37
void set_apparent_power(sensor::Sensor *sens)
Definition ade7880.h:34
sensor::Sensor * forward_active_energy
Definition ade7880.h:49
void set_power_gain_calibration(int32_t val)
Definition ade7880.h:41
void set_active_power(sensor::Sensor *sens)
Definition ade7880.h:33
sensor::Sensor * apparent_power
Definition ade7880.h:47
sensor::Sensor * power_factor
Definition ade7880.h:48
void set_current(sensor::Sensor *sens)
Definition ade7880.h:31
void set_current_gain_calibration(int32_t val)
Definition ade7880.h:39