mirror of https://github.com/arendst/Tasmota.git
Merge branch 'arendst/development' into development
This commit is contained in:
commit
df4dfec139
|
@ -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.12.0d** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
|
||||
Current version is **5.12.0i** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
|
||||
|
||||
### ATTENTION All versions
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,137 @@
|
|||
|
||||
# ESP8266 platform
|
||||
# ------------------------------
|
||||
|
||||
# For more info:
|
||||
# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification
|
||||
|
||||
name=ESP8266 Modules
|
||||
version=2.4.1
|
||||
|
||||
|
||||
|
||||
|
||||
compiler.warning_flags=-w
|
||||
compiler.warning_flags.none=-w
|
||||
compiler.warning_flags.default=
|
||||
compiler.warning_flags.more=-Wall
|
||||
compiler.warning_flags.all=-Wall -Wextra
|
||||
|
||||
build.lwip_lib=-llwip_gcc
|
||||
build.lwip_include=lwip/include
|
||||
build.lwip_flags=-DLWIP_OPEN_SRC
|
||||
|
||||
#build.float=-u _printf_float -u _scanf_float
|
||||
build.float=
|
||||
build.led=
|
||||
|
||||
compiler.path={runtime.tools.xtensa-lx106-elf-gcc.path}/bin/
|
||||
compiler.sdk.path={runtime.platform.path}/tools/sdk
|
||||
compiler.libc.path={runtime.platform.path}/tools/sdk/libc/xtensa-lx106-elf
|
||||
compiler.cpreprocessor.flags=-D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ "-I{compiler.sdk.path}/include" "-I{compiler.sdk.path}/{build.lwip_include}" "-I{compiler.libc.path}/include" "-I{build.path}/core"
|
||||
|
||||
compiler.c.cmd=xtensa-lx106-elf-gcc
|
||||
compiler.c.flags=-c {compiler.warning_flags} -Os -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -falign-functions=4 -MMD -std=gnu99 -ffunction-sections -fdata-sections
|
||||
|
||||
compiler.S.cmd=xtensa-lx106-elf-gcc
|
||||
compiler.S.flags=-c -g -x assembler-with-cpp -MMD -mlongcalls
|
||||
|
||||
compiler.c.elf.flags=-g {compiler.warning_flags} -Os -nostdlib -Wl,--no-check-sections -u call_user_start {build.float} -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-L{compiler.libc.path}/lib" "-T{build.flash_ld}" -Wl,--gc-sections -Wl,-wrap,system_restart_local -Wl,-wrap,spi_flash_read
|
||||
|
||||
compiler.c.elf.cmd=xtensa-lx106-elf-gcc
|
||||
compiler.c.elf.libs=-lhal -lphy -lpp -lnet80211 {build.lwip_lib} -lwpa -lcrypto -lmain -lwps -laxtls -lespnow -lsmartconfig -lairkiss -lwpa2 -lstdc++ -lm -lc -lgcc
|
||||
|
||||
compiler.cpp.cmd=xtensa-lx106-elf-g++
|
||||
compiler.cpp.flags=-c {compiler.warning_flags} -Os -g -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -falign-functions=4 -std=c++11 -MMD -ffunction-sections -fdata-sections
|
||||
|
||||
compiler.as.cmd=xtensa-lx106-elf-as
|
||||
|
||||
compiler.ar.cmd=xtensa-lx106-elf-ar
|
||||
compiler.ar.flags=cru
|
||||
|
||||
compiler.elf2hex.cmd=esptool
|
||||
compiler.elf2hex.flags=
|
||||
|
||||
compiler.size.cmd=xtensa-lx106-elf-size
|
||||
|
||||
compiler.esptool.cmd=esptool
|
||||
compiler.esptool.cmd.windows=esptool.exe
|
||||
|
||||
# This can be overriden in boards.txt
|
||||
build.extra_flags=-DESP8266
|
||||
|
||||
# These can be overridden in platform.local.txt
|
||||
compiler.c.extra_flags=
|
||||
compiler.c.elf.extra_flags=
|
||||
compiler.S.extra_flags=
|
||||
compiler.cpp.extra_flags=
|
||||
compiler.ar.extra_flags=
|
||||
compiler.objcopy.eep.extra_flags=
|
||||
compiler.elf2hex.extra_flags=
|
||||
|
||||
## generate file with git version number
|
||||
## needs bash, git, and echo
|
||||
|
||||
|
||||
## windows-compatible version without git
|
||||
|
||||
|
||||
|
||||
## Compile c files
|
||||
recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {build.led} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
|
||||
|
||||
## Compile c++ files
|
||||
recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor.flags} {compiler.cpp.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {build.led} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
|
||||
|
||||
## Compile S files
|
||||
recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.S.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {build.led} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
|
||||
|
||||
## Create archives
|
||||
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/arduino.ar" "{object_file}"
|
||||
|
||||
## Combine gc-sections, archives, and objects
|
||||
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{build.path}/arduino.ar" {compiler.c.elf.libs} -Wl,--end-group "-L{build.path}"
|
||||
|
||||
## Create eeprom
|
||||
recipe.objcopy.eep.pattern=
|
||||
|
||||
## Create hex
|
||||
#recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"
|
||||
|
||||
recipe.objcopy.hex.pattern="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
|
||||
|
||||
## Save hex
|
||||
recipe.output.tmp_file={build.project_name}.bin
|
||||
recipe.output.save_file={build.project_name}.{build.variant}.bin
|
||||
|
||||
## Compute size
|
||||
recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf"
|
||||
recipe.size.regex=^(?:\.irom0\.text|\.text|\.data|\.rodata|)\s+([0-9]+).*
|
||||
recipe.size.regex.data=^(?:\.data|\.rodata|\.bss)\s+([0-9]+).*
|
||||
#recipe.size.regex.eeprom=^(?:\.eeprom)\s+([0-9]+).*
|
||||
|
||||
# ------------------------------
|
||||
|
||||
tools.esptool.cmd=esptool
|
||||
tools.esptool.cmd.windows=esptool.exe
|
||||
tools.esptool.path={runtime.tools.esptool.path}
|
||||
tools.esptool.network_cmd=python
|
||||
tools.esptool.network_cmd.windows=python.exe
|
||||
|
||||
tools.esptool.upload.protocol=esp
|
||||
tools.esptool.upload.params.verbose=-vv
|
||||
tools.esptool.upload.params.quiet=
|
||||
tools.esptool.upload.pattern="{path}/{cmd}" {upload.verbose} -cd {upload.resetmethod} -cb {upload.speed} -cp "{serial.port}" {upload.erase_cmd} -ca 0x00000 -cf "{build.path}/{build.project_name}.bin"
|
||||
tools.esptool.upload.network_pattern="{network_cmd}" "{runtime.platform.path}/tools/espota.py" -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin"
|
||||
|
||||
tools.mkspiffs.cmd=mkspiffs
|
||||
tools.mkspiffs.cmd.windows=mkspiffs.exe
|
||||
tools.mkspiffs.path={runtime.tools.mkspiffs.path}
|
||||
|
||||
tools.espupload.cmd=python
|
||||
tools.espupload.cmd.windows=python.exe
|
||||
tools.espupload.path={runtime.platform.path}/tools
|
||||
tools.espupload.upload.protocol=espupload
|
||||
tools.espupload.upload.params.verbose=
|
||||
tools.espupload.upload.params.quiet=
|
||||
tools.espupload.upload.pattern="{cmd}" "{path}/espupload.py" -f "{build.path}/{build.project_name}.bin"
|
|
@ -1,6 +1,6 @@
|
|||
# TasmotaSerial
|
||||
|
||||
Implementation of software serial library for the ESP8266 at 9600 baud
|
||||
Implementation of software serial library for the ESP8266
|
||||
|
||||
Allows for several instances to be active at the same time.
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"name": "TasmotaSerial",
|
||||
"version": "1.0.0",
|
||||
"version": "1.2.0",
|
||||
"keywords": [
|
||||
"serial", "io", "TasmotaSerial"
|
||||
],
|
||||
"description": "Implementation of software serial for ESP8266 at 9600 baud.",
|
||||
"description": "Implementation of software serial for ESP8266.",
|
||||
"repository":
|
||||
{
|
||||
"type": "git",
|
|
@ -1,8 +1,8 @@
|
|||
name=TasmotaSerial
|
||||
version=1.0
|
||||
version=1.2.0
|
||||
author=Theo Arends
|
||||
maintainer=Theo Arends <theo@arends.com>
|
||||
sentence=Implementation of software serial for ESP8266 at 9600 baud.
|
||||
sentence=Implementation of software serial for ESP8266.
|
||||
paragraph=
|
||||
category=Signal Input/Output
|
||||
url=
|
|
@ -87,9 +87,7 @@ TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin)
|
|||
m_in_pos = m_out_pos = 0;
|
||||
if (m_rx_pin > -1) {
|
||||
m_buffer = (uint8_t*)malloc(TM_SERIAL_BUFFER_SIZE);
|
||||
if (m_buffer == NULL) {
|
||||
return;
|
||||
}
|
||||
if (m_buffer == NULL) return;
|
||||
// Use getCycleCount() loop to get as exact timing as possible
|
||||
m_bit_time = ESP.getCpuFreqMHz() *1000000 /TM_SERIAL_BAUDRATE;
|
||||
pinMode(m_rx_pin, INPUT);
|
||||
|
@ -111,7 +109,8 @@ bool TasmotaSerial::isValidGPIOpin(int pin)
|
|||
bool TasmotaSerial::begin(long speed) {
|
||||
// Use getCycleCount() loop to get as exact timing as possible
|
||||
m_bit_time = ESP.getCpuFreqMHz() *1000000 /speed;
|
||||
return m_valid && (speed <= TM_SERIAL_BAUDRATE);
|
||||
m_high_speed = (speed > 9600);
|
||||
return m_valid;
|
||||
}
|
||||
|
||||
bool TasmotaSerial::begin() {
|
||||
|
@ -123,17 +122,13 @@ void TasmotaSerial::flush() {
|
|||
}
|
||||
|
||||
int TasmotaSerial::peek() {
|
||||
if ((-1 == m_rx_pin) || (m_in_pos == m_out_pos)) {
|
||||
return -1;
|
||||
}
|
||||
if ((-1 == m_rx_pin) || (m_in_pos == m_out_pos)) return -1;
|
||||
return m_buffer[m_out_pos];
|
||||
}
|
||||
|
||||
int TasmotaSerial::read()
|
||||
{
|
||||
if ((-1 == m_rx_pin) || (m_in_pos == m_out_pos)) {
|
||||
return -1;
|
||||
}
|
||||
if ((-1 == m_rx_pin) || (m_in_pos == m_out_pos)) return -1;
|
||||
uint8_t ch = m_buffer[m_out_pos];
|
||||
m_out_pos = (m_out_pos +1) % TM_SERIAL_BUFFER_SIZE;
|
||||
return ch;
|
||||
|
@ -142,23 +137,20 @@ int TasmotaSerial::read()
|
|||
int TasmotaSerial::available()
|
||||
{
|
||||
int avail = m_in_pos - m_out_pos;
|
||||
if (avail < 0) {
|
||||
avail += TM_SERIAL_BUFFER_SIZE;
|
||||
}
|
||||
if (avail < 0) avail += TM_SERIAL_BUFFER_SIZE;
|
||||
return avail;
|
||||
}
|
||||
|
||||
#ifdef TM_SERIAL_USE_IRAM
|
||||
#define TM_SERIAL_WAIT { while (ESP.getCycleCount()-start < wait) optimistic_yield(1); wait += m_bit_time; } // Watchdog timeouts
|
||||
#define TM_SERIAL_WAIT { while (ESP.getCycleCount()-start < wait) if (!m_high_speed) optimistic_yield(1); wait += m_bit_time; } // Watchdog timeouts
|
||||
#else
|
||||
#define TM_SERIAL_WAIT { while (ESP.getCycleCount()-start < wait); wait += m_bit_time; }
|
||||
#endif
|
||||
|
||||
size_t TasmotaSerial::write(uint8_t b)
|
||||
{
|
||||
if (-1 == m_tx_pin) {
|
||||
return 0;
|
||||
}
|
||||
if (-1 == m_tx_pin) return 0;
|
||||
if (m_high_speed) cli(); // Disable interrupts in order to get a clean transmit
|
||||
unsigned long wait = m_bit_time;
|
||||
digitalWrite(m_tx_pin, HIGH);
|
||||
unsigned long start = ESP.getCycleCount();
|
||||
|
@ -173,6 +165,7 @@ size_t TasmotaSerial::write(uint8_t b)
|
|||
// Stop bit
|
||||
digitalWrite(m_tx_pin, HIGH);
|
||||
TM_SERIAL_WAIT;
|
||||
if (m_high_speed) sei();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -191,9 +184,7 @@ void TasmotaSerial::rxRead()
|
|||
for (int i = 0; i < 8; i++) {
|
||||
TM_SERIAL_WAIT;
|
||||
rec >>= 1;
|
||||
if (digitalRead(m_rx_pin)) {
|
||||
rec |= 0x80;
|
||||
}
|
||||
if (digitalRead(m_rx_pin)) rec |= 0x80;
|
||||
}
|
||||
// Stop bit
|
||||
TM_SERIAL_WAIT;
|
|
@ -20,12 +20,12 @@
|
|||
#ifndef TasmotaSerial_h
|
||||
#define TasmotaSerial_h
|
||||
/*********************************************************************************************\
|
||||
* TasmotaSerial supports up to 9600 baud with fixed buffer size of 64 bytes using optional no iram
|
||||
* TasmotaSerial supports up to 115200 baud with fixed buffer size of 64 bytes using optional no iram
|
||||
*
|
||||
* Based on EspSoftwareSerial v3.3.1 by Peter Lerup (https://github.com/plerup/espsoftwareserial)
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define TM_SERIAL_BAUDRATE 9600 // Max supported baudrate
|
||||
#define TM_SERIAL_BAUDRATE 9600 // Default baudrate
|
||||
#define TM_SERIAL_BUFFER_SIZE 64 // Receive buffer size
|
||||
|
||||
#include <core_version.h> // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0)
|
||||
|
@ -57,6 +57,7 @@ class TasmotaSerial : public Stream {
|
|||
|
||||
// Member variables
|
||||
bool m_valid;
|
||||
bool m_high_speed;
|
||||
int m_rx_pin;
|
||||
int m_tx_pin;
|
||||
unsigned long m_bit_time;
|
|
@ -1,10 +1,46 @@
|
|||
/* 5.12.0d
|
||||
/* 5.12.0i
|
||||
* Add 16 timers using commands Timer and Timers (#1091)
|
||||
*
|
||||
* 5.12.0h
|
||||
* Add optional Arduino OTA support to be enabled in user_config.h (#1998)
|
||||
* Add support for Software Serial bridge using commands SerialDelimiter, SBaudrate and SSerialSend. Supports 8N1 and text only (#2190)
|
||||
* Add support for Hardware Serial bridge using commands SerialDelimiter, Baudrate and SerialSend. Supports 8N1 and text only (#2182)
|
||||
* Add support for Zengge WF017 PWM Led strip controller (#2202)
|
||||
* Add PWM status to command State if PWM enabled (#2203)
|
||||
* Add command HSBColor Hue,Sat,Bri (#1642, #2203)
|
||||
* Add command Channel 0..100 to control dimmer value for individual color channels (#2111, #2203)
|
||||
* Add Channel status information (#2211)
|
||||
* Add all FriendlyNames to Status information (#2208)
|
||||
* Change status display of Ssid and SetOption
|
||||
* Change default option SetOption15 from 0 to 1 providing better initial PWM experience
|
||||
*
|
||||
* 5.12.0f
|
||||
* Add compile time support for WS2812 BRG and RBG led configurations to be defined in user_config.h (#1690)
|
||||
*
|
||||
* 5.12.0e
|
||||
* Add Domoticz dust (custom) sensors to PMS5003 and NovaFitness SDS drivers as PM1, PM2.5 and PM10
|
||||
* Add a second TLS fingerprint to allow switching keys in TLS mode (#2033, #2102)
|
||||
* Add display of remaining pulse time to command PulseTime (#2085)
|
||||
* Add additional time offset to Wifi Retry based on device mac address (#2089)
|
||||
* Add command Color6 RRGGBB for Clock hour marker color and command Rotation pixels for Clock rotation (#2092)
|
||||
* Add HTML language header in local language (#2123)
|
||||
* Add command PowerDelta 0..100 (percentage) to Energy monitoring devices to report on active power load change (#2157)
|
||||
* Add Restart Reason to Status 1 report (#2161)
|
||||
* Fix MAX31850 higher temperatures (#1269)
|
||||
*
|
||||
* 5.12.0d
|
||||
* Add support for optional MQTT drivers to be selected in user_config.h (#1992)
|
||||
* Add Portuguese language file
|
||||
* Add compiler check for stable lwIP version v1.4 (#1940)
|
||||
* Add always suffix with device number in Mqtt discovery topic (#1962)
|
||||
* Add diacritics to Polish language file (#2005)
|
||||
* Add Hungarian language file (#2024)
|
||||
* Add Czech language file
|
||||
* Add Chinese (Traditional) in Taiwan language file (#2108)
|
||||
* Add support for Nova Fitness SDS011 and possibly SDS021 particle concentration sensor (#2070)
|
||||
* Add single decimal precision to Nova Fitness SDS0x1 sensor values (#2093)
|
||||
* Add support for multiple SHT3X sensors (#1949, #2110)
|
||||
* Add Sonoff SC domoticz support for Sound level as Counter and Air quality (#2118)
|
||||
* Fix MQTT TLS fingerprint validation (#2033)
|
||||
*
|
||||
* 5.12.0c
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
#define D_JSON_GATEWAY "Gateway"
|
||||
#define D_JSON_HEAPSIZE "Heap"
|
||||
#define D_JSON_HIGH "High"
|
||||
#define D_JSON_HSBCOLOR "HSBColor"
|
||||
#define D_JSON_HUMIDITY "Humidity"
|
||||
#define D_JSON_I2CSCAN_DEVICES_FOUND_AT "Device(s) found at"
|
||||
#define D_JSON_I2CSCAN_UNKNOWN_ERROR_AT "Unknown error at"
|
||||
|
@ -96,6 +97,7 @@
|
|||
#define D_JSON_SAVESTATE "SaveState"
|
||||
#define D_JSON_SDKVERSION "SDK"
|
||||
#define D_JSON_SELECTED "selected"
|
||||
#define D_JSON_SERIALRECEIVED "SerialReceived"
|
||||
#define D_JSON_SSID "SSId"
|
||||
#define D_JSON_STARTDST "StartDST" // Start Daylight Savings Time
|
||||
#define D_JSON_STARTED "Started"
|
||||
|
@ -240,16 +242,22 @@
|
|||
#define D_CMND_LEDSTATE "LedState"
|
||||
#define D_CMND_CFGDUMP "CfgDump"
|
||||
#define D_CMND_I2CSCAN "I2CScan"
|
||||
#define D_CMND_SERIALSEND "SerialSend"
|
||||
#define D_CMND_SERIALDELIMITER "SerialDelimiter"
|
||||
#define D_CMND_BAUDRATE "Baudrate"
|
||||
#define D_CMND_EXCEPTION "Exception"
|
||||
|
||||
// Commands xdrv_01_light.ino
|
||||
#define D_CMND_CHANNEL "Channel"
|
||||
#define D_CMND_COLOR "Color"
|
||||
#define D_CMND_COLORTEMPERATURE "CT"
|
||||
#define D_CMND_DIMMER "Dimmer"
|
||||
#define D_CMND_HSBCOLOR "HSBColor"
|
||||
#define D_CMND_LED "Led"
|
||||
#define D_CMND_LEDTABLE "LedTable"
|
||||
#define D_CMND_FADE "Fade"
|
||||
#define D_CMND_PIXELS "Pixels"
|
||||
#define D_CMND_ROTATION "Rotation"
|
||||
#define D_CMND_SCHEME "Scheme"
|
||||
#define D_CMND_SPEED "Speed"
|
||||
#define D_CMND_WAKEUP "Wakeup"
|
||||
|
@ -274,6 +282,7 @@
|
|||
// Commands xdrv_03_energy.ino
|
||||
#define D_CMND_POWERLOW "PowerLow"
|
||||
#define D_CMND_POWERHIGH "PowerHigh"
|
||||
#define D_CMND_POWERDELTA "PowerDelta"
|
||||
#define D_CMND_VOLTAGELOW "VoltageLow"
|
||||
#define D_CMND_VOLTAGEHIGH "VoltageHigh"
|
||||
#define D_CMND_CURRENTLOW "CurrentLow"
|
||||
|
@ -335,6 +344,21 @@
|
|||
#define D_CMND_DISP_SIZE "Size"
|
||||
#define D_CMND_DISP_TEXT "Text"
|
||||
|
||||
// Commands xdrv_08_serial_bridge.ino
|
||||
#define D_CMND_SSERIALSEND "SSerialSend"
|
||||
#define D_CMND_SBAUDRATE "SBaudrate"
|
||||
#define D_JSON_SSERIALRECEIVED "SSerialReceived"
|
||||
|
||||
// Commands xdrv_09_timers.ino
|
||||
#define D_CMND_TIMER "Timer"
|
||||
#define D_JSON_TIMER_ARM "Arm"
|
||||
#define D_JSON_TIMER_TIME "Time"
|
||||
#define D_JSON_TIMER_DAYS "Days"
|
||||
#define D_JSON_TIMER_REPEAT "Repeat"
|
||||
#define D_JSON_TIMER_DEVICE "Device"
|
||||
#define D_JSON_TIMER_POWER "Power"
|
||||
#define D_CMND_TIMERS "Timers"
|
||||
|
||||
/********************************************************************************************/
|
||||
|
||||
#ifndef MY_LANGUAGE
|
||||
|
@ -358,6 +382,7 @@ enum UnitNames {
|
|||
UNIT_MILLISECOND,
|
||||
UNIT_MINUTE,
|
||||
UNIT_PPM,
|
||||
UNIT_PERCENTAGE,
|
||||
UNIT_PRESSURE,
|
||||
UNIT_SECOND,
|
||||
UNIT_SECTORS,
|
||||
|
@ -375,6 +400,7 @@ const char kUnitNames[] PROGMEM =
|
|||
D_UNIT_MILLISECOND "|"
|
||||
D_UNIT_MINUTE "|"
|
||||
D_UNIT_PARTS_PER_MILLION "|"
|
||||
"%|"
|
||||
D_UNIT_PRESSURE "|"
|
||||
D_UNIT_SECOND "|"
|
||||
D_UNIT_SECTORS "|"
|
||||
|
@ -400,6 +426,7 @@ const char S_JSON_COMMAND_INDEX_NVALUE[] PROGMEM = "{\"%s%d\":%d}";
|
|||
const char S_JSON_COMMAND_INDEX_LVALUE[] PROGMEM = "{\"%s%d\":%lu}";
|
||||
const char S_JSON_COMMAND_INDEX_SVALUE[] PROGMEM = "{\"%s%d\":\"%s\"}";
|
||||
const char S_JSON_COMMAND_INDEX_SVALUE_SVALUE[] PROGMEM = "{\"%s%d\":\"%s%s\"}";
|
||||
const char S_JSON_COMMAND_INDEX_NVALUE_ACTIVE_NVALUE[] PROGMEM = "{\"%s%d\":\"%d (" D_JSON_ACTIVE " %d)\"}";
|
||||
|
||||
const char S_JSON_SENSOR_INDEX_NVALUE[] PROGMEM = "{\"" D_CMND_SENSOR "%d\":%d}";
|
||||
const char S_JSON_SENSOR_INDEX_SVALUE[] PROGMEM = "{\"" D_CMND_SENSOR "%d\":\"%s\"}";
|
||||
|
@ -469,4 +496,4 @@ const char S_INFORMATION[] PROGMEM = D_INFORMATION;
|
|||
const char S_RESTART[] PROGMEM = D_RESTART;
|
||||
#endif // USE_WEBSERVER
|
||||
|
||||
#endif // _I18N_H_
|
||||
#endif // _I18N_H_
|
||||
|
|
|
@ -0,0 +1,464 @@
|
|||
/*
|
||||
cs-CZ.h - localization for Czech with diacritics - Czech for Sonoff-Tasmota
|
||||
|
||||
Copyright (C) 2018 Theo Arends (translated by vs)
|
||||
|
||||
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_CS_CZ_H_
|
||||
#define _LANGUAGE_CS_CZ_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.
|
||||
*
|
||||
\*********************************************************************/
|
||||
|
||||
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "cs"
|
||||
|
||||
// "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 "PonÚteStřČtvPátSobNed"
|
||||
#define D_MONTH3LIST "LedÚnoBřeDubKvěČerČevSrpZářŘíjLisPro"
|
||||
|
||||
// Non JSON decimal separator
|
||||
#define D_DECIMAL_SEPARATOR ","
|
||||
|
||||
// Common
|
||||
#define D_ADMIN "Admin"
|
||||
#define D_AIR_QUALITY "Kvalita vzduchu"
|
||||
#define D_AP "AP" // Access Point
|
||||
#define D_AS "jako"
|
||||
#define D_AUTO "AUTO"
|
||||
#define D_BLINK "Blikání"
|
||||
#define D_BLINKOFF "BlikáníVyp"
|
||||
#define D_BOOT_COUNT "Počítadlo spuštění"
|
||||
#define D_BRIGHTLIGHT "Světlý"
|
||||
#define D_BUTTON "Tlačítko"
|
||||
#define D_BY "by" // Written by me
|
||||
#define D_BYTES "Bytu"
|
||||
#define D_CELSIUS "Celsia"
|
||||
#define D_CO2 "Kysličníku uhličitého"
|
||||
#define D_CODE "kód" // Button code
|
||||
#define D_COLDLIGHT "Studený"
|
||||
#define D_COMMAND "Příkaz"
|
||||
#define D_CONNECTED "...připojeno"
|
||||
#define D_COUNT "Počítej"
|
||||
#define D_COUNTER "Počítadlo"
|
||||
#define D_CURRENT "Proud" // As in Voltage and Current
|
||||
#define D_DATA "Data"
|
||||
#define D_DARKLIGHT "Tmavý"
|
||||
#define D_DEBUG "Debug"
|
||||
#define D_DISABLED "Zablokováno"
|
||||
#define D_DNS_SERVER "Server DNS"
|
||||
#define D_DONE "Provedeno"
|
||||
#define D_DST_TIME "DST"
|
||||
#define D_EMULATION "Emulace"
|
||||
#define D_ENABLED "Otevřený"
|
||||
#define D_ERASE "Smaž"
|
||||
#define D_ERROR "Chyba"
|
||||
#define D_FAHRENHEIT "Fahrenheita"
|
||||
#define D_FAILED "chyba"
|
||||
#define D_FALLBACK "Záložní"
|
||||
#define D_FALLBACK_TOPIC "Záložní topic"
|
||||
#define D_FALSE "Nepravda"
|
||||
#define D_FILE "Soubor"
|
||||
#define D_FREE_MEMORY "Volná paměť"
|
||||
#define D_GAS "Gas"
|
||||
#define D_GATEWAY "Výchozí brána"
|
||||
#define D_GROUP "Skupina"
|
||||
#define D_HOST "Server"
|
||||
#define D_HOSTNAME "Název serveru"
|
||||
#define D_HUMIDITY "Vlhkost"
|
||||
#define D_ILLUMINANCE "Osvětlení"
|
||||
#define D_IMMEDIATE "Mžikové" // Button immediate
|
||||
#define D_INDEX "Index"
|
||||
#define D_INFO "Informace"
|
||||
#define D_INITIALIZED "Inicializovaný"
|
||||
#define D_IP_ADDRESS "Adresa IP"
|
||||
#define D_LIGHT "Světlo"
|
||||
#define D_LWT "LWT"
|
||||
#define D_MODULE "Modul"
|
||||
#define D_MQTT "MQTT"
|
||||
#define D_MULTI_PRESS "několikeré-stisknutí"
|
||||
#define D_NOISE "Hluk"
|
||||
#define D_NONE "Není"
|
||||
#define D_OFF "Vypnutý"
|
||||
#define D_OFFLINE "Neaktivní"
|
||||
#define D_OK "OK"
|
||||
#define D_ON "Sepnutý"
|
||||
#define D_ONLINE "Aktivní"
|
||||
#define D_PASSWORD "Heslo"
|
||||
#define D_PORT "Port"
|
||||
#define D_POWER_FACTOR "Součinitel příkonu"
|
||||
#define D_POWERUSAGE "Příkon"
|
||||
#define D_PRESSURE "Tlak"
|
||||
#define D_PRESSUREATSEALEVEL "Tlak na úrovni hladiny moře"
|
||||
#define D_PROGRAM_FLASH_SIZE "Velikost flash programu"
|
||||
#define D_PROGRAM_SIZE "Velikost programu"
|
||||
#define D_PROJECT "Projekt"
|
||||
#define D_RECEIVED "Obdržený"
|
||||
#define D_RESTART "Restart"
|
||||
#define D_RESTARTING "Restartování"
|
||||
#define D_RESTART_REASON "Příčina restartu"
|
||||
#define D_RESTORE "Načtený"
|
||||
#define D_RETAINED "Uloženo"
|
||||
#define D_SAVE "Ulož"
|
||||
#define D_SENSOR "Sensor"
|
||||
#define D_SSID "SSID"
|
||||
#define D_START "Start"
|
||||
#define D_STD_TIME "STD"
|
||||
#define D_STOP "Stop"
|
||||
#define D_SUBNET_MASK "Maska podsítě"
|
||||
#define D_SUBSCRIBE_TO "Přihlaš se do"
|
||||
#define D_SUCCESSFUL "úspěšné."
|
||||
#define D_TEMPERATURE "Teplota"
|
||||
#define D_TO "do"
|
||||
#define D_TOGGLE "Přepni"
|
||||
#define D_TOPIC "Topic"
|
||||
#define D_TRANSMIT "Odešli"
|
||||
#define D_TRUE "Pravda"
|
||||
#define D_UPGRADE "aktualizace"
|
||||
#define D_UPLOAD "Nahrání..."
|
||||
#define D_UPTIME "Uptime"
|
||||
#define D_USER "Uživatel"
|
||||
#define D_UTC_TIME "UTC"
|
||||
#define D_UV_LEVEL "úroveň UV"
|
||||
#define D_VERSION "Verze"
|
||||
#define D_VOLTAGE "Napětí"
|
||||
#define D_WARMLIGHT "Ohřev"
|
||||
#define D_WEB_SERVER "Web Server"
|
||||
|
||||
// sonoff.ino
|
||||
#define D_WARNING_MINIMAL_VERSION "WARNING Tato verze nepodporuje trvalé nastavení"
|
||||
#define D_LEVEL_10 "úroveň 1-0"
|
||||
#define D_LEVEL_01 "úroveň 0-1"
|
||||
#define D_SERIAL_LOGGING_DISABLED "Logování na sériovém portu ukončeno"
|
||||
#define D_SYSLOG_LOGGING_REENABLED "Obnoven zápis do Syslog"
|
||||
|
||||
#define D_SET_BAUDRATE_TO "Nastavení rychlosti přenosu na"
|
||||
#define D_RECEIVED_TOPIC "Obdržený topic"
|
||||
#define D_DATA_SIZE "Velikost dat"
|
||||
#define D_ANALOG_INPUT "Analogový vstup"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Zablokování smyčky"
|
||||
#define D_WPS_FAILED_WITH_STATUS "Chyba WPSconfig se statusem"
|
||||
#define D_ACTIVE_FOR_3_MINUTES "aktivní 3 minuty"
|
||||
#define D_FAILED_TO_START "nepodařilo se spustit"
|
||||
#define D_PATCH_ISSUE_2186 "Chyba 2186"
|
||||
#define D_CONNECTING_TO_AP "Připojování k AP"
|
||||
#define D_IN_MODE "v módu"
|
||||
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Chyba připojení, nebyla obdržena IP adresa"
|
||||
#define D_CONNECT_FAILED_AP_NOT_REACHED "Chyba připojení, nedostupný AP"
|
||||
#define D_CONNECT_FAILED_WRONG_PASSWORD "Chyba připojení, nesprávné heslo pro AP"
|
||||
#define D_CONNECT_FAILED_AP_TIMEOUT "Chyba připojení, uplynul AP timeout"
|
||||
#define D_ATTEMPTING_CONNECTION "Připojování..."
|
||||
#define D_CHECKING_CONNECTION "Zkouška spojení..."
|
||||
#define D_QUERY_DONE "Vyslání dotazu. Nalezena služba MQTT"
|
||||
#define D_MQTT_SERVICE_FOUND "Služba MQTT byla nalezena"
|
||||
#define D_FOUND_AT "znalezeno v"
|
||||
#define D_SYSLOG_HOST_NOT_FOUND "Syslog Host nebyl nalezen"
|
||||
|
||||
// settings.ino
|
||||
#define D_SAVED_TO_FLASH_AT "Uloženo do paměti flash v"
|
||||
#define D_LOADED_FROM_FLASH_AT "Staženo z paměti flash z"
|
||||
#define D_USE_DEFAULTS "Použij defaultní hodnoty"
|
||||
#define D_ERASED_SECTOR "Smazaný sektor"
|
||||
|
||||
// webserver.ino
|
||||
#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MINIMÁLNÍ - prosím zaktualizujte"
|
||||
#define D_WEBSERVER_ACTIVE_ON "Aktivní Web server"
|
||||
#define D_WITH_IP_ADDRESS "na IP adrese"
|
||||
#define D_WEBSERVER_STOPPED "Web server zastaven"
|
||||
#define D_FILE_NOT_FOUND "Soubor nebyl nalezen"
|
||||
#define D_REDIRECTED "Přesměrování na vlastní portál"
|
||||
#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wi-Fi manager nastaví AP a zachová STA"
|
||||
#define D_WIFIMANAGER_SET_ACCESSPOINT "Wi-Fi manager nastaví Access Point"
|
||||
#define D_TRYING_TO_CONNECT "Zkouším připojit zařízení k síti"
|
||||
|
||||
#define D_RESTART_IN "Restart"
|
||||
#define D_SECONDS "sekund"
|
||||
#define D_DEVICE_WILL_RESTART "Zařízení bude zrestartováno během několika sekund"
|
||||
#define D_BUTTON_TOGGLE "Přepínač"
|
||||
#define D_CONFIGURATION "Nastavení"
|
||||
#define D_INFORMATION "Informace"
|
||||
#define D_FIRMWARE_UPGRADE "Aktualizace firmware"
|
||||
#define D_CONSOLE "Konzole"
|
||||
#define D_CONFIRM_RESTART "Potvrzení restartu"
|
||||
|
||||
#define D_CONFIGURE_MODULE "Nastavení modulu"
|
||||
#define D_CONFIGURE_WIFI "Nastavení WiFi"
|
||||
#define D_CONFIGURE_MQTT "Nastavení MQTT"
|
||||
#define D_CONFIGURE_DOMOTICZ "Nastavení Domoticz"
|
||||
#define D_CONFIGURE_LOGGING "Nastavení logování"
|
||||
#define D_CONFIGURE_OTHER "Jiná nastavení"
|
||||
#define D_CONFIRM_RESET_CONFIGURATION "Potvrzení resetu nastavení"
|
||||
#define D_RESET_CONFIGURATION "Reset nastavení"
|
||||
#define D_BACKUP_CONFIGURATION "Záloha nastavení"
|
||||
#define D_RESTORE_CONFIGURATION "Obnovení nastavení"
|
||||
#define D_MAIN_MENU "Hlavní menu"
|
||||
|
||||
#define D_MODULE_PARAMETERS "Parametry 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 "Scan sítí WiFi"
|
||||
#define D_SCAN_DONE "Scan dokončen"
|
||||
#define D_NO_NETWORKS_FOUND "Síť nebyla nalezena"
|
||||
#define D_REFRESH_TO_SCAN_AGAIN "Zopakovat scan"
|
||||
#define D_DUPLICATE_ACCESSPOINT "Kopie AP"
|
||||
#define D_SKIPPING_LOW_QUALITY "Přeskočení z důvodu kvality signálu"
|
||||
#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 "Heslo AP1"
|
||||
#define D_AP2_SSID "AP2 SSID"
|
||||
#define D_AP2_PASSWORD "Heslo AP2"
|
||||
|
||||
#define D_MQTT_PARAMETERS "Parametry MQTT"
|
||||
#define D_CLIENT "Klient"
|
||||
#define D_FULL_TOPIC "Celý topic"
|
||||
|
||||
#define D_LOGGING_PARAMETERS "Volby logování"
|
||||
#define D_SERIAL_LOG_LEVEL "Seriová úroveň logu"
|
||||
#define D_WEB_LOG_LEVEL "Webová úroveň logu"
|
||||
#define D_SYS_LOG_LEVEL "Systemová úroveň logu"
|
||||
#define D_MORE_DEBUG "Více debug informací"
|
||||
#define D_SYSLOG_HOST "Syslog host"
|
||||
#define D_SYSLOG_PORT "Syslog port"
|
||||
#define D_TELEMETRY_PERIOD "Interval telemetrie"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Jiné parametry"
|
||||
#define D_WEB_ADMIN_PASSWORD "Heslo Web administrátora"
|
||||
#define D_MQTT_ENABLE "MQTT aktivní"
|
||||
#define D_FRIENDLY_NAME "Friendly Name"
|
||||
#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 "Ulož nastavení"
|
||||
#define D_CONFIGURATION_SAVED "Nastavení uloženo"
|
||||
#define D_CONFIGURATION_RESET "Nastavení resetováno"
|
||||
|
||||
#define D_PROGRAM_VERSION "Verze programu"
|
||||
#define D_BUILD_DATE_AND_TIME "Datum a čas kompilace"
|
||||
#define D_CORE_AND_SDK_VERSION "Verze Core/SDK"
|
||||
#define D_FLASH_WRITE_COUNT "Počet zápisů do paměti"
|
||||
#define D_MAC_ADDRESS "Adresa MAC"
|
||||
#define D_MQTT_HOST "Host MQTT"
|
||||
#define D_MQTT_PORT "Port MQTT"
|
||||
#define D_MQTT_CLIENT "Klient MQTT"
|
||||
#define D_MQTT_USER "Uživatel MQTT"
|
||||
#define D_MQTT_TOPIC "Topic MQTT"
|
||||
#define D_MQTT_GROUP_TOPIC "Topic skupiny MQTT"
|
||||
#define D_MQTT_FULL_TOPIC "Celý topic MQTT"
|
||||
#define D_MDNS_DISCOVERY "Získávání mDNS"
|
||||
#define D_MDNS_ADVERTISE "Rozesílání mDNS"
|
||||
#define D_ESP_CHIP_ID "ID systému ESP"
|
||||
#define D_FLASH_CHIP_ID "ID systému paměti flash"
|
||||
#define D_FLASH_CHIP_SIZE "Velikost flash"
|
||||
#define D_FREE_PROGRAM_SPACE "Volné místo pro program"
|
||||
|
||||
#define D_UPGRADE_BY_WEBSERVER "Aktualizace z Web serveru"
|
||||
#define D_OTA_URL "URL OTA"
|
||||
#define D_START_UPGRADE "Start aktualizace"
|
||||
#define D_UPGRADE_BY_FILE_UPLOAD "Aktualizace nahráním souboru"
|
||||
#define D_UPLOAD_STARTED "Nahrávání zahájeno"
|
||||
#define D_UPGRADE_STARTED "Zahájení aktualizace"
|
||||
#define D_UPLOAD_DONE "Nahrávání ukončeno"
|
||||
#define D_UPLOAD_ERR_1 "Soubor nebyl vybrán"
|
||||
#define D_UPLOAD_ERR_2 "Málo místa"
|
||||
#define D_UPLOAD_ERR_3 "Magický byte má hodnotu jinou než 0xE9"
|
||||
#define D_UPLOAD_ERR_4 "Velikost programu je větší než skutečná velikost paměti flash"
|
||||
#define D_UPLOAD_ERR_5 "Chyba nahrávání, nesouhlasí porovnávané bity"
|
||||
#define D_UPLOAD_ERR_6 "Chyba nahrávání. Spuštěn zápis do logu na úrovni 3"
|
||||
#define D_UPLOAD_ERR_7 "Nahrávání přerušeno"
|
||||
#define D_UPLOAD_ERR_8 "Špatný soubor"
|
||||
#define D_UPLOAD_ERR_9 "Soubor je příliš velký"
|
||||
#define D_UPLOAD_ERROR_CODE "Chyba nahrávání"
|
||||
|
||||
#define D_ENTER_COMMAND "Vlož příkaz"
|
||||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Zapni úroveň 2 zápisu Weblog, pokud je očekávána odpověď"
|
||||
#define D_NEED_USER_AND_PASSWORD "Vyžadován uživatel=<username>&heslo=<password>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "Verifikuj otisk TLS..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Nepřipojeno TLS do"
|
||||
#define D_RETRY_IN "Zopakuji za"
|
||||
#define D_VERIFIED "Ověřeno otisk "
|
||||
#define D_INSECURE "Nesprávné připojení z důvodu chybného otisku TLS"
|
||||
#define D_CONNECT_FAILED_TO "Spojení se nepodařilo navázat"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast je vypnutý"
|
||||
#define D_MULTICAST_REJOINED "Multicast opět připojený"
|
||||
#define D_MULTICAST_JOIN_FAILED "Multicast neúspěšný"
|
||||
#define D_FAILED_TO_SEND_RESPONSE "Nepodařilo se odeslat odpověď"
|
||||
|
||||
#define D_WEMO "WeMo"
|
||||
#define D_WEMO_BASIC_EVENT "WeMo základní událost"
|
||||
#define D_WEMO_EVENT_SERVICE "WeMo servisní událost"
|
||||
#define D_WEMO_META_SERVICE "WeMo meta událost"
|
||||
#define D_WEMO_SETUP "WeMo setup"
|
||||
#define D_RESPONSE_SENT "Odpověď odeslána"
|
||||
|
||||
#define D_HUE "Hue"
|
||||
#define D_HUE_BRIDGE_SETUP "Hue setup"
|
||||
#define D_HUE_API_NOT_IMPLEMENTED "Hue API není implementováno"
|
||||
#define D_HUE_API "Hue API"
|
||||
#define D_HUE_POST_ARGS "Hue POST args"
|
||||
#define D_3_RESPONSE_PACKETS_SENT "3 pakety odpovědi odeslány"
|
||||
|
||||
// xdrv_05_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 "Spinac idx"
|
||||
#define D_DOMOTICZ_SENSOR_IDX "Sensor idx"
|
||||
#define D_DOMOTICZ_TEMP "Temp"
|
||||
#define D_DOMOTICZ_TEMP_HUM "Temp,Vlhk"
|
||||
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Vlhk,Tlak"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Příkon,Energie"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Osvětlení"
|
||||
#define D_DOMOTICZ_COUNT "Počítadlo/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Napětí/PM2,5"
|
||||
#define D_DOMOTICZ_CURRENT "Proud/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "AirQuality"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Aktualizace stopek"
|
||||
|
||||
// xdrv_03_energy.ino
|
||||
#define D_ENERGY_TODAY "Energie Dnes"
|
||||
#define D_ENERGY_YESTERDAY "Energie Včera"
|
||||
#define D_ENERGY_TOTAL "Energie Součet"
|
||||
|
||||
// xsns_05_ds18b20.ino
|
||||
#define D_SENSOR_BUSY "Sensor DS18x20 obsazen"
|
||||
#define D_SENSOR_CRC_ERROR "Sensor DS18x20 chyba CRC"
|
||||
#define D_SENSORS_FOUND "Nalezen sensor DS18x20"
|
||||
|
||||
// xsns_06_dht.ino
|
||||
#define D_TIMEOUT_WAITING_FOR "Čekání na"
|
||||
#define D_START_SIGNAL_LOW "signál, startovní nízký"
|
||||
#define D_START_SIGNAL_HIGH "signál, startovní vysoký"
|
||||
#define D_PULSE "puls"
|
||||
#define D_CHECKSUM_FAILURE "Chybný kontrolní součet"
|
||||
|
||||
// xsns_07_sht1x.ino
|
||||
#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor neobdržel pžíkaz ACK"
|
||||
#define D_SHT1X_FOUND "SHT1X nalezen"
|
||||
|
||||
// xsns_18_pms5003.ino
|
||||
#define D_STANDARD_CONCENTRATION "CF-1 PM" // Standard Particle CF-1 Particle Matter
|
||||
#define D_ENVIRONMENTAL_CONCENTRATION "PM" // Environmetal Particle Matter
|
||||
#define D_PARTICALS_BEYOND "Particals"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Není"
|
||||
#define D_SENSOR_DHT11 "DHT11"
|
||||
#define D_SENSOR_AM2301 "AM2301"
|
||||
#define D_SENSOR_SI7021 "SI7021"
|
||||
#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 "Spínač" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Tlačít" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Relé" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1",
|
||||
#define D_SENSOR_COUNTER "Počíta" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM_RX "PZEM Rx"
|
||||
#define D_SENSOR_PZEM_TX "PZEM Tx"
|
||||
#define D_SENSOR_SAIR_RX "SAir Rx"
|
||||
#define D_SENSOR_SAIR_TX "SAir Tx"
|
||||
#define D_SENSOR_SPI_CS "SPI CS"
|
||||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
#define D_UNIT_HOUR "Hod"
|
||||
#define D_UNIT_KILOOHM "kOhm"
|
||||
#define D_UNIT_KILOWATTHOUR "kWh"
|
||||
#define D_UNIT_LUX "lx"
|
||||
#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
|
||||
#define D_UNIT_MICROMETER "um"
|
||||
#define D_UNIT_MICROSECOND "us"
|
||||
#define D_UNIT_MILLIAMPERE "mA"
|
||||
#define D_UNIT_MILLISECOND "ms"
|
||||
#define D_UNIT_MINUTE "Min"
|
||||
#define D_UNIT_PARTS_PER_DECILITER "ppd"
|
||||
#define D_UNIT_PARTS_PER_MILLION "ppm"
|
||||
#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: " // Application
|
||||
#define D_LOG_BRIDGE "BRG: " // Bridge
|
||||
#define D_LOG_CONFIG "CFG: " // Settings
|
||||
#define D_LOG_COMMAND "CMD: " // Command
|
||||
#define D_LOG_DEBUG "DBG: " // Debug
|
||||
#define D_LOG_DHT "DHT: " // DHT sensor
|
||||
#define D_LOG_DOMOTICZ "DOM: " // Domoticz
|
||||
#define D_LOG_DSB "DSB: " // DS18xB20 sensor
|
||||
#define D_LOG_HTTP "HTP: " // HTTP webserver
|
||||
#define D_LOG_I2C "I2C: " // I2C
|
||||
#define D_LOG_IRR "IRR: " // Infra Red Received
|
||||
#define D_LOG_LOG "LOG: " // Logging
|
||||
#define D_LOG_MODULE "MOD: " // Module
|
||||
#define D_LOG_MDNS "DNS: " // mDNS
|
||||
#define D_LOG_MQTT "MQT: " // MQTT
|
||||
#define D_LOG_OTHER "OTH: " // Other
|
||||
#define D_LOG_RESULT "RSL: " // Result
|
||||
#define D_LOG_RFR "RFR: " // RF Received
|
||||
#define D_LOG_SERIAL "SER: " // Serial
|
||||
#define D_LOG_SHT1 "SHT: " // SHT1x sensor
|
||||
#define D_LOG_UPLOAD "UPL: " // Upload
|
||||
#define D_LOG_UPNP "UPP: " // UPnP
|
||||
#define D_LOG_WIFI "WIF: " // Wifi
|
||||
|
||||
#endif // _LANGUAGE_CS_CZ_H_
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "de"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "."
|
||||
#define D_MONTH_DAY_SEPARATOR "."
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "Datengröße"
|
||||
#define D_ANALOG_INPUT "Analog"
|
||||
|
||||
#define D_FINGERPRINT "TLS-Fingerabdruck wird verifiziert..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS-Verbindung fehlgeschlagen an"
|
||||
#define D_RETRY_IN "Wiederversuch in"
|
||||
#define D_VERIFIED "verifiziert"
|
||||
#define D_INSECURE "unsichere Verbindung aufgrund ungültigen Fingerabdrucks"
|
||||
#define D_CONNECT_FAILED_TO "Verbindung fehlgeschlagen aufgrund von"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Blocked Loop"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Aktivere Web Log Level 2 falls Reaktion erwartet"
|
||||
#define D_NEED_USER_AND_PASSWORD "Benutzer benötigt=<Benutzername>&password=<Passwort>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "TLS-Fingerabdruck wird verifiziert..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS-Verbindung fehlgeschlagen an"
|
||||
#define D_RETRY_IN "Wiederversuch in"
|
||||
#define D_VERIFIED "verifiziert mit Fingerabdruck"
|
||||
#define D_INSECURE "unsichere Verbindung aufgrund ungültigen Fingerabdrucks"
|
||||
#define D_CONNECT_FAILED_TO "Verbindung fehlgeschlagen aufgrund von"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast deaktiviert"
|
||||
#define D_MULTICAST_REJOINED "Multicast (wieder-)verbunden"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Power,Energy"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Illuminance"
|
||||
#define D_DOMOTICZ_COUNT "Count"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltage"
|
||||
#define D_DOMOTICZ_CURRENT "Current"
|
||||
#define D_DOMOTICZ_COUNT "Count/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltage/PM2.5"
|
||||
#define D_DOMOTICZ_CURRENT "Current/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "AirQuality"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Update timer"
|
||||
|
||||
|
@ -408,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "en"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "-"
|
||||
#define D_MONTH_DAY_SEPARATOR "-"
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "Data Size"
|
||||
#define D_ANALOG_INPUT "Analog"
|
||||
|
||||
#define D_FINGERPRINT "Verify TLS fingerprint..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS Connect failed to"
|
||||
#define D_RETRY_IN "Retry in"
|
||||
#define D_VERIFIED "Verified"
|
||||
#define D_INSECURE "Insecure connection due to invalid Fingerprint"
|
||||
#define D_CONNECT_FAILED_TO "Connect failed to"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Blocked Loop"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Enable weblog 2 if response expected"
|
||||
#define D_NEED_USER_AND_PASSWORD "Need user=<username>&password=<password>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "Verify TLS fingerprint..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS Connect failed to"
|
||||
#define D_RETRY_IN "Retry in"
|
||||
#define D_VERIFIED "Verified using Fingerprint"
|
||||
#define D_INSECURE "Insecure connection due to invalid Fingerprint"
|
||||
#define D_CONNECT_FAILED_TO "Connect failed to"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast disabled"
|
||||
#define D_MULTICAST_REJOINED "Multicast (re)joined"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Power,Energy"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Illuminance"
|
||||
#define D_DOMOTICZ_COUNT "Count"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltage"
|
||||
#define D_DOMOTICZ_CURRENT "Current"
|
||||
#define D_DOMOTICZ_COUNT "Count/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltage/PM2.5"
|
||||
#define D_DOMOTICZ_CURRENT "Current/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "AirQuality"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Update timer"
|
||||
|
||||
|
@ -408,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "es"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "-"
|
||||
#define D_MONTH_DAY_SEPARATOR "-"
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "Tamaño de Datos"
|
||||
#define D_ANALOG_INPUT "Entrada Analógica"
|
||||
|
||||
#define D_FINGERPRINT "Verificar TLS fingerprint..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Falló Conección TLS a"
|
||||
#define D_RETRY_IN "Reintentando"
|
||||
#define D_VERIFIED "Verificado"
|
||||
#define D_INSECURE "Conección insegura por Fingerprint no válido"
|
||||
#define D_CONNECT_FAILED_TO "Falló Conección a"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Ciclo Bloqueado"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Habilitar weblog 2 si desea respuesta"
|
||||
#define D_NEED_USER_AND_PASSWORD "Se necesita user=<username>&password=<password>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "Verificar TLS fingerprint..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Falló Conección TLS a"
|
||||
#define D_RETRY_IN "Reintentando"
|
||||
#define D_VERIFIED "Verificado Fingerprint"
|
||||
#define D_INSECURE "Conección insegura por Fingerprint no válido"
|
||||
#define D_CONNECT_FAILED_TO "Falló Conección a"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast deshabilitado"
|
||||
#define D_MULTICAST_REJOINED "Multicast (re)conectado"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Potencia,Energía"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Luminancia"
|
||||
#define D_DOMOTICZ_COUNT "Contador"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltaje"
|
||||
#define D_DOMOTICZ_CURRENT "Corriente"
|
||||
#define D_DOMOTICZ_COUNT "Contador/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltaje/PM2,5"
|
||||
#define D_DOMOTICZ_CURRENT "Corriente/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "Calidad del Aire"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Intervalo de refresco"
|
||||
|
||||
|
@ -408,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "fr"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "-"
|
||||
#define D_MONTH_DAY_SEPARATOR "-"
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "Taille données"
|
||||
#define D_ANALOG_INPUT "Analogique"
|
||||
|
||||
#define D_FINGERPRINT "Verification empreinte TLS ..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Echec de connexion TLS à"
|
||||
#define D_RETRY_IN "Nouvelle tentative dans"
|
||||
#define D_VERIFIED "Verifié"
|
||||
#define D_INSECURE "Connexion non sécurisée car empreinte non vérifée"
|
||||
#define D_CONNECT_FAILED_TO "Echec de connexion à"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Boucle bloquée"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Activer weblog 2 si response attendue"
|
||||
#define D_NEED_USER_AND_PASSWORD "Nécessite utilisateur=<username>&password=<password>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "Verification empreinte TLS ..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Echec de connexion TLS à"
|
||||
#define D_RETRY_IN "Nouvelle tentative dans"
|
||||
#define D_VERIFIED "Verifié empreinte "
|
||||
#define D_INSECURE "Connexion non sécurisée car empreinte non vérifée"
|
||||
#define D_CONNECT_FAILED_TO "Echec de connexion à"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast désactivé"
|
||||
#define D_MULTICAST_REJOINED "Multicast (re)joint"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Power,Energy"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Illuminance"
|
||||
#define D_DOMOTICZ_COUNT "Count"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltage"
|
||||
#define D_DOMOTICZ_CURRENT "Current"
|
||||
#define D_DOMOTICZ_COUNT "Count/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltage/PM2,5"
|
||||
#define D_DOMOTICZ_CURRENT "Current/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "AirQuality"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Update timer"
|
||||
|
||||
|
@ -408,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "hu"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "."
|
||||
#define D_MONTH_DAY_SEPARATOR "."
|
||||
|
@ -56,7 +59,7 @@
|
|||
#define D_BOOT_COUNT "Bootolások száma"
|
||||
#define D_BRIGHTLIGHT "Max. fényerő"
|
||||
#define D_BUTTON "Gomb"
|
||||
#define D_BY "által" // Written by me
|
||||
#define D_BY "tőle:" // Written by me
|
||||
#define D_BYTES "Byte-ok"
|
||||
#define D_CELSIUS "Celsius"
|
||||
#define D_CO2 "Szén-dioxid"
|
||||
|
@ -68,7 +71,7 @@
|
|||
#define D_COUNTER "Számláló"
|
||||
#define D_CURRENT "Áram" // As in Voltage and Current
|
||||
#define D_DATA "Adat"
|
||||
#define D_DARKLIGHT "Min. févnyerő"
|
||||
#define D_DARKLIGHT "Min. fényerő"
|
||||
#define D_DEBUG "Debug"
|
||||
#define D_DISABLED "Letiltva"
|
||||
#define D_DNS_SERVER "DNS Szerver"
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "Adat Méret"
|
||||
#define D_ANALOG_INPUT "Analóg"
|
||||
|
||||
#define D_FINGERPRINT "TLS fingerprint hitelesítése..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS Csatlakozás sikertelen a"
|
||||
#define D_RETRY_IN "Újrapróbálás"
|
||||
#define D_VERIFIED "Hitelesítve"
|
||||
#define D_INSECURE "Nem biztonságos kapcsolat érvénytelen Fingerprint miatt"
|
||||
#define D_CONNECT_FAILED_TO "Sikertelen csatlakozás a"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Blocked Loop"
|
||||
|
@ -214,7 +210,7 @@
|
|||
#define D_INFORMATION "Információ"
|
||||
#define D_FIRMWARE_UPGRADE "Firmware Frissítés"
|
||||
#define D_CONSOLE "Konzol"
|
||||
#define D_CONFIRM_RESTART "Újraindítés megerősítése"
|
||||
#define D_CONFIRM_RESTART "Újraindítás megerősítése"
|
||||
|
||||
#define D_CONFIGURE_MODULE "Eszköz konfiguráció"
|
||||
#define D_CONFIGURE_WIFI "WiFi konfiguráció"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Engedélyezz 2-es weblogolást több információért"
|
||||
#define D_NEED_USER_AND_PASSWORD "Kell felhasználó=<felhasználónév>&jelszó=<jelszó>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "TLS fingerprint hitelesítése..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS Csatlakozás sikertelen a"
|
||||
#define D_RETRY_IN "Újrapróbálás"
|
||||
#define D_VERIFIED "Hitelesítve Fingerprint"
|
||||
#define D_INSECURE "Nem biztonságos kapcsolat érvénytelen Fingerprint miatt"
|
||||
#define D_CONNECT_FAILED_TO "Sikertelen csatlakozás a"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast kikapcsolva"
|
||||
#define D_MULTICAST_REJOINED "Multicast (újra)csatlakozás"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "Hőm,Párat,Légny"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Teljesítmény,Energia"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Fényerő"
|
||||
#define D_DOMOTICZ_COUNT "Szám"
|
||||
#define D_DOMOTICZ_VOLTAGE "Feszültség"
|
||||
#define D_DOMOTICZ_CURRENT "Áram"
|
||||
#define D_DOMOTICZ_COUNT "Szám/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Feszültség/PM2.5"
|
||||
#define D_DOMOTICZ_CURRENT "Áram/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "Légminőség"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Update időzítő"
|
||||
|
||||
|
@ -408,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "Háttérvil"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -455,4 +461,4 @@
|
|||
#define D_LOG_UPNP "UPP: " // UPnP
|
||||
#define D_LOG_WIFI "WIF: " // Wifi
|
||||
|
||||
#endif // _LANGUAGE_EN_GB_H_
|
||||
#endif // _LANGUAGE_HU_HU_H_
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "it"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "-"
|
||||
#define D_MONTH_DAY_SEPARATOR "-"
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "Dimensione Dati"
|
||||
#define D_ANALOG_INPUT "Ingresso Analogico"
|
||||
|
||||
#define D_FINGERPRINT "Verifica TLS fingerprint..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Connessione TLS fallita a"
|
||||
#define D_RETRY_IN "Nuovo tentativo in"
|
||||
#define D_VERIFIED "Verificato"
|
||||
#define D_INSECURE "Connessione insicura a causa di Fingerprint non valido"
|
||||
#define D_CONNECT_FAILED_TO "Connessione Fallita a"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Ciclo Bloccato"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Abilitare weblog 2 se e' attesa una risposta"
|
||||
#define D_NEED_USER_AND_PASSWORD "Richiesto user=<username>&password=<password>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "Verifica TLS fingerprint..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Connessione TLS fallita a"
|
||||
#define D_RETRY_IN "Nuovo tentativo in"
|
||||
#define D_VERIFIED "Verificato Fingerprint"
|
||||
#define D_INSECURE "Connessione insicura a causa di Fingerprint non valido"
|
||||
#define D_CONNECT_FAILED_TO "Connessione Fallita a"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast disabilitato"
|
||||
#define D_MULTICAST_REJOINED "Multicast (ri)associato"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Power,Energy"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Illuminance"
|
||||
#define D_DOMOTICZ_COUNT "Count"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltage"
|
||||
#define D_DOMOTICZ_CURRENT "Current"
|
||||
#define D_DOMOTICZ_COUNT "Count/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltage/PM2.5"
|
||||
#define D_DOMOTICZ_CURRENT "Current/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "AirQuality"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Intervallo di aggiornamento"
|
||||
|
||||
|
@ -408,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "nl"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "-"
|
||||
#define D_MONTH_DAY_SEPARATOR "-"
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "Data lengte"
|
||||
#define D_ANALOG_INPUT "Analoog"
|
||||
|
||||
#define D_FINGERPRINT "Controleer TLS vingerafdruk..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS Verbinding mislukt naar"
|
||||
#define D_RETRY_IN "Opnieuw proberen over"
|
||||
#define D_VERIFIED "Gecontroleerd"
|
||||
#define D_INSECURE "Door ongeldige vingerafdruk een onveilige verbinding"
|
||||
#define D_CONNECT_FAILED_TO "Verbinding mislukt naar"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Blocked Loop"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Schakel weblog 2 in indien antwoord verwacht"
|
||||
#define D_NEED_USER_AND_PASSWORD "Benodig user=<gebruiker>&password=<webwachtwoord>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "Controleer TLS vingerafdruk..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS Verbinding mislukt naar"
|
||||
#define D_RETRY_IN "Opnieuw proberen over"
|
||||
#define D_VERIFIED "Gecontroleerd met vingerafdruk"
|
||||
#define D_INSECURE "Door ongeldige vingerafdruk een onveilige verbinding"
|
||||
#define D_CONNECT_FAILED_TO "Verbinding mislukt naar"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast uitgeschakeld"
|
||||
#define D_MULTICAST_REJOINED "Multicast verbonden"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Power,Energy"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Illuminance"
|
||||
#define D_DOMOTICZ_COUNT "Count"
|
||||
#define D_DOMOTICZ_VOLTAGE "Spanning"
|
||||
#define D_DOMOTICZ_CURRENT "Stroom"
|
||||
#define D_DOMOTICZ_COUNT "Count/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Spanning/PM2,5"
|
||||
#define D_DOMOTICZ_CURRENT "Stroom/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "AirQuality"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Bijwerk timer"
|
||||
|
||||
|
@ -408,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "pl"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "-"
|
||||
#define D_MONTH_DAY_SEPARATOR "-"
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "Wielkość danych"
|
||||
#define D_ANALOG_INPUT "Wej_analogowe"
|
||||
|
||||
#define D_FINGERPRINT "Weryfikuj odcisk TLS..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Nieudane połączenie TLS do"
|
||||
#define D_RETRY_IN "Spróbuj ponownie"
|
||||
#define D_VERIFIED "Zweryfikowano"
|
||||
#define D_INSECURE "Nieprawidłowe połączenie z powodu błędnego odcisku TLS"
|
||||
#define D_CONNECT_FAILED_TO "Nie udało się nawiązać połączenia"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Pętla zablokowana"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Włącz poziom 2 zapisu Weblog, jeśli oczekiwana jest odpowiedź"
|
||||
#define D_NEED_USER_AND_PASSWORD "Wymagany użytkownik=<username>&hasło=<password>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "Weryfikuj odcisk TLS..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Nieudane połączenie TLS do"
|
||||
#define D_RETRY_IN "Spróbuj ponownie"
|
||||
#define D_VERIFIED "Zweryfikowano odcisku"
|
||||
#define D_INSECURE "Nieprawidłowe połączenie z powodu błędnego odcisku TLS"
|
||||
#define D_CONNECT_FAILED_TO "Nie udało się nawiązać połączenia"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast jest wyłączony"
|
||||
#define D_MULTICAST_REJOINED "Multicast (re)dołączony"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Wilg,Cis"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Moc,Energia"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Oświetl."
|
||||
#define D_DOMOTICZ_COUNT "Licznik"
|
||||
#define D_DOMOTICZ_VOLTAGE "Napięcie"
|
||||
#define D_DOMOTICZ_CURRENT "Prąd"
|
||||
#define D_DOMOTICZ_COUNT "Licznik/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Napięcie/PM2,5"
|
||||
#define D_DOMOTICZ_CURRENT "Prąd/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "AirQuality"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Zaktualizuj czasomierz"
|
||||
|
||||
|
@ -408,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "pt"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "-"
|
||||
#define D_MONTH_DAY_SEPARATOR "-"
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "Tamanho de dados"
|
||||
#define D_ANALOG_INPUT "Entrada Analógica"
|
||||
|
||||
#define D_FINGERPRINT "Verifique a impressão digital TLS..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS não conseguiu ligar"
|
||||
#define D_RETRY_IN "Tentativa em"
|
||||
#define D_VERIFIED "Verificado"
|
||||
#define D_INSECURE "Ligação insegura devido à impressão digital inválida"
|
||||
#define D_CONNECT_FAILED_TO "A ligação falhou ao"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Loop Bloqueado"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Habilitar weblog 2 se resposta esperada"
|
||||
#define D_NEED_USER_AND_PASSWORD "Necessário user=<nome utilizador>&password=<palavra chave>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "Verifique a impressão digital TLS..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS não conseguiu ligar"
|
||||
#define D_RETRY_IN "Tentativa em"
|
||||
#define D_VERIFIED "Verificado impressão digital "
|
||||
#define D_INSECURE "Ligação insegura devido à impressão digital inválida"
|
||||
#define D_CONNECT_FAILED_TO "A ligação falhou ao"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast desabilitado"
|
||||
#define D_MULTICAST_REJOINED "Multicast (re)ingressou"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Potência,Energia"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Luminâcia"
|
||||
#define D_DOMOTICZ_COUNT "Contagem"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltagem"
|
||||
#define D_DOMOTICZ_CURRENT "Corrente"
|
||||
#define D_DOMOTICZ_COUNT "Contagem/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltagem/PM2.5"
|
||||
#define D_DOMOTICZ_CURRENT "Corrente/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "Qualidade do Ar"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Tempo de atualização"
|
||||
|
||||
|
@ -408,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "Luz negra"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "ru"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "-"
|
||||
#define D_MONTH_DAY_SEPARATOR "-"
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "Размер данных"
|
||||
#define D_ANALOG_INPUT "Аналоговый вход"
|
||||
|
||||
#define D_FINGERPRINT "Проверка TLS Fingerprint..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Сбой подключения TLS к"
|
||||
#define D_RETRY_IN "Повторить"
|
||||
#define D_VERIFIED "Проверено"
|
||||
#define D_INSECURE "Небезопасное соединение, недействительный Fingerprint"
|
||||
#define D_CONNECT_FAILED_TO "Ошибка подключения к"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Блокирующий цикл"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Включить Веб лог уровня 2 если ожидается ответ"
|
||||
#define D_NEED_USER_AND_PASSWORD "Ожидается user=<username>&password=<password>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "Проверка TLS Fingerprint..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "Сбой подключения TLS к"
|
||||
#define D_RETRY_IN "Повторить"
|
||||
#define D_VERIFIED "Проверено Fingerprint"
|
||||
#define D_INSECURE "Небезопасное соединение, недействительный Fingerprint"
|
||||
#define D_CONNECT_FAILED_TO "Ошибка подключения к"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "Multicast отключен"
|
||||
#define D_MULTICAST_REJOINED "Multicast (ре)соединился"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "Power,Energy"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "Illuminance"
|
||||
#define D_DOMOTICZ_COUNT "Count"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltage"
|
||||
#define D_DOMOTICZ_CURRENT "Current"
|
||||
#define D_DOMOTICZ_COUNT "Count/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "Voltage/PM2,5"
|
||||
#define D_DOMOTICZ_CURRENT "Current/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "AirQuality"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "Update timer"
|
||||
|
||||
|
@ -381,7 +385,6 @@
|
|||
#define D_PARTICALS_BEYOND "Particals"
|
||||
|
||||
// sonoff_template.h
|
||||
// Max string length is 8 characters including suffixes
|
||||
#define D_SENSOR_NONE "-нет-"
|
||||
#define D_SENSOR_DHT11 "DHT11"
|
||||
#define D_SENSOR_AM2301 "AM2301"
|
||||
|
@ -409,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "А"
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "zh"
|
||||
|
||||
// "2017-03-07T11:08:02" - ISO8601:2004
|
||||
#define D_YEAR_MONTH_SEPARATOR "-"
|
||||
#define D_MONTH_DAY_SEPARATOR "-"
|
||||
|
@ -162,13 +165,6 @@
|
|||
#define D_DATA_SIZE "数据大小:"
|
||||
#define D_ANALOG_INPUT "Analog"
|
||||
|
||||
#define D_FINGERPRINT "验证 TLS 指纹..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS 连接失败"
|
||||
#define D_RETRY_IN "重试倒计时:"
|
||||
#define D_VERIFIED "验证成功"
|
||||
#define D_INSECURE "指纹无效导致连接不安全"
|
||||
#define D_CONNECT_FAILED_TO "连接失败:"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Blocked Loop"
|
||||
|
@ -317,6 +313,14 @@
|
|||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "如果预期响应,则启用Weblog 2"
|
||||
#define D_NEED_USER_AND_PASSWORD "需要 user=<用户名>&password=<密码>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "验证 TLS 指纹..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS 连接失败"
|
||||
#define D_RETRY_IN "重试倒计时:"
|
||||
#define D_VERIFIED "验证成功"
|
||||
#define D_INSECURE "指纹无效导致连接不安全"
|
||||
#define D_CONNECT_FAILED_TO "连接失败:"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "组播已禁用"
|
||||
#define D_MULTICAST_REJOINED "组播已(重新)加入"
|
||||
|
@ -348,9 +352,9 @@
|
|||
#define D_DOMOTICZ_TEMP_HUM_BARO "温度,湿度,气压"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "功率,电量"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "照度"
|
||||
#define D_DOMOTICZ_COUNT "数值"
|
||||
#define D_DOMOTICZ_VOLTAGE "电压"
|
||||
#define D_DOMOTICZ_CURRENT "电流"
|
||||
#define D_DOMOTICZ_COUNT "数值/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "电压/PM2.5"
|
||||
#define D_DOMOTICZ_CURRENT "电流/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "空气质量"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "更新计时器"
|
||||
|
||||
|
@ -408,6 +412,8 @@
|
|||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "安"
|
||||
|
|
|
@ -0,0 +1,464 @@
|
|||
/*
|
||||
zh-TW.h - localization for Chinese (Traditional) - Taiwan for Sonoff-Tasmota
|
||||
|
||||
Copyright (C) 2018 Theo Arends (translated by dannydu)
|
||||
|
||||
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_ZH_TW_H_
|
||||
#define _LANGUAGE_ZH_TW_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.
|
||||
*
|
||||
\*********************************************************************/
|
||||
|
||||
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||
|
||||
// HTML (ISO 639-1) Language Code
|
||||
#define D_HTML_LANGUAGE "zh"
|
||||
|
||||
// "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 "SunMonTueWedThuFriSat"
|
||||
#define D_MONTH3LIST "JanFebMarAprMayJunJulAugSepOctNovDec"
|
||||
|
||||
// Non JSON decimal separator
|
||||
#define D_DECIMAL_SEPARATOR "."
|
||||
|
||||
// Common
|
||||
#define D_ADMIN "Admin"
|
||||
#define D_AIR_QUALITY "空氣品質"
|
||||
#define D_AP "AP" // Access Point
|
||||
#define D_AS "名稱:"
|
||||
#define D_AUTO "自動"
|
||||
#define D_BLINK "閃爍"
|
||||
#define D_BLINKOFF "閃爍關"
|
||||
#define D_BOOT_COUNT "啟動次數"
|
||||
#define D_BRIGHTLIGHT "亮度"
|
||||
#define D_BUTTON "按鈕"
|
||||
#define D_BY "by" // Written by me
|
||||
#define D_BYTES "大小:"
|
||||
#define D_CELSIUS "攝氏"
|
||||
#define D_CO2 "二氧化碳"
|
||||
#define D_CODE "代碼" // Button code
|
||||
#define D_COLDLIGHT "冷"
|
||||
#define D_COMMAND "命令:"
|
||||
#define D_CONNECTED "已連接"
|
||||
#define D_COUNT "數量:"
|
||||
#define D_COUNTER "Counter"
|
||||
#define D_CURRENT "電流" // As in Voltage and Current
|
||||
#define D_DATA "數據:"
|
||||
#define D_DARKLIGHT "Dark"
|
||||
#define D_DEBUG "除錯"
|
||||
#define D_DISABLED "停用"
|
||||
#define D_DNS_SERVER "DNS伺服器"
|
||||
#define D_DONE "完成"
|
||||
#define D_DST_TIME "DST"
|
||||
#define D_EMULATION "設備模擬"
|
||||
#define D_ENABLED "啟用"
|
||||
#define D_ERASE "刪除"
|
||||
#define D_ERROR "錯誤"
|
||||
#define D_FAHRENHEIT "華氏"
|
||||
#define D_FAILED "失敗"
|
||||
#define D_FALLBACK "Fallback"
|
||||
#define D_FALLBACK_TOPIC "Fallback Topic"
|
||||
#define D_FALSE "False"
|
||||
#define D_FILE "文件:"
|
||||
#define D_FREE_MEMORY "可用記憶體"
|
||||
#define D_GAS "氣體"
|
||||
#define D_GATEWAY "網關"
|
||||
#define D_GROUP "組:"
|
||||
#define D_HOST "主機"
|
||||
#define D_HOSTNAME "主機名"
|
||||
#define D_HUMIDITY "濕度"
|
||||
#define D_ILLUMINANCE "照度"
|
||||
#define D_IMMEDIATE "immediate" // Button immediate
|
||||
#define D_INDEX "索引:"
|
||||
#define D_INFO "信息"
|
||||
#define D_INITIALIZED "初始化完成"
|
||||
#define D_IP_ADDRESS "IP地址"
|
||||
#define D_LIGHT "燈"
|
||||
#define D_LWT "LWT"
|
||||
#define D_MODULE "模組"
|
||||
#define D_MQTT "MQTT"
|
||||
#define D_MULTI_PRESS "多次按鍵"
|
||||
#define D_NOISE "雜訊"
|
||||
#define D_NONE "無"
|
||||
#define D_OFF "關"
|
||||
#define D_OFFLINE "離線"
|
||||
#define D_OK "好"
|
||||
#define D_ON "開"
|
||||
#define D_ONLINE "在線"
|
||||
#define D_PASSWORD "密碼"
|
||||
#define D_PORT "端口"
|
||||
#define D_POWER_FACTOR "功率因數"
|
||||
#define D_POWERUSAGE "功率"
|
||||
#define D_PRESSURE "氣壓"
|
||||
#define D_PRESSUREATSEALEVEL "海平面氣壓"
|
||||
#define D_PROGRAM_FLASH_SIZE "韌體 Flash 大小"
|
||||
#define D_PROGRAM_SIZE "韌體大小"
|
||||
#define D_PROJECT "項目:"
|
||||
#define D_RECEIVED "已接收"
|
||||
#define D_RESTART "重啟"
|
||||
#define D_RESTARTING "正在重啟"
|
||||
#define D_RESTART_REASON "重啟原因"
|
||||
#define D_RESTORE "恢覆"
|
||||
#define D_RETAINED "已保留"
|
||||
#define D_SAVE "存檔"
|
||||
#define D_SENSOR "感測器"
|
||||
#define D_SSID "名稱"
|
||||
#define D_START "開始"
|
||||
#define D_STD_TIME "STD"
|
||||
#define D_STOP "停止"
|
||||
#define D_SUBNET_MASK "子網遮罩"
|
||||
#define D_SUBSCRIBE_TO "訂閱"
|
||||
#define D_SUCCESSFUL "成功"
|
||||
#define D_TEMPERATURE "溫度"
|
||||
#define D_TO "to"
|
||||
#define D_TOGGLE "切換"
|
||||
#define D_TOPIC "主題"
|
||||
#define D_TRANSMIT "發送"
|
||||
#define D_TRUE "True"
|
||||
#define D_UPGRADE "升級"
|
||||
#define D_UPLOAD "上傳"
|
||||
#define D_UPTIME "運行時間"
|
||||
#define D_USER "用戶名"
|
||||
#define D_UTC_TIME "UTC"
|
||||
#define D_UV_LEVEL "紫外線等級"
|
||||
#define D_VERSION "版本"
|
||||
#define D_VOLTAGE "電壓"
|
||||
#define D_WARMLIGHT "暖"
|
||||
#define D_WEB_SERVER "Web Server"
|
||||
|
||||
// sonoff.ino
|
||||
#define D_WARNING_MINIMAL_VERSION "警告:精簡產品不支持配置寫入保存"
|
||||
#define D_LEVEL_10 "level 1-0"
|
||||
#define D_LEVEL_01 "level 0-1"
|
||||
#define D_SERIAL_LOGGING_DISABLED "串口日誌已禁用"
|
||||
#define D_SYSLOG_LOGGING_REENABLED "Syslog 日誌已開啟"
|
||||
|
||||
#define D_SET_BAUDRATE_TO "設置波特率為:"
|
||||
#define D_RECEIVED_TOPIC "接收到的主題:"
|
||||
#define D_DATA_SIZE "數據大小:"
|
||||
#define D_ANALOG_INPUT "Analog"
|
||||
|
||||
// support.ino
|
||||
#define D_OSWATCH "osWatch"
|
||||
#define D_BLOCKED_LOOP "Blocked Loop"
|
||||
#define D_WPS_FAILED_WITH_STATUS "WPSconfig FAILED with status"
|
||||
#define D_ACTIVE_FOR_3_MINUTES "active for 3 minutes"
|
||||
#define D_FAILED_TO_START "未能啟動"
|
||||
#define D_PATCH_ISSUE_2186 "Patch issue 2186"
|
||||
#define D_CONNECTING_TO_AP "連接到 AP"
|
||||
#define D_IN_MODE "模式:"
|
||||
#define D_CONNECT_FAILED_NO_IP_ADDRESS "連接失敗,因為沒有獲取到IP地址"
|
||||
#define D_CONNECT_FAILED_AP_NOT_REACHED "連接失敗,無法連接AP"
|
||||
#define D_CONNECT_FAILED_WRONG_PASSWORD "連接失敗,AP密碼不正確"
|
||||
#define D_CONNECT_FAILED_AP_TIMEOUT "連接失敗,AP超時"
|
||||
#define D_ATTEMPTING_CONNECTION "嘗試連接..."
|
||||
#define D_CHECKING_CONNECTION "檢查連接..."
|
||||
#define D_QUERY_DONE "查詢完成。 發現MQTT服務"
|
||||
#define D_MQTT_SERVICE_FOUND "發現MQTT服務:"
|
||||
#define D_FOUND_AT "found at"
|
||||
#define D_SYSLOG_HOST_NOT_FOUND "Syslog主機未找到"
|
||||
|
||||
// settings.ino
|
||||
#define D_SAVED_TO_FLASH_AT "保存到 flash:"
|
||||
#define D_LOADED_FROM_FLASH_AT "從 flash 載入"
|
||||
#define D_USE_DEFAULTS "使用默認設置"
|
||||
#define D_ERASED_SECTOR "擦除刪除"
|
||||
|
||||
// webserver.ino
|
||||
#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "固件版本過低 - 請升級"
|
||||
#define D_WEBSERVER_ACTIVE_ON "Web服務器:"
|
||||
#define D_WITH_IP_ADDRESS "IP地址:"
|
||||
#define D_WEBSERVER_STOPPED "Web 服務器已停止"
|
||||
#define D_FILE_NOT_FOUND "文件未找到"
|
||||
#define D_REDIRECTED "重定向到認證頁面"
|
||||
#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifimanager set AccessPoint and keep Station"
|
||||
#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifimanager 設置接入點"
|
||||
#define D_TRYING_TO_CONNECT "嘗試將設備連接到網絡"
|
||||
|
||||
#define D_RESTART_IN "重啟需要"
|
||||
#define D_SECONDS "秒"
|
||||
#define D_DEVICE_WILL_RESTART "設備將在幾分鐘內重啟"
|
||||
#define D_BUTTON_TOGGLE "狀態切換"
|
||||
#define D_CONFIGURATION "設置"
|
||||
#define D_INFORMATION "信息"
|
||||
#define D_FIRMWARE_UPGRADE "固件升級"
|
||||
#define D_CONSOLE "控制台"
|
||||
#define D_CONFIRM_RESTART "確認重啟"
|
||||
|
||||
#define D_CONFIGURE_MODULE "模塊設置"
|
||||
#define D_CONFIGURE_WIFI "WiFi設置"
|
||||
#define D_CONFIGURE_MQTT "MQTT設置"
|
||||
#define D_CONFIGURE_DOMOTICZ "Domoticz設置"
|
||||
#define D_CONFIGURE_LOGGING "日志設置"
|
||||
#define D_CONFIGURE_OTHER "其他設置"
|
||||
#define D_CONFIRM_RESET_CONFIGURATION "確認重置配置"
|
||||
#define D_RESET_CONFIGURATION "重置配置"
|
||||
#define D_BACKUP_CONFIGURATION "備份配置"
|
||||
#define D_RESTORE_CONFIGURATION "還原配置"
|
||||
#define D_MAIN_MENU "主菜單"
|
||||
|
||||
#define D_MODULE_PARAMETERS "模塊設置"
|
||||
#define D_MODULE_TYPE "模塊類型"
|
||||
#define D_GPIO "GPIO"
|
||||
#define D_SERIAL_IN "串口輸入(RX)"
|
||||
#define D_SERIAL_OUT "串口輸出(TX)"
|
||||
|
||||
#define D_WIFI_PARAMETERS "Wifi設置"
|
||||
#define D_SCAN_FOR_WIFI_NETWORKS "掃描無線網絡"
|
||||
#define D_SCAN_DONE "掃描完畢"
|
||||
#define D_NO_NETWORKS_FOUND "未找到任何網絡"
|
||||
#define D_REFRESH_TO_SCAN_AGAIN "刷新並重試"
|
||||
#define D_DUPLICATE_ACCESSPOINT "重覆AP"
|
||||
#define D_SKIPPING_LOW_QUALITY "忽略弱信號網絡"
|
||||
#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 名稱"
|
||||
#define D_AP1_PASSWORD "AP1 密碼"
|
||||
#define D_AP2_SSID "AP2 名稱"
|
||||
#define D_AP2_PASSWORD "AP2 密碼"
|
||||
|
||||
#define D_MQTT_PARAMETERS "MQTT設置"
|
||||
#define D_CLIENT "客戶端"
|
||||
#define D_FULL_TOPIC "完整主題"
|
||||
|
||||
#define D_LOGGING_PARAMETERS "日志設置"
|
||||
#define D_SERIAL_LOG_LEVEL "串口日志級別"
|
||||
#define D_WEB_LOG_LEVEL "Web 日志級別"
|
||||
#define D_SYS_LOG_LEVEL "Syslog 日志級別"
|
||||
#define D_MORE_DEBUG "全部調試"
|
||||
#define D_SYSLOG_HOST "Syslog 主機地址"
|
||||
#define D_SYSLOG_PORT "Syslog 端口"
|
||||
#define D_TELEMETRY_PERIOD "上報周期"
|
||||
|
||||
#define D_OTHER_PARAMETERS "其他設置"
|
||||
#define D_WEB_ADMIN_PASSWORD "WEB管理密碼"
|
||||
#define D_MQTT_ENABLE "啟用MQTT"
|
||||
#define D_FRIENDLY_NAME "昵稱"
|
||||
#define D_BELKIN_WEMO "貝爾金 WeMo"
|
||||
#define D_HUE_BRIDGE "飛利浦 Hue 網橋"
|
||||
#define D_SINGLE_DEVICE "單設備"
|
||||
#define D_MULTI_DEVICE "多設備"
|
||||
|
||||
#define D_SAVE_CONFIGURATION "保存設置"
|
||||
#define D_CONFIGURATION_SAVED "設置已保存"
|
||||
#define D_CONFIGURATION_RESET "設置已重置"
|
||||
|
||||
#define D_PROGRAM_VERSION "固件版本"
|
||||
#define D_BUILD_DATE_AND_TIME "編譯時間"
|
||||
#define D_CORE_AND_SDK_VERSION "內核版本"
|
||||
#define D_FLASH_WRITE_COUNT "刷機次數"
|
||||
#define D_MAC_ADDRESS "MAC地址"
|
||||
#define D_MQTT_HOST "MQTT主機"
|
||||
#define D_MQTT_PORT "MQTT端口"
|
||||
#define D_MQTT_CLIENT "MQTT客戶端"
|
||||
#define D_MQTT_USER "MQTT用戶名"
|
||||
#define D_MQTT_TOPIC "MQTT 主題(Topic)"
|
||||
#define D_MQTT_GROUP_TOPIC "MQTT 主題組(Group Topic)"
|
||||
#define D_MQTT_FULL_TOPIC "MQTT 完整主題(Full Topic)"
|
||||
#define D_MDNS_DISCOVERY "mDNS 發現"
|
||||
#define D_MDNS_ADVERTISE "mDNS 廣播"
|
||||
#define D_ESP_CHIP_ID "ESP芯片ID"
|
||||
#define D_FLASH_CHIP_ID "Flash芯片ID"
|
||||
#define D_FLASH_CHIP_SIZE "Flash大小"
|
||||
#define D_FREE_PROGRAM_SPACE "空閑程序空間"
|
||||
|
||||
#define D_UPGRADE_BY_WEBSERVER "通過Web升級"
|
||||
#define D_OTA_URL "OTA地址"
|
||||
#define D_START_UPGRADE "開始升級"
|
||||
#define D_UPGRADE_BY_FILE_UPLOAD "通過文件升級"
|
||||
#define D_UPLOAD_STARTED "開始上傳"
|
||||
#define D_UPGRADE_STARTED "開始升級"
|
||||
#define D_UPLOAD_DONE "上傳完成"
|
||||
#define D_UPLOAD_ERR_1 "沒有選擇文件"
|
||||
#define D_UPLOAD_ERR_2 "沒有足夠空間"
|
||||
#define D_UPLOAD_ERR_3 "固件頭不是 0xE9"
|
||||
#define D_UPLOAD_ERR_4 "固件太大"
|
||||
#define D_UPLOAD_ERR_5 "上傳緩沖區不匹配"
|
||||
#define D_UPLOAD_ERR_6 "上傳失敗。 啟用日志記錄 3"
|
||||
#define D_UPLOAD_ERR_7 "上傳取消"
|
||||
#define D_UPLOAD_ERR_8 "錯誤的固件"
|
||||
#define D_UPLOAD_ERR_9 "固件太大"
|
||||
#define D_UPLOAD_ERROR_CODE "上傳錯誤代碼"
|
||||
|
||||
#define D_ENTER_COMMAND "輸入命令"
|
||||
#define D_ENABLE_WEBLOG_FOR_RESPONSE "如果預期響應,則啟用Weblog 2"
|
||||
#define D_NEED_USER_AND_PASSWORD "需要 user=<用戶名>&password=<密碼>"
|
||||
|
||||
// xdrv_00_mqtt.ino
|
||||
#define D_FINGERPRINT "驗證 TLS 指紋..."
|
||||
#define D_TLS_CONNECT_FAILED_TO "TLS 連接失敗"
|
||||
#define D_RETRY_IN "重試倒計時:"
|
||||
#define D_VERIFIED "驗證成功"
|
||||
#define D_INSECURE "指紋無效導致連接不安全"
|
||||
#define D_CONNECT_FAILED_TO "連接失敗:"
|
||||
|
||||
// xdrv_wemohue.ino
|
||||
#define D_MULTICAST_DISABLED "組播已禁用"
|
||||
#define D_MULTICAST_REJOINED "組播已(重新)加入"
|
||||
#define D_MULTICAST_JOIN_FAILED "組播加入失敗"
|
||||
#define D_FAILED_TO_SEND_RESPONSE "請求發送失敗"
|
||||
|
||||
#define D_WEMO "WeMo"
|
||||
#define D_WEMO_BASIC_EVENT "WeMo 基礎事件"
|
||||
#define D_WEMO_EVENT_SERVICE "WeMo 事件服務"
|
||||
#define D_WEMO_META_SERVICE "WeMo meta 服務"
|
||||
#define D_WEMO_SETUP "WeMo 設置"
|
||||
#define D_RESPONSE_SENT "發送請求"
|
||||
|
||||
#define D_HUE "Hue"
|
||||
#define D_HUE_BRIDGE_SETUP "Hue 設置"
|
||||
#define D_HUE_API_NOT_IMPLEMENTED "Hue API 未實現"
|
||||
#define D_HUE_API "Hue API"
|
||||
#define D_HUE_POST_ARGS "Hue POST 參數"
|
||||
#define D_3_RESPONSE_PACKETS_SENT "3 請求包發送"
|
||||
|
||||
// xdrv_05_domoticz.ino
|
||||
#define D_DOMOTICZ_PARAMETERS "Domoticz 設置"
|
||||
#define D_DOMOTICZ_IDX "Idx"
|
||||
#define D_DOMOTICZ_KEY_IDX "Key idx"
|
||||
#define D_DOMOTICZ_SWITCH_IDX "開關 idx"
|
||||
#define D_DOMOTICZ_SENSOR_IDX "傳感器 idx"
|
||||
#define D_DOMOTICZ_TEMP "溫度"
|
||||
#define D_DOMOTICZ_TEMP_HUM "溫度,濕度"
|
||||
#define D_DOMOTICZ_TEMP_HUM_BARO "溫度,濕度,氣壓"
|
||||
#define D_DOMOTICZ_POWER_ENERGY "功率,電量"
|
||||
#define D_DOMOTICZ_ILLUMINANCE "照度"
|
||||
#define D_DOMOTICZ_COUNT "數值/PM1"
|
||||
#define D_DOMOTICZ_VOLTAGE "電壓/PM2.5"
|
||||
#define D_DOMOTICZ_CURRENT "電流/PM10"
|
||||
#define D_DOMOTICZ_AIRQUALITY "空氣品質"
|
||||
#define D_DOMOTICZ_UPDATE_TIMER "更新計時器"
|
||||
|
||||
// xdrv_03_energy.ino
|
||||
#define D_ENERGY_TODAY "今日用電量"
|
||||
#define D_ENERGY_YESTERDAY "昨日用電量"
|
||||
#define D_ENERGY_TOTAL "總用電量"
|
||||
|
||||
// xsns_05_ds18b20.ino
|
||||
#define D_SENSOR_BUSY "傳感器正忙"
|
||||
#define D_SENSOR_CRC_ERROR "傳感器 CRC 校驗錯誤"
|
||||
#define D_SENSORS_FOUND "發現傳感器"
|
||||
|
||||
// xsns_06_dht.ino
|
||||
#define D_TIMEOUT_WAITING_FOR "等待超時"
|
||||
#define D_START_SIGNAL_LOW "開始低電平"
|
||||
#define D_START_SIGNAL_HIGH "開始高電平"
|
||||
#define D_PULSE "pulse"
|
||||
#define D_CHECKSUM_FAILURE "校驗失敗"
|
||||
|
||||
// xsns_07_sht1x.ino
|
||||
#define D_SENSOR_DID_NOT_ACK_COMMAND "傳感器沒有確認命令"
|
||||
#define D_SHT1X_FOUND "發現 SHT1X 傳感器"
|
||||
|
||||
// xsns_18_pms5003.ino
|
||||
#define D_STANDARD_CONCENTRATION "CF-1 PM" // Standard Particle CF-1 Particle Matter
|
||||
#define D_ENVIRONMENTAL_CONCENTRATION "PM" // Environmetal Particle Matter
|
||||
#define D_PARTICALS_BEYOND "顆粒物直徑大於"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "None"
|
||||
#define D_SENSOR_DHT11 "DHT11"
|
||||
#define D_SENSOR_AM2301 "AM2301"
|
||||
#define D_SENSOR_SI7021 "SI7021"
|
||||
#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 "Switch" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Button" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Relay" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_COUNTER "Counter" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM_RX "PZEM Rx"
|
||||
#define D_SENSOR_PZEM_TX "PZEM Tx"
|
||||
#define D_SENSOR_SAIR_RX "SAir Rx"
|
||||
#define D_SENSOR_SAIR_TX "SAir Tx"
|
||||
#define D_SENSOR_SPI_CS "SPI CS"
|
||||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "安"
|
||||
#define D_UNIT_HOUR "時"
|
||||
#define D_UNIT_KILOOHM "千歐"
|
||||
#define D_UNIT_KILOWATTHOUR "千瓦時"
|
||||
#define D_UNIT_LUX "勒克斯"
|
||||
#define D_UNIT_MICROGRAM_PER_CUBIC_METER "微克/立方米"
|
||||
#define D_UNIT_MICROMETER "微米"
|
||||
#define D_UNIT_MICROSECOND "微秒"
|
||||
#define D_UNIT_MILLIAMPERE "毫安"
|
||||
#define D_UNIT_MILLISECOND "毫秒"
|
||||
#define D_UNIT_MINUTE "分"
|
||||
#define D_UNIT_PARTS_PER_DECILITER "每分升"
|
||||
#define D_UNIT_PARTS_PER_MILLION "ppm"
|
||||
#define D_UNIT_PRESSURE "百帕"
|
||||
#define D_UNIT_SECOND "秒"
|
||||
#define D_UNIT_SECTORS "扇區"
|
||||
#define D_UNIT_VOLT "伏"
|
||||
#define D_UNIT_WATT "瓦"
|
||||
#define D_UNIT_WATTHOUR "瓦時"
|
||||
|
||||
// Log message prefix
|
||||
#define D_LOG_APPLICATION "APP: " // Application
|
||||
#define D_LOG_BRIDGE "BRG: " // Bridge
|
||||
#define D_LOG_CONFIG "CFG: " // Settings
|
||||
#define D_LOG_COMMAND "CMD: " // Command
|
||||
#define D_LOG_DEBUG "DBG: " // Debug
|
||||
#define D_LOG_DHT "DHT: " // DHT sensor
|
||||
#define D_LOG_DOMOTICZ "DOM: " // Domoticz
|
||||
#define D_LOG_DSB "DSB: " // DS18xB20 sensor
|
||||
#define D_LOG_HTTP "HTP: " // HTTP webserver
|
||||
#define D_LOG_I2C "I2C: " // I2C
|
||||
#define D_LOG_IRR "IRR: " // Infra Red Received
|
||||
#define D_LOG_LOG "LOG: " // Logging
|
||||
#define D_LOG_MODULE "MOD: " // Module
|
||||
#define D_LOG_MDNS "DNS: " // mDNS
|
||||
#define D_LOG_MQTT "MQT: " // MQTT
|
||||
#define D_LOG_OTHER "OTH: " // Other
|
||||
#define D_LOG_RESULT "RSL: " // Result
|
||||
#define D_LOG_RFR "RFR: " // RF Received
|
||||
#define D_LOG_SERIAL "SER: " // Serial
|
||||
#define D_LOG_SHT1 "SHT: " // SHT1x sensor
|
||||
#define D_LOG_UPLOAD "UPL: " // Upload
|
||||
#define D_LOG_UPNP "UPP: " // UPnP
|
||||
#define D_LOG_WIFI "WIF: " // Wifi
|
||||
|
||||
#endif // _LANGUAGE_ZH_TW_H_
|
|
@ -47,7 +47,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
|
|||
uint32_t hass_discovery : 1; // bit 19 (v5.11.1a)
|
||||
uint32_t not_power_linked : 1; // bit 20 (v5.11.1f)
|
||||
uint32_t no_power_on_check : 1; // bit 21 (v5.11.1i)
|
||||
uint32_t spare22 : 1;
|
||||
uint32_t mqtt_serial : 1; // bit 22 (v5.12.0f)
|
||||
uint32_t spare23 : 1;
|
||||
uint32_t spare24 : 1;
|
||||
uint32_t spare25 : 1;
|
||||
|
@ -89,6 +89,20 @@ typedef union {
|
|||
};
|
||||
} SysBitfield2;
|
||||
|
||||
typedef union {
|
||||
uint32_t data;
|
||||
struct {
|
||||
uint32_t time : 11; // bits 0 - 10 = minutes in a day
|
||||
uint32_t mday : 5; // bits 11 - 15 = optional day in a month
|
||||
uint32_t days : 7; // bits 16 - 22 = week day mask
|
||||
uint32_t device : 4; // bits 23 - 26 = 16 devices
|
||||
uint32_t power : 2; // bits 27 - 28 = 4 power states - Off, On, Toggle
|
||||
uint32_t repeat : 1; // bit 29
|
||||
uint32_t arm : 1; // bit 30
|
||||
uint32_t spare : 1; // bit 31
|
||||
};
|
||||
} Timer;
|
||||
|
||||
struct SYSCFG {
|
||||
unsigned long cfg_holder; // 000
|
||||
unsigned long save_flag; // 004
|
||||
|
@ -99,9 +113,7 @@ struct SYSCFG {
|
|||
int8_t timezone; // 016
|
||||
char ota_url[101]; // 017
|
||||
char mqtt_prefix[3][11]; // 07C
|
||||
|
||||
byte free_09D[1]; // 09D
|
||||
|
||||
uint8_t baudrate; // 09D
|
||||
byte seriallog_level; // 09E
|
||||
uint8_t sta_config; // 09F
|
||||
byte sta_active; // 0A0
|
||||
|
@ -116,7 +128,10 @@ struct SYSCFG {
|
|||
byte syslog_level; // 1AA
|
||||
uint8_t webserver; // 1AB
|
||||
byte weblog_level; // 1AC
|
||||
char mqtt_fingerprint[60]; // 1AD To be freed by binary fingerprint
|
||||
uint8_t mqtt_fingerprint[2][20]; // 1AD
|
||||
|
||||
byte free_1D5[20]; // 1D5 Free since 5.12.0e
|
||||
|
||||
char mqtt_host[33]; // 1E9
|
||||
uint16_t mqtt_port; // 20A
|
||||
char mqtt_client[33]; // 20C
|
||||
|
@ -125,7 +140,6 @@ struct SYSCFG {
|
|||
char mqtt_topic[33]; // 26F
|
||||
char button_topic[33]; // 290
|
||||
char mqtt_grptopic[33]; // 2B1
|
||||
|
||||
uint8_t display_model; // 2D2
|
||||
uint8_t display_mode; // 2D3
|
||||
uint8_t display_refresh; // 2D4
|
||||
|
@ -134,27 +148,23 @@ struct SYSCFG {
|
|||
uint8_t display_address[8]; // 2D8
|
||||
uint8_t display_dimmer; // 2E0
|
||||
uint8_t display_size; // 2E1
|
||||
|
||||
uint8_t free_2E2[4]; // 2E2
|
||||
|
||||
uint16_t pwm_frequency; // 2E6
|
||||
power_t power; // 2E8
|
||||
uint16_t pwm_value[MAX_PWMS]; // 2EC
|
||||
|
||||
int16_t altitude; // 2F6 Add since 5.8.0i
|
||||
uint16_t tele_period; // 2F8
|
||||
uint8_t ex_power; // 2FA Not used since 5.8.0j
|
||||
uint8_t ledstate; // 2FB
|
||||
uint8_t param[PARAM8_SIZE]; // 2FC was domoticz_in_topic until 5.1.6
|
||||
char state_text[4][11]; // 313
|
||||
|
||||
byte free_33F[1]; // 33F
|
||||
|
||||
uint8_t energy_power_delta; // 33F
|
||||
uint16_t domoticz_update_timer; // 340
|
||||
uint16_t pwm_range; // 342
|
||||
|
||||
unsigned long domoticz_relay_idx[MAX_DOMOTICZ_IDX]; // 344
|
||||
unsigned long domoticz_key_idx[MAX_DOMOTICZ_IDX]; // 354
|
||||
|
||||
unsigned long energy_power_calibration; // 364
|
||||
unsigned long energy_voltage_calibration; // 368
|
||||
unsigned long energy_current_calibration; // 36C
|
||||
|
@ -178,10 +188,9 @@ struct SYSCFG {
|
|||
uint16_t mqtt_retry; // 396
|
||||
uint8_t poweronstate; // 398
|
||||
uint8_t last_module; // 399
|
||||
|
||||
uint16_t blinktime; // 39A
|
||||
uint16_t blinkcount; // 39C
|
||||
uint16_t ws_pixels; // 39E Not used since 5.8.0
|
||||
uint16_t light_rotation; // 39E
|
||||
uint8_t ws_red; // 3A0 Not used since 5.8.0
|
||||
uint8_t ws_green; // 3A1 Not used since 5.8.0
|
||||
uint8_t ws_blue; // 3A2 Not used since 5.8.0
|
||||
|
@ -197,17 +206,14 @@ struct SYSCFG {
|
|||
uint16_t ws_wakeup; // 3AA Not used since 5.8.0
|
||||
char friendlyname[MAX_FRIENDLYNAMES][33]; // 3AC
|
||||
char switch_topic[33]; // 430
|
||||
|
||||
byte free_451[2]; // 451
|
||||
|
||||
char serial_delimiter; // 451
|
||||
uint8_t sbaudrate; // 452
|
||||
uint8_t sleep; // 453
|
||||
uint16_t domoticz_switch_idx[MAX_DOMOTICZ_IDX]; // 454
|
||||
uint16_t domoticz_sensor_idx[MAX_DOMOTICZ_SNS_IDX]; // 45C
|
||||
uint8_t module; // 474
|
||||
|
||||
uint8_t ws_color[4][3]; // 475
|
||||
uint8_t ws_width[3]; // 481
|
||||
|
||||
myio my_gp; // 484
|
||||
uint16_t light_pixels; // 496
|
||||
uint8_t light_color[5]; // 498
|
||||
|
@ -230,9 +236,7 @@ struct SYSCFG {
|
|||
char web_password[33]; // 4A9
|
||||
uint8_t switchmode[MAX_SWITCHES]; // 4CA
|
||||
char ntp_server[3][33]; // 4CE
|
||||
|
||||
byte ina219_mode; // 531
|
||||
|
||||
uint16_t pulse_timer[MAX_PULSETIMERS]; // 532
|
||||
|
||||
byte free_542[2]; // 542
|
||||
|
@ -240,14 +244,17 @@ struct SYSCFG {
|
|||
uint32_t ip_address[4]; // 544
|
||||
unsigned long energy_kWhtotal; // 554
|
||||
char mqtt_fulltopic[100]; // 558
|
||||
|
||||
SysBitfield2 flag2; // 5BC Add flag2 since 5.9.2
|
||||
|
||||
unsigned long pulse_counter[MAX_COUNTERS]; // 5C0
|
||||
uint16_t pulse_counter_type; // 5D0
|
||||
uint16_t pulse_counter_debounce; // 5D2
|
||||
uint8_t rf_code[17][9]; // 5D4
|
||||
|
||||
byte free_66d[3]; // 66D
|
||||
|
||||
Timer timer[MAX_TIMERS]; // 670
|
||||
|
||||
// 6B0 - FFF free locations
|
||||
} Settings;
|
||||
|
||||
struct RTCMEM {
|
||||
|
|
|
@ -450,6 +450,7 @@ void SettingsDefaultSet2()
|
|||
Settings.flag.mqtt_power_retain = MQTT_POWER_RETAIN;
|
||||
Settings.flag.mqtt_button_retain = MQTT_BUTTON_RETAIN;
|
||||
Settings.flag.mqtt_switch_retain = MQTT_SWITCH_RETAIN;
|
||||
Settings.flag.pwm_control = 1;
|
||||
Settings.flag.hass_discovery = HOME_ASSISTANT_DISCOVERY_ENABLE;
|
||||
|
||||
Settings.flag2.emulation = EMULATION;
|
||||
|
@ -457,6 +458,9 @@ void SettingsDefaultSet2()
|
|||
Settings.save_data = SAVE_DATA;
|
||||
Settings.timezone = APP_TIMEZONE;
|
||||
strlcpy(Settings.ota_url, OTA_URL, sizeof(Settings.ota_url));
|
||||
Settings.baudrate = APP_BAUDRATE / 1200;
|
||||
Settings.sbaudrate = SOFT_BAUDRATE / 1200;
|
||||
Settings.serial_delimiter = 0xff;
|
||||
|
||||
Settings.seriallog_level = SERIAL_LOG_LEVEL;
|
||||
// Settings.sta_active = 0;
|
||||
|
@ -472,7 +476,18 @@ void SettingsDefaultSet2()
|
|||
Settings.webserver = WEB_SERVER;
|
||||
Settings.weblog_level = WEB_LOG_LEVEL;
|
||||
|
||||
strlcpy(Settings.mqtt_fingerprint, MQTT_FINGERPRINT, sizeof(Settings.mqtt_fingerprint));
|
||||
char fingerprint[60];
|
||||
strlcpy(fingerprint, MQTT_FINGERPRINT1, sizeof(fingerprint));
|
||||
char *p = fingerprint;
|
||||
for (byte i = 0; i < 20; i++) {
|
||||
Settings.mqtt_fingerprint[0][i] = strtol(p, &p, 16);
|
||||
}
|
||||
strlcpy(fingerprint, MQTT_FINGERPRINT2, sizeof(fingerprint));
|
||||
p = fingerprint;
|
||||
for (byte i = 0; i < 20; i++) {
|
||||
Settings.mqtt_fingerprint[1][i] = strtol(p, &p, 16);
|
||||
}
|
||||
|
||||
strlcpy(Settings.mqtt_host, MQTT_HOST, sizeof(Settings.mqtt_host));
|
||||
Settings.mqtt_port = MQTT_PORT;
|
||||
strlcpy(Settings.mqtt_client, MQTT_CLIENT_ID, sizeof(Settings.mqtt_client));
|
||||
|
@ -498,6 +513,7 @@ void SettingsDefaultSet2()
|
|||
// Settings.domoticz_switch_idx[i] = 0;
|
||||
}
|
||||
|
||||
Settings.energy_power_delta = DEFAULT_POWER_DELTA;
|
||||
Settings.energy_power_calibration = HLW_PREF_PULSE;
|
||||
Settings.energy_voltage_calibration = HLW_UREF_PULSE;
|
||||
Settings.energy_current_calibration = HLW_IREF_PULSE;
|
||||
|
@ -510,14 +526,14 @@ void SettingsDefaultSet2()
|
|||
// Settings.energy_max_voltage = 0;
|
||||
// Settings.energy_min_current = 0;
|
||||
// Settings.energy_max_current = 0;
|
||||
// Settings.energy_max_power_limit = 0; // MaxPowerLimit
|
||||
// Settings.energy_max_power_limit = 0; // MaxPowerLimit
|
||||
Settings.energy_max_power_limit_hold = MAX_POWER_HOLD;
|
||||
Settings.energy_max_power_limit_window = MAX_POWER_WINDOW;
|
||||
// Settings.energy_max_power_safe_limit = 0; // MaxSafePowerLimit
|
||||
// Settings.energy_max_power_safe_limit = 0; // MaxSafePowerLimit
|
||||
Settings.energy_max_power_safe_limit_hold = SAFE_POWER_HOLD;
|
||||
Settings.energy_max_power_safe_limit_window = SAFE_POWER_WINDOW;
|
||||
// Settings.energy_max_energy = 0; // MaxEnergy
|
||||
// Settings.energy_max_energy_start = 0; // MaxEnergyStart
|
||||
// Settings.energy_max_energy = 0; // MaxEnergy
|
||||
// Settings.energy_max_energy_start = 0; // MaxEnergyStart
|
||||
|
||||
SettingsDefaultSet_3_2_4();
|
||||
|
||||
|
@ -568,6 +584,7 @@ void SettingsDefaultSet2()
|
|||
|
||||
// 5.8.0
|
||||
Settings.light_pixels = WS2812_LEDS;
|
||||
// Settings.light_rotation = 0;
|
||||
|
||||
// 5.8.1
|
||||
// Settings.altitude = 0;
|
||||
|
@ -586,7 +603,6 @@ void SettingsDefaultSet2()
|
|||
|
||||
void SettingsDefaultSet_3_2_4()
|
||||
{
|
||||
Settings.ws_pixels = WS2812_LEDS;
|
||||
Settings.ws_red = 255;
|
||||
Settings.ws_green = 0;
|
||||
Settings.ws_blue = 0;
|
||||
|
@ -614,6 +630,7 @@ void SettingsDefaultSet_3_9_3()
|
|||
}
|
||||
|
||||
Settings.light_pixels = WS2812_LEDS;
|
||||
Settings.light_rotation = 0;
|
||||
for (byte i = 0; i < MAX_PWMS; i++) {
|
||||
Settings.light_color[i] = 255;
|
||||
}
|
||||
|
@ -824,7 +841,7 @@ void SettingsDelta()
|
|||
}
|
||||
}
|
||||
if (!Settings.light_pixels && cfg_wsflg) {
|
||||
Settings.light_pixels = Settings.ws_pixels;
|
||||
Settings.light_pixels = WS2812_LEDS;
|
||||
Settings.light_color[0] = Settings.ws_red;
|
||||
Settings.light_color[1] = Settings.ws_green;
|
||||
Settings.light_color[2] = Settings.ws_blue;
|
||||
|
@ -875,7 +892,27 @@ void SettingsDelta()
|
|||
if (Settings.version < 0x050B0107) {
|
||||
Settings.flag.not_power_linked = 0;
|
||||
}
|
||||
|
||||
if (Settings.version < 0x050C0005) {
|
||||
Settings.light_rotation = 0;
|
||||
Settings.energy_power_delta = DEFAULT_POWER_DELTA;
|
||||
char fingerprint[60];
|
||||
memcpy(fingerprint, Settings.mqtt_fingerprint, sizeof(fingerprint));
|
||||
char *p = fingerprint;
|
||||
for (byte i = 0; i < 20; i++) {
|
||||
Settings.mqtt_fingerprint[0][i] = strtol(p, &p, 16);
|
||||
Settings.mqtt_fingerprint[1][i] = Settings.mqtt_fingerprint[0][i];
|
||||
}
|
||||
}
|
||||
if (Settings.version < 0x050C0007) {
|
||||
Settings.baudrate = APP_BAUDRATE / 1200;
|
||||
}
|
||||
if (Settings.version < 0x050C0008) {
|
||||
Settings.sbaudrate = SOFT_BAUDRATE / 1200;
|
||||
Settings.serial_delimiter = 0xff;
|
||||
}
|
||||
if (Settings.version < 0x050C0009) {
|
||||
memset(&Settings.timer, 0x00, sizeof(Timer) * MAX_TIMERS);
|
||||
}
|
||||
|
||||
Settings.version = VERSION;
|
||||
SettingsSave(1);
|
||||
|
|
|
@ -43,6 +43,7 @@ typedef unsigned long power_t; // Power (Relay) type
|
|||
#define MAX_SWITCHES 4 // Max number of switches
|
||||
#define MAX_PWMS 5 // Max number of PWM channels
|
||||
#define MAX_COUNTERS 4 // Max number of counter sensors
|
||||
#define MAX_TIMERS 16 // Max number of Timers
|
||||
#define MAX_PULSETIMERS 8 // Max number of supported pulse timers
|
||||
#define MAX_FRIENDLYNAMES 4 // Max number of Friendly names
|
||||
#define MAX_DOMOTICZ_IDX 4 // Max number of Domoticz device, key and switch indices
|
||||
|
@ -71,11 +72,12 @@ typedef unsigned long power_t; // Power (Relay) type
|
|||
//#define PWM_FREQ 910 // 100..1000 Hz led refresh (iTead value)
|
||||
#define PWM_FREQ 880 // 100..1000 Hz led refresh (BN-SZ01 value)
|
||||
|
||||
#define MAX_POWER_HOLD 10 // Time in SECONDS to allow max agreed power (Pow)
|
||||
#define MAX_POWER_WINDOW 30 // Time in SECONDS to disable allow max agreed power (Pow)
|
||||
#define SAFE_POWER_HOLD 10 // Time in SECONDS to allow max unit safe power (Pow)
|
||||
#define SAFE_POWER_WINDOW 30 // Time in MINUTES to disable allow max unit safe power (Pow)
|
||||
#define MAX_POWER_RETRY 5 // Retry count allowing agreed power limit overflow (Pow)
|
||||
#define DEFAULT_POWER_DELTA 80 // Power change percentage
|
||||
#define MAX_POWER_HOLD 10 // Time in SECONDS to allow max agreed power
|
||||
#define MAX_POWER_WINDOW 30 // Time in SECONDS to disable allow max agreed power
|
||||
#define SAFE_POWER_HOLD 10 // Time in SECONDS to allow max unit safe power
|
||||
#define SAFE_POWER_WINDOW 30 // Time in MINUTES to disable allow max unit safe power
|
||||
#define MAX_POWER_RETRY 5 // Retry count allowing agreed power limit overflow
|
||||
|
||||
#define STATES 20 // State loops per second
|
||||
#define SYSLOG_TIMER 600 // Seconds to restore syslog_level
|
||||
|
@ -97,7 +99,9 @@ typedef unsigned long power_t; // Power (Relay) type
|
|||
#define MAX_BACKLOG 16 // Max number of commands in backlog (chk backlog_index and backlog_pointer code)
|
||||
#define MIN_BACKLOG_DELAY 2 // Minimal backlog delay in 0.1 seconds
|
||||
|
||||
#define SOFT_BAUDRATE 9600 // Default software serial baudrate
|
||||
#define APP_BAUDRATE 115200 // Default serial baudrate
|
||||
#define SERIAL_POLLING 100 // Serial receive polling in ms
|
||||
#define MAX_STATUS 11 // Max number of status lines
|
||||
|
||||
/*
|
||||
|
@ -106,6 +110,19 @@ typedef unsigned long power_t; // Power (Relay) type
|
|||
#define max(a,b) ((a)>(b)?(a):(b))
|
||||
*/
|
||||
|
||||
//enum ws2812NeopixelbusFeature { NEO_RGB, NEO_GRB, NEO_BRG, NEO_RBG, NEO_3LED, NEO_RGBW, NEO_GRBW }; // Doesn't work
|
||||
#define NEO_RGB 0 // Neopixel RGB leds
|
||||
#define NEO_GRB 1 // Neopixel GRB leds
|
||||
#define NEO_BRG 2 // Neopixel BRG leds
|
||||
#define NEO_RBG 3 // Neopixel RBG leds
|
||||
#define NEO_3LED 4 // Placeholder to test for 4 led types
|
||||
#define NEO_RGBW 5 // Neopixel RGBW leds
|
||||
#define NEO_GRBW 6 // Neopixel GRBW leds
|
||||
|
||||
#define MQTT_PUBSUBCLIENT 1 // Mqtt PubSubClient library
|
||||
#define MQTT_TASMOTAMQTT 2 // Mqtt TasmotaMqtt library based on esp-mqtt-arduino
|
||||
#define MQTT_ESPMQTTARDUINO 3 // Mqtt esp-mqtt-arduino library by Ingo Randolf
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Enumeration
|
||||
\*********************************************************************************************/
|
||||
|
@ -138,8 +155,8 @@ enum SettingsParmaIndex {P_HOLD_TIME, P_MAX_POWER_RETRY, P_MAX_PARAM8};
|
|||
|
||||
enum DomoticzSensors {DZ_TEMP, DZ_TEMP_HUM, DZ_TEMP_HUM_BARO, DZ_POWER_ENERGY, DZ_ILLUMINANCE, DZ_COUNT, DZ_VOLTAGE, DZ_CURRENT, DZ_AIRQUALITY, DZ_MAX_SENSORS};
|
||||
|
||||
enum Ws2812ClockIndex {WS_SECOND, WS_MINUTE, WS_HOUR};
|
||||
enum Ws2812Color {WS_RED, WS_GREEN, WS_BLUE};
|
||||
enum Ws2812ClockIndex { WS_SECOND, WS_MINUTE, WS_HOUR, WS_MARKER };
|
||||
enum Ws2812Color { WS_RED, WS_GREEN, WS_BLUE };
|
||||
enum LightTypes {LT_BASIC, LT_PWM1, LT_PWM2, LT_PWM3, LT_PWM4, LT_PWM5, LT_PWM6, LT_PWM7, LT_NU8, LT_NU9, LT_NU10, LT_WS2812, LT_RGBW, LT_RGBWC};
|
||||
enum LichtSubtypes {LST_NONE, LST_SINGLE, LST_COLDWARM, LST_RGB, LST_RGBW, LST_RGBWC};
|
||||
enum LichtSchemes {LS_POWER, LS_WAKEUP, LS_CYCLEUP, LS_CYCLEDN, LS_RANDOM, LS_MAX};
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
- Select IDE Tools - Flash Size: "1M (no SPIFFS)"
|
||||
====================================================*/
|
||||
|
||||
#define VERSION 0x050C0004 // 5.12.0d
|
||||
#define VERSION 0x050C0009 // 5.12.0i
|
||||
|
||||
// Location specific includes
|
||||
#include <core_version.h> // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0)
|
||||
|
@ -54,8 +54,14 @@
|
|||
#include <ESP8266WebServer.h> // WifiManager, Webserver
|
||||
#include <DNSServer.h> // WifiManager
|
||||
#endif // USE_WEBSERVER
|
||||
#ifdef USE_ARDUINO_OTA
|
||||
#include <ArduinoOTA.h> // Arduino OTA
|
||||
#ifndef USE_DISCOVERY
|
||||
#define USE_DISCOVERY
|
||||
#endif
|
||||
#endif // USE_ARDUINO_OTA
|
||||
#ifdef USE_DISCOVERY
|
||||
#include <ESP8266mDNS.h> // MQTT, Webserver
|
||||
#include <ESP8266mDNS.h> // MQTT, Webserver, Arduino OTA
|
||||
#endif // USE_DISCOVERY
|
||||
#ifdef USE_I2C
|
||||
#include <Wire.h> // I2C support library
|
||||
|
@ -76,7 +82,7 @@ enum TasmotaCommands {
|
|||
CMND_LOGHOST, CMND_LOGPORT, CMND_IPADDRESS, CMND_NTPSERVER, CMND_AP, CMND_SSID, CMND_PASSWORD, CMND_HOSTNAME,
|
||||
CMND_WIFICONFIG, CMND_FRIENDLYNAME, CMND_SWITCHMODE, CMND_WEBSERVER, CMND_WEBPASSWORD, CMND_WEBLOG, CMND_EMULATION,
|
||||
CMND_TELEPERIOD, CMND_RESTART, CMND_RESET, CMND_TIMEZONE, CMND_ALTITUDE, CMND_LEDPOWER, CMND_LEDSTATE,
|
||||
CMND_CFGDUMP, CMND_I2CSCAN, CMND_EXCEPTION };
|
||||
CMND_CFGDUMP, CMND_I2CSCAN, CMND_SERIALSEND, CMND_BAUDRATE, CMND_SERIALDELIMITER, CMND_EXCEPTION };
|
||||
const char kTasmotaCommands[] PROGMEM =
|
||||
D_CMND_BACKLOG "|" D_CMND_DELAY "|" D_CMND_POWER "|" D_CMND_STATUS "|" D_CMND_STATE "|" D_CMND_POWERONSTATE "|" D_CMND_PULSETIME "|"
|
||||
D_CMND_BLINKTIME "|" D_CMND_BLINKCOUNT "|" D_CMND_SENSOR "|" D_CMND_SAVEDATA "|" D_CMND_SETOPTION "|" D_CMND_TEMPERATURE_RESOLUTION "|" D_CMND_HUMIDITY_RESOLUTION "|"
|
||||
|
@ -86,7 +92,7 @@ const char kTasmotaCommands[] PROGMEM =
|
|||
D_CMND_LOGHOST "|" D_CMND_LOGPORT "|" D_CMND_IPADDRESS "|" D_CMND_NTPSERVER "|" D_CMND_AP "|" D_CMND_SSID "|" D_CMND_PASSWORD "|" D_CMND_HOSTNAME "|"
|
||||
D_CMND_WIFICONFIG "|" D_CMND_FRIENDLYNAME "|" D_CMND_SWITCHMODE "|" D_CMND_WEBSERVER "|" D_CMND_WEBPASSWORD "|" D_CMND_WEBLOG "|" D_CMND_EMULATION "|"
|
||||
D_CMND_TELEPERIOD "|" D_CMND_RESTART "|" D_CMND_RESET "|" D_CMND_TIMEZONE "|" D_CMND_ALTITUDE "|" D_CMND_LEDPOWER "|" D_CMND_LEDSTATE "|"
|
||||
D_CMND_CFGDUMP "|" D_CMND_I2CSCAN
|
||||
D_CMND_CFGDUMP "|" D_CMND_I2CSCAN "|" D_CMND_SERIALSEND "|" D_CMND_BAUDRATE "|" D_CMND_SERIALDELIMITER
|
||||
#ifdef DEBUG_THEO
|
||||
"|" D_CMND_EXCEPTION
|
||||
#endif
|
||||
|
@ -102,6 +108,7 @@ const char kOptionBlinkOff[] PROGMEM = "BLINKOFF|" D_BLINKOFF ;
|
|||
int baudrate = APP_BAUDRATE; // Serial interface baud rate
|
||||
SerialConfig serial_config = SERIAL_8N1; // Serial interface configuration 8 data bits, No parity, 1 stop bit
|
||||
byte serial_in_byte; // Received byte
|
||||
unsigned long serial_polling_window = 0; // Serial polling window
|
||||
int serial_in_byte_counter = 0; // Index in receive buffer
|
||||
byte dual_hex_code = 0; // Sonoff dual input flag
|
||||
uint16_t dual_button_code = 0; // Sonoff dual received code
|
||||
|
@ -175,7 +182,6 @@ uint8_t i2c_flg = 0; // I2C configured
|
|||
uint8_t spi_flg = 0; // SPI configured
|
||||
uint8_t light_type = 0; // Light types
|
||||
bool pwm_present = false; // Any PWM channel configured with SetOption15 0
|
||||
|
||||
boolean mdns_begun = false;
|
||||
|
||||
char my_version[33]; // Composed version string
|
||||
|
@ -422,10 +428,12 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
|
|||
if (!strcmp(dataBuf,"?")) data_len = 0;
|
||||
int16_t payload = -99; // No payload
|
||||
uint16_t payload16 = 0;
|
||||
long lnum = strtol(dataBuf, &p, 10);
|
||||
long payload32 = strtol(dataBuf, &p, 10);
|
||||
if (p != dataBuf) {
|
||||
payload = (int16_t) lnum; // -32766 - 32767
|
||||
payload16 = (uint16_t) lnum; // 0 - 65535
|
||||
payload = (int16_t) payload32; // -32766 - 32767
|
||||
payload16 = (uint16_t) payload32; // 0 - 65535
|
||||
} else {
|
||||
payload32 = 0;
|
||||
}
|
||||
backlog_delay = MIN_BACKLOG_DELAY; // Reset backlog delay
|
||||
|
||||
|
@ -513,7 +521,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
|
|||
Settings.pulse_timer[index -1] = payload16; // 0 - 65535
|
||||
pulse_timer[index -1] = 0;
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_NVALUE, command, index, Settings.pulse_timer[index -1]);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_NVALUE_ACTIVE_NVALUE, command, index, Settings.pulse_timer[index -1], pulse_timer[index -1]);
|
||||
}
|
||||
else if (CMND_BLINKTIME == command_code) {
|
||||
if ((payload > 2) && (payload <= 3600)) {
|
||||
|
@ -734,15 +742,9 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
|
|||
Settings.pwm_value[index -1] = payload;
|
||||
analogWrite(pin[GPIO_PWM1 + index -1], bitRead(pwm_inverted, index -1) ? Settings.pwm_range - payload : payload);
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_PWM "\":{"));
|
||||
bool first = true;
|
||||
for (byte i = 0; i < MAX_PWMS; i++) {
|
||||
if (pin[GPIO_PWM1 + i] < 99) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"" D_CMND_PWM "%d\":%d"), mqtt_data, first ? "" : ",", i+1, Settings.pwm_value[i]);
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}}"),mqtt_data);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{"));
|
||||
MqttShowPWMState(); // Render the PWM status to MQTT
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
}
|
||||
else if (CMND_PWMFREQUENCY == command_code) {
|
||||
if ((1 == payload) || ((payload >= 100) && (payload <= 4000))) {
|
||||
|
@ -810,11 +812,47 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
|
|||
strlcpy(Settings.ota_url, (1 == payload) ? OTA_URL : dataBuf, sizeof(Settings.ota_url));
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.ota_url);
|
||||
}
|
||||
else if (CMND_BAUDRATE == command_code) {
|
||||
if (payload32 > 0) {
|
||||
payload32 /= 1200; // Make it a valid baudrate
|
||||
baudrate = (1 == payload) ? APP_BAUDRATE : payload32 * 1200;
|
||||
SetSerialBaudrate(baudrate);
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.baudrate * 1200);
|
||||
}
|
||||
else if ((CMND_SERIALSEND == command_code) && (index > 0) && (index <= 3)) {
|
||||
SetSeriallog(LOG_LEVEL_NONE);
|
||||
Settings.flag.mqtt_serial = 1;
|
||||
if (data_len > 0) {
|
||||
if (1 == index) {
|
||||
Serial.printf("%s\n", dataBuf);
|
||||
}
|
||||
else if (2 == index) {
|
||||
Serial.printf("%s", dataBuf);
|
||||
}
|
||||
else if (3 == index) {
|
||||
uint16_t dat_len = data_len;
|
||||
Serial.printf("%s", Unescape(dataBuf, &dat_len));
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_DONE);
|
||||
}
|
||||
}
|
||||
else if (CMND_SERIALDELIMITER == command_code) {
|
||||
if ((data_len > 0) && (payload < 256)) {
|
||||
if (payload > 0) {
|
||||
Settings.serial_delimiter = payload;
|
||||
} else {
|
||||
uint16_t dat_len = data_len;
|
||||
Unescape(dataBuf, &dat_len);
|
||||
Settings.serial_delimiter = dataBuf[0];
|
||||
}
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.serial_delimiter);
|
||||
}
|
||||
else if (CMND_SERIALLOG == command_code) {
|
||||
if ((payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) {
|
||||
Settings.seriallog_level = payload;
|
||||
seriallog_level = payload;
|
||||
seriallog_timer = 0;
|
||||
Settings.flag.mqtt_serial = 0;
|
||||
SetSeriallog(payload);
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE_ACTIVE_NVALUE, command, Settings.seriallog_level, seriallog_level);
|
||||
}
|
||||
|
@ -1016,7 +1054,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
|
|||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, GetStateText(bitRead(Settings.ledstate, 3)));
|
||||
}
|
||||
else if (CMND_LEDSTATE ==command_code) {
|
||||
else if (CMND_LEDSTATE == command_code) {
|
||||
if ((payload >= 0) && (payload < MAX_LED_OPTION)) {
|
||||
Settings.ledstate = payload;
|
||||
if (!Settings.ledstate) SetLedPower(0);
|
||||
|
@ -1204,6 +1242,7 @@ void ExecuteCommand(char *cmnd)
|
|||
void PublishStatus(uint8_t payload)
|
||||
{
|
||||
uint8_t option = 1;
|
||||
char stemp[MAX_FRIENDLYNAMES * (sizeof(Settings.friendlyname[0]) +4)];
|
||||
|
||||
// Workaround MQTT - TCP/IP stack queueing when SUB_PREFIX = PUB_PREFIX
|
||||
if (!strcmp(Settings.mqtt_prefix[0],Settings.mqtt_prefix[1]) && (!payload)) option++;
|
||||
|
@ -1212,14 +1251,19 @@ void PublishStatus(uint8_t payload)
|
|||
if (!energy_flg && (9 == payload)) payload = 99;
|
||||
|
||||
if ((0 == payload) || (99 == payload)) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS "\":{\"" D_CMND_MODULE "\":%d,\"" D_CMND_FRIENDLYNAME "\":\"%s\",\"" D_CMND_TOPIC "\":\"%s\",\"" D_CMND_BUTTONTOPIC "\":\"%s\",\"" D_CMND_POWER "\":%d,\"" D_CMND_POWERONSTATE "\":%d,\"" D_CMND_LEDSTATE "\":%d,\"" D_CMND_SAVEDATA "\":%d,\"" D_JSON_SAVESTATE "\":%d,\"" D_CMND_BUTTONRETAIN "\":%d,\"" D_CMND_POWERRETAIN "\":%d}}"),
|
||||
Settings.module +1, Settings.friendlyname[0], mqtt_topic, Settings.button_topic, power, Settings.poweronstate, Settings.ledstate, Settings.save_data, Settings.flag.save_state, Settings.flag.mqtt_button_retain, Settings.flag.mqtt_power_retain);
|
||||
uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present;
|
||||
stemp[0] = '\0';
|
||||
for (byte i = 0; i < maxfn; i++) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("%s%s\"%s\"" ), stemp, (i > 0 ? "," : ""), Settings.friendlyname[i]);
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS "\":{\"" D_CMND_MODULE "\":%d,\"" D_CMND_FRIENDLYNAME "\":[%s],\"" D_CMND_TOPIC "\":\"%s\",\"" D_CMND_BUTTONTOPIC "\":\"%s\",\"" D_CMND_POWER "\":%d,\"" D_CMND_POWERONSTATE "\":%d,\"" D_CMND_LEDSTATE "\":%d,\"" D_CMND_SAVEDATA "\":%d,\"" D_JSON_SAVESTATE "\":%d,\"" D_CMND_BUTTONRETAIN "\":%d,\"" D_CMND_POWERRETAIN "\":%d}}"),
|
||||
Settings.module +1, stemp, mqtt_topic, Settings.button_topic, power, Settings.poweronstate, Settings.ledstate, Settings.save_data, Settings.flag.save_state, Settings.flag.mqtt_button_retain, Settings.flag.mqtt_power_retain);
|
||||
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS));
|
||||
}
|
||||
|
||||
if ((0 == payload) || (1 == payload)) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS1_PARAMETER "\":{\"" D_JSON_BAUDRATE "\":%d,\"" D_CMND_GROUPTOPIC "\":\"%s\",\"" D_CMND_OTAURL "\":\"%s\",\"" D_JSON_UPTIME "\":\"%s\",\"" D_JSON_STARTUPUTC "\":\"%s\",\"" D_CMND_SLEEP "\":%d,\"" D_JSON_BOOTCOUNT "\":%d,\"" D_JSON_SAVECOUNT "\":%d,\"" D_JSON_SAVEADDRESS "\":\"%X\"}}"),
|
||||
baudrate, Settings.mqtt_grptopic, Settings.ota_url, GetDateAndTime(DT_UPTIME).c_str(), GetDateAndTime(DT_RESTART).c_str(), Settings.sleep, Settings.bootcount, Settings.save_flag, GetSettingsAddress());
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS1_PARAMETER "\":{\"" D_JSON_BAUDRATE "\":%d,\"" D_CMND_GROUPTOPIC "\":\"%s\",\"" D_CMND_OTAURL "\":\"%s\",\"" D_JSON_RESTARTREASON "\":\"%s\",\"" D_JSON_UPTIME "\":\"%s\",\"" D_JSON_STARTUPUTC "\":\"%s\",\"" D_CMND_SLEEP "\":%d,\"" D_JSON_BOOTCOUNT "\":%d,\"" D_JSON_SAVECOUNT "\":%d,\"" D_JSON_SAVEADDRESS "\":\"%X\"}}"),
|
||||
baudrate, Settings.mqtt_grptopic, Settings.ota_url, GetResetReason().c_str(), GetDateAndTime(DT_UPTIME).c_str(), GetDateAndTime(DT_RESTART).c_str(), Settings.sleep, Settings.bootcount, Settings.save_flag, GetSettingsAddress());
|
||||
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "1"));
|
||||
}
|
||||
|
||||
|
@ -1230,8 +1274,8 @@ void PublishStatus(uint8_t payload)
|
|||
}
|
||||
|
||||
if ((0 == payload) || (3 == payload)) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS3_LOGGING "\":{\"" D_CMND_SERIALLOG "\":%d,\"" D_CMND_WEBLOG "\":%d,\"" D_CMND_SYSLOG "\":%d,\"" D_CMND_LOGHOST "\":\"%s\",\"" D_CMND_LOGPORT "\":%d,\"" D_CMND_SSID "1\":\"%s\",\"" D_CMND_SSID "2\":\"%s\",\"" D_CMND_TELEPERIOD "\":%d,\"" D_CMND_SETOPTION "\":\"%08X\"}}"),
|
||||
Settings.seriallog_level, Settings.weblog_level, Settings.syslog_level, Settings.syslog_host, Settings.syslog_port, Settings.sta_ssid[0], Settings.sta_ssid[1], Settings.tele_period, Settings.flag.data);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS3_LOGGING "\":{\"" D_CMND_SERIALLOG "\":%d,\"" D_CMND_WEBLOG "\":%d,\"" D_CMND_SYSLOG "\":%d,\"" D_CMND_LOGHOST "\":\"%s\",\"" D_CMND_LOGPORT "\":%d,\"" D_CMND_SSID "\":[\"%s\",\"%s\"],\"" D_CMND_TELEPERIOD "\":%d,\"" D_CMND_SETOPTION "\":[\"%08X\",\"%08X\"]}}"),
|
||||
Settings.seriallog_level, Settings.weblog_level, Settings.syslog_level, Settings.syslog_host, Settings.syslog_port, Settings.sta_ssid[0], Settings.sta_ssid[1], Settings.tele_period, Settings.flag.data, Settings.flag2.data);
|
||||
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "3"));
|
||||
}
|
||||
|
||||
|
@ -1262,8 +1306,8 @@ void PublishStatus(uint8_t payload)
|
|||
|
||||
if (energy_flg) {
|
||||
if ((0 == payload) || (9 == payload)) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS9_MARGIN "\":{\"" D_CMND_POWERLOW "\":%d,\"" D_CMND_POWERHIGH "\":%d,\"" D_CMND_VOLTAGELOW "\":%d,\"" D_CMND_VOLTAGEHIGH "\":%d,\"" D_CMND_CURRENTLOW "\":%d,\"" D_CMND_CURRENTHIGH "\":%d}}"),
|
||||
Settings.energy_min_power, Settings.energy_max_power, Settings.energy_min_voltage, Settings.energy_max_voltage, Settings.energy_min_current, Settings.energy_max_current);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS9_MARGIN "\":{\"" D_CMND_POWERDELTA "\":%d,\"" D_CMND_POWERLOW "\":%d,\"" D_CMND_POWERHIGH "\":%d,\"" D_CMND_VOLTAGELOW "\":%d,\"" D_CMND_VOLTAGEHIGH "\":%d,\"" D_CMND_CURRENTLOW "\":%d,\"" D_CMND_CURRENTHIGH "\":%d}}"),
|
||||
Settings.energy_power_delta, Settings.energy_min_power, Settings.energy_max_power, Settings.energy_min_voltage, Settings.energy_max_voltage, Settings.energy_min_current, Settings.energy_max_current);
|
||||
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "9"));
|
||||
}
|
||||
}
|
||||
|
@ -1288,6 +1332,19 @@ void PublishStatus(uint8_t payload)
|
|||
|
||||
}
|
||||
|
||||
void MqttShowPWMState()
|
||||
{
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"" D_CMND_PWM "\":{"), mqtt_data);
|
||||
bool first = true;
|
||||
for (byte i = 0; i < MAX_PWMS; i++) {
|
||||
if (pin[GPIO_PWM1 + i] < 99) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"" D_CMND_PWM "%d\":%d"), mqtt_data, first ? "" : ",", i+1, Settings.pwm_value[i]);
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
}
|
||||
|
||||
void MqttShowState()
|
||||
{
|
||||
char stemp1[33];
|
||||
|
@ -1306,6 +1363,11 @@ void MqttShowState()
|
|||
}
|
||||
}
|
||||
|
||||
if (pwm_present) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,"), mqtt_data);
|
||||
MqttShowPWMState();
|
||||
}
|
||||
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_JSON_WIFI "\":{\"" D_JSON_AP "\":%d,\"" D_JSON_SSID "\":\"%s\",\"" D_JSON_RSSI "\":%d,\"" D_JSON_APMAC_ADDRESS "\":\"%s\"}}"),
|
||||
mqtt_data, Settings.sta_active +1, Settings.sta_ssid[Settings.sta_active], WifiGetRssiAsQuality(WiFi.RSSI()), WiFi.BSSIDstr().c_str());
|
||||
}
|
||||
|
@ -1846,6 +1908,86 @@ void StateLoop()
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef USE_ARDUINO_OTA
|
||||
/*********************************************************************************************\
|
||||
* Allow updating via the Arduino OTA-protocol.
|
||||
*
|
||||
* - Once started disables current wifi clients and udp
|
||||
* - Perform restart when done to re-init wifi clients
|
||||
\*********************************************************************************************/
|
||||
|
||||
bool arduino_ota_triggered = false;
|
||||
uint16_t arduino_ota_progress_dot_count = 0;
|
||||
|
||||
void ArduinoOTAInit()
|
||||
{
|
||||
ArduinoOTA.setPort(8266);
|
||||
ArduinoOTA.setHostname(Settings.hostname);
|
||||
if (Settings.web_password[0] !=0) ArduinoOTA.setPassword(Settings.web_password);
|
||||
|
||||
ArduinoOTA.onStart([]()
|
||||
{
|
||||
SettingsSave(1); // Free flash for OTA update
|
||||
#ifdef USE_WEBSERVER
|
||||
if (Settings.webserver) StopWebserver();
|
||||
#endif // USE_WEBSERVER
|
||||
#ifdef USE_ARILUX_RF
|
||||
AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine
|
||||
#endif // USE_ARILUX_RF
|
||||
if (Settings.flag.mqtt_enabled) MqttDisconnect();
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPLOAD "Arduino OTA " D_UPLOAD_STARTED));
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
arduino_ota_triggered = true;
|
||||
arduino_ota_progress_dot_count = 0;
|
||||
delay(100); // Allow time for message xfer
|
||||
});
|
||||
|
||||
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
|
||||
{
|
||||
if ((LOG_LEVEL_DEBUG <= seriallog_level)) {
|
||||
arduino_ota_progress_dot_count++;
|
||||
Serial.printf(".");
|
||||
if (!(arduino_ota_progress_dot_count % 80)) Serial.println();
|
||||
}
|
||||
});
|
||||
|
||||
ArduinoOTA.onError([](ota_error_t error)
|
||||
{
|
||||
/*
|
||||
From ArduinoOTA.h:
|
||||
typedef enum { OTA_AUTH_ERROR, OTA_BEGIN_ERROR, OTA_CONNECT_ERROR, OTA_RECEIVE_ERROR, OTA_END_ERROR } ota_error_t;
|
||||
*/
|
||||
char error_str[100];
|
||||
|
||||
if ((LOG_LEVEL_DEBUG <= seriallog_level) && arduino_ota_progress_dot_count) Serial.println();
|
||||
switch (error) {
|
||||
case OTA_BEGIN_ERROR: strncpy_P(error_str, PSTR(D_UPLOAD_ERR_2), sizeof(error_str)); break;
|
||||
case OTA_RECEIVE_ERROR: strncpy_P(error_str, PSTR(D_UPLOAD_ERR_5), sizeof(error_str)); break;
|
||||
case OTA_END_ERROR: strncpy_P(error_str, PSTR(D_UPLOAD_ERR_7), sizeof(error_str)); break;
|
||||
default:
|
||||
snprintf_P(error_str, sizeof(error_str), PSTR(D_UPLOAD_ERROR_CODE " %d"), error);
|
||||
}
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPLOAD "Arduino OTA %s. " D_RESTARTING), error_str);
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
delay(100); // Allow time for message xfer
|
||||
ESP.restart();
|
||||
});
|
||||
|
||||
ArduinoOTA.onEnd([]()
|
||||
{
|
||||
if ((LOG_LEVEL_DEBUG <= seriallog_level)) Serial.println();
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPLOAD "Arduino OTA " D_SUCCESSFUL ". " D_RESTARTING));
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
delay(100); // Allow time for message xfer
|
||||
ESP.restart();
|
||||
});
|
||||
|
||||
ArduinoOTA.begin();
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPLOAD "Arduino OTA " D_ENABLED " " D_PORT " 8266"));
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
}
|
||||
#endif // USE_ARDUINO_OTA
|
||||
|
||||
/********************************************************************************************/
|
||||
|
||||
void SerialInput()
|
||||
|
@ -1905,38 +2047,60 @@ void SerialInput()
|
|||
Serial.flush();
|
||||
return;
|
||||
}
|
||||
if (isprint(serial_in_byte)) {
|
||||
if (serial_in_byte_counter < INPUT_BUFFER_SIZE) { // add char to string if it still fits
|
||||
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
|
||||
} else {
|
||||
serial_in_byte_counter = 0;
|
||||
if (!Settings.flag.mqtt_serial) {
|
||||
if (isprint(serial_in_byte)) {
|
||||
if (serial_in_byte_counter < INPUT_BUFFER_SIZE -1) { // add char to string if it still fits
|
||||
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
|
||||
} else {
|
||||
serial_in_byte_counter = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (serial_in_byte) {
|
||||
if ((serial_in_byte_counter < INPUT_BUFFER_SIZE -1) && (serial_in_byte != Settings.serial_delimiter)) { // add char to string if it still fits
|
||||
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
|
||||
serial_polling_window = millis();
|
||||
} else {
|
||||
serial_polling_window = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------------------------*\
|
||||
* Sonoff SC 19200 baud serial interface
|
||||
\*-------------------------------------------------------------------------------------------*/
|
||||
if (serial_in_byte == '\x1B') { // Sonoff SC status from ATMEGA328P
|
||||
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
|
||||
SonoffScSerialInput(serial_in_buffer);
|
||||
serial_in_byte_counter = 0;
|
||||
Serial.flush();
|
||||
return;
|
||||
if (SONOFF_SC == Settings.module) {
|
||||
if (serial_in_byte == '\x1B') { // Sonoff SC status from ATMEGA328P
|
||||
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
|
||||
SonoffScSerialInput(serial_in_buffer);
|
||||
serial_in_byte_counter = 0;
|
||||
Serial.flush();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------------------------*/
|
||||
|
||||
else if (serial_in_byte == '\n') {
|
||||
else if (!Settings.flag.mqtt_serial && (serial_in_byte == '\n')) {
|
||||
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
|
||||
seriallog_level = (Settings.seriallog_level < LOG_LEVEL_INFO) ? (byte)LOG_LEVEL_INFO : Settings.seriallog_level;
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_COMMAND "%s"), serial_in_buffer);
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
ExecuteCommand(serial_in_buffer);
|
||||
serial_in_byte_counter = 0;
|
||||
serial_polling_window = 0;
|
||||
Serial.flush();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (Settings.flag.mqtt_serial && serial_in_byte_counter && (millis() > (serial_polling_window + SERIAL_POLLING))) {
|
||||
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_SERIALRECEIVED "\":\"%s\"}"), serial_in_buffer);
|
||||
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SERIALRECEIVED));
|
||||
serial_in_byte_counter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/********************************************************************************************/
|
||||
|
@ -2033,18 +2197,22 @@ void GpioInit()
|
|||
}
|
||||
|
||||
if (SONOFF_BRIDGE == Settings.module) {
|
||||
Settings.flag.mqtt_serial = 0;
|
||||
baudrate = 19200;
|
||||
}
|
||||
|
||||
if (SONOFF_DUAL == Settings.module) {
|
||||
Settings.flag.mqtt_serial = 0;
|
||||
devices_present = 2;
|
||||
baudrate = 19200;
|
||||
}
|
||||
else if (CH4 == Settings.module) {
|
||||
Settings.flag.mqtt_serial = 0;
|
||||
devices_present = 4;
|
||||
baudrate = 19200;
|
||||
}
|
||||
else if (SONOFF_SC == Settings.module) {
|
||||
Settings.flag.mqtt_serial = 0;
|
||||
devices_present = 0;
|
||||
baudrate = 19200;
|
||||
}
|
||||
|
@ -2141,6 +2309,7 @@ void setup()
|
|||
|
||||
OsWatchInit();
|
||||
|
||||
baudrate = Settings.baudrate * 1200;
|
||||
seriallog_level = Settings.seriallog_level;
|
||||
seriallog_timer = SERIALLOG_TIMER;
|
||||
#ifndef USE_EMULATION
|
||||
|
@ -2227,6 +2396,11 @@ void setup()
|
|||
#endif // BE_MINIMAL
|
||||
|
||||
RtcInit();
|
||||
|
||||
#ifdef USE_ARDUINO_OTA
|
||||
ArduinoOTAInit();
|
||||
#endif // USE_ARDUINO_OTA
|
||||
|
||||
XsnsCall(FUNC_INIT);
|
||||
}
|
||||
|
||||
|
@ -2246,7 +2420,13 @@ void loop()
|
|||
|
||||
if (millis() >= state_loop_timer) StateLoop();
|
||||
|
||||
if (Serial.available()) SerialInput();
|
||||
SerialInput();
|
||||
|
||||
#ifdef USE_ARDUINO_OTA
|
||||
ArduinoOTA.handle();
|
||||
// Once OTA is triggered, only handle that and dont do other stuff. (otherwise it fails)
|
||||
while (arduino_ota_triggered) ArduinoOTA.handle();
|
||||
#endif // USE_ARDUINO_OTA
|
||||
|
||||
// yield(); // yield == delay(0), delay contains yield, auto yield in loop
|
||||
delay(sleep); // https://github.com/esp8266/Arduino/issues/2021
|
||||
|
|
|
@ -63,12 +63,13 @@ void WifiWpsStatusCallback(wps_cb_status status);
|
|||
#define USE_PMS5003 // Add support for PMS5003 and PMS7003 particle concentration sensor (+1k3 code)
|
||||
#define USE_NOVA_SDS // Add support for SDS011 and SDS021 particle concentration sensor (+0k7 code)
|
||||
#define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code)
|
||||
#define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code)
|
||||
#define USE_IR_REMOTE // Send IR remote commands using library IRremoteESP8266 and ArduinoJson (+4k code, 0k3 mem, 48 iram)
|
||||
#define USE_IR_HVAC // Support for HVAC system using IR (+2k code)
|
||||
#define USE_IR_RECEIVE // Support for IR receiver (+5k5 code, 264 iram)
|
||||
#define USE_WS2812 // WS2812 Led string using library NeoPixelBus (+5k code, +1k mem, 232 iram) - Disable by //
|
||||
#ifndef USE_WS2812_CTYPE
|
||||
#define USE_WS2812_CTYPE 1 // WS2812 Color type (0 - RGB, 1 - GRB, 2 - RGBW, 3 - GRBW)
|
||||
#define USE_WS2812_CTYPE NEO_GRB // WS2812 Color type (NEO_RGB, NEO_GRB, NEO_BRG, NEO_RBG, NEO_RGBW, NEO_GRBW)
|
||||
#endif
|
||||
// #define USE_WS2812_DMA // DMA supports only GPIO03 (= Serial RXD) (+1k mem). When USE_WS2812_DMA is enabled expect Exceptions on Pow
|
||||
#define USE_ARILUX_RF // Add support for Arilux RF remote controller (+0k8 code, 252 iram (non 2.3.0))
|
||||
|
@ -145,8 +146,12 @@ void WifiWpsStatusCallback(wps_cb_status status);
|
|||
#define SWITCH_MODE TOGGLE // TOGGLE, FOLLOW or FOLLOW_INV (the wall switch state)
|
||||
#endif
|
||||
|
||||
#ifndef MQTT_FINGERPRINT
|
||||
#define MQTT_FINGERPRINT "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07"
|
||||
#ifndef MQTT_FINGERPRINT1
|
||||
#define MQTT_FINGERPRINT1 "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07"
|
||||
#endif
|
||||
|
||||
#ifndef MQTT_FINGERPRINT2
|
||||
#define MQTT_FINGERPRINT2 "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07"
|
||||
#endif
|
||||
|
||||
#ifndef WS2812_LEDS
|
||||
|
|
|
@ -89,6 +89,8 @@ enum UserSelectablePins {
|
|||
GPIO_BACKLIGHT, // Display backlight control
|
||||
GPIO_PMS5003, // Plantower PMS5003 Serial interface
|
||||
GPIO_SDS0X1, // Nova Fitness SDS011 Serial interface
|
||||
GPIO_SBR_TX, // Serial Bridge Serial interface
|
||||
GPIO_SBR_RX, // Serial Bridge Serial interface
|
||||
GPIO_SENSOR_END };
|
||||
|
||||
// Programmer selectable GPIO functionality offset by user selectable GPIOs
|
||||
|
@ -130,7 +132,8 @@ const char kSensorNames[] PROGMEM =
|
|||
D_SENSOR_PZEM_TX "|" D_SENSOR_PZEM_RX "|"
|
||||
D_SENSOR_SAIR_TX "|" D_SENSOR_SAIR_RX "|"
|
||||
D_SENSOR_SPI_CS "|" D_SENSOR_SPI_DC "|" D_SENSOR_BACKLIGHT "|"
|
||||
D_SENSOR_PMS5003 "|" D_SENSOR_SDS0X1;
|
||||
D_SENSOR_PMS5003 "|" D_SENSOR_SDS0X1 "|"
|
||||
D_SENSOR_SBR_TX "|" D_SENSOR_SBR_RX;
|
||||
|
||||
/********************************************************************************************/
|
||||
|
||||
|
@ -177,6 +180,7 @@ enum SupportedModules {
|
|||
SONOFF_DUAL_R2,
|
||||
ARILUX_LC06,
|
||||
SONOFF_S31,
|
||||
ZENGGE_ZF_WF017,
|
||||
MAXMODULE };
|
||||
|
||||
/********************************************************************************************/
|
||||
|
@ -231,6 +235,7 @@ const uint8_t kNiceList[MAXMODULE] PROGMEM = {
|
|||
ARILUX_LC01,
|
||||
ARILUX_LC06,
|
||||
ARILUX_LC11,
|
||||
ZENGGE_ZF_WF017,
|
||||
HUAFAN_SS,
|
||||
KMC_70011,
|
||||
AILIGHT,
|
||||
|
@ -786,6 +791,19 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
|
|||
GPIO_REL1, // GPIO12 Red Led and Relay (0 = Off, 1 = On)
|
||||
GPIO_LED1_INV, // GPIO13 Green Led (0 = On, 1 = Off)
|
||||
0, 0, 0, 0
|
||||
},
|
||||
{ "Zengge WF017", // Zenggee ZJ-WF017-A (ESP12S)) - https://www.ebay.com/p/Smartphone-Android-IOS-WiFi-Music-Controller-for-RGB-5050-3528-LED-Strip-Light/534446632?_trksid=p2047675.l2644
|
||||
GPIO_KEY1, // GPIO00 Optional Button
|
||||
0,
|
||||
GPIO_USER, // GPIO02 Empty pad
|
||||
0,
|
||||
GPIO_USER, // GPIO04 W2 - PWM5
|
||||
0,
|
||||
0, 0, 0, 0, 0, 0, // Flash connection
|
||||
GPIO_PWM2, // GPIO12 RGB LED Green
|
||||
GPIO_PWM1, // GPIO13 RGB LED Red
|
||||
GPIO_PWM3, // GPIO14 RGB LED Blue
|
||||
0, 0, 0
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -816,20 +834,6 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
|
|||
0, 0
|
||||
}
|
||||
|
||||
{ "Zengge WF017", // Zenggee ZJ-WF017-A (ESP12S)) - https://www.ebay.com/p/Smartphone-Android-IOS-WiFi-Music-Controller-for-RGB-5050-3528-LED-Strip-Light/534446632?_trksid=p2047675.l2644
|
||||
GPIO_KEY1, // GPIO00 Optional Button
|
||||
0,
|
||||
GPIO_USER, // GPIO02 Empty pad
|
||||
0,
|
||||
GPIO_USER, // GPIO04 W2 - PWM5
|
||||
0,
|
||||
0, 0, 0, 0, 0, 0, // Flash connection
|
||||
GPIO_PWM2, // GPIO12 RGB LED Green
|
||||
GPIO_PWM1, // GPIO13 RGB LED Red
|
||||
GPIO_PWM3, // GPIO14 RGB LED Blue
|
||||
0, 0, 0
|
||||
}
|
||||
|
||||
{ "SMPW701E", // SM-PW701E WLAN Socket (#1190)
|
||||
0, 0, 0, 0,
|
||||
GPIO_LED1_INV, // GPIO04 Blue Led (0 = On, 1 = Off)
|
||||
|
|
|
@ -119,7 +119,7 @@ Decoding 14 results
|
|||
0x4021ffb4: snprintf_P(char*, unsigned int, char const*, ...) at C:\Data2\Arduino\arduino-1.8.1-esp-2.3.0\portable\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/pgmspace.cpp line 146
|
||||
0x40201118: atol at C:\Data2\Arduino\arduino-1.8.1-esp-2.3.0\portable\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_noniso.c line 45
|
||||
0x40201128: atoi at C:\Data2\Arduino\arduino-1.8.1-esp-2.3.0\portable\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_noniso.c line 45
|
||||
0x4020fafb: MqttDataCallback(char*, unsigned char*, unsigned int) at R:\Arduino\Work-ESP8266\Theo\sonoff\sonoff-4\sonoff/sonoff.ino line 679 (discriminator 1)
|
||||
0x4020fafb: MqttDataHandler(char*, unsigned char*, unsigned int) at R:\Arduino\Work-ESP8266\Theo\sonoff\sonoff-4\sonoff/sonoff.ino line 679 (discriminator 1)
|
||||
0x4022321b: pp_attach at ?? line ?
|
||||
|
||||
00:00:08 MQTT: tele/sonoff/INFO3 = {"Started":"Fatal exception:28 flag:2 (EXCEPTION) epc1:0x4000bf64 epc2:0x00000000 epc3:0x00000000 excvaddr:0x00000007 depc:0x00000000"}
|
||||
|
@ -197,6 +197,76 @@ char* dtostrfd(double number, unsigned char prec, char *s)
|
|||
return dtostrf(number, 1, prec, s);
|
||||
}
|
||||
|
||||
char* Unescape(char* buffer, uint16_t* size)
|
||||
{
|
||||
uint8_t* read = (uint8_t*)buffer;
|
||||
uint8_t* write = (uint8_t*)buffer;
|
||||
uint16_t start_size = *size;
|
||||
uint16_t end_size = *size;
|
||||
uint8_t che = 0;
|
||||
|
||||
while (start_size > 0) {
|
||||
uint8_t ch = *read++;
|
||||
start_size--;
|
||||
if (ch != '\\') {
|
||||
*write++ = ch;
|
||||
} else {
|
||||
if (start_size > 0) {
|
||||
uint8_t chi = *read++;
|
||||
start_size--;
|
||||
end_size--;
|
||||
switch (chi) {
|
||||
case '\\': che = '\\'; break; // 5C Backslash
|
||||
case 'a': che = '\a'; break; // 07 Bell (Alert)
|
||||
case 'b': che = '\b'; break; // 08 Backspace
|
||||
case 'e': che = '\e'; break; // 1B Escape
|
||||
case 'f': che = '\f'; break; // 0C Formfeed
|
||||
case 'n': che = '\n'; break; // 0A Linefeed (Newline)
|
||||
case 'r': che = '\r'; break; // 0D Carriage return
|
||||
case 's': che = ' '; break; // 20 Space
|
||||
case 't': che = '\t'; break; // 09 Horizontal tab
|
||||
case 'v': che = '\v'; break; // 0B Vertical tab
|
||||
// case '?': che = '\?'; break; // 3F Question mark
|
||||
default : {
|
||||
che = chi;
|
||||
*write++ = ch;
|
||||
end_size++;
|
||||
}
|
||||
}
|
||||
*write++ = che;
|
||||
}
|
||||
}
|
||||
}
|
||||
*size = end_size;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
char* UpperCase(char* dest, const char* source)
|
||||
{
|
||||
char* write = dest;
|
||||
const char* read = source;
|
||||
char ch = '.';
|
||||
|
||||
while (ch != '\0') {
|
||||
ch = *read++;
|
||||
*write++ = toupper(ch);
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
|
||||
char* UpperCase_P(char* dest, const char* source)
|
||||
{
|
||||
char* write = dest;
|
||||
const char* read = source;
|
||||
char ch = '.';
|
||||
|
||||
while (ch != '\0') {
|
||||
ch = pgm_read_byte(read++);
|
||||
*write++ = toupper(ch);
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
|
||||
boolean ParseIp(uint32_t* addr, const char* str)
|
||||
{
|
||||
uint8_t *part = (uint8_t*)addr;
|
||||
|
@ -401,6 +471,7 @@ int GetCommandCode(char* destination, size_t destination_size, const char* needl
|
|||
|
||||
void SetSerialBaudrate(int baudrate)
|
||||
{
|
||||
Settings.baudrate = baudrate / 1200;
|
||||
if (Serial.baudRate() != baudrate) {
|
||||
if (seriallog_level) {
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION D_SET_BAUDRATE_TO " %d"), baudrate);
|
||||
|
@ -427,11 +498,12 @@ uint32_t GetHash(const char *buffer, size_t size)
|
|||
* Wifi
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define WIFI_CONFIG_SEC 180 // seconds before restart
|
||||
#define WIFI_CHECK_SEC 20 // seconds
|
||||
#define WIFI_RETRY_SEC 30 // seconds
|
||||
#define WIFI_CONFIG_SEC 180 // seconds before restart
|
||||
#define WIFI_CHECK_SEC 20 // seconds
|
||||
#define WIFI_RETRY_OFFSET_SEC 20 // seconds
|
||||
|
||||
uint8_t wifi_counter;
|
||||
uint8_t wifi_retry_init;
|
||||
uint8_t wifi_retry;
|
||||
uint8_t wifi_status;
|
||||
uint8_t wps_result;
|
||||
|
@ -599,7 +671,7 @@ void WifiCheckIp()
|
|||
{
|
||||
if ((WL_CONNECTED == WiFi.status()) && (static_cast<uint32_t>(WiFi.localIP()) != 0)) {
|
||||
wifi_counter = WIFI_CHECK_SEC;
|
||||
wifi_retry = WIFI_RETRY_SEC;
|
||||
wifi_retry = wifi_retry_init;
|
||||
AddLog_P((wifi_status != WL_CONNECTED) ? LOG_LEVEL_INFO : LOG_LEVEL_DEBUG_MORE, S_LOG_WIFI, PSTR(D_CONNECTED));
|
||||
if (wifi_status != WL_CONNECTED) {
|
||||
// AddLog_P(LOG_LEVEL_INFO, PSTR("Wifi: Set IP addresses"));
|
||||
|
@ -614,15 +686,15 @@ void WifiCheckIp()
|
|||
case WL_CONNECTED:
|
||||
AddLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_NO_IP_ADDRESS));
|
||||
wifi_status = 0;
|
||||
wifi_retry = WIFI_RETRY_SEC;
|
||||
wifi_retry = wifi_retry_init;
|
||||
break;
|
||||
case WL_NO_SSID_AVAIL:
|
||||
AddLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_AP_NOT_REACHED));
|
||||
if (WIFI_WAIT == Settings.sta_config) {
|
||||
wifi_retry = WIFI_RETRY_SEC;
|
||||
wifi_retry = wifi_retry_init;
|
||||
} else {
|
||||
if (wifi_retry > (WIFI_RETRY_SEC / 2)) {
|
||||
wifi_retry = WIFI_RETRY_SEC / 2;
|
||||
if (wifi_retry > (wifi_retry_init / 2)) {
|
||||
wifi_retry = wifi_retry_init / 2;
|
||||
}
|
||||
else if (wifi_retry) {
|
||||
wifi_retry = 0;
|
||||
|
@ -631,25 +703,25 @@ void WifiCheckIp()
|
|||
break;
|
||||
case WL_CONNECT_FAILED:
|
||||
AddLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_WRONG_PASSWORD));
|
||||
if (wifi_retry > (WIFI_RETRY_SEC / 2)) {
|
||||
wifi_retry = WIFI_RETRY_SEC / 2;
|
||||
if (wifi_retry > (wifi_retry_init / 2)) {
|
||||
wifi_retry = wifi_retry_init / 2;
|
||||
}
|
||||
else if (wifi_retry) {
|
||||
wifi_retry = 0;
|
||||
}
|
||||
break;
|
||||
default: // WL_IDLE_STATUS and WL_DISCONNECTED
|
||||
if (!wifi_retry || ((WIFI_RETRY_SEC / 2) == wifi_retry)) {
|
||||
if (!wifi_retry || ((wifi_retry_init / 2) == wifi_retry)) {
|
||||
AddLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_AP_TIMEOUT));
|
||||
} else {
|
||||
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_WIFI, PSTR(D_ATTEMPTING_CONNECTION));
|
||||
}
|
||||
}
|
||||
if (wifi_retry) {
|
||||
if (WIFI_RETRY_SEC == wifi_retry) {
|
||||
if (wifi_retry_init == wifi_retry) {
|
||||
WifiBegin(3); // Select default SSID
|
||||
}
|
||||
if ((Settings.sta_config != WIFI_WAIT) && ((WIFI_RETRY_SEC / 2) == wifi_retry)) {
|
||||
if ((Settings.sta_config != WIFI_WAIT) && ((wifi_retry_init / 2) == wifi_retry)) {
|
||||
WifiBegin(2); // Select alternate SSID
|
||||
}
|
||||
wifi_counter = 1;
|
||||
|
@ -657,7 +729,7 @@ void WifiCheckIp()
|
|||
} else {
|
||||
WifiConfig(Settings.sta_config);
|
||||
wifi_counter = 1;
|
||||
wifi_retry = WIFI_RETRY_SEC;
|
||||
wifi_retry = wifi_retry_init;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -765,7 +837,8 @@ void WifiConnect()
|
|||
{
|
||||
WiFi.persistent(false); // Solve possible wifi init errors
|
||||
wifi_status = 0;
|
||||
wifi_retry = WIFI_RETRY_SEC;
|
||||
wifi_retry_init = WIFI_RETRY_OFFSET_SEC + ((ESP.getChipId() & 0xF) * 2);
|
||||
wifi_retry = wifi_retry_init;
|
||||
wifi_counter = 1;
|
||||
}
|
||||
|
||||
|
@ -1376,6 +1449,13 @@ boolean Xsns02(byte function)
|
|||
*
|
||||
\*********************************************************************************************/
|
||||
|
||||
void SetSeriallog(byte loglevel)
|
||||
{
|
||||
Settings.seriallog_level = loglevel;
|
||||
seriallog_level = loglevel;
|
||||
seriallog_timer = 0;
|
||||
}
|
||||
|
||||
#ifdef USE_WEBSERVER
|
||||
void GetLog(byte idx, char** entry_pp, size_t* len_p)
|
||||
{
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
\*********************************************************************************************/
|
||||
|
||||
// -- Localization --------------------------------
|
||||
//#define MY_LANGUAGE cs-CZ // Czech in Czech
|
||||
//#define MY_LANGUAGE de-DE // German in Germany
|
||||
//#define MY_LANGUAGE en-GB // English in Great Britain. Enabled by Default
|
||||
//#define MY_LANGUAGE es-AR // Spanish in Argentina
|
||||
|
@ -40,6 +41,7 @@
|
|||
//#define MY_LANGUAGE pt-PT // Portuguese in Portugal
|
||||
//#define MY_LANGUAGE ru-RU // Russian in Russia
|
||||
//#define MY_LANGUAGE zh-CN // Chinese (Simplified) in China
|
||||
//#define MY_LANGUAGE zh-TW // Chinese (Traditional) in Taiwan
|
||||
|
||||
// -- Project -------------------------------------
|
||||
#define PROJECT "sonoff" // PROJECT is used as the default topic delimiter and OTA file name
|
||||
|
@ -71,16 +73,17 @@
|
|||
|
||||
// -- Ota -----------------------------------------
|
||||
#define OTA_URL "http://sonoff.maddox.co.uk/tasmota/sonoff.ino.bin" // [OtaUrl]
|
||||
//#define USE_ARDUINO_OTA // Add optional support for Arduino OTA (+4k5 code)
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Select ONE of possible MQTT library types below
|
||||
\*********************************************************************************************/
|
||||
// Default MQTT driver for both non-TLS and TLS connections. Blocks network if MQTT server is unavailable.
|
||||
#define MQTT_LIBRARY_TYPE 1 // Use PubSubClient library
|
||||
#define MQTT_LIBRARY_TYPE MQTT_PUBSUBCLIENT // Use PubSubClient library
|
||||
// Alternative MQTT driver does not block network when MQTT server is unavailable. No TLS support
|
||||
//#define MQTT_LIBRARY_TYPE 2 // Use TasmotaMqtt library (+4k4 code, +4k mem) - non-TLS only
|
||||
//#define MQTT_LIBRARY_TYPE MQTT_TASMOTAMQTT // Use TasmotaMqtt library (+4k4 code, +4k mem) - non-TLS only
|
||||
// Alternative MQTT driver does not block network when MQTT server is unavailable. No TLS support
|
||||
//#define MQTT_LIBRARY_TYPE 3 // Use (patched) esp-mqtt-arduino library (+4k8 code, +4k mem) - non-TLS only
|
||||
//#define MQTT_LIBRARY_TYPE MQTT_ESPMQTTARDUINO // Use (patched) esp-mqtt-arduino library (+4k8 code, +4k mem) - non-TLS only
|
||||
|
||||
// -- MQTT ----------------------------------------
|
||||
#define MQTT_USE 1 // [SetOption3] Select default MQTT use (0 = Off, 1 = On)
|
||||
|
@ -90,7 +93,8 @@
|
|||
// Needs Fingerprint, TLS Port, UserId and Password
|
||||
#ifdef USE_MQTT_TLS
|
||||
#define MQTT_HOST "" // [MqttHost]
|
||||
#define MQTT_FINGERPRINT "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07" // [MqttFingerprint]
|
||||
#define MQTT_FINGERPRINT1 "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07" // [MqttFingerprint1]
|
||||
#define MQTT_FINGERPRINT2 "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07" // [MqttFingerprint2]
|
||||
#define MQTT_PORT 20123 // [MqttPort] MQTT TLS port
|
||||
#define MQTT_USER "cloudmqttuser" // [MqttUser] Mandatory user
|
||||
#define MQTT_PASS "cloudmqttpassword" // [MqttPassword] Mandatory password
|
||||
|
@ -158,6 +162,8 @@
|
|||
#define NTP_SERVER2 "nl.pool.ntp.org" // [NtpServer2] Select second NTP server by name or IP address (5.39.184.5)
|
||||
#define NTP_SERVER3 "0.nl.pool.ntp.org" // [NtpServer3] Select third NTP server by name or IP address (93.94.224.67)
|
||||
|
||||
#define USE_TIMERS // Add support for up to 16 timers (+2k2 code)
|
||||
|
||||
// -- Time - Start Daylight Saving Time and timezone offset from UTC in minutes
|
||||
#define TIME_DST North, Last, Sun, Mar, 2, +120 // Northern Hemisphere, Last sunday in march at 02:00 +120 minutes
|
||||
|
||||
|
@ -217,6 +223,7 @@
|
|||
#define USE_PMS5003 // Add support for PMS5003 and PMS7003 particle concentration sensor (+1k3 code)
|
||||
#define USE_NOVA_SDS // Add support for SDS011 and SDS021 particle concentration sensor (+0k7 code)
|
||||
#define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code)
|
||||
#define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code)
|
||||
|
||||
// -- Low level interface devices -----------------
|
||||
#define USE_IR_REMOTE // Send IR remote commands using library IRremoteESP8266 and ArduinoJson (+4k code, 0k3 mem, 48 iram)
|
||||
|
@ -224,7 +231,7 @@
|
|||
#define USE_IR_RECEIVE // Support for IR receiver (+5k5 code, 264 iram)
|
||||
|
||||
#define USE_WS2812 // WS2812 Led string using library NeoPixelBus (+5k code, +1k mem, 232 iram) - Disable by //
|
||||
#define USE_WS2812_CTYPE 1 // WS2812 Color type (0 - RGB, 1 - GRB, 2 - RGBW, 3 - GRBW)
|
||||
#define USE_WS2812_CTYPE NEO_GRB // WS2812 Color type (NEO_RGB, NEO_GRB, NEO_BRG, NEO_RBG, NEO_RGBW, NEO_GRBW)
|
||||
// #define USE_WS2812_DMA // DMA supports only GPIO03 (= Serial RXD) (+1k mem). When USE_WS2812_DMA is enabled expect Exceptions on Pow
|
||||
|
||||
#define USE_ARILUX_RF // Add support for Arilux RF remote controller (+0k8 code, 252 iram (non 2.3.0))
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#define STR(x) STR_HELPER(x)
|
||||
|
||||
const char HTTP_HEAD[] PROGMEM =
|
||||
"<!DOCTYPE html><html lang=\"en\" class=\"\">"
|
||||
"<!DOCTYPE html><html lang=\"" D_HTML_LANGUAGE "\" class=\"\">"
|
||||
"<head>"
|
||||
"<meta charset='utf-8'>"
|
||||
"<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,user-scalable=no\"/>"
|
||||
|
|
|
@ -18,23 +18,23 @@
|
|||
*/
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Select ONE of possible MQTT libraries below
|
||||
* Select ONE of possible MQTT library types below
|
||||
\*********************************************************************************************/
|
||||
// Default MQTT driver for both non-TLS and TLS connections. Blocks network if MQTT server is unavailable.
|
||||
//#define MQTT_LIBRARY_TYPE 1 // Use PubSubClient library
|
||||
//#define MQTT_LIBRARY_TYPE MQTT_PUBSUBCLIENT // Use PubSubClient library
|
||||
// Alternative MQTT driver does not block network when MQTT server is unavailable. No TLS support
|
||||
//#define MQTT_LIBRARY_TYPE 2 // Use TasmotaMqtt library (+4k4 code, +4k mem) - non-TLS only
|
||||
//#define MQTT_LIBRARY_TYPE MQTT_TASMOTAMQTT // Use TasmotaMqtt library (+4k4 code, +4k mem) - non-TLS only
|
||||
// Alternative MQTT driver does not block network when MQTT server is unavailable. No TLS support
|
||||
//#define MQTT_LIBRARY_TYPE 3 // Use (patched) esp-mqtt-arduino library (+4k8 code, +4k mem) - non-TLS only
|
||||
//#define MQTT_LIBRARY_TYPE MQTT_ESPMQTTARDUINO // Use (patched) esp-mqtt-arduino library (+4k8 code, +4k mem) - non-TLS only
|
||||
|
||||
#ifdef USE_MQTT_TLS
|
||||
#ifdef MQTT_LIBRARY_TYPE
|
||||
#undef MQTT_LIBRARY_TYPE
|
||||
#endif
|
||||
#define MQTT_LIBRARY_TYPE 1 // Use PubSubClient library as it only supports TLS
|
||||
#define MQTT_LIBRARY_TYPE MQTT_PUBSUBCLIENT // Use PubSubClient library as it only supports TLS
|
||||
#else
|
||||
#ifndef MQTT_LIBRARY_TYPE
|
||||
#define MQTT_LIBRARY_TYPE 1 // Use PubSubClient library as default
|
||||
#define MQTT_LIBRARY_TYPE MQTT_PUBSUBCLIENT // Use PubSubClient library as default
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -63,7 +63,7 @@ bool mqtt_connected = false; // MQTT virtual connection status
|
|||
* void MqttLoop()
|
||||
\*********************************************************************************************/
|
||||
|
||||
#if (1 == MQTT_LIBRARY_TYPE) /*****************************************************************/
|
||||
#if (MQTT_LIBRARY_TYPE == MQTT_PUBSUBCLIENT) /***********************************************/
|
||||
|
||||
#include <PubSubClient.h>
|
||||
|
||||
|
@ -100,7 +100,7 @@ void MqttLoop()
|
|||
MqttClient.loop();
|
||||
}
|
||||
|
||||
#elif (2 == MQTT_LIBRARY_TYPE) /*****************************************************************/
|
||||
#elif (MQTT_LIBRARY_TYPE == MQTT_TASMOTAMQTT) /**********************************************/
|
||||
|
||||
#include <TasmotaMqtt.h>
|
||||
TasmotaMqtt MqttClient;
|
||||
|
@ -134,7 +134,7 @@ void MqttLoop()
|
|||
{
|
||||
}
|
||||
|
||||
#elif (3 == MQTT_LIBRARY_TYPE) /***************************************************************/
|
||||
#elif (MQTT_LIBRARY_TYPE == MQTT_ESPMQTTARDUINO) /*******************************************/
|
||||
|
||||
#include <MQTT.h>
|
||||
MQTT *MqttClient = NULL;
|
||||
|
@ -376,19 +376,33 @@ void MqttConnected()
|
|||
#ifdef USE_MQTT_TLS
|
||||
boolean MqttCheckTls()
|
||||
{
|
||||
char fingerprint1[60];
|
||||
char fingerprint2[60];
|
||||
boolean result = false;
|
||||
|
||||
fingerprint1[0] = '\0';
|
||||
fingerprint2[0] = '\0';
|
||||
for (byte i = 0; i < sizeof(Settings.mqtt_fingerprint[0]); i++) {
|
||||
snprintf_P(fingerprint1, sizeof(fingerprint1), PSTR("%s%s%02X"), fingerprint1, (i) ? " " : "", Settings.mqtt_fingerprint[0][i]);
|
||||
snprintf_P(fingerprint2, sizeof(fingerprint2), PSTR("%s%s%02X"), fingerprint2, (i) ? " " : "", Settings.mqtt_fingerprint[1][i]);
|
||||
}
|
||||
|
||||
AddLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR(D_FINGERPRINT));
|
||||
if (!EspClient.connect(Settings.mqtt_host, Settings.mqtt_port)) {
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MQTT D_TLS_CONNECT_FAILED_TO " %s:%d. " D_RETRY_IN " %d " D_UNIT_SECOND),
|
||||
Settings.mqtt_host, Settings.mqtt_port, mqtt_retry_counter);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
} else if (!EspClient.verify(Settings.mqtt_fingerprint, Settings.mqtt_host)) {
|
||||
AddLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR(D_INSECURE));
|
||||
} else {
|
||||
AddLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR(D_VERIFIED));
|
||||
result = true;
|
||||
if (EspClient.verify(fingerprint1, Settings.mqtt_host)) {
|
||||
AddLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR(D_VERIFIED "1"));
|
||||
result = true;
|
||||
}
|
||||
else if (EspClient.verify(fingerprint2, Settings.mqtt_host)) {
|
||||
AddLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR(D_VERIFIED "2"));
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
if (!result) AddLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR(D_FAILED));
|
||||
EspClient.stop();
|
||||
yield();
|
||||
return result;
|
||||
|
@ -436,14 +450,14 @@ void MqttReconnect()
|
|||
if (!MqttCheckTls()) return;
|
||||
#endif // USE_MQTT_TLS
|
||||
|
||||
#if (2 == MQTT_LIBRARY_TYPE)
|
||||
#if (MQTT_LIBRARY_TYPE == MQTT_TASMOTAMQTT)
|
||||
MqttClient.InitConnection(Settings.mqtt_host, Settings.mqtt_port);
|
||||
MqttClient.InitClient(mqtt_client, mqtt_user, mqtt_pwd, MQTT_KEEPALIVE);
|
||||
MqttClient.InitLWT(stopic, mqtt_data, 1, true);
|
||||
MqttClient.OnConnected(MqttConnected);
|
||||
MqttClient.OnDisconnected(MqttDisconnectedCb);
|
||||
MqttClient.OnData(MqttDataHandler);
|
||||
#elif (3 == MQTT_LIBRARY_TYPE)
|
||||
#elif (MQTT_LIBRARY_TYPE == MQTT_ESPMQTTARDUINO)
|
||||
MqttClient = new MQTT(mqtt_client, Settings.mqtt_host, Settings.mqtt_port, stopic, 1, true, mqtt_data);
|
||||
MqttClient->setUserPwd(mqtt_user, mqtt_pwd);
|
||||
MqttClient->onConnected(MqttConnected);
|
||||
|
@ -454,7 +468,7 @@ void MqttReconnect()
|
|||
mqtt_initial_connection_state = 1;
|
||||
}
|
||||
|
||||
#if (1 == MQTT_LIBRARY_TYPE)
|
||||
#if (MQTT_LIBRARY_TYPE == MQTT_PUBSUBCLIENT)
|
||||
MqttClient.setCallback(MqttDataHandler);
|
||||
MqttClient.setServer(Settings.mqtt_host, Settings.mqtt_port);
|
||||
if (MqttClient.connect(mqtt_client, mqtt_user, mqtt_pwd, stopic, 1, true, mqtt_data)) {
|
||||
|
@ -462,9 +476,9 @@ void MqttReconnect()
|
|||
} else {
|
||||
MqttDisconnected(MqttClient.state()); // status codes are documented here http://pubsubclient.knolleary.net/api.html#state
|
||||
}
|
||||
#elif (2 == MQTT_LIBRARY_TYPE)
|
||||
#elif (MQTT_LIBRARY_TYPE == MQTT_TASMOTAMQTT)
|
||||
MqttClient.Connect();
|
||||
#elif (3 == MQTT_LIBRARY_TYPE)
|
||||
#elif (MQTT_LIBRARY_TYPE == MQTT_ESPMQTTARDUINO)
|
||||
MqttClient->connect();
|
||||
#endif // MQTT_LIBRARY_TYPE
|
||||
}
|
||||
|
@ -534,12 +548,22 @@ bool MqttCommand()
|
|||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, GetStateText(index -1));
|
||||
}
|
||||
#ifdef USE_MQTT_TLS
|
||||
else if (CMND_MQTTFINGERPRINT == command_code) {
|
||||
if ((data_len > 0) && (data_len < sizeof(Settings.mqtt_fingerprint))) {
|
||||
strlcpy(Settings.mqtt_fingerprint, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_FINGERPRINT : dataBuf, sizeof(Settings.mqtt_fingerprint));
|
||||
else if ((CMND_MQTTFINGERPRINT == command_code) && (index > 0) && (index <= 2)) {
|
||||
char fingerprint[60];
|
||||
if ((data_len > 0) && (data_len < sizeof(fingerprint))) {
|
||||
strlcpy(fingerprint, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? (1 == index) ? MQTT_FINGERPRINT1 : MQTT_FINGERPRINT2 : dataBuf, sizeof(fingerprint));
|
||||
char *p = fingerprint;
|
||||
for (byte i = 0; i < 20; i++) {
|
||||
Settings.mqtt_fingerprint[index -1][i] = strtol(p, &p, 16);
|
||||
}
|
||||
restart_flag = 2;
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.mqtt_fingerprint);
|
||||
|
||||
fingerprint[0] = '\0';
|
||||
for (byte i = 0; i < sizeof(Settings.mqtt_fingerprint[index -1]); i++) {
|
||||
snprintf_P(fingerprint, sizeof(fingerprint), PSTR("%s%s%02X"), fingerprint, (i) ? " " : "", Settings.mqtt_fingerprint[index -1][i]);
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, fingerprint);
|
||||
}
|
||||
#endif
|
||||
else if ((CMND_MQTTCLIENT == command_code) && !grpflg) {
|
||||
|
|
|
@ -55,10 +55,12 @@
|
|||
|
||||
enum LightCommands {
|
||||
CMND_COLOR, CMND_COLORTEMPERATURE, CMND_DIMMER, CMND_LED, CMND_LEDTABLE, CMND_FADE,
|
||||
CMND_PIXELS, CMND_SCHEME, CMND_SPEED, CMND_WAKEUP, CMND_WAKEUPDURATION, CMND_WIDTH, CMND_UNDOCA };
|
||||
CMND_PIXELS, CMND_ROTATION, CMND_SCHEME, CMND_SPEED, CMND_WAKEUP, CMND_WAKEUPDURATION,
|
||||
CMND_WIDTH, CMND_CHANNEL, CMND_HSBCOLOR, CMND_UNDOCA };
|
||||
const char kLightCommands[] PROGMEM =
|
||||
D_CMND_COLOR "|" D_CMND_COLORTEMPERATURE "|" D_CMND_DIMMER "|" D_CMND_LED "|" D_CMND_LEDTABLE "|" D_CMND_FADE "|"
|
||||
D_CMND_PIXELS "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|" D_CMND_WIDTH "|UNDOCA" ;
|
||||
D_CMND_PIXELS "|" D_CMND_ROTATION "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|"
|
||||
D_CMND_WIDTH "|" D_CMND_CHANNEL "|" D_CMND_HSBCOLOR "|UNDOCA" ;
|
||||
|
||||
struct LRgbColor {
|
||||
uint8_t R, G, B;
|
||||
|
@ -376,7 +378,7 @@ void LightInit()
|
|||
}
|
||||
#ifdef USE_WS2812 // ************************************************************************
|
||||
else if (LT_WS2812 == light_type) {
|
||||
#if (USE_WS2812_CTYPE > 1)
|
||||
#if (USE_WS2812_CTYPE > NEO_3LED)
|
||||
light_subtype++; // from RGB to RGBW
|
||||
#endif
|
||||
Ws2812Init();
|
||||
|
@ -535,6 +537,8 @@ void LightState(uint8_t append)
|
|||
{
|
||||
char scolor[25];
|
||||
char scommand[33];
|
||||
float hsb[3];
|
||||
int16_t h,s,b;
|
||||
|
||||
if (append) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,"), mqtt_data);
|
||||
|
@ -546,6 +550,19 @@ void LightState(uint8_t append)
|
|||
mqtt_data, scommand, GetStateText(light_power), Settings.light_dimmer);
|
||||
if (light_subtype > LST_SINGLE) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_COLOR "\":\"%s\""), mqtt_data, LightGetColor(0, scolor));
|
||||
// Add status for HSB
|
||||
LightGetHsb(&hsb[0],&hsb[1],&hsb[2]);
|
||||
// Scale these percentages up to the numbers expected byt he client
|
||||
h = round(hsb[0] * 360);
|
||||
s = round(hsb[1] * 100);
|
||||
b = round(hsb[2] * 100);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_HSBCOLOR "\":\"%d,%d,%d\""), mqtt_data, h,s,b);
|
||||
// Add status for each channel
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_CHANNEL "\":[" ), mqtt_data);
|
||||
for (byte i = 0; i < light_subtype; i++) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s%d" ), mqtt_data, (i > 0 ? "," : ""), round(light_current_color[i]/2.55));
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s]" ), mqtt_data);
|
||||
}
|
||||
if ((LST_COLDWARM == light_subtype) || (LST_RGBWC == light_subtype)) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_COLORTEMPERATURE "\":%d"), mqtt_data, LightGetColorTemp());
|
||||
|
@ -1018,7 +1035,7 @@ boolean LightCommand()
|
|||
char option = (1 == XdrvMailbox.data_len) ? XdrvMailbox.data[0] : '\0';
|
||||
|
||||
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kLightCommands);
|
||||
if ((CMND_COLOR == command_code) && (light_subtype > LST_SINGLE) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) {
|
||||
if ((CMND_COLOR == command_code) && (light_subtype > LST_SINGLE) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 6)) {
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
valid_entry = LightColorEntry(XdrvMailbox.data, XdrvMailbox.data_len);
|
||||
if (valid_entry) {
|
||||
|
@ -1031,7 +1048,7 @@ boolean LightCommand()
|
|||
}
|
||||
Settings.light_scheme = 0;
|
||||
coldim = true;
|
||||
} else { // Color3, 4 and 5
|
||||
} else { // Color3, 4, 5 and 6
|
||||
for (byte i = 0; i < LST_RGB; i++) {
|
||||
Settings.ws_color[XdrvMailbox.index -3][i] = light_entry_color[i];
|
||||
}
|
||||
|
@ -1053,6 +1070,47 @@ boolean LightCommand()
|
|||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, XdrvMailbox.index, scolor);
|
||||
}
|
||||
}
|
||||
else if ((CMND_CHANNEL == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= light_subtype ) ) {
|
||||
// Set "Channel" directly - this allows Color and Direct PWM control to coexist
|
||||
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
|
||||
uint8_t level = XdrvMailbox.payload;
|
||||
light_current_color[XdrvMailbox.index-1] = round(level * 2.55);
|
||||
LightSetColor();
|
||||
coldim = true;
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_NVALUE, command, XdrvMailbox.index, round(light_current_color[XdrvMailbox.index -1] / 2.55));
|
||||
}
|
||||
else if ((CMND_HSBCOLOR == command_code) && ( light_subtype >= LST_RGB)) {
|
||||
// Implement method to "direct set" color by HSB (HSB is passed comma separated, 0<H<360 0<S<100 0<B<100 )
|
||||
uint16_t HSB[3];
|
||||
bool validHSB = true;
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
char *substr;
|
||||
|
||||
if (0 == i) {
|
||||
substr = strtok(XdrvMailbox.data, ",");
|
||||
} else {
|
||||
substr = strtok(NULL, ",");
|
||||
}
|
||||
if (substr != NULL) {
|
||||
HSB[i] = atoi(substr);
|
||||
} else {
|
||||
validHSB = false;
|
||||
}
|
||||
}
|
||||
if (validHSB) {
|
||||
// Translate to fractional elements as required by LightHsbToRgb
|
||||
// Keep the results <=1 in the event someone passes something
|
||||
// out of range.
|
||||
LightSetHsb(( (HSB[0]>360) ? (HSB[0] % 360) : HSB[0] ) /360.0,
|
||||
( (HSB[1]>100) ? (HSB[1] % 100) : HSB[1] ) /100.0,
|
||||
( (HSB[2]>100) ? (HSB[2] % 100) : HSB[2] ) /100.0,
|
||||
0);
|
||||
} else {
|
||||
LightState(0);
|
||||
}
|
||||
}
|
||||
#ifdef USE_WS2812 // ***********************************************************************
|
||||
else if ((CMND_LED == command_code) && (LT_WS2812 == light_type) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= Settings.light_pixels)) {
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
|
@ -1065,11 +1123,18 @@ boolean LightCommand()
|
|||
else if ((CMND_PIXELS == command_code) && (LT_WS2812 == light_type)) {
|
||||
if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= WS2812_MAX_LEDS)) {
|
||||
Settings.light_pixels = XdrvMailbox.payload;
|
||||
Settings.light_rotation = 0;
|
||||
Ws2812Clear();
|
||||
light_update = 1;
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.light_pixels);
|
||||
}
|
||||
else if ((CMND_ROTATION == command_code) && (LT_WS2812 == light_type)) {
|
||||
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < Settings.light_pixels)) {
|
||||
Settings.light_rotation = XdrvMailbox.payload;
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.light_rotation);
|
||||
}
|
||||
else if ((CMND_WIDTH == command_code) && (LT_WS2812 == light_type) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 4)) {
|
||||
if (1 == XdrvMailbox.index) {
|
||||
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 4)) {
|
||||
|
|
|
@ -29,12 +29,14 @@
|
|||
enum EnergyHardware { ENERGY_NONE, ENERGY_HLW8012, ENERGY_CSE7766, ENERGY_PZEM004T };
|
||||
|
||||
enum EnergyCommands {
|
||||
CMND_POWERDELTA,
|
||||
CMND_POWERLOW, CMND_POWERHIGH, CMND_VOLTAGELOW, CMND_VOLTAGEHIGH, CMND_CURRENTLOW, CMND_CURRENTHIGH,
|
||||
CMND_POWERCAL, CMND_POWERSET, CMND_VOLTAGECAL, CMND_VOLTAGESET, CMND_CURRENTCAL, CMND_CURRENTSET,
|
||||
CMND_ENERGYRESET, CMND_MAXENERGY, CMND_MAXENERGYSTART,
|
||||
CMND_MAXPOWER, CMND_MAXPOWERHOLD, CMND_MAXPOWERWINDOW,
|
||||
CMND_SAFEPOWER, CMND_SAFEPOWERHOLD, CMND_SAFEPOWERWINDOW };
|
||||
const char kEnergyCommands[] PROGMEM =
|
||||
D_CMND_POWERDELTA "|"
|
||||
D_CMND_POWERLOW "|" D_CMND_POWERHIGH "|" D_CMND_VOLTAGELOW "|" D_CMND_VOLTAGEHIGH "|" D_CMND_CURRENTLOW "|" D_CMND_CURRENTHIGH "|"
|
||||
D_CMND_POWERCAL "|" D_CMND_POWERSET "|" D_CMND_VOLTAGECAL "|" D_CMND_VOLTAGESET "|" D_CMND_CURRENTCAL "|" D_CMND_CURRENTSET "|"
|
||||
D_CMND_ENERGYRESET "|" D_CMND_MAXENERGY "|" D_CMND_MAXENERGYSTART "|"
|
||||
|
@ -51,6 +53,9 @@ float energy_start = 0; // 12345.12345 kWh total previous
|
|||
unsigned long energy_kWhtoday; // 1212312345 Wh * 10^-5 (deca micro Watt hours) - 5763924 = 0.05763924 kWh = 0.058 kWh = energy_daily
|
||||
unsigned long energy_period = 0; // 1212312345 Wh * 10^-5 (deca micro Watt hours) - 5763924 = 0.05763924 kWh = 0.058 kWh = energy_daily
|
||||
|
||||
float energy_power_last[3] = { 0 };
|
||||
uint8_t energy_power_delta = 0;
|
||||
|
||||
bool energy_power_on = true;
|
||||
|
||||
byte energy_min_power_flag = 0;
|
||||
|
@ -264,6 +269,7 @@ uint8_t cse_receive_flag = 0;
|
|||
long voltage_cycle = 0;
|
||||
long current_cycle = 0;
|
||||
long power_cycle = 0;
|
||||
unsigned long power_cycle_first = 0;
|
||||
long cf_pulses = 0;
|
||||
long cf_pulses_last_time = CSE_PULSES_NOT_INITIALIZED;
|
||||
|
||||
|
@ -314,9 +320,6 @@ void CseReceived()
|
|||
power_cycle = serial_in_buffer[17] << 16 | serial_in_buffer[18] << 8 | serial_in_buffer[19];
|
||||
cf_pulses = serial_in_buffer[21] << 8 | serial_in_buffer[22];
|
||||
|
||||
// if (adjustement & 0x80) { // CF overflow
|
||||
// cf_pulses += 0x10000;
|
||||
// }
|
||||
if (energy_power_on) { // Powered on
|
||||
if (adjustement & 0x40) { // Voltage valid
|
||||
energy_voltage = (float)(Settings.energy_voltage_calibration * CSE_UREF) / (float)voltage_cycle;
|
||||
|
@ -325,9 +328,16 @@ void CseReceived()
|
|||
if ((header & 0xF2) == 0xF2) { // Power cycle exceeds range
|
||||
energy_power = 0;
|
||||
} else {
|
||||
energy_power = (float)(Settings.energy_power_calibration * CSE_PREF) / (float)power_cycle;
|
||||
if (0 == power_cycle_first) power_cycle_first = power_cycle; // Skip first incomplete power_cycle
|
||||
if (power_cycle_first != power_cycle) {
|
||||
power_cycle_first = -1;
|
||||
energy_power = (float)(Settings.energy_power_calibration * CSE_PREF) / (float)power_cycle;
|
||||
} else {
|
||||
energy_power = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
power_cycle_first = 0;
|
||||
energy_power = 0; // Powered on but no load
|
||||
}
|
||||
if (adjustement & 0x20) { // Current valid
|
||||
|
@ -338,6 +348,7 @@ void CseReceived()
|
|||
}
|
||||
}
|
||||
} else { // Powered off
|
||||
power_cycle_first = 0;
|
||||
energy_voltage = 0;
|
||||
energy_power = 0;
|
||||
energy_current = 0;
|
||||
|
@ -638,6 +649,20 @@ void EnergyMarginCheck()
|
|||
return;
|
||||
}
|
||||
|
||||
if (Settings.energy_power_delta) {
|
||||
float delta = abs(energy_power_last[0] - energy_power);
|
||||
// Any delta compared to minimal delta
|
||||
float min_power = (energy_power_last[0] > energy_power) ? energy_power : energy_power_last[0];
|
||||
if (((delta / min_power) * 100) > Settings.energy_power_delta) {
|
||||
energy_power_delta = 1;
|
||||
energy_power_last[1] = energy_power; // We only want one report so reset history
|
||||
energy_power_last[2] = energy_power;
|
||||
}
|
||||
}
|
||||
energy_power_last[0] = energy_power_last[1]; // Shift in history every second allowing power changes to settle for up to three seconds
|
||||
energy_power_last[1] = energy_power_last[2];
|
||||
energy_power_last[2] = energy_power;
|
||||
|
||||
if (energy_power_on && (Settings.energy_min_power || Settings.energy_max_power || Settings.energy_min_voltage || Settings.energy_max_voltage || Settings.energy_min_current || Settings.energy_max_current)) {
|
||||
energy_power_u = (uint16_t)(energy_power);
|
||||
energy_voltage_u = (uint16_t)(energy_voltage);
|
||||
|
@ -743,6 +768,8 @@ void EnergyMarginCheck()
|
|||
}
|
||||
}
|
||||
#endif // FEATURE_POWER_LIMIT
|
||||
|
||||
if (energy_power_delta) EnergyMqttShow();
|
||||
}
|
||||
|
||||
void EnergyMqttShow()
|
||||
|
@ -752,6 +779,7 @@ void EnergyMqttShow()
|
|||
EnergyShow(1);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_ENERGY), Settings.flag.mqtt_sensor_retain);
|
||||
energy_power_delta = 0;
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
|
@ -768,7 +796,14 @@ boolean EnergyCommand()
|
|||
unsigned long nvalue = 0;
|
||||
|
||||
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kEnergyCommands);
|
||||
if (CMND_POWERLOW == command_code) {
|
||||
if (CMND_POWERDELTA == command_code) {
|
||||
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 101)) {
|
||||
Settings.energy_power_delta = (1 == XdrvMailbox.payload) ? DEFAULT_POWER_DELTA : XdrvMailbox.payload;
|
||||
}
|
||||
nvalue = Settings.energy_power_delta;
|
||||
unit = UNIT_PERCENTAGE;
|
||||
}
|
||||
else if (CMND_POWERLOW == command_code) {
|
||||
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 3601)) {
|
||||
Settings.energy_min_power = XdrvMailbox.payload;
|
||||
}
|
||||
|
|
|
@ -53,24 +53,7 @@ const char HASS_DISCOVER_LIGHT_SCHEME[] PROGMEM =
|
|||
"%s,\"effect_command_topic\":\"%s\"," // cmnd/led2/Scheme
|
||||
"\"effect_state_topic\":\"%s\"," // stat/led2/RESULT
|
||||
"\"effect_value_template\":\"{{value_json." D_CMND_SCHEME "}}\","
|
||||
"\"effect_list\":\"[0, 1, 2, 3, 4]\""; // Needs to be a Python string list providing Scheme parameter values (Unable to get this functional)
|
||||
*/
|
||||
/*
|
||||
#1690 - investigate
|
||||
effect_list:
|
||||
- 0
|
||||
- 1
|
||||
- 2
|
||||
- 3
|
||||
- 4
|
||||
- 5
|
||||
- 6
|
||||
- 7
|
||||
- 8
|
||||
- 9
|
||||
- 10
|
||||
- 11
|
||||
- 12
|
||||
"\"effect_list\":[\"0\",\"1\",\"2\",\"3\",\"4\"]"; // string list with reference to scheme parameter. Currently only supports numbers 0 to 11 as it make the mqtt string too long
|
||||
*/
|
||||
void HAssDiscovery()
|
||||
{
|
||||
|
@ -93,9 +76,9 @@ void HAssDiscovery()
|
|||
|
||||
snprintf_P(sidx, sizeof(sidx), PSTR("_%d"), i);
|
||||
// Clear "other" topic first in case the device has been reconfigured
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s%s/config"), (is_light) ? "switch" : "light", mqtt_topic, (1 == devices_present) ? "" : sidx);
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s%s/config"), (is_light) ? "switch" : "light", mqtt_topic, sidx);
|
||||
MqttPublish(stopic, true);
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s%s/config"), (is_light) ? "light" : "switch", mqtt_topic, (1 == devices_present) ? "" : sidx);
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s%s/config"), (is_light) ? "light" : "switch", mqtt_topic, sidx);
|
||||
|
||||
if (Settings.flag.hass_discovery) {
|
||||
char name[33];
|
||||
|
|
|
@ -0,0 +1,149 @@
|
|||
/*
|
||||
xdrv_08_serial_bridge.ino - serial bridge support for Sonoff-Tasmota
|
||||
|
||||
Copyright (C) 2018 Theo Arends and Dániel Zoltán Tolnai
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef USE_SERIAL_BRIDGE
|
||||
/*********************************************************************************************\
|
||||
* Serial Bridge using Software Serial library (TasmotaSerial)
|
||||
\*********************************************************************************************/
|
||||
#define SERIAL_BRIDGE_BUFFER_SIZE 130
|
||||
|
||||
#include <TasmotaSerial.h>
|
||||
|
||||
enum SerialBridgeCommands { CMND_SSERIALSEND, CMND_SBAUDRATE };
|
||||
const char kSerialBridgeCommands[] PROGMEM = D_CMND_SSERIALSEND "|" D_CMND_SBAUDRATE;
|
||||
|
||||
TasmotaSerial *SerialBridgeSerial;
|
||||
|
||||
uint8_t serial_bridge_active = 1;
|
||||
uint8_t serial_bridge_in_byte_counter = 0;
|
||||
unsigned long serial_bridge_polling_window = 0;
|
||||
char serial_bridge_buffer[SERIAL_BRIDGE_BUFFER_SIZE];
|
||||
|
||||
void SerialBridgeInput()
|
||||
{
|
||||
while (SerialBridgeSerial->available()) {
|
||||
yield();
|
||||
uint8_t serial_in_byte = SerialBridgeSerial->read();
|
||||
|
||||
if (serial_in_byte > 127) { // binary data...
|
||||
serial_bridge_in_byte_counter = 0;
|
||||
SerialBridgeSerial->flush();
|
||||
return;
|
||||
}
|
||||
if (serial_in_byte) {
|
||||
if ((serial_in_byte_counter < sizeof(serial_bridge_buffer) -1) && (serial_in_byte != Settings.serial_delimiter)) { // add char to string if it still fits
|
||||
serial_bridge_buffer[serial_bridge_in_byte_counter++] = serial_in_byte;
|
||||
serial_bridge_polling_window = millis(); // Wait for more data
|
||||
} else {
|
||||
serial_bridge_polling_window = 0; // Publish now
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (serial_bridge_in_byte_counter && (millis() > (serial_bridge_polling_window + SERIAL_POLLING))) {
|
||||
serial_bridge_buffer[serial_bridge_in_byte_counter] = 0; // serial data completed
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_SSERIALRECEIVED "\":\"%s\"}"), serial_bridge_buffer);
|
||||
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SSERIALRECEIVED));
|
||||
serial_bridge_in_byte_counter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/********************************************************************************************/
|
||||
|
||||
void SerialBridgeInit(void)
|
||||
{
|
||||
serial_bridge_active = 0;
|
||||
if ((pin[GPIO_SBR_RX] < 99) && (pin[GPIO_SBR_TX] < 99)) {
|
||||
SerialBridgeSerial = new TasmotaSerial(pin[GPIO_SBR_RX], pin[GPIO_SBR_TX]);
|
||||
if (SerialBridgeSerial->begin(Settings.sbaudrate * 1200)) { // Baud rate is stored div 1200 so it fits into one byte
|
||||
serial_bridge_active = 1;
|
||||
SerialBridgeSerial->flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Commands
|
||||
\*********************************************************************************************/
|
||||
|
||||
boolean SerialBridgeCommand()
|
||||
{
|
||||
char command [CMDSZ];
|
||||
boolean serviced = true;
|
||||
|
||||
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kSerialBridgeCommands);
|
||||
if ((CMND_SSERIALSEND == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 3)) {
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
if (1 == XdrvMailbox.index) {
|
||||
SerialBridgeSerial->write(XdrvMailbox.data, XdrvMailbox.data_len);
|
||||
SerialBridgeSerial->write("\n");
|
||||
}
|
||||
else if (2 == XdrvMailbox.index) {
|
||||
SerialBridgeSerial->write(XdrvMailbox.data, XdrvMailbox.data_len);
|
||||
}
|
||||
else if (3 == XdrvMailbox.index) {
|
||||
SerialBridgeSerial->write(Unescape(XdrvMailbox.data, &XdrvMailbox.data_len), XdrvMailbox.data_len);
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_DONE);
|
||||
}
|
||||
}
|
||||
else if (CMND_SBAUDRATE == command_code) {
|
||||
char *p;
|
||||
int baud = strtol(XdrvMailbox.data, &p, 10);
|
||||
if (baud > 0) {
|
||||
baud /= 1200; // Make it a valid baudrate
|
||||
Settings.sbaudrate = (1 == XdrvMailbox.payload) ? SOFT_BAUDRATE / 1200 : baud;
|
||||
SerialBridgeSerial->begin(Settings.sbaudrate * 1200); // Reinitialize serial port with new baud rate
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_LVALUE, command, Settings.sbaudrate * 1200);
|
||||
}
|
||||
else {
|
||||
serviced = false; // Unknown command
|
||||
}
|
||||
return serviced;
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Interface
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define XDRV_08
|
||||
|
||||
boolean Xdrv08(byte function)
|
||||
{
|
||||
boolean result = false;
|
||||
|
||||
if (serial_bridge_active) {
|
||||
switch (function) {
|
||||
case FUNC_INIT:
|
||||
SerialBridgeInit();
|
||||
break;
|
||||
case FUNC_LOOP:
|
||||
SerialBridgeInput();
|
||||
break;
|
||||
case FUNC_COMMAND:
|
||||
result = SerialBridgeCommand();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif // USE_SERIAL_BRIDGE
|
|
@ -0,0 +1,205 @@
|
|||
/*
|
||||
xdrv_09_timers.ino - timer support for Sonoff-Tasmota
|
||||
|
||||
Copyright (C) 2018 Theo Arends
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef USE_TIMERS
|
||||
/*********************************************************************************************\
|
||||
* Timers
|
||||
*
|
||||
* Arm a timer using one or all of the following JSON values:
|
||||
* {"Arm":1,"Time":"09:23","Days":"--TW--S","Repeat":1,"Device":1,"Power":1}
|
||||
*
|
||||
* Arm 0 = Off, 1 = On
|
||||
* Time hours:minutes
|
||||
* Days 7 day character mask starting with Sunday (SMTWTFS). 0 or - = Off, any other value = On
|
||||
* Repeat 0 = Execute once, 1 = Execute again
|
||||
* Device 1..16
|
||||
* Power 0 = Off, 1 = On, 2 = Toggle, 3 = Blink
|
||||
*
|
||||
\*********************************************************************************************/
|
||||
|
||||
enum TimerCommands { CMND_TIMER, CMND_TIMERS };
|
||||
const char kTimerCommands[] PROGMEM = D_CMND_TIMER "|" D_CMND_TIMERS ;
|
||||
|
||||
power_t fired = 0;
|
||||
|
||||
void TimerEverySecond()
|
||||
{
|
||||
if (RtcTime.valid) {
|
||||
uint16_t time = (RtcTime.hour * 60) + RtcTime.minute;
|
||||
uint8_t days = 1 << (RtcTime.day_of_week -1);
|
||||
|
||||
for (byte i = 0; i < MAX_TIMERS; i++) {
|
||||
if (Settings.timer[i].arm) {
|
||||
if (time == Settings.timer[i].time) {
|
||||
if (!bitRead(fired, i) && (Settings.timer[i].days & days)) {
|
||||
bitSet(fired, i);
|
||||
Settings.timer[i].arm = Settings.timer[i].repeat;
|
||||
ExecuteCommandPower(Settings.timer[i].device +1, Settings.timer[i].power);
|
||||
}
|
||||
} else {
|
||||
bitClear(fired, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PrepShowTimer(uint8_t index)
|
||||
{
|
||||
char days[8] = { 0 };
|
||||
|
||||
index--;
|
||||
for (byte i = 0; i < 7; i++) {
|
||||
uint8_t mask = 1 << i;
|
||||
snprintf(days, sizeof(days), "%s%d", days, ((Settings.timer[index].days & mask) > 0));
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"" D_CMND_TIMER "%d\":{\"" D_JSON_TIMER_ARM "\":%d,\"" D_JSON_TIMER_TIME "\":\"%02d:%02d\",\"" D_JSON_TIMER_DAYS "\":\"%s\",\"" D_JSON_TIMER_REPEAT "\":%d,\"" D_JSON_TIMER_DEVICE "\":%d,\"" D_JSON_TIMER_POWER "\":%d}"),
|
||||
mqtt_data, index +1, Settings.timer[index].arm, Settings.timer[index].time / 60, Settings.timer[index].time % 60, days, Settings.timer[index].repeat, Settings.timer[index].device +1, Settings.timer[index].power);
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Commands
|
||||
\*********************************************************************************************/
|
||||
|
||||
boolean TimerCommand()
|
||||
{
|
||||
char command [CMDSZ];
|
||||
char dataBufUc[XdrvMailbox.data_len];
|
||||
boolean serviced = true;
|
||||
uint8_t index = XdrvMailbox.index;
|
||||
|
||||
UpperCase(dataBufUc, XdrvMailbox.data);
|
||||
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kTimerCommands);
|
||||
if ((CMND_TIMER == command_code) && (index > 0) && (index <= MAX_TIMERS)) {
|
||||
uint8_t error = 0;
|
||||
|
||||
if (XdrvMailbox.data_len) {
|
||||
StaticJsonBuffer<128> jsonBuffer;
|
||||
JsonObject& root = jsonBuffer.parseObject(dataBufUc);
|
||||
if (!root.success()) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_TIMER "%d\":\"" D_JSON_INVALID_JSON "\"}"), index); // JSON decode failed
|
||||
error = 1;
|
||||
}
|
||||
else {
|
||||
char parm_uc[10];
|
||||
|
||||
index--;
|
||||
if (root[UpperCase_P(parm_uc, PSTR(D_JSON_TIMER_ARM))].success()) {
|
||||
Settings.timer[index].arm = (root[parm_uc] != 0);
|
||||
}
|
||||
if (root[UpperCase_P(parm_uc, PSTR(D_JSON_TIMER_TIME))].success()) {
|
||||
uint16_t itime = 0;
|
||||
uint8_t value = 0;
|
||||
char time_str[10];
|
||||
|
||||
snprintf(time_str, sizeof(time_str), root[parm_uc]);
|
||||
const char *substr = strtok(time_str, ":");
|
||||
if (substr != NULL) {
|
||||
value = atoi(substr);
|
||||
if (value > 23) value = 23;
|
||||
itime = value * 60;
|
||||
substr = strtok(NULL, ":");
|
||||
if (substr != NULL) {
|
||||
value = atoi(substr);
|
||||
if (value > 59) value = 59;
|
||||
itime += value;
|
||||
}
|
||||
}
|
||||
Settings.timer[index].time = itime;
|
||||
}
|
||||
if (root[UpperCase_P(parm_uc, PSTR(D_JSON_TIMER_DAYS))].success()) {
|
||||
// SMTWTFS = 1234567 = 0011001 = 00TW00S = --TW--S
|
||||
Settings.timer[index].days = 0;
|
||||
const char *tday = root[parm_uc];
|
||||
char ch = '.';
|
||||
|
||||
uint8_t i = 0;
|
||||
while ((ch != '\0') && (i < 7)) {
|
||||
ch = *tday++;
|
||||
if (ch == '-') ch = '0';
|
||||
uint8_t mask = 1 << i++;
|
||||
Settings.timer[index].days |= (ch == '0') ? 0 : mask;
|
||||
}
|
||||
}
|
||||
if (root[UpperCase_P(parm_uc, PSTR(D_JSON_TIMER_REPEAT))].success()) {
|
||||
Settings.timer[index].repeat = (root[parm_uc] != 0);
|
||||
}
|
||||
if (root[UpperCase_P(parm_uc, PSTR(D_JSON_TIMER_DEVICE))].success()) {
|
||||
Settings.timer[index].device = ((uint8_t)root[parm_uc] -1) & 0x0F;
|
||||
}
|
||||
if (root[UpperCase_P(parm_uc, PSTR(D_JSON_TIMER_POWER))].success()) {
|
||||
Settings.timer[index].power = (uint8_t)root[parm_uc] & 0x03;
|
||||
}
|
||||
if (Settings.timer[index].arm) bitClear(fired, index);
|
||||
|
||||
index++;
|
||||
}
|
||||
}
|
||||
if (!error) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{"));
|
||||
PrepShowTimer(index);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
}
|
||||
}
|
||||
else if (CMND_TIMERS == command_code) {
|
||||
byte jsflg = 0;
|
||||
byte lines = 1;
|
||||
for (byte i = 0; i < MAX_TIMERS; i++) {
|
||||
if (!jsflg) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_TIMERS "%d\":{"), lines++);
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,"), mqtt_data);
|
||||
}
|
||||
jsflg = 1;
|
||||
PrepShowTimer(i +1);
|
||||
if ((strlen(mqtt_data) > (LOGSZ - TOPSZ)) || (i == MAX_TIMERS -1)) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}}"), mqtt_data);
|
||||
MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_CMND_TIMERS));
|
||||
jsflg = 0;
|
||||
}
|
||||
}
|
||||
mqtt_data[0] = '\0';
|
||||
}
|
||||
else serviced = false;
|
||||
|
||||
return serviced;
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Interface
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define XDRV_09
|
||||
|
||||
boolean Xdrv09(byte function)
|
||||
{
|
||||
boolean result = false;
|
||||
|
||||
switch (function) {
|
||||
case FUNC_EVERY_SECOND:
|
||||
TimerEverySecond();
|
||||
break;
|
||||
case FUNC_COMMAND:
|
||||
result = TimerCommand();
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif // USE_TIMERS
|
|
@ -25,21 +25,29 @@
|
|||
#include <NeoPixelBus.h>
|
||||
|
||||
#ifdef USE_WS2812_DMA
|
||||
#if (USE_WS2812_CTYPE == 1)
|
||||
#if (USE_WS2812_CTYPE == NEO_GRB)
|
||||
NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> *strip = NULL;
|
||||
#elif (USE_WS2812_CTYPE == 2)
|
||||
#elif (USE_WS2812_CTYPE == NEO_BRG)
|
||||
NeoPixelBus<NeoBrgFeature, Neo800KbpsMethod> *strip = NULL;
|
||||
#elif (USE_WS2812_CTYPE == NEO_RBG)
|
||||
NeoPixelBus<NeoRbgFeature, Neo800KbpsMethod> *strip = NULL;
|
||||
#elif (USE_WS2812_CTYPE == NEO_RGBW)
|
||||
NeoPixelBus<NeoRgbwFeature, Neo800KbpsMethod> *strip = NULL;
|
||||
#elif (USE_WS2812_CTYPE == 3)
|
||||
#elif (USE_WS2812_CTYPE == NEO_GRBW)
|
||||
NeoPixelBus<NeoGrbwFeature, Neo800KbpsMethod> *strip = NULL;
|
||||
#else // USE_WS2812_CTYPE
|
||||
NeoPixelBus<NeoRgbFeature, Neo800KbpsMethod> *strip = NULL;
|
||||
#endif // USE_WS2812_CTYPE
|
||||
#else // USE_WS2812_DMA
|
||||
#if (USE_WS2812_CTYPE == 1)
|
||||
#if (USE_WS2812_CTYPE == NEO_GRB)
|
||||
NeoPixelBus<NeoGrbFeature, NeoEsp8266BitBang800KbpsMethod> *strip = NULL;
|
||||
#elif (USE_WS2812_CTYPE == 2)
|
||||
#elif (USE_WS2812_CTYPE == NEO_BRG)
|
||||
NeoPixelBus<NeoBrgFeature, NeoEsp8266BitBang800KbpsMethod> *strip = NULL;
|
||||
#elif (USE_WS2812_CTYPE == NEO_RBG)
|
||||
NeoPixelBus<NeoRbgFeature, NeoEsp8266BitBang800KbpsMethod> *strip = NULL;
|
||||
#elif (USE_WS2812_CTYPE == NEO_RGBW)
|
||||
NeoPixelBus<NeoRgbwFeature, NeoEsp8266BitBang800KbpsMethod> *strip = NULL;
|
||||
#elif (USE_WS2812_CTYPE == 3)
|
||||
#elif (USE_WS2812_CTYPE == NEO_GRBW)
|
||||
NeoPixelBus<NeoGrbwFeature, NeoEsp8266BitBang800KbpsMethod> *strip = NULL;
|
||||
#else // USE_WS2812_CTYPE
|
||||
NeoPixelBus<NeoRgbFeature, NeoEsp8266BitBang800KbpsMethod> *strip = NULL;
|
||||
|
@ -90,7 +98,7 @@ uint8_t ws_show_next = 1;
|
|||
|
||||
void Ws2812StripShow()
|
||||
{
|
||||
#if (USE_WS2812_CTYPE > 1)
|
||||
#if (USE_WS2812_CTYPE > NEO_3LED)
|
||||
RgbwColor c;
|
||||
#else
|
||||
RgbColor c;
|
||||
|
@ -102,7 +110,7 @@ void Ws2812StripShow()
|
|||
c.R = ledTable[c.R];
|
||||
c.G = ledTable[c.G];
|
||||
c.B = ledTable[c.B];
|
||||
#if (USE_WS2812_CTYPE > 1)
|
||||
#if (USE_WS2812_CTYPE > NEO_3LED)
|
||||
c.W = ledTable[c.W];
|
||||
#endif
|
||||
strip->SetPixelColor(i, c);
|
||||
|
@ -114,9 +122,7 @@ void Ws2812StripShow()
|
|||
int mod(int a, int b)
|
||||
{
|
||||
int ret = a % b;
|
||||
if (ret < 0) {
|
||||
ret += b;
|
||||
}
|
||||
if (ret < 0) ret += b;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -124,7 +130,7 @@ int mod(int a, int b)
|
|||
|
||||
void Ws2812UpdatePixelColor(int position, struct WsColor hand_color, float offset)
|
||||
{
|
||||
#if (USE_WS2812_CTYPE > 1)
|
||||
#if (USE_WS2812_CTYPE > NEO_3LED)
|
||||
RgbwColor color;
|
||||
#else
|
||||
RgbColor color;
|
||||
|
@ -142,13 +148,15 @@ void Ws2812UpdatePixelColor(int position, struct WsColor hand_color, float offse
|
|||
|
||||
void Ws2812UpdateHand(int position, uint8_t index)
|
||||
{
|
||||
if (Settings.flag.ws_clock_reverse) {
|
||||
position = Settings.light_pixels -position;
|
||||
}
|
||||
position = (position + Settings.light_rotation) % Settings.light_pixels;
|
||||
|
||||
if (Settings.flag.ws_clock_reverse) position = Settings.light_pixels -position;
|
||||
WsColor hand_color = { Settings.ws_color[index][WS_RED], Settings.ws_color[index][WS_GREEN], Settings.ws_color[index][WS_BLUE] };
|
||||
|
||||
Ws2812UpdatePixelColor(position, hand_color, 1);
|
||||
uint8_t range = ((Settings.ws_width[index] -1) / 2) +1;
|
||||
|
||||
uint8_t range = 1;
|
||||
if (index < WS_MARKER) range = ((Settings.ws_width[index] -1) / 2) +1;
|
||||
for (uint8_t h = 1; h < range; h++) {
|
||||
float offset = (float)(range - h) / (float)range;
|
||||
Ws2812UpdatePixelColor(position -h, hand_color, offset);
|
||||
|
@ -160,9 +168,15 @@ void Ws2812Clock()
|
|||
{
|
||||
strip->ClearTo(0); // Reset strip
|
||||
int clksize = 60000 / (int)Settings.light_pixels;
|
||||
|
||||
Ws2812UpdateHand((RtcTime.second * 1000) / clksize, WS_SECOND);
|
||||
Ws2812UpdateHand((RtcTime.minute * 1000) / clksize, WS_MINUTE);
|
||||
Ws2812UpdateHand(((RtcTime.hour % 12) * (5000 / clksize)) + ((RtcTime.minute * 1000) / (12 * clksize)), WS_HOUR);
|
||||
if (Settings.ws_color[WS_MARKER][WS_RED] + Settings.ws_color[WS_MARKER][WS_GREEN] + Settings.ws_color[WS_MARKER][WS_BLUE]) {
|
||||
for (byte i = 0; i < 12; i++) {
|
||||
Ws2812UpdateHand((i * 5000) / clksize, WS_MARKER);
|
||||
}
|
||||
}
|
||||
|
||||
Ws2812StripShow();
|
||||
}
|
||||
|
@ -199,7 +213,7 @@ void Ws2812Gradient(uint8_t schemenr)
|
|||
* Display a gradient of colors for the current color scheme.
|
||||
* Repeat is the number of repetitions of the gradient (pick a multiple of 2 for smooth looping of the gradient).
|
||||
*/
|
||||
#if (USE_WS2812_CTYPE > 1)
|
||||
#if (USE_WS2812_CTYPE > NEO_3LED)
|
||||
RgbwColor c;
|
||||
c.W = 0;
|
||||
#else
|
||||
|
@ -207,9 +221,7 @@ void Ws2812Gradient(uint8_t schemenr)
|
|||
#endif
|
||||
|
||||
ColorScheme scheme = kSchemes[schemenr];
|
||||
if (scheme.count < 2) {
|
||||
return;
|
||||
}
|
||||
if (scheme.count < 2) return;
|
||||
|
||||
uint8_t repeat = kRepeat[Settings.light_width]; // number of scheme.count per ledcount
|
||||
uint16_t range = (uint16_t)ceil((float)Settings.light_pixels / (float)repeat);
|
||||
|
@ -249,7 +261,7 @@ void Ws2812Bars(uint8_t schemenr)
|
|||
* Display solid bars of color for the current color scheme.
|
||||
* Width is the width of each bar in pixels/lights.
|
||||
*/
|
||||
#if (USE_WS2812_CTYPE > 1)
|
||||
#if (USE_WS2812_CTYPE > NEO_3LED)
|
||||
RgbwColor c;
|
||||
c.W = 0;
|
||||
#else
|
||||
|
@ -260,9 +272,7 @@ void Ws2812Bars(uint8_t schemenr)
|
|||
ColorScheme scheme = kSchemes[schemenr];
|
||||
|
||||
uint16_t maxSize = Settings.light_pixels / scheme.count;
|
||||
if (kWidth[Settings.light_width] > maxSize) {
|
||||
maxSize = 0;
|
||||
}
|
||||
if (kWidth[Settings.light_width] > maxSize) maxSize = 0;
|
||||
|
||||
uint16_t speed = ((Settings.light_speed * 2) -1) * (STATES / 10);
|
||||
uint8_t offset = speed > 0 ? strip_timer_counter / speed : 0;
|
||||
|
@ -280,9 +290,7 @@ void Ws2812Bars(uint8_t schemenr)
|
|||
}
|
||||
uint8_t colorIndex = offset % scheme.count;
|
||||
for (i = 0; i < Settings.light_pixels; i++) {
|
||||
if (maxSize) {
|
||||
colorIndex = ((i + offset) % (scheme.count * kWidth[Settings.light_width])) / kWidth[Settings.light_width];
|
||||
}
|
||||
if (maxSize) colorIndex = ((i + offset) % (scheme.count * kWidth[Settings.light_width])) / kWidth[Settings.light_width];
|
||||
c.R = mcolor[colorIndex].red;
|
||||
c.G = mcolor[colorIndex].green;
|
||||
c.B = mcolor[colorIndex].blue;
|
||||
|
@ -298,21 +306,29 @@ void Ws2812Bars(uint8_t schemenr)
|
|||
void Ws2812Init()
|
||||
{
|
||||
#ifdef USE_WS2812_DMA
|
||||
#if (USE_WS2812_CTYPE == 1)
|
||||
#if (USE_WS2812_CTYPE == NEO_GRB)
|
||||
strip = new NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod>(WS2812_MAX_LEDS); // For Esp8266, the Pin is omitted and it uses GPIO3 due to DMA hardware use.
|
||||
#elif (USE_WS2812_CTYPE == 2)
|
||||
#elif (USE_WS2812_CTYPE == NEO_BRG)
|
||||
strip = new NeoPixelBus<NeoBrgFeature, Neo800KbpsMethod>(WS2812_MAX_LEDS); // For Esp8266, the Pin is omitted and it uses GPIO3 due to DMA hardware use.
|
||||
#elif (USE_WS2812_CTYPE == NEO_RBG)
|
||||
strip = new NeoPixelBus<NeoRbgFeature, Neo800KbpsMethod>(WS2812_MAX_LEDS); // For Esp8266, the Pin is omitted and it uses GPIO3 due to DMA hardware use.
|
||||
#elif (USE_WS2812_CTYPE == NEO_RGBW)
|
||||
strip = new NeoPixelBus<NeoRgbwFeature, Neo800KbpsMethod>(WS2812_MAX_LEDS); // For Esp8266, the Pin is omitted and it uses GPIO3 due to DMA hardware use.
|
||||
#elif (USE_WS2812_CTYPE == 3)
|
||||
#elif (USE_WS2812_CTYPE == NEO_GRBW)
|
||||
strip = new NeoPixelBus<NeoGrbwFeature, Neo800KbpsMethod>(WS2812_MAX_LEDS); // For Esp8266, the Pin is omitted and it uses GPIO3 due to DMA hardware use.
|
||||
#else // USE_WS2812_CTYPE
|
||||
strip = new NeoPixelBus<NeoRgbFeature, Neo800KbpsMethod>(WS2812_MAX_LEDS); // For Esp8266, the Pin is omitted and it uses GPIO3 due to DMA hardware use.
|
||||
#endif // USE_WS2812_CTYPE
|
||||
#else // USE_WS2812_DMA
|
||||
#if (USE_WS2812_CTYPE == 1)
|
||||
#if (USE_WS2812_CTYPE == NEO_GRB)
|
||||
strip = new NeoPixelBus<NeoGrbFeature, NeoEsp8266BitBang800KbpsMethod>(WS2812_MAX_LEDS, pin[GPIO_WS2812]);
|
||||
#elif (USE_WS2812_CTYPE == 2)
|
||||
#elif (USE_WS2812_CTYPE == NEO_BRG)
|
||||
strip = new NeoPixelBus<NeoBrgFeature, NeoEsp8266BitBang800KbpsMethod>(WS2812_MAX_LEDS, pin[GPIO_WS2812]);
|
||||
#elif (USE_WS2812_CTYPE == NEO_RBG)
|
||||
strip = new NeoPixelBus<NeoRbgFeature, NeoEsp8266BitBang800KbpsMethod>(WS2812_MAX_LEDS, pin[GPIO_WS2812]);
|
||||
#elif (USE_WS2812_CTYPE == NEO_RGBW)
|
||||
strip = new NeoPixelBus<NeoRgbwFeature, NeoEsp8266BitBang800KbpsMethod>(WS2812_MAX_LEDS, pin[GPIO_WS2812]);
|
||||
#elif (USE_WS2812_CTYPE == 3)
|
||||
#elif (USE_WS2812_CTYPE == NEO_GRBW)
|
||||
strip = new NeoPixelBus<NeoGrbwFeature, NeoEsp8266BitBang800KbpsMethod>(WS2812_MAX_LEDS, pin[GPIO_WS2812]);
|
||||
#else // USE_WS2812_CTYPE
|
||||
strip = new NeoPixelBus<NeoRgbFeature, NeoEsp8266BitBang800KbpsMethod>(WS2812_MAX_LEDS, pin[GPIO_WS2812]);
|
||||
|
@ -331,7 +347,7 @@ void Ws2812Clear()
|
|||
|
||||
void Ws2812SetColor(uint16_t led, uint8_t red, uint8_t green, uint8_t blue, uint8_t white)
|
||||
{
|
||||
#if (USE_WS2812_CTYPE > 1)
|
||||
#if (USE_WS2812_CTYPE > NEO_3LED)
|
||||
RgbwColor lcolor;
|
||||
lcolor.W = white;
|
||||
#else
|
||||
|
@ -357,7 +373,7 @@ char* Ws2812GetColor(uint16_t led, char* scolor)
|
|||
{
|
||||
uint8_t sl_ledcolor[4];
|
||||
|
||||
#if (USE_WS2812_CTYPE > 1)
|
||||
#if (USE_WS2812_CTYPE > NEO_3LED)
|
||||
RgbwColor lcolor = strip->GetPixelColor(led -1);
|
||||
sl_ledcolor[3] = lcolor.W;
|
||||
#else
|
||||
|
|
|
@ -125,6 +125,8 @@ void SonoffScShow(boolean json)
|
|||
#ifdef USE_DOMOTICZ
|
||||
DomoticzTempHumSensor(temperature, humidity);
|
||||
DomoticzSensor(DZ_ILLUMINANCE, sc_value[2]);
|
||||
DomoticzSensor(DZ_COUNT, sc_value[3]);
|
||||
DomoticzSensor(DZ_AIRQUALITY, 500 + ((100 - sc_value[4]) * 20));
|
||||
#endif // USE_DOMOTICZ
|
||||
#ifdef USE_WEBSERVER
|
||||
} else {
|
||||
|
|
|
@ -287,6 +287,8 @@ boolean Ds18x20Read(uint8_t sensor, float &t)
|
|||
{
|
||||
uint8_t data[9];
|
||||
int8_t sign = 1;
|
||||
uint16_t temp12 = 0;
|
||||
int16_t temp14 = 0;
|
||||
float temp9 = 0.0;
|
||||
|
||||
t = NAN;
|
||||
|
@ -315,23 +317,26 @@ boolean Ds18x20Read(uint8_t sensor, float &t)
|
|||
case DS1822_CHIPID:
|
||||
case DS18B20_CHIPID:
|
||||
if (data[4] != 0x7F) {
|
||||
data[4] = 0x7F; // Set resolution to 12-bit
|
||||
data[4] = 0x7F; // Set resolution to 12-bit
|
||||
OneWireReset();
|
||||
OneWireSelect(ds18x20_address[ds18x20_index[sensor]]);
|
||||
OneWireWrite(W1_WRITE_SCRATCHPAD);
|
||||
OneWireWrite(data[2]); // Th Register
|
||||
OneWireWrite(data[3]); // Tl Register
|
||||
OneWireWrite(data[4]); // Configuration Register
|
||||
OneWireWrite(data[2]); // Th Register
|
||||
OneWireWrite(data[3]); // Tl Register
|
||||
OneWireWrite(data[4]); // Configuration Register
|
||||
OneWireSelect(ds18x20_address[ds18x20_index[sensor]]);
|
||||
OneWireWrite(W1_WRITE_EEPROM); // Save scratchpad to EEPROM
|
||||
OneWireWrite(W1_WRITE_EEPROM); // Save scratchpad to EEPROM
|
||||
}
|
||||
case MAX31850_CHIPID:
|
||||
uint16_t temp12 = (data[1] << 8) + data[0];
|
||||
temp12 = (data[1] << 8) + data[0];
|
||||
if (temp12 > 2047) {
|
||||
temp12 = (~temp12) +1;
|
||||
sign = -1;
|
||||
}
|
||||
t = ConvertTemp(sign * temp12 * 0.0625);
|
||||
t = ConvertTemp(sign * temp12 * 0.0625); // Divide by 16
|
||||
break;
|
||||
case MAX31850_CHIPID:
|
||||
temp14 = (data[1] << 8) + (data[0] & 0xFC);
|
||||
t = ConvertTemp(temp14 * 0.0625); // Divide by 16
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -404,8 +409,13 @@ boolean Xsns05(byte function)
|
|||
case FUNC_INIT:
|
||||
Ds18x20Init();
|
||||
break;
|
||||
// case FUNC_EVERY_SECOND:
|
||||
// if ((Settings.tele_period - tele_period) &3 == 3) {
|
||||
// Ds18x20Convert(); // Start conversion every four seconds, takes up to one second
|
||||
// }
|
||||
// break;
|
||||
case FUNC_PREP_BEFORE_TELEPERIOD:
|
||||
Ds18x20Convert(); // Start conversion, takes up to one second
|
||||
Ds18x20Convert(); // Start conversion, takes up to one second
|
||||
break;
|
||||
case FUNC_JSON_APPEND:
|
||||
Ds18x20Show(1);
|
||||
|
@ -413,7 +423,7 @@ boolean Xsns05(byte function)
|
|||
#ifdef USE_WEBSERVER
|
||||
case FUNC_WEB_APPEND:
|
||||
Ds18x20Show(0);
|
||||
Ds18x20Convert(); // Start conversion, takes up to one second
|
||||
Ds18x20Convert(); // Start conversion, takes up to one second
|
||||
break;
|
||||
#endif // USE_WEBSERVER
|
||||
}
|
||||
|
|
|
@ -103,6 +103,8 @@ boolean Ds18x20Read(uint8_t sensor, float &t)
|
|||
{
|
||||
byte data[12];
|
||||
int8_t sign = 1;
|
||||
uint16_t temp12 = 0;
|
||||
int16_t temp14 = 0;
|
||||
float temp9 = 0.0;
|
||||
uint8_t present = 0;
|
||||
|
||||
|
@ -117,7 +119,7 @@ boolean Ds18x20Read(uint8_t sensor, float &t)
|
|||
}
|
||||
if (OneWire::crc8(data, 8) == data[8]) {
|
||||
switch(ds18x20_address[ds18x20_index[sensor]][0]) {
|
||||
case DS18S20_CHIPID: // DS18S20
|
||||
case DS18S20_CHIPID:
|
||||
if (data[1] > 0x80) {
|
||||
data[0] = (~data[0]) +1;
|
||||
sign = -1; // App-Note fix possible sign error
|
||||
|
@ -129,14 +131,17 @@ boolean Ds18x20Read(uint8_t sensor, float &t)
|
|||
}
|
||||
t = ConvertTemp((temp9 - 0.25) + ((16.0 - data[6]) / 16.0));
|
||||
break;
|
||||
case DS18B20_CHIPID: // DS18B20
|
||||
case MAX31850_CHIPID: // MAX31850
|
||||
uint16_t temp12 = (data[1] << 8) + data[0];
|
||||
case DS18B20_CHIPID:
|
||||
temp12 = (data[1] << 8) + data[0];
|
||||
if (temp12 > 2047) {
|
||||
temp12 = (~temp12) +1;
|
||||
sign = -1;
|
||||
}
|
||||
t = ConvertTemp(sign * temp12 * 0.0625);
|
||||
t = ConvertTemp(sign * temp12 * 0.0625); // Divide by 16
|
||||
break;
|
||||
case MAX31850_CHIPID:
|
||||
temp14 = (data[1] << 8) + (data[0] & 0xFC);
|
||||
t = ConvertTemp(temp14 * 0.0625); // Divide by 16
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#ifdef USE_I2C
|
||||
#ifdef USE_SHT3X
|
||||
/*********************************************************************************************\
|
||||
* SHT3X and SHTC3 - Temperature and Humidy
|
||||
* SHT3X and SHTC3 - Temperature and Humidity
|
||||
*
|
||||
* I2C Address: 0x44, 0x45 or 0x70 (SHTC3)
|
||||
\*********************************************************************************************/
|
||||
|
@ -29,14 +29,18 @@
|
|||
#define SHT3X_ADDR_VDD 0x45 // address pin high (VDD)
|
||||
#define SHTC3_ADDR 0x70 // address for shtc3 sensor
|
||||
|
||||
#define SHT3X_MAX_SENSORS 3
|
||||
|
||||
const char kShtTypes[] PROGMEM = "SHT3X|SHT3X|SHTC3";
|
||||
|
||||
uint8_t sht3x_type = 0;
|
||||
uint8_t sht3x_address;
|
||||
uint8_t sht3x_addresses[] = { SHT3X_ADDR_GND, SHT3X_ADDR_VDD, SHTC3_ADDR };
|
||||
char sht3x_types[6];
|
||||
|
||||
bool Sht3xRead(float &t, float &h)
|
||||
uint8_t sht3x_count = 0;
|
||||
struct SHT3XSTRUCT {
|
||||
uint8_t address; // I2C bus address
|
||||
char types[6]; // Sensor type name and address - "SHT3X-0xXX"
|
||||
} sht3x_sensors[SHT3X_MAX_SENSORS];
|
||||
|
||||
bool Sht3xRead(float &t, float &h, uint8_t sht3x_address)
|
||||
{
|
||||
unsigned int data[6];
|
||||
|
||||
|
@ -49,7 +53,7 @@ bool Sht3xRead(float &t, float &h)
|
|||
Wire.write(0x17); // sleep
|
||||
Wire.endTransmission();
|
||||
Wire.beginTransmission(sht3x_address);
|
||||
Wire.write(0x78); // Dissable clock stretching ( I don't think that wire library support clock stretching )
|
||||
Wire.write(0x78); // Disable clock stretching ( I don't think that wire library support clock stretching )
|
||||
Wire.write(0x66); // High resolution
|
||||
} else {
|
||||
Wire.write(0x2C); // Enable clock stretching
|
||||
|
@ -72,46 +76,47 @@ bool Sht3xRead(float &t, float &h)
|
|||
|
||||
void Sht3xDetect()
|
||||
{
|
||||
if (sht3x_type) {
|
||||
return;
|
||||
}
|
||||
if (sht3x_count) return;
|
||||
|
||||
float t;
|
||||
float h;
|
||||
sht3x_type = 1;
|
||||
for (byte i = 0; i < sizeof(sht3x_addresses); i++) {
|
||||
sht3x_address = sht3x_addresses[i];
|
||||
if (Sht3xRead(t, h)) {
|
||||
GetTextIndexed(sht3x_types, sizeof(sht3x_types), i, kShtTypes);
|
||||
snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, sht3x_types, htu_address);
|
||||
for (byte i = 0; i < SHT3X_MAX_SENSORS; i++) {
|
||||
if (Sht3xRead(t, h, sht3x_addresses[i])) {
|
||||
sht3x_sensors[sht3x_count].address = sht3x_addresses[i];
|
||||
GetTextIndexed(sht3x_sensors[sht3x_count].types, sizeof(sht3x_sensors[sht3x_count].types), i, kShtTypes);
|
||||
snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, sht3x_sensors[sht3x_count].types, sht3x_sensors[sht3x_count].address);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
return;
|
||||
sht3x_count++;
|
||||
}
|
||||
}
|
||||
sht3x_type = 0;
|
||||
}
|
||||
|
||||
void Sht3xShow(boolean json)
|
||||
{
|
||||
if (sht3x_type) {
|
||||
if (sht3x_count) {
|
||||
float t;
|
||||
float h;
|
||||
if (Sht3xRead(t, h)) {
|
||||
char temperature[10];
|
||||
char humidity[10];
|
||||
dtostrfd(t, Settings.flag2.temperature_resolution, temperature);
|
||||
dtostrfd(h, Settings.flag2.humidity_resolution, humidity);
|
||||
|
||||
if (json) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, sht3x_types, temperature, humidity);
|
||||
char temperature[10];
|
||||
char humidity[10];
|
||||
char types[11];
|
||||
for (byte i = 0; i < sht3x_count; i++) {
|
||||
if (Sht3xRead(t, h, sht3x_sensors[i].address)) {
|
||||
dtostrfd(t, Settings.flag2.temperature_resolution, temperature);
|
||||
dtostrfd(h, Settings.flag2.humidity_resolution, humidity);
|
||||
snprintf_P(types, sizeof(types), PSTR("%s-0x%02X"), sht3x_sensors[i].types, sht3x_sensors[i].address); // "SHT3X-0xXX"
|
||||
if (json) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, types, temperature, humidity);
|
||||
#ifdef USE_DOMOTICZ
|
||||
DomoticzTempHumSensor(temperature, humidity);
|
||||
if (0 == i) { // We want the same first sensor to report to Domoticz in case a read is missed
|
||||
DomoticzTempHumSensor(temperature, humidity);
|
||||
}
|
||||
#endif // USE_DOMOTICZ
|
||||
#ifdef USE_WEBSERVER
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_TEMP, mqtt_data, sht3x_types, temperature, TempUnit());
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_HUM, mqtt_data, sht3x_types, humidity);
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_TEMP, mqtt_data, types, temperature, TempUnit());
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_HUM, mqtt_data, types, humidity);
|
||||
#endif // USE_WEBSERVER
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -130,6 +130,11 @@ void PmsShow(boolean json)
|
|||
pms_data.pm10_standard, pms_data.pm25_standard, pms_data.pm100_standard,
|
||||
pms_data.pm10_env, pms_data.pm25_env, pms_data.pm100_env,
|
||||
pms_data.particles_03um, pms_data.particles_05um, pms_data.particles_10um, pms_data.particles_25um, pms_data.particles_50um, pms_data.particles_100um);
|
||||
#ifdef USE_DOMOTICZ
|
||||
DomoticzSensor(DZ_COUNT, pms_data.pm10_env); // PM1
|
||||
DomoticzSensor(DZ_VOLTAGE, pms_data.pm25_env); // PM2.5
|
||||
DomoticzSensor(DZ_CURRENT, pms_data.pm100_env); // PM10
|
||||
#endif // USE_DOMOTICZ
|
||||
#ifdef USE_WEBSERVER
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_PMS5003_SNS, mqtt_data,
|
||||
|
|
|
@ -92,18 +92,28 @@ void NovaSdsInit()
|
|||
|
||||
#ifdef USE_WEBSERVER
|
||||
const char HTTP_SDS0X1_SNS[] PROGMEM = "%s"
|
||||
"{s}SDS0X1 " D_ENVIRONMENTAL_CONCENTRATION " 2.5 " D_UNIT_MICROMETER "{m}%d " D_UNIT_MICROGRAM_PER_CUBIC_METER "{e}"
|
||||
"{s}SDS0X1 " D_ENVIRONMENTAL_CONCENTRATION " 10 " D_UNIT_MICROMETER "{m}%d " D_UNIT_MICROGRAM_PER_CUBIC_METER "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
|
||||
"{s}SDS0X1 " D_ENVIRONMENTAL_CONCENTRATION " 2.5 " D_UNIT_MICROMETER "{m}%s " D_UNIT_MICROGRAM_PER_CUBIC_METER "{e}"
|
||||
"{s}SDS0X1 " D_ENVIRONMENTAL_CONCENTRATION " 10 " D_UNIT_MICROMETER "{m}%s " D_UNIT_MICROGRAM_PER_CUBIC_METER "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
|
||||
#endif // USE_WEBSERVER
|
||||
|
||||
void NovaSdsShow(boolean json)
|
||||
{
|
||||
if (novasds_valid) {
|
||||
char pm10[10];
|
||||
char pm2_5[10];
|
||||
float pm10f = (float)(novasds_data.pm100) / 10.0f;
|
||||
float pm2_5f = (float)(novasds_data.pm25) / 10.0f;
|
||||
dtostrfd(pm10f, 1, pm10);
|
||||
dtostrfd(pm2_5f, 1, pm2_5);
|
||||
if (json) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"SDS0X1\":{\"PM2.5\":%d,\"PM10\":%d}"), mqtt_data, novasds_data.pm25, novasds_data.pm100);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"SDS0X1\":{\"PM2.5\":%s,\"PM10\":%s}"), mqtt_data, pm2_5, pm10);
|
||||
#ifdef USE_DOMOTICZ
|
||||
DomoticzSensor(DZ_VOLTAGE, pm2_5); // PM2.5
|
||||
DomoticzSensor(DZ_CURRENT, pm10); // PM10
|
||||
#endif // USE_DOMOTICZ
|
||||
#ifdef USE_WEBSERVER
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SDS0X1_SNS, mqtt_data, novasds_data.pm25/10, novasds_data.pm100/10);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SDS0X1_SNS, mqtt_data, pm2_5, pm10);
|
||||
#endif // USE_WEBSERVER
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue