mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 11:16:34 +00:00
Prep ADE7880 - Shelly3EM
This commit is contained in:
parent
8c9b08adbd
commit
079cf0f2f5
@ -98,3 +98,4 @@ Index | Define | Driver | Device | Address(es) | Description
|
||||
62 | USE_SCD40 | xsns_92 | SCD40 | 0x62 | CO2 sensor Sensirion SCD40/SCD41
|
||||
63 | USE_HM330X | xsns_93 | HM330X | 0x40 | Particule sensor
|
||||
64 | USE_HDC2010 | xsns_94 | HDC2010 | 0x40 | Temperature and Humidity sensor
|
||||
65 | USE_ADE7880 | xnrg_23 | ADE7880 | 0x38 | Energy monitor
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Draai" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Klok"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Gonser"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Зумер"
|
||||
#define D_SENSOR_DISP_RESET "Нулиране дисплей"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
@ -854,8 +855,8 @@
|
||||
#define D_GPIO_SHIFT595_RCLK "74x595 RCLK"
|
||||
#define D_GPIO_SHIFT595_OE "74x595 OE"
|
||||
#define D_GPIO_SHIFT595_SER "74x595 SER"
|
||||
#define D_SENSOR_CM11_TX "CM110x TX"
|
||||
#define D_SENSOR_CM11_RX "CM110x RX"
|
||||
#define D_SENSOR_CM11_TX "CM110x TX"
|
||||
#define D_SENSOR_CM11_RX "CM110x RX"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE CLK"
|
||||
#define D_SENSOR_HRE_DATA "HRE DAT"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Zoemer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -730,6 +730,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotativo" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE - Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE - Dati"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 - IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 - IRQ"
|
||||
#define D_SENSOR_BUZZER "Cicalino"
|
||||
#define D_SENSOR_DISP_RESET "Display - RESET"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Zoemer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Obroty" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Zegar"
|
||||
#define D_SENSOR_HRE_DATA "HRE Dane"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Dzwonek"
|
||||
#define D_SENSOR_DISP_RESET "Reset Display"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotativo" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Регулятор" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Зуммер"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -732,6 +732,7 @@
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
#define D_SENSOR_HRE_CLOCK "HRE Clock"
|
||||
#define D_SENSOR_HRE_DATA "HRE Data"
|
||||
#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ"
|
||||
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
|
||||
#define D_SENSOR_BUZZER "Buzzer"
|
||||
#define D_SENSOR_DISP_RESET "Display Rst"
|
||||
|
@ -183,6 +183,7 @@ enum UserSelectablePins {
|
||||
GPIO_ADC_MQ, // Analog MQ Sensor
|
||||
GPIO_CM11_TXD, GPIO_CM11_RXD, // CM11 Serial interface
|
||||
GPIO_BL6523_TX, GPIO_BL6523_RX, // BL6523 based Watt meter Serial interface
|
||||
GPIO_ADE7880_IRQ, // ADE7880 IRQ
|
||||
GPIO_SENSOR_END };
|
||||
|
||||
enum ProgramSelectablePins {
|
||||
@ -405,6 +406,7 @@ const char kSensorNames[] PROGMEM =
|
||||
D_SENSOR_ADC_MQ "|"
|
||||
D_SENSOR_CM11_TX "|" D_SENSOR_CM11_RX "|"
|
||||
D_SENSOR_BL6523_TX "|" D_SENSOR_BL6523_RX "|"
|
||||
D_SENSOR_ADE7880_IRQ "|"
|
||||
;
|
||||
|
||||
const char kSensorNamesFixed[] PROGMEM =
|
||||
@ -697,6 +699,9 @@ const uint16_t kGpioNiceList[] PROGMEM = {
|
||||
AGPIO(GPIO_HLW_CF), // HLW8012 CF power
|
||||
AGPIO(GPIO_HJL_CF), // HJL-01/BL0937 CF power
|
||||
#endif
|
||||
#if defined(USE_I2C) && defined(USE_ADE7880)
|
||||
AGPIO(GPIO_ADE7880_IRQ) + 2, // ADE7880 IRQ
|
||||
#endif
|
||||
#if defined(USE_I2C) && defined(USE_ADE7953)
|
||||
AGPIO(GPIO_ADE7953_IRQ) + 2, // ADE7953 IRQ
|
||||
#endif
|
||||
|
133
tasmota/xnrg_23_ade7880.ino
Normal file
133
tasmota/xnrg_23_ade7880.ino
Normal file
@ -0,0 +1,133 @@
|
||||
/*
|
||||
xnrg_23_ade7880.ino - ADE7880 energy sensor support for Tasmota
|
||||
|
||||
SPDX-FileCopyrightText: 2022 Theo Arends and AndreKR
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-only
|
||||
*/
|
||||
|
||||
#ifdef USE_I2C
|
||||
#ifdef USE_ENERGY_SENSOR
|
||||
#ifdef USE_ADE7880
|
||||
/*********************************************************************************************\
|
||||
* ADE7880 - Energy used in Shelly 3EM
|
||||
*
|
||||
* {"NAME":"Shelly 3EM","GPIO":[0,0,0,0,0,8065,0,0,640,8064,608,0,0,0],"FLAG":0,"BASE":18}
|
||||
*
|
||||
* Based on datasheet from https://www.analog.com/en/products/ade7880.html
|
||||
*
|
||||
* I2C Address: 0x38
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define XNRG_23 23
|
||||
#define XI2C_65 65 // See I2CDEVICES.md
|
||||
|
||||
#define ADE7880_ADDR 0x38
|
||||
|
||||
|
||||
int Ade7880RegSize(uint16_t reg) {
|
||||
int size = 0;
|
||||
/*
|
||||
TBD
|
||||
switch ((reg >> 8) & 0x0F) {
|
||||
case 0x03:
|
||||
size++;
|
||||
case 0x02:
|
||||
size++;
|
||||
case 0x01:
|
||||
size++;
|
||||
case 0x00:
|
||||
case 0x07:
|
||||
case 0x08:
|
||||
size++;
|
||||
}
|
||||
*/
|
||||
return size;
|
||||
}
|
||||
|
||||
void Ade7880Write(uint16_t reg, uint32_t val) {
|
||||
int size = Ade7880RegSize(reg);
|
||||
if (size) {
|
||||
Wire.beginTransmission(ADE7880_ADDR);
|
||||
Wire.write((reg >> 8) & 0xFF);
|
||||
Wire.write(reg & 0xFF);
|
||||
while (size--) {
|
||||
Wire.write((val >> (8 * size)) & 0xFF); // Write data, MSB first
|
||||
}
|
||||
Wire.endTransmission();
|
||||
delayMicroseconds(5); // Bus-free time minimum 4.7us
|
||||
}
|
||||
}
|
||||
|
||||
int32_t Ade7880Read(uint16_t reg) {
|
||||
uint32_t response = 0;
|
||||
|
||||
int size = Ade7880RegSize(reg);
|
||||
if (size) {
|
||||
Wire.beginTransmission(ADE7880_ADDR);
|
||||
Wire.write((reg >> 8) & 0xFF);
|
||||
Wire.write(reg & 0xFF);
|
||||
Wire.endTransmission(0);
|
||||
Wire.requestFrom(ADE7880_ADDR, size);
|
||||
if (size <= Wire.available()) {
|
||||
for (uint32_t i = 0; i < size; i++) {
|
||||
response = response << 8 | Wire.read(); // receive DATA (MSB first)
|
||||
}
|
||||
}
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
void Ade7880Init(void) {
|
||||
// Ade7953Write(0x102, 0x0004); // Locking the communication interface (Clear bit COMM_LOCK), Enable HPF
|
||||
// Ade7953Write(0x0FE, 0x00AD); // Unlock register 0x120
|
||||
// Ade7953Write(0x120, 0x0030); // Configure optimum setting
|
||||
}
|
||||
|
||||
void Ade7880EnergyEverySecond(void) {
|
||||
|
||||
}
|
||||
|
||||
void Ade7880DrvInit(void) {
|
||||
if (PinUsed(GPIO_ADE7880_IRQ) && PinUsed(GPIO_ADE7880_IRQ, 1)) {
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
bool Ade7880Command(void) {
|
||||
// Will need calibration for all three phases
|
||||
bool serviced = true;
|
||||
|
||||
|
||||
return serviced;
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Interface
|
||||
\*********************************************************************************************/
|
||||
|
||||
bool Xnrg23(uint8_t function) {
|
||||
if (!I2cEnabled(XI2C_07)) { return false; }
|
||||
|
||||
bool result = false;
|
||||
|
||||
switch (function) {
|
||||
case FUNC_ENERGY_EVERY_SECOND:
|
||||
Ade7880EnergyEverySecond();
|
||||
break;
|
||||
case FUNC_COMMAND:
|
||||
result = Ade7880Command();
|
||||
break;
|
||||
case FUNC_PRE_INIT:
|
||||
Ade7880DrvInit();
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif // USE_ADE7880
|
||||
#endif // USE_ENERGY_SENSOR
|
||||
#endif // USE_I2C
|
Loading…
x
Reference in New Issue
Block a user