v5.8.0n - Add language, device and clock commands

5.8.0n
 * Fix minimum TelePeriod of 10 seconds set by web page
 * Shrink
information web page by 1k code space
 * Removed Arduino IDE version too
low warning as it interferes with platformio.ini platform =
espressif8266_stage
 * Add commands Color2, Color3, Color4, Width2,
Width3, Width4 and SetOption16 to set Ws2812 Clock parameters (#1019)
 *
Add Polish language file (#1044, #1047)
 * Add support for KMC 70011
Power Monitoring Smart Plug (#1045)
 * Corrected German language file
(#1054)
This commit is contained in:
arendst 2017-10-23 12:18:15 +02:00
parent fc89330056
commit 1296432da2
16 changed files with 1198 additions and 410 deletions

View File

@ -1,7 +1,7 @@
## Sonoff-Tasmota
Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE.
Current version is **5.8.0m** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
Current version is **5.8.0n** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
### ATTENTION All versions

View File

@ -14,10 +14,10 @@ src_dir = sonoff
;env_default = sonoff
;env_default = sonoff-NL
;env_default = sonoff-DE
;env_default = sonoff-PL
;env_default = sonoff-minimal
;env_default = sonoff-ds18x20
; *** Sonoff et al
[env:sonoff]
platform = espressif8266
framework = arduino
@ -40,7 +40,6 @@ monitor_baud = 115200
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
; *** Sonoff et al
[env:sonoff-NL]
platform = espressif8266
framework = arduino
@ -63,7 +62,6 @@ monitor_baud = 115200
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
; *** Sonoff et al
[env:sonoff-DE]
platform = espressif8266
framework = arduino
@ -86,6 +84,28 @@ monitor_baud = 115200
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
[env:sonoff-PL]
platform = espressif8266
framework = arduino
board = esp01_1m
board_flash_mode = dout
build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DMY_LANGUAGE=pl-PL
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; *** Serial Monitor options
monitor_baud = 115200
; *** Upload Serial reset method for Wemos and NodeMCU
;upload_resetmethod = nodemcu
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
;extra_scripts = pio/sftp-uploader.py
; *** Upload file to OTA server using HTTP
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
; Sonoff minimal
[env:sonoff-minimal] ; Placeholder to be configured
platform = espressif8266

View File

@ -1,4 +1,13 @@
/* 5.8.0m
/* 5.8.0n
* Fix minimum TelePeriod of 10 seconds set by web page
* Shrink information web page by 1k code space
* Removed Arduino IDE version too low warning as it interferes with platformio.ini platform = espressif8266_stage
* Add commands Color2, Color3, Color4, Width2, Width3, Width4 and SetOption16 to set Ws2812 Clock parameters (#1019)
* Add Polish language file (#1044, #1047)
* Add support for KMC 70011 Power Monitoring Smart Plug (#1045)
* Corrected German language file (#1054)
*
* 5.8.0m
* Rewrite code (partly) using Google C++ Style Guide (https://google.github.io/styleguide/cppguide.html)
* Allow empty MqttHost name by using option 0
* Allow Mqtt server mDNS lookup only when MqttHost name is empty (#1026)
@ -77,7 +86,7 @@
* Fix compile error when DOMOTICZ_UPDATE_TIMER is not defined (#930)
* Fix alignment of web page items in some browsers (#935)
* Add smoother movement of hour hand in WS2812 led clock (#936)
* Add support for Magic Home RGBW Led controller (#940)
* Add support for Magic Home and Arilux RGBW Led controller (#940)
*
* 5.8.0b
* Fix command FullTopic entry when using serial or console interface

View File

@ -100,12 +100,12 @@
#define D_FREE_MEMORY "freier Speicher"
#define D_FREEMEMORY "frei"
#define D_FROM "von"
#define D_GATEWAY "gateway"
#define D_GATEWAY "Gateway"
#define D_GROUP "Gruppe"
#define D_HEAPSIZE "Heap-Größe"
#define D_HIGH "hoch"
#define D_HOST "host"
#define D_HOSTNAME "hostname"
#define D_HOSTNAME "Hostname"
#define D_HUMIDITY "Feuchtigkeit"
#define D_ILLUMINANCE "Beleuchtungsintensität"
#define D_IMMEDIATE "direkt" // Button immediate
@ -187,7 +187,7 @@
#define D_UNKNOWN "unbekannt"
#define D_UPGRADE "upgrade"
#define D_UPLOAD "upload"
#define D_UPTIME "uptime"
#define D_UPTIME "Laufzeit"
#define D_UTC_TIME "UTC"
#define D_USER "Benutzer"
#define D_VCC "VCC"
@ -273,7 +273,7 @@
#define D_CONFIGURE_MQTT "MQTT konfigurieren"
#define D_CONFIGURE_DOMOTICZ "Domoticz konfigurieren"
#define D_CONFIGURE_LOGGING "Logging konfigurieren"
#define D_CONFIGURE_OTHER "Andere konfigurieren"
#define D_CONFIGURE_OTHER "Sonstige Konfiguration"
#define D_CONFIRM_RESET_CONFIGURATION "Zurücksetzen der Konfiguration bestätigen"
#define D_RESET_CONFIGURATION "Konfiguration zurücksetzen"
#define D_BACKUP_CONFIGURATION "Konfiguration sichern"
@ -443,9 +443,9 @@
#define D_POWERMONITOR "PowerMonitor"
#define D_ENERGYMONITOR "EnergyMonitor"
#define D_MAXENERGYREACHED "MaxEnergyReached"
#define D_ENERGY_TODAY "Strom heute"
#define D_ENERGY_YESTERDAY "Strom gestern"
#define D_ENERGY_TOTAL "Stromtotal"
#define D_ENERGY_TODAY "Energie heute"
#define D_ENERGY_YESTERDAY "Energie gestern"
#define D_ENERGY_TOTAL "Energie insgesamt"
// xsns_sht1x.ino
#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor hat ACK-Befehl nicht ausgeführt"

688
sonoff/language/pl-PL.h Normal file
View File

@ -0,0 +1,688 @@
/*
pl-PL.h - localization for Polish without fonetick - Poland for Sonoff-Tasmota
Copyright (C) 2017 Theo Arends (translated by roblad - Robert L.)
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/>.
*/
#ifndef _LANGUAGE_PL_PL_H_
#define _LANGUAGE_PL_PL_H_
/*************************** ATTENTION *******************************\
*
* Due to memory constraints only UTF-8 is supported.
* To save code space keep text as short as possible.
* Time and Date provided by SDK can not be localized (yet).
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
* Use online command Prefix to translate cmnd, stat and tele.
*
\*********************************************************************/
// "2017-03-07T11:08:02" - ISO8601:2004
#define D_YEAR_MONTH_SEPARATOR "-"
#define D_MONTH_DAY_SEPARATOR "-"
#define D_DATE_TIME_SEPARATOR "T"
#define D_HOUR_MINUTE_SEPARATOR ":"
#define D_MINUTE_SECOND_SEPARATOR ":"
#define D_DAY3LIST "PonWtoSroCzwPiaSobNie"
#define D_MONTH3LIST "StyLutMarKwiMajCzeLipSieWrzPazLisGru"
// Non JSON decimal separator
#define D_DECIMAL_SEPARATOR ","
// Common
#define D_ABORTED "Anulowany"
#define D_ACTIVE "Aktywny"
#define D_ADDRESS "Adres"
#define D_ADMIN "Admin"
#define D_AIR_QUALITY "Jakosc powietrza"
#define D_AIRQUALITY "JakPowietrza"
#define D_AP "AP" // Access Point
#define D_APMAC_ADDRESS "APMac"
#define D_APPENDED "Dolaczony"
#define D_AS "jak"
#define D_AUTO "AUTO"
#define D_BAUDRATE "Szybkosc transmisji"
#define D_BLINK "Miganie"
#define D_BLINKOFF "MiganieWyl"
#define D_BOOTVERSION "Uruchomienie"
#define D_BOOT_COUNT "Licznik uruchomienia"
#define D_BOOTCOUNT "LiczUruchomienia"
#define D_BRIGHTLIGHT "Jasny"
#define D_BUILDDATETIME "ZbudowanoDataCzas"
#define D_BUTTON "Przycisk"
#define D_CELSIUS "Celsiusza"
#define D_CODE "kod" // Button code
#define D_COLDLIGHT "Zimny"
#define D_COMMAND "Komenda"
#define D_CONNECTED "Polaczony"
#define D_COREVERSION "Wersja"
#define D_COUNT "Licz"
#define D_COUNTER "Licznik"
#define D_CURRENT "Biezacy" // As in Voltage and Current
#define D_DATA "Data"
#define D_DARKLIGHT "Ciemny"
#define D_DEBUG "Debug"
#define D_DISABLED "Zablokowany"
#define D_DNS_SERVER "Server DNS"
#define D_DNSSERVER "ServerDNS"
#define D_DONE "Wykonane"
#define D_DST_TIME "DST"
#define D_EMPTY "Pusty"
#define D_EMULATION "Emulacja"
#define D_ENABLED "Otwarty"
#define D_ENDDST "KoniecDST" // End Daylight Savings Time
#define D_ERASE "Nadpisz"
#define D_ERROR "Blad"
#define D_EVERY "Kazdy"
#define D_FAHRENHEIT "Fahrenheita"
#define D_FAILED "Bledny"
#define D_FALLBACK "Awaryjny"
#define D_FALLBACK_TOPIC "Zastepczy temat"
#define D_FALLBACKTOPIC "ZastepczyTemat"
#define D_FALSE "Falsz"
#define D_FILE "Plik"
#define D_FLASHMODE "FlashMode"
#define D_FLASHSIZE "FlashWielkosc"
#define D_FREE_MEMORY "Wolna pamiec"
#define D_FREEMEMORY "Wolne"
#define D_FROM "z"
#define D_GATEWAY "Brama"
#define D_GROUP "Grupa"
#define D_HEAPSIZE "Stos"
#define D_HIGH "Wysoki"
#define D_HOST "Serwer"
#define D_HOSTNAME "Nazwa serwera"
#define D_HUMIDITY "Wilgotnosc"
#define D_ILLUMINANCE "Oswietlenie"
#define D_IMMEDIATE "Natychmiastowe" // Button immediate
#define D_INDEX "Indeks"
#define D_INFO "Informacja"
#define D_INITIALIZED "Zainicjowany"
#define D_IP_ADDRESS "Adres IP"
#define D_LIGHT "Swiatlo"
#define D_LOCAL_TIME "Lokalny"
#define D_LOW "Niski"
#define D_LWT "LWT"
#define D_MAC "Mac"
#define D_MASK "Maska"
#define D_MODULE "Modul"
#define D_MQTT "MQTT"
#define D_MULTI_PRESS "wielokrotne-nacisniecie"
#define D_NO "Nie"
#define D_NOISE "Halas"
#define D_NONE "Brak"
#define D_OFF "Wylaczony"
#define D_OFFLINE "Nieaktywny"
#define D_OK "Ok"
#define D_ON "Wlaczony"
#define D_ONLINE "Aktywny"
#define D_OR "lub"
#define D_PASSWORD "Haslo"
#define D_PERIOD "Okres"
#define D_PORT "Port"
#define D_POWER_FACTOR "Wspolczynik mocy"
#define D_POWERFACTOR "WspolczynikMocy"
#define D_POWERUSAGE "Moc"
#define D_PRESSURE "Cisnienie"
#define D_PRESSUREATSEALEVEL "Cisnienie na poziomie morza"
#define D_PROGRAM_FLASH_SIZE "Wielkosc programu flash"
#define D_PROGRAMFLASHSIZE "ProgramFlashSize"
#define D_PROGRAM_SIZE "Wielkosc programu"
#define D_PROGRAMSIZE "ProgramSize"
#define D_PROJECT "Projekt"
#define D_RECEIVED "Otrzymany"
#define D_RESTART "Restart"
#define D_RESTARTING "Restartowanie"
#define D_RESTART_REASON "Przyczyna restartu"
#define D_RESTARTREASON "PrzyczynaRestartu"
#define D_RESTORE "Przywracanie"
#define D_RETAINED "Zachowane"
#define D_SAVE "Zapisz"
#define D_SAVEADDRESS "AdresZapisu"
#define D_SAVECOUNT "LicznikZapisu"
#define D_SAVESTATE "StanZapisu"
#define D_SDKVERSION "SDK"
#define D_SELECTED "Wybrany"
#define D_SENSOR "Czujnik"
#define D_SERIAL "Serial"
#define D_BYTES "Bajtow"
#define D_SSID "SSID"
#define D_START "Start"
#define D_STARTED "Uruchomiony"
#define D_STARTDST "StartDST" // Start Daylight Savings Time
#define D_STD_TIME "STD"
#define D_STOP "Stop"
#define D_SUBNET_MASK "Maska podsieci"
#define D_SUBNETMASK "MaskaPodsieci"
#define D_SUBSCRIBE_TO "Subskrybuj do"
#define D_SUCCESSFUL "Powodzenie"
#define D_SWITCH "Przelacznik"
#define D_SYNC "Sync"
#define D_SYS "System " // Sys log
#define D_TEMPERATURE "Temperatura"
#define D_TEMPERATURE_UNIT "JednTemp"
#define D_TIME "Czas"
#define D_TO "do"
#define D_TODAY "Dzisiaj"
#define D_TOGGLE "Przelacz"
#define D_TOPIC "Temat"
#define D_TOTAL "Suma"
#define D_TRANSMIT "Wyslij"
#define D_TRUE "Prawda"
#define D_TYPE "Typ"
#define D_UNKNOWN "Nieznany"
#define D_UPGRADE "Aktualizacji"
#define D_UPLOAD "Wgraj"
#define D_UPTIME "Uptime"
#define D_UTC_TIME "UTC"
#define D_USER "Uzytkownik"
#define D_VCC "VCC"
#define D_VERSION "Wersja"
#define D_VOLTAGE "Napiecie"
#define D_WARMLIGHT "Nagrzanie"
#define D_WEB "Web" // Web log
#define D_WEB_SERVER "Web Server"
#define D_WIFI "Wifi"
#define D_WRONG "Bledny"
#define D_YESTERDAY "Wczoraj"
// settings.ino
#define D_SAVED_TO_FLASH_AT "Zapisane do pamieci flash w"
#define D_LOADED_FROM_FLASH_AT "Wczytane z pamieci flash z"
#define D_USE_DEFAULTS "Uzyj domyslnych"
#define D_ERASED_SECTOR "Wymazany sektor"
// sonoff.ino
#define D_LEVEL_10 "poziom 1-0"
#define D_LEVEL_01 "poziom 0-1"
#define D_SERIAL_LOGGING_DISABLED "Wylaczony dziennik na porcie szeregowym"
#define D_SYSLOG_LOGGING_REENABLED "Wznowiono zapis do Syslog"
#define D_SET_BAUDRATE_TO "Ustaw szybkosc transmisji na"
#define D_RECEIVED_TOPIC "Otrzymany temat"
#define D_DATA_SIZE "Wielkosc danych"
#define D_ANALOG_INPUT0 "Wejscie analogowe-0"
#define D_FINGERPRINT "Weryfikuj odcisk TLS..."
#define D_TLS_CONNECT_FAILED_TO "Nieudane polaczenie TLS do"
#define D_RETRY_IN "Sprobuj ponownie"
#define D_VERIFIED "Zweryfikowano"
#define D_INSECURE "Nieprawidlowe polaczenie z powodu blednego odcisku TLS"
#define D_CONNECT_FAILED_TO "Nie udalo sie nawiazac polaczenia"
// support.ino
#define D_OSWATCH "osWatch"
#define D_BLOCKED_LOOP "Petla zablokowana"
#define D_WPS_FAILED_WITH_STATUS "Blad WPSconfig ze statusem"
#define D_ACTIVE_FOR_1_MINUTE "aktywny 1 minute"
#define D_FAILED_TO_START "nie udalo sie uruchomic"
#define D_PATCH_ISSUE_2186 "Blad latki 2186"
#define D_CONNECTING_TO_AP "Laczenie z AP"
#define D_IN_MODE "w trybie"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Polaczenie nie powiodlo sie, poniewaz nie otrzymano adresu IP"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Polaczenie nie powiodlo sie jako AP nie mozna osiagnac"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Polaczenie nie powiodlo sie z nieprawidlowym haslem dostepu AP"
#define D_CONNECT_FAILED_AP_TIMEOUT "Nie udalo sie nawiazac polaczenia, limit czasu AP przekroczony"
#define D_ATTEMPTING_CONNECTION "Proba polaczenia..."
#define D_CHECKING_CONNECTION "Sprawdzanie polaczenia..."
#define D_QUERY_DONE "Wykonano zapytanie. Znaleziono uslugi MQTT"
#define D_MQTT_SERVICE_FOUND "Usluga MQTT została znaleziona"
#define D_I2CSCAN_DEVICES_FOUND_AT "Znaleziono urządzenie(a) na"
#define D_FOUND_AT "znalezione w"
#define D_I2CSCAN_UNKNOWN_ERROR_AT "Nieznany blad w"
#define D_I2CSCAN_NO_DEVICES_FOUND "Nie znaleziono urzadzen"
#define D_SYSLOG_HOST_NOT_FOUND "Syslog Host nie znaleziony"
// webserver.ino
#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Oprogramowanie MINIMAL - prosze uaktualnic"
#define D_WEBSERVER_ACTIVE_ON "Aktywny serwer Web"
#define D_WITH_IP_ADDRESS "z adresem IP"
#define D_WEBSERVER_STOPPED "Serwer Web zatrzymany"
#define D_FILE_NOT_FOUND "Plik nie odnaleziony"
#define D_REDIRECTED "Przekierowano do wlasnego portalu"
#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Menedzer Wifi ustawia punkt dostepowy i zachowuje stacje"
#define D_WIFIMANAGER_SET_ACCESSPOINT "Menedzer sieci Wi-Fi Access Point"
#define D_TRYING_TO_CONNECT "Probuje polaczyc urzadzenie z siecia"
#define D_RESTART_IN "Zrestartuj"
#define D_SECONDS "sekund"
#define D_DEVICE_WILL_RESTART "Urzadzenie zrestartuje sie za kilka sekund"
#define D_BUTTON_TOGGLE "Przelacznik"
#define D_CONFIGURATION "Konfiguracja"
#define D_INFORMATION "Informacje"
#define D_FIRMWARE_UPGRADE "Uaktualnienie oprogramowania"
#define D_CONSOLE "Konsola"
#define D_CONFIRM_RESTART "Potwierdz restart"
#define D_CONFIGURE_MODULE "Konfiguruj modul"
#define D_CONFIGURE_WIFI "Konfiguruj WiFi"
#define D_CONFIGURE_MQTT "Konfiguruj MQTT"
#define D_CONFIGURE_DOMOTICZ "Konfiguruj Domoticz"
#define D_CONFIGURE_LOGGING "Konfiguruj zapis dziennika"
#define D_CONFIGURE_OTHER "Konfiguruj inne"
#define D_CONFIRM_RESET_CONFIGURATION "Potwierdz reset ustawien"
#define D_RESET_CONFIGURATION "Reset ustawien"
#define D_BACKUP_CONFIGURATION "Kopia ustawien"
#define D_RESTORE_CONFIGURATION "Przywrocenie ustawien"
#define D_MAIN_MENU "Menu glowne"
#define D_MODULE_PARAMETERS "Parametery modulu"
#define D_MODULE_TYPE "Typ modulu"
#define D_GPIO "GPIO"
#define D_SERIAL_IN "Serial In"
#define D_SERIAL_OUT "Serial Out"
#define D_WIFI_PARAMETERS "Parametry WiFi"
#define D_SCAN_FOR_WIFI_NETWORKS "Skanuj sieci WiFi"
#define D_SCAN_DONE "Skan wykonany"
#define D_NO_NETWORKS_FOUND "Nie znaleziono sieci"
#define D_REFRESH_TO_SCAN_AGAIN "Odswiez aby ponownie zeskanowac"
#define D_DUPLICATE_ACCESSPOINT "Kopiuj AP"
#define D_SKIPPING_LOW_QUALITY "Pominieto z powodu niskiej jakości sygnalu"
#define D_RSSI "RSSI"
#define D_WEP "WEP"
#define D_WPA_PSK "WPA PSK"
#define D_WPA2_PSK "WPA2 PSK"
#define D_AP1_SSID "AP1 SSID"
#define D_AP1_PASSWORD "Haslo AP1"
#define D_AP2_SSID "AP2 SSID"
#define D_AP2_PASSWORD "Haslo AP2"
#define D_MQTT_PARAMETERS "Parametery MQTT"
#define D_CLIENT "Klient"
#define D_FULL_TOPIC "Pelen temat"
#define D_LOGGING_PARAMETERS "Opcje dziennika"
#define D_LOG_LEVEL "poziom dziennika"
#define D_MORE_DEBUG "Wiecej informacji debugujacych"
#define D_SYSLOG_HOST "Syslog host"
#define D_SYSLOG_PORT "Syslog port"
#define D_TELEMETRY_PERIOD "Okres telemetrii"
#define D_OTHER_PARAMETERS "Inne parametery"
#define D_WEB_ADMIN_PASSWORD "Haslo administratora Web"
#define D_MQTT_ENABLE "MQTT aktywne"
#define D_FRIENDLY_NAME "Przyjazna nazwa"
#define D_BELKIN_WEMO "Belkin WeMo"
#define D_HUE_BRIDGE "Hue Bridge"
#define D_SINGLE_DEVICE "single device"
#define D_MULTI_DEVICE "multi device"
#define D_SAVE_CONFIGURATION "Zapisz ustawienia"
#define D_CONFIGURATION_SAVED "Ustawienia zapisane"
#define D_CONFIGURATION_RESET "Ustawienia zresetowane"
#define D_PROGRAM_VERSION "Wersja programu"
#define D_BUILD_DATE_AND_TIME "Dzien i godzina kompilacji"
#define D_CORE_AND_SDK_VERSION "Wersja Core/SDK"
#define D_FLASH_WRITE_COUNT "Liczba zapisow do pamieci"
#define D_MAC_ADDRESS "Adres Mac"
#define D_MQTT_HOST "Host MQTT"
#define D_MQTT_PORT "Port MQTT"
#define D_MQTT_CLIENT "Klient MQTT"
#define D_MQTT_USER "Uzytkownik MQTT"
#define D_MQTT_TOPIC "Temat MQTT"
#define D_MQTT_GROUP_TOPIC "Temat grupy MQTT"
#define D_MQTT_FULL_TOPIC "Pelen temat MQTT"
#define D_MDNS_DISCOVERY "Wykrywanie mDNS"
#define D_MDNS_ADVERTISE "Rozglaszanie mDNS"
#define D_ESP_CHIP_ID "ID ukladu ESP"
#define D_FLASH_CHIP_ID "ID ukladu pamieci flash"
#define D_FLASH_CHIP_SIZE "Rozmiar flash"
#define D_FREE_PROGRAM_SPACE "Wolne miejsce programu"
#define D_UPGRADE_BY_WEBSERVER "Aktualizacja z serwera Web"
#define D_OTA_URL "URL OTA"
#define D_START_UPGRADE "Start aktualizacji"
#define D_UPGRADE_BY_FILE_UPLOAD "Aktualizacja poprzez wgranie pliku"
#define D_UPLOAD_STARTED "Wgrywanie rozpoczete"
#define D_UPGRADE_STARTED "Aktualizacja rozpoczeta"
#define D_UPLOAD_DONE "Wgrywanie zakonczone"
#define D_UPLOAD_ERR_1 "Nie wybrano pliku"
#define D_UPLOAD_ERR_2 "Niewystarczajaca ilosc miejsca"
#define D_UPLOAD_ERR_3 "Magiczny bajt jest inny niz 0xE9"
#define D_UPLOAD_ERR_4 "Rozmiar programu jest wiekszy niz rzeczywisty rozmiar pamieci flash"
#define D_UPLOAD_ERR_5 "Wgrywanie, bufor niezgodnosci stanu porownywanych bitow"
#define D_UPLOAD_ERR_6 "Blad wgrywania. Uruchomiono zapis do dziennika na poziomie 3"
#define D_UPLOAD_ERR_7 "Wgrywanie przerwane"
#define D_UPLOAD_ERR_8 "Bledny plik"
#define D_UPLOAD_ERR_9 "Plik jest za duzy"
#define D_UPLOAD_ERROR_CODE "Blad wgrywania"
#define D_ENTER_COMMAND "Wprowadz polecenie"
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Wlacz poziom 2 zapisu Weblog, jesli oczekiwana jest odpowiedz"
#define D_NEED_USER_AND_PASSWORD "Wymagany uzytkownik=<username>&haslo=<password>"
// xdrv_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Parametry Domoticz"
#define D_DOMOTICZ_IDX "Idx"
#define D_DOMOTICZ_KEY_IDX "Key idx"
#define D_DOMOTICZ_SWITCH_IDX "Przelacznik idx"
#define D_DOMOTICZ_SENSOR_IDX "Sensor idx"
#define DOMOTICZ_SENSORS_MAX_STRING_LENGTH 14
#define D_DOMOTICZ_TEMP "Temp"
#define D_DOMOTICZ_TEMP_HUM "Temp,Wilg"
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Wilg,Cis"
#define D_DOMOTICZ_POWER_ENERGY "Moc,Energia"
#define D_DOMOTICZ_ILLUMINANCE "Oswietl."
#define D_DOMOTICZ_COUNT "Licznik"
#define D_DOMOTICZ_VOLTAGE "Napiecie"
#define D_DOMOTICZ_CURRENT "Prad"
#define D_DOMOTICZ_UPDATE_TIMER "Zaktualizuj czasomierz"
// xdrv_ir-send.ino
#define D_INVALID_JSON "Invalid JSON"
#define D_PROTOCOL_NOT_SUPPORTED "Protokol nie jest obslugiwany"
#define D_IR_PROTOCOL "PROTOCOL"
#define D_IR_BITS "BITS"
#define D_IR_DATA "DATA"
#define D_IRHVAC_VENDOR "VENDOR"
#define D_IRHVAC_POWER "POWER"
#define D_IRHVAC_MODE "MODE"
#define D_IRHVAC_FANSPEED "FANSPEED"
#define D_IRHVAC_TEMP "TEMP"
#define D_IRRECEIVED "IrReceived"
// xdrv_snfbridge.ino
#define D_RFRECEIVED "RfReceived"
#define D_START_LEARNING "Zacznij nauke"
#define D_SET_TO_DEFAULT "Ustaw domyslne"
#define D_DEFAULT_SENT "Domyslne wyslane"
#define D_LEARNED_SENT "Wyuczone wyslane"
#define D_LEARNING_ACTIVE "Wyuczone aktywne"
#define D_LEARN_FAILED "Uczenie niepowodzenie"
#define D_LEARNED "Wyuczone"
// xdrv_wemohue.ino
#define D_MULTICAST_DISABLED "Multicast jest wylaczony"
#define D_MULTICAST_REJOINED "Multicast (re)dolaczony"
#define D_MULTICAST_JOIN_FAILED "Multicast nie powiodlo sie"
#define D_FAILED_TO_SEND_RESPONSE "Nie udalo sie wyslac odpowiedzi"
#define D_WEMO "WeMo"
#define D_WEMO_BASIC_EVENT "WeMo podstawowe zdarzenie"
#define D_WEMO_EVENT_SERVICE "WeMo zdarzenie service"
#define D_WEMO_SETUP "WeMo setup"
#define D_RESPONSE_SENT "Odpowiedz wyslana"
#define D_HUE "Hue"
#define D_HUE_BRIDGE_SETUP "Hue setup"
#define D_HUE_API_NOT_IMPLEMENTED "Hue API nie zaimplementowane"
#define D_HUE_API "Hue API"
#define D_HUE_POST_ARGS "Hue POST args"
#define D_3_RESPONSE_PACKETS_SENT "3 pakiety odpowiedzi wysylane"
// xsns_dht.ino
#define D_TIMEOUT_WAITING_FOR "Trwa oczekiwanie"
#define D_START_SIGNAL_LOW "sygnał startowy niski"
#define D_START_SIGNAL_HIGH "sygnał startowy wysoki"
#define D_PULSE "pulse"
#define D_CHECKSUM_FAILURE "Bledna suma kontrolmna"
// xsns_ds18b20.ino
#define D_SENSOR_BUSY "Czujnik DS18x20 zajety"
#define D_SENSOR_CRC_ERROR "Czujnik DS18x20 blad CRC"
// xsns_hlw8012.ino
#define D_MAXPOWERREACHED "MaksMocOsiagnieta"
#define D_MAXPOWERREACHEDRETRY "MaksMocOsiagnietaPonowienie"
#define D_POWERMONITOR "MonitorMocy"
#define D_ENERGYMONITOR "MonitorEnergii"
#define D_MAXENERGYREACHED "MaksEnergiaOsiagnieta"
#define D_ENERGY_TODAY "Energia Dzisiaj"
#define D_ENERGY_YESTERDAY "Energia Wczoraj"
#define D_ENERGY_TOTAL "Energia suma"
// xsns_sht1x.ino
#define D_SENSOR_DID_NOT_ACK_COMMAND "Czujnik nie otrzymal komendy ACK"
#define D_SHT1X_FOUND "SHT1X znaleziony"
// sonoff_template.h
// Max string length is 8 characters including suffixes
#define D_SENSOR_NONE "Brak"
#define D_SENSOR_DHT11 "DHT11"
#define D_SENSOR_AM2301 "AM2301"
#define D_SENSOR_DHT22 "DHT22"
#define D_SENSOR_DS18X20 "DS18x20"
#define D_SENSOR_I2C_SCL "I2C SCL"
#define D_SENSOR_I2C_SDA "I2C SDA"
#define D_SENSOR_WS2812 "WS2812"
#define D_SENSOR_IRSEND "IRsend"
#define D_SENSOR_SWITCH "Przela" // Suffix "1"
#define D_SENSOR_BUTTON "Przyci" // Suffix "1"
#define D_SENSOR_RELAY "Przek" // Suffix "1i"
#define D_SENSOR_LED "Led" // Suffix "1i"
#define D_SENSOR_PWM "PWM" // Suffix "1"
#define D_SENSOR_COUNTER "Liczni" // Suffix "1"
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_SPI_CS "SPI CS"
#define D_SENSOR_SPI_DC "SPI DC"
#define D_SENSOR_BACKLIGHT "BLight"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_HOUR "Godz"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
#define D_UNIT_MICROSECOND "us"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLISECOND "ms"
#define D_UNIT_MINUTE "Min"
#define D_UNIT_PRESSURE "hPa"
#define D_UNIT_SECOND "sec"
#define D_UNIT_SECTORS "sektory"
#define D_UNIT_VOLT "V"
#define D_UNIT_WATT "W"
#define D_UNIT_WATTHOUR "Wh"
// Log message prefix
#define D_LOG_APPLICATION "APP: "
#define D_LOG_BRIDGE "BRG: "
#define D_LOG_CONFIG "CFG: "
#define D_LOG_COMMAND "CMD: "
#define D_LOG_DHT "DHT: "
#define D_LOG_DOMOTICZ "DOM: "
#define D_LOG_DSB "DSB: "
#define D_LOG_HTTP "HTP: "
#define D_LOG_I2C "I2C: "
#define D_LOG_IRR "IRR: "
#define D_LOG_LOG "LOG: "
#define D_LOG_MODULE "MOD: "
#define D_LOG_MDNS "DNS: "
#define D_LOG_MQTT "MQT: "
#define D_LOG_OTHER "OTH: "
#define D_LOG_RESULT "RSL: "
#define D_LOG_SERIAL "SER: "
#define D_LOG_SHT1 "SHT: "
#define D_LOG_UPLOAD "UPL: "
#define D_LOG_UPNP "UPP: "
#define D_LOG_WIFI "WIF: "
// Result
#define D_RSLT_RESULT "REZULTAT"
#define D_RSLT_INFO "INFO"
#define D_RSLT_STATE "STAN"
#define D_RSLT_SENSOR "SENSOR"
#define D_RSLT_UPTIME "UPTIME"
#define D_RSLT_MARGINS "MARGINES"
#define D_RSLT_WARNING "OSTRZEZENIE"
#define D_RSLT_ENERGY "ENERGIA"
// Commands
#define D_CMND_MQTTHOST "MqttHost"
#define D_CMND_MQTTPORT "MqttPort"
#define D_CMND_MQTTRETRY "MqttRetry"
#define D_CMND_STATETEXT "StateText"
#define D_CMND_MQTTFINGERPRINT "MqttFingerprint"
#define D_CMND_MQTTCLIENT "MqttClient"
#define D_CMND_MQTTUSER "MqttUser"
#define D_CMND_MQTTPASSWORD "MqttPassword"
#define D_CMND_FULLTOPIC "FullTopic"
#define D_CMND_PREFIX "Prefix"
#define PRFX_MAX_STRING_LENGTH 5
#define D_CMND "cmnd"
#define D_STAT "stat"
#define D_TELE "tele"
#define D_CMND_GROUPTOPIC "GroupTopic"
#define D_CMND_TOPIC "Topic"
#define D_CMND_BUTTONTOPIC "ButtonTopic"
#define D_CMND_SWITCHTOPIC "SwitchTopic"
#define D_CMND_BUTTONRETAIN "ButtonRetain"
#define D_CMND_SWITCHRETAIN "SwitchRetain"
#define D_CMND_POWERRETAIN "PowerRetain"
#define D_CMND_SENSORRETAIN "SensorRetain"
#define D_CMND_BACKLOG "Backlog"
#define D_CMND_DELAY "Delay"
#define D_CMND_STATUS "Status"
#define D_STATUS1_PARAMETER "PRM"
#define D_STATUS2_FIRMWARE "FWR"
#define D_STATUS3_LOGGING "LOG"
#define D_STATUS4_MEMORY "MEM"
#define D_STATUS5_NETWORK "NET"
#define D_STATUS6_MQTT "MQT"
#define D_STATUS7_TIME "TIM"
#define D_STATUS8_POWER "PWR"
#define D_STATUS9_MARGIN "PTH"
#define D_STATUS10_SENSOR "SNS"
#define D_STATUS11_STATUS "STS"
#define D_CMND_POWER "Power"
#define D_RSLT_POWER "POWER"
#define D_CMND_POWERONSTATE "PowerOnState"
#define D_CMND_PULSETIME "PulseTime"
#define D_CMND_BLINKTIME "BlinkTime"
#define D_CMND_BLINKCOUNT "BlinkCount"
#define D_CMND_SAVEDATA "SaveData"
#define D_CMND_SETOPTION "SetOption"
#define D_CMND_TEMPERATURE_RESOLUTION "TempRes"
#define D_CMND_HUMIDITY_RESOLUTION "HumRes"
#define D_CMND_PRESSURE_RESOLUTION "PressRes"
#define D_CMND_POWER_RESOLUTION "WattRes"
#define D_CMND_VOLTAGE_RESOLUTION "VoltRes"
#define D_CMND_ENERGY_RESOLUTION "EnergyRes"
#define D_CMND_MODULE "Module"
#define D_CMND_MODULES "Modules"
#define D_CMND_GPIO "GPIO"
#define D_NOT_SUPPORTED "Not supported"
#define D_CMND_GPIOS "GPIOs"
#define D_CMND_PWM "PWM"
#define D_CMND_PWMFREQUENCY "PWMFrequency"
#define D_CMND_PWMRANGE "PWMRange"
#define D_CMND_COUNTER "Counter"
#define D_CMND_COUNTERTYPE "CounterType"
#define D_CMND_COUNTERDEBOUNCE "CounterDebounce"
#define D_CMND_SLEEP "Sleep"
#define D_CMND_UPLOAD "Upload"
#define D_CMND_UPGRADE "Upgrade"
#define D_ONE_OR_GT "1 or >%s to upgrade"
#define D_CMND_OTAURL "OtaUrl"
#define D_CMND_SERIALLOG "SerialLog"
#define D_CMND_SYSLOG "SysLog"
#define D_CMND_LOGHOST "LogHost"
#define D_CMND_LOGPORT "LogPort"
#define D_CMND_IPADDRESS "IPAddress"
#define D_CMND_NTPSERVER "NtpServer"
#define D_CMND_AP "Ap"
#define D_CMND_SSID "SSID"
#define D_CMND_PASSWORD "Password"
#define D_CMND_HOSTNAME "Hostname"
#define D_CMND_WIFICONFIG "WifiConfig"
#define WCFG_MAX_STRING_LENGTH 12
#define D_WCFG_0_RESTART "Restart"
#define D_WCFG_1_SMARTCONFIG "SmartConfig"
#define D_WCFG_2_WIFIMANAGER "WifiManager"
#define D_WCFG_3_WPSCONFIG "WPSConfig"
#define D_WCFG_4_RETRY "Retry"
#define D_WCFG_5_WAIT "Wait"
#define D_CMND_FRIENDLYNAME "FriendlyName"
#define D_CMND_SWITCHMODE "SwitchMode"
#define D_CMND_WEBSERVER "Webserver"
#define D_WEBSERVER_MODE "WebServerMode"
#define D_ACTIVE_FOR "Active for"
#define D_ON_DEVICE "on"
#define D_CMND_WEBPASSWORD "WebPassword"
#define D_CMND_WEBLOG "WebLog"
#define D_CMND_EMULATION "Emulation"
#define D_CMND_TELEPERIOD "TelePeriod"
#define D_CMND_RESTART "Restart"
#define D_ONE_TO_RESTART "1 to restart"
#define D_CMND_RESET "Reset"
#define D_RESET_AND_RESTARTING "Reset and Restarting"
#define D_ONE_TO_RESET "1 to reset"
#define D_CMND_TIMEZONE "Timezone"
#define D_CMND_ALTITUDE "Altitude"
#define D_CMND_LEDPOWER "LedPower"
#define D_CMND_LEDSTATE "LedState"
#define D_CMND_CFGDUMP "CfgDump"
#define D_CMND_I2CSCAN "I2CScan"
#define D_CMND_EXCEPTION "Exception"
// Commands xdrv_domoticz.ino
#define D_CMND_DOMOTICZ "Domoticz"
#define D_CMND_IDX "Idx"
#define D_CMND_KEYIDX "KeyIdx"
#define D_CMND_SWITCHIDX "SwitchIdx"
#define D_CMND_SENSORIDX "SensorIdx"
#define D_CMND_UPDATETIMER "UpdateTimer"
// Commands xdrv_ir_send.ino
#define D_CMND_IRSEND "IRSend"
#define D_CMND_IRHVAC "IRHVAC"
// Commands xdrv_snfbridge.ino
#define D_CMND_RFKEY "RfKey"
#define D_CMND_RFDEFAULT "RfDefault"
// Commands xdrv_snfled.ino
#define D_CMND_COLOR "Color"
#define D_CMND_COLORTEMPERATURE "CT"
#define D_CMND_DIMMER "Dimmer"
#define D_CMND_LEDTABLE "LedTable"
#define D_CMND_FADE "Fade"
#define D_CMND_SPEED "Speed"
#define D_CMND_WAKEUPDURATION "WakeUpDuration"
#define D_CMND_WAKEUP "Wakeup"
// Commands xdrv_ws2812.ino
#define D_CMND_PIXELS "Pixels"
#define D_CMND_LED "Led"
#define D_CMND_WIDTH "Width"
#define D_CMND_SCHEME "Scheme"
// Commands xsns_hlw8012.ino
#define D_CMND_POWERLOW "PowerLow"
#define D_CMND_POWERHIGH "PowerHigh"
#define D_CMND_VOLTAGELOW "VoltageLow"
#define D_CMND_VOLTAGEHIGH "VoltageHigh"
#define D_CMND_CURRENTLOW "CurrentLow"
#define D_CMND_CURRENTHIGH "CurrentHigh"
#define D_CMND_ENERGYRESET "EnergyReset"
#define D_CMND_HLWPCAL "HlwPcal"
#define D_CMND_HLWPSET "HlwPset"
#define D_CMND_HLWUCAL "HlwUcal"
#define D_CMND_HLWUSET "HlwUset"
#define D_CMND_HLWICAL "HlwIcal"
#define D_CMND_HLWISET "HlwIset"
#define D_CMND_MAXPOWER "MaxPower"
#define D_CMND_MAXPOWERHOLD "MaxPowerHold"
#define D_CMND_MAXPOWERWINDOW "MaxPowerWindow"
#define D_CMND_SAFEPOWER "SafePower"
#define D_CMND_SAFEPOWERHOLD "SafePowerHold"
#define D_CMND_SAFEPOWERWINDOW "SafePowerWindow"
#define D_CMND_MAXENERGY "MaxEnergy"
#define D_CMND_MAXENERGYSTART "MaxEnergyStart"
#endif // _LANGUAGE_PL_PL_H_

View File

@ -41,8 +41,8 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t button_single : 1; // bit 13 (v5.4.0)
uint32_t interlock : 1; // bit 14 (v5.6.0)
uint32_t pwm_control : 1; // bit 15 (v5.8.1)
uint32_t spare16 : 1;
uint32_t spare17 : 1;
uint32_t ws_clock_reverse : 1; // bit 16 (v5.8.1)
uint32_t decimal_text : 1; // bit 17 (v5.8.1)
uint32_t spare18 : 1;
uint32_t wattage_resolution : 1;
uint32_t voltage_resolution : 1;
@ -147,7 +147,7 @@ struct SYSCFG {
uint8_t ws_fade; // 3A5 Not used since 5.8.0
uint8_t ws_speed; // 3A6 Not used since 5.8.0
uint8_t ws_scheme; // 3A7 Not used since 5.8.0
uint8_t ws_width; // 3A8 Not used since 5.8.0
uint8_t ex_ws_width; // 3A8 Not used since 5.8.0
byte free_3A9[1]; // 3A9
@ -162,7 +162,8 @@ struct SYSCFG {
uint16_t domoticz_sensor_idx[12]; // 45C
uint8_t module; // 474
byte free_475[15]; // 475
uint8_t ws_color[4][3]; // 475
uint8_t ws_width[3]; // 481
myio my_gp; // 484
uint16_t led_pixels; // 496
@ -190,7 +191,6 @@ struct SYSCFG {
byte free_531[1]; // 531
uint16_t pulse_timer[MAX_PULSETIMERS]; // 532
//uint16_t ex_pwm_value[MAX_PWMS]; // 53A
byte free_542[2]; // 542

View File

@ -509,6 +509,9 @@ void SettingsDefaultSet2()
// 5.8.0
Settings.led_pixels = WS2812_LEDS;
// 5.8.1
SettingsDefaultSet_5_8_1();
}
/********************************************************************************************/
@ -524,7 +527,7 @@ void SettingsDefaultSet_3_2_4()
Settings.ws_fade = 0;
Settings.ws_speed = 1;
Settings.ws_scheme = 0;
Settings.ws_width = 1;
Settings.ex_ws_width = 1;
Settings.ws_wakeup = 0;
}
@ -601,6 +604,23 @@ void SettingsDefaultSet_5_0_2()
Settings.flag.energy_resolution = ENERGY_RESOLUTION;
}
void SettingsDefaultSet_5_8_1()
{
// Settings.flag.ws_clock_reverse = 0;
Settings.ws_width[WS_SECOND] = 1;
Settings.ws_color[WS_SECOND][WS_RED] = 255;
Settings.ws_color[WS_SECOND][WS_GREEN] = 0;
Settings.ws_color[WS_SECOND][WS_BLUE] = 255;
Settings.ws_width[WS_MINUTE] = 3;
Settings.ws_color[WS_MINUTE][WS_RED] = 0;
Settings.ws_color[WS_MINUTE][WS_GREEN] = 255;
Settings.ws_color[WS_MINUTE][WS_BLUE] = 0;
Settings.ws_width[WS_HOUR] = 5;
Settings.ws_color[WS_HOUR][WS_RED] = 255;
Settings.ws_color[WS_HOUR][WS_GREEN] = 0;
Settings.ws_color[WS_HOUR][WS_BLUE] = 0;
}
/********************************************************************************************/
void SettingsDelta()
@ -723,7 +743,7 @@ void SettingsDelta()
Settings.led_fade = Settings.ws_fade;
Settings.led_speed = Settings.ws_speed;
Settings.led_scheme = Settings.ws_scheme;
Settings.led_width = Settings.ws_width;
Settings.led_width = Settings.ex_ws_width;
Settings.led_wakeup = Settings.ws_wakeup;
} else {
Settings.led_pixels = WS2812_LEDS;
@ -749,6 +769,9 @@ void SettingsDelta()
Settings.pwm_frequency = PWM_FREQ;
Settings.pwm_range = PWM_RANGE;
}
if (Settings.version < 0x0508000E) {
SettingsDefaultSet_5_8_1();
}
Settings.version = VERSION;
SettingsSave(1);

View File

@ -105,5 +105,7 @@ enum LedStateOptions {LED_OFF, LED_POWER, LED_MQTTSUB, LED_POWER_MQTTSUB, LED_MQ
enum EmulationOptions {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX};
enum ButtonStates {PRESSED, NOT_PRESSED};
enum SettingsParmaIndex {P_HOLD_TIME, P_MAX_POWER_RETRY, P_MAX_PARAM8};
enum Ws2812ClockIndex {WS_SECOND, WS_MINUTE, WS_HOUR};
enum Ws2812Color {WS_RED, WS_GREEN, WS_BLUE};
#endif // _SONOFF_H_

View File

@ -25,7 +25,7 @@
- Select IDE Tools - Flash Size: "1M (no SPIFFS)"
====================================================*/
#define VERSION 0x0508000D // 5.8.0m
#define VERSION 0x0508000E // 5.8.0n
// Location specific includes
#include "sonoff.h" // Enumaration used in user_config.h
@ -942,7 +942,7 @@ void MqttDataCallback(char* topic, byte* data, unsigned int data_len)
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_SAVEDATA "\":\"%s\"}"), (Settings.save_data > 1) ? stemp1 : GetStateText(Settings.save_data));
}
else if (!strcasecmp_P(type, PSTR(D_CMND_SETOPTION)) && ((index >= 0) && (index <= 15)) || ((index > 31) && (index <= P_MAX_PARAM8 +31))) {
else if (!strcasecmp_P(type, PSTR(D_CMND_SETOPTION)) && ((index >= 0) && (index <= 17)) || ((index > 31) && (index <= P_MAX_PARAM8 +31))) {
if (index <= 31) {
ptype = 0; // SetOption0 .. 31
} else {
@ -966,6 +966,8 @@ void MqttDataCallback(char* topic, byte* data, unsigned int data_len)
case 12: // stop_flash_rotate
case 13: // button_single
case 14: // interlock
case 16: // ws_clock_reverse
case 17: // decimal_text
bitWrite(Settings.flag.data, index, payload);
}
if (12 == index) { // stop_flash_rotate

View File

@ -192,6 +192,7 @@ enum SupportedModules {
YUNSHAN,
MAGICHOME,
LUANIHVIO,
KMC_70011,
MAXMODULE };
/********************************************************************************************/
@ -242,6 +243,7 @@ const uint8_t kNiceList[MAXMODULE] PROGMEM = {
H801,
MAGICHOME,
HUAFAN_SS,
KMC_70011,
AILIGHT,
WEMOS,
WITTY
@ -714,6 +716,17 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
GPIO_LED1, // GPIO15 Led (1 = On, 0 = Off)
0,
GPIO_ADC0 // ADC0 A0 Analog input
},
{ "KMC 70011", // KMC 70011 (https://www.amazon.com/KMC-Timing-Monitoring-Network-125V-240V/dp/B06XRX2GTQ)
GPIO_KEY1, // GPIO00 Button
0, 0, 0,
GPIO_HLW_CF, // GPIO04 HLW8012 CF
GPIO_HLW_CF1, // GPIO05 HLW8012 CF1
0, 0, 0, 0, 0, 0, // Flash connection
GPIO_HLW_SEL, // GPIO12 HLW8012 SEL
GPIO_LED1_INV, // GPIO13 Green Led
GPIO_REL1, // GPIO14 Relay
0, 0, 0
}
};

View File

@ -673,14 +673,11 @@ void WifiConnect()
#ifdef MQTT_HOST_DISCOVERY
boolean MdnsDiscoverMqttServer()
{
// char ip_str[20];
int n;
if (!mdns_begun) {
return false;
}
n = MDNS.queryService("mqtt", "tcp"); // Search for mqtt service
int n = MDNS.queryService("mqtt", "tcp"); // Search for mqtt service
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MDNS D_QUERY_DONE " %d"), n);
AddLog(LOG_LEVEL_INFO);

View File

@ -29,9 +29,10 @@
\*********************************************************************************************/
// -- Localization --------------------------------
//#define MY_LANGUAGE en-GB // Enabled by Default
//#define MY_LANGUAGE nl-NL
//#define MY_LANGUAGE de-DE
//#define MY_LANGUAGE en-GB // English in Great Britain. Enabled by Default
//#define MY_LANGUAGE nl-NL // Dutch in the Netherlands
//#define MY_LANGUAGE de-DE // German in Germany
//#define MY_LANGUAGE pl-PL // Polish in Poland
// -- Project -------------------------------------
#define PROJECT "sonoff" // PROJECT is used as the default topic delimiter and OTA file name
@ -177,13 +178,6 @@
#define USE_WS2812 // WS2812 Led string using library NeoPixelBus (+5k code, +1k mem) - Disable by //
#define USE_WS2812_CTYPE 1 // WS2812 Color type (0 - RGB, 1 - GRB)
// #define USE_WS2812_DMA // DMA supports only GPIO03 (= Serial RXD) (+1k mem). When USE_WS2812_DMA is enabled expect Exceptions on Pow
#define CLOCK_REVERSE 0 // WS2812 Clock display (0 - Normal, 1 - Reverse)
#define CLOCK_SECOND_WIDTH 1 // WS2812 Clock second hand pixel width
#define CLOCK_MINUTE_WIDTH 3 // WS2812 Clock minute hand pixel width
#define CLOCK_HOUR_WIDTH 5 // WS2812 Clock hour hand pixel width
#define CLOCK_SECOND_COLOR (255, 0, 255) // WS2812 Clock second pixel color
#define CLOCK_MINUTE_COLOR (0, 255, 0) // WS2812 Clock minute pixel color
#define CLOCK_HOUR_COLOR (255, 0,0 ) // WS2812 Clock hour pixel color
/*********************************************************************************************\
* Compile a minimal version if upgrade memory gets tight ONLY TO BE USED FOR UPGRADE STEP 1!
@ -202,8 +196,4 @@
#error "Select either USE_MQTT_TLS or USE_WEBSERVER as there is just not enough memory to play with"
#endif
#if (ARDUINO < 10610)
#error "This software is supported with Arduino IDE starting from 1.6.10 and ESP8266 Release 2.3.0"
#endif
#endif // _USER_CONFIG_H_

View File

@ -140,10 +140,19 @@ const char HTTP_SCRIPT_MODULE1[] PROGMEM =
"function sl(){"
"var o0=\"";
const char HTTP_SCRIPT_MODULE2[] PROGMEM =
"}1'%d'>%02d %s}2"; // "}1" and "}2" means do not use "}" in Module name and Sensor name
"}1'%d'>%02d %s}2"; // "}1" and "}2" means do not use "}x" in Module name and Sensor name
const char HTTP_SCRIPT_MODULE3[] PROGMEM =
"\";"
"os=o0.replace(/}1/g,\"<option value=\").replace(/}2/g,\"</option>\");";
const char HTTP_SCRIPT_INFO_BEGIN[] PROGMEM =
"function i(){"
"var s,o=\"";
const char HTTP_SCRIPT_INFO_END[] PROGMEM =
"\";" // "}1" and "}2" means do not use "}x" in Information text
"s=o.replace(/}1/g,\"</td></tr><tr><th>\").replace(/}2/g,\"</th><td>\");"
"document.getElementById('i').innerHTML=s;"
"}"
"</script>";
const char HTTP_MSG_SLIDER1[] PROGMEM =
"<div><span class='p'>" D_COLDLIGHT "</span><span class='q'>" D_WARMLIGHT "</span></div>"
"<div><input type='range' min='153' max='500' value='%d' onchange='lc(value)'></div>";
@ -1045,7 +1054,10 @@ void HandleSaveSettings()
strlcpy(Settings.syslog_host, (!strlen(WebServer->arg("lh").c_str())) ? SYS_LOG_HOST : WebServer->arg("lh").c_str(), sizeof(Settings.syslog_host));
Settings.syslog_port = (!strlen(WebServer->arg("lp").c_str())) ? SYS_LOG_PORT : atoi(WebServer->arg("lp").c_str());
Settings.tele_period = (!strlen(WebServer->arg("lt").c_str())) ? TELE_PERIOD : atoi(WebServer->arg("lt").c_str());
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_LOG D_CMND_SERIALLOG " %d, " D_CMND_WEBLOG " %d, " D_CMND_SYSLOG " %d, " D_CMND_LOGHOST " %s, " D_CMND_LOGPORT " %d, " D_CMND_TELEPERIOD " %d"),
if ((Settings.tele_period > 0) && (Settings.tele_period < 10)) {
Settings.tele_period = 10; // Do not allow periods < 10 seconds
}
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_LOG D_CMND_SERIALLOG " %d, " D_CMND_WEBLOG " %d, " D_CMND_SYSLOG " %d, " D_CMND_LOGHOST " %s, " D_CMND_LOGPORT " %d, " D_CMND_TELEPERIOD " %d"),
Settings.seriallog_level, Settings.weblog_level, Settings.syslog_level, Settings.syslog_host, Settings.syslog_port, Settings.tele_period);
AddLog(LOG_LEVEL_INFO);
break;
@ -1507,95 +1519,104 @@ void HandleInformation()
String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), FPSTR(S_INFORMATION));
// page += F("<fieldset><legend><b>&nbsp;Information&nbsp;</b></legend>");
// page += F("<fieldset><legend><b>&nbsp;Information&nbsp;</b></legend>");
page += F("<style>td{padding:0px 5px;}</style>");
page += F("<table style'width:100%;'>");
page += F("<tr><th>" D_PROGRAM_VERSION "</th><td>"); page += version; page += F("</td></tr>");
page += F("<tr><th>" D_BUILD_DATE_AND_TIME "</th><td>"); page += GetBuildDateAndTime(); page += F("</td></tr>");
page += F("<tr><th>" D_CORE_AND_SDK_VERSION "</th><td>"); page += ESP.getCoreVersion(); page += F("/"); page += String(ESP.getSdkVersion()); page += F("</td></tr>");
page += F("<tr><th>" D_UPTIME "</th><td>"); page += String(uptime); page += F(" Hours</td></tr>");
page += F("<div id='i' name='i'></div>");
// Save 1k of code space replacing table html with javascript replace codes
// }1 = </td></tr><tr><th>
// }2 = </th><td>
String func = FPSTR(HTTP_SCRIPT_INFO_BEGIN);
func += F("<table style'width:100%;'><tr><th>");
func += F(D_PROGRAM_VERSION "}2"); func += version;
func += F("}1" D_BUILD_DATE_AND_TIME "}2"); func += GetBuildDateAndTime();
func += F("}1" D_CORE_AND_SDK_VERSION "}2"); func += ESP.getCoreVersion(); func += F("/"); func += String(ESP.getSdkVersion());
func += F("}1" D_UPTIME "}2"); func += String(uptime); func += F(" Hours");
snprintf_P(stopic, sizeof(stopic), PSTR(" at %X"), GetSettingsAddress());
page += F("<tr><th>" D_FLASH_WRITE_COUNT "</th><td>"); page += String(Settings.save_flag); page += stopic; page += F("</td></tr>");
page += F("<tr><th>" D_BOOT_COUNT "</th><td>"); page += String(Settings.bootcount); page += F("</td></tr>");
page += F("<tr><th>" D_RESTART_REASON "</th><td>"); page += GetResetReason(); page += F("</td></tr>");
func += F("}1" D_FLASH_WRITE_COUNT "}2"); func += String(Settings.save_flag); func += stopic;
func += F("}1" D_BOOT_COUNT "}2"); func += String(Settings.bootcount);
func += F("}1" D_RESTART_REASON "}2"); func += GetResetReason();
uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present;
for (byte i = 0; i < maxfn; i++) {
page += F("<tr><th>" D_FRIENDLY_NAME " ");
page += i +1;
page += F("</th><td>"); page += Settings.friendlyname[i]; page += F("</td></tr>");
func += F("}1" D_FRIENDLY_NAME " "); func += i +1; func += F("}2"); func += Settings.friendlyname[i];
}
page += F("<tr><td>&nbsp;</td></tr>");
page += F("<tr><th>" D_AP); page += String(Settings.sta_active +1);
page += F(" " D_SSID " (" D_RSSI ")</th><td>"); page += Settings.sta_ssid[Settings.sta_active]; page += F(" ("); page += WifiGetRssiAsQuality(WiFi.RSSI()); page += F("%)</td></tr>");
page += F("<tr><th>" D_HOSTNAME "</th><td>"); page += my_hostname; page += F("</td></tr>");
func += F("}1}2&nbsp;"); // Empty line
func += F("}1" D_AP); func += String(Settings.sta_active +1);
func += F(" " D_SSID " (" D_RSSI ")}2"); func += Settings.sta_ssid[Settings.sta_active]; func += F(" ("); func += WifiGetRssiAsQuality(WiFi.RSSI()); func += F("%)");
func += F("}1" D_HOSTNAME "}2"); func += my_hostname;
if (static_cast<uint32_t>(WiFi.localIP()) != 0) {
page += F("<tr><th>" D_IP_ADDRESS "</th><td>"); page += WiFi.localIP().toString(); page += F("</td></tr>");
page += F("<tr><th>" D_GATEWAY "</th><td>"); page += IPAddress(Settings.ip_address[1]).toString(); page += F("</td></tr>");
page += F("<tr><th>" D_SUBNET_MASK "</th><td>"); page += IPAddress(Settings.ip_address[2]).toString(); page += F("</td></tr>");
page += F("<tr><th>" D_DNS_SERVER "</th><td>"); page += IPAddress(Settings.ip_address[3]).toString(); page += F("</td></tr>");
page += F("<tr><th>" D_MAC_ADDRESS "</th><td>"); page += WiFi.macAddress(); page += F("</td></tr>");
func += F("}1" D_IP_ADDRESS "}2"); func += WiFi.localIP().toString();
func += F("}1" D_GATEWAY "}2"); func += IPAddress(Settings.ip_address[1]).toString();
func += F("}1" D_SUBNET_MASK "}2"); func += IPAddress(Settings.ip_address[2]).toString();
func += F("}1" D_DNS_SERVER "}2"); func += IPAddress(Settings.ip_address[3]).toString();
func += F("}1" D_MAC_ADDRESS "}2"); func += WiFi.macAddress();
}
if (static_cast<uint32_t>(WiFi.softAPIP()) != 0) {
page += F("<tr><th>" D_AP " " D_IP_ADDRESS "</th><td>"); page += WiFi.softAPIP().toString(); page += F("</td></tr>");
page += F("<tr><th>" D_AP " " D_GATEWAY "</th><td>"); page += WiFi.softAPIP().toString(); page += F("</td></tr>");
page += F("<tr><th>" D_AP " " D_MAC_ADDRESS "</th><td>"); page += WiFi.softAPmacAddress(); page += F("</td></tr>");
func += F("}1" D_AP " " D_IP_ADDRESS "}2"); func += WiFi.softAPIP().toString();
func += F("}1" D_AP " " D_GATEWAY "}2"); func += WiFi.softAPIP().toString();
func += F("}1" D_AP " " D_MAC_ADDRESS "}2"); func += WiFi.softAPmacAddress();
}
page += F("<tr><td>&nbsp;</td></tr>");
func += F("}1}2&nbsp;"); // Empty line
if (Settings.flag.mqtt_enabled) {
page += F("<tr><th>" D_MQTT_HOST "</th><td>"); page += Settings.mqtt_host; page += F("</td></tr>");
page += F("<tr><th>" D_MQTT_PORT "</th><td>"); page += String(Settings.mqtt_port); page += F("</td></tr>");
page += F("<tr><th>" D_MQTT_CLIENT " &<br/>&nbsp;" D_FALLBACK_TOPIC "</th><td>"); page += mqtt_client; page += F("</td></tr>");
page += F("<tr><th>" D_MQTT_USER "</th><td>"); page += Settings.mqtt_user; page += F("</td></tr>");
page += F("<tr><th>" D_MQTT_TOPIC "</th><td>"); page += Settings.mqtt_topic; page += F("</td></tr>");
page += F("<tr><th>" D_MQTT_GROUP_TOPIC "</th><td>"); page += Settings.mqtt_grptopic; page += F("</td></tr>");
func += F("}1" D_MQTT_HOST "}2"); func += Settings.mqtt_host;
func += F("}1" D_MQTT_PORT "}2"); func += String(Settings.mqtt_port);
func += F("}1" D_MQTT_CLIENT " &<br/>&nbsp;" D_FALLBACK_TOPIC "}2"); func += mqtt_client;
func += F("}1" D_MQTT_USER "}2"); func += Settings.mqtt_user;
func += F("}1" D_MQTT_TOPIC "}2"); func += Settings.mqtt_topic;
func += F("}1" D_MQTT_GROUP_TOPIC "}2"); func += Settings.mqtt_grptopic;
GetTopic_P(stopic, 0, Settings.mqtt_topic, "");
page += F("<tr><th>" D_MQTT_FULL_TOPIC "</th><td>"); page += stopic; page += F("</td></tr>");
func += F("}1" D_MQTT_FULL_TOPIC "}2"); func += stopic;
} else {
page += F("<tr><th>" D_MQTT "</th><td>" D_DISABLED "</td></tr>");
func += F("}1" D_MQTT "}2" D_DISABLED);
}
page += F("<tr><td>&nbsp;</td></tr>");
page += F("<tr><th>" D_EMULATION "</th><td>");
func += F("}1}2&nbsp;"); // Empty line
func += F("}1" D_EMULATION "}2");
#ifdef USE_EMULATION
if (EMUL_WEMO == Settings.flag.emulation) {
page += F(D_BELKIN_WEMO);
func += F(D_BELKIN_WEMO);
}
else if (EMUL_HUE == Settings.flag.emulation) {
page += F(D_HUE_BRIDGE);
func += F(D_HUE_BRIDGE);
}
else {
page += F(D_NONE);
func += F(D_NONE);
}
#else
page += F(D_DISABLED);
func += F(D_DISABLED);
#endif // USE_EMULATION
page += F("</td></tr>");
page += F("<tr><th>" D_MDNS_DISCOVERY "</th><td>");
func += F("}1" D_MDNS_DISCOVERY "}2");
#ifdef USE_DISCOVERY
page += F(D_ENABLED);
page += F("</td></tr>");
page += F("<tr><th>" D_MDNS_ADVERTISE "</th><td>");
func += F(D_ENABLED);
func += F("}1" D_MDNS_ADVERTISE "}2");
#ifdef WEBSERVER_ADVERTISE
page += F(D_WEB_SERVER);
func += F(D_WEB_SERVER);
#else
page += F(D_DISABLED);
func += F(D_DISABLED);
#endif // WEBSERVER_ADVERTISE
#else
page += F(D_DISABLED);
func += F(D_DISABLED);
#endif // USE_DISCOVERY
page += F("</td></tr>");
page += F("<tr><td>&nbsp;</td></tr>");
page += F("<tr><th>" D_ESP_CHIP_ID "</th><td>"); page += String(ESP.getChipId()); page += F("</td></tr>");
page += F("<tr><th>" D_FLASH_CHIP_ID "</th><td>"); page += String(ESP.getFlashChipId()); page += F("</td></tr>");
page += F("<tr><th>" D_FLASH_CHIP_SIZE "</th><td>"); page += String(ESP.getFlashChipRealSize() / 1024); page += F("kB</td></tr>");
page += F("<tr><th>" D_PROGRAM_FLASH_SIZE "</th><td>"); page += String(ESP.getFlashChipSize() / 1024); page += F("kB</td></tr>");
page += F("<tr><th>" D_PROGRAM_SIZE "</th><td>"); page += String(ESP.getSketchSize() / 1024); page += F("kB</td></tr>");
page += F("<tr><th>" D_FREE_PROGRAM_SPACE "</th><td>"); page += String(ESP.getFreeSketchSpace() / 1024); page += F("kB</td></tr>");
page += F("<tr><th>" D_FREE_MEMORY "</th><td>"); page += String(freeMem / 1024); page += F("kB</td></tr>");
page += F("</table>");
// page += F("</fieldset>");
func += F("}1}2&nbsp;"); // Empty line
func += F("}1" D_ESP_CHIP_ID "}2"); func += String(ESP.getChipId());
func += F("}1" D_FLASH_CHIP_ID "}2"); func += String(ESP.getFlashChipId());
func += F("}1" D_FLASH_CHIP_SIZE "}2"); func += String(ESP.getFlashChipRealSize() / 1024); func += F("kB");
func += F("}1" D_PROGRAM_FLASH_SIZE "}2"); func += String(ESP.getFlashChipSize() / 1024); func += F("kB");
func += F("}1" D_PROGRAM_SIZE "}2"); func += String(ESP.getSketchSize() / 1024); func += F("kB");
func += F("}1" D_FREE_PROGRAM_SPACE "}2"); func += String(ESP.getFreeSketchSpace() / 1024); func += F("kB");
func += F("}1" D_FREE_MEMORY "}2"); func += String(freeMem / 1024); func += F("kB");
func += F("</td></tr></table>");
func += FPSTR(HTTP_SCRIPT_INFO_END);
page.replace(F("</script>"), func);
page.replace(F("<body>"), F("<body onload='i()'>"));
// page += F("</fieldset>");
page += FPSTR(HTTP_BTN_MAIN);
ShowPage(page);
}

View File

@ -64,17 +64,19 @@ uint8_t ledTable[] = {
184,186,189,191,193,195,197,199,201,204,206,208,210,212,215,217,
219,221,224,226,228,231,233,235,238,240,243,245,248,250,253,255 };
uint8_t sl_dcolor[5];
uint8_t sl_tcolor[5];
uint8_t sl_lcolor[5];
uint8_t light_entry_color[5];
uint8_t light_current_color[5];
uint8_t light_new_color[5];
uint8_t light_last_color[5];
uint8_t sl_power = 0;
uint8_t sl_any = 1;
uint8_t sl_wakeupActive = 0;
uint8_t sl_wakeupDimmer = 0;
uint16_t sl_wakeupCntr = 0;
uint8_t light_subtype = 0;
uint8_t light_power = 0;
uint8_t light_update = 1;
uint8_t light_wakeup_active = 0;
uint8_t light_wakeup_dimmer = 0;
uint16_t light_wakeup_counter = 0;
unsigned long stripTimerCntr = 0; // Bars and Gradient
unsigned long strip_timer_counter = 0; // Bars and Gradient
/*********************************************************************************************\
* Sonoff B1 and AiLight inspired by OpenLight https://github.com/icamgo/noduino-sdk
@ -84,89 +86,87 @@ extern "C" {
void os_delay_us(unsigned int);
}
uint8_t sl_pdi;
uint8_t sl_pdcki;
uint8_t light_pdi_pin;
uint8_t light_pdcki_pin;
void LightDiPulse(uint8_t times)
{
for (uint8_t i = 0; i < times; i++) {
digitalWrite(sl_pdi, HIGH);
digitalWrite(sl_pdi, LOW);
digitalWrite(light_pdi_pin, HIGH);
digitalWrite(light_pdi_pin, LOW);
}
}
void LightDckiPulse(uint8_t times)
{
for (uint8_t i = 0; i < times; i++) {
digitalWrite(sl_pdcki, HIGH);
digitalWrite(sl_pdcki, LOW);
digitalWrite(light_pdcki_pin, HIGH);
digitalWrite(light_pdcki_pin, LOW);
}
}
void LightMy92x1Write(uint8_t data)
{
for (uint8_t i = 0; i < 4; i++) { // Send 8bit Data
digitalWrite(sl_pdcki, LOW);
digitalWrite(sl_pdi, (data & 0x80));
digitalWrite(sl_pdcki, HIGH);
for (uint8_t i = 0; i < 4; i++) { // Send 8bit Data
digitalWrite(light_pdcki_pin, LOW);
digitalWrite(light_pdi_pin, (data & 0x80));
digitalWrite(light_pdcki_pin, HIGH);
data = data << 1;
digitalWrite(sl_pdi, (data & 0x80));
digitalWrite(sl_pdcki, LOW);
digitalWrite(sl_pdi, LOW);
digitalWrite(light_pdi_pin, (data & 0x80));
digitalWrite(light_pdcki_pin, LOW);
digitalWrite(light_pdi_pin, LOW);
data = data << 1;
}
}
void LightMy92x1Init()
{
uint8_t chips = light_type -11; // 1 (AiLight) or 2 (Sonoff B1)
uint8_t chips = light_type -11; // 1 (AiLight) or 2 (Sonoff B1)
LightDckiPulse(chips * 32); // Clear all duty register
os_delay_us(12); // TStop > 12us.
LightDckiPulse(chips * 32); // Clear all duty register
os_delay_us(12); // TStop > 12us.
// Send 12 DI pulse, after 6 pulse's falling edge store duty data, and 12
// pulse's rising edge convert to command mode.
LightDiPulse(12);
os_delay_us(12); // Delay >12us, begin send CMD data
for (uint8_t n = 0; n < chips; n++) { // Send CMD data
LightMy92x1Write(0x18); // ONE_SHOT_DISABLE, REACTION_FAST, BIT_WIDTH_8, FREQUENCY_DIVIDE_1, SCATTER_APDM
os_delay_us(12); // Delay >12us, begin send CMD data
for (uint8_t n = 0; n < chips; n++) { // Send CMD data
LightMy92x1Write(0x18); // ONE_SHOT_DISABLE, REACTION_FAST, BIT_WIDTH_8, FREQUENCY_DIVIDE_1, SCATTER_APDM
}
os_delay_us(12); // TStart > 12us. Delay 12 us.
os_delay_us(12); // TStart > 12us. Delay 12 us.
// Send 16 DI pulse, at 14 pulse's falling edge store CMD data, and
// at 16 pulse's falling edge convert to duty mode.
LightDiPulse(16);
os_delay_us(12); // TStop > 12us.
os_delay_us(12); // TStop > 12us.
}
void LightMy92x1Duty(uint8_t duty_r, uint8_t duty_g, uint8_t duty_b, uint8_t duty_w, uint8_t duty_c)
{
uint8_t channels[2] = { 4, 6 };
uint8_t didx = light_type -12; // 0 or 1
uint8_t didx = light_type -12; // 0 or 1
uint8_t duty[2][6] = {{ duty_r, duty_g, duty_b, duty_w, 0, 0 }, // Definition for RGBW channels
{ duty_w, duty_c, 0, duty_g, duty_r, duty_b }}; // Definition for RGBWC channels
os_delay_us(12); // TStop > 12us.
os_delay_us(12); // TStop > 12us.
for (uint8_t channel = 0; channel < channels[didx]; channel++) {
LightMy92x1Write(duty[didx][channel]); // Send 8bit Data
}
os_delay_us(12); // TStart > 12us. Ready for send DI pulse.
LightDiPulse(8); // Send 8 DI pulse. After 8 pulse falling edge, store old data.
os_delay_us(12); // TStop > 12us.
os_delay_us(12); // TStart > 12us. Ready for send DI pulse.
LightDiPulse(8); // Send 8 DI pulse. After 8 pulse falling edge, store old data.
os_delay_us(12); // TStop > 12us.
}
/********************************************************************************************/
void LightInit(void)
{
if (light_type < 6) { // PWM
if (light_type < 6) { // PWM
for (byte i = 0; i < light_type; i++) {
Settings.pwm_value[i] = 0; // Disable direct PWM control
Settings.pwm_value[i] = 0; // Disable direct PWM control
}
if (1 == light_type) {
Settings.led_color[0] = 255; // One PWM channel only supports Dimmer but needs max color
Settings.led_color[0] = 255; // One PWM channel only supports Dimmer but needs max color
}
if (SONOFF_LED == Settings.module) { // Fix Sonoff Led instabilities
if (SONOFF_LED == Settings.module) { // Fix Sonoff Led instabilities
if (!my_module.gp.io[4]) {
pinMode(4, OUTPUT); // Stop floating outputs
digitalWrite(4, LOW);
@ -191,21 +191,22 @@ void LightInit(void)
}
#endif // USE_WS2812 ************************************************************************
else {
sl_pdi = pin[GPIO_DI];
sl_pdcki = pin[GPIO_DCKI];
light_pdi_pin = pin[GPIO_DI];
light_pdcki_pin = pin[GPIO_DCKI];
pinMode(sl_pdi, OUTPUT);
pinMode(sl_pdcki, OUTPUT);
digitalWrite(sl_pdi, LOW);
digitalWrite(sl_pdcki, LOW);
pinMode(light_pdi_pin, OUTPUT);
pinMode(light_pdcki_pin, OUTPUT);
digitalWrite(light_pdi_pin, LOW);
digitalWrite(light_pdcki_pin, LOW);
LightMy92x1Init();
Settings.led_scheme = 0;
}
sl_power = 0;
sl_any = 1;
sl_wakeupActive = 0;
light_subtype = light_type &7;
light_power = 0;
light_update = 1;
light_wakeup_active = 0;
}
void LightSetColorTemp(uint16_t ct)
@ -221,7 +222,7 @@ void LightSetColorTemp(uint16_t ct)
}
uint16_t icold = (100 * (347 - my_ct)) / 136;
uint16_t iwarm = (100 * my_ct) / 136;
if (5 == (light_type &7)) {
if (5 == light_subtype) {
Settings.led_color[0] = 0;
Settings.led_color[1] = 0;
Settings.led_color[2] = 0;
@ -236,7 +237,7 @@ void LightSetColorTemp(uint16_t ct)
uint16_t LightGetColorTemp()
{
uint8_t ct_idx = 0;
if (5 == (light_type &7)) {
if (5 == light_subtype) {
ct_idx = 3;
}
uint16_t my_ct = Settings.led_color[ct_idx +1];
@ -253,12 +254,12 @@ void LightSetDimmer(uint8_t myDimmer)
float temp;
if ((SONOFF_BN == Settings.module) && (100 == myDimmer)) {
myDimmer = 99; // BN-SZ01 starts flickering at dimmer = 100
myDimmer = 99; // BN-SZ01 starts flickering at dimmer = 100
}
float dimmer = 100 / (float)myDimmer;
for (byte i = 0; i < (light_type &7); i++) {
for (byte i = 0; i < light_subtype; i++) {
temp = (float)Settings.led_color[i] / dimmer;
sl_dcolor[i] = (uint8_t)temp;
light_current_color[i] = (uint8_t)temp;
}
}
@ -267,39 +268,43 @@ void LightSetColor()
uint8_t highest = 0;
float temp;
for (byte i = 0; i < (light_type &7); i++) {
if (highest < sl_dcolor[i]) {
highest = sl_dcolor[i];
for (byte i = 0; i < light_subtype; i++) {
if (highest < light_current_color[i]) {
highest = light_current_color[i];
}
}
float mDim = (float)highest / 2.55;
Settings.led_dimmer = (uint8_t)mDim;
float dimmer = 100 / mDim;
for (byte i = 0; i < (light_type &7); i++) {
temp = (float)sl_dcolor[i] * dimmer;
for (byte i = 0; i < light_subtype; i++) {
temp = (float)light_current_color[i] * dimmer;
Settings.led_color[i] = (uint8_t)temp;
}
}
char* LightGetColor(char* scolor)
char* LightGetColor(uint8_t type, char* scolor)
{
LightSetDimmer(Settings.led_dimmer);
scolor[0] = '\0';
for (byte i = 0; i < (light_type &7); i++) {
snprintf_P(scolor, 11, PSTR("%s%02X"), scolor, sl_dcolor[i]);
for (byte i = 0; i < light_subtype; i++) {
if (!type && Settings.flag.decimal_text) {
snprintf_P(scolor, 25, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", light_current_color[i]);
} else {
snprintf_P(scolor, 25, PSTR("%s%02X"), scolor, light_current_color[i]);
}
}
return scolor;
}
void LightPreparePower()
{
char scolor[11];
char scolor[25];
char scommand[16];
if (Settings.led_dimmer && !(sl_power)) {
if (Settings.led_dimmer && !(light_power)) {
ExecuteCommandPower(devices_present, 7); // No publishPowerState
}
else if (!Settings.led_dimmer && sl_power) {
else if (!Settings.led_dimmer && light_power) {
ExecuteCommandPower(devices_present, 6); // No publishPowerState
}
#ifdef USE_DOMOTICZ
@ -308,85 +313,84 @@ void LightPreparePower()
#endif // USE_DOMOTICZ
GetPowerDevice(scommand, devices_present, sizeof(scommand));
if ((light_type &7) > 1) {
if (light_subtype > 1) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"%s\", \"" D_CMND_DIMMER "\":%d, \"" D_CMND_COLOR "\":\"%s\"}"),
scommand, GetStateText(sl_power), Settings.led_dimmer, LightGetColor(scolor));
scommand, GetStateText(light_power), Settings.led_dimmer, LightGetColor(0, scolor));
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"%s\", \"" D_CMND_DIMMER "\":%d}"),
scommand, GetStateText(sl_power), Settings.led_dimmer);
scommand, GetStateText(light_power), Settings.led_dimmer);
}
}
void LightSetPower(uint8_t mpower)
{
sl_power = mpower;
if (sl_wakeupActive) {
sl_wakeupActive--;
light_power = mpower;
if (light_wakeup_active) {
light_wakeup_active--;
}
if (sl_power) {
sl_any = 1;
if (light_power) {
light_update = 1;
}
LightAnimate();
}
void LightAnimate()
{
// {"Wakeup":"Done"}
uint8_t fadeValue;
uint8_t cur_col[5];
stripTimerCntr++;
if (!sl_power) { // Power Off
strip_timer_counter++;
if (!light_power) { // Power Off
sleep = Settings.sleep;
stripTimerCntr = 0;
for (byte i = 0; i < (light_type &7); i++) {
sl_tcolor[i] = 0;
strip_timer_counter = 0;
for (byte i = 0; i < light_subtype; i++) {
light_new_color[i] = 0;
}
}
else {
sleep = 0;
switch (Settings.led_scheme) {
case 0: // Power On
LightSetDimmer(Settings.led_dimmer); // Power On
case 0: // Power On
LightSetDimmer(Settings.led_dimmer);
if (0 == Settings.led_fade) {
for (byte i = 0; i < (light_type &7); i++) {
sl_tcolor[i] = sl_dcolor[i];
for (byte i = 0; i < light_subtype; i++) {
light_new_color[i] = light_current_color[i];
}
} else {
for (byte i = 0; i < (light_type &7); i++) {
if (sl_tcolor[i] != sl_dcolor[i]) {
if (sl_tcolor[i] < sl_dcolor[i]) {
sl_tcolor[i] += ((sl_dcolor[i] - sl_tcolor[i]) >> Settings.led_speed) +1;
for (byte i = 0; i < light_subtype; i++) {
if (light_new_color[i] != light_current_color[i]) {
if (light_new_color[i] < light_current_color[i]) {
light_new_color[i] += ((light_current_color[i] - light_new_color[i]) >> Settings.led_speed) +1;
}
if (sl_tcolor[i] > sl_dcolor[i]) {
sl_tcolor[i] -= ((sl_tcolor[i] - sl_dcolor[i]) >> Settings.led_speed) +1;
if (light_new_color[i] > light_current_color[i]) {
light_new_color[i] -= ((light_new_color[i] - light_current_color[i]) >> Settings.led_speed) +1;
}
}
}
}
break;
case 1: // Power On using wake up duration
if (2 == sl_wakeupActive) {
sl_wakeupActive = 1;
for (byte i = 0; i < (light_type &7); i++) {
sl_tcolor[i] = 0;
case 1: // Power On using wake up duration
if (2 == light_wakeup_active) {
light_wakeup_active = 1;
for (byte i = 0; i < light_subtype; i++) {
light_new_color[i] = 0;
}
sl_wakeupCntr = 0;
sl_wakeupDimmer = 0;
light_wakeup_counter = 0;
light_wakeup_dimmer = 0;
}
sl_wakeupCntr++;
if (sl_wakeupCntr > ((Settings.led_wakeup * STATES) / Settings.led_dimmer)) {
sl_wakeupCntr = 0;
sl_wakeupDimmer++;
if (sl_wakeupDimmer <= Settings.led_dimmer) {
LightSetDimmer(sl_wakeupDimmer);
for (byte i = 0; i < (light_type &7); i++) {
sl_tcolor[i] = sl_dcolor[i];
light_wakeup_counter++;
if (light_wakeup_counter > ((Settings.led_wakeup * STATES) / Settings.led_dimmer)) {
light_wakeup_counter = 0;
light_wakeup_dimmer++;
if (light_wakeup_dimmer <= Settings.led_dimmer) {
LightSetDimmer(light_wakeup_dimmer);
for (byte i = 0; i < light_subtype; i++) {
light_new_color[i] = light_current_color[i];
}
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_DONE "\"}"));
MqttPublishPrefixTopic_P(2, PSTR(D_CMND_WAKEUP));
sl_wakeupActive = 0;
light_wakeup_active = 0;
Settings.led_scheme = 0;
}
}
@ -400,17 +404,17 @@ void LightAnimate()
}
}
if ((Settings.led_scheme < 2) || !sl_power) {
for (byte i = 0; i < (light_type &7); i++) {
if (sl_lcolor[i] != sl_tcolor[i]) {
sl_any = 1;
if ((Settings.led_scheme < 2) || !light_power) {
for (byte i = 0; i < light_subtype; i++) {
if (light_last_color[i] != light_new_color[i]) {
light_update = 1;
}
}
if (sl_any) {
sl_any = 0;
for (byte i = 0; i < (light_type &7); i++) {
sl_lcolor[i] = sl_tcolor[i];
cur_col[i] = (Settings.led_table) ? ledTable[sl_lcolor[i]] : sl_lcolor[i];
if (light_update) {
light_update = 0;
for (byte i = 0; i < light_subtype; i++) {
light_last_color[i] = light_new_color[i];
cur_col[i] = (Settings.led_table) ? ledTable[light_last_color[i]] : light_last_color[i];
if (light_type < 6) {
if (pin[GPIO_PWM1 +i] < 99) {
uint16_t curcol = cur_col[i] * (Settings.pwm_range / 255);
@ -436,38 +440,38 @@ void LightAnimate()
* Hue support
\*********************************************************************************************/
float sl_Hue = 0.0;
float sl_Sat = 0.0;
float sl_Bri = 0.0;
float light_hue = 0.0;
float light_saturation = 0.0;
float light_brightness = 0.0;
void LightRgbToHsb()
{
LightSetDimmer(Settings.led_dimmer);
// convert colors to float between (0.0 - 1.0)
float r = sl_dcolor[0] / 255.0f;
float g = sl_dcolor[1] / 255.0f;
float b = sl_dcolor[2] / 255.0f;
float r = light_current_color[0] / 255.0f;
float g = light_current_color[1] / 255.0f;
float b = light_current_color[2] / 255.0f;
float max = (r > g && r > b) ? r : (g > b) ? g : b;
float min = (r < g && r < b) ? r : (g < b) ? g : b;
float d = max - min;
sl_Hue = 0.0;
sl_Bri = max;
sl_Sat = (0.0f == sl_Bri) ? 0 : (d / sl_Bri);
light_hue = 0.0;
light_brightness = max;
light_saturation = (0.0f == light_brightness) ? 0 : (d / light_brightness);
if (d != 0.0f)
{
if (r == max) {
sl_Hue = (g - b) / d + (g < b ? 6.0f : 0.0f);
light_hue = (g - b) / d + (g < b ? 6.0f : 0.0f);
} else if (g == max) {
sl_Hue = (b - r) / d + 2.0f;
light_hue = (b - r) / d + 2.0f;
} else {
sl_Hue = (r - g) / d + 4.0f;
light_hue = (r - g) / d + 4.0f;
}
sl_Hue /= 6.0f;
light_hue /= 6.0f;
}
}
@ -477,12 +481,12 @@ void LightHsbToRgb()
float g;
float b;
float h = sl_Hue;
float s = sl_Sat;
float v = sl_Bri;
float h = light_hue;
float s = light_saturation;
float v = light_brightness;
if (0.0f == sl_Sat) {
r = g = b = v; // achromatic or black
if (0.0f == light_saturation) {
r = g = b = v; // Achromatic or black
} else {
if (h < 0.0f) {
h += 1.0f;
@ -530,20 +534,20 @@ void LightHsbToRgb()
}
}
sl_dcolor[0] = (uint8_t)(r * 255.0f);
sl_dcolor[1] = (uint8_t)(g * 255.0f);
sl_dcolor[2] = (uint8_t)(b * 255.0f);
light_current_color[0] = (uint8_t)(r * 255.0f);
light_current_color[1] = (uint8_t)(g * 255.0f);
light_current_color[2] = (uint8_t)(b * 255.0f);
}
/********************************************************************************************/
void LightReplaceHsb(String *response)
{
if ((light_type &7) > 2) {
if (light_subtype > 2) {
LightRgbToHsb();
response->replace("{h}", String((uint16_t)(65535.0f * sl_Hue)));
response->replace("{s}", String((uint8_t)(254.0f * sl_Sat)));
response->replace("{b}", String((uint8_t)(254.0f * sl_Bri)));
response->replace("{h}", String((uint16_t)(65535.0f * light_hue)));
response->replace("{s}", String((uint8_t)(254.0f * light_saturation)));
response->replace("{b}", String((uint8_t)(254.0f * light_brightness)));
} else {
response->replace("{h}", "0");
response->replace("{s}", "0");
@ -554,11 +558,11 @@ void LightReplaceHsb(String *response)
void LightGetHsb(float *hue, float *sat, float *bri)
{
if ((light_type &7) > 2) {
if (light_subtype > 2) {
LightRgbToHsb();
*hue = sl_Hue;
*sat = sl_Sat;
*bri = sl_Bri;
*hue = light_hue;
*sat = light_saturation;
*bri = light_brightness;
} else {
*hue = 0;
*sat = 0;
@ -569,24 +573,13 @@ void LightGetHsb(float *hue, float *sat, float *bri)
void LightSetHsb(float hue, float sat, float bri, uint16_t ct)
{
/*
char stemp1[10];
char stemp2[10];
char stemp3[10];
dtostrfi(hue, 3, stemp1);
dtostrfi(sat, 3, stemp2);
dtostrfi(bri, 3, stemp3);
snprintf_P(log_data, sizeof(log_data), PSTR("HUE: Set Hue %s, Sat %s, Bri %s, Ct %d"), stemp1, stemp2, stemp3, ct);
AddLog(LOG_LEVEL_DEBUG);
*/
if (light_type > 2) {
if ((5 == (light_type &7)) && (ct > 0)) {
if ((5 == light_subtype) && (ct > 0)) {
LightSetColorTemp(ct);
} else {
sl_Hue = hue;
sl_Sat = sat;
sl_Bri = bri;
light_hue = hue;
light_saturation = sat;
light_brightness = bri;
LightHsbToRgb();
LightSetColor();
}
@ -595,7 +588,7 @@ void LightSetHsb(float hue, float sat, float bri, uint16_t ct)
} else {
uint8_t tmp = (uint8_t)(bri * 100);
Settings.led_dimmer = tmp;
if (2 == (light_type &7)) {
if (2 == light_subtype) {
if (ct > 0) {
LightSetColorTemp(ct);
}
@ -612,42 +605,79 @@ void LightSetHsb(float hue, float sat, float bri, uint16_t ct)
* Commands
\*********************************************************************************************/
boolean LightColorEntry(char *buffer, uint8_t buffer_length)
{
uint8_t entry_type = 0; // Decimal
char scolor[10];
char *p;
char *str;
if (buffer[0] == '#') { // Optional hexadecimal entry
buffer++;
buffer_length--;
}
uint8_t size = (light_subtype > sizeof(light_entry_color)) ? sizeof(light_entry_color) : light_subtype;
if (strstr(buffer, ",")) { // Decimal entry
int8_t i = 0;
for (str = strtok_r(buffer, ",", &p); str && i < size; str = strtok_r(NULL, ",", &p)) {
light_entry_color[i++] = atoi(str);
}
entry_type = (size == i) ? 2 : 0; // Decimal
}
else if ((2 * size) == buffer_length) { // Hexadecimal entry
for (byte i = 0; i < size; i++) {
strlcpy(scolor, buffer + (i *2), 3);
light_entry_color[i] = (uint8_t)strtol(scolor, &p, 16);
}
entry_type = 1; // Hexadecimal
}
if (entry_type) {
Settings.flag.decimal_text = entry_type -1;
}
return (entry_type);
}
boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
{
boolean serviced = true;
boolean coldim = false;
char scolor[11];
char *p;
boolean valid_entry = false;
char scolor[25];
if (((light_type &7) > 1) && !strcasecmp_P(type, PSTR(D_CMND_COLOR))) {
if (dataBuf[0] == '#') {
dataBuf++;
data_len--;
}
if ((2 * (light_type &7)) == data_len) {
for (byte i = 0; i < (light_type &7); i++) {
strlcpy(scolor, dataBuf + (i *2), 3);
sl_dcolor[i] = (uint8_t)strtol(scolor, &p, 16);
if ((light_subtype > 1) && !strcasecmp_P(type, PSTR(D_CMND_COLOR)) && (index > 0) && (index <= 5)) {
if (data_len > 0) {
valid_entry = LightColorEntry(dataBuf, data_len);
if (valid_entry) {
if (1 == index) {
memcpy(light_current_color, light_entry_color, sizeof(light_current_color));
LightSetColor();
coldim = true;
} else {
memcpy(Settings.ws_color + 3*(index -2), light_entry_color, 3);
}
}
LightSetColor();
coldim = true;
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_COLOR "\":\"%s\"}"), LightGetColor(scolor));
}
if (!valid_entry && (1 == index)) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_COLOR "\":\"%s\"}"), LightGetColor(0, scolor));
}
if (index > 1) {
scolor[0] = '\0';
for (byte i = 0; i < 3; i++) {
if (Settings.flag.decimal_text) {
snprintf_P(scolor, 25, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", Settings.ws_color[index -2][i]);
} else {
snprintf_P(scolor, 25, PSTR("%s%02X"), scolor, Settings.ws_color[index -2][i]);
}
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_COLOR "%d\":\"%s\"}"), index, scolor);
}
}
#ifdef USE_WS2812 // ***********************************************************************
else if ((11 == light_type) && !strcasecmp_P(type, PSTR(D_CMND_LED)) && (index > 0) && (index <= Settings.led_pixels)) {
if (dataBuf[0] == '#') {
dataBuf++;
data_len--;
}
uint8_t sl_ledcolor[3];
if ((2 * (light_type &7)) == data_len) {
for (byte i = 0; i < (light_type &7); i++) {
strlcpy(scolor, dataBuf + (i *2), 3);
sl_ledcolor[i] = (uint8_t)strtol(scolor, &p, 16);
if (data_len > 0) {
if (LightColorEntry(dataBuf, data_len)) {
Ws2812SetColor(index, light_entry_color[0], light_entry_color[1], light_entry_color[2]);
}
Ws2812SetColor(index, sl_ledcolor[0], sl_ledcolor[1], sl_ledcolor[2]);
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_LED "%d\":\"%s\"}"), index, Ws2812GetColor(index, scolor));
}
@ -655,24 +685,31 @@ boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_le
if ((payload > 0) && (payload <= WS2812_MAX_LEDS)) {
Settings.led_pixels = payload;
Ws2812Clear();
sl_any = 1;
light_update = 1;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_PIXELS "\":%d}"), Settings.led_pixels);
}
else if ((11 == light_type) && !strcasecmp_P(type, PSTR(D_CMND_WIDTH))) {
if ((payload >= 0) && (payload <= 4)) {
Settings.led_width = payload;
else if ((11 == light_type) && !strcasecmp_P(type, PSTR(D_CMND_WIDTH)) && (index > 0) && (index <= 4)) {
if (1 == index) {
if ((payload >= 0) && (payload <= 4)) {
Settings.led_width = payload;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WIDTH "\":%d}"), Settings.led_width);
} else {
if ((payload > 0) && (payload < 32)) {
Settings.ws_width[index -2] = payload;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WIDTH "%d\":%d}"), index, Settings.ws_width[index -2]);
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WIDTH "\":%d}"), Settings.led_width);
}
else if ((11 == light_type) && !strcasecmp_P(type, PSTR(D_CMND_SCHEME))) {
if ((payload >= 0) && (payload <= 9)) {
Settings.led_scheme = payload;
if (1 == Settings.led_scheme) {
sl_wakeupActive = 3;
light_wakeup_active = 3;
}
ExecuteCommandPower(devices_present, 1);
stripTimerCntr = 0;
strip_timer_counter = 0;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_SCHEME "\":%d}"), Settings.led_scheme);
}
@ -681,12 +718,12 @@ boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_le
if ((payload >= 0) && (payload <= 100)) {
Settings.led_dimmer = payload;
}
sl_wakeupActive = 3;
light_wakeup_active = 3;
Settings.led_scheme = 1;
ExecuteCommandPower(devices_present, 1);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_STARTED "\"}"));
}
else if (!strcasecmp_P(type, PSTR(D_CMND_COLORTEMPERATURE)) && ((2 == (light_type &7)) || (5 == (light_type &7)))) { // ColorTemp
else if (!strcasecmp_P(type, PSTR(D_CMND_COLORTEMPERATURE)) && ((2 == light_subtype) || (5 == light_subtype))) { // ColorTemp
if ((payload >= 153) && (payload <= 500)) { // https://developers.meethue.com/documentation/core-concepts
LightSetColorTemp(payload);
coldim = true;
@ -713,7 +750,7 @@ boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_le
Settings.led_table ^= 1;
break;
}
sl_any = 1;
light_update = 1;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_LEDTABLE "\":\"%s\"}"), GetStateText(Settings.led_table));
}
@ -738,12 +775,12 @@ boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_le
else if (!strcasecmp_P(type, PSTR(D_CMND_WAKEUPDURATION))) {
if ((payload > 0) && (payload < 3001)) {
Settings.led_wakeup = payload;
sl_wakeupActive = 0;
light_wakeup_active = 0;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUPDURATION "\":%d}"), Settings.led_wakeup);
}
else if (!strcasecmp_P(type, PSTR("UNDOCA"))) { // Theos legacy status
LightGetColor(scolor);
LightGetColor(1, scolor);
scolor[6] = '\0'; // RGB only
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, %d, %d, %d, %d, %d"),
scolor, Settings.led_fade, Settings.led_table, Settings.led_scheme, Settings.led_speed, Settings.led_width);

View File

@ -129,15 +129,15 @@ void Ws2812UpdatePixelColor(int position, struct RgbColor hand_color, uint8_t ha
strip->SetPixelColor(mod_position, color);
}
void Ws2812UpdateHand(int position, uint8_t width, struct RgbColor hand_color)
void Ws2812UpdateHand(int position, uint8_t index)
{
boolean clock_reverse = CLOCK_REVERSE;
if (clock_reverse) {
if (Settings.flag.ws_clock_reverse) {
position = Settings.led_pixels -position;
}
RgbColor hand_color = RgbColor(Settings.ws_color[index][WS_RED], Settings.ws_color[index][WS_GREEN], Settings.ws_color[index][WS_BLUE]);
Ws2812UpdatePixelColor(position, hand_color, 0);
for (uint8_t h = 1; h <= ((width -1) / 2); h++) {
for (uint8_t h = 1; h <= ((Settings.ws_width[index] -1) / 2); h++) {
Ws2812UpdatePixelColor(position -h, hand_color, h);
Ws2812UpdatePixelColor(position +h, hand_color, h);
}
@ -145,21 +145,11 @@ void Ws2812UpdateHand(int position, uint8_t width, struct RgbColor hand_color)
void Ws2812Clock()
{
RgbColor c;
uint8_t hand_second_width = CLOCK_SECOND_WIDTH;
uint8_t hand_minute_width = CLOCK_MINUTE_WIDTH;
uint8_t hand_hour_width = CLOCK_HOUR_WIDTH;
RgbColor hand_second_color CLOCK_SECOND_COLOR;
RgbColor hand_minute_color CLOCK_MINUTE_COLOR;
RgbColor hand_hour_color CLOCK_HOUR_COLOR;
strip->ClearTo(0); // Reset strip
int clksize = 600 / (int)Settings.led_pixels;
Ws2812UpdateHand((RtcTime.second * 10) / clksize, hand_second_width, hand_second_color);
Ws2812UpdateHand((RtcTime.minute * 10) / clksize, hand_minute_width, hand_minute_color);
Ws2812UpdateHand((RtcTime.hour % 12) * (50 / clksize), hand_hour_width, hand_hour_color);
Ws2812UpdateHand((RtcTime.second * 10) / clksize, WS_SECOND);
Ws2812UpdateHand((RtcTime.minute * 10) / clksize, WS_MINUTE);
Ws2812UpdateHand((RtcTime.hour % 12) * (50 / clksize), WS_HOUR);
Ws2812StripShow();
}
@ -205,7 +195,7 @@ void Ws2812Gradient(uint8_t schemenr)
uint8_t repeat = kRepeat[Settings.led_width]; // number of scheme.count per ledcount
uint16_t range = (uint16_t)ceil((float)Settings.led_pixels / (float)repeat);
uint16_t gradRange = (uint16_t)ceil((float)range / (float)(scheme.count - 1));
uint16_t offset = kSpeed[Settings.led_speed] > 0 ? stripTimerCntr / kSpeed[Settings.led_speed] : 0;
uint16_t offset = kSpeed[Settings.led_speed] > 0 ? strip_timer_counter / kSpeed[Settings.led_speed] : 0;
WsColor oldColor, currentColor;
Ws2812GradientColor(schemenr, &oldColor, range, gradRange, offset);
@ -216,9 +206,9 @@ void Ws2812Gradient(uint8_t schemenr)
}
if (Settings.led_speed > 0) {
// Blend old and current color based on time for smooth movement.
c.R = map(stripTimerCntr % kSpeed[Settings.led_speed], 0, kSpeed[Settings.led_speed], oldColor.red, currentColor.red);
c.G = map(stripTimerCntr % kSpeed[Settings.led_speed], 0, kSpeed[Settings.led_speed], oldColor.green, currentColor.green);
c.B = map(stripTimerCntr % kSpeed[Settings.led_speed], 0, kSpeed[Settings.led_speed], oldColor.blue, currentColor.blue);
c.R = map(strip_timer_counter % kSpeed[Settings.led_speed], 0, kSpeed[Settings.led_speed], oldColor.red, currentColor.red);
c.G = map(strip_timer_counter % kSpeed[Settings.led_speed], 0, kSpeed[Settings.led_speed], oldColor.green, currentColor.green);
c.B = map(strip_timer_counter % kSpeed[Settings.led_speed], 0, kSpeed[Settings.led_speed], oldColor.blue, currentColor.blue);
}
else {
// No animation, just use the current color.
@ -249,7 +239,7 @@ void Ws2812Bars(uint8_t schemenr)
maxSize = 0;
}
uint8_t offset = kSpeed[Settings.led_speed] > 0 ? stripTimerCntr / kSpeed[Settings.led_speed] : 0;
uint8_t offset = kSpeed[Settings.led_speed] > 0 ? strip_timer_counter / kSpeed[Settings.led_speed] : 0;
WsColor mcolor[scheme.count];
memcpy(mcolor, scheme.colors, sizeof(mcolor));
@ -333,7 +323,11 @@ char* Ws2812GetColor(uint16_t led, char* scolor)
sl_ledcolor[2] = lcolor.B;
scolor[0] = '\0';
for (byte i = 0; i < 3; i++) {
snprintf_P(scolor, 11, PSTR("%s%02X"), scolor, sl_ledcolor[i]);
if (Settings.flag.decimal_text) {
snprintf_P(scolor, 25, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", sl_ledcolor[i]);
} else {
snprintf_P(scolor, 25, PSTR("%s%02X"), scolor, sl_ledcolor[i]);
}
}
return scolor;
}

View File

@ -25,13 +25,13 @@
* Source: Heiko Krupp and Adafruit Industries
\*********************************************************************************************/
#define BMP_ADDR 0x77
#define BMP_ADDR 0x77
#define BMP180_CHIPID 0x55
#define BMP280_CHIPID 0x58
#define BME280_CHIPID 0x60
#define BMP180_CHIPID 0x55
#define BMP280_CHIPID 0x58
#define BME280_CHIPID 0x60
#define BMP_REGISTER_CHIPID 0xD0
#define BMP_REGISTER_CHIPID 0xD0
double bmp_sealevel = 0.0;
uint8_t bmp_address;
@ -42,36 +42,36 @@ char bmp_types[7];
* BMP085 and BME180
\*********************************************************************************************/
#define BMP180_REG_CONTROL 0xF4
#define BMP180_REG_RESULT 0xF6
#define BMP180_TEMPERATURE 0x2E
#define BMP180_PRESSURE3 0xF4 // Max. oversampling -> OSS = 3
#define BMP180_REG_CONTROL 0xF4
#define BMP180_REG_RESULT 0xF6
#define BMP180_TEMPERATURE 0x2E
#define BMP180_PRESSURE3 0xF4 // Max. oversampling -> OSS = 3
#define BMP180_AC1 0xAA
#define BMP180_AC2 0xAC
#define BMP180_AC3 0xAE
#define BMP180_AC4 0xB0
#define BMP180_AC5 0xB2
#define BMP180_AC6 0xB4
#define BMP180_VB1 0xB6
#define BMP180_VB2 0xB8
#define BMP180_MB 0xBA
#define BMP180_MC 0xBC
#define BMP180_MD 0xBE
#define BMP180_AC1 0xAA
#define BMP180_AC2 0xAC
#define BMP180_AC3 0xAE
#define BMP180_AC4 0xB0
#define BMP180_AC5 0xB2
#define BMP180_AC6 0xB4
#define BMP180_VB1 0xB6
#define BMP180_VB2 0xB8
#define BMP180_MB 0xBA
#define BMP180_MC 0xBC
#define BMP180_MD 0xBE
#define BMP180_OSS 3
#define BMP180_OSS 3
int16_t cal_ac1;
int16_t cal_ac2;
int16_t cal_ac3;
int16_t cal_b1;
int16_t cal_b2;
int16_t cal_mc;
int16_t cal_md;
int16_t cal_ac1;
int16_t cal_ac2;
int16_t cal_ac3;
int16_t cal_b1;
int16_t cal_b2;
int16_t cal_mc;
int16_t cal_md;
uint16_t cal_ac4;
uint16_t cal_ac5;
uint16_t cal_ac6;
int32_t bmp180_b5 = 0;
int32_t bmp180_b5 = 0;
boolean Bmp180Calibration()
{
@ -81,10 +81,10 @@ boolean Bmp180Calibration()
cal_ac4 = I2cRead16(bmp_address, BMP180_AC4);
cal_ac5 = I2cRead16(bmp_address, BMP180_AC5);
cal_ac6 = I2cRead16(bmp_address, BMP180_AC6);
cal_b1 = I2cRead16(bmp_address, BMP180_VB1);
cal_b2 = I2cRead16(bmp_address, BMP180_VB2);
cal_mc = I2cRead16(bmp_address, BMP180_MC);
cal_md = I2cRead16(bmp_address, BMP180_MD);
cal_b1 = I2cRead16(bmp_address, BMP180_VB1);
cal_b2 = I2cRead16(bmp_address, BMP180_VB2);
cal_mc = I2cRead16(bmp_address, BMP180_MC);
cal_md = I2cRead16(bmp_address, BMP180_MD);
// Check for Errors in calibration data. Value never is 0x0000 or 0xFFFF
if (!cal_ac1 | !cal_ac2 | !cal_ac3 | !cal_ac4 | !cal_ac5 | !cal_ac6 | !cal_b1 | !cal_b2 | !cal_mc | !cal_md) {
@ -126,7 +126,7 @@ double Bmp180ReadPressure()
uint8_t xlsb;
I2cWrite8(bmp_address, BMP180_REG_CONTROL, BMP180_PRESSURE3); // Highest resolution
delay(2 + (4 << BMP180_OSS)); // 26ms conversion time at ultra high resolution
delay(2 + (4 << BMP180_OSS)); // 26ms conversion time at ultra high resolution
uint32_t up = I2cRead24(bmp_address, BMP180_REG_RESULT);
up >>= (8 - BMP180_OSS);
@ -154,7 +154,7 @@ double Bmp180ReadPressure()
x2 = (-7357 * p) >> 16;
p += ((x1 + x2 + (int32_t)3791) >> 4);
return p / 100.0; // convert to mbar
return p / 100.0; // convert to mbar
}
/*********************************************************************************************\
@ -163,51 +163,51 @@ double Bmp180ReadPressure()
* Programmer : BMP280/BME280 Datasheet and Adafruit with changes by Theo Arends
\*********************************************************************************************/
#define BME280_REGISTER_CONTROLHUMID 0xF2
#define BME280_REGISTER_CONTROL 0xF4
#define BME280_REGISTER_PRESSUREDATA 0xF7
#define BME280_REGISTER_TEMPDATA 0xFA
#define BME280_REGISTER_HUMIDDATA 0xFD
#define BME280_REGISTER_CONTROLHUMID 0xF2
#define BME280_REGISTER_CONTROL 0xF4
#define BME280_REGISTER_PRESSUREDATA 0xF7
#define BME280_REGISTER_TEMPDATA 0xFA
#define BME280_REGISTER_HUMIDDATA 0xFD
#define BME280_REGISTER_DIG_T1 0x88
#define BME280_REGISTER_DIG_T2 0x8A
#define BME280_REGISTER_DIG_T3 0x8C
#define BME280_REGISTER_DIG_P1 0x8E
#define BME280_REGISTER_DIG_P2 0x90
#define BME280_REGISTER_DIG_P3 0x92
#define BME280_REGISTER_DIG_P4 0x94
#define BME280_REGISTER_DIG_P5 0x96
#define BME280_REGISTER_DIG_P6 0x98
#define BME280_REGISTER_DIG_P7 0x9A
#define BME280_REGISTER_DIG_P8 0x9C
#define BME280_REGISTER_DIG_P9 0x9E
#define BME280_REGISTER_DIG_H1 0xA1
#define BME280_REGISTER_DIG_H2 0xE1
#define BME280_REGISTER_DIG_H3 0xE3
#define BME280_REGISTER_DIG_H4 0xE4
#define BME280_REGISTER_DIG_H5 0xE5
#define BME280_REGISTER_DIG_H6 0xE7
#define BME280_REGISTER_DIG_T1 0x88
#define BME280_REGISTER_DIG_T2 0x8A
#define BME280_REGISTER_DIG_T3 0x8C
#define BME280_REGISTER_DIG_P1 0x8E
#define BME280_REGISTER_DIG_P2 0x90
#define BME280_REGISTER_DIG_P3 0x92
#define BME280_REGISTER_DIG_P4 0x94
#define BME280_REGISTER_DIG_P5 0x96
#define BME280_REGISTER_DIG_P6 0x98
#define BME280_REGISTER_DIG_P7 0x9A
#define BME280_REGISTER_DIG_P8 0x9C
#define BME280_REGISTER_DIG_P9 0x9E
#define BME280_REGISTER_DIG_H1 0xA1
#define BME280_REGISTER_DIG_H2 0xE1
#define BME280_REGISTER_DIG_H3 0xE3
#define BME280_REGISTER_DIG_H4 0xE4
#define BME280_REGISTER_DIG_H5 0xE5
#define BME280_REGISTER_DIG_H6 0xE7
struct BME280CALIBDATA
{
uint16_t dig_T1;
int16_t dig_T2;
int16_t dig_T3;
int16_t dig_T2;
int16_t dig_T3;
uint16_t dig_P1;
int16_t dig_P2;
int16_t dig_P3;
int16_t dig_P4;
int16_t dig_P5;
int16_t dig_P6;
int16_t dig_P7;
int16_t dig_P8;
int16_t dig_P9;
uint8_t dig_H1;
int16_t dig_H2;
uint8_t dig_H3;
int16_t dig_H4;
int16_t dig_H5;
int8_t dig_H6;
int16_t dig_P2;
int16_t dig_P3;
int16_t dig_P4;
int16_t dig_P5;
int16_t dig_P6;
int16_t dig_P7;
int16_t dig_P8;
int16_t dig_P9;
uint8_t dig_H1;
int16_t dig_H2;
uint8_t dig_H3;
int16_t dig_H4;
int16_t dig_H5;
int8_t dig_H6;
} Bme280CalibrationData;
int32_t t_fine;
@ -254,8 +254,7 @@ double Bme280ReadTemperature(void)
var1 = ((((adc_T >> 3) - ((int32_t)Bme280CalibrationData.dig_T1 << 1))) * ((int32_t)Bme280CalibrationData.dig_T2)) >> 11;
var2 = (((((adc_T >> 4) - ((int32_t)Bme280CalibrationData.dig_T1)) * ((adc_T >> 4) - ((int32_t)Bme280CalibrationData.dig_T1))) >> 12) *
((int32_t)Bme280CalibrationData.dig_T3)) >>
14;
((int32_t)Bme280CalibrationData.dig_T3)) >> 14;
t_fine = var1 + var2;
double T = (t_fine * 5 + 128) >> 8;
return T / 100.0;
@ -302,19 +301,12 @@ double Bme280ReadHumidity(void)
v_x1_u32r = (t_fine - ((int32_t)76800));
v_x1_u32r = (((((adc_H << 14) - (((int32_t)Bme280CalibrationData.dig_H4) << 20) -
(((int32_t)Bme280CalibrationData.dig_H5) * v_x1_u32r)) +
((int32_t)16384)) >>
15) *
(((((((v_x1_u32r * ((int32_t)Bme280CalibrationData.dig_H6)) >> 10) *
(((v_x1_u32r * ((int32_t)Bme280CalibrationData.dig_H3)) >> 11) + ((int32_t)32768))) >>
10) +
((int32_t)2097152)) *
((int32_t)Bme280CalibrationData.dig_H2) +
8192) >>
14));
(((int32_t)Bme280CalibrationData.dig_H5) * v_x1_u32r)) + ((int32_t)16384)) >> 15) *
(((((((v_x1_u32r * ((int32_t)Bme280CalibrationData.dig_H6)) >> 10) *
(((v_x1_u32r * ((int32_t)Bme280CalibrationData.dig_H3)) >> 11) + ((int32_t)32768))) >> 10) +
((int32_t)2097152)) * ((int32_t)Bme280CalibrationData.dig_H2) + 8192) >> 14));
v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) *
((int32_t)Bme280CalibrationData.dig_H1)) >>
4));
((int32_t)Bme280CalibrationData.dig_H1)) >> 4));
v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r;
v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r;
double h = (v_x1_u32r >> 12);
@ -359,7 +351,7 @@ double BmpReadPressure(void)
pressure = Bme280ReadPressure();
}
if (pressure != 0.0) {
// bmp_sealevel = pressure / pow(1.0 - ((float)Settings.altitude / 44330.0), 5.255); // Adds 8k to the code
// bmp_sealevel = pressure / pow(1.0 - ((float)Settings.altitude / 44330.0), 5.255); // pow adds 8k to the code
bmp_sealevel = (pressure / FastPrecisePow(1.0 - ((float)Settings.altitude / 44330.0), 5.255)) - 21.6;
}
return pressure;