ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
ade7880_i2c.cpp
Go to the documentation of this file.
1// This component was developed using knowledge gathered by a number
2// of people who reverse-engineered the Shelly 3EM:
3//
4// @AndreKR on GitHub
5// Axel (@Axel830 on GitHub)
6// Marko (@goodkiller on GitHub)
7// Michaël Piron (@michaelpiron on GitHub)
8// Theo Arends (@arendst on GitHub)
9
10#include "ade7880.h"
11
12namespace esphome::ade7880 {
13
14// Register types
15// unsigned 8-bit (uint8_t)
16// signed 10-bit - 16-bit ZP on wire (int16_t, needs sign extension)
17// unsigned 16-bit (uint16_t)
18// unsigned 20-bit - 32-bit ZP on wire (uint32_t)
19// signed 24-bit - 32-bit ZPSE on wire (int32_t, needs sign extension)
20// signed 24-bit - 32-bit ZP on wire (int32_t, needs sign extension)
21// signed 24-bit - 32-bit SE on wire (int32_t)
22// signed 28-bit - 32-bit ZP on wire (int32_t, needs sign extension)
23// unsigned 32-bit (uint32_t)
24// signed 32-bit (int32_t)
25
26uint8_t ADE7880::read_u8_register16_(uint16_t a_register) {
27 uint8_t in;
28 this->read_register16(a_register, &in, sizeof(in));
29 return in;
30}
31
32int16_t ADE7880::read_s16_register16_(uint16_t a_register) {
33 int16_t in;
34 this->read_register16(a_register, reinterpret_cast<uint8_t *>(&in), sizeof(in));
35 return convert_big_endian(in);
36}
37
38uint16_t ADE7880::read_u16_register16_(uint16_t a_register) {
39 uint16_t in;
40 this->read_register16(a_register, reinterpret_cast<uint8_t *>(&in), sizeof(in));
41 return convert_big_endian(in);
42}
43
44int32_t ADE7880::read_s24zp_register16_(uint16_t a_register) {
45 // s24zp means 24 bit signed value in the lower 24 bits of a 32-bit register
46 uint32_t in;
47 this->read_register16(a_register, reinterpret_cast<uint8_t *>(&in), sizeof(in));
49}
50
51int32_t ADE7880::read_s32_register16_(uint16_t a_register) {
52 int32_t in;
53 this->read_register16(a_register, reinterpret_cast<uint8_t *>(&in), sizeof(in));
54 return convert_big_endian(in);
55}
56
58 uint32_t in;
59 this->read_register16(a_register, reinterpret_cast<uint8_t *>(&in), sizeof(in));
60 return convert_big_endian(in);
61}
62
63void ADE7880::write_u8_register16_(uint16_t a_register, uint8_t value) {
64 this->write_register16(a_register, &value, sizeof(value));
65}
66
67void ADE7880::write_s10zp_register16_(uint16_t a_register, int16_t value) {
68 int16_t out = convert_big_endian(value & 0x03FF);
69 this->write_register16(a_register, reinterpret_cast<uint8_t *>(&out), sizeof(out));
70}
71
72void ADE7880::write_u16_register16_(uint16_t a_register, uint16_t value) {
73 uint16_t out = convert_big_endian(value);
74 this->write_register16(a_register, reinterpret_cast<uint8_t *>(&out), sizeof(out));
75}
76
77void ADE7880::write_s24zpse_register16_(uint16_t a_register, int32_t value) {
78 // s24zpse means a 24-bit signed value, sign-extended to 28 bits, in the lower 28 bits of a 32-bit register
79 int32_t out = convert_big_endian(value & 0x0FFFFFFF);
80 this->write_register16(a_register, reinterpret_cast<uint8_t *>(&out), sizeof(out));
81}
82
83void ADE7880::write_s32_register16_(uint16_t a_register, int32_t value) {
84 int32_t out = convert_big_endian(value);
85 this->write_register16(a_register, reinterpret_cast<uint8_t *>(&out), sizeof(out));
86}
87
88void ADE7880::write_u32_register16_(uint16_t a_register, uint32_t value) {
90 this->write_register16(a_register, reinterpret_cast<uint8_t *>(&out), sizeof(out));
91}
92
93} // namespace esphome::ade7880
int16_t read_s16_register16_(uint16_t a_register)
int32_t read_s32_register16_(uint16_t a_register)
void write_u8_register16_(uint16_t a_register, uint8_t value)
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 write_s24zpse_register16_(uint16_t a_register, int32_t value)
uint32_t read_u32_register16_(uint16_t a_register)
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 write_u32_register16_(uint16_t a_register, uint32_t value)
ErrorCode write_register16(uint16_t a_register, const uint8_t *data, size_t len) const
write an array of bytes to a specific register in the I²C device
Definition i2c.cpp:46
ErrorCode read_register16(uint16_t a_register, uint8_t *data, size_t len)
reads an array of bytes from a specific register in the I²C device
Definition i2c.cpp:32
std::vector< uint8_t > & out
Definition gif.cpp:49
constexpr T convert_big_endian(T val)
Convert a value between host byte order and big endian (most significant byte first) order.
Definition helpers.h:1098
constexpr int32_t sign_extend(uint32_t value)
Sign-extend the low BITS bits of value, e.g. sign_extend<24>(0xFFFFFE) == -2. Higher bits are ignored...
Definition helpers.h:1012
static void uint32_t