Adding Analog Temperature support for Shelly 2.5

Adding Analog Temperature support for Shelly 2.5
This commit is contained in:
Theo Arends 2019-04-11 16:59:48 +02:00
parent f1cccc19be
commit 2c6df2b86b
25 changed files with 96 additions and 32 deletions

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Базиран на"
#define D_TEMPLATE_FLAGS "Флагове"
#define D_ALLOW_ADC0 "ADC0 вход"
#define D_ALLOW_ADC0_TEMP "ADC0 температура"
#define D_ALLOW_PULLUP "Потребителски избор на pull-up"
#define D_SAVE_CONFIGURATION "Запазване на конфигурацията"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Ulož nastavení"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "basiert auf"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 Temperatur"
#define D_ALLOW_PULLUP "Nutzer pull-up Auswahl"
#define D_SAVE_CONFIGURATION "Konfiguration speichern"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Αποθήκευση ρυθμίσεων"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Save configuration"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Grabar configuración"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Basé sur"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "Entrée ADC0"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "Pull-up utilisateur"
#define D_SAVE_CONFIGURATION "Enregistrer la configuration"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "מבוסס על"
#define D_TEMPLATE_FLAGS "אפשריות"
#define D_ALLOW_ADC0 "ADC0 כניסת"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "pull-up בחירת משתמש עבור"
#define D_SAVE_CONFIGURATION "שמירת הגדרות"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Beállítások mentése"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Salva configurazione"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "옵션"
#define D_ALLOW_ADC0 "ADC0 입력"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "설정 저장"

View File

@ -291,8 +291,8 @@
#define D_TELEMETRY_PERIOD "Telemetry periode"
#define D_OTHER_PARAMETERS "Overige parameters"
#define D_TEMPLATE "Template"
#define D_ACTIVATE "Activate"
#define D_TEMPLATE "Sjabloon"
#define D_ACTIVATE "Activeer"
#define D_WEB_ADMIN_PASSWORD "Web Admin Wachtwoord"
#define D_MQTT_ENABLE "MQTT ingeschakeld"
#define D_FRIENDLY_NAME "Beschrijvende naam"
@ -301,12 +301,13 @@
#define D_SINGLE_DEVICE "een apparaat"
#define D_MULTI_DEVICE "meer apparaten"
#define D_CONFIGURE_TEMPLATE "Configure Template"
#define D_TEMPLATE_PARAMETERS "Template parameters"
#define D_TEMPLATE_NAME "Name"
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_CONFIGURE_TEMPLATE "Configureer Sjabloon"
#define D_TEMPLATE_PARAMETERS "Sjabloon parameters"
#define D_TEMPLATE_NAME "Naam"
#define D_BASE_TYPE "Op basis van"
#define D_TEMPLATE_FLAGS "Opties"
#define D_ALLOW_ADC0 "ADC0 ingang"
#define D_ALLOW_ADC0_TEMP "ADC0 temperatuur"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Bewaar configuratie"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Zapisz ustawienia"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Gravar configuração"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Salvar configuração"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Сохранить конфигурацию"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Ulož nastavenia"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Spara konfiguration"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Ayarları Kaydet"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "Зберегти конфігурацію"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "基于"
#define D_TEMPLATE_FLAGS "选项"
#define D_ALLOW_ADC0 "ADC0 输入"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "用户上拉选择"
#define D_SAVE_CONFIGURATION "保存设置"

View File

@ -307,6 +307,7 @@
#define D_BASE_TYPE "Based on"
#define D_TEMPLATE_FLAGS "Options"
#define D_ALLOW_ADC0 "ADC0 input"
#define D_ALLOW_ADC0_TEMP "ADC0 temperature"
#define D_ALLOW_PULLUP "User pull-up selection"
#define D_SAVE_CONFIGURATION "保存設置"

View File

