Skip to content

Commit

Permalink
Support Shelly 2.5 (#1827)
Browse files Browse the repository at this point in the history
* Add Shelly 2.5

* Add ADE7953 sensor support

* Fix compilation

* Use only one instance

* WIP: Not working, I got StoreProhibited exception

* Fix exception

* Fix merge issues

* Apply request review changes

* declare struct before using it

* uninterruptible delay

* try optimized reg_size

* fix types

* Remove gpio 0 input in analog sensor

* Add energy to ADE7953, it is not finished yet

* Add new method to save energy with index

* Finish energy for ADE7953
  • Loading branch information
tonilopezmr authored and mcspr committed Aug 26, 2019
1 parent b48f8c1 commit 93c1dd6
Show file tree
Hide file tree
Showing 9 changed files with 399 additions and 11 deletions.
2 changes: 2 additions & 0 deletions code/espurna/config/arduino.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
//#define ALLTERCO_SHELLY1
//#define ALLTERCO_SHELLY2
//#define ALLTERCO_SHELLY1PM
//#define ALLTERCO_SHELLY25
//#define ARILUX_AL_LC01
//#define ARILUX_AL_LC02
//#define ARILUX_AL_LC02_V14
Expand Down Expand Up @@ -215,3 +216,4 @@
//#define V9261F_SUPPORT 1
//#define VEML6075_SUPPORT 1
//#define VL53L1X_SUPPORT 1
//#define ADE7953_SUPPORT 1
51 changes: 46 additions & 5 deletions code/espurna/config/hardware.h
Original file line number Diff line number Diff line change
Expand Up @@ -3147,8 +3147,8 @@
#define RELAY1_TYPE RELAY_TYPE_NORMAL
#define RELAY2_PIN 5
#define RELAY2_TYPE RELAY_TYPE_NORMAL

#elif defined(ALLTERCO_SHELLY1PM)
#elif defined(ALLTERCO_SHELLY1PM)
// Info
#define MANUFACTURER "ALLTERCO"
#define DEVICE "SHELLY1PM"
Expand All @@ -3172,9 +3172,7 @@
#define LED1_PIN_INVERSE 1

// HJL01 / BL0937
#ifndef HLW8012_SUPPORT
#define HLW8012_SUPPORT 1
#endif
#define HLW8012_SEL_PIN 12
#define HLW8012_CF1_PIN 13
#define HLW8012_CF_PIN 5
Expand All @@ -3191,7 +3189,50 @@
#define NTC_BETA 3350
#define NTC_R_UP 10000
#define NTC_R_DOWN 0
#define NTC_R0 10000
#define NTC_R0 8000

#elif defined(ALLTERCO_SHELLY25)
// Info
#define MANUFACTURER "ALLTERCO"
#define DEVICE "SHELLY25"

// Buttons
#define BUTTON1_PIN 13
#define BUTTON1_MODE BUTTON_SWITCH
#define BUTTON1_RELAY 1

#define BUTTON2_PIN 5
#define BUTTON2_MODE BUTTON_SWITCH
#define BUTTON2_RELAY 2

#define BUTTON3_PIN 2
#define BUTTON3_MODE BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH
#define BUTTON3_LNGCLICK BUTTON_MODE_RESET
#define BUTTON3_LNGLNGCLICK BUTTON_MODE_FACTORY

// Relays
#define RELAY1_PIN 4
#define RELAY1_TYPE RELAY_TYPE_NORMAL

#define RELAY2_PIN 15
#define RELAY2_TYPE RELAY_TYPE_NORMAL

// Light
#define LED1_PIN 0
#define LED1_PIN_INVERSE 1

//Temperature
#define NTC_SUPPORT 1
#define SENSOR_SUPPORT 1
#define NTC_BETA 3350
#define NTC_R_UP 10000
#define NTC_R_DOWN 0
#define NTC_R0 8000

//Current
#define ADE7953_SUPPORT 1
#define I2C_SDA_PIN 12
#define I2C_SCL_PIN 14

// -----------------------------------------------------------------------------

Expand Down
3 changes: 3 additions & 0 deletions code/espurna/config/progmem.h
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,9 @@ PROGMEM const char espurna_sensors[] =
#if EZOPH_SUPPORT
"EZOPH "
#endif
#if ADE7953_SUPPORT
"ADE7953 "
#endif
"";


Expand Down
17 changes: 17 additions & 0 deletions code/espurna/config/sensors.h
Original file line number Diff line number Diff line change
Expand Up @@ -1255,6 +1255,19 @@
#define I2C_CLEAR_BUS 0 // Clear I2C bus on boot
#define I2C_PERFORM_SCAN 1 // Perform a bus scan on boot

// -----------------------------------------------------------------------------
// ADE7953 Shelly Sensor
// Enable support by passing ADE7953_SUPPORT=1 build flag
// -----------------------------------------------------------------------------

#ifndef ADE7953_SUPPORT
#define ADE7953_SUPPORT 0
#endif

#ifndef ADE7953_ADDRESS
#define ADE7953_ADDRESS 0x38
#endif

//--------------------------------------------------------------------------------
// Class loading
//--------------------------------------------------------------------------------
Expand Down Expand Up @@ -1405,4 +1418,8 @@
#include "../sensors/VL53L1XSensor.h"
#endif

#if ADE7953_SUPPORT
#include "../sensors/ADE7953Sensor.h"
#endif

#endif // SENSOR_SUPPORT
1 change: 1 addition & 0 deletions code/espurna/config/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@
#define SENSOR_BMP180_ID 34
#define SENSOR_MAX6675_ID 35
#define SENSOR_LDR_ID 36
#define SENSOR_ADE7953_ID 37

//--------------------------------------------------------------------------------
// Magnitudes
Expand Down
75 changes: 70 additions & 5 deletions code/espurna/sensor.ino
Original file line number Diff line number Diff line change
Expand Up @@ -462,18 +462,37 @@ void _sensorResetTS() {
#endif
}

double _sensorEnergyTotal() {
double _sensorEnergyTotal(unsigned int index = -1) {
double value = 0;

if (rtcmemStatus()) {
value = Rtcmem->energy;
} else {
value = (_sensor_save_every > 0) ? getSetting("eneTotal", 0).toInt() : 0;
} else {
if(index != -1) {
value = (_sensor_save_every > 0) ? getSetting("eneTotal", index, 0).toInt() : 0;
} else {
value = (_sensor_save_every > 0) ? getSetting("eneTotal", 0).toInt() : 0;
}
}

return value;
}

void _sensorEnergyTotal(unsigned int index, double value) {
static unsigned long save_count = 0;

// Save to EEPROM every '_sensor_save_every' readings
if (_sensor_save_every > 0) {
save_count = (save_count + 1) % _sensor_save_every;
if (0 == save_count) {
setSetting("eneTotal", index, value);
saveSettings();
}
}

// Always save to RTCMEM
Rtcmem->energy = value;
}

void _sensorEnergyTotal(double value) {
static unsigned long save_count = 0;
Expand Down Expand Up @@ -1077,6 +1096,14 @@ void _sensorLoad() {
_sensors.push_back(sensor);
}
#endif

#if ADE7953_SUPPORT
{
ADE7953Sensor * sensor = new ADE7953Sensor();
sensor->setAddress(ADE7953_ADDRESS);
_sensors.push_back(sensor);
}
#endif
}

void _sensorCallback(unsigned char i, unsigned char type, double value) {
Expand Down Expand Up @@ -1216,6 +1243,19 @@ void _sensorInit() {

#endif // HLW8012_SUPPORT

#if ADE7953_SUPPORT

if (_sensors[i]->getID() == SENSOR_ADE7953_ID) {
ADE7953Sensor * sensor = (ADE7953Sensor *) _sensors[i];
unsigned int dev_count = sensor->getTotalDevices();
for(unsigned int dev = 0; dev < dev_count; dev++) {
double value = _sensorEnergyTotal(dev);
if (value > 0) sensor->resetEnergy(dev, value);
}
}

#endif // ADE7953_SUPPORT

#if CSE7766_SUPPORT

if (_sensors[i]->getID() == SENSOR_CSE7766_ID) {
Expand Down Expand Up @@ -1452,6 +1492,22 @@ void _sensorConfigure() {

#endif // PZEM004T_SUPPORT

#if ADE7953_SUPPORT

if (_sensors[i]->getID() == SENSOR_ADE7953_ID) {
ADE7953Sensor * sensor = (ADE7953Sensor *) _sensors[i];
if (getSetting("pwrResetE", 0).toInt() == 1) {
unsigned char dev_count = sensor->getTotalDevices();
for(unsigned char dev = 0; dev < dev_count; dev++) {
sensor->resetEnergy(dev);
delSetting("eneTotal", dev);
}
_sensorResetTS();
}
}

#endif // ADE7953_SUPPORT

}

// Update filter sizes
Expand Down Expand Up @@ -1786,8 +1842,17 @@ void sensorLoop() {


// Persist total energy value
if (MAGNITUDE_ENERGY == magnitude.type) {
_sensorEnergyTotal(value_raw);
if (MAGNITUDE_ENERGY == magnitude.type) {
if (magnitude.sensor->getID() != SENSOR_ADE7953_ID) {
_sensorEnergyTotal(value_raw);
} else {
#if ADE7953_SUPPORT
ADE7953Sensor * sensor = (ADE7953Sensor *) magnitude.sensor;
unsigned int dev_count = sensor->getTotalDevices();
unsigned int dev = (magnitude.local / dev_count) - 1;
_sensorEnergyTotal(dev, value_raw);
#endif // ADE7953_SUPPORT
}
}

} // if (report_count == 0)
Expand Down
Loading

0 comments on commit 93c1dd6

Please sign in to comment.