Merge branch 'development' of https://github.com/arendst/Sonoff-Tasmota into development

This commit is contained in:
Gennaro Tortone 2018-05-14 09:08:43 +02:00
commit 712424d405
34 changed files with 598 additions and 78 deletions

View File

@ -1,6 +0,0 @@
Make sure these boxes are checked before submitting your issue - Thank you!
- [ ] What hardware you are using
- [ ] Provide the output of command ``status 0``
- [ ] If you have a stack dump decode it: https://github.com/esp8266/Arduino/blob/master/doc/Troubleshooting/stack_dump.rst
- [ ] For better debug messages: https://github.com/esp8266/Arduino/blob/master/doc/Troubleshooting/debugging.rst

29
.github/ISSUE_TEMPLATE/Bug_report.md vendored Normal file
View File

@ -0,0 +1,29 @@
---
name: Bug report
about: Create a report to help us improve
---
**Describe the bug**
A clear and concise description of what the bug is.
Also, make sure these boxes are checked [x] before submitting your issue - Thank you!
- [ ] Searched the problem in issues and in the wiki
- [ ] Hardware used :
- [ ] Provide the output of command ``status 0`` :
**To Reproduce**
Steps to reproduce the behavior:
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.
**(Please, remember to close the issue when the problem has been addressed)**

16
.github/ISSUE_TEMPLATE/Custom.md vendored Normal file
View File

@ -0,0 +1,16 @@
---
name: Troubleshooting
about: Users Troubleshooting Help
---
Make sure these boxes are checked [x] before submitting your issue - Thank you!
- [ ] Searched the problem in issues (https://github.com/arendst/Sonoff-Tasmota/issues)
- [ ] Searched the problem in the wiki (https://github.com/arendst/Sonoff-Tasmota/wiki/Troubleshooting)
- [ ] Searched the problem in the forum (https://forum.digital-pig.com/)
- [ ] Searched the problem in the discussion group (https://groups.google.com/d/forum/sonoffusers)
- [ ] Hardware used :
- [ ] Provide the output of command ``status 0`` :
**(Please, remember to close the issue when the problem has been addressed)**

View File

@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
---
**Have you look for this feature in other issues and in the wiki?**
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is.
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
**(Please, remember to close the issue when the problem has been addressed)**

View File

@ -13,7 +13,7 @@ If you like **Sonoff-Tasmota**, give it a star, or fork it and contribute!
### Development
[![Build Status](https://img.shields.io/travis/arendst/Sonoff-Tasmota.svg)](https://travis-ci.org/arendst/Sonoff-Tasmota)
Current version is **5.13.1a** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
Current version is **5.13.1b** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
### Quick install
Download one of the released binaries from https://github.com/arendst/Sonoff-Tasmota/releases and flash it to your hardware as documented in the wiki.

View File

@ -1,4 +1,7 @@
/* 5.13.1a
/* 5.13.1b
* Prep for user entry DST/STD (#2721)
*
* 5.13.1a
* Change user_config.h otaurl to http://sonoff.maddox.co.uk/tasmota/sonoff.bin (#2588, #2602)
* Fix configuration restore regression from 5.13.1
* Fix compile error when ADC is enabled and Rules are disabled (#2608)
@ -7,10 +10,13 @@
* Fix KNX config error (#2628)
* Fix sensor MHZ-19 vanishing data over time (#2659)
* Fix KNX reconnection issue (#2679)
* Fix DST and STD time for Southern Hemisphere (#2684, #2714)
* Add SetOption26 to enforce use of indexes even when only one relay is present (#1055)
* Add Portuguese in Brazil language file
* Add rule state test for On/Off in addition to 0/1 (#2613)
* Add hardware serial option to MHZ-19 sensor (#2659)
* Add Eastron SDM120 energy meter (#2694)
* Add support for sensor SI1145 UV Index / IR / Visible light (#2496)
* Updated Italian language file (#2618)
* Update TasmotaSerial to 2.0.0 allowing Hardware Serial Fallback when correct connections are configured
* Optimize command handling

View File

@ -73,6 +73,7 @@
#define D_JSON_I2CSCAN_NO_DEVICES_FOUND "No devices found"
#define D_JSON_ID "Id"
#define D_JSON_ILLUMINANCE "Illuminance"
#define D_JSON_INFRARED "Infrared"
#define D_JSON_UNKNOWN "Unknown"
#define D_JSON_LIGHT "Light"
#define D_JSON_LOCAL_TIME "Local"
@ -121,6 +122,7 @@
#define D_JSON_TYPE "Type"
#define D_JSON_UPTIME "Uptime"
#define D_JSON_UTC_TIME "UTC"
#define D_JSON_UVINDEX "UvIndex"
#define D_JSON_UV_LEVEL "UvLevel"
#define D_JSON_VCC "Vcc"
#define D_JSON_VERSION "Version"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "моментален" // Button immediate
#define D_INDEX "Индекс"
#define D_INFO "Информация"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Инициализирано"
#define D_IP_ADDRESS "IP адрес"
#define D_LIGHT "Светлина"
@ -155,6 +156,7 @@
#define D_UPTIME "Време от стартирането"
#define D_USER "Потребител"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV Index"
#define D_UV_LEVEL "Ниво на ултравиолетово излъчване"
#define D_VERSION "Версия"
#define D_VOLTAGE "Напрежение"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "Okamžité" // Button immediate
#define D_INDEX "Index"
#define D_INFO "Informace"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Inicializovaný"
#define D_IP_ADDRESS "Adresa IP"
#define D_LIGHT "Světlo"
@ -155,6 +156,7 @@
#define D_UPTIME "Uptime"
#define D_USER "Uživatel"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV Index"
#define D_UV_LEVEL "úroveň UV"
#define D_VERSION "Verze"
#define D_VOLTAGE "Napětí"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "direkt" // Button immediate
#define D_INDEX "Index"
#define D_INFO "Info"
#define D_INFRARED "Infrarot"
#define D_INITIALIZED "initialisiert"
#define D_IP_ADDRESS "IP-Adresse"
#define D_LIGHT "Licht"
@ -155,6 +156,7 @@
#define D_UPTIME "Laufzeit"
#define D_USER "Benutzer"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV-Index"
#define D_UV_LEVEL "UV-Level"
#define D_VERSION "Version"
#define D_VOLTAGE "Spannung"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "Φωτεινότητα" // Button immediate
#define D_INDEX "Κατάλογος"
#define D_INFO "Πληροφορίες"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Αρχικό"
#define D_IP_ADDRESS "IP Address"
#define D_LIGHT "Light"
@ -155,6 +156,7 @@
#define D_UPTIME "Uptime"
#define D_USER "Χρήστης"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV Index"
#define D_UV_LEVEL "Επίπεδο UV"
#define D_VERSION "Έκδοση"
#define D_VOLTAGE "Τάση"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "immediate" // Button immediate
#define D_INDEX "Index"
#define D_INFO "Info"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Initialized"
#define D_IP_ADDRESS "IP Address"
#define D_LIGHT "Light"
@ -155,6 +156,7 @@
#define D_UPTIME "Uptime"
#define D_USER "User"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV Index"
#define D_UV_LEVEL "UV Level"
#define D_VERSION "Version"
#define D_VOLTAGE "Voltage"

View File

@ -28,7 +28,7 @@
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
* Use online command Prefix to translate cmnd, stat and tele.
*
* Updated until v5.12.0m
* Updated until v5.13.1a
\*********************************************************************/
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
@ -91,7 +91,7 @@
#define D_FALSE "Falso"
#define D_FILE "Archivo"
#define D_FREE_MEMORY "Memoria Libre"
#define D_FREQUENCY "Frequency"
#define D_FREQUENCY "Frecuencia"
#define D_GAS "Gas"
#define D_GATEWAY "Gateway"
#define D_GROUP "Grupo"
@ -102,6 +102,7 @@
#define D_IMMEDIATE "inmediato" // Button immediate
#define D_INDEX "Índice"
#define D_INFO "Información"
#define D_INFRARED "Infrarrojo"
#define D_INITIALIZED "Inicializado"
#define D_IP_ADDRESS "Dirección IP"
#define D_LIGHT "Luz"
@ -131,7 +132,7 @@
#define D_RESTART_REASON "Causa Reinicio"
#define D_RESTORE "Restauración"
#define D_RETAINED "Grabado"
#define D_RULE "Rule"
#define D_RULE "Regla"
#define D_SAVE "Grabar"
#define D_SENSOR "Sensor"
#define D_SSID "SSId"
@ -155,6 +156,7 @@
#define D_UPTIME "Tiempo Encendido"
#define D_USER "Usuario"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "Índice UV"
#define D_UV_LEVEL "Nivel UV"
#define D_VERSION "Versión"
#define D_VOLTAGE "Tensión"
@ -200,7 +202,7 @@
#define D_ERASED_SECTOR "Sector borrado"
// webserver.ino
#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "firmware MÍNIMO - actualice por favor"
#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MÍNIMO - actualice por favor"
#define D_WEBSERVER_ACTIVE_ON "Servidor web activo en"
#define D_WITH_IP_ADDRESS "con dirección IP"
#define D_WEBSERVER_STOPPED "Servidor web detenido"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "immédiat" // Button immediate
#define D_INDEX "Index"
#define D_INFO "Info"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Initialisé"
#define D_IP_ADDRESS "Adresse IP"
#define D_LIGHT "Lumière"
@ -155,6 +156,7 @@
#define D_UPTIME "Durée d'activité"
#define D_USER "Utilisateur"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "Index UV"
#define D_UV_LEVEL "Niveau UV"
#define D_VERSION "Version"
#define D_VOLTAGE "Tension"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "azonnali" // Button immediate
#define D_INDEX "Index"
#define D_INFO "Info"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Inicializálva"
#define D_IP_ADDRESS "IP Cím"
#define D_LIGHT "Fény"
@ -155,6 +156,7 @@
#define D_UPTIME "Üzemidő"
#define D_USER "Felhasználó"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV Index"
#define D_UV_LEVEL "UV Szint"
#define D_VERSION "Verzió"
#define D_VOLTAGE "Feszültség"

View File

@ -28,7 +28,7 @@
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
* Use online command Prefix to translate cmnd, stat and tele.
*
* Updated until v5.13.0
* Updated until v5.13.1a
\*********************************************************************/
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
@ -102,6 +102,7 @@
#define D_IMMEDIATE "immediato" // Button immediate
#define D_INDEX "Indice"
#define D_INFO "Info"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Inizializzato"
#define D_IP_ADDRESS "Indirizzo IP"
#define D_LIGHT "Luce"
@ -155,6 +156,7 @@
#define D_UPTIME "Uptime"
#define D_USER "Utente"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "Indice UV"
#define D_UV_LEVEL "Livello UV"
#define D_VERSION "Versione"
#define D_VOLTAGE "Tensione"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "onmiddelijk" // Button immediate
#define D_INDEX "Index"
#define D_INFO "Info"
#define D_INFRARED "Infrarood"
#define D_INITIALIZED "Geinitialiseerd"
#define D_IP_ADDRESS "IP Adres"
#define D_LIGHT "Licht"
@ -155,6 +156,7 @@
#define D_UPTIME "Bedrijfstijd"
#define D_USER "Gebruiker"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV-index"
#define D_UV_LEVEL "UV niveau"
#define D_VERSION "Versie"
#define D_VOLTAGE "Spanning"

View File

@ -43,7 +43,7 @@
#define D_HOUR_MINUTE_SEPARATOR ":"
#define D_MINUTE_SECOND_SEPARATOR ":"
#define D_DAY3LIST "PonWtoŚroCzwPiąSobNie"
#define D_DAY3LIST "NiePonWtoŚroCzwPiąSob"
#define D_MONTH3LIST "StyLutMarKwiMajCzeLipSieWrzPaźLisGru"
// Non JSON decimal separator
@ -102,6 +102,7 @@
#define D_IMMEDIATE "Natychmiastowe" // Button immediate
#define D_INDEX "Indeks"
#define D_INFO "Informacja"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Zainicjowany"
#define D_IP_ADDRESS "Adres IP"
#define D_LIGHT "Światło"
@ -155,6 +156,7 @@
#define D_UPTIME "Uptime"
#define D_USER "Użytkownik"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV Index"
#define D_UV_LEVEL "Poziom UV"
#define D_VERSION "Wersja"
#define D_VOLTAGE "Napięcie"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "Imediato" // Button immediate
#define D_INDEX "Índice"
#define D_INFO "Informação"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Inicializado"
#define D_IP_ADDRESS "Endereço IP"
#define D_LIGHT "Luz"
@ -155,6 +156,7 @@
#define D_UPTIME "Tempo de atividade"
#define D_USER "Usuário"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "Índice UV"
#define D_UV_LEVEL "Nível UV"
#define D_VERSION "Versão"
#define D_VOLTAGE "Voltagem"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "Immediato" // Button immediate
#define D_INDEX "Indíce"
#define D_INFO "Info"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Inicializado"
#define D_IP_ADDRESS "Endereço IP"
#define D_LIGHT "Luz"
@ -155,6 +156,7 @@
#define D_UPTIME "Tempo de Atividade"
#define D_USER "Utilizador"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "Indíce UV"
#define D_UV_LEVEL "Nível UV"
#define D_VERSION "Versão"
#define D_VOLTAGE "Voltagem"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "немедленно" // Button immediate
#define D_INDEX "Индекс"
#define D_INFO "Инфо"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "Инициализировано"
#define D_IP_ADDRESS "IP Адрес"
#define D_LIGHT "Свет"
@ -155,6 +156,7 @@
#define D_UPTIME "Uptime"
#define D_USER "Пользователь"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV Index"
#define D_UV_LEVEL "УФ уровень"
#define D_VERSION "Версия"
#define D_VOLTAGE "Напряжение"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "immediate" // Button immediate
#define D_INDEX "索引:"
#define D_INFO "信息"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "初始化完成"
#define D_IP_ADDRESS "IP地址"
#define D_LIGHT "灯"
@ -155,6 +156,7 @@
#define D_UPTIME "运行时间"
#define D_USER "用户名"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV Index"
#define D_UV_LEVEL "紫外线水平"
#define D_VERSION "版本"
#define D_VOLTAGE "电压"

View File

@ -102,6 +102,7 @@
#define D_IMMEDIATE "immediate" // Button immediate
#define D_INDEX "索引:"
#define D_INFO "信息"
#define D_INFRARED "Infrared"
#define D_INITIALIZED "初始化完成"
#define D_IP_ADDRESS "IP地址"
#define D_LIGHT "燈"
@ -155,6 +156,7 @@
#define D_UPTIME "運行時間"
#define D_USER "用戶名"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV Index"
#define D_UV_LEVEL "紫外線等級"
#define D_VERSION "版本"
#define D_VOLTAGE "電壓"

View File

@ -51,7 +51,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t rules_enabled : 1; // bit 23 (v5.12.0j)
uint32_t rules_once : 1; // bit 24 (v5.12.0k)
uint32_t knx_enabled : 1; // bit 25 (v5.12.0l) KNX
uint32_t spare26 : 1;
uint32_t device_index_enable : 1; // bit 26 (v5.13.1a)
uint32_t spare27 : 1;
uint32_t spare28 : 1;
uint32_t spare29 : 1;
@ -89,6 +89,17 @@ typedef union {
};
} SysBitfield2;
typedef union {
uint16_t data;
struct {
uint16_t hemis : 1; // bit 0 = 0=Northern, 1=Southern Hemisphere (=Opposite DST/STD)
uint16_t week : 3; // bits 1 - 3 = 0=Last week of the month, 1=First, 2=Second, 3=Third, 4=Fourth
uint16_t month : 4; // bits 4 - 7 = 1=Jan, 2=Feb, ... 12=Dec
uint16_t dow : 3; // bits 8 - 10 = day of week, 1=Sun, 2=Mon, ... 7=Sat
uint16_t hour : 5; // bits 11 - 15 = 0-23
};
} TimeRule;
typedef union {
uint32_t data;
struct {
@ -148,9 +159,8 @@ struct SYSCFG {
uint8_t display_address[8]; // 2D8
uint8_t display_dimmer; // 2E0
uint8_t display_size; // 2E1
uint8_t free_2E2[4]; // 2E2
TimeRule std_flags; // 2E2
int16_t std_offset; // 2E4 offset from UTC in minutes
uint16_t pwm_frequency; // 2E6
power_t power; // 2E8
uint16_t pwm_value[MAX_PWMS]; // 2EC
@ -234,9 +244,7 @@ struct SYSCFG {
char ntp_server[3][33]; // 4CE
byte ina219_mode; // 531
uint16_t pulse_timer[MAX_PULSETIMERS]; // 532
byte free_542[2]; // 542
TimeRule dst_flags; // 542
uint32_t ip_address[4]; // 544
unsigned long energy_kWhtotal; // 554
char mqtt_fulltopic[100]; // 558
@ -246,8 +254,9 @@ struct SYSCFG {
uint16_t pulse_counter_debounce; // 5D2
uint8_t rf_code[17][9]; // 5D4
byte free_66d[3]; // 66D
byte free_66d[1]; // 66D
int16_t dst_offset; // 66E
Timer timer[MAX_TIMERS]; // 670
int latitude; // 6B0
int longitude; // 6B4
@ -289,19 +298,6 @@ struct TIME_T {
unsigned long valid;
} RtcTime;
struct TimeChangeRule
{
uint8_t hemis; // 0-Northern, 1=Southern Hemisphere (=Opposite DST/STD)
uint8_t week; // 1=First, 2=Second, 3=Third, 4=Fourth, or 0=Last week of the month
uint8_t dow; // day of week, 1=Sun, 2=Mon, ... 7=Sat
uint8_t month; // 1=Jan, 2=Feb, ... 12=Dec
uint8_t hour; // 0-23
int offset; // offset from UTC in minutes
};
TimeChangeRule DaylightSavingTime = { TIME_DST }; // Daylight Saving Time
TimeChangeRule StandardTime = { TIME_STD }; // Standard Time
struct XDRVMAILBOX {
uint16_t valid;
uint16_t index;

View File

@ -521,6 +521,8 @@ void SettingsDefaultSet2()
Settings.latitude = (int)((double)LATITUDE * 1000000);
Settings.longitude = (int)((double)LONGITUDE * 1000000);
SettingsDefaultSet_5_13_1a();
}
/********************************************************************************************/
@ -652,6 +654,22 @@ void SettingsDefaultSet_5_10_1()
Settings.display_size = 1;
}
void SettingsDefaultSet_5_13_1a()
{
Settings.dst_flags.hemis = TIME_DST_HEMISPHERE;
Settings.dst_flags.week = TIME_DST_WEEK;
Settings.dst_flags.dow = TIME_DST_DAY;
Settings.dst_flags.month = TIME_DST_MONTH;
Settings.dst_flags.hour = TIME_DST_HOUR;
Settings.dst_offset = TIME_DST_OFFSET;
Settings.std_flags.hemis = TIME_STD_HEMISPHERE;
Settings.std_flags.week = TIME_STD_WEEK;
Settings.std_flags.dow = TIME_STD_DAY;
Settings.std_flags.month = TIME_STD_MONTH;
Settings.std_flags.hour = TIME_STD_HOUR;
Settings.std_offset = TIME_STD_OFFSET;
}
/********************************************************************************************/
void SettingsDelta()
@ -852,10 +870,14 @@ void SettingsDelta()
memset(&Settings.knx_physsical_addr, 0x00, 0x800 - 0x6b8); // Reset until 0x800 for future use
}
if (Settings.version < 0x050C000F) {
Settings.energy_kWhtoday /= 1000;
Settings.energy_kWhyesterday /= 1000;
RtcSettings.energy_kWhtoday /= 1000;
Settings.energy_kWhtoday /= 1000;
Settings.energy_kWhyesterday /= 1000;
RtcSettings.energy_kWhtoday /= 1000;
}
if (Settings.version < 0x050D0102) {
SettingsDefaultSet_5_13_1a();
}
Settings.version = VERSION;
SettingsSave(1);
}

View File

@ -25,7 +25,7 @@
- Select IDE Tools - Flash Size: "1M (no SPIFFS)"
====================================================*/
#define VERSION 0x050D0101 // 5.13.1a
#define VERSION 0x050D0102 // 5.13.1b
// Location specific includes
#include <core_version.h> // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0)
@ -376,6 +376,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
byte jsflg = 0;
byte lines = 1;
uint8_t grpflg = 0;
// uint8_t user_append_index = 0;
uint16_t i = 0;
uint16_t index;
uint32_t address;
@ -407,7 +408,10 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
while (isdigit(type[i-1])) {
i--;
}
if (i < strlen(type)) index = atoi(type +i);
if (i < strlen(type)) {
index = atoi(type +i);
// user_append_index = 1;
}
type[i] = '\0';
}
@ -478,6 +482,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
}
else if ((CMND_POWER == command_code) && (index > 0) && (index <= devices_present)) {
if ((payload < 0) || (payload > 4)) payload = 9;
// Settings.flag.device_index_enable = user_append_index;
ExecuteCommandPower(index, payload);
fallback_topic_flag = 0;
return;
@ -553,7 +558,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
XsnsCall(FUNC_COMMAND);
// if (!XsnsCall(FUNC_COMMAND)) type = NULL;
}
else if ((CMND_SETOPTION == command_code) && ((index <= 21) || ((index > 31) && (index <= P_MAX_PARAM8 + 31)))) {
else if ((CMND_SETOPTION == command_code) && ((index <= 26) || ((index > 31) && (index <= P_MAX_PARAM8 + 31)))) {
if (index <= 31) {
ptype = 0; // SetOption0 .. 31
} else {
@ -585,6 +590,9 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
case 21: // no_power_on_check
// case 22: // mqtt_serial - use commands SerialSend and SerialLog
// case 23: // rules_enabled - use command Rule
// case 24: // rules_once
// case 25: // knx_enabled
case 26: // device_index_enable
bitWrite(Settings.flag.data, index, payload);
}
if (12 == index) { // stop_flash_rotate
@ -1367,7 +1375,7 @@ void MqttShowState()
if (i == light_device -1) {
LightState(1);
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"%s\":\"%s\""), mqtt_data, GetPowerDevice(stemp1, i +1, sizeof(stemp1)), GetStateText(bitRead(power, i)));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"%s\":\"%s\""), mqtt_data, GetPowerDevice(stemp1, i +1, sizeof(stemp1), Settings.flag.device_index_enable), GetStateText(bitRead(power, i)));
}
}

View File

@ -1288,7 +1288,7 @@ uint32_t MakeTime(TIME_T &tm)
return seconds;
}
uint32_t RuleToTime(TimeChangeRule r, int yr)
uint32_t RuleToTime(TimeRule r, int yr)
{
TIME_T tm;
uint32_t t;
@ -1367,8 +1367,8 @@ void RtcSecond()
}
BreakTime(utc_time, tmpTime);
RtcTime.year = tmpTime.year + 1970;
daylight_saving_time = RuleToTime(DaylightSavingTime, RtcTime.year);
standard_time = RuleToTime(StandardTime, RtcTime.year);
daylight_saving_time = RuleToTime(Settings.dst_flags, RtcTime.year);
standard_time = RuleToTime(Settings.std_flags, RtcTime.year);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION "(" D_UTC_TIME ") %s, (" D_DST_TIME ") %s, (" D_STD_TIME ") %s"),
GetTime(0).c_str(), GetTime(2).c_str(), GetTime(3).c_str());
AddLog(LOG_LEVEL_DEBUG);
@ -1389,17 +1389,22 @@ void RtcSecond()
if (local_time > 1451602800) { // 2016-01-01
int32_t time_offset = Settings.timezone * SECS_PER_HOUR;
if (99 == Settings.timezone) {
if (DaylightSavingTime.hemis) {
dstoffset = StandardTime.offset * SECS_PER_MIN; // Southern hemisphere
stdoffset = DaylightSavingTime.offset * SECS_PER_MIN;
dstoffset = Settings.dst_offset * SECS_PER_MIN;
stdoffset = Settings.std_offset * SECS_PER_MIN;
if (Settings.dst_flags.hemis) {
// Southern hemisphere
if ((utc_time >= (standard_time - dstoffset)) && (utc_time < (daylight_saving_time - stdoffset))) {
time_offset = stdoffset; // Standard Time
} else {
time_offset = dstoffset; // Daylight Saving Time
}
} else {
dstoffset = DaylightSavingTime.offset * SECS_PER_MIN; // Northern hemisphere
stdoffset = StandardTime.offset * SECS_PER_MIN;
}
if ((utc_time >= (daylight_saving_time - stdoffset)) && (utc_time < (standard_time - dstoffset))) {
time_offset = dstoffset; // Daylight Saving Time
} else {
time_offset = stdoffset; // Standard Time
// Northern hemisphere
if ((utc_time >= (daylight_saving_time - stdoffset)) && (utc_time < (standard_time - dstoffset))) {
time_offset = dstoffset; // Daylight Saving Time
} else {
time_offset = stdoffset; // Standard Time
}
}
}
local_time += time_offset;

View File

@ -129,6 +129,22 @@
#define NTP_SERVER2 "nl.pool.ntp.org" // [NtpServer2] Select second NTP server by name or IP address (5.39.184.5)
#define NTP_SERVER3 "0.nl.pool.ntp.org" // [NtpServer3] Select third NTP server by name or IP address (93.94.224.67)
// -- Time - Start Daylight Saving Time and timezone offset from UTC in minutes
#define TIME_DST_HEMISPHERE North // Northern Hemisphere
#define TIME_DST_WEEK Last
#define TIME_DST_DAY Sun
#define TIME_DST_MONTH Mar // Last sunday in march
#define TIME_DST_HOUR 2 // at 02:00
#define TIME_DST_OFFSET +120 // +120 minutes
// -- Time - Start Standard Time and timezone offset from UTC in minutes
#define TIME_STD_HEMISPHERE North // Northern Hemisphere
#define TIME_STD_WEEK Last
#define TIME_STD_DAY Sun
#define TIME_STD_MONTH Oct // Last sunday in october
#define TIME_STD_HOUR 3 // at 03:00
#define TIME_STD_OFFSET +60 // +60 minutes
// -- Location ------------------------------------
#define LATITUDE 48.858360 // [Latitude] Your location to be used with sunrise and sunset
#define LONGITUDE 2.294442 // [Longitude] Your location to be used with sunrise and sunset
@ -223,12 +239,6 @@
#define WEBSERVER_ADVERTISE // Provide access to webserver by name <Hostname>.local/
#define MQTT_HOST_DISCOVERY // Find MQTT host server (overrides MQTT_HOST if found)
// -- Time - Start Daylight Saving Time and timezone offset from UTC in minutes
#define TIME_DST North, Last, Sun, Mar, 2, +120 // Northern Hemisphere, Last sunday in march at 02:00 +120 minutes
// -- Time - Start Standard Time and timezone offset from UTC in minutes
#define TIME_STD North, Last, Sun, Oct, 3, +60 // Northern Hemisphere, Last sunday in october 02:00 +60 minutes
// -- Time ----------------------------------------
#define USE_TIMERS // Add support for up to 16 timers (+2k2 code)
#define USE_TIMERS_WEB // Add timer webpage support (+4k5 code)
@ -258,6 +268,7 @@
#define USE_BH1750 // Add I2C code for BH1750 sensor (+0k5 code)
// #define USE_VEML6070 // Add I2C code for VEML6070 sensor (+0k5 code)
// #define USE_TSL2561 // Add I2C code for TSL2561 sensor using library Joba_Tsl2561 (+2k3 code)
#define USE_SI1145 // Add I2C code for SI1145/46/47 sensor (+1k code)
// #define USE_ADS1115 // Add I2C code for ADS1115 16 bit A/D converter based on Adafruit ADS1x15 library (no library needed) (+0k7 code)
// #define USE_ADS1115_I2CDEV // Add I2C code for ADS1115 16 bit A/D converter using library i2cdevlib-Core and i2cdevlib-ADS1115 (+2k code)
// #define USE_INA219 // Add I2C code for INA219 Low voltage and current sensor (+1k code)

View File

@ -280,10 +280,9 @@ void MqttPublishPowerState(byte device)
char stopic[TOPSZ];
char scommand[33];
if ((device < 1) || (device > devices_present)) {
device = 1;
}
GetPowerDevice(scommand, device, sizeof(scommand));
if ((device < 1) || (device > devices_present)) { device = 1; }
GetPowerDevice(scommand, device, sizeof(scommand), Settings.flag.device_index_enable);
GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT);
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, scommand, GetStateText(bitRead(power, device -1)));
MqttPublish(stopic);
@ -301,7 +300,7 @@ void MqttPublishPowerBlinkState(byte device)
device = 1;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"" D_JSON_BLINK " %s\"}"),
GetPowerDevice(scommand, device, sizeof(scommand)), GetStateText(bitRead(blink_mask, device -1)));
GetPowerDevice(scommand, device, sizeof(scommand), Settings.flag.device_index_enable), GetStateText(bitRead(blink_mask, device -1)));
MqttPublishPrefixTopic_P(RESULT_OR_STAT, S_RSLT_POWER);
}
@ -723,7 +722,7 @@ bool MqttCommand()
if ((payload >= 0) && (payload <= 1)) {
if (!payload) {
for(i = 1; i <= devices_present; i++) { // Clear MQTT retain in broker
GetTopic_P(stemp1, STAT, mqtt_topic, GetPowerDevice(scommand, i, sizeof(scommand)));
GetTopic_P(stemp1, STAT, mqtt_topic, GetPowerDevice(scommand, i, sizeof(scommand), Settings.flag.device_index_enable));
mqtt_data[0] = '\0';
MqttPublish(stemp1, Settings.flag.mqtt_power_retain);
}
@ -744,7 +743,7 @@ bool MqttCommand()
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, GetStateText(Settings.flag.mqtt_sensor_retain));
}
else serviced = false; // Unknown command
return serviced;
}

View File

@ -545,7 +545,7 @@ void LightState(uint8_t append)
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{"));
}
GetPowerDevice(scommand, light_device, sizeof(scommand));
GetPowerDevice(scommand, light_device, sizeof(scommand), Settings.flag.device_index_enable);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"%s\":\"%s\",\"" D_CMND_DIMMER "\":%d"),
mqtt_data, scommand, GetStateText(light_power), Settings.light_dimmer);
if (light_subtype > LST_SINGLE) {

View File

@ -96,7 +96,7 @@ void HAssDiscoverRelay()
} else {
snprintf_P(name, sizeof(name), Settings.friendlyname[i -1]);
}
GetPowerDevice(value_template, i, sizeof(value_template));
GetPowerDevice(value_template, i, sizeof(value_template), Settings.flag.device_index_enable);
GetTopic_P(command_topic, CMND, mqtt_topic, value_template);
GetTopic_P(state_topic, STAT, mqtt_topic, S_RSLT_RESULT);
GetTopic_P(availability_topic, TELE, mqtt_topic, S_LWT);
@ -171,7 +171,7 @@ void HAssDiscoverButton()
} else {
snprintf_P(name, sizeof(name), PSTR("%s BTN"), Settings.friendlyname[button_index]);
}
GetPowerDevice(value_template, button_index+1, sizeof(value_template));
GetPowerDevice(value_template, button_index+1, sizeof(value_template), Settings.flag.device_index_enable);
GetTopic_P(state_topic, CMND, key_topic, value_template); // State of button is sent as CMND TOGGLE
GetTopic_P(availability_topic, TELE, mqtt_topic, S_LWT);
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_BUTTON, name, state_topic, Settings.state_text[2], availability_topic);

View File

@ -248,6 +248,9 @@ bool RulesProcess()
delay(0); // Prohibit possible loop software watchdog
//snprintf_P(log_data, sizeof(log_data), PSTR("RUL: Event = %s, Rule = %s"), mqtt_data, Settings.rules);
//AddLog(LOG_LEVEL_DEBUG);
if (!Settings.flag.rules_enabled) { return serviced; } // Not enabled
if (!strlen(Settings.rules)) { return serviced; } // No rules
@ -274,12 +277,12 @@ bool RulesProcess()
if (plen == -1) { return serviced; } // Bad syntax - No endon
String commands = rules.substring(pevt +4, plen); // "Backlog Dimmer 10;Color 100000"
plen += 6;
//snprintf_P(log_data, sizeof(log_data), PSTR("RUL: Trigger |%s|, Commands |%s|"), event_trigger.c_str(), commands.c_str());
//AddLog(LOG_LEVEL_DEBUG);
rules_event_value = "";
String event = event_saved;
//snprintf_P(log_data, sizeof(log_data), PSTR("RUL: Event |%s|, Rule |%s|, Command(s) |%s|"), event.c_str(), event_trigger.c_str(), commands.c_str());
//AddLog(LOG_LEVEL_DEBUG);
if (RulesRuleMatch(event, event_trigger)) {
commands.trim();
String ucommand = commands;

View File

@ -22,9 +22,9 @@
/*********************************************************************************************\
* TSL2561 - Light Intensity
*
* I2C Addresses: 0x29 (low), 0x39 (float) or 0x49 (high)
*
* Using library https://github.com/joba-1/Joba_Tsl2561
*
* I2C Addresses: 0x29 (low), 0x39 (float) or 0x49 (high)
\*********************************************************************************************/
#include <Tsl2561Util.h>
@ -112,5 +112,5 @@ boolean Xsns16(byte function)
return result;
}
#endif // USE_TSL2561_JOBA
#endif // USE_TSL2561
#endif // USE_I2C