@ -338,10 +338,10 @@ typedef struct MYCFGIO {
uint8_t io[MAX_GPIO_PIN - MIN_FLASH_PINS];
} mycfgio;
#define GPIO_FLAG_USED 1 // Currently only one flag used
#define GPIO_FLAG_USED 2 // Currently two flags used
#define GPIO_FLAG_ADC0 1 // Allow ADC0 when define USE_ADC_VCC is disabled
#define GPIO_FLAG_SPARE01 2 // Allow input pull-up control using SetOption62 - Superseded by user template editing
#define GPIO_FLAG_ADC0_TEMP 2 // Allow ADC0 as Temperature sensor when define USE_ADC_VCC is disabled
#define GPIO_FLAG_SPARE02 4
#define GPIO_FLAG_SPARE03 8
#define GPIO_FLAG_SPARE04 16
@ -353,7 +353,7 @@ typedef union {
uint8_t data;
struct {
uint8_t adc0 : 1; // Allow ADC0 when define USE_ADC_VCC is disabled
uint8_t spare01 : 1;
uint8_t adc0_temp : 1; // Allow ADC0 as Temperature sensor when define USE_ADC_VCC is disabled
uint8_t spare02 : 1;
uint8_t spare03 : 1;
uint8_t spare04 : 1;

View File

@ -299,6 +299,7 @@ const char HTTP_FORM_TEMPLATE_FLAG[] PROGMEM =
"<p></p>" // Keep close so do not use <br/>
"<fieldset><legend><b>&nbsp;" D_TEMPLATE_FLAGS "&nbsp;</b></legend><p>"
"<input id='c0' name='c0' type='checkbox'><b>" D_ALLOW_ADC0 "</b><br/>"
"<input id='c1' name='c1' type='checkbox'><b>" D_ALLOW_ADC0_TEMP "</b><br/>"
"</p></fieldset>";
const char HTTP_FORM_MODULE[] PROGMEM =

View File

@ -24,6 +24,15 @@
#define XSNS_02 2
#define TO_CELSIUS(x) ((x) - 273.15)
#define TO_KELVIN(x) ((x) + 273.15)
#define ANALOG_V33 3.3
#define ANALOG_R21 32000.0
#define ANALOG_R0 10000.0
#define ANALOG_T0 TO_KELVIN(25.0)
#define ANALOG_B 3350.0
uint16_t adc_last_value = 0;
uint16_t AdcRead(void)
@ -40,6 +49,7 @@ uint16_t AdcRead(void)
#ifdef USE_RULES
void AdcEvery250ms(void)
{
if (my_module_flag.adc0) {
uint16_t new_value = AdcRead();
if ((new_value < adc_last_value -10) || (new_value > adc_last_value +10)) {
adc_last_value = new_value;
@ -47,11 +57,13 @@ void AdcEvery250ms(void)
Response_P(PSTR("{\"ANALOG\":{\"A0div10\":%d}}"), (value > 99) ? 100 : value);
XdrvRulesProcess();
}
}
}
#endif // USE_RULES
void AdcShow(bool json)
{
if (my_module_flag.adc0) {
uint16_t analog = AdcRead();
if (json) {
@ -61,6 +73,35 @@ void AdcShow(bool json)
WSContentSend_PD(HTTP_SNS_ANALOG, "", 0, analog);
#endif // USE_WEBSERVER
}
}
if (my_module_flag.adc0_temp) {
int adc = analogRead(A0);
// Formule used by Shelly 2.5 analog temperature sensor
double Rt = (adc * ANALOG_R21) / (1024.0 * ANALOG_V33 - (double)adc);
double T = ANALOG_B / (ANALOG_B/ANALOG_T0 + log(Rt/ANALOG_R0));
double temp = ConvertTemp(TO_CELSIUS(T));
char temperature[33];
dtostrfd(temp, Settings.flag2.temperature_resolution, temperature);
if (json) {
ResponseAppend_P(JSON_SNS_TEMP, "ANALOG", temperature);
#ifdef USE_DOMOTICZ
if (0 == tele_period) {
DomoticzSensor(DZ_TEMP, temperature);
}
#endif // USE_DOMOTICZ
#ifdef USE_KNX
if (0 == tele_period) {
KnxSensor(KNX_TEMPERATURE, temp);
}
#endif // USE_KNX
#ifdef USE_WEBSERVER
} else {
WSContentSend_PD(HTTP_SNS_TEMP, "", temperature, TempUnit());
#endif // USE_WEBSERVER
}
}
}
/*********************************************************************************************\
@ -71,7 +112,7 @@ bool Xsns02(uint8_t function)
{
bool result = false;
if (my_module_flag.adc0) {
if (my_module_flag.adc0 || my_module_flag.adc0_temp) {
switch (function) {
#ifdef USE_RULES
case FUNC_EVERY_250_MSECOND: