Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Shelly 2.5 #1827

Merged
merged 19 commits into from
Aug 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -309,6 +309,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) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I missed this earlier... note the unsigned :) Fixed via #1875

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

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