377
sonoff/xsns_24_si1145.ino Normal file
View File

@ -0,0 +1,377 @@
/*
xsns_24_si1145.ino - SI1145/46/47 UV Index / IR / Visible light sensor support for Sonoff-Tasmota
Copyright (C) 2018 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef USE_I2C
#ifdef USE_SI1145
/*********************************************************************************************\
* SI1145/46/47 - UV Index / IR / Visible light
*
* Based on library https://github.com/SeeedDocument/Grove-Sunlight_Sensor/
*
* I2C Addresses: 0x60
\*********************************************************************************************/
uint8_t si1145_type = 0;
/********************************************************************************************/
#define SI114X_ADDR 0X60
//
//commands
//
#define SI114X_QUERY 0X80
#define SI114X_SET 0XA0
#define SI114X_NOP 0X00
#define SI114X_RESET 0X01
#define SI114X_BUSADDR 0X02
#define SI114X_PS_FORCE 0X05
#define SI114X_GET_CAL 0X12
#define SI114X_ALS_FORCE 0X06
#define SI114X_PSALS_FORCE 0X07
#define SI114X_PS_PAUSE 0X09
#define SI114X_ALS_PAUSE 0X0A
#define SI114X_PSALS_PAUSE 0X0B
#define SI114X_PS_AUTO 0X0D
#define SI114X_ALS_AUTO 0X0E
#define SI114X_PSALS_AUTO 0X0F
//
//IIC REGISTERS
//
#define SI114X_PART_ID 0X00
#define SI114X_REV_ID 0X01
#define SI114X_SEQ_ID 0X02
#define SI114X_INT_CFG 0X03
#define SI114X_IRQ_ENABLE 0X04
#define SI114X_IRQ_MODE1 0x05
#define SI114X_IRQ_MODE2 0x06
#define SI114X_HW_KEY 0X07
#define SI114X_MEAS_RATE0 0X08
#define SI114X_MEAS_RATE1 0X09
#define SI114X_PS_RATE 0X0A
#define SI114X_PS_LED21 0X0F
#define SI114X_PS_LED3 0X10
#define SI114X_UCOEFF0 0X13
#define SI114X_UCOEFF1 0X14
#define SI114X_UCOEFF2 0X15
#define SI114X_UCOEFF3 0X16
#define SI114X_WR 0X17
#define SI114X_COMMAND 0X18
#define SI114X_RESPONSE 0X20
#define SI114X_IRQ_STATUS 0X21
#define SI114X_ALS_VIS_DATA0 0X22
#define SI114X_ALS_VIS_DATA1 0X23
#define SI114X_ALS_IR_DATA0 0X24
#define SI114X_ALS_IR_DATA1 0X25
#define SI114X_PS1_DATA0 0X26
#define SI114X_PS1_DATA1 0X27
#define SI114X_PS2_DATA0 0X28
#define SI114X_PS2_DATA1 0X29
#define SI114X_PS3_DATA0 0X2A
#define SI114X_PS3_DATA1 0X2B
#define SI114X_AUX_DATA0_UVINDEX0 0X2C
#define SI114X_AUX_DATA1_UVINDEX1 0X2D
#define SI114X_RD 0X2E
#define SI114X_CHIP_STAT 0X30
//
//Parameters
//
#define SI114X_CHLIST 0X01
#define SI114X_CHLIST_ENUV 0x80
#define SI114X_CHLIST_ENAUX 0x40
#define SI114X_CHLIST_ENALSIR 0x20
#define SI114X_CHLIST_ENALSVIS 0x10
#define SI114X_CHLIST_ENPS1 0x01
#define SI114X_CHLIST_ENPS2 0x02
#define SI114X_CHLIST_ENPS3 0x04
#define SI114X_PSLED12_SELECT 0X02
#define SI114X_PSLED3_SELECT 0X03
#define SI114X_PS_ENCODE 0X05
#define SI114X_ALS_ENCODE 0X06
#define SI114X_PS1_ADCMUX 0X07
#define SI114X_PS2_ADCMUX 0X08
#define SI114X_PS3_ADCMUX 0X09
#define SI114X_PS_ADC_COUNTER 0X0A
#define SI114X_PS_ADC_GAIN 0X0B
#define SI114X_PS_ADC_MISC 0X0C
#define SI114X_ALS_IR_ADC_MUX 0X0E
#define SI114X_AUX_ADC_MUX 0X0F
#define SI114X_ALS_VIS_ADC_COUNTER 0X10
#define SI114X_ALS_VIS_ADC_GAIN 0X11
#define SI114X_ALS_VIS_ADC_MISC 0X12
#define SI114X_LED_REC 0X1C
#define SI114X_ALS_IR_ADC_COUNTER 0X1D
#define SI114X_ALS_IR_ADC_GAIN 0X1E
#define SI114X_ALS_IR_ADC_MISC 0X1F
//
//USER SETTINGS DEFINE
//
//ADCMUX
#define SI114X_ADCMUX_SMALL_IR 0x00
#define SI114X_ADCMUX_VISIABLE 0x02
#define SI114X_ADCMUX_LARGE_IR 0x03
#define SI114X_ADCMUX_NO 0x06
#define SI114X_ADCMUX_GND 0x25
#define SI114X_ADCMUX_TEMPERATURE 0x65
#define SI114X_ADCMUX_VDD 0x75
//LED SEL
#define SI114X_PSLED12_SELECT_PS1_NONE 0x00
#define SI114X_PSLED12_SELECT_PS1_LED1 0x01
#define SI114X_PSLED12_SELECT_PS1_LED2 0x02
#define SI114X_PSLED12_SELECT_PS1_LED3 0x04
#define SI114X_PSLED12_SELECT_PS2_NONE 0x00
#define SI114X_PSLED12_SELECT_PS2_LED1 0x10
#define SI114X_PSLED12_SELECT_PS2_LED2 0x20
#define SI114X_PSLED12_SELECT_PS2_LED3 0x40
#define SI114X_PSLED3_SELECT_PS2_NONE 0x00
#define SI114X_PSLED3_SELECT_PS2_LED1 0x10
#define SI114X_PSLED3_SELECT_PS2_LED2 0x20
#define SI114X_PSLED3_SELECT_PS2_LED3 0x40
//ADC GAIN DIV
#define SI114X_ADC_GAIN_DIV1 0X00
#define SI114X_ADC_GAIN_DIV2 0X01
#define SI114X_ADC_GAIN_DIV4 0X02
#define SI114X_ADC_GAIN_DIV8 0X03
#define SI114X_ADC_GAIN_DIV16 0X04
#define SI114X_ADC_GAIN_DIV32 0X05
//LED CURRENT
#define SI114X_LED_CURRENT_5MA 0X01
#define SI114X_LED_CURRENT_11MA 0X02
#define SI114X_LED_CURRENT_22MA 0X03
#define SI114X_LED_CURRENT_45MA 0X04
//Recovery period the ADC takes before making a PS measurement
#define SI114X_ADC_COUNTER_1ADCCLK 0X00
#define SI114X_ADC_COUNTER_7ADCCLK 0X01
#define SI114X_ADC_COUNTER_15ADCCLK 0X02
#define SI114X_ADC_COUNTER_31ADCCLK 0X03
#define SI114X_ADC_COUNTER_63ADCCLK 0X04
#define SI114X_ADC_COUNTER_127ADCCLK 0X05
#define SI114X_ADC_COUNTER_255ADCCLK 0X06
#define SI114X_ADC_COUNTER_511ADCCLK 0X07
//ADC MISC
#define SI114X_ADC_MISC_LOWRANGE 0X00
#define SI114X_ADC_MISC_HIGHRANGE 0X20
#define SI114X_ADC_MISC_ADC_NORMALPROXIMITY 0X00
#define SI114X_ADC_MISC_ADC_RAWADC 0X04
//INT OE
#define SI114X_INT_CFG_INTOE 0X01
//IRQ ENABLE
#define SI114X_IRQEN_ALS 0x01
#define SI114X_IRQEN_PS1 0x04
#define SI114X_IRQEN_PS2 0x08
#define SI114X_IRQEN_PS3 0x10
/********************************************************************************************/
uint8_t Si1145ReadByte(uint8_t reg)
{
return I2cRead8(SI114X_ADDR, reg);
}
uint16_t Si1145ReadHalfWord(uint8_t reg)
{
return I2cRead16LE(SI114X_ADDR, reg);
}
bool Si1145WriteByte(uint8_t reg, uint16_t val)
{
I2cWrite8(SI114X_ADDR, reg, val);
}
uint8_t Si1145WriteParamData(uint8_t p, uint8_t v)
{
Si1145WriteByte(SI114X_WR, v);
Si1145WriteByte(SI114X_COMMAND, p | SI114X_SET);
return Si1145ReadByte(SI114X_RD);
}
/********************************************************************************************/
bool Si1145Present()
{
return (Si1145ReadByte(SI114X_PART_ID) == 0X45);
}
void Si1145Reset()
{
Si1145WriteByte(SI114X_MEAS_RATE0, 0);
Si1145WriteByte(SI114X_MEAS_RATE1, 0);
Si1145WriteByte(SI114X_IRQ_ENABLE, 0);
Si1145WriteByte(SI114X_IRQ_MODE1, 0);
Si1145WriteByte(SI114X_IRQ_MODE2, 0);
Si1145WriteByte(SI114X_INT_CFG, 0);
Si1145WriteByte(SI114X_IRQ_STATUS, 0xFF);
Si1145WriteByte(SI114X_COMMAND, SI114X_RESET);
delay(10);
Si1145WriteByte(SI114X_HW_KEY, 0x17);
delay(10);
}
void Si1145DeInit()
{
//ENABLE UV reading
//these reg must be set to the fixed value
Si1145WriteByte(SI114X_UCOEFF0, 0x29);
Si1145WriteByte(SI114X_UCOEFF1, 0x89);
Si1145WriteByte(SI114X_UCOEFF2, 0x02);
Si1145WriteByte(SI114X_UCOEFF3, 0x00);
Si1145WriteParamData(SI114X_CHLIST, SI114X_CHLIST_ENUV | SI114X_CHLIST_ENALSIR | SI114X_CHLIST_ENALSVIS | SI114X_CHLIST_ENPS1);
//
//set LED1 CURRENT(22.4mA)(It is a normal value for many LED)
//
Si1145WriteParamData(SI114X_PS1_ADCMUX, SI114X_ADCMUX_LARGE_IR);
Si1145WriteByte(SI114X_PS_LED21, SI114X_LED_CURRENT_22MA);
Si1145WriteParamData(SI114X_PSLED12_SELECT, SI114X_PSLED12_SELECT_PS1_LED1);
//
//PS ADC SETTING
//
Si1145WriteParamData(SI114X_PS_ADC_GAIN, SI114X_ADC_GAIN_DIV1);
Si1145WriteParamData(SI114X_PS_ADC_COUNTER, SI114X_ADC_COUNTER_511ADCCLK);
Si1145WriteParamData(SI114X_PS_ADC_MISC, SI114X_ADC_MISC_HIGHRANGE | SI114X_ADC_MISC_ADC_RAWADC);
//
//VIS ADC SETTING
//
Si1145WriteParamData(SI114X_ALS_VIS_ADC_GAIN, SI114X_ADC_GAIN_DIV1);
Si1145WriteParamData(SI114X_ALS_VIS_ADC_COUNTER, SI114X_ADC_COUNTER_511ADCCLK);
Si1145WriteParamData(SI114X_ALS_VIS_ADC_MISC, SI114X_ADC_MISC_HIGHRANGE);
//
//IR ADC SETTING
//
Si1145WriteParamData(SI114X_ALS_IR_ADC_GAIN, SI114X_ADC_GAIN_DIV1);
Si1145WriteParamData(SI114X_ALS_IR_ADC_COUNTER, SI114X_ADC_COUNTER_511ADCCLK);
Si1145WriteParamData(SI114X_ALS_IR_ADC_MISC, SI114X_ADC_MISC_HIGHRANGE);
//
//interrupt enable
//
Si1145WriteByte(SI114X_INT_CFG, SI114X_INT_CFG_INTOE);
Si1145WriteByte(SI114X_IRQ_ENABLE, SI114X_IRQEN_ALS);
//
//AUTO RUN
//
Si1145WriteByte(SI114X_MEAS_RATE0, 0xFF);
Si1145WriteByte(SI114X_COMMAND, SI114X_PSALS_AUTO);
}
boolean Si1145Begin()
{
if (!Si1145Present()) { return false; }
Si1145Reset();
Si1145DeInit();
return true;
}
// returns the UV index * 100 (divide by 100 to get the index)
uint16_t Si1145ReadUV()
{
return Si1145ReadHalfWord(SI114X_AUX_DATA0_UVINDEX0);
}
// returns visible+IR light levels
uint16_t Si1145ReadVisible()
{
return Si1145ReadHalfWord(SI114X_ALS_VIS_DATA0);
}
// returns IR light levels
uint16_t Si1145ReadIR()
{
return Si1145ReadHalfWord(SI114X_ALS_IR_DATA0);
}
/********************************************************************************************/
void Si1145Update()
{
if (!si1145_type) {
if (Si1145Begin()) {
si1145_type = 1;
snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, "SI1145", SI114X_ADDR);
AddLog(LOG_LEVEL_DEBUG);
}
}
}
#ifdef USE_WEBSERVER
const char HTTP_SNS_SI1145[] PROGMEM = "%s"
"{s}SI1145 " D_ILLUMINANCE "{m}%d " D_UNIT_LUX "{e}" // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
"{s}SI1145 " D_INFRARED "{m}%d " D_UNIT_LUX "{e}"
"{s}SI1145 " D_UV_INDEX "{m}%d.%d{e}";
#endif // USE_WEBSERVER
void Si1145Show(boolean json)
{
if (si1145_type && Si1145Present()) {
uint16_t visible = Si1145ReadVisible();
uint16_t infrared = Si1145ReadIR();
uint16_t uvindex = Si1145ReadUV();
if (json) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"SI1145\":{\"" D_JSON_ILLUMINANCE "\":%d,\"" D_JSON_INFRARED "\":%d,\"" D_JSON_UVINDEX "\":%d.%d}"),
mqtt_data, visible, infrared, uvindex /100, uvindex %100);
#ifdef USE_DOMOTICZ
if (0 == tele_period) DomoticzSensor(DZ_ILLUMINANCE, visible);
#endif // USE_DOMOTICZ
} else {
#ifdef USE_WEBSERVER
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_SI1145, mqtt_data, visible, infrared, uvindex /100, uvindex %100);
#endif
}
} else {
si1145_type = 0;
}
}
/*********************************************************************************************\
* Interface
\*********************************************************************************************/
#define XSNS_24
boolean Xsns24(byte function)
{
boolean result = false;
if (i2c_flg) {
switch (function) {
case FUNC_EVERY_SECOND:
Si1145Update();
break;
case FUNC_JSON_APPEND:
Si1145Show(1);
break;
#ifdef USE_WEBSERVER
case FUNC_WEB_APPEND:
Si1145Show(0);
break;
#endif // USE_WEBSERVER
}
}
return result;
}
#endif // USE_SI1145
#endif // USE_I2C