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 ## 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. 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 ### ATTENTION All versions

View File

@ -14,10 +14,10 @@ src_dir = sonoff
;env_default = sonoff ;env_default = sonoff
;env_default = sonoff-NL ;env_default = sonoff-NL
;env_default = sonoff-DE ;env_default = sonoff-DE
;env_default = sonoff-PL
;env_default = sonoff-minimal ;env_default = sonoff-minimal
;env_default = sonoff-ds18x20 ;env_default = sonoff-ds18x20
; *** Sonoff et al
[env:sonoff] [env:sonoff]
platform = espressif8266 platform = espressif8266
framework = arduino framework = arduino
@ -40,7 +40,6 @@ monitor_baud = 115200
;upload_port = domus1:80/api/upload-arduino.php ;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py ;extra_scripts = pio/http-uploader.py
; *** Sonoff et al
[env:sonoff-NL] [env:sonoff-NL]
platform = espressif8266 platform = espressif8266
framework = arduino framework = arduino
@ -63,7 +62,6 @@ monitor_baud = 115200
;upload_port = domus1:80/api/upload-arduino.php ;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py ;extra_scripts = pio/http-uploader.py
; *** Sonoff et al
[env:sonoff-DE] [env:sonoff-DE]
platform = espressif8266 platform = espressif8266
framework = arduino framework = arduino
@ -86,6 +84,28 @@ monitor_baud = 115200
;upload_port = domus1:80/api/upload-arduino.php ;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py ;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 ; Sonoff minimal
[env:sonoff-minimal] ; Placeholder to be configured [env:sonoff-minimal] ; Placeholder to be configured
platform = espressif8266 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) * Rewrite code (partly) using Google C++ Style Guide (https://google.github.io/styleguide/cppguide.html)
* Allow empty MqttHost name by using option 0 * Allow empty MqttHost name by using option 0
* Allow Mqtt server mDNS lookup only when MqttHost name is empty (#1026) * 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 compile error when DOMOTICZ_UPDATE_TIMER is not defined (#930)
* Fix alignment of web page items in some browsers (#935) * Fix alignment of web page items in some browsers (#935)
* Add smoother movement of hour hand in WS2812 led clock (#936) * 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 * 5.8.0b
* Fix command FullTopic entry when using serial or console interface * Fix command FullTopic entry when using serial or console interface

View File

@ -100,12 +100,12 @@
#define D_FREE_MEMORY "freier Speicher" #define D_FREE_MEMORY "freier Speicher"
#define D_FREEMEMORY "frei" #define D_FREEMEMORY "frei"
#define D_FROM "von" #define D_FROM "von"
#define D_GATEWAY "gateway" #define D_GATEWAY "Gateway"
#define D_GROUP "Gruppe" #define D_GROUP "Gruppe"
#define D_HEAPSIZE "Heap-Größe" #define D_HEAPSIZE "Heap-Größe"
#define D_HIGH "hoch" #define D_HIGH "hoch"
#define D_HOST "host" #define D_HOST "host"
#define D_HOSTNAME "hostname" #define D_HOSTNAME "Hostname"
#define D_HUMIDITY "Feuchtigkeit" #define D_HUMIDITY "Feuchtigkeit"
#define D_ILLUMINANCE "Beleuchtungsintensität" #define D_ILLUMINANCE "Beleuchtungsintensität"
#define D_IMMEDIATE "direkt" // Button immediate #define D_IMMEDIATE "direkt" // Button immediate
@ -187,7 +187,7 @@
#define D_UNKNOWN "unbekannt" #define D_UNKNOWN "unbekannt"
#define D_UPGRADE "upgrade" #define D_UPGRADE "upgrade"
#define D_UPLOAD "upload" #define D_UPLOAD "upload"
#define D_UPTIME "uptime" #define D_UPTIME "Laufzeit"
#define D_UTC_TIME "UTC" #define D_UTC_TIME "UTC"
#define D_USER "Benutzer" #define D_USER "Benutzer"
#define D_VCC "VCC" #define D_VCC "VCC"
@ -273,7 +273,7 @@
#define D_CONFIGURE_MQTT "MQTT konfigurieren" #define D_CONFIGURE_MQTT "MQTT konfigurieren"
#define D_CONFIGURE_DOMOTICZ "Domoticz konfigurieren" #define D_CONFIGURE_DOMOTICZ "Domoticz konfigurieren"
#define D_CONFIGURE_LOGGING "Logging 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_CONFIRM_RESET_CONFIGURATION "Zurücksetzen der Konfiguration bestätigen"
#define D_RESET_CONFIGURATION "Konfiguration zurücksetzen" #define D_RESET_CONFIGURATION "Konfiguration zurücksetzen"
#define D_BACKUP_CONFIGURATION "Konfiguration sichern" #define D_BACKUP_CONFIGURATION "Konfiguration sichern"
@ -443,9 +443,9 @@
#define D_POWERMONITOR "PowerMonitor" #define D_POWERMONITOR "PowerMonitor"
#define D_ENERGYMONITOR "EnergyMonitor" #define D_ENERGYMONITOR "EnergyMonitor"
#define D_MAXENERGYREACHED "MaxEnergyReached" #define D_MAXENERGYREACHED "MaxEnergyReached"
#define D_ENERGY_TODAY "Strom heute" #define D_ENERGY_TODAY "Energie heute"
#define D_ENERGY_YESTERDAY "Strom gestern" #define D_ENERGY_YESTERDAY "Energie gestern"
#define D_ENERGY_TOTAL "Stromtotal" #define D_ENERGY_TOTAL "Energie insgesamt"
// xsns_sht1x.ino // xsns_sht1x.ino
#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor hat ACK-Befehl nicht ausgeführt" #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 button_single : 1; // bit 13 (v5.4.0)
uint32_t interlock : 1; // bit 14 (v5.6.0) uint32_t interlock : 1; // bit 14 (v5.6.0)
uint32_t pwm_control : 1; // bit 15 (v5.8.1) uint32_t pwm_control : 1; // bit 15 (v5.8.1)
uint32_t spare16 : 1; uint32_t ws_clock_reverse : 1; // bit 16 (v5.8.1)
uint32_t spare17 : 1; uint32_t decimal_text : 1; // bit 17 (v5.8.1)
uint32_t spare18 : 1; uint32_t spare18 : 1;
uint32_t wattage_resolution : 1; uint32_t wattage_resolution : 1;
uint32_t voltage_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_fade; // 3A5 Not used since 5.8.0
uint8_t ws_speed; // 3A6 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_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 byte free_3A9[1]; // 3A9
@ -162,7 +162,8 @@ struct SYSCFG {
uint16_t domoticz_sensor_idx[12]; // 45C uint16_t domoticz_sensor_idx[12]; // 45C
uint8_t module; // 474 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 myio my_gp; // 484
uint16_t led_pixels; // 496 uint16_t led_pixels; // 496
@ -190,7 +191,6 @@ struct SYSCFG {
byte free_531[1]; // 531 byte free_531[1]; // 531
uint16_t pulse_timer[MAX_PULSETIMERS]; // 532 uint16_t pulse_timer[MAX_PULSETIMERS]; // 532
//uint16_t ex_pwm_value[MAX_PWMS]; // 53A
byte free_542[2]; // 542 byte free_542[2]; // 542

View File

@ -509,6 +509,9 @@ void SettingsDefaultSet2()
// 5.8.0 // 5.8.0
Settings.led_pixels = WS2812_LEDS; 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_fade = 0;
Settings.ws_speed = 1; Settings.ws_speed = 1;
Settings.ws_scheme = 0; Settings.ws_scheme = 0;
Settings.ws_width = 1; Settings.ex_ws_width = 1;
Settings.ws_wakeup = 0; Settings.ws_wakeup = 0;
} }
@ -601,6 +604,23 @@ void SettingsDefaultSet_5_0_2()
Settings.flag.energy_resolution = ENERGY_RESOLUTION; 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() void SettingsDelta()
@ -723,7 +743,7 @@ void SettingsDelta()
Settings.led_fade = Settings.ws_fade; Settings.led_fade = Settings.ws_fade;
Settings.led_speed = Settings.ws_speed; Settings.led_speed = Settings.ws_speed;
Settings.led_scheme = Settings.ws_scheme; 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; Settings.led_wakeup = Settings.ws_wakeup;
} else { } else {
Settings.led_pixels = WS2812_LEDS; Settings.led_pixels = WS2812_LEDS;
@ -749,6 +769,9 @@ void SettingsDelta()
Settings.pwm_frequency = PWM_FREQ; Settings.pwm_frequency = PWM_FREQ;
Settings.pwm_range = PWM_RANGE; Settings.pwm_range = PWM_RANGE;
} }
if (Settings.version < 0x0508000E) {
SettingsDefaultSet_5_8_1();
}
Settings.version = VERSION; Settings.version = VERSION;
SettingsSave(1); 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 EmulationOptions {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX};
enum ButtonStates {PRESSED, NOT_PRESSED}; enum ButtonStates {PRESSED, NOT_PRESSED};
enum SettingsParmaIndex {P_HOLD_TIME, P_MAX_POWER_RETRY, P_MAX_PARAM8}; 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_ #endif // _SONOFF_H_

View File

@ -25,7 +25,7 @@
- Select IDE Tools - Flash Size: "1M (no SPIFFS)" - Select IDE Tools - Flash Size: "1M (no SPIFFS)"
====================================================*/ ====================================================*/
#define VERSION 0x0508000D // 5.8.0m #define VERSION 0x0508000E // 5.8.0n
// Location specific includes // Location specific includes
#include "sonoff.h" // Enumaration used in user_config.h #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)); 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) { if (index <= 31) {
ptype = 0; // SetOption0 .. 31 ptype = 0; // SetOption0 .. 31
} else { } else {
@ -966,6 +966,8 @@ void MqttDataCallback(char* topic, byte* data, unsigned int data_len)
case 12: // stop_flash_rotate case 12: // stop_flash_rotate
case 13: // button_single case 13: // button_single
case 14: // interlock case 14: // interlock
case 16: // ws_clock_reverse
case 17: // decimal_text
bitWrite(Settings.flag.data, index, payload); bitWrite(Settings.flag.data, index, payload);
} }
if (12 == index) { // stop_flash_rotate if (12 == index) { // stop_flash_rotate

View File

@ -192,6 +192,7 @@ enum SupportedModules {
YUNSHAN, YUNSHAN,
MAGICHOME, MAGICHOME,
LUANIHVIO, LUANIHVIO,
KMC_70011,
MAXMODULE }; MAXMODULE };
/********************************************************************************************/ /********************************************************************************************/
@ -242,6 +243,7 @@ const uint8_t kNiceList[MAXMODULE] PROGMEM = {
H801, H801,
MAGICHOME, MAGICHOME,
HUAFAN_SS, HUAFAN_SS,
KMC_70011,
AILIGHT, AILIGHT,
WEMOS, WEMOS,
WITTY WITTY
@ -714,6 +716,17 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
GPIO_LED1, // GPIO15 Led (1 = On, 0 = Off) GPIO_LED1, // GPIO15 Led (1 = On, 0 = Off)
0, 0,
GPIO_ADC0 // ADC0 A0 Analog input 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 #ifdef MQTT_HOST_DISCOVERY
boolean MdnsDiscoverMqttServer() boolean MdnsDiscoverMqttServer()
{ {
// char ip_str[20];
int n;
if (!mdns_begun) { if (!mdns_begun) {
return false; 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); snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MDNS D_QUERY_DONE " %d"), n);
AddLog(LOG_LEVEL_INFO); AddLog(LOG_LEVEL_INFO);

View File

@ -29,9 +29,10 @@
\*********************************************************************************************/ \*********************************************************************************************/
// -- Localization -------------------------------- // -- Localization --------------------------------
//#define MY_LANGUAGE en-GB // Enabled by Default //#define MY_LANGUAGE en-GB // English in Great Britain. Enabled by Default
//#define MY_LANGUAGE nl-NL //#define MY_LANGUAGE nl-NL // Dutch in the Netherlands
//#define MY_LANGUAGE de-DE //#define MY_LANGUAGE de-DE // German in Germany
//#define MY_LANGUAGE pl-PL // Polish in Poland
// -- Project ------------------------------------- // -- Project -------------------------------------
#define PROJECT "sonoff" // PROJECT is used as the default topic delimiter and OTA file name #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 // 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_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 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! * 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" #error "Select either USE_MQTT_TLS or USE_WEBSERVER as there is just not enough memory to play with"
#endif #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_ #endif // _USER_CONFIG_H_

View File

@ -140,10 +140,19 @@ const char HTTP_SCRIPT_MODULE1[] PROGMEM =
"function sl(){" "function sl(){"
"var o0=\""; "var o0=\"";
const char HTTP_SCRIPT_MODULE2[] PROGMEM = 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 = const char HTTP_SCRIPT_MODULE3[] PROGMEM =
"\";" "\";"
"os=o0.replace(/}1/g,\"<option value=\").replace(/}2/g,\"</option>\");"; "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 = const char HTTP_MSG_SLIDER1[] PROGMEM =
"<div><span class='p'>" D_COLDLIGHT "</span><span class='q'>" D_WARMLIGHT "</span></div>" "<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>"; "<div><input type='range' min='153' max='500' value='%d' onchange='lc(value)'></div>";
@ -1045,6 +1054,9 @@ void HandleSaveSettings()
strlcpy(Settings.syslog_host, (!strlen(WebServer->arg("lh").c_str())) ? SYS_LOG_HOST : WebServer->arg("lh").c_str(), sizeof(Settings.syslog_host)); 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.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()); Settings.tele_period = (!strlen(WebServer->arg("lt").c_str())) ? TELE_PERIOD : atoi(WebServer->arg("lt").c_str());
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"), 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); Settings.seriallog_level, Settings.weblog_level, Settings.syslog_level, Settings.syslog_host, Settings.syslog_port, Settings.tele_period);
AddLog(LOG_LEVEL_INFO); AddLog(LOG_LEVEL_INFO);
@ -1508,93 +1520,102 @@ void HandleInformation()
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), FPSTR(S_INFORMATION)); 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("<style>td{padding:0px 5px;}</style>");
page += F("<table style'width:100%;'>"); page += F("<div id='i' name='i'></div>");
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>"); // Save 1k of code space replacing table html with javascript replace codes
page += F("<tr><th>" D_CORE_AND_SDK_VERSION "</th><td>"); page += ESP.getCoreVersion(); page += F("/"); page += String(ESP.getSdkVersion()); page += F("</td></tr>"); // }1 = </td></tr><tr><th>
page += F("<tr><th>" D_UPTIME "</th><td>"); page += String(uptime); page += F(" Hours</td></tr>"); // }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()); 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>"); func += F("}1" D_FLASH_WRITE_COUNT "}2"); func += String(Settings.save_flag); func += stopic;
page += F("<tr><th>" D_BOOT_COUNT "</th><td>"); page += String(Settings.bootcount); page += F("</td></tr>"); func += F("}1" D_BOOT_COUNT "}2"); func += String(Settings.bootcount);
page += F("<tr><th>" D_RESTART_REASON "</th><td>"); page += GetResetReason(); page += F("</td></tr>"); func += F("}1" D_RESTART_REASON "}2"); func += GetResetReason();
uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present; uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present;
for (byte i = 0; i < maxfn; i++) { for (byte i = 0; i < maxfn; i++) {
page += F("<tr><th>" D_FRIENDLY_NAME " "); func += F("}1" D_FRIENDLY_NAME " "); func += i +1; func += F("}2"); func += Settings.friendlyname[i];
page += i +1;
page += F("</th><td>"); page += Settings.friendlyname[i]; page += F("</td></tr>");
} }
page += F("<tr><td>&nbsp;</td></tr>");
page += F("<tr><th>" D_AP); page += String(Settings.sta_active +1); func += F("}1}2&nbsp;"); // Empty line
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>"); func += F("}1" D_AP); func += String(Settings.sta_active +1);
page += F("<tr><th>" D_HOSTNAME "</th><td>"); page += my_hostname; page += F("</td></tr>"); 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) { 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>"); func += F("}1" D_IP_ADDRESS "}2"); func += WiFi.localIP().toString();
page += F("<tr><th>" D_GATEWAY "</th><td>"); page += IPAddress(Settings.ip_address[1]).toString(); page += F("</td></tr>"); func += F("}1" D_GATEWAY "}2"); func += IPAddress(Settings.ip_address[1]).toString();
page += F("<tr><th>" D_SUBNET_MASK "</th><td>"); page += IPAddress(Settings.ip_address[2]).toString(); page += F("</td></tr>"); func += F("}1" D_SUBNET_MASK "}2"); func += IPAddress(Settings.ip_address[2]).toString();
page += F("<tr><th>" D_DNS_SERVER "</th><td>"); page += IPAddress(Settings.ip_address[3]).toString(); page += F("</td></tr>"); func += F("}1" D_DNS_SERVER "}2"); func += IPAddress(Settings.ip_address[3]).toString();
page += F("<tr><th>" D_MAC_ADDRESS "</th><td>"); page += WiFi.macAddress(); page += F("</td></tr>"); func += F("}1" D_MAC_ADDRESS "}2"); func += WiFi.macAddress();
} }
if (static_cast<uint32_t>(WiFi.softAPIP()) != 0) { 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>"); func += F("}1" D_AP " " D_IP_ADDRESS "}2"); func += WiFi.softAPIP().toString();
page += F("<tr><th>" D_AP " " D_GATEWAY "</th><td>"); page += WiFi.softAPIP().toString(); page += F("</td></tr>"); func += F("}1" D_AP " " D_GATEWAY "}2"); func += WiFi.softAPIP().toString();
page += F("<tr><th>" D_AP " " D_MAC_ADDRESS "</th><td>"); page += WiFi.softAPmacAddress(); page += F("</td></tr>"); 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) { if (Settings.flag.mqtt_enabled) {
page += F("<tr><th>" D_MQTT_HOST "</th><td>"); page += Settings.mqtt_host; page += F("</td></tr>"); func += F("}1" D_MQTT_HOST "}2"); func += Settings.mqtt_host;
page += F("<tr><th>" D_MQTT_PORT "</th><td>"); page += String(Settings.mqtt_port); page += F("</td></tr>"); func += F("}1" D_MQTT_PORT "}2"); func += String(Settings.mqtt_port);
page += F("<tr><th>" D_MQTT_CLIENT " &<br/>&nbsp;" D_FALLBACK_TOPIC "</th><td>"); page += mqtt_client; page += F("</td></tr>"); func += F("}1" D_MQTT_CLIENT " &<br/>&nbsp;" D_FALLBACK_TOPIC "}2"); func += mqtt_client;
page += F("<tr><th>" D_MQTT_USER "</th><td>"); page += Settings.mqtt_user; page += F("</td></tr>"); func += F("}1" D_MQTT_USER "}2"); func += Settings.mqtt_user;
page += F("<tr><th>" D_MQTT_TOPIC "</th><td>"); page += Settings.mqtt_topic; page += F("</td></tr>"); func += F("}1" D_MQTT_TOPIC "}2"); func += Settings.mqtt_topic;
page += F("<tr><th>" D_MQTT_GROUP_TOPIC "</th><td>"); page += Settings.mqtt_grptopic; page += F("</td></tr>"); func += F("}1" D_MQTT_GROUP_TOPIC "}2"); func += Settings.mqtt_grptopic;
GetTopic_P(stopic, 0, Settings.mqtt_topic, ""); 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 { } 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 #ifdef USE_EMULATION
if (EMUL_WEMO == Settings.flag.emulation) { if (EMUL_WEMO == Settings.flag.emulation) {
page += F(D_BELKIN_WEMO); func += F(D_BELKIN_WEMO);
} }
else if (EMUL_HUE == Settings.flag.emulation) { else if (EMUL_HUE == Settings.flag.emulation) {
page += F(D_HUE_BRIDGE); func += F(D_HUE_BRIDGE);
} }
else { else {
page += F(D_NONE); func += F(D_NONE);
} }
#else #else
page += F(D_DISABLED); func += F(D_DISABLED);
#endif // USE_EMULATION #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 #ifdef USE_DISCOVERY
page += F(D_ENABLED); func += F(D_ENABLED);
page += F("</td></tr>"); func += F("}1" D_MDNS_ADVERTISE "}2");
page += F("<tr><th>" D_MDNS_ADVERTISE "</th><td>");
#ifdef WEBSERVER_ADVERTISE #ifdef WEBSERVER_ADVERTISE
page += F(D_WEB_SERVER); func += F(D_WEB_SERVER);
#else #else
page += F(D_DISABLED); func += F(D_DISABLED);
#endif // WEBSERVER_ADVERTISE #endif // WEBSERVER_ADVERTISE
#else #else
page += F(D_DISABLED); func += F(D_DISABLED);
#endif // USE_DISCOVERY #endif // USE_DISCOVERY
page += F("</td></tr>");
page += F("<tr><td>&nbsp;</td></tr>"); func += F("}1}2&nbsp;"); // Empty line
page += F("<tr><th>" D_ESP_CHIP_ID "</th><td>"); page += String(ESP.getChipId()); page += F("</td></tr>"); func += F("}1" D_ESP_CHIP_ID "}2"); func += String(ESP.getChipId());
page += F("<tr><th>" D_FLASH_CHIP_ID "</th><td>"); page += String(ESP.getFlashChipId()); page += F("</td></tr>"); func += F("}1" D_FLASH_CHIP_ID "}2"); func += String(ESP.getFlashChipId());
page += F("<tr><th>" D_FLASH_CHIP_SIZE "</th><td>"); page += String(ESP.getFlashChipRealSize() / 1024); page += F("kB</td></tr>"); func += F("}1" D_FLASH_CHIP_SIZE "}2"); func += String(ESP.getFlashChipRealSize() / 1024); func += F("kB");
page += F("<tr><th>" D_PROGRAM_FLASH_SIZE "</th><td>"); page += String(ESP.getFlashChipSize() / 1024); page += F("kB</td></tr>"); func += F("}1" D_PROGRAM_FLASH_SIZE "}2"); func += String(ESP.getFlashChipSize() / 1024); func += F("kB");
page += F("<tr><th>" D_PROGRAM_SIZE "</th><td>"); page += String(ESP.getSketchSize() / 1024); page += F("kB</td></tr>"); func += F("}1" D_PROGRAM_SIZE "}2"); func += String(ESP.getSketchSize() / 1024); func += F("kB");
page += F("<tr><th>" D_FREE_PROGRAM_SPACE "</th><td>"); page += String(ESP.getFreeSketchSpace() / 1024); page += F("kB</td></tr>"); func += F("}1" D_FREE_PROGRAM_SPACE "}2"); func += String(ESP.getFreeSketchSpace() / 1024); func += F("kB");
page += F("<tr><th>" D_FREE_MEMORY "</th><td>"); page += String(freeMem / 1024); page += F("kB</td></tr>"); func += F("}1" D_FREE_MEMORY "}2"); func += String(freeMem / 1024); func += F("kB");
page += F("</table>"); 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 += F("</fieldset>");
page += FPSTR(HTTP_BTN_MAIN); page += FPSTR(HTTP_BTN_MAIN);
ShowPage(page); 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, 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 }; 219,221,224,226,228,231,233,235,238,240,243,245,248,250,253,255 };
uint8_t sl_dcolor[5]; uint8_t light_entry_color[5];
uint8_t sl_tcolor[5]; uint8_t light_current_color[5];
uint8_t sl_lcolor[5]; uint8_t light_new_color[5];
uint8_t light_last_color[5];
uint8_t sl_power = 0; uint8_t light_subtype = 0;
uint8_t sl_any = 1; uint8_t light_power = 0;
uint8_t sl_wakeupActive = 0; uint8_t light_update = 1;
uint8_t sl_wakeupDimmer = 0; uint8_t light_wakeup_active = 0;
uint16_t sl_wakeupCntr = 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 * Sonoff B1 and AiLight inspired by OpenLight https://github.com/icamgo/noduino-sdk
@ -84,35 +86,35 @@ extern "C" {
void os_delay_us(unsigned int); void os_delay_us(unsigned int);
} }
uint8_t sl_pdi; uint8_t light_pdi_pin;
uint8_t sl_pdcki; uint8_t light_pdcki_pin;
void LightDiPulse(uint8_t times) void LightDiPulse(uint8_t times)
{ {
for (uint8_t i = 0; i < times; i++) { for (uint8_t i = 0; i < times; i++) {
digitalWrite(sl_pdi, HIGH); digitalWrite(light_pdi_pin, HIGH);
digitalWrite(sl_pdi, LOW); digitalWrite(light_pdi_pin, LOW);
} }
} }
void LightDckiPulse(uint8_t times) void LightDckiPulse(uint8_t times)
{ {
for (uint8_t i = 0; i < times; i++) { for (uint8_t i = 0; i < times; i++) {
digitalWrite(sl_pdcki, HIGH); digitalWrite(light_pdcki_pin, HIGH);
digitalWrite(sl_pdcki, LOW); digitalWrite(light_pdcki_pin, LOW);
} }
} }
void LightMy92x1Write(uint8_t data) void LightMy92x1Write(uint8_t data)
{ {
for (uint8_t i = 0; i < 4; i++) { // Send 8bit Data for (uint8_t i = 0; i < 4; i++) { // Send 8bit Data
digitalWrite(sl_pdcki, LOW); digitalWrite(light_pdcki_pin, LOW);
digitalWrite(sl_pdi, (data & 0x80)); digitalWrite(light_pdi_pin, (data & 0x80));
digitalWrite(sl_pdcki, HIGH); digitalWrite(light_pdcki_pin, HIGH);
data = data << 1; data = data << 1;
digitalWrite(sl_pdi, (data & 0x80)); digitalWrite(light_pdi_pin, (data & 0x80));
digitalWrite(sl_pdcki, LOW); digitalWrite(light_pdcki_pin, LOW);
digitalWrite(sl_pdi, LOW); digitalWrite(light_pdi_pin, LOW);
data = data << 1; data = data << 1;
} }
} }
@ -140,9 +142,7 @@ void LightMy92x1Init()
void LightMy92x1Duty(uint8_t duty_r, uint8_t duty_g, uint8_t duty_b, uint8_t duty_w, uint8_t duty_c) 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 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 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 { duty_w, duty_c, 0, duty_g, duty_r, duty_b }}; // Definition for RGBWC channels
@ -191,21 +191,22 @@ void LightInit(void)
} }
#endif // USE_WS2812 ************************************************************************ #endif // USE_WS2812 ************************************************************************
else { else {
sl_pdi = pin[GPIO_DI]; light_pdi_pin = pin[GPIO_DI];
sl_pdcki = pin[GPIO_DCKI]; light_pdcki_pin = pin[GPIO_DCKI];
pinMode(sl_pdi, OUTPUT); pinMode(light_pdi_pin, OUTPUT);
pinMode(sl_pdcki, OUTPUT); pinMode(light_pdcki_pin, OUTPUT);
digitalWrite(sl_pdi, LOW); digitalWrite(light_pdi_pin, LOW);
digitalWrite(sl_pdcki, LOW); digitalWrite(light_pdcki_pin, LOW);
LightMy92x1Init(); LightMy92x1Init();
Settings.led_scheme = 0; Settings.led_scheme = 0;
} }
sl_power = 0; light_subtype = light_type &7;
sl_any = 1; light_power = 0;
sl_wakeupActive = 0; light_update = 1;
light_wakeup_active = 0;
} }
void LightSetColorTemp(uint16_t ct) void LightSetColorTemp(uint16_t ct)
@ -221,7 +222,7 @@ void LightSetColorTemp(uint16_t ct)
} }
uint16_t icold = (100 * (347 - my_ct)) / 136; uint16_t icold = (100 * (347 - my_ct)) / 136;
uint16_t iwarm = (100 * 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[0] = 0;
Settings.led_color[1] = 0; Settings.led_color[1] = 0;
Settings.led_color[2] = 0; Settings.led_color[2] = 0;
@ -236,7 +237,7 @@ void LightSetColorTemp(uint16_t ct)
uint16_t LightGetColorTemp() uint16_t LightGetColorTemp()
{ {
uint8_t ct_idx = 0; uint8_t ct_idx = 0;
if (5 == (light_type &7)) { if (5 == light_subtype) {
ct_idx = 3; ct_idx = 3;
} }
uint16_t my_ct = Settings.led_color[ct_idx +1]; uint16_t my_ct = Settings.led_color[ct_idx +1];
@ -256,9 +257,9 @@ void LightSetDimmer(uint8_t myDimmer)
myDimmer = 99; // BN-SZ01 starts flickering at dimmer = 100 myDimmer = 99; // BN-SZ01 starts flickering at dimmer = 100
} }
float dimmer = 100 / (float)myDimmer; 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; 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; uint8_t highest = 0;
float temp; float temp;
for (byte i = 0; i < (light_type &7); i++) { for (byte i = 0; i < light_subtype; i++) {
if (highest < sl_dcolor[i]) { if (highest < light_current_color[i]) {
highest = sl_dcolor[i]; highest = light_current_color[i];
} }
} }
float mDim = (float)highest / 2.55; float mDim = (float)highest / 2.55;
Settings.led_dimmer = (uint8_t)mDim; Settings.led_dimmer = (uint8_t)mDim;
float dimmer = 100 / mDim; float dimmer = 100 / mDim;
for (byte i = 0; i < (light_type &7); i++) { for (byte i = 0; i < light_subtype; i++) {
temp = (float)sl_dcolor[i] * dimmer; temp = (float)light_current_color[i] * dimmer;
Settings.led_color[i] = (uint8_t)temp; Settings.led_color[i] = (uint8_t)temp;
} }
} }
char* LightGetColor(char* scolor) char* LightGetColor(uint8_t type, char* scolor)
{ {
LightSetDimmer(Settings.led_dimmer); LightSetDimmer(Settings.led_dimmer);
scolor[0] = '\0'; scolor[0] = '\0';
for (byte i = 0; i < (light_type &7); i++) { for (byte i = 0; i < light_subtype; i++) {
snprintf_P(scolor, 11, PSTR("%s%02X"), scolor, sl_dcolor[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; return scolor;
} }
void LightPreparePower() void LightPreparePower()
{ {
char scolor[11]; char scolor[25];
char scommand[16]; char scommand[16];
if (Settings.led_dimmer && !(sl_power)) { if (Settings.led_dimmer && !(light_power)) {
ExecuteCommandPower(devices_present, 7); // No publishPowerState 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 ExecuteCommandPower(devices_present, 6); // No publishPowerState
} }
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
@ -308,85 +313,84 @@ void LightPreparePower()
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
GetPowerDevice(scommand, devices_present, sizeof(scommand)); 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\"}"), 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 { } else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"%s\", \"" D_CMND_DIMMER "\":%d}"), 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) void LightSetPower(uint8_t mpower)
{ {
sl_power = mpower; light_power = mpower;
if (sl_wakeupActive) { if (light_wakeup_active) {
sl_wakeupActive--; light_wakeup_active--;
} }
if (sl_power) { if (light_power) {
sl_any = 1; light_update = 1;
} }
LightAnimate(); LightAnimate();
} }
void LightAnimate() void LightAnimate()
{ {
// {"Wakeup":"Done"}
uint8_t fadeValue; uint8_t fadeValue;
uint8_t cur_col[5]; uint8_t cur_col[5];
stripTimerCntr++; strip_timer_counter++;
if (!sl_power) { // Power Off if (!light_power) { // Power Off
sleep = Settings.sleep; sleep = Settings.sleep;
stripTimerCntr = 0; strip_timer_counter = 0;
for (byte i = 0; i < (light_type &7); i++) { for (byte i = 0; i < light_subtype; i++) {
sl_tcolor[i] = 0; light_new_color[i] = 0;
} }
} }
else { else {
sleep = 0; sleep = 0;
switch (Settings.led_scheme) { switch (Settings.led_scheme) {
case 0: // Power On case 0: // Power On
LightSetDimmer(Settings.led_dimmer); // Power On LightSetDimmer(Settings.led_dimmer);
if (0 == Settings.led_fade) { if (0 == Settings.led_fade) {
for (byte i = 0; i < (light_type &7); i++) { for (byte i = 0; i < light_subtype; i++) {
sl_tcolor[i] = sl_dcolor[i]; light_new_color[i] = light_current_color[i];
} }
} else { } else {
for (byte i = 0; i < (light_type &7); i++) { for (byte i = 0; i < light_subtype; i++) {
if (sl_tcolor[i] != sl_dcolor[i]) { if (light_new_color[i] != light_current_color[i]) {
if (sl_tcolor[i] < sl_dcolor[i]) { if (light_new_color[i] < light_current_color[i]) {
sl_tcolor[i] += ((sl_dcolor[i] - sl_tcolor[i]) >> Settings.led_speed) +1; light_new_color[i] += ((light_current_color[i] - light_new_color[i]) >> Settings.led_speed) +1;
} }
if (sl_tcolor[i] > sl_dcolor[i]) { if (light_new_color[i] > light_current_color[i]) {
sl_tcolor[i] -= ((sl_tcolor[i] - sl_dcolor[i]) >> Settings.led_speed) +1; light_new_color[i] -= ((light_new_color[i] - light_current_color[i]) >> Settings.led_speed) +1;
} }
} }
} }
} }
break; break;
case 1: // Power On using wake up duration case 1: // Power On using wake up duration
if (2 == sl_wakeupActive) { if (2 == light_wakeup_active) {
sl_wakeupActive = 1; light_wakeup_active = 1;
for (byte i = 0; i < (light_type &7); i++) { for (byte i = 0; i < light_subtype; i++) {
sl_tcolor[i] = 0; light_new_color[i] = 0;
} }
sl_wakeupCntr = 0; light_wakeup_counter = 0;
sl_wakeupDimmer = 0; light_wakeup_dimmer = 0;
} }
sl_wakeupCntr++; light_wakeup_counter++;
if (sl_wakeupCntr > ((Settings.led_wakeup * STATES) / Settings.led_dimmer)) { if (light_wakeup_counter > ((Settings.led_wakeup * STATES) / Settings.led_dimmer)) {
sl_wakeupCntr = 0; light_wakeup_counter = 0;
sl_wakeupDimmer++; light_wakeup_dimmer++;
if (sl_wakeupDimmer <= Settings.led_dimmer) { if (light_wakeup_dimmer <= Settings.led_dimmer) {
LightSetDimmer(sl_wakeupDimmer); LightSetDimmer(light_wakeup_dimmer);
for (byte i = 0; i < (light_type &7); i++) { for (byte i = 0; i < light_subtype; i++) {
sl_tcolor[i] = sl_dcolor[i]; light_new_color[i] = light_current_color[i];
} }
} else { } else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_DONE "\"}")); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_DONE "\"}"));
MqttPublishPrefixTopic_P(2, PSTR(D_CMND_WAKEUP)); MqttPublishPrefixTopic_P(2, PSTR(D_CMND_WAKEUP));
sl_wakeupActive = 0; light_wakeup_active = 0;
Settings.led_scheme = 0; Settings.led_scheme = 0;
} }
} }
@ -400,17 +404,17 @@ void LightAnimate()
} }
} }
if ((Settings.led_scheme < 2) || !sl_power) { if ((Settings.led_scheme < 2) || !light_power) {
for (byte i = 0; i < (light_type &7); i++) { for (byte i = 0; i < light_subtype; i++) {
if (sl_lcolor[i] != sl_tcolor[i]) { if (light_last_color[i] != light_new_color[i]) {
sl_any = 1; light_update = 1;
} }
} }
if (sl_any) { if (light_update) {
sl_any = 0; light_update = 0;
for (byte i = 0; i < (light_type &7); i++) { for (byte i = 0; i < light_subtype; i++) {
sl_lcolor[i] = sl_tcolor[i]; light_last_color[i] = light_new_color[i];
cur_col[i] = (Settings.led_table) ? ledTable[sl_lcolor[i]] : sl_lcolor[i]; cur_col[i] = (Settings.led_table) ? ledTable[light_last_color[i]] : light_last_color[i];
if (light_type < 6) { if (light_type < 6) {
if (pin[GPIO_PWM1 +i] < 99) { if (pin[GPIO_PWM1 +i] < 99) {
uint16_t curcol = cur_col[i] * (Settings.pwm_range / 255); uint16_t curcol = cur_col[i] * (Settings.pwm_range / 255);
@ -436,38 +440,38 @@ void LightAnimate()
* Hue support * Hue support
\*********************************************************************************************/ \*********************************************************************************************/
float sl_Hue = 0.0; float light_hue = 0.0;
float sl_Sat = 0.0; float light_saturation = 0.0;
float sl_Bri = 0.0; float light_brightness = 0.0;
void LightRgbToHsb() void LightRgbToHsb()
{ {
LightSetDimmer(Settings.led_dimmer); LightSetDimmer(Settings.led_dimmer);
// convert colors to float between (0.0 - 1.0) // convert colors to float between (0.0 - 1.0)
float r = sl_dcolor[0] / 255.0f; float r = light_current_color[0] / 255.0f;
float g = sl_dcolor[1] / 255.0f; float g = light_current_color[1] / 255.0f;
float b = sl_dcolor[2] / 255.0f; float b = light_current_color[2] / 255.0f;
float max = (r > g && r > b) ? r : (g > b) ? g : b; float max = (r > g && r > b) ? r : (g > b) ? g : b;
float min = (r < g && r < b) ? r : (g < b) ? g : b; float min = (r < g && r < b) ? r : (g < b) ? g : b;
float d = max - min; float d = max - min;
sl_Hue = 0.0; light_hue = 0.0;
sl_Bri = max; light_brightness = max;
sl_Sat = (0.0f == sl_Bri) ? 0 : (d / sl_Bri); light_saturation = (0.0f == light_brightness) ? 0 : (d / light_brightness);
if (d != 0.0f) if (d != 0.0f)
{ {
if (r == max) { 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) { } else if (g == max) {
sl_Hue = (b - r) / d + 2.0f; light_hue = (b - r) / d + 2.0f;
} else { } 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 g;
float b; float b;
float h = sl_Hue; float h = light_hue;
float s = sl_Sat; float s = light_saturation;
float v = sl_Bri; float v = light_brightness;
if (0.0f == sl_Sat) { if (0.0f == light_saturation) {
r = g = b = v; // achromatic or black r = g = b = v; // Achromatic or black
} else { } else {
if (h < 0.0f) { if (h < 0.0f) {
h += 1.0f; h += 1.0f;
@ -530,20 +534,20 @@ void LightHsbToRgb()
} }
} }
sl_dcolor[0] = (uint8_t)(r * 255.0f); light_current_color[0] = (uint8_t)(r * 255.0f);
sl_dcolor[1] = (uint8_t)(g * 255.0f); light_current_color[1] = (uint8_t)(g * 255.0f);
sl_dcolor[2] = (uint8_t)(b * 255.0f); light_current_color[2] = (uint8_t)(b * 255.0f);
} }
/********************************************************************************************/ /********************************************************************************************/
void LightReplaceHsb(String *response) void LightReplaceHsb(String *response)
{ {
if ((light_type &7) > 2) { if (light_subtype > 2) {
LightRgbToHsb(); LightRgbToHsb();
response->replace("{h}", String((uint16_t)(65535.0f * sl_Hue))); response->replace("{h}", String((uint16_t)(65535.0f * light_hue)));
response->replace("{s}", String((uint8_t)(254.0f * sl_Sat))); response->replace("{s}", String((uint8_t)(254.0f * light_saturation)));
response->replace("{b}", String((uint8_t)(254.0f * sl_Bri))); response->replace("{b}", String((uint8_t)(254.0f * light_brightness)));
} else { } else {
response->replace("{h}", "0"); response->replace("{h}", "0");
response->replace("{s}", "0"); response->replace("{s}", "0");
@ -554,11 +558,11 @@ void LightReplaceHsb(String *response)
void LightGetHsb(float *hue, float *sat, float *bri) void LightGetHsb(float *hue, float *sat, float *bri)
{ {
if ((light_type &7) > 2) { if (light_subtype > 2) {
LightRgbToHsb(); LightRgbToHsb();
*hue = sl_Hue; *hue = light_hue;
*sat = sl_Sat; *sat = light_saturation;
*bri = sl_Bri; *bri = light_brightness;
} else { } else {
*hue = 0; *hue = 0;
*sat = 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) 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 (light_type > 2) {
if ((5 == (light_type &7)) && (ct > 0)) { if ((5 == light_subtype) && (ct > 0)) {
LightSetColorTemp(ct); LightSetColorTemp(ct);
} else { } else {
sl_Hue = hue; light_hue = hue;
sl_Sat = sat; light_saturation = sat;
sl_Bri = bri; light_brightness = bri;
LightHsbToRgb(); LightHsbToRgb();
LightSetColor(); LightSetColor();
} }
@ -595,7 +588,7 @@ void LightSetHsb(float hue, float sat, float bri, uint16_t ct)
} else { } else {
uint8_t tmp = (uint8_t)(bri * 100); uint8_t tmp = (uint8_t)(bri * 100);
Settings.led_dimmer = tmp; Settings.led_dimmer = tmp;
if (2 == (light_type &7)) { if (2 == light_subtype) {
if (ct > 0) { if (ct > 0) {
LightSetColorTemp(ct); LightSetColorTemp(ct);
} }
@ -612,42 +605,79 @@ void LightSetHsb(float hue, float sat, float bri, uint16_t ct)
* Commands * 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 LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
{ {
boolean serviced = true; boolean serviced = true;
boolean coldim = false; boolean coldim = false;
char scolor[11]; boolean valid_entry = false;
char *p; char scolor[25];
if (((light_type &7) > 1) && !strcasecmp_P(type, PSTR(D_CMND_COLOR))) { if ((light_subtype > 1) && !strcasecmp_P(type, PSTR(D_CMND_COLOR)) && (index > 0) && (index <= 5)) {
if (dataBuf[0] == '#') { if (data_len > 0) {
dataBuf++; valid_entry = LightColorEntry(dataBuf, data_len);
data_len--; if (valid_entry) {
} if (1 == index) {
if ((2 * (light_type &7)) == data_len) { memcpy(light_current_color, light_entry_color, sizeof(light_current_color));
for (byte i = 0; i < (light_type &7); i++) {
strlcpy(scolor, dataBuf + (i *2), 3);
sl_dcolor[i] = (uint8_t)strtol(scolor, &p, 16);
}
LightSetColor(); LightSetColor();
coldim = true; coldim = true;
} else { } else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_COLOR "\":\"%s\"}"), LightGetColor(scolor)); memcpy(Settings.ws_color + 3*(index -2), light_entry_color, 3);
}
}
}
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 // *********************************************************************** #ifdef USE_WS2812 // ***********************************************************************
else if ((11 == light_type) && !strcasecmp_P(type, PSTR(D_CMND_LED)) && (index > 0) && (index <= Settings.led_pixels)) { else if ((11 == light_type) && !strcasecmp_P(type, PSTR(D_CMND_LED)) && (index > 0) && (index <= Settings.led_pixels)) {
if (dataBuf[0] == '#') { if (data_len > 0) {
dataBuf++; if (LightColorEntry(dataBuf, data_len)) {
data_len--; Ws2812SetColor(index, light_entry_color[0], light_entry_color[1], light_entry_color[2]);
} }
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);
}
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)); 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)) { if ((payload > 0) && (payload <= WS2812_MAX_LEDS)) {
Settings.led_pixels = payload; Settings.led_pixels = payload;
Ws2812Clear(); Ws2812Clear();
sl_any = 1; light_update = 1;
} }
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_PIXELS "\":%d}"), Settings.led_pixels); 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))) { else if ((11 == light_type) && !strcasecmp_P(type, PSTR(D_CMND_WIDTH)) && (index > 0) && (index <= 4)) {
if (1 == index) {
if ((payload >= 0) && (payload <= 4)) { if ((payload >= 0) && (payload <= 4)) {
Settings.led_width = payload; Settings.led_width = payload;
} }
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WIDTH "\":%d}"), Settings.led_width); 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]);
}
} }
else if ((11 == light_type) && !strcasecmp_P(type, PSTR(D_CMND_SCHEME))) { else if ((11 == light_type) && !strcasecmp_P(type, PSTR(D_CMND_SCHEME))) {
if ((payload >= 0) && (payload <= 9)) { if ((payload >= 0) && (payload <= 9)) {
Settings.led_scheme = payload; Settings.led_scheme = payload;
if (1 == Settings.led_scheme) { if (1 == Settings.led_scheme) {
sl_wakeupActive = 3; light_wakeup_active = 3;
} }
ExecuteCommandPower(devices_present, 1); 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); 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)) { if ((payload >= 0) && (payload <= 100)) {
Settings.led_dimmer = payload; Settings.led_dimmer = payload;
} }
sl_wakeupActive = 3; light_wakeup_active = 3;
Settings.led_scheme = 1; Settings.led_scheme = 1;
ExecuteCommandPower(devices_present, 1); ExecuteCommandPower(devices_present, 1);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_STARTED "\"}")); 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 if ((payload >= 153) && (payload <= 500)) { // https://developers.meethue.com/documentation/core-concepts
LightSetColorTemp(payload); LightSetColorTemp(payload);
coldim = true; coldim = true;
@ -713,7 +750,7 @@ boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_le
Settings.led_table ^= 1; Settings.led_table ^= 1;
break; break;
} }
sl_any = 1; light_update = 1;
} }
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_LEDTABLE "\":\"%s\"}"), GetStateText(Settings.led_table)); 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))) { else if (!strcasecmp_P(type, PSTR(D_CMND_WAKEUPDURATION))) {
if ((payload > 0) && (payload < 3001)) { if ((payload > 0) && (payload < 3001)) {
Settings.led_wakeup = payload; 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); 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 else if (!strcasecmp_P(type, PSTR("UNDOCA"))) { // Theos legacy status
LightGetColor(scolor); LightGetColor(1, scolor);
scolor[6] = '\0'; // RGB only scolor[6] = '\0'; // RGB only
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, %d, %d, %d, %d, %d"), 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); 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); 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 (Settings.flag.ws_clock_reverse) {
if (clock_reverse) {
position = Settings.led_pixels -position; 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); 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);
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() 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 strip->ClearTo(0); // Reset strip
int clksize = 600 / (int)Settings.led_pixels; int clksize = 600 / (int)Settings.led_pixels;
Ws2812UpdateHand((RtcTime.second * 10) / clksize, hand_second_width, hand_second_color); Ws2812UpdateHand((RtcTime.second * 10) / clksize, WS_SECOND);
Ws2812UpdateHand((RtcTime.minute * 10) / clksize, hand_minute_width, hand_minute_color); Ws2812UpdateHand((RtcTime.minute * 10) / clksize, WS_MINUTE);
Ws2812UpdateHand((RtcTime.hour % 12) * (50 / clksize), hand_hour_width, hand_hour_color); Ws2812UpdateHand((RtcTime.hour % 12) * (50 / clksize), WS_HOUR);
Ws2812StripShow(); Ws2812StripShow();
} }
@ -205,7 +195,7 @@ void Ws2812Gradient(uint8_t schemenr)
uint8_t repeat = kRepeat[Settings.led_width]; // number of scheme.count per ledcount 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 range = (uint16_t)ceil((float)Settings.led_pixels / (float)repeat);
uint16_t gradRange = (uint16_t)ceil((float)range / (float)(scheme.count - 1)); 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; WsColor oldColor, currentColor;
Ws2812GradientColor(schemenr, &oldColor, range, gradRange, offset); Ws2812GradientColor(schemenr, &oldColor, range, gradRange, offset);
@ -216,9 +206,9 @@ void Ws2812Gradient(uint8_t schemenr)
} }
if (Settings.led_speed > 0) { if (Settings.led_speed > 0) {
// Blend old and current color based on time for smooth movement. // 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.R = map(strip_timer_counter % 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.G = map(strip_timer_counter % 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.B = map(strip_timer_counter % kSpeed[Settings.led_speed], 0, kSpeed[Settings.led_speed], oldColor.blue, currentColor.blue);
} }
else { else {
// No animation, just use the current color. // No animation, just use the current color.
@ -249,7 +239,7 @@ void Ws2812Bars(uint8_t schemenr)
maxSize = 0; 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]; WsColor mcolor[scheme.count];
memcpy(mcolor, scheme.colors, sizeof(mcolor)); memcpy(mcolor, scheme.colors, sizeof(mcolor));
@ -333,7 +323,11 @@ char* Ws2812GetColor(uint16_t led, char* scolor)
sl_ledcolor[2] = lcolor.B; sl_ledcolor[2] = lcolor.B;
scolor[0] = '\0'; scolor[0] = '\0';
for (byte i = 0; i < 3; i++) { 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; return scolor;
} }

View File

@ -254,8 +254,7 @@ double Bme280ReadTemperature(void)
var1 = ((((adc_T >> 3) - ((int32_t)Bme280CalibrationData.dig_T1 << 1))) * ((int32_t)Bme280CalibrationData.dig_T2)) >> 11; 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) * var2 = (((((adc_T >> 4) - ((int32_t)Bme280CalibrationData.dig_T1)) * ((adc_T >> 4) - ((int32_t)Bme280CalibrationData.dig_T1))) >> 12) *
((int32_t)Bme280CalibrationData.dig_T3)) >> ((int32_t)Bme280CalibrationData.dig_T3)) >> 14;
14;
t_fine = var1 + var2; t_fine = var1 + var2;
double T = (t_fine * 5 + 128) >> 8; double T = (t_fine * 5 + 128) >> 8;
return T / 100.0; return T / 100.0;
@ -302,19 +301,12 @@ double Bme280ReadHumidity(void)
v_x1_u32r = (t_fine - ((int32_t)76800)); v_x1_u32r = (t_fine - ((int32_t)76800));
v_x1_u32r = (((((adc_H << 14) - (((int32_t)Bme280CalibrationData.dig_H4) << 20) - v_x1_u32r = (((((adc_H << 14) - (((int32_t)Bme280CalibrationData.dig_H4) << 20) -
(((int32_t)Bme280CalibrationData.dig_H5) * v_x1_u32r)) + (((int32_t)Bme280CalibrationData.dig_H5) * v_x1_u32r)) + ((int32_t)16384)) >> 15) *
((int32_t)16384)) >>
15) *
(((((((v_x1_u32r * ((int32_t)Bme280CalibrationData.dig_H6)) >> 10) * (((((((v_x1_u32r * ((int32_t)Bme280CalibrationData.dig_H6)) >> 10) *
(((v_x1_u32r * ((int32_t)Bme280CalibrationData.dig_H3)) >> 11) + ((int32_t)32768))) >> (((v_x1_u32r * ((int32_t)Bme280CalibrationData.dig_H3)) >> 11) + ((int32_t)32768))) >> 10) +
10) + ((int32_t)2097152)) * ((int32_t)Bme280CalibrationData.dig_H2) + 8192) >> 14));
((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) * v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) *
((int32_t)Bme280CalibrationData.dig_H1)) >> ((int32_t)Bme280CalibrationData.dig_H1)) >> 4));
4));
v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r; v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r;
v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r; v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r;
double h = (v_x1_u32r >> 12); double h = (v_x1_u32r >> 12);
@ -359,7 +351,7 @@ double BmpReadPressure(void)
pressure = Bme280ReadPressure(); pressure = Bme280ReadPressure();
} }
if (pressure != 0.0) { 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; bmp_sealevel = (pressure / FastPrecisePow(1.0 - ((float)Settings.altitude / 44330.0), 5.255)) - 21.6;
} }
return pressure; return pressure;