mirror of
https://github.com/arendst/Tasmota.git
synced 2025-08-06 17:37:44 +00:00
commit
6e240c724a
1
.gitignore
vendored
1
.gitignore
vendored
@ -15,3 +15,4 @@ build
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
*.bak
|
||||
|
@ -34,7 +34,7 @@ A Sonoff device is not a toy. It uses Mains AC so there is a danger of electrocu
|
||||
We don't take any responsibility nor liability for using this software nor for the installation or any tips, advice, videos, etc. given by any member of this site or any related site.
|
||||
|
||||
### Note
|
||||
Please dont ask too add devices where you cant provide a basic working configuration (other than sonoff). Since there are thousands of them..
|
||||
Please do not ask to add devices where you can't provide a basic working configuration (other than sonoff). Since there are thousands of them..
|
||||
|
||||
### Quick Install
|
||||
Download one of the released binaries from https://github.com/arendst/Sonoff-Tasmota/releases and flash it to your hardware as documented in the wiki.
|
||||
|
86
TEMPLATE.md
Normal file
86
TEMPLATE.md
Normal file
@ -0,0 +1,86 @@
|
||||
## Sonoff-Tasmota template information
|
||||
Sonoff-Tasmota uses Device or Module information to control peripherals connected to GPIOs. This information is stored in the ``sonoff_template.h`` file as a device specific template. The template contains information about what GPIO should be connected to what peripheral and what GPIO may be configured online using the ``GPIO`` command or GUI Configure Module menu. In addition a device may need specific coding to process the data from these peripherals. The module number as provided by the ``Modules`` command is used to select this coding.
|
||||
|
||||
Starting with version 6.4.1.16 Sonoff-Tasmota Modules can be extended by users online using a template. To provide easy processing by Sonoff-Tasmota a user template is written as JSON text and could look like this:
|
||||
|
||||
{"NAME":"UserModule1","GPIO":[17,243,29,244,7,201,255,255,138,255,139,255,255],"FLAG":0,"BASE":18}
|
||||
|
||||
The four properties with UPPERCASE property names have the following functionality:
|
||||
|
||||
Property name | Property value description
|
||||
--------------|-------------------------------------------------------------------------------------------------------------------
|
||||
NAME | Up to 14 characters for the Module name
|
||||
GPIO | Up to 13 decimal numbers from 0 to 255 representing GPIO0 to GPIO5, GPIO09, GPIO10 and GPIO12 to GPIO16
|
||||
FLAG | 8 bit mask flag register
|
||||
BASE | Module number of a hard-coded device to be used when device specific functionality is needed
|
||||
|
||||
The above example, based on the Generic Module does not allow ADC0 input.
|
||||
|
||||
## GPIO functionality
|
||||
The GPIO functionality numbers are the same is shown by command ``GPIOs``. In addition code 255 is added to select a GPIO as user configurable via the GUI Configure Module menu.
|
||||
|
||||
## FLAG functionality
|
||||
The FLAG value is an 8-bit mask where each bit controls a features. Add FLAG values to set multiple bits.
|
||||
|
||||
FLAG | Mask | Feature description
|
||||
-----|----------|------------------------------
|
||||
1 | xxxxxxx1 | Allowing to use Analog0 (ADC0) as input if define USE_ADC_VCC in ``my_user_config.h`` is disabled
|
||||
2 | xxxxxx1x | Enable GUI pull-up control message
|
||||
4 | xxxxx1xx | Not used
|
||||
8 | xxxx1xxx | Not used
|
||||
16 | xxx1xxxx | Not used
|
||||
32 | xx1xxxxx | Not used
|
||||
64 | x1xxxxxx | Not used
|
||||
128 | 1xxxxxxx | Not used
|
||||
|
||||
## BASE functionality
|
||||
The following table lists hard-coded device specific functionality. Notice that not all device modules need special handling.
|
||||
|
||||
BASE | Module | Description
|
||||
-----|----------------|----------------------------------------------
|
||||
4 | Sonoff Dual | Process relay and button via hardware serial interface using GPIO01 and GPIO03. Change baudrate to 19200 bps. Process buttons as single press only
|
||||
9 | Sonoff Touch | Invert ledstate 1 functionality
|
||||
10 | Sonoff LED | Set light type to 2 PWM channels disregarding SetOption15. Fix device specific LED instabilities by disabling GPIO04, GPIO5 and GPIO14
|
||||
12 | 4 Channel | See 4
|
||||
13 | Motor C/AC | Force all relays ON at Power On and disable command ``PowerOnState``
|
||||
15 | EXS Relay(s) | Enable pulse latching using even/odd numbered relay pairs
|
||||
18 | Generic | Show Wemos specific pin information in GUI
|
||||
19 | H801 | Change hardware UART Tx from GPIO01 to GPIO02
|
||||
20 | Sonoff SC | Enable and Process data via hardware serial interface using GPIO01 and GPIO03. Change baudrate to 19200 bps
|
||||
21 | Sonoff BN-SZ | Set light type to 1 PWM channel disregarding SetOption15
|
||||
22 | Sonoff 4CH Pro | Button handling disregarding SetOption13 only allowing single press to enable RF learning while holding the button
|
||||
24 | Sonoff Bridge | Enable and Process data via hardware serial interface using GPIO01 and GPIO03. Change baudrate to 19200 bps. Process 16 buttons in web GUI. Enable EFM8BB1 firmware upload
|
||||
25 | Sonoff B1 | Set light type to RGBWC using MY92x1
|
||||
26 | AiLight | Set light type to RGBW using MY92x1
|
||||
27 | Sonoff T1 1CH | See 9
|
||||
28 | Sonoff T1 2CH | See 9
|
||||
29 | Sonoff T1 3CH | See 9
|
||||
38 | Sonoff Dual R2 | Process buttons as single press only
|
||||
43 | Sonoff iFan02 | Enable command ``Fanspeed``. Disable Interlock and PulseTime. Tune status information, MQTT data and GUI. Sync with microcontroller. Process Domoticz Fan state
|
||||
47 | Xiaomi Philips | Process Color Temperature using PWM2 and Intensity using PWM1
|
||||
53 | Tuya Dimmer | Enable and Process data via software or hardware serial interface using GPIO 148 and 149 or forced GPIO01 and GPIO03. Change baudrate to 9600 bps. Process all Buttons
|
||||
55 | ARMTR Dimmer | Enable and Process data via software or hardware serial interface using GPIO 148 and 149. Change baudrate to 115200 bps.
|
||||
57 | PS-16-DZ | Enable and Process data via software or hardware serial interface using GPIO 148 and 149. Change baudrate to 19200 bps.
|
||||
61 | YTF IR Bridge | Disable serial interface to stop loopback
|
||||
65 | Mi Desk Lamp | Process rotary and Button1 data specific to this device
|
||||
|
||||
## Usage
|
||||
A user provided template can be stored in Sonoff-Tasmota using the ``Template`` command. It has the following options.
|
||||
|
||||
Command | Payload | Description
|
||||
---------|----------|---------------------------------------
|
||||
Template | | Show current user template
|
||||
Template | 0 | Copy active module template to user template
|
||||
Template | 1 .. 69 | Copy hard-coded module template to user template
|
||||
|
||||
The following command will store a complete template based on the Generic module
|
||||
``Template {"NAME":"UserModule1","GPIO":[17,243,29,244,7,201,255,255,138,255,139,255,255],"FLAG":0,"BASE":18}``
|
||||
|
||||
The following command will update the name of a stored template
|
||||
``Template {"NAME":"UserModule2"}``
|
||||
|
||||
The following command will update the flag of a stored template
|
||||
``Template {"FLAG":1}``
|
||||
|
||||
The following command will update the base of a stored template to Generic
|
||||
``Template {"BASE":0}``
|
@ -14,6 +14,7 @@ TasmotaSerial KEYWORD1
|
||||
#######################################
|
||||
|
||||
begin KEYWORD2
|
||||
hardwareSerial KEYWORD2
|
||||
read KEYWORD2
|
||||
write KEYWORD2
|
||||
available KEYWORD2
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "TasmotaSerial",
|
||||
"version": "2.2.0",
|
||||
"version": "2.3.0",
|
||||
"keywords": [
|
||||
"serial", "io", "TasmotaSerial"
|
||||
],
|
@ -1,5 +1,5 @@
|
||||
name=TasmotaSerial
|
||||
version=2.2.0
|
||||
version=2.3.0
|
||||
author=Theo Arends
|
||||
maintainer=Theo Arends <theo@arends.com>
|
||||
sentence=Implementation of software serial with hardware serial fallback for ESP8266.
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
TasmotaSerial.cpp - Minimal implementation of software serial for Tasmota
|
||||
|
||||
Copyright (C) 2018 Theo Arends
|
||||
Copyright (C) 2019 Theo Arends
|
||||
|
||||
This library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -100,7 +100,7 @@ TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fal
|
||||
m_buffer = (uint8_t*)malloc(TM_SERIAL_BUFFER_SIZE);
|
||||
if (m_buffer == NULL) return;
|
||||
// Use getCycleCount() loop to get as exact timing as possible
|
||||
m_bit_time = ESP.getCpuFreqMHz() *1000000 /TM_SERIAL_BAUDRATE;
|
||||
m_bit_time = F_CPU / TM_SERIAL_BAUDRATE;
|
||||
pinMode(m_rx_pin, INPUT);
|
||||
tms_obj_list[m_rx_pin] = this;
|
||||
attachInterrupt(m_rx_pin, ISRList[m_rx_pin], FALLING);
|
||||
@ -145,7 +145,7 @@ bool TasmotaSerial::begin(long speed, int stop_bits) {
|
||||
}
|
||||
} else {
|
||||
// Use getCycleCount() loop to get as exact timing as possible
|
||||
m_bit_time = ESP.getCpuFreqMHz() *1000000 /speed;
|
||||
m_bit_time = F_CPU / speed;
|
||||
m_high_speed = (speed > 9600);
|
||||
}
|
||||
return m_valid;
|
||||
@ -257,7 +257,7 @@ void TasmotaSerial::rxRead()
|
||||
TM_SERIAL_WAIT;
|
||||
}
|
||||
// Store the received value in the buffer unless we have an overflow
|
||||
int next = (m_in_pos+1) % TM_SERIAL_BUFFER_SIZE;
|
||||
unsigned int next = (m_in_pos+1) % TM_SERIAL_BUFFER_SIZE;
|
||||
if (next != (int)m_out_pos) {
|
||||
m_buffer[m_in_pos] = rec;
|
||||
m_in_pos = next;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
TasmotaSerial.h - Minimal implementation of software serial for Tasmota
|
||||
|
||||
Copyright (C) 2018 Theo Arends
|
||||
Copyright (C) 2019 Theo Arends
|
||||
|
||||
This library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -22,7 +22,7 @@
|
||||
/*********************************************************************************************\
|
||||
* 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)
|
||||
* Based on EspSoftwareSerial v3.4.3 by Peter Lerup (https://github.com/plerup/espsoftwareserial)
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define TM_SERIAL_BAUDRATE 9600 // Default baudrate
|
@ -65,7 +65,7 @@ build_flags = ${esp82xx_defaults.build_flags}
|
||||
-DVTABLES_IN_FLASH
|
||||
|
||||
[core_2_5_0]
|
||||
; *** Esp8266 core for Arduino version Core 2.5.0 beta3 tested for Tasmota
|
||||
; *** Esp8266 core for Arduino version 2.5.0 release (still not available via platformio)
|
||||
platform = https://github.com/Jason2866/platform-espressif8266.git#Tasmota
|
||||
build_flags = ${esp82xx_defaults.build_flags}
|
||||
-Wl,-Teagle.flash.1m.ld
|
||||
@ -130,12 +130,12 @@ board_build.flash_mode = dout
|
||||
|
||||
platform = ${core_active.platform}
|
||||
build_flags = ${core_active.build_flags}
|
||||
; -DUSE_CLASSIC
|
||||
; -DBE_MINIMAL
|
||||
; -DUSE_SENSORS
|
||||
; -DUSE_BASIC
|
||||
; -DUSE_KNX_NO_EMULATION
|
||||
; -DUSE_DISPLAYS
|
||||
; -DFIRMWARE_CLASSIC
|
||||
; -DFIRMWARE_MINIMAL
|
||||
; -DFIRMWARE_SENSORS
|
||||
; -DFIRMWARE_BASIC
|
||||
; -DFIRMWARE_KNX_NO_EMULATION
|
||||
; -DFIRMWARE_DISPLAYS
|
||||
; -DUSE_CONFIG_OVERRIDE
|
||||
|
||||
; *** Fix espressif8266@1.7.0 induced undesired all warnings
|
||||
@ -184,7 +184,7 @@ board = ${common.board}
|
||||
board_build.flash_mode = ${common.board_build.flash_mode}
|
||||
board_build.f_cpu = ${common.board_build.f_cpu}
|
||||
build_unflags = ${common.build_unflags}
|
||||
build_flags = ${common.build_flags} -DBE_MINIMAL
|
||||
build_flags = ${common.build_flags} -DFIRMWARE_MINIMAL
|
||||
monitor_speed = ${common.monitor_speed}
|
||||
upload_port = ${common.upload_port}
|
||||
upload_resetmethod = ${common.upload_resetmethod}
|
||||
@ -198,7 +198,7 @@ board = ${common.board}
|
||||
board_build.flash_mode = ${common.board_build.flash_mode}
|
||||
board_build.f_cpu = ${common.board_build.f_cpu}
|
||||
build_unflags = ${common.build_unflags}
|
||||
build_flags = ${common.build_flags} -DUSE_BASIC
|
||||
build_flags = ${common.build_flags} -DFIRMWARE_BASIC
|
||||
monitor_speed = ${common.monitor_speed}
|
||||
upload_port = ${common.upload_port}
|
||||
upload_resetmethod = ${common.upload_resetmethod}
|
||||
@ -212,7 +212,7 @@ board = ${common.board}
|
||||
board_build.flash_mode = ${common.board_build.flash_mode}
|
||||
board_build.f_cpu = ${common.board_build.f_cpu}
|
||||
build_unflags = ${common.build_unflags}
|
||||
build_flags = ${common.build_flags} -DUSE_CLASSIC
|
||||
build_flags = ${common.build_flags} -DFIRMWARE_CLASSIC
|
||||
monitor_speed = ${common.monitor_speed}
|
||||
upload_port = ${common.upload_port}
|
||||
upload_resetmethod = ${common.upload_resetmethod}
|
||||
@ -226,7 +226,7 @@ board = ${common.board}
|
||||
board_build.flash_mode = ${common.board_build.flash_mode}
|
||||
board_build.f_cpu = ${common.board_build.f_cpu}
|
||||
build_unflags = ${common.build_unflags}
|
||||
build_flags = ${common.build_flags} -DUSE_KNX_NO_EMULATION
|
||||
build_flags = ${common.build_flags} -DFIRMWARE_KNX_NO_EMULATION
|
||||
monitor_speed = ${common.monitor_speed}
|
||||
upload_port = ${common.upload_port}
|
||||
upload_resetmethod = ${common.upload_resetmethod}
|
||||
@ -240,7 +240,7 @@ board = ${common.board}
|
||||
board_build.flash_mode = ${common.board_build.flash_mode}
|
||||
board_build.f_cpu = ${common.board_build.f_cpu}
|
||||
build_unflags = ${common.build_unflags}
|
||||
build_flags = ${common.build_flags} -DUSE_SENSORS
|
||||
build_flags = ${common.build_flags} -DFIRMWARE_SENSORS
|
||||
monitor_speed = ${common.monitor_speed}
|
||||
upload_port = ${common.upload_port}
|
||||
upload_resetmethod = ${common.upload_resetmethod}
|
||||
@ -254,7 +254,7 @@ board = ${common.board}
|
||||
board_build.flash_mode = ${common.board_build.flash_mode}
|
||||
board_build.f_cpu = ${common.board_build.f_cpu}
|
||||
build_unflags = ${common.build_unflags}
|
||||
build_flags = ${common.build_flags} -DUSE_DISPLAYS
|
||||
build_flags = ${common.build_flags} -DFIRMWARE_DISPLAYS
|
||||
monitor_speed = ${common.monitor_speed}
|
||||
upload_port = ${common.upload_port}
|
||||
upload_resetmethod = ${common.upload_resetmethod}
|
||||
|
@ -1,4 +1,30 @@
|
||||
/* 6.4.1.12 20190128
|
||||
/* 6.4.1.16 20190211
|
||||
* Initial support for online template change using command Template or GUI Configure Other (#5177)
|
||||
*
|
||||
* 6.4.1.15 20190208
|
||||
* Change image name BE_MINIMAL to FIRMWARE_MINIMAL (#5106)
|
||||
* Change image names USE_xyz to FIRMWARE_xyz (#5106)
|
||||
* Add command SerialDelimiter 128 to filter reception of only characters between ASCII 32 and 127 (#5131)
|
||||
* Add status message to former declined group commands (#5145)
|
||||
*
|
||||
* 6.4.1.14 20190203
|
||||
* Add SetOption32 until SetOption49 diagnostic information to Status 3 report as replacement for second property value in SetOption property name
|
||||
* Add Resolution property to Status 3 report providing previous SetOption second value property
|
||||
* Fix IR local echo
|
||||
* Add user configuration of HLW8012 and HJL-01/BL0937 Energy Monitoring as used in Sonoff S31, Pow Ra and many Tuya based devices
|
||||
* Add user configuration of MCP39F501 Energy Monitoring as used in Shelly2
|
||||
* Add support for multiple ADS1115 I2C devices (#5083)
|
||||
* Add rule support for "==", "!=" ">=" and "<=" (#5122)
|
||||
* Add Hass status sensor (#5139)
|
||||
* Change GUI weblog solving possible empty screens (#5154)
|
||||
* Change PN532 support from I2C to Serial for more stability (#5162)
|
||||
* Add MHZ19 Temperature as Domoticz Temperature selection (#5128)
|
||||
*
|
||||
* 6.4.1.13 20190130
|
||||
* Add command SetOption36 to control boot loop default restoration (#4645, #5063)
|
||||
* Add resiliency to saved Settings (#5065)
|
||||
*
|
||||
* 6.4.1.12 20190128
|
||||
* Change code use of boolean to bool and byte to uint8_t
|
||||
* Change code uint8_t flags to bool flags
|
||||
*
|
||||
|
@ -113,6 +113,7 @@
|
||||
#define D_JSON_PROGRAMSIZE "ProgramSize"
|
||||
#define D_JSON_REFERENCETEMPERATURE "ReferenceTemperature"
|
||||
#define D_JSON_RESET "Reset"
|
||||
#define D_JSON_RESOLUTION "Resolution"
|
||||
#define D_JSON_RESTARTING "Restarting"
|
||||
#define D_JSON_RESTARTREASON "RestartReason"
|
||||
#define D_JSON_RSSI "RSSI"
|
||||
@ -159,6 +160,7 @@
|
||||
#define D_JSON_ZERO_POINT_CALIBRATION "Zero Point Calibration"
|
||||
|
||||
#define D_RSLT_ENERGY "ENERGY"
|
||||
#define D_RSLT_HASS_STATE "HASS_STATE"
|
||||
#define D_RSLT_INFO "INFO"
|
||||
#define D_RSLT_MARGINS "MARGINS"
|
||||
#define D_RSLT_POWER "POWER"
|
||||
@ -168,6 +170,8 @@
|
||||
#define D_RSLT_UPTIME "UPTIME"
|
||||
#define D_RSLT_WARNING "WARNING"
|
||||
|
||||
#define D_LOG_SOME_SETTINGS_RESET "Some settings have been reset"
|
||||
|
||||
// Commands sonoff.ino
|
||||
#define D_CMND_BACKLOG "Backlog"
|
||||
#define D_CMND_DELAY "Delay"
|
||||
@ -259,7 +263,11 @@
|
||||
#define D_CMND_SERIALSEND "SerialSend"
|
||||
#define D_CMND_SERIALDELIMITER "SerialDelimiter"
|
||||
#define D_CMND_BAUDRATE "Baudrate"
|
||||
#define D_LOG_SOME_SETTINGS_RESET "Some settings have been reset"
|
||||
#define D_CMND_TEMPLATE "Template"
|
||||
#define D_JSON_NAME "NAME"
|
||||
#define D_JSON_GPIO "GPIO"
|
||||
#define D_JSON_FLAG "FLAG"
|
||||
#define D_JSON_BASE "BASE"
|
||||
|
||||
// Commands xdrv_01_mqtt.ino
|
||||
#define D_CMND_MQTTHOST "MqttHost"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Период на телеметрия"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Други параметри"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Парола на уеб администратора"
|
||||
#define D_MQTT_ENABLE "Активиране на MQTT"
|
||||
#define D_FRIENDLY_NAME "Приятелско име"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "Ю"
|
||||
#define D_TX20_WEST "З"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_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_DFR562 "MP3 плейър"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Ключ" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Бутон" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Реле" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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 "Подсветка"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF датчик"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_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_DFR562 "MP3 плейър"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Ключ" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Бутон" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Реле" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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 "Подсветка"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF датчик"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Interval telemetrie"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Další nastavení"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Heslo Web administrátora"
|
||||
#define D_MQTT_ENABLE "MQTT aktivní"
|
||||
#define D_FRIENDLY_NAME "Friendly Name"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "J"
|
||||
#define D_TX20_WEST "Z"
|
||||
|
||||
// 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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Spínač" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Tlačítko" // 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čítadlo" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Spínač" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Tlačítko" // 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čítadlo" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Telemetrieperiode"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Sonstige Einstellungen"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Passwort für Web Oberfläche"
|
||||
#define D_MQTT_ENABLE "MQTT aktivieren"
|
||||
#define D_FRIENDLY_NAME "Name [friendly name]"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// 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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Περίοδος τηλεμετρίας"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Άλλες παράμετροι"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Κωδικός διαχειριστή"
|
||||
#define D_MQTT_ENABLE "Ενεργοποίηση MQTT"
|
||||
#define D_FRIENDLY_NAME "Φιλική ονομασία"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "Ν"
|
||||
#define D_TX20_WEST "Δ"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Διακόπτης" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Κουμπί" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Ρελέ" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Διακόπτης" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Κουμπί" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Ρελέ" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Telemetry period"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Other parameters"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Web Admin Password"
|
||||
#define D_MQTT_ENABLE "MQTT enable"
|
||||
#define D_FRIENDLY_NAME "Friendly Name"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// 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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Período de Telemetría"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Otros parámetros"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Clave Administrador Web"
|
||||
#define D_MQTT_ENABLE "Habilitar MQTT"
|
||||
#define D_FRIENDLY_NAME "Nombre Amigable"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "O"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Ninguno"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IR TX"
|
||||
#define D_SENSOR_SWITCH "Llave" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Botón" // 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 "Contador" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IR RX"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_NONE "Ninguno"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IR Tx"
|
||||
#define D_SENSOR_SWITCH "Llave" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Botón" // 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 "Contador" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IR Rx"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Période télémétrie"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Autres paramètres"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Mot de passe Web Admin"
|
||||
#define D_MQTT_ENABLE "MQTT activé"
|
||||
#define D_FRIENDLY_NAME "Surnom"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "O"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Aucun"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "ÉmetIR"
|
||||
#define D_SENSOR_SWITCH "Inter." // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Bouton" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Relais" // Suffix "1i"
|
||||
#define D_SENSOR_LED "LED" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_COUNTER "Compteur" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "RécptIR"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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 "RétroÉcl"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_NONE "Aucun"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "ÉmetIR"
|
||||
#define D_SENSOR_SWITCH "Inter." // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Bouton" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Relais" // Suffix "1i"
|
||||
#define D_SENSOR_LED "LED" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_COUNTER "Compteur" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "RécptIR"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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 "RétroÉcl"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Telemetry period"
|
||||
|
||||
#define D_OTHER_PARAMETERS "פרמטרים שונים"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "סיסמת מנהל - אתר"
|
||||
#define D_MQTT_ENABLE "MQTT אפשר"
|
||||
#define D_FRIENDLY_NAME "שם ידידותי"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// 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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "מתג" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "לחצן" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "ממסר" // Suffix "1i"
|
||||
#define D_SENSOR_LED "לד" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "מתג" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "לחצן" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "ממסר" // Suffix "1i"
|
||||
#define D_SENSOR_LED "לד" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Telemetria (mp.)"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Egyéb beállítások"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Web admin jelszó"
|
||||
#define D_MQTT_ENABLE "MQTT engedélyezése"
|
||||
#define D_FRIENDLY_NAME "Név"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "D"
|
||||
#define D_TX20_WEST "NY"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Nincs"
|
||||
#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_DFR562 "MP3 lejátszó"
|
||||
#define D_SENSOR_IRSEND "IR adó"
|
||||
#define D_SENSOR_SWITCH "Kapcsoló" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Gomb" // 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 "Számláló" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IR vevő"
|
||||
#define D_SENSOR_MHZ_RX "MHZ RX"
|
||||
#define D_SENSOR_MHZ_TX "MHZ TX"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 RX"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 RX"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 RX"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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 "Háttérfény"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 RX"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 TX"
|
||||
#define D_SENSOR_SBR_RX "SerBr RX"
|
||||
#define D_SENSOR_SBR_TX "SerBr TX"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 TX"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 RX"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 TX"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 RX"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFsend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya TX"
|
||||
#define D_SENSOR_TUYA_RX "Tuya RX"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ RX"
|
||||
#define D_SENSOR_AZ_TX "AZ TX"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_NONE "Nincs"
|
||||
#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_DFR562 "MP3 lejátszó"
|
||||
#define D_SENSOR_IRSEND "IR adó"
|
||||
#define D_SENSOR_SWITCH "Kapcsoló" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Gomb" // 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 "Számláló" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IR vevő"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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 "Háttérfény"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Periodo Telemetria"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Altri parametri"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Password Amministratore Web"
|
||||
#define D_MQTT_ENABLE "Abilita MQTT"
|
||||
#define D_FRIENDLY_NAME "Nome confidenziale"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Nessuno"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_NONE "Nessuno"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Telemetry periode"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Overige parameters"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Web Admin Wachtwoord"
|
||||
#define D_MQTT_ENABLE "MQTT ingeschakeld"
|
||||
#define D_FRIENDLY_NAME "Beschrijvende naam"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Geen"
|
||||
#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_DFR562 "MP3 Speler"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Switch" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Button" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Relais" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_COUNTER "Teller" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_NONE "Geen"
|
||||
#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_DFR562 "MP3 Speler"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Switch" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Button" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Relais" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_COUNTER "Teller" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Okres telemetrii"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Inne parametry"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Hasło administratora Web"
|
||||
#define D_MQTT_ENABLE "MQTT aktywne"
|
||||
#define D_FRIENDLY_NAME "Twoja nazwa"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Brak"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Przela" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Przyci" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Przek" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_COUNTER "Liczni" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_NONE "Brak"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Przela" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Przyci" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Przek" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_COUNTER "Liczni" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Período de telemetria"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Outros parâmetros"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Senha de WEB Admin"
|
||||
#define D_MQTT_ENABLE "MQTT habilitado"
|
||||
#define D_FRIENDLY_NAME "Nome amigável"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Nenhum"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Interruptor" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Botão" // 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 "Contador" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHz Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHz Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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 "Luz de fundo"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_NONE "Nenhum"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Interruptor" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Botão" // 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 "Contador" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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 "Luz de fundo"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Periodo de Telemetria"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Outros parametros"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Palavra Chave de WEB Admin"
|
||||
#define D_MQTT_ENABLE "MQTT habilitado"
|
||||
#define D_FRIENDLY_NAME "Nome amigável"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Nenhum"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Interruptor" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Botão" // 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 "Contador" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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 "Luz negra"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_NONE "Nenhum"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Interruptor" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Botão" // 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 "Contador" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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 "Luz negra"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Период телеметрии"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Параметры Прочие"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Пароль Web администратора"
|
||||
#define D_MQTT_ENABLE "MQTT активен"
|
||||
#define D_FRIENDLY_NAME "Дружественное Имя"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Свич" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Кнопка" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Реле" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Свич" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Кнопка" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Реле" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "А"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Interval telemetrie"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Ostatné nastavenia"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Heslo Web administrátora"
|
||||
#define D_MQTT_ENABLE "MQTT aktívne"
|
||||
#define D_FRIENDLY_NAME "Friendly Name"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "J"
|
||||
#define D_TX20_WEST "Z"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Žiaden"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Spínač" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Tlačidlo" // 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čítadlo" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Senzor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_NONE "Žiaden"
|
||||
#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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Spínač" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Tlačidlo" // 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čítadlo" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Senzor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Telemetriperiod"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Andra parametrar"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Webbadmin-lösenord"
|
||||
#define D_MQTT_ENABLE "MQTT aktivera"
|
||||
#define D_FRIENDLY_NAME "Läsbart namn"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "V"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_NONE "Ingen"
|
||||
#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_DFR562 "MP3-spelare"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Omkopplare" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Knapp" // 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 "Räknare" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_NONE "Ingen"
|
||||
#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_DFR562 "MP3-spelare"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Omkopplare" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Knapp" // 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 "Räknare" // Suffix "1"
|
||||
#define D_SENSOR_IRRECV "IRrecv"
|
||||
#define D_SENSOR_MHZ_RX "MHZ Rx"
|
||||
#define D_SENSOR_MHZ_TX "MHZ Tx"
|
||||
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Telemetri peryodu"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Diğer parametreler"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Web Yönetici Şifresi"
|
||||
#define D_MQTT_ENABLE "MQTT aktif"
|
||||
#define D_FRIENDLY_NAME "Kullanıcı Dostu İsim"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// 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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "A"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "Період телеметрії"
|
||||
|
||||
#define D_OTHER_PARAMETERS "Параметри Інше"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "Гасло Web адміністратора"
|
||||
#define D_MQTT_ENABLE "MQTT активний"
|
||||
#define D_FRIENDLY_NAME "Дружнє Ім'я"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Перемикач" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Кнопка" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Реле" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_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_DFR562 "MP3 Player"
|
||||
#define D_SENSOR_IRSEND "IRsend"
|
||||
#define D_SENSOR_SWITCH "Перемикач" // Suffix "1"
|
||||
#define D_SENSOR_BUTTON "Кнопка" // Suffix "1"
|
||||
#define D_SENSOR_RELAY "Реле" // Suffix "1i"
|
||||
#define D_SENSOR_LED "Led" // Suffix "1i"
|
||||
#define D_SENSOR_PWM "PWM" // Suffix "1"
|
||||
#define D_SENSOR_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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "А"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "上报周期"
|
||||
|
||||
#define D_OTHER_PARAMETERS "其他设置"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "WEB 管理密码"
|
||||
#define D_MQTT_ENABLE "启用MQTT"
|
||||
#define D_FRIENDLY_NAME "昵称"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// sonoff_template.h
|
||||
#define D_SENSOR_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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#define D_SENSOR_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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "安"
|
||||
|
@ -288,6 +288,7 @@
|
||||
#define D_TELEMETRY_PERIOD "上報周期"
|
||||
|
||||
#define D_OTHER_PARAMETERS "其他設置"
|
||||
#define D_TEMPLATE "Template"
|
||||
#define D_WEB_ADMIN_PASSWORD "WEB管理密碼"
|
||||
#define D_MQTT_ENABLE "啟用MQTT"
|
||||
#define D_FRIENDLY_NAME "昵稱"
|
||||
@ -481,69 +482,89 @@
|
||||
#define D_TX20_SOUTH "S"
|
||||
#define D_TX20_WEST "W"
|
||||
|
||||
// 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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDM120/220 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDM120/220 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfer"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Reset"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MAX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MAX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MAX31855 DO"
|
||||
// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box
|
||||
#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_DFR562 "MP3 Player"
|
||||
#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_PZEM004_RX "PZEM004 Rx"
|
||||
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
|
||||
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
|
||||
#define D_SENSOR_PZEM0XX_TX "PZEM0XX 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_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
#define D_SENSOR_SR04_ECHO "SR04 Ech"
|
||||
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
|
||||
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
|
||||
#define D_SENSOR_SDM630_TX "SDM630 Tx"
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_TX20_TX "TX20"
|
||||
#define D_SENSOR_RFSEND "RFSend"
|
||||
#define D_SENSOR_RFRECV "RFrecv"
|
||||
#define D_SENSOR_TUYA_TX "Tuya Tx"
|
||||
#define D_SENSOR_TUYA_RX "Tuya Rx"
|
||||
#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr"
|
||||
#define D_SENSOR_MGC3130_RESET "MGC3130 Rst"
|
||||
#define D_SENSOR_SSPI_MISO "SSPI MISO"
|
||||
#define D_SENSOR_SSPI_MOSI "SSPI MOSI"
|
||||
#define D_SENSOR_SSPI_SCLK "SSPI SCLK"
|
||||
#define D_SENSOR_SSPI_CS "SSPI CS"
|
||||
#define D_SENSOR_SSPI_DC "SSPI DC"
|
||||
#define D_SENSOR_RF_SENSOR "RF Sensor"
|
||||
#define D_SENSOR_AZ_RX "AZ Rx"
|
||||
#define D_SENSOR_AZ_TX "AZ Tx"
|
||||
#define D_SENSOR_MAX31855_CS "MX31855 CS"
|
||||
#define D_SENSOR_MAX31855_CLK "MX31855 CLK"
|
||||
#define D_SENSOR_MAX31855_DO "MX31855 DO"
|
||||
#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i"
|
||||
#define D_SENSOR_NRG_CF1 "HLWBL CF1"
|
||||
#define D_SENSOR_HLW_CF "HLW8012 CF"
|
||||
#define D_SENSOR_HJL_CF "BL0937 CF"
|
||||
#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx"
|
||||
#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx"
|
||||
#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst"
|
||||
#define D_SENSOR_CSE7766_TX "CSE7766 Tx"
|
||||
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
|
||||
#define D_SENSOR_PN532_TX "PN532 Tx"
|
||||
#define D_SENSOR_PN532_RX "PN532 Rx"
|
||||
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
|
||||
#define D_SENSOR_SM16716_DAT "SM16716 DAT"
|
||||
#define D_SENSOR_SM16716_POWER "SM16716 PWR"
|
||||
#define D_SENSOR_MY92X1_DI "MY92x1 DI"
|
||||
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
|
||||
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
|
||||
#define D_SENSOR_TXD "Serial Tx"
|
||||
#define D_SENSOR_RXD "Serial Rx"
|
||||
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
|
||||
|
||||
// Units
|
||||
#define D_UNIT_AMPERE "安"
|
||||
|
@ -54,6 +54,7 @@
|
||||
|
||||
#define SAVE_DATA 1 // [SaveData] Save changed parameters to Flash (0 = disable, 1 - 3600 seconds)
|
||||
#define SAVE_STATE 1 // [SetOption0] Save changed power state to Flash (0 = disable, 1 = enable)
|
||||
#define BOOT_LOOP_OFFSET 1 // [SetOption36] Number of boot loops before starting restoring defaults (0 = disable, 1..200 = boot loops offset)
|
||||
|
||||
// -- Wifi ----------------------------------------
|
||||
#define WIFI_IP_ADDRESS "0.0.0.0" // [IpAddress1] Set to 0.0.0.0 for using DHCP or enter a static IP address
|
||||
@ -325,9 +326,6 @@
|
||||
// #define USE_DS3231 // Enable DS3231 external RTC in case no Wifi is avaliable. See docs in the source file (+1k2 code)
|
||||
// #define USE_RTC_ADDR 0x68 // Default I2C address 0x68
|
||||
// #define USE_MGC3130 // Enable MGC3130 Electric Field Effect Sensor (I2C address 0x42) (+2k7 code, 0k3 mem)
|
||||
// #define USE_PN532_I2C // Enable PN532 - Near Field Communication (NFC) controller (+1k7 code, 164 bytes of mem)
|
||||
// #define USE_PN532_DATA_FUNCTION // Enable PN532 DATA Usage using Sensor15 command (+1k6 code, 316 bytes of mem)
|
||||
// #define USE_PN532_CAUSE_EVENTS // Enable PN532 driver to cause event's on card read in addition to immediate telemetry (+64 bytes code, 48 bytes mem)
|
||||
// #define USE_MAX44009 // Enable MAX44009 Ambient Light sensor (I2C addresses 0x4A and 0x4B) (+0k8 code)
|
||||
|
||||
// #define USE_DISPLAY // Add I2C Display Support (+2k code)
|
||||
@ -377,6 +375,10 @@
|
||||
#define USE_ARMTRONIX_DIMMERS // Add support for Armtronix Dimmers (+1k4 code)
|
||||
#define USE_PS_16_DZ // Add support for PS-16-DZ Dimmer
|
||||
//#define USE_AZ7798 // Add support for AZ-Instrument 7798 CO2 datalogger (+1k6 code)
|
||||
//#define USE_PN532_HSU // Add support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem)
|
||||
// #define USE_PN532_CAUSE_EVENTS // Cause event execution for PN532_UID= and PN532_DATA=[if defined] (+ 30 bytes code)
|
||||
// #define USE_PN532_DATA_FUNCTION // Add sensor40 command support for erase, setting data block content (+1k7 code, 388 bytes mem)
|
||||
// #define USE_PN532_DATA_RAW // Allow DATA block to be used by non-alpha-numberic data (+ 80 bytes code, 48 bytes ram)
|
||||
|
||||
// Power monitoring sensors -----------------------
|
||||
#define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code)
|
||||
@ -416,6 +418,8 @@
|
||||
// #define USE_THEO_V2 // Add support for decoding Theo V2 sensors as documented on https://sidweb.nl using 434MHz RF sensor receiver (+1k4 code)
|
||||
// #define USE_ALECTO_V2 // Add support for decoding Alecto V2 sensors like ACH2010, WS3000 and DKW2012 weather stations using 868MHz RF sensor receiver (+1k7 code)
|
||||
|
||||
#define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code)
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Debug features are only supported in development branch
|
||||
\*********************************************************************************************/
|
||||
@ -428,12 +432,12 @@
|
||||
* See RELEASENOTES.md for selected features
|
||||
\*********************************************************************************************/
|
||||
|
||||
//#define USE_CLASSIC // Create sonoff-classic with initial configuration tools WPS, SmartConfig and WifiManager
|
||||
//#define USE_BASIC // Create sonoff-basic with no sensors
|
||||
//#define USE_SENSORS // Create sonoff-sensors with useful sensors enabled
|
||||
//#define USE_KNX_NO_EMULATION // Create sonoff-knx with KNX but without Emulation
|
||||
//#define USE_DISPLAYS // Create sonoff-display with display drivers enabled
|
||||
//#define BE_MINIMAL // Create sonoff-minimal as intermediate firmware for OTA-MAGIC
|
||||
//#define FIRMWARE_CLASSIC // Create sonoff-classic with initial configuration tools WPS, SmartConfig and WifiManager
|
||||
//#define FIRMWARE_BASIC // Create sonoff-basic with no sensors
|
||||
//#define FIRMWARE_SENSORS // Create sonoff-sensors with useful sensors enabled
|
||||
//#define FIRMWARE_KNX_NO_EMULATION // Create sonoff-knx with KNX but without Emulation
|
||||
//#define FIRMWARE_DISPLAYS // Create sonoff-display with display drivers enabled
|
||||
//#define FIRMWARE_MINIMAL // Create sonoff-minimal as intermediate firmware for OTA-MAGIC
|
||||
|
||||
/*********************************************************************************************\
|
||||
* No user configurable items below
|
||||
|
@ -163,6 +163,20 @@ typedef union {
|
||||
};
|
||||
} Mcp230xxCfg;
|
||||
|
||||
typedef union {
|
||||
uint8_t data;
|
||||
struct {
|
||||
uint8_t spare0 : 1;
|
||||
uint8_t spare1 : 1;
|
||||
uint8_t spare2 : 1;
|
||||
uint8_t spare3 : 1;
|
||||
uint8_t spare4 : 1;
|
||||
uint8_t spare5 : 1;
|
||||
uint8_t spare6 : 1;
|
||||
uint8_t mhz19b_abc_disable : 1; // Disable ABC (Automatic Baseline Correction for MHZ19(B) (0 = Enabled (default), 1 = Disabled with Sensor15 command)
|
||||
};
|
||||
} SensorCfg1;
|
||||
|
||||
/*
|
||||
struct SYSCFG {
|
||||
unsigned long cfg_holder; // 000 Pre v6 header
|
||||
@ -311,13 +325,13 @@ struct SYSCFG {
|
||||
uint8_t knx_CB_param[MAX_KNX_CB]; // 6EC Type of Output (set relay, toggle relay, reply sensor value)
|
||||
Mcp230xxCfg mcp230xx_config[16]; // 6F6
|
||||
uint8_t mcp230xx_int_prio; // 716
|
||||
|
||||
uint8_t free_717[1]; // 717
|
||||
|
||||
SensorCfg1 SensorBits1; // 717 On/Off settings used by Sensor Commands
|
||||
uint16_t mcp230xx_int_timer; // 718
|
||||
uint8_t rgbwwTable[5]; // 71A
|
||||
uint8_t user_template_base; // 71F
|
||||
mytmplt user_template; // 720 29 bytes
|
||||
|
||||
uint8_t free_71F[117]; // 71F
|
||||
uint8_t free_73D[87]; // 73D
|
||||
|
||||
uint32_t drivers[3]; // 794
|
||||
uint32_t monitors; // 7A0
|
||||
|
@ -391,7 +391,7 @@ void SettingsSave(uint8_t rotate)
|
||||
* stop_flash_rotate 0 = Allow flash slot rotation (SetOption12 0)
|
||||
* stop_flash_rotate 1 = Allow only eeprom flash slot use (SetOption12 1)
|
||||
*/
|
||||
#ifndef BE_MINIMAL
|
||||
#ifndef FIRMWARE_MINIMAL
|
||||
if ((GetSettingsCrc() != settings_crc) || rotate) {
|
||||
if (1 == rotate) { // Use eeprom flash slot only and disable flash rotate from now on (upgrade)
|
||||
stop_flash_rotate = 1;
|
||||
@ -441,39 +441,58 @@ void SettingsSave(uint8_t rotate)
|
||||
|
||||
settings_crc = Settings.cfg_crc;
|
||||
}
|
||||
#endif // BE_MINIMAL
|
||||
#endif // FIRMWARE_MINIMAL
|
||||
RtcSettingsSave();
|
||||
}
|
||||
|
||||
void SettingsLoad(void)
|
||||
{
|
||||
/* Load configuration from eeprom or one of 7 slots below if first load does not stop_flash_rotate
|
||||
*/
|
||||
// Load configuration from eeprom or one of 7 slots below if first valid load does not stop_flash_rotate
|
||||
struct SYSCFGH {
|
||||
uint16_t cfg_holder; // 000
|
||||
uint16_t cfg_size; // 002
|
||||
unsigned long save_flag; // 004
|
||||
} _SettingsH;
|
||||
unsigned long save_flag = 0;
|
||||
|
||||
bool bad_crc = false;
|
||||
settings_location = SETTINGS_LOCATION +1;
|
||||
settings_location = 0;
|
||||
uint32_t flash_location = SETTINGS_LOCATION +1;
|
||||
for (uint8_t i = 0; i < CFG_ROTATES; i++) {
|
||||
settings_location--;
|
||||
ESP.flashRead(settings_location * SPI_FLASH_SEC_SIZE, (uint32*)&Settings, sizeof(SYSCFG));
|
||||
ESP.flashRead((settings_location -1) * SPI_FLASH_SEC_SIZE, (uint32*)&_SettingsH, sizeof(SYSCFGH));
|
||||
if (Settings.version > 0x06000000) { bad_crc = (Settings.cfg_crc != GetSettingsCrc()); }
|
||||
if (Settings.flag.stop_flash_rotate || bad_crc || (Settings.cfg_holder != _SettingsH.cfg_holder) || (Settings.save_flag > _SettingsH.save_flag)) {
|
||||
break;
|
||||
flash_location--;
|
||||
ESP.flashRead(flash_location * SPI_FLASH_SEC_SIZE, (uint32*)&Settings, sizeof(SYSCFG));
|
||||
|
||||
bool valid = false;
|
||||
if (Settings.version > 0x06000000) {
|
||||
valid = (Settings.cfg_crc == GetSettingsCrc());
|
||||
} else {
|
||||
ESP.flashRead((flash_location -1) * SPI_FLASH_SEC_SIZE, (uint32*)&_SettingsH, sizeof(SYSCFGH));
|
||||
valid = (Settings.cfg_holder == _SettingsH.cfg_holder);
|
||||
}
|
||||
if (valid) {
|
||||
if (Settings.save_flag > save_flag) {
|
||||
save_flag = Settings.save_flag;
|
||||
settings_location = flash_location;
|
||||
if (Settings.flag.stop_flash_rotate && (0 == i)) { // Stop only if eeprom area should be used and it is valid
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delay(1);
|
||||
}
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_CONFIG D_LOADED_FROM_FLASH_AT " %X, " D_COUNT " %d"), settings_location, Settings.save_flag);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
if (settings_location > 0) {
|
||||
ESP.flashRead(settings_location * SPI_FLASH_SEC_SIZE, (uint32*)&Settings, sizeof(SYSCFG));
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_CONFIG D_LOADED_FROM_FLASH_AT " %X, " D_COUNT " %d"),
|
||||
settings_location, Settings.save_flag);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
}
|
||||
|
||||
#ifndef BE_MINIMAL
|
||||
if (bad_crc || (Settings.cfg_holder != (uint16_t)CFG_HOLDER)) { SettingsDefault(); }
|
||||
#ifndef FIRMWARE_MINIMAL
|
||||
if (!settings_location || (Settings.cfg_holder != (uint16_t)CFG_HOLDER)) { // Init defaults if cfg_holder differs from user settings in my_user_config.h
|
||||
SettingsDefault();
|
||||
}
|
||||
settings_crc = GetSettingsCrc();
|
||||
#endif // BE_MINIMAL
|
||||
#endif // FIRMWARE_MINIMAL
|
||||
|
||||
RtcSettingsLoad();
|
||||
}
|
||||
@ -485,7 +504,7 @@ void SettingsErase(uint8_t type)
|
||||
1 = Erase SDK parameter area at end of linker memory model (0x0FDxxx - 0x0FFFFF) solving possible wifi errors
|
||||
*/
|
||||
|
||||
#ifndef BE_MINIMAL
|
||||
#ifndef FIRMWARE_MINIMAL
|
||||
bool result;
|
||||
|
||||
uint32_t _sectorStart = (ESP.getSketchSize() / SPI_FLASH_SEC_SIZE) + 1;
|
||||
@ -514,7 +533,7 @@ void SettingsErase(uint8_t type)
|
||||
}
|
||||
OsWatchLoop();
|
||||
}
|
||||
#endif // BE_MINIMAL
|
||||
#endif // FIRMWARE_MINIMAL
|
||||
}
|
||||
|
||||
// Copied from 2.4.0 as 2.3.0 is incomplete
|
||||
@ -567,6 +586,7 @@ void SettingsDefaultSet2(void)
|
||||
// Settings.flag.value_units = 0;
|
||||
// Settings.flag.stop_flash_rotate = 0;
|
||||
Settings.save_data = SAVE_DATA;
|
||||
Settings.param[P_BOOT_LOOP_OFFSET] = BOOT_LOOP_OFFSET;
|
||||
Settings.sleep = APP_SLEEP;
|
||||
if (Settings.sleep < 50) {
|
||||
Settings.sleep = 50; // Default to 50 for sleep, for now
|
||||
@ -576,6 +596,7 @@ void SettingsDefaultSet2(void)
|
||||
// Settings.flag.interlock = 0;
|
||||
Settings.interlock[0] = 0xFF; // Legacy support using all relays in one interlock group
|
||||
Settings.module = MODULE;
|
||||
ModuleDefault(WEMOS);
|
||||
// for (uint8_t i = 0; i < sizeof(Settings.my_gp); i++) { Settings.my_gp.io[i] = GPIO_NONE; }
|
||||
strlcpy(Settings.friendlyname[0], FRIENDLY_NAME, sizeof(Settings.friendlyname[0]));
|
||||
strlcpy(Settings.friendlyname[1], FRIENDLY_NAME"2", sizeof(Settings.friendlyname[1]));
|
||||
@ -1027,6 +1048,12 @@ void SettingsDelta(void)
|
||||
Settings.interlock[0] = 0xFF; // Legacy support using all relays in one interlock group
|
||||
for (uint8_t i = 1; i < MAX_INTERLOCKS; i++) { Settings.interlock[i] = 0; }
|
||||
}
|
||||
if (Settings.version < 0x0604010D) {
|
||||
Settings.param[P_BOOT_LOOP_OFFSET] = BOOT_LOOP_OFFSET;
|
||||
}
|
||||
if (Settings.version < 0x06040110) {
|
||||
ModuleDefault(WEMOS);
|
||||
}
|
||||
|
||||
Settings.version = VERSION;
|
||||
SettingsSave(1);
|
||||
|
@ -168,6 +168,8 @@ typedef unsigned long power_t; // Power (Relay) type
|
||||
#define NEO_RGBW 5 // Neopixel RGBW leds
|
||||
#define NEO_GRBW 6 // Neopixel GRBW leds
|
||||
|
||||
#define LT_SM16716 16 // Lights that use SM16716 will have this bit set in light_type
|
||||
|
||||
#define MQTT_PUBSUBCLIENT 1 // Mqtt PubSubClient library
|
||||
#define MQTT_TASMOTAMQTT 2 // Mqtt TasmotaMqtt library based on esp-mqtt-arduino - soon obsolete
|
||||
#define MQTT_ESPMQTTARDUINO 3 // Mqtt esp-mqtt-arduino library by Ingo Randolf - obsolete but define is present for debugging purposes
|
||||
@ -227,7 +229,7 @@ enum ButtonStates { PRESSED, NOT_PRESSED };
|
||||
|
||||
enum Shortcuts { SC_CLEAR, SC_DEFAULT, SC_USER };
|
||||
|
||||
enum SettingsParmaIndex {P_HOLD_TIME, P_MAX_POWER_RETRY, P_TUYA_DIMMER_ID, P_MDNS_DELAYED_START, P_MAX_PARAM8}; // Max is PARAM8_SIZE (18) - SetOption32 until SetOption49
|
||||
enum SettingsParmaIndex {P_HOLD_TIME, P_MAX_POWER_RETRY, P_TUYA_DIMMER_ID, P_MDNS_DELAYED_START, P_BOOT_LOOP_OFFSET, P_MAX_PARAM8}; // Max is PARAM8_SIZE (18) - SetOption32 until SetOption49
|
||||
|
||||
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};
|
||||
|
||||
|
@ -75,7 +75,7 @@ enum TasmotaCommands {
|
||||
CMND_MODULE, CMND_MODULES, CMND_GPIO, CMND_GPIOS, CMND_PWM, CMND_PWMFREQUENCY, CMND_PWMRANGE, CMND_COUNTER, CMND_COUNTERTYPE,
|
||||
CMND_COUNTERDEBOUNCE, CMND_BUTTONDEBOUNCE, CMND_SWITCHDEBOUNCE, CMND_SLEEP, CMND_UPGRADE, CMND_UPLOAD, CMND_OTAURL, CMND_SERIALLOG, CMND_SYSLOG,
|
||||
CMND_LOGHOST, CMND_LOGPORT, CMND_IPADDRESS, CMND_NTPSERVER, CMND_AP, CMND_SSID, CMND_PASSWORD, CMND_HOSTNAME,
|
||||
CMND_WIFICONFIG, CMND_FRIENDLYNAME, CMND_SWITCHMODE, CMND_INTERLOCK,
|
||||
CMND_WIFICONFIG, CMND_FRIENDLYNAME, CMND_SWITCHMODE, CMND_INTERLOCK, CMND_TEMPLATE,
|
||||
CMND_TELEPERIOD, CMND_RESTART, CMND_RESET, CMND_TIMEZONE, CMND_TIMESTD, CMND_TIMEDST, CMND_ALTITUDE, CMND_LEDPOWER, CMND_LEDSTATE,
|
||||
CMND_I2CSCAN, CMND_SERIALSEND, CMND_BAUDRATE, CMND_SERIALDELIMITER, CMND_DRIVER };
|
||||
const char kTasmotaCommands[] PROGMEM =
|
||||
@ -85,7 +85,7 @@ const char kTasmotaCommands[] PROGMEM =
|
||||
D_CMND_MODULE "|" D_CMND_MODULES "|" D_CMND_GPIO "|" D_CMND_GPIOS "|" D_CMND_PWM "|" D_CMND_PWMFREQUENCY "|" D_CMND_PWMRANGE "|" D_CMND_COUNTER "|" D_CMND_COUNTERTYPE "|"
|
||||
D_CMND_COUNTERDEBOUNCE "|" D_CMND_BUTTONDEBOUNCE "|" D_CMND_SWITCHDEBOUNCE "|" D_CMND_SLEEP "|" D_CMND_UPGRADE "|" D_CMND_UPLOAD "|" D_CMND_OTAURL "|" D_CMND_SERIALLOG "|" D_CMND_SYSLOG "|"
|
||||
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_INTERLOCK "|"
|
||||
D_CMND_WIFICONFIG "|" D_CMND_FRIENDLYNAME "|" D_CMND_SWITCHMODE "|" D_CMND_INTERLOCK "|" D_CMND_TEMPLATE "|"
|
||||
D_CMND_TELEPERIOD "|" D_CMND_RESTART "|" D_CMND_RESET "|" D_CMND_TIMEZONE "|" D_CMND_TIMESTD "|" D_CMND_TIMEDST "|" D_CMND_ALTITUDE "|" D_CMND_LEDPOWER "|" D_CMND_LEDSTATE "|"
|
||||
D_CMND_I2CSCAN "|" D_CMND_SERIALSEND "|" D_CMND_BAUDRATE "|" D_CMND_SERIALDELIMITER "|" D_CMND_DRIVER;
|
||||
|
||||
@ -152,6 +152,7 @@ uint8_t web_log_index = 1; // Index in Web log buffer (should n
|
||||
uint8_t devices_present = 0; // Max number of devices supported
|
||||
uint8_t seriallog_level; // Current copy of Settings.seriallog_level
|
||||
uint8_t syslog_level; // Current copy of Settings.syslog_level
|
||||
uint8_t my_module_type; // Current copy of Settings.module or user template type
|
||||
//uint8_t mdns_delayed_start = 0; // mDNS delayed start
|
||||
bool serial_local = false; // Handle serial locally;
|
||||
bool fallback_topic_flag = false; // Use Topic or FallbackTopic
|
||||
@ -343,7 +344,7 @@ void SetDevicePower(power_t rpower, int source)
|
||||
if (XdrvCall(FUNC_SET_DEVICE_POWER)) { // Set power state and stop if serviced
|
||||
// Serviced
|
||||
}
|
||||
else if ((SONOFF_DUAL == Settings.module) || (CH4 == Settings.module)) {
|
||||
else if ((SONOFF_DUAL == my_module_type) || (CH4 == my_module_type)) {
|
||||
Serial.write(0xA0);
|
||||
Serial.write(0x04);
|
||||
Serial.write(rpower &0xFF);
|
||||
@ -351,7 +352,7 @@ void SetDevicePower(power_t rpower, int source)
|
||||
Serial.write('\n');
|
||||
Serial.flush();
|
||||
}
|
||||
else if (EXS_RELAY == Settings.module) {
|
||||
else if (EXS_RELAY == my_module_type) {
|
||||
SetLatchingRelay(rpower, 1);
|
||||
}
|
||||
else {
|
||||
@ -384,7 +385,7 @@ uint8_t GetFanspeed(void)
|
||||
{
|
||||
uint8_t fanspeed = 0;
|
||||
|
||||
// if (SONOFF_IFAN02 == Settings.module) {
|
||||
// if (SONOFF_IFAN02 == my_module_type) {
|
||||
/* Fanspeed is controlled by relay 2, 3 and 4 as in Sonoff 4CH.
|
||||
000x = 0
|
||||
001x = 1
|
||||
@ -577,7 +578,7 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
fallback_topic_flag = false;
|
||||
return;
|
||||
}
|
||||
else if ((CMND_FANSPEED == command_code) && (SONOFF_IFAN02 == Settings.module)) {
|
||||
else if ((CMND_FANSPEED == command_code) && (SONOFF_IFAN02 == my_module_type)) {
|
||||
if (data_len > 0) {
|
||||
if ('-' == dataBuf[0]) {
|
||||
payload = (int16_t)GetFanspeed() -1;
|
||||
@ -653,7 +654,7 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_ONE_TO_RESTART);
|
||||
}
|
||||
}
|
||||
else if ((CMND_POWERONSTATE == command_code) && (Settings.module != MOTOR)) {
|
||||
else if ((CMND_POWERONSTATE == command_code) && (my_module_type != MOTOR)) {
|
||||
/* 0 = Keep relays off after power on
|
||||
* 1 = Turn relays on after power on, if PulseTime set wait for PulseTime seconds, and turn relays off
|
||||
* 2 = Toggle relays after power on
|
||||
@ -855,10 +856,12 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.flag2.weight_resolution);
|
||||
}
|
||||
else if (CMND_MODULE == command_code) {
|
||||
if ((payload > 0) && (payload <= MAXMODULE)) {
|
||||
if ((payload >= 0) && (payload <= MAXMODULE)) {
|
||||
if (0 == payload) { payload = 256; }
|
||||
payload--;
|
||||
Settings.last_module = Settings.module;
|
||||
Settings.module = payload;
|
||||
SetModuleType();
|
||||
if (Settings.last_module != payload) {
|
||||
for (uint8_t i = 0; i < sizeof(Settings.my_gp); i++) {
|
||||
Settings.my_gp.io[i] = GPIO_NONE;
|
||||
@ -866,18 +869,22 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
}
|
||||
restart_flag = 2;
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE_SVALUE, command, Settings.module +1, ModuleName().c_str());
|
||||
uint8_t module = Settings.module;
|
||||
if (USER_MODULE == Settings.module) { module = 0; } else { module++; }
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE_SVALUE, command, module, ModuleName().c_str());
|
||||
}
|
||||
else if (CMND_MODULES == command_code) {
|
||||
for (uint8_t i = 0; i < MAXMODULE; i++) {
|
||||
for (uint8_t i = 0; i <= MAXMODULE; i++) {
|
||||
if (!jsflg) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_MODULES "%d\":["), lines);
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,"), mqtt_data);
|
||||
}
|
||||
jsflg = true;
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"%d (%s)\""), mqtt_data, i +1, AnyModuleName(i).c_str());
|
||||
if ((strlen(mqtt_data) > (LOGSZ - TOPSZ)) || (i == MAXMODULE -1)) {
|
||||
uint8_t j = i;
|
||||
if (0 == i) { j = USER_MODULE; } else { j--; }
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"%d (%s)\""), mqtt_data, i, AnyModuleName(j).c_str());
|
||||
if ((strlen(mqtt_data) > (LOGSZ - TOPSZ)) || (i == MAXMODULE)) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s]}"), mqtt_data);
|
||||
MqttPublishPrefixTopic_P(RESULT_OR_STAT, type);
|
||||
jsflg = false;
|
||||
@ -889,7 +896,7 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
else if ((CMND_GPIO == command_code) && (index < sizeof(Settings.my_gp))) {
|
||||
myio cmodule;
|
||||
ModuleGpios(&cmodule);
|
||||
if ((GPIO_USER == ValidGPIO(index, cmodule.io[index])) && (payload >= 0) && (payload < GPIO_SENSOR_END)) {
|
||||
if (ValidGPIO(index, cmodule.io[index]) && (payload >= 0) && (payload < GPIO_SENSOR_END)) {
|
||||
bool present = false;
|
||||
for (uint8_t i = 0; i < sizeof(kGpioNiceList); i++) {
|
||||
uint8_t midx = pgm_read_byte(kGpioNiceList + i);
|
||||
@ -897,7 +904,7 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
}
|
||||
if (present) {
|
||||
for (uint8_t i = 0; i < sizeof(Settings.my_gp); i++) {
|
||||
if ((GPIO_USER == ValidGPIO(i, cmodule.io[i])) && (Settings.my_gp.io[i] == payload)) {
|
||||
if (ValidGPIO(i, cmodule.io[i]) && (Settings.my_gp.io[i] == payload)) {
|
||||
Settings.my_gp.io[i] = GPIO_NONE;
|
||||
}
|
||||
}
|
||||
@ -907,7 +914,7 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{"));
|
||||
for (uint8_t i = 0; i < sizeof(Settings.my_gp); i++) {
|
||||
if (GPIO_USER == ValidGPIO(i, cmodule.io[i])) {
|
||||
if (ValidGPIO(i, cmodule.io[i])) {
|
||||
if (jsflg) snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,"), mqtt_data);
|
||||
jsflg = true;
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"" D_CMND_GPIO "%d\":\"%d (%s)\""),
|
||||
@ -927,7 +934,6 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
for (uint8_t i = 0; i < sizeof(kGpioNiceList); i++) {
|
||||
midx = pgm_read_byte(kGpioNiceList + i);
|
||||
if (!GetUsedInModule(midx, cmodule.io)) {
|
||||
|
||||
if (!jsflg) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_GPIOS "%d\":["), lines);
|
||||
} else {
|
||||
@ -943,9 +949,80 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mqtt_data[0] = '\0';
|
||||
}
|
||||
else if (CMND_TEMPLATE == command_code) {
|
||||
// {"NAME":"Generic","GPIO":[17,254,29,254,7,254,254,254,138,254,139,254,254],"FLAG":1,"BASE":255}
|
||||
bool error = false;
|
||||
if (!strstr(dataBuf, "{")) { // If no JSON it must be parameter
|
||||
bool update = false;
|
||||
if ((payload > 0) && (payload <= MAXMODULE)) {
|
||||
ModuleDefault(payload -1); // Copy template module
|
||||
if (USER_MODULE == Settings.module) { restart_flag = 2; }
|
||||
}
|
||||
else if (0 == payload) { // Copy current module with user configured GPIO
|
||||
if (Settings.module < USER_MODULE) {
|
||||
ModuleDefault(Settings.module);
|
||||
update = true;
|
||||
}
|
||||
}
|
||||
if (USER_MODULE == Settings.module) { // Update with latest changes
|
||||
update = true;
|
||||
}
|
||||
if (update) {
|
||||
uint8_t src = 0;
|
||||
for (uint8_t dst = 0; dst < sizeof(mycfgio); dst++) {
|
||||
if (6 == dst) { src = 9; }
|
||||
if (8 == dst) { src = 12; }
|
||||
if (Settings.my_gp.io[src] > GPIO_NONE) {
|
||||
if (Settings.user_template.gp.io[dst] != Settings.my_gp.io[src]) {
|
||||
Settings.user_template.gp.io[dst] = Settings.my_gp.io[src];
|
||||
if (USER_MODULE == Settings.module) { restart_flag = 2; }
|
||||
}
|
||||
}
|
||||
src++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (data_len > 9) { // Workaround exception if empty JSON like {} - Needs checks
|
||||
StaticJsonBuffer<350> jb; // 331 from https://arduinojson.org/v5/assistant/
|
||||
JsonObject& obj = jb.parseObject(dataBuf);
|
||||
if (!obj.success()) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_INVALID_JSON);
|
||||
error = true;
|
||||
} else {
|
||||
// All parameters are optional allowing for partial changes
|
||||
const char* name = obj[D_JSON_NAME];
|
||||
if (name != nullptr) {
|
||||
strlcpy(Settings.user_template.name, name, sizeof(Settings.user_template.name));
|
||||
}
|
||||
if (obj[D_JSON_GPIO].success()) {
|
||||
for (uint8_t i = 0; i < sizeof(mycfgio); i++) {
|
||||
Settings.user_template.gp.io[i] = obj[D_JSON_GPIO][i] | 0;
|
||||
}
|
||||
}
|
||||
if (obj[D_JSON_FLAG].success()) {
|
||||
uint8_t flag = obj[D_JSON_FLAG] | 0;
|
||||
memcpy(&Settings.user_template.flag, &flag, sizeof(gpio_flag));
|
||||
}
|
||||
if (obj[D_JSON_BASE].success()) {
|
||||
uint8_t base = obj[D_JSON_BASE];
|
||||
if ((0 == base) || (base >= MAXMODULE)) { base = 17; } else { base--; }
|
||||
Settings.user_template_base = base; // Default WEMOS
|
||||
}
|
||||
|
||||
// Validate GPIO
|
||||
// for (uint8_t i = 0; i < sizeof(mycfgio); i++) {
|
||||
// For now do not allow non-user configurable GPIO
|
||||
// if ((Settings.user_template.gp.io[i] > GPIO_FIX_START) && (Settings.user_template.gp.io[i] < GPIO_USER)) {
|
||||
// Settings.user_template.gp.io[i] = GPIO_NONE;
|
||||
// };
|
||||
// }
|
||||
if (USER_MODULE == Settings.module) { restart_flag = 2; }
|
||||
}
|
||||
}
|
||||
if (!error) { TemplateJson(); }
|
||||
}
|
||||
else if ((CMND_PWM == command_code) && pwm_present && (index > 0) && (index <= MAX_PWMS)) {
|
||||
if ((payload >= 0) && (payload <= Settings.pwm_range) && (pin[GPIO_PWM1 + index -1] < 99)) {
|
||||
Settings.pwm_value[index -1] = payload;
|
||||
@ -1126,8 +1203,8 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_ASTERIX, command, index);
|
||||
}
|
||||
}
|
||||
else if ((CMND_HOSTNAME == command_code) && !grpflg) {
|
||||
if ((data_len > 0) && (data_len < sizeof(Settings.hostname))) {
|
||||
else if (CMND_HOSTNAME == command_code) {
|
||||
if (!grpflg && (data_len > 0) && (data_len < sizeof(Settings.hostname))) {
|
||||
strlcpy(Settings.hostname, (SC_DEFAULT == Shortcut(dataBuf)) ? WIFI_HOSTNAME : dataBuf, sizeof(Settings.hostname));
|
||||
if (strstr(Settings.hostname,"%")) {
|
||||
strlcpy(Settings.hostname, WIFI_HOSTNAME, sizeof(Settings.hostname));
|
||||
@ -1440,7 +1517,7 @@ void ExecuteCommandPower(uint8_t device, uint8_t state, int source)
|
||||
|
||||
// ShowSource(source);
|
||||
|
||||
if (SONOFF_IFAN02 == Settings.module) {
|
||||
if (SONOFF_IFAN02 == my_module_type) {
|
||||
blink_mask &= 1; // No blinking on the fan relays
|
||||
Settings.flag.interlock = 0; // No interlock mode as it is already done by the microcontroller
|
||||
Settings.pulse_timer[1] = 0; // No pulsetimers on the fan relays
|
||||
@ -1566,7 +1643,7 @@ void PublishStatus(uint8_t payload)
|
||||
{
|
||||
uint8_t option = STAT;
|
||||
char stemp[MAX_FRIENDLYNAMES * (sizeof(Settings.friendlyname[0]) +MAX_FRIENDLYNAMES)];
|
||||
char stemp2[MAX_SWITCHES * 3];
|
||||
char stemp2[64];
|
||||
|
||||
// Workaround MQTT - TCP/IP stack queueing when SUB_PREFIX = PUB_PREFIX
|
||||
if (!strcmp(Settings.mqtt_prefix[0],Settings.mqtt_prefix[1]) && (!payload)) { option++; } // TELE
|
||||
@ -1576,7 +1653,7 @@ void PublishStatus(uint8_t payload)
|
||||
|
||||
if ((0 == payload) || (99 == payload)) {
|
||||
uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : (!devices_present) ? 1 : devices_present;
|
||||
if (SONOFF_IFAN02 == Settings.module) { maxfn = 1; }
|
||||
if (SONOFF_IFAN02 == my_module_type) { maxfn = 1; }
|
||||
stemp[0] = '\0';
|
||||
for (uint8_t i = 0; i < maxfn; i++) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("%s%s\"%s\"" ), stemp, (i > 0 ? "," : ""), Settings.friendlyname[i]);
|
||||
@ -1586,7 +1663,7 @@ void PublishStatus(uint8_t payload)
|
||||
snprintf_P(stemp2, sizeof(stemp2), PSTR("%s%s%d" ), stemp2, (i > 0 ? "," : ""), Settings.switchmode[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_SWITCHTOPIC "\":\"%s\",\"" D_CMND_SWITCHMODE "\":[%s],\"" D_CMND_BUTTONRETAIN "\":%d,\"" D_CMND_SWITCHRETAIN "\":%d,\"" D_CMND_SENSORRETAIN "\":%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.switch_topic, stemp2, Settings.flag.mqtt_button_retain, Settings.flag.mqtt_switch_retain, Settings.flag.mqtt_sensor_retain, Settings.flag.mqtt_power_retain);
|
||||
(USER_MODULE == Settings.module)?0:Settings.module +1, stemp, mqtt_topic, Settings.button_topic, power, Settings.poweronstate, Settings.ledstate, Settings.save_data, Settings.flag.save_state, Settings.switch_topic, stemp2, Settings.flag.mqtt_button_retain, Settings.flag.mqtt_switch_retain, Settings.flag.mqtt_sensor_retain, Settings.flag.mqtt_power_retain);
|
||||
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS));
|
||||
}
|
||||
|
||||
@ -1603,8 +1680,12 @@ 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 "\":[\"%s\",\"%s\"],\"" D_CMND_TELEPERIOD "\":%d,\"" D_CMND_SETOPTION "\":[\"%08X\",\"%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, Settings.flag3.data);
|
||||
stemp2[0] = '\0';
|
||||
for (int8_t i = 0; i < PARAM8_SIZE; i++) {
|
||||
snprintf_P(stemp2, sizeof(stemp2), PSTR("%s%02X"), stemp2, Settings.param[i]);
|
||||
}
|
||||
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_JSON_RESOLUTION "\":\"%08X\",\"" D_CMND_SETOPTION "\":[\"%08X\",\"%s\",\"%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.flag2.data, Settings.flag.data, stemp2, Settings.flag3.data);
|
||||
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "3"));
|
||||
}
|
||||
|
||||
@ -1703,7 +1784,7 @@ void MqttShowState(void)
|
||||
LightState(1);
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"%s\":\"%s\""), mqtt_data, GetPowerDevice(stemp1, i +1, sizeof(stemp1), Settings.flag.device_index_enable), GetStateText(bitRead(power, i)));
|
||||
if (SONOFF_IFAN02 == Settings.module) {
|
||||
if (SONOFF_IFAN02 == my_module_type) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_FANSPEED "\":%d"), mqtt_data, GetFanspeed());
|
||||
break;
|
||||
}
|
||||
@ -1762,7 +1843,7 @@ void PerformEverySecond(void)
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
}
|
||||
|
||||
if ((4 == uptime) && (SONOFF_IFAN02 == Settings.module)) { // Microcontroller needs 3 seconds before accepting commands
|
||||
if ((4 == uptime) && (SONOFF_IFAN02 == my_module_type)) { // Microcontroller needs 3 seconds before accepting commands
|
||||
SetDevicePower(1, SRC_RETRY); // Sync with default power on state microcontroller being Light ON and Fan OFF
|
||||
SetDevicePower(power, SRC_RETRY); // Set required power on state
|
||||
}
|
||||
@ -1918,7 +1999,7 @@ void Every250mSeconds(void)
|
||||
}
|
||||
else if (Settings.ledstate &1) {
|
||||
bool tstate = power;
|
||||
if ((SONOFF_TOUCH == Settings.module) || (SONOFF_T11 == Settings.module) || (SONOFF_T12 == Settings.module) || (SONOFF_T13 == Settings.module)) {
|
||||
if ((SONOFF_TOUCH == my_module_type) || (SONOFF_T11 == my_module_type) || (SONOFF_T12 == my_module_type) || (SONOFF_T13 == my_module_type)) {
|
||||
tstate = (!power) ? 1 : 0; // As requested invert signal for Touch devices to find them in the dark
|
||||
}
|
||||
SetLedPower(tstate);
|
||||
@ -1953,7 +2034,7 @@ void Every250mSeconds(void)
|
||||
ota_retry_counter--;
|
||||
if (ota_retry_counter) {
|
||||
strlcpy(mqtt_data, GetOtaUrl(log_data, sizeof(log_data)), sizeof(mqtt_data));
|
||||
#ifndef BE_MINIMAL
|
||||
#ifndef FIRMWARE_MINIMAL
|
||||
if (RtcSettings.ota_loader) {
|
||||
char *bch = strrchr(mqtt_data, '/'); // Only consider filename after last backslash prevent change of urls having "-" in it
|
||||
char *pch = strrchr((bch != NULL) ? bch : mqtt_data, '-'); // Change from filename-DE.bin into filename-minimal.bin
|
||||
@ -1965,7 +2046,7 @@ void Every250mSeconds(void)
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s-" D_JSON_MINIMAL "%s"), mqtt_data, ech); // Minimal filename must be filename-minimal
|
||||
}
|
||||
}
|
||||
#endif // BE_MINIMAL
|
||||
#endif // FIRMWARE_MINIMAL
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPLOAD "%s"), mqtt_data);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
#if defined(ARDUINO_ESP8266_RELEASE_2_3_0) || defined(ARDUINO_ESP8266_RELEASE_2_4_0) || defined(ARDUINO_ESP8266_RELEASE_2_4_1) || defined(ARDUINO_ESP8266_RELEASE_2_4_2)
|
||||
@ -1976,14 +2057,14 @@ void Every250mSeconds(void)
|
||||
ota_result = (HTTP_UPDATE_FAILED != ESPhttpUpdate.update(OTAclient, mqtt_data));
|
||||
#endif
|
||||
if (!ota_result) {
|
||||
#ifndef BE_MINIMAL
|
||||
#ifndef FIRMWARE_MINIMAL
|
||||
int ota_error = ESPhttpUpdate.getLastError();
|
||||
// snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPLOAD "Ota error %d"), ota_error);
|
||||
// AddLog(LOG_LEVEL_DEBUG);
|
||||
if ((HTTP_UE_TOO_LESS_SPACE == ota_error) || (HTTP_UE_BIN_FOR_WRONG_FLASH == ota_error)) {
|
||||
RtcSettings.ota_loader = 1; // Try minimal image next
|
||||
}
|
||||
#endif // BE_MINIMAL
|
||||
#endif // FIRMWARE_MINIMAL
|
||||
ota_state_flag = 2; // Upgrade failed - retry
|
||||
}
|
||||
}
|
||||
@ -2153,7 +2234,7 @@ void SerialInput(void)
|
||||
/*-------------------------------------------------------------------------------------------*\
|
||||
* Sonoff dual and ch4 19200 baud serial interface
|
||||
\*-------------------------------------------------------------------------------------------*/
|
||||
if ((SONOFF_DUAL == Settings.module) || (CH4 == Settings.module)) {
|
||||
if ((SONOFF_DUAL == my_module_type) || (CH4 == my_module_type)) {
|
||||
serial_in_byte = ButtonSerial(serial_in_byte);
|
||||
}
|
||||
|
||||
@ -2167,27 +2248,29 @@ void SerialInput(void)
|
||||
|
||||
/*-------------------------------------------------------------------------------------------*/
|
||||
|
||||
if (serial_in_byte > 127 && !Settings.flag.mqtt_serial_raw) { // binary data...
|
||||
if (serial_in_byte > 127 && !Settings.flag.mqtt_serial_raw) { // Discard binary data above 127 if no raw reception allowed
|
||||
serial_in_byte_counter = 0;
|
||||
Serial.flush();
|
||||
return;
|
||||
}
|
||||
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
|
||||
if (!Settings.flag.mqtt_serial) { // SerialSend active
|
||||
if (isprint(serial_in_byte)) { // Any char between 32 and 127
|
||||
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 || Settings.flag.mqtt_serial_raw) {
|
||||
if ((serial_in_byte_counter < INPUT_BUFFER_SIZE -1) &&
|
||||
((serial_in_byte != Settings.serial_delimiter) || Settings.flag.mqtt_serial_raw)) { // add char to string if it still fits
|
||||
if (serial_in_byte || Settings.flag.mqtt_serial_raw) { // Any char between 1 and 127 or any char (0 - 255)
|
||||
if ((serial_in_byte_counter < INPUT_BUFFER_SIZE -1) && // Add char to string if it still fits and ...
|
||||
((isprint(serial_in_byte) && (128 == Settings.serial_delimiter)) || // Any char between 32 and 127
|
||||
(serial_in_byte != Settings.serial_delimiter) || // Any char between 1 and 127 and not being delimiter
|
||||
Settings.flag.mqtt_serial_raw)) { // Any char between 0 and 255
|
||||
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
|
||||
serial_polling_window = millis();
|
||||
} else {
|
||||
serial_polling_window = 0;
|
||||
serial_polling_window = 0; // Reception done - send mqtt
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2196,9 +2279,9 @@ void SerialInput(void)
|
||||
/*-------------------------------------------------------------------------------------------*\
|
||||
* Sonoff SC 19200 baud serial interface
|
||||
\*-------------------------------------------------------------------------------------------*/
|
||||
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
|
||||
if (SONOFF_SC == my_module_type) {
|
||||
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();
|
||||
@ -2209,7 +2292,7 @@ void SerialInput(void)
|
||||
/*-------------------------------------------------------------------------------------------*/
|
||||
|
||||
else if (!Settings.flag.mqtt_serial && (serial_in_byte == '\n')) {
|
||||
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
|
||||
serial_in_buffer[serial_in_byte_counter] = 0; // Serial data completed
|
||||
seriallog_level = (Settings.seriallog_level < LOG_LEVEL_INFO) ? (uint8_t)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);
|
||||
@ -2222,7 +2305,7 @@ void SerialInput(void)
|
||||
}
|
||||
|
||||
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
|
||||
serial_in_buffer[serial_in_byte_counter] = 0; // Serial data completed
|
||||
if (!Settings.flag.mqtt_serial_raw) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_SERIALRECEIVED "\":\"%s\"}"), serial_in_buffer);
|
||||
} else {
|
||||
@ -2244,10 +2327,12 @@ void GpioInit(void)
|
||||
{
|
||||
uint8_t mpin;
|
||||
|
||||
if (Settings.module >= MAXMODULE) {
|
||||
if ((Settings.module >= MAXMODULE) && (Settings.module < USER_MODULE)) {
|
||||
Settings.module = MODULE;
|
||||
Settings.last_module = MODULE;
|
||||
}
|
||||
SetModuleType();
|
||||
|
||||
if (Settings.module != Settings.last_module) {
|
||||
baudrate = APP_BAUDRATE;
|
||||
}
|
||||
@ -2260,15 +2345,18 @@ void GpioInit(void)
|
||||
}
|
||||
if ((def_gp.io[i] > GPIO_NONE) && (def_gp.io[i] < GPIO_USER)) {
|
||||
my_module.io[i] = def_gp.io[i];
|
||||
if (USER_MODULE == Settings.module) {
|
||||
Settings.my_gp.io[i] = def_gp.io[i]; // Copy user template settings
|
||||
}
|
||||
}
|
||||
}
|
||||
my_module_flag = ModuleFlag();
|
||||
|
||||
for (uint8_t i = 0; i < GPIO_MAX; i++) {
|
||||
for (uint16_t i = 0; i < GPIO_MAX; i++) {
|
||||
pin[i] = 99;
|
||||
}
|
||||
for (uint8_t i = 0; i < sizeof(my_module.io); i++) {
|
||||
mpin = ValidGPIO(i, my_module.io[i]);
|
||||
mpin = ValidPin(i, my_module.io[i]);
|
||||
|
||||
// snprintf_P(log_data, sizeof(log_data), PSTR("DBG: gpio pin %d, mpin %d"), i, mpin);
|
||||
// AddLog(LOG_LEVEL_DEBUG);
|
||||
@ -2321,7 +2409,7 @@ void GpioInit(void)
|
||||
if (mpin) pin[mpin] = i;
|
||||
}
|
||||
|
||||
if ((2 == pin[GPIO_TXD]) || (H801 == Settings.module)) { Serial.set_tx(2); }
|
||||
if ((2 == pin[GPIO_TXD]) || (H801 == my_module_type)) { Serial.set_tx(2); }
|
||||
|
||||
analogWriteRange(Settings.pwm_range); // Default is 1023 (Arduino.h)
|
||||
analogWriteFreq(Settings.pwm_frequency); // Default is 1000 (core_esp8266_wiring_pwm.c)
|
||||
@ -2329,7 +2417,7 @@ void GpioInit(void)
|
||||
#ifdef USE_SPI
|
||||
spi_flg = ((((pin[GPIO_SPI_CS] < 99) && (pin[GPIO_SPI_CS] > 14)) || (pin[GPIO_SPI_CS] < 12)) || (((pin[GPIO_SPI_DC] < 99) && (pin[GPIO_SPI_DC] > 14)) || (pin[GPIO_SPI_DC] < 12)));
|
||||
if (spi_flg) {
|
||||
for (uint8_t i = 0; i < GPIO_MAX; i++) {
|
||||
for (uint16_t i = 0; i < GPIO_MAX; i++) {
|
||||
if ((pin[i] >= 12) && (pin[i] <=14)) pin[i] = 99;
|
||||
}
|
||||
my_module.io[12] = GPIO_SPI_MISO;
|
||||
@ -2356,7 +2444,7 @@ void GpioInit(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (SONOFF_BRIDGE == Settings.module) {
|
||||
if (SONOFF_BRIDGE == my_module_type) {
|
||||
Settings.flag.mqtt_serial = 0;
|
||||
baudrate = 19200;
|
||||
}
|
||||
@ -2364,31 +2452,34 @@ void GpioInit(void)
|
||||
if (XdrvCall(FUNC_MODULE_INIT)) {
|
||||
// Serviced
|
||||
}
|
||||
else if (SONOFF_DUAL == Settings.module) {
|
||||
else if (YTF_IR_BRIDGE == my_module_type) {
|
||||
ClaimSerial(); // Stop serial loopback mode
|
||||
}
|
||||
else if (SONOFF_DUAL == my_module_type) {
|
||||
Settings.flag.mqtt_serial = 0;
|
||||
devices_present = 2;
|
||||
baudrate = 19200;
|
||||
}
|
||||
else if (CH4 == Settings.module) {
|
||||
else if (CH4 == my_module_type) {
|
||||
Settings.flag.mqtt_serial = 0;
|
||||
devices_present = 4;
|
||||
baudrate = 19200;
|
||||
}
|
||||
else if (SONOFF_SC == Settings.module) {
|
||||
else if (SONOFF_SC == my_module_type) {
|
||||
Settings.flag.mqtt_serial = 0;
|
||||
devices_present = 0;
|
||||
baudrate = 19200;
|
||||
}
|
||||
else if (SONOFF_BN == Settings.module) { // PWM Single color led (White)
|
||||
else if (SONOFF_BN == my_module_type) { // PWM Single color led (White)
|
||||
light_type = LT_PWM1;
|
||||
}
|
||||
else if (SONOFF_LED == Settings.module) { // PWM Dual color led (White warm and cold)
|
||||
else if (SONOFF_LED == my_module_type) { // PWM Dual color led (White warm and cold)
|
||||
light_type = LT_PWM2;
|
||||
}
|
||||
else if (AILIGHT == Settings.module) { // RGBW led
|
||||
else if (AILIGHT == my_module_type) { // RGBW led
|
||||
light_type = LT_RGBW;
|
||||
}
|
||||
else if (SONOFF_B1 == Settings.module) { // RGBWC led
|
||||
else if (SONOFF_B1 == my_module_type) { // RGBWC led
|
||||
light_type = LT_RGBWC;
|
||||
}
|
||||
else {
|
||||
@ -2397,7 +2488,7 @@ void GpioInit(void)
|
||||
if (pin[GPIO_REL1 +i] < 99) {
|
||||
pinMode(pin[GPIO_REL1 +i], OUTPUT);
|
||||
devices_present++;
|
||||
if (EXS_RELAY == Settings.module) {
|
||||
if (EXS_RELAY == my_module_type) {
|
||||
digitalWrite(pin[GPIO_REL1 +i], bitRead(rel_inverted, i) ? 1 : 0);
|
||||
if (i &1) { devices_present--; }
|
||||
}
|
||||
@ -2422,6 +2513,12 @@ void GpioInit(void)
|
||||
light_type = LT_WS2812;
|
||||
}
|
||||
#endif // USE_WS2812
|
||||
#ifdef USE_SM16716
|
||||
if (SM16716_ModuleSelected()) {
|
||||
light_type += 3;
|
||||
light_type |= LT_SM16716;
|
||||
}
|
||||
#endif // ifdef USE_SM16716
|
||||
if (!light_type) {
|
||||
for (uint8_t i = 0; i < MAX_PWMS; i++) { // Basic PWM control only
|
||||
if (pin[GPIO_PWM1 +i] < 99) {
|
||||
@ -2484,30 +2581,32 @@ void setup(void)
|
||||
Settings.flag2.emulation = 0;
|
||||
#endif // USE_EMULATION
|
||||
|
||||
// Disable functionality as possible cause of fast restart within BOOT_LOOP_TIME seconds (Exception, WDT or restarts)
|
||||
if (RtcReboot.fast_reboot_count > 1) { // Restart twice
|
||||
Settings.flag3.user_esp8285_enable = 0; // Disable ESP8285 Generic GPIOs interfering with flash SPI
|
||||
if (RtcReboot.fast_reboot_count > 2) { // Restart 3 times
|
||||
for (uint8_t i = 0; i < MAX_RULE_SETS; i++) {
|
||||
if (bitRead(Settings.rule_stop, i)) {
|
||||
bitWrite(Settings.rule_enabled, i, 0); // Disable rules causing boot loop
|
||||
if (Settings.param[P_BOOT_LOOP_OFFSET]) {
|
||||
// Disable functionality as possible cause of fast restart within BOOT_LOOP_TIME seconds (Exception, WDT or restarts)
|
||||
if (RtcReboot.fast_reboot_count > Settings.param[P_BOOT_LOOP_OFFSET]) { // Restart twice
|
||||
Settings.flag3.user_esp8285_enable = 0; // Disable ESP8285 Generic GPIOs interfering with flash SPI
|
||||
if (RtcReboot.fast_reboot_count > Settings.param[P_BOOT_LOOP_OFFSET] +1) { // Restart 3 times
|
||||
for (uint8_t i = 0; i < MAX_RULE_SETS; i++) {
|
||||
if (bitRead(Settings.rule_stop, i)) {
|
||||
bitWrite(Settings.rule_enabled, i, 0); // Disable rules causing boot loop
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (RtcReboot.fast_reboot_count > 3) { // Restarted 4 times
|
||||
Settings.rule_enabled = 0; // Disable all rules
|
||||
}
|
||||
if (RtcReboot.fast_reboot_count > 4) { // Restarted 5 times
|
||||
for (uint8_t i = 0; i < sizeof(Settings.my_gp); i++) {
|
||||
Settings.my_gp.io[i] = GPIO_NONE; // Reset user defined GPIO disabling sensors
|
||||
if (RtcReboot.fast_reboot_count > Settings.param[P_BOOT_LOOP_OFFSET] +2) { // Restarted 4 times
|
||||
Settings.rule_enabled = 0; // Disable all rules
|
||||
}
|
||||
if (RtcReboot.fast_reboot_count > Settings.param[P_BOOT_LOOP_OFFSET] +3) { // Restarted 5 times
|
||||
for (uint8_t i = 0; i < sizeof(Settings.my_gp); i++) {
|
||||
Settings.my_gp.io[i] = GPIO_NONE; // Reset user defined GPIO disabling sensors
|
||||
}
|
||||
}
|
||||
if (RtcReboot.fast_reboot_count > Settings.param[P_BOOT_LOOP_OFFSET] +4) { // Restarted 6 times
|
||||
Settings.module = SONOFF_BASIC; // Reset module to Sonoff Basic
|
||||
// Settings.last_module = SONOFF_BASIC;
|
||||
}
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION D_LOG_SOME_SETTINGS_RESET " (%d)"), RtcReboot.fast_reboot_count);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
}
|
||||
if (RtcReboot.fast_reboot_count > 5) { // Restarted 6 times
|
||||
Settings.module = SONOFF_BASIC; // Reset module to Sonoff Basic
|
||||
// Settings.last_module = SONOFF_BASIC;
|
||||
}
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION D_LOG_SOME_SETTINGS_RESET " (%d)"), RtcReboot.fast_reboot_count);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
}
|
||||
|
||||
Format(mqtt_client, Settings.mqtt_client, sizeof(mqtt_client));
|
||||
@ -2525,7 +2624,7 @@ void setup(void)
|
||||
|
||||
WifiConnect();
|
||||
|
||||
if (MOTOR == Settings.module) { Settings.poweronstate = POWER_ALL_ON; } // Needs always on else in limbo!
|
||||
if (MOTOR == my_module_type) { Settings.poweronstate = POWER_ALL_ON; } // Needs always on else in limbo!
|
||||
if (POWER_ALL_ALWAYS_ON == Settings.poweronstate) {
|
||||
SetDevicePower(1, SRC_RESTART);
|
||||
} else {
|
||||
@ -2575,10 +2674,10 @@ void setup(void)
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_PROJECT " %s %s " D_VERSION " %s%s-" ARDUINO_ESP8266_RELEASE),
|
||||
PROJECT, Settings.friendlyname[0], my_version, my_image);
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
#ifdef BE_MINIMAL
|
||||
#ifdef FIRMWARE_MINIMAL
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_WARNING_MINIMAL_VERSION));
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
#endif // BE_MINIMAL
|
||||
#endif // FIRMWARE_MINIMAL
|
||||
|
||||
RtcInit();
|
||||
|
||||
|
@ -55,7 +55,7 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
* Provide an image with useful supported sensors enabled
|
||||
\*********************************************************************************************/
|
||||
|
||||
#ifdef USE_SENSORS
|
||||
#ifdef FIRMWARE_SENSORS
|
||||
|
||||
#undef CODE_IMAGE
|
||||
#define CODE_IMAGE 3
|
||||
@ -92,7 +92,6 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
//#define USE_MPU6050 // Enable MPU6050 sensor (I2C address 0x68 AD0 low or 0x69 AD0 high) (+2k6 code)
|
||||
//#define USE_DS3231 // Enable DS3231 external RTC in case no Wifi is avaliable. See docs in the source file (+1k2 code)
|
||||
//#define USE_MGC3130 // Enable MGC3130 Electric Field Effect Sensor (I2C address 0x42) (+2k7 code, 0k3 mem)
|
||||
//#define USE_PN532_I2C // Enable PN532 - Near Field Communication (NFC) controller (+1k6 code)
|
||||
//#define USE_MAX44009 // Enable MAX44009 Ambient Light sensor (I2C addresses 0x4A and 0x4B) (+0k8 code)
|
||||
#define USE_MHZ19 // Add support for MH-Z19 CO2 sensor (+2k code)
|
||||
#define USE_SENSEAIR // Add support for SenseAir K30, K70 and S8 CO2 sensor (+2k3 code)
|
||||
@ -114,6 +113,8 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
#define TUYA_DIMMER_ID 0 // Default dimmer Id
|
||||
#endif
|
||||
#define USE_PS_16_DZ // Add support for PS-16-DZ Dimmer
|
||||
//#define USE_AZ7798 // Add support for AZ-Instrument 7798 CO2 datalogger
|
||||
#define USE_PN532_HSU // Add support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem)
|
||||
#define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code)
|
||||
#define USE_PZEM_AC // Add support for PZEM014,016 Energy monitor (+1k1 code)
|
||||
#define USE_PZEM_DC // Add support for PZEM003,017 Energy monitor (+1k1 code)
|
||||
@ -138,15 +139,14 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
#define USE_RF_SENSOR // Add support for RF sensor receiver (434MHz or 868MHz) (+0k8 code)
|
||||
// #define USE_THEO_V2 // Add support for decoding Theo V2 sensors as documented on https://sidweb.nl using 434MHz RF sensor receiver (+1k4 code)
|
||||
#define USE_ALECTO_V2 // Add support for decoding Alecto V2 sensors like ACH2010, WS3000 and DKW2012 using 868MHz RF sensor receiver (+1k7 code)
|
||||
//#define USE_AZ7798 // Add support for AZ-Instrument 7798 CO2 datalogger
|
||||
#endif // USE_SENSORS
|
||||
#endif // FIRMWARE_SENSORS
|
||||
|
||||
/*********************************************************************************************\
|
||||
* [sonoff-classic.bin]
|
||||
* Provide an image close to version 5.12.0 but still within 499k program space to allow one time OTA
|
||||
\*********************************************************************************************/
|
||||
|
||||
#ifdef USE_CLASSIC
|
||||
#ifdef FIRMWARE_CLASSIC
|
||||
|
||||
#undef CODE_IMAGE
|
||||
#define CODE_IMAGE 2
|
||||
@ -174,10 +174,6 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
#undef USE_SENSEAIR // Disable support for SenseAir K30, K70 and S8 CO2 sensor
|
||||
#undef USE_PMS5003 // Disable support for PMS5003 and PMS7003 particle concentration sensor
|
||||
#undef USE_NOVA_SDS // Disable support for SDS011 and SDS021 particle concentration sensor
|
||||
#undef USE_PZEM004T // Disable PZEM004T energy sensor
|
||||
#undef USE_PZEM_AC // Disable PZEM014,016 Energy monitor
|
||||
#undef USE_PZEM_DC // Disable PZEM003,017 Energy monitor
|
||||
#undef USE_MCP39F501 // Disable support for MCP39F501 Energy monitor as used in Shelly 2 (+3k1 code)
|
||||
#undef USE_SERIAL_BRIDGE // Disable support for software Serial Bridge
|
||||
#undef USE_SDM120 // Disable support for Eastron SDM120-Modbus energy meter
|
||||
#undef USE_SDM630 // Disable support for Eastron SDM630-Modbus energy meter
|
||||
@ -185,6 +181,12 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
#undef USE_TUYA_DIMMER // Disable support for Tuya Serial Dimmer
|
||||
#undef USE_ARMTRONIX_DIMMERS // Disable support for Armtronix Dimmers (+1k4 code)
|
||||
#undef USE_PS_16_DZ // Disable support for PS-16-DZ Dimmer
|
||||
#undef USE_AZ7798 // Disable support for AZ-Instrument 7798 CO2 datalogger
|
||||
#undef USE_PN532_HSU // Disable support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem)
|
||||
#undef USE_PZEM004T // Disable PZEM004T energy sensor
|
||||
#undef USE_PZEM_AC // Disable PZEM014,016 Energy monitor
|
||||
#undef USE_PZEM_DC // Disable PZEM003,017 Energy monitor
|
||||
#undef USE_MCP39F501 // Disable support for MCP39F501 Energy monitor as used in Shelly 2 (+3k1 code)
|
||||
#undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI
|
||||
#undef USE_IR_REMOTE // Disable IR remote commands using library IRremoteESP8266 and ArduinoJson
|
||||
#undef USE_IR_RECEIVE // Disable support for IR receiver
|
||||
@ -198,15 +200,14 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
#undef USE_RF_SENSOR // Disable support for RF sensor receiver (434MHz or 868MHz) (+0k8 code)
|
||||
#undef DEBUG_THEO // Disable debug code
|
||||
#undef USE_DEBUG_DRIVER // Disable debug code
|
||||
#undef USE_AZ7798 // Disable support for AZ-Instrument 7798 CO2 datalogger
|
||||
#endif // USE_CLASSIC
|
||||
#endif // FIRMWARE_CLASSIC
|
||||
|
||||
/*********************************************************************************************\
|
||||
* [sonoff-knx.bin]
|
||||
* Provide a dedicated KNX image allowing enough code and memory space
|
||||
\*********************************************************************************************/
|
||||
|
||||
#ifdef USE_KNX_NO_EMULATION
|
||||
#ifdef FIRMWARE_KNX_NO_EMULATION
|
||||
|
||||
#undef CODE_IMAGE
|
||||
#define CODE_IMAGE 4
|
||||
@ -215,14 +216,14 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
#define USE_KNX // Enable KNX IP Protocol Support (+23k code, +3k3 mem)
|
||||
#endif
|
||||
#undef USE_EMULATION // Disable Belkin WeMo and Hue Bridge emulation for Alexa (-16k code, -2k mem)
|
||||
#endif // USE_KNX_NO_EMULATION
|
||||
#endif // FIRMWARE_KNX_NO_EMULATION
|
||||
|
||||
/*********************************************************************************************\
|
||||
* [sonoff-display.bin]
|
||||
* Provide an image with display drivers enabled
|
||||
\*********************************************************************************************/
|
||||
|
||||
#ifdef USE_DISPLAYS
|
||||
#ifdef FIRMWARE_DISPLAYS
|
||||
|
||||
#undef CODE_IMAGE
|
||||
#define CODE_IMAGE 6
|
||||
@ -249,7 +250,7 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
|
||||
#undef USE_ARILUX_RF // Remove support for Arilux RF remote controller (-0k8 code, 252 iram (non 2.3.0))
|
||||
#undef USE_RF_FLASH // Remove support for flashing the EFM8BB1 chip on the Sonoff RF Bridge. C2CK must be connected to GPIO4, C2D to GPIO5 on the PCB (-3k code)
|
||||
#endif // USE_DISPLAYS
|
||||
#endif // FIRMWARE_DISPLAYS
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Mandatory define for DS18x20 if changed by above image selections
|
||||
@ -265,13 +266,13 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
* Provide an image without sensors
|
||||
\*********************************************************************************************/
|
||||
|
||||
#ifdef USE_BASIC
|
||||
#ifdef FIRMWARE_BASIC
|
||||
|
||||
#undef CODE_IMAGE
|
||||
#define CODE_IMAGE 5
|
||||
|
||||
#undef APP_SLEEP
|
||||
#define APP_SLEEP 1 // Default to sleep = 1 for USE_BASIC
|
||||
#define APP_SLEEP 1 // Default to sleep = 1 for FIRMWARE_BASIC
|
||||
|
||||
//#undef USE_ENERGY_SENSOR // Disable energy sensors
|
||||
#undef USE_ARDUINO_OTA // Disable support for Arduino OTA
|
||||
@ -307,6 +308,8 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
//#undef USE_TUYA_DIMMER // Disable support for Tuya Serial Dimmer
|
||||
#undef USE_ARMTRONIX_DIMMERS // Disable support for Armtronix Dimmers (+1k4 code)
|
||||
#undef USE_PS_16_DZ // Disable support for PS-16-DZ Dimmer
|
||||
#undef USE_AZ7798 // Disable support for AZ-Instrument 7798 CO2 datalogger
|
||||
#undef USE_PN532_HSU // Disable support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem)
|
||||
#undef USE_PZEM004T // Disable PZEM004T energy sensor
|
||||
#undef USE_PZEM_AC // Disable PZEM014,016 Energy monitor
|
||||
#undef USE_PZEM_DC // Disable PZEM003,017 Energy monitor
|
||||
@ -324,15 +327,14 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
#undef USE_RF_SENSOR // Disable support for RF sensor receiver (434MHz or 868MHz) (+0k8 code)
|
||||
#undef DEBUG_THEO // Disable debug code
|
||||
#undef USE_DEBUG_DRIVER // Disable debug code
|
||||
#undef USE_AZ7798 // Disable support for AZ-Instrument 7798 CO2 datalogger
|
||||
#endif // USE_BASIC
|
||||
#endif // FIRMWARE_BASIC
|
||||
|
||||
/*********************************************************************************************\
|
||||
* [sonoff-minimal.bin]
|
||||
* Provide the smallest image possible while still enabling a webserver for intermediate image load
|
||||
\*********************************************************************************************/
|
||||
|
||||
#ifdef BE_MINIMAL
|
||||
#ifdef FIRMWARE_MINIMAL
|
||||
|
||||
#undef CODE_IMAGE
|
||||
#define CODE_IMAGE 1
|
||||
@ -371,6 +373,8 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
#undef USE_TUYA_DIMMER // Disable support for Tuya Serial Dimmer
|
||||
#undef USE_ARMTRONIX_DIMMERS // Disable support for Armtronix Dimmers (+1k4 code)
|
||||
#undef USE_PS_16_DZ // Disable support for PS-16-DZ Dimmer
|
||||
#undef USE_AZ7798 // Disable support for AZ-Instrument 7798 CO2 datalogger
|
||||
#undef USE_PN532_HSU // Disable support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem)
|
||||
#undef USE_PZEM004T // Disable PZEM004T energy sensor
|
||||
#undef USE_PZEM_AC // Disable PZEM014,016 Energy monitor
|
||||
#undef USE_PZEM_DC // Disable PZEM003,017 Energy monitor
|
||||
@ -388,8 +392,7 @@ void KNX_CB_Action(message_t const &msg, void *arg);
|
||||
#undef USE_RF_SENSOR // Disable support for RF sensor receiver (434MHz or 868MHz) (+0k8 code)
|
||||
#undef DEBUG_THEO // Disable debug code
|
||||
#undef USE_DEBUG_DRIVER // Disable debug code
|
||||
#undef USE_AZ7798 // Disable support for AZ-Instrument 7798 CO2 datalogger
|
||||
#endif // BE_MINIMAL
|
||||
#endif // FIRMWARE_MINIMAL
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Mandatory defines satisfying possible disabled defines
|
||||
|
@ -154,26 +154,39 @@ enum UserSelectablePins {
|
||||
GPIO_KEY2_INV_NP,
|
||||
GPIO_KEY3_INV_NP,
|
||||
GPIO_KEY4_INV_NP,
|
||||
GPIO_SENSOR_END };
|
||||
|
||||
// Programmer selectable GPIO functionality offset by user selectable GPIOs
|
||||
enum ProgramSelectablePins {
|
||||
GPIO_RXD = GPIO_SENSOR_END, // Serial interface
|
||||
GPIO_TXD, // Serial interface
|
||||
GPIO_SPI_MISO, // SPI MISO library fixed pin GPIO12
|
||||
GPIO_SPI_MOSI, // SPI MOSI library fixed pin GPIO13
|
||||
GPIO_SPI_CLK, // SPI Clk library fixed pin GPIO14
|
||||
GPIO_NRG_SEL, // HLW8012/HLJ-01 Sel output (1 = Voltage)
|
||||
GPIO_NRG_SEL_INV, // HLW8012/HLJ-01 Sel output (0 = Voltage)
|
||||
GPIO_NRG_CF1, // HLW8012/HLJ-01 CF1 voltage / current
|
||||
GPIO_HLW_CF, // HLW8012 CF power
|
||||
GPIO_HJL_CF, // HJL-01/BL0937 CF power
|
||||
GPIO_MCP39F5_TX, // MCP39F501 Serial interface (Shelly2)
|
||||
GPIO_MCP39F5_RX, // MCP39F501 Serial interface (Shelly2)
|
||||
GPIO_MCP39F5_RST, // MCP39F501 Reset (Shelly2)
|
||||
GPIO_PN532_TXD, // PN532 NFC Serial Tx
|
||||
GPIO_PN532_RXD, // PN532 NFC Serial Rx
|
||||
GPIO_SM16716_CLK, // SM16716 CLOCK
|
||||
GPIO_SM16716_DAT, // SM16716 DATA
|
||||
GPIO_SM16716_SEL, // SM16716 SELECT
|
||||
GPIO_DI, // my92x1 PWM input
|
||||
GPIO_DCKI, // my92x1 CLK input
|
||||
GPIO_CSE7766_TX, // CSE7766 Serial interface (S31 and Pow R2)
|
||||
GPIO_CSE7766_RX, // CSE7766 Serial interface (S31 and Pow R2)
|
||||
GPIO_ARIRFRCV, // AliLux RF Receive input
|
||||
GPIO_ROT_A, // Rotary switch A Pin
|
||||
GPIO_ROT_B, // Rotary switch B Pin
|
||||
GPIO_USER, // User configurable
|
||||
GPIO_TXD, // Serial interface
|
||||
GPIO_RXD, // Serial interface
|
||||
GPIO_ROT1A, // Rotary switch1 A Pin
|
||||
GPIO_ROT1B, // Rotary switch1 B Pin
|
||||
GPIO_ROT2A, // Rotary switch2 A Pin
|
||||
GPIO_ROT2B, // Rotary switch2 B Pin
|
||||
GPIO_SENSOR_END };
|
||||
|
||||
// Programmer selectable GPIO functionality
|
||||
enum ProgramSelectablePins {
|
||||
GPIO_FIX_START = 251,
|
||||
GPIO_SPI_MISO, // SPI MISO library fixed pin GPIO12
|
||||
GPIO_SPI_MOSI, // SPI MOSI library fixed pin GPIO13
|
||||
GPIO_SPI_CLK, // SPI Clk library fixed pin GPIO14
|
||||
GPIO_USER, // User configurable needs to be 255
|
||||
GPIO_MAX };
|
||||
|
||||
// Text in webpage Module Parameters and commands GPIOS and GPIO
|
||||
@ -219,7 +232,15 @@ const char kSensorNames[] PROGMEM =
|
||||
D_SENSOR_AZ_TX "|" D_SENSOR_AZ_RX "|"
|
||||
D_SENSOR_MAX31855_CS "|" D_SENSOR_MAX31855_CLK "|" D_SENSOR_MAX31855_DO "|"
|
||||
D_SENSOR_BUTTON "1i|" D_SENSOR_BUTTON "2i|" D_SENSOR_BUTTON "3i|" D_SENSOR_BUTTON "4i|"
|
||||
D_SENSOR_BUTTON "1in|" D_SENSOR_BUTTON "2in|" D_SENSOR_BUTTON "3in|" D_SENSOR_BUTTON "4in"
|
||||
D_SENSOR_BUTTON "1in|" D_SENSOR_BUTTON "2in|" D_SENSOR_BUTTON "3in|" D_SENSOR_BUTTON "4in|"
|
||||
D_SENSOR_NRG_SEL "|" D_SENSOR_NRG_SEL "i|" D_SENSOR_NRG_CF1 "|" D_SENSOR_HLW_CF "|" D_SENSOR_HJL_CF "|"
|
||||
D_SENSOR_MCP39F5_TX "|" D_SENSOR_MCP39F5_RX "|" D_SENSOR_MCP39F5_RST "|"
|
||||
D_SENSOR_PN532_TX "|" D_SENSOR_PN532_RX "|"
|
||||
D_SENSOR_SM16716_CLK "|" D_SENSOR_SM16716_DAT "|" D_SENSOR_SM16716_POWER "|"
|
||||
D_SENSOR_MY92X1_DI "|" D_SENSOR_MY92X1_DCKI "|"
|
||||
D_SENSOR_CSE7766_TX "|" D_SENSOR_CSE7766_RX "|"
|
||||
D_SENSOR_ARIRFRCV "|" D_SENSOR_TXD "|" D_SENSOR_RXD "|"
|
||||
D_SENSOR_ROTARY "1a|" D_SENSOR_ROTARY "1b|" D_SENSOR_ROTARY "2a|" D_SENSOR_ROTARY "2b|"
|
||||
;
|
||||
|
||||
/********************************************************************************************/
|
||||
@ -292,8 +313,13 @@ enum SupportedModules {
|
||||
KA10,
|
||||
ZX2820,
|
||||
MI_DESK_LAMP,
|
||||
SP10,
|
||||
WAGA,
|
||||
SYF05,
|
||||
MAXMODULE };
|
||||
|
||||
#define USER_MODULE 255
|
||||
|
||||
/********************************************************************************************/
|
||||
|
||||
#define MAX_GPIO_PIN 17 // Number of supported GPIO
|
||||
@ -414,6 +440,8 @@ const uint8_t kGpioNiceList[] PROGMEM = {
|
||||
GPIO_CNTR3_NP,
|
||||
GPIO_CNTR4,
|
||||
GPIO_CNTR4_NP,
|
||||
GPIO_TXD, // Serial interface
|
||||
GPIO_RXD, // Serial interface
|
||||
#ifdef USE_I2C
|
||||
GPIO_I2C_SCL, // I2C SCL
|
||||
GPIO_I2C_SDA, // I2C SDA
|
||||
@ -463,21 +491,19 @@ const uint8_t kGpioNiceList[] PROGMEM = {
|
||||
GPIO_HX711_SCK, // HX711 Load Cell clock
|
||||
GPIO_HX711_DAT, // HX711 Load Cell data
|
||||
#endif
|
||||
#ifdef USE_SERIAL_BRIDGE
|
||||
GPIO_SBR_TX, // Serial Bridge Serial interface
|
||||
GPIO_SBR_RX, // Serial Bridge Serial interface
|
||||
#if defined(USE_ENERGY_SENSOR) && defined(USE_HLW8012)
|
||||
GPIO_NRG_SEL, // HLW8012/HLJ-01 Sel output (1 = Voltage)
|
||||
GPIO_NRG_SEL_INV, // HLW8012/HLJ-01 Sel output (0 = Voltage)
|
||||
GPIO_NRG_CF1, // HLW8012/HLJ-01 CF1 voltage / current
|
||||
GPIO_HLW_CF, // HLW8012 CF power
|
||||
GPIO_HJL_CF, // HJL-01/BL0937 CF power
|
||||
#endif
|
||||
#ifdef USE_MHZ19
|
||||
GPIO_MHZ_TXD, // MH-Z19 Serial interface
|
||||
GPIO_MHZ_RXD, // MH-Z19 Serial interface
|
||||
#endif
|
||||
#ifdef USE_SENSEAIR
|
||||
GPIO_SAIR_TX, // SenseAir Serial interface
|
||||
GPIO_SAIR_RX, // SenseAir Serial interface
|
||||
#endif
|
||||
#ifdef USE_NOVA_SDS
|
||||
GPIO_SDS0X1_TX, // Nova Fitness SDS011 Serial interface
|
||||
GPIO_SDS0X1_RX, // Nova Fitness SDS011 Serial interface
|
||||
GPIO_CSE7766_TX, // CSE7766 Serial interface (S31 and Pow R2)
|
||||
GPIO_CSE7766_RX, // CSE7766 Serial interface (S31 and Pow R2)
|
||||
#if defined(USE_ENERGY_SENSOR) && defined(USE_MCP39F501)
|
||||
GPIO_MCP39F5_TX, // MCP39F501 Serial interface (Shelly2)
|
||||
GPIO_MCP39F5_RX, // MCP39F501 Serial interface (Shelly2)
|
||||
GPIO_MCP39F5_RST, // MCP39F501 Reset (Shelly2)
|
||||
#endif
|
||||
#if defined(USE_PZEM004T) || defined(USE_PZEM_AC) || defined(USE_PZEM_DC)
|
||||
GPIO_PZEM0XX_TX, // PZEM0XX Serial interface
|
||||
@ -499,6 +525,22 @@ const uint8_t kGpioNiceList[] PROGMEM = {
|
||||
GPIO_SDM630_TX, // SDM630 Serial interface
|
||||
GPIO_SDM630_RX, // SDM630 Serial interface
|
||||
#endif
|
||||
#ifdef USE_SERIAL_BRIDGE
|
||||
GPIO_SBR_TX, // Serial Bridge Serial interface
|
||||
GPIO_SBR_RX, // Serial Bridge Serial interface
|
||||
#endif
|
||||
#ifdef USE_MHZ19
|
||||
GPIO_MHZ_TXD, // MH-Z19 Serial interface
|
||||
GPIO_MHZ_RXD, // MH-Z19 Serial interface
|
||||
#endif
|
||||
#ifdef USE_SENSEAIR
|
||||
GPIO_SAIR_TX, // SenseAir Serial interface
|
||||
GPIO_SAIR_RX, // SenseAir Serial interface
|
||||
#endif
|
||||
#ifdef USE_NOVA_SDS
|
||||
GPIO_SDS0X1_TX, // Nova Fitness SDS011 Serial interface
|
||||
GPIO_SDS0X1_RX, // Nova Fitness SDS011 Serial interface
|
||||
#endif
|
||||
#ifdef USE_PMS5003
|
||||
GPIO_PMS5003, // Plantower PMS5003 Serial interface
|
||||
#endif
|
||||
@ -512,19 +554,35 @@ const uint8_t kGpioNiceList[] PROGMEM = {
|
||||
GPIO_TUYA_TX, // Tuya Serial interface
|
||||
GPIO_TUYA_RX, // Tuya Serial interface
|
||||
#endif
|
||||
#ifdef USE_MGC3130
|
||||
GPIO_MGC3130_XFER,
|
||||
GPIO_MGC3130_RESET,
|
||||
#endif
|
||||
#ifdef USE_AZ7798
|
||||
GPIO_AZ_TXD, // AZ-Instrument 7798 CO2 datalogger Serial interface
|
||||
GPIO_AZ_RXD, // AZ-Instrument 7798 CO2 datalogger Serial interface
|
||||
#endif
|
||||
#ifdef USE_PN532_HSU
|
||||
GPIO_PN532_TXD, // PN532 HSU Tx
|
||||
GPIO_PN532_RXD, // PN532 HSU Rx
|
||||
#endif
|
||||
#ifdef USE_MGC3130
|
||||
GPIO_MGC3130_XFER,
|
||||
GPIO_MGC3130_RESET,
|
||||
#endif
|
||||
#ifdef USE_MAX31855
|
||||
GPIO_MAX31855CS, // MAX31855 Serial interface
|
||||
GPIO_MAX31855CLK, // MAX31855 Serial interface
|
||||
GPIO_MAX31855DO, // MAX31855 Serial interface
|
||||
#endif
|
||||
GPIO_DI, // my92x1 PWM input
|
||||
GPIO_DCKI, // my92x1 CLK input
|
||||
#ifdef USE_SM16716
|
||||
GPIO_SM16716_CLK, // SM16716 CLOCK
|
||||
GPIO_SM16716_DAT, // SM16716 DATA
|
||||
GPIO_SM16716_SEL, // SM16716 SELECT
|
||||
#endif // USE_SM16716
|
||||
GPIO_ROT1A, // Rotary switch1 A Pin
|
||||
GPIO_ROT1B, // Rotary switch1 B Pin
|
||||
GPIO_ROT2A, // Rotary switch2 A Pin
|
||||
GPIO_ROT2B, // Rotary switch2 B Pin
|
||||
GPIO_ARIRFRCV // AliLux RF Receive input
|
||||
};
|
||||
|
||||
const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = {
|
||||
@ -572,6 +630,8 @@ const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = {
|
||||
SK03_TUYA,
|
||||
DIGOO,
|
||||
KA10,
|
||||
SP10,
|
||||
WAGA,
|
||||
NEO_COOLCAM, // Socket Relay Devices
|
||||
OBI,
|
||||
OBI2,
|
||||
@ -591,6 +651,7 @@ const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = {
|
||||
KMC_70011,
|
||||
AILIGHT, // Light Bulbs
|
||||
PHILIPS,
|
||||
SYF05,
|
||||
YTF_IR_BRIDGE,
|
||||
WITTY, // Development Devices
|
||||
WEMOS
|
||||
@ -1031,9 +1092,10 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
|
||||
0, // GPIO09
|
||||
0, // GPIO10
|
||||
// GPIO11 (SD_CMD Flash)
|
||||
0,
|
||||
GPIO_USER, // GPIO12 Optional sensor
|
||||
GPIO_LED1_INV, // GPIO13 Blue Led (0 = On, 1 = Off) - Link and Power status
|
||||
0, 0, 0, 0
|
||||
GPIO_USER, // GPIO14 Optional sensor
|
||||
0, 0, 0
|
||||
},
|
||||
{ "Sonoff B1", // Sonoff B1 (ESP8285 - my9231)
|
||||
GPIO_KEY1, // GPIO00 Pad
|
||||
@ -1317,9 +1379,9 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
|
||||
},
|
||||
{ "Sonoff S31", // Sonoff S31 (ESP8266 - CSE7766)
|
||||
GPIO_KEY1, // GPIO00 Button
|
||||
0, // GPIO01 Serial RXD 4800 baud 8E1 CSE7766 energy sensor
|
||||
GPIO_CSE7766_TX, // GPIO01 Serial RXD 4800 baud 8E1 CSE7766 energy sensor
|
||||
0,
|
||||
0, // GPIO03 Serial TXD
|
||||
GPIO_CSE7766_RX, // GPIO03 Serial TXD
|
||||
0, 0,
|
||||
// GPIO06 (SD_CLK Flash)
|
||||
// GPIO07 (SD_DATA0 Flash QIO/DIO/DOUT)
|
||||
@ -1352,9 +1414,9 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
|
||||
},
|
||||
{ "Sonoff Pow R2", // Sonoff Pow R2 (ESP8285 - CSE7766)
|
||||
GPIO_KEY1, // GPIO00 Button
|
||||
0, // GPIO01 Serial RXD 4800 baud 8E1 CSE7766 energy sensor
|
||||
GPIO_CSE7766_TX, // GPIO01 Serial RXD 4800 baud 8E1 CSE7766 energy sensor
|
||||
0,
|
||||
0, // GPIO03 Serial TXD
|
||||
GPIO_CSE7766_RX, // GPIO03 Serial TXD
|
||||
0, 0,
|
||||
// GPIO06 (SD_CLK Flash)
|
||||
// GPIO07 (SD_DATA0 Flash QIO/DIO/DOUT)
|
||||
@ -1425,9 +1487,9 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
|
||||
},
|
||||
{ "Shelly 2", // Shelly2 (ESP8266 - 2MB) - https://shelly.cloud/shelly2/
|
||||
0,
|
||||
GPIO_TXD, // GPIO01 MCP39F501 Serial input
|
||||
GPIO_MCP39F5_TX, // GPIO01 MCP39F501 Serial input
|
||||
0,
|
||||
GPIO_RXD, // GPIO03 MCP39F501 Serial output
|
||||
GPIO_MCP39F5_RX, // GPIO03 MCP39F501 Serial output
|
||||
GPIO_REL1, // GPIO04
|
||||
GPIO_REL2, // GPIO05
|
||||
// GPIO06 (SD_CLK Flash)
|
||||
@ -1439,7 +1501,7 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
|
||||
GPIO_SWT1, // GPIO12
|
||||
0,
|
||||
GPIO_SWT2, // GPIO14
|
||||
0, // GPIO15 MCP39F501 Reset
|
||||
GPIO_MCP39F5_RST, // GPIO15 MCP39F501 Reset
|
||||
0,
|
||||
GPIO_FLAG_PULLUP // Allow input pull-up control
|
||||
},
|
||||
@ -1790,15 +1852,100 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
|
||||
0, // GPIO09 (SD_DATA2 Flash QIO or ESP8285)
|
||||
0, // GPIO10 (SD_DATA3 Flash QIO or ESP8285)
|
||||
// GPIO11 (SD_CMD Flash)
|
||||
GPIO_ROT_A, // GPIO12 Rotary switch A pin
|
||||
GPIO_ROT_B, // GPIO13 Rotary switch B pin
|
||||
GPIO_ROT1A, // GPIO12 Rotary switch A pin
|
||||
GPIO_ROT1B, // GPIO13 Rotary switch B pin
|
||||
0, 0, 0, 0
|
||||
},
|
||||
{ "SP10", // Tuya SP10 (BL0937 Energy Monitoring)
|
||||
// https://www.aliexpress.com/item/Smart-Mini-WiFi-Plug-Outlet-Switch-Work-With-ForEcho-Alexa-Google-Home-Remote-EU-Smart-Socket/32963670423.html
|
||||
0, // GPIO00
|
||||
GPIO_PWM1, // GPIO01 Nightlight
|
||||
0, // GPIO02
|
||||
GPIO_KEY1, // GPIO03 Button
|
||||
GPIO_HJL_CF, // GPIO04 BL0937 CF power
|
||||
GPIO_NRG_CF1, // GPIO05 BL0937 CF1 voltage / current
|
||||
// GPIO06 (SD_CLK Flash)
|
||||
// GPIO07 (SD_DATA0 Flash QIO/DIO/DOUT)
|
||||
// GPIO08 (SD_DATA1 Flash QIO/DIO/DOUT)
|
||||
0, // GPIO09 (SD_DATA2 Flash QIO or ESP8285)
|
||||
0, // GPIO10 (SD_DATA3 Flash QIO or ESP8285)
|
||||
// GPIO11 (SD_CMD Flash)
|
||||
GPIO_NRG_SEL_INV, // GPIO12 BL0937 Sel output (1 = Voltage)
|
||||
GPIO_LED1, // GPIO13 Blue LED - Link status
|
||||
GPIO_REL1, // GPIO14 Relay and red LED
|
||||
0, 0, 0
|
||||
},
|
||||
{ "WAGA CHCZ02MB", // WAGA life CHCZ02MB (HJL-01 Energy Monitoring)
|
||||
// https://www.ebay.com/itm/332595697006
|
||||
GPIO_LED2_INV, // GPIO00 Red LED
|
||||
0, // GPIO01 Serial RXD
|
||||
0, // GPIO02
|
||||
GPIO_NRG_SEL_INV, // GPIO03 HJL-01 Sel output (1 = Voltage)
|
||||
0, // GPIO04
|
||||
GPIO_HJL_CF, // GPIO05 HJL-01 CF power
|
||||
// GPIO06 (SD_CLK Flash)
|
||||
// GPIO07 (SD_DATA0 Flash QIO/DIO/DOUT)
|
||||
// GPIO08 (SD_DATA1 Flash QIO/DIO/DOUT)
|
||||
0, // GPIO09 (SD_DATA2 Flash QIO or ESP8285)
|
||||
0, // GPIO10 (SD_DATA3 Flash QIO or ESP8285)
|
||||
// GPIO11 (SD_CMD Flash)
|
||||
GPIO_REL1, // GPIO12 Relay
|
||||
GPIO_KEY1, // GPIO13 Button
|
||||
GPIO_NRG_CF1, // GPIO14 HJL-01 CF1 voltage / current
|
||||
GPIO_LED1_INV, // GPIO15 Blue LED - Link status
|
||||
0, 0
|
||||
},
|
||||
{ "SYF05", // Sunyesmart SYF05 (a.k.a. Fcmila) = TYWE3S + SM16726
|
||||
// Also works with Merkury 904 RGBW Bulbs with 13 set to GPIO_SM16716_SEL
|
||||
// https://www.flipkart.com/fc-mila-bxav-xs-ad-smart-bulb/p/itmf85zgs45fzr7n
|
||||
// https://docs.tuya.com/en/hardware/WiFi-module/wifi-e3s-module.html
|
||||
// http://www.datasheet-pdf.com/PDF/SM16716-Datasheet-Sunmoon-932771
|
||||
GPIO_USER, // GPIO00 N.C.
|
||||
0, // GPIO01 Serial RXD
|
||||
GPIO_USER, // GPIO02 N.C.
|
||||
0, // GPIO03 Serial TXD
|
||||
GPIO_SM16716_CLK, // GPIO04 SM16716 Clock
|
||||
GPIO_PWM1, // GPIO05 White
|
||||
// GPIO06 (SD_CLK Flash)
|
||||
// GPIO07 (SD_DATA0 Flash QIO/DIO/DOUT)
|
||||
// GPIO08 (SD_DATA1 Flash QIO/DIO/DOUT)
|
||||
0, // GPIO09 (SD_DATA2 Flash QIO or ESP8285)
|
||||
0, // GPIO10 (SD_DATA3 Flash QIO or ESP8285)
|
||||
// GPIO11 (SD_CMD Flash)
|
||||
GPIO_USER, // GPIO12 Alt. White on some devices
|
||||
GPIO_USER, // GPIO13 SM16716 Enable on some devices
|
||||
GPIO_SM16716_DAT, // GPIO14 SM16716 Data
|
||||
0, // GPIO15 wired to GND
|
||||
GPIO_USER, // GPIO16 N.C.
|
||||
GPIO_FLAG_ADC0 // ADC0 A0 Analog input
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
Optionals
|
||||
|
||||
{ "RGB Smart Plug", // Tuya based smart plug with power monitoring and RGB light
|
||||
// https://www.aliexpress.com/item/ET-Smart-Plug-Wifi-Socket-With-Switch-Phone-APP-Voice-Remote-Control-Monitor-Smart-Timing-Switch/32964036349.html?spm=a2g0s.9042311.0.0.439c4c4d4N8N2Q
|
||||
// https://xiangshangcn.en.alibaba.com/product/60844251239-807590977/RGB_wifi_smart_plug_smart_socket_smart_outlet_EU_works_with_Amazon_alexa_google_home_mobile_app_tuya_solution_smart_life.html?spm=a2700.icbuShop.41413.24.4e996767oFAAmO
|
||||
GPIO_PWM1, // GPIO00 Red
|
||||
GPIO_USER, // GPIO01 Serial RXD and Optional sensor
|
||||
GPIO_PWM3, // GPIO02 Blue
|
||||
GPIO_USER, // GPIO03 Serial TXD and Optional sensor
|
||||
GPIO_PWM2, // GPIO04 Green
|
||||
GPIO_HJL_CF, // GPIO05 BL0937 or HJL-01 CF power
|
||||
// GPIO06 (SD_CLK Flash)
|
||||
// GPIO07 (SD_DATA0 Flash QIO/DIO/DOUT)
|
||||
// GPIO08 (SD_DATA1 Flash QIO/DIO/DOUT)
|
||||
0, // GPIO09 (SD_DATA2 Flash QIO or ESP8285)
|
||||
0, // GPIO10 (SD_DATA3 Flash QIO or ESP8285)
|
||||
// GPIO11 (SD_CMD Flash)
|
||||
GPIO_NRG_SEL_INV, // GPIO12 BL0937 or HJL-01 Sel output (0 = Voltage)
|
||||
GPIO_KEY1, // GPIO13 Button
|
||||
GPIO_NRG_CF1, // GPIO14 BL0937 or HJL-01 CF1 current / voltage
|
||||
GPIO_REL1, // GPIO15 Relay (0 = Off, 1 = On)
|
||||
0, 0
|
||||
}
|
||||
|
||||
{ "ESP RGBWWC", // esp rgbww controller https://github.com/pljakobs/esp_rgbww_controller/tree/v2.3
|
||||
GPIO_KEY1, // GPIO00 Button
|
||||
GPIO_USER, // GPIO01 Serial RXD and Optional sensor
|
||||
|
@ -20,7 +20,7 @@
|
||||
#ifndef _SONOFF_VERSION_H_
|
||||
#define _SONOFF_VERSION_H_
|
||||
|
||||
#define VERSION 0x0604010C
|
||||
#define VERSION 0x06040110
|
||||
|
||||
#define D_PROGRAMNAME "Sonoff-Tasmota"
|
||||
#define D_AUTHOR "Theo Arends"
|
||||
|
@ -305,27 +305,6 @@ char* UpperCase_P(char* dest, const char* source)
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*
|
||||
char* LTrim(char* p)
|
||||
{
|
||||
while ((*p != '\0') && (isblank(*p))) {
|
||||
p++; // Trim leading spaces
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
char* RTrim(char* p)
|
||||
{
|
||||
char* q = p + strlen(p) -1;
|
||||
while ((q >= p) && (isblank(*q))) {
|
||||
q--; // Trim trailing spaces
|
||||
}
|
||||
q++;
|
||||
*q = '\0';
|
||||
return p;
|
||||
}
|
||||
*/
|
||||
|
||||
char* Trim(char* p)
|
||||
{
|
||||
while ((*p != '\0') && isblank(*p)) { p++; } // Trim leading spaces
|
||||
@ -505,51 +484,6 @@ String PressureUnit(void)
|
||||
return (Settings.flag.pressure_conversion) ? String(D_UNIT_MILLIMETER_MERCURY) : String(D_UNIT_PRESSURE);
|
||||
}
|
||||
|
||||
String AnyModuleName(uint8_t index)
|
||||
{
|
||||
return FPSTR(kModules[index].name);
|
||||
}
|
||||
|
||||
String ModuleName()
|
||||
{
|
||||
return FPSTR(kModules[Settings.module].name);
|
||||
}
|
||||
|
||||
void ModuleGpios(myio *gp)
|
||||
{
|
||||
uint8_t *dest = (uint8_t *)gp;
|
||||
memset(dest, GPIO_NONE, sizeof(myio));
|
||||
|
||||
uint8_t src[sizeof(mycfgio)];
|
||||
memcpy_P(&src, &kModules[Settings.module].gp, sizeof(mycfgio));
|
||||
// 11 85 00 85 85 00 00 00 15 38 85 00 00 81
|
||||
|
||||
// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)&src, sizeof(mycfgio));
|
||||
|
||||
for (uint8_t i = 0; i < sizeof(mycfgio); i++) {
|
||||
if (i < 6) {
|
||||
dest[i] = src[i]; // GPIO00 - GPIO05
|
||||
}
|
||||
else if (i < 8) {
|
||||
dest[i +3] = src[i]; // GPIO09 - GPIO10
|
||||
}
|
||||
else {
|
||||
dest[i +4] = src[i]; // GPIO12 - GPIO16 and ADC0
|
||||
}
|
||||
}
|
||||
// 11 85 00 85 85 00 00 00 00 00 00 00 15 38 85 00 00 81
|
||||
|
||||
// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)gp, sizeof(myio));
|
||||
}
|
||||
|
||||
gpio_flag ModuleFlag()
|
||||
{
|
||||
gpio_flag flag;
|
||||
|
||||
memcpy_P(&flag, &kModules[Settings.module].flag, sizeof(gpio_flag));
|
||||
return flag;
|
||||
}
|
||||
|
||||
void SetGlobalValues(float temperature, float humidity)
|
||||
{
|
||||
global_update = uptime;
|
||||
@ -701,61 +635,6 @@ int GetStateNumber(char *state_text)
|
||||
return state_number;
|
||||
}
|
||||
|
||||
bool GetUsedInModule(uint8_t val, uint8_t *arr)
|
||||
{
|
||||
int offset = 0;
|
||||
|
||||
if (!val) { return false; } // None
|
||||
|
||||
if ((val >= GPIO_KEY1) && (val < GPIO_KEY1 + MAX_KEYS)) {
|
||||
offset = (GPIO_KEY1_NP - GPIO_KEY1);
|
||||
}
|
||||
if ((val >= GPIO_KEY1_NP) && (val < GPIO_KEY1_NP + MAX_KEYS)) {
|
||||
offset = -(GPIO_KEY1_NP - GPIO_KEY1);
|
||||
}
|
||||
|
||||
if ((val >= GPIO_SWT1) && (val < GPIO_SWT1 + MAX_SWITCHES)) {
|
||||
offset = (GPIO_SWT1_NP - GPIO_SWT1);
|
||||
}
|
||||
if ((val >= GPIO_SWT1_NP) && (val < GPIO_SWT1_NP + MAX_SWITCHES)) {
|
||||
offset = -(GPIO_SWT1_NP - GPIO_SWT1);
|
||||
}
|
||||
|
||||
if ((val >= GPIO_REL1) && (val < GPIO_REL1 + MAX_RELAYS)) {
|
||||
offset = (GPIO_REL1_INV - GPIO_REL1);
|
||||
}
|
||||
if ((val >= GPIO_REL1_INV) && (val < GPIO_REL1_INV + MAX_RELAYS)) {
|
||||
offset = -(GPIO_REL1_INV - GPIO_REL1);
|
||||
}
|
||||
|
||||
if ((val >= GPIO_LED1) && (val < GPIO_LED1 + MAX_LEDS)) {
|
||||
offset = (GPIO_LED1_INV - GPIO_LED1);
|
||||
}
|
||||
if ((val >= GPIO_LED1_INV) && (val < GPIO_LED1_INV + MAX_LEDS)) {
|
||||
offset = -(GPIO_LED1_INV - GPIO_LED1);
|
||||
}
|
||||
|
||||
if ((val >= GPIO_PWM1) && (val < GPIO_PWM1 + MAX_PWMS)) {
|
||||
offset = (GPIO_PWM1_INV - GPIO_PWM1);
|
||||
}
|
||||
if ((val >= GPIO_PWM1_INV) && (val < GPIO_PWM1_INV + MAX_PWMS)) {
|
||||
offset = -(GPIO_PWM1_INV - GPIO_PWM1);
|
||||
}
|
||||
|
||||
if ((val >= GPIO_CNTR1) && (val < GPIO_CNTR1 + MAX_COUNTERS)) {
|
||||
offset = (GPIO_CNTR1_NP - GPIO_CNTR1);
|
||||
}
|
||||
if ((val >= GPIO_CNTR1_NP) && (val < GPIO_CNTR1_NP + MAX_COUNTERS)) {
|
||||
offset = -(GPIO_CNTR1_NP - GPIO_CNTR1);
|
||||
}
|
||||
|
||||
for (uint8_t i = 0; i < MAX_GPIO_PIN; i++) {
|
||||
if (arr[i] == val) { return true; }
|
||||
if (arr[i] == val + offset) { return true; }
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void SetSerialBaudrate(int baudrate)
|
||||
{
|
||||
Settings.baudrate = baudrate / 1200;
|
||||
@ -816,15 +695,178 @@ void ShowSource(int source)
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t ValidGPIO(uint8_t pin, uint8_t gpio)
|
||||
/*********************************************************************************************\
|
||||
* GPIO Module and Template management
|
||||
\*********************************************************************************************/
|
||||
|
||||
String AnyModuleName(uint8_t index)
|
||||
{
|
||||
if (USER_MODULE == index) {
|
||||
return String(Settings.user_template.name);
|
||||
} else {
|
||||
return FPSTR(kModules[index].name);
|
||||
}
|
||||
}
|
||||
|
||||
String ModuleName()
|
||||
{
|
||||
return AnyModuleName(Settings.module);
|
||||
}
|
||||
|
||||
void ModuleGpios(myio *gp)
|
||||
{
|
||||
uint8_t *dest = (uint8_t *)gp;
|
||||
memset(dest, GPIO_NONE, sizeof(myio));
|
||||
|
||||
uint8_t src[sizeof(mycfgio)];
|
||||
if (USER_MODULE == Settings.module) {
|
||||
// src = Settings.user_template.gp;
|
||||
memcpy(&src, &Settings.user_template.gp, sizeof(mycfgio));
|
||||
} else {
|
||||
memcpy_P(&src, &kModules[Settings.module].gp, sizeof(mycfgio));
|
||||
}
|
||||
// 11 85 00 85 85 00 00 00 15 38 85 00 00 81
|
||||
|
||||
// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)&src, sizeof(mycfgio));
|
||||
|
||||
uint8_t j = 0;
|
||||
for (uint8_t i = 0; i < sizeof(mycfgio); i++) {
|
||||
if (6 == i) { j = 9; }
|
||||
if (8 == i) { j = 12; }
|
||||
dest[j] = src[i];
|
||||
j++;
|
||||
}
|
||||
// 11 85 00 85 85 00 00 00 00 00 00 00 15 38 85 00 00 81
|
||||
|
||||
// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)gp, sizeof(myio));
|
||||
}
|
||||
|
||||
gpio_flag ModuleFlag()
|
||||
{
|
||||
gpio_flag flag;
|
||||
|
||||
if (USER_MODULE == Settings.module) {
|
||||
flag = Settings.user_template.flag;
|
||||
} else {
|
||||
memcpy_P(&flag, &kModules[Settings.module].flag, sizeof(gpio_flag));
|
||||
}
|
||||
|
||||
return flag;
|
||||
}
|
||||
|
||||
void ModuleDefault(uint8_t module)
|
||||
{
|
||||
if (USER_MODULE == module) { module = WEMOS; } // Generic
|
||||
Settings.user_template_base = module;
|
||||
memcpy_P(&Settings.user_template, &kModules[module], sizeof(mytmplt));
|
||||
}
|
||||
|
||||
void SetModuleType()
|
||||
{
|
||||
my_module_type = (USER_MODULE == Settings.module) ? Settings.user_template_base : Settings.module;
|
||||
}
|
||||
|
||||
uint8_t ValidPin(uint8_t pin, uint8_t gpio)
|
||||
{
|
||||
uint8_t result = gpio;
|
||||
if ((WEMOS == Settings.module) && (!Settings.flag3.user_esp8285_enable)) {
|
||||
if ((pin == 9) || (pin == 10)) { result = GPIO_NONE; } // Disable possible flash GPIO9 and GPIO10
|
||||
if ((pin > 5) && (pin < 12)) {
|
||||
result = GPIO_NONE; // Disable all flash pins
|
||||
}
|
||||
if (Settings.flag3.user_esp8285_enable) {
|
||||
if ((pin == 9) || (pin == 10)) {
|
||||
result = gpio; // Allow optional flash pins
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool ValidGPIO(uint8_t pin, uint8_t gpio)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (USER_MODULE == Settings.module) {
|
||||
result = (ValidPin(pin, gpio) > GPIO_NONE); // Allow any pin
|
||||
} else {
|
||||
result = (GPIO_USER == ValidPin(pin, gpio)); // Only allow GPIO_USER pins
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool GetUsedInModule(uint8_t val, uint8_t *arr)
|
||||
{
|
||||
int offset = 0;
|
||||
|
||||
if (USER_MODULE == Settings.module) { return false; }
|
||||
|
||||
if (!val) { return false; } // None
|
||||
|
||||
if ((val >= GPIO_KEY1) && (val < GPIO_KEY1 + MAX_KEYS)) {
|
||||
offset = (GPIO_KEY1_NP - GPIO_KEY1);
|
||||
}
|
||||
if ((val >= GPIO_KEY1_NP) && (val < GPIO_KEY1_NP + MAX_KEYS)) {
|
||||
offset = -(GPIO_KEY1_NP - GPIO_KEY1);
|
||||
}
|
||||
if ((val >= GPIO_KEY1_INV) && (val < GPIO_KEY1_INV + MAX_KEYS)) {
|
||||
offset = -(GPIO_KEY1_INV - GPIO_KEY1);
|
||||
}
|
||||
if ((val >= GPIO_KEY1_INV_NP) && (val < GPIO_KEY1_INV_NP + MAX_KEYS)) {
|
||||
offset = -(GPIO_KEY1_INV_NP - GPIO_KEY1);
|
||||
}
|
||||
|
||||
if ((val >= GPIO_SWT1) && (val < GPIO_SWT1 + MAX_SWITCHES)) {
|
||||
offset = (GPIO_SWT1_NP - GPIO_SWT1);
|
||||
}
|
||||
if ((val >= GPIO_SWT1_NP) && (val < GPIO_SWT1_NP + MAX_SWITCHES)) {
|
||||
offset = -(GPIO_SWT1_NP - GPIO_SWT1);
|
||||
}
|
||||
|
||||
if ((val >= GPIO_REL1) && (val < GPIO_REL1 + MAX_RELAYS)) {
|
||||
offset = (GPIO_REL1_INV - GPIO_REL1);
|
||||
}
|
||||
if ((val >= GPIO_REL1_INV) && (val < GPIO_REL1_INV + MAX_RELAYS)) {
|
||||
offset = -(GPIO_REL1_INV - GPIO_REL1);
|
||||
}
|
||||
|
||||
if ((val >= GPIO_LED1) && (val < GPIO_LED1 + MAX_LEDS)) {
|
||||
offset = (GPIO_LED1_INV - GPIO_LED1);
|
||||
}
|
||||
if ((val >= GPIO_LED1_INV) && (val < GPIO_LED1_INV + MAX_LEDS)) {
|
||||
offset = -(GPIO_LED1_INV - GPIO_LED1);
|
||||
}
|
||||
|
||||
if ((val >= GPIO_PWM1) && (val < GPIO_PWM1 + MAX_PWMS)) {
|
||||
offset = (GPIO_PWM1_INV - GPIO_PWM1);
|
||||
}
|
||||
if ((val >= GPIO_PWM1_INV) && (val < GPIO_PWM1_INV + MAX_PWMS)) {
|
||||
offset = -(GPIO_PWM1_INV - GPIO_PWM1);
|
||||
}
|
||||
|
||||
if ((val >= GPIO_CNTR1) && (val < GPIO_CNTR1 + MAX_COUNTERS)) {
|
||||
offset = (GPIO_CNTR1_NP - GPIO_CNTR1);
|
||||
}
|
||||
if ((val >= GPIO_CNTR1_NP) && (val < GPIO_CNTR1_NP + MAX_COUNTERS)) {
|
||||
offset = -(GPIO_CNTR1_NP - GPIO_CNTR1);
|
||||
}
|
||||
|
||||
for (uint8_t i = 0; i < MAX_GPIO_PIN; i++) {
|
||||
if (arr[i] == val) { return true; }
|
||||
if (arr[i] == val + offset) { return true; }
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void TemplateJson()
|
||||
{
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_NAME "\":\"%s\",\"" D_JSON_GPIO "\":["), Settings.user_template.name);
|
||||
for (uint8_t i = 0; i < sizeof(Settings.user_template.gp); i++) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s%d"), mqtt_data, (i>0)?",":"", Settings.user_template.gp.io[i]);
|
||||
}
|
||||
// snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s],\"" D_JSON_FLAG "\":%d,\"" D_JSON_BASE "\":\"%d (%s)\"}"),
|
||||
// mqtt_data, Settings.user_template.flag, Settings.user_template_base +1, AnyModuleName(Settings.user_template_base).c_str());
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s],\"" D_JSON_FLAG "\":%d,\"" D_JSON_BASE "\":%d}"),
|
||||
mqtt_data, Settings.user_template.flag, Settings.user_template_base +1);
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Sleep aware time scheduler functions borrowed from ESPEasy
|
||||
\*********************************************************************************************/
|
||||
|
@ -106,7 +106,7 @@ void ButtonHandler(void)
|
||||
button = NOT_PRESSED;
|
||||
button_present = 0;
|
||||
|
||||
if (!button_index && ((SONOFF_DUAL == Settings.module) || (CH4 == Settings.module))) {
|
||||
if (!button_index && ((SONOFF_DUAL == my_module_type) || (CH4 == my_module_type))) {
|
||||
button_present = 1;
|
||||
if (dual_button_code) {
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION D_BUTTON " " D_CODE " %04X"), dual_button_code);
|
||||
@ -131,7 +131,7 @@ void ButtonHandler(void)
|
||||
if (XdrvCall(FUNC_BUTTON_PRESSED)) {
|
||||
// Serviced
|
||||
}
|
||||
else if (SONOFF_4CHPRO == Settings.module) {
|
||||
else if (SONOFF_4CHPRO == my_module_type) {
|
||||
if (holdbutton[button_index]) { holdbutton[button_index]--; }
|
||||
|
||||
bool button_pressed = false;
|
||||
@ -202,14 +202,14 @@ void ButtonHandler(void)
|
||||
if (!restart_flag && !holdbutton[button_index] && (multipress[button_index] > 0) && (multipress[button_index] < MAX_BUTTON_COMMANDS +3)) {
|
||||
bool single_press = false;
|
||||
if (multipress[button_index] < 3) { // Single or Double press
|
||||
if ((SONOFF_DUAL_R2 == Settings.module) || (SONOFF_DUAL == Settings.module) || (CH4 == Settings.module)) {
|
||||
if ((SONOFF_DUAL_R2 == my_module_type) || (SONOFF_DUAL == my_module_type) || (CH4 == my_module_type)) {
|
||||
single_press = true;
|
||||
} else {
|
||||
single_press = (Settings.flag.button_swap +1 == multipress[button_index]);
|
||||
multipress[button_index] = 1;
|
||||
}
|
||||
}
|
||||
if ((MI_DESK_LAMP == Settings.module) && (button_index == 0) && (rotary_changed) && (light_power)) {
|
||||
if ((MI_DESK_LAMP == my_module_type) && (button_index == 0) && (rotary_changed) && (light_power)) {
|
||||
rotary_changed = 0; // Color temp changed, no need to turn of the light
|
||||
} else {
|
||||
if (single_press && SendKey(0, button_index + multipress[button_index], POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set
|
||||
|
@ -126,16 +126,16 @@ void GetFeatures(void)
|
||||
#ifdef USE_CONFIG_OVERRIDE
|
||||
feature_drv2 |= 0x00000001; // user_config(_override).h
|
||||
#endif
|
||||
#ifdef BE_MINIMAL
|
||||
#ifdef FIRMWARE_MINIMAL
|
||||
feature_drv2 |= 0x00000002; // user_config(_override).h
|
||||
#endif
|
||||
#ifdef USE_SENSORS
|
||||
#ifdef FIRMWARE_SENSORS
|
||||
feature_drv2 |= 0x00000004; // user_config(_override).h
|
||||
#endif
|
||||
#ifdef USE_CLASSIC
|
||||
#ifdef FIRMWARE_CLASSIC
|
||||
feature_drv2 |= 0x00000008; // user_config(_override).h
|
||||
#endif
|
||||
#ifdef USE_KNX_NO_EMULATION
|
||||
#ifdef FIRMWARE_KNX_NO_EMULATION
|
||||
feature_drv2 |= 0x00000010; // user_config(_override).h
|
||||
#endif
|
||||
#ifdef USE_DISPLAY_MODES1TO5
|
||||
@ -177,8 +177,10 @@ void GetFeatures(void)
|
||||
#ifdef USE_ARMTRONIX_DIMMERS
|
||||
feature_drv2 |= 0x00020000; // xdrv_18_armtronixdimmer.ino
|
||||
#endif
|
||||
#ifdef USE_SM16716
|
||||
feature_drv2 |= 0x00040000; // xdrv_04_light.ino
|
||||
#endif
|
||||
|
||||
// feature_drv2 |= 0x00040000;
|
||||
// feature_drv2 |= 0x00080000;
|
||||
// feature_drv2 |= 0x00100000;
|
||||
// feature_drv2 |= 0x00200000;
|
||||
@ -376,8 +378,8 @@ void GetFeatures(void)
|
||||
#ifdef USE_MAX31855
|
||||
feature_sns2 |= 0x00080000; // xsns_39_max31855.ino
|
||||
#endif
|
||||
#ifdef USE_PN532_I2C
|
||||
feature_sns2 |= 0x00100000; // xsns_40_pn532_i2c.ino
|
||||
#ifdef USE_PN532_HSU
|
||||
feature_sns2 |= 0x00100000; // xsns_40_pn532.ino
|
||||
#endif
|
||||
#ifdef USE_MAX44009
|
||||
feature_sns2 |= 0x00200000;
|
||||
|
@ -42,8 +42,8 @@ void update_position(void)
|
||||
*/
|
||||
|
||||
s = rotary_state & 3;
|
||||
if (digitalRead(pin[GPIO_ROT_A])) s |= 4;
|
||||
if (digitalRead(pin[GPIO_ROT_B])) s |= 8;
|
||||
if (digitalRead(pin[GPIO_ROT1A])) s |= 4;
|
||||
if (digitalRead(pin[GPIO_ROT1B])) s |= 8;
|
||||
switch (s) {
|
||||
case 0: case 5: case 10: case 15:
|
||||
break;
|
||||
@ -61,7 +61,7 @@ void update_position(void)
|
||||
|
||||
void update_rotary(void)
|
||||
{
|
||||
if (MI_DESK_LAMP == Settings.module){
|
||||
if (MI_DESK_LAMP == my_module_type){
|
||||
if (light_power) {
|
||||
update_position();
|
||||
}
|
||||
@ -71,20 +71,20 @@ void update_rotary(void)
|
||||
void RotaryInit(void)
|
||||
{
|
||||
rotaries_found = 0;
|
||||
if ((pin[GPIO_ROT_A] < 99) && (pin[GPIO_ROT_B] < 99)) {
|
||||
if ((pin[GPIO_ROT1A] < 99) && (pin[GPIO_ROT1B] < 99)) {
|
||||
rotaries_found++;
|
||||
pinMode(pin[GPIO_ROT_A], INPUT_PULLUP);
|
||||
pinMode(pin[GPIO_ROT_B], INPUT_PULLUP);
|
||||
pinMode(pin[GPIO_ROT1A], INPUT_PULLUP);
|
||||
pinMode(pin[GPIO_ROT1B], INPUT_PULLUP);
|
||||
|
||||
// GPIO6-GPIO11 are typically used to interface with the flash memory IC on
|
||||
// most esp8266 modules, so we should avoid adding interrupts to these pins.
|
||||
|
||||
if ((pin[GPIO_ROT_A] < 6) || (pin[GPIO_ROT_A] > 11)) {
|
||||
attachInterrupt(digitalPinToInterrupt(pin[GPIO_ROT_A]), update_rotary, CHANGE);
|
||||
if ((pin[GPIO_ROT1A] < 6) || (pin[GPIO_ROT1A] > 11)) {
|
||||
attachInterrupt(digitalPinToInterrupt(pin[GPIO_ROT1A]), update_rotary, CHANGE);
|
||||
interrupts_in_use++;
|
||||
}
|
||||
if ((pin[GPIO_ROT_B] < 6) || (pin[GPIO_ROT_B] > 11)) {
|
||||
attachInterrupt(digitalPinToInterrupt(pin[GPIO_ROT_B]), update_rotary, CHANGE);
|
||||
if ((pin[GPIO_ROT1B] < 6) || (pin[GPIO_ROT1B] > 11)) {
|
||||
attachInterrupt(digitalPinToInterrupt(pin[GPIO_ROT1B]), update_rotary, CHANGE);
|
||||
interrupts_in_use++;
|
||||
}
|
||||
}
|
||||
@ -103,7 +103,7 @@ void RotaryHandler(void)
|
||||
noInterrupts();
|
||||
}
|
||||
if (rotary_last_position != rotary_position) {
|
||||
if (MI_DESK_LAMP == Settings.module) { // Mi Desk lamp
|
||||
if (MI_DESK_LAMP == my_module_type) { // Mi Desk lamp
|
||||
if (holdbutton[0]) {
|
||||
rotary_changed = 1;
|
||||
// button1 is pressed: set color temperature
|
||||
|
@ -501,12 +501,12 @@ void WifiCheck(uint8_t param)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef BE_MINIMAL
|
||||
#ifdef FIRMWARE_MINIMAL
|
||||
if (1 == RtcSettings.ota_loader) {
|
||||
RtcSettings.ota_loader = 0;
|
||||
ota_state_flag = 3;
|
||||
}
|
||||
#endif // BE_MINIMAL
|
||||
#endif // FIRMWARE_MINIMAL
|
||||
|
||||
#ifdef USE_DISCOVERY
|
||||
if (Settings.flag3.mdns_enabled) {
|
||||
|
@ -129,11 +129,11 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM =
|
||||
"x.onreadystatechange=function(){"
|
||||
"if(x.readyState==4&&x.status==200){"
|
||||
"var z,d;"
|
||||
"d=x.responseXML;"
|
||||
"id=d.getElementsByTagName('i')[0].childNodes[0].nodeValue;"
|
||||
"if(d.getElementsByTagName('j')[0].childNodes[0].nodeValue==0){t.value='';}"
|
||||
"z=d.getElementsByTagName('l')[0].childNodes;"
|
||||
"if(z.length>0){t.value+=decodeURIComponent(z[0].nodeValue);}"
|
||||
"d=x.responseText.split(/\1/);"
|
||||
"id=d.shift();"
|
||||
"if(d.shift()==0){t.value='';}"
|
||||
"z=d.shift();"
|
||||
"if(z.length>0){t.value+=z;}"
|
||||
"t.scrollTop=99999;"
|
||||
"sn=t.scrollTop;"
|
||||
"}"
|
||||
@ -145,28 +145,31 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM =
|
||||
"return false;"
|
||||
"}"
|
||||
"</script>";
|
||||
|
||||
const char HTTP_SCRIPT_MODULE1[] PROGMEM =
|
||||
"var os;"
|
||||
"function sk(s,g){" // s = value, g = id and name
|
||||
"var o=os.replace(\"value='\"+s+\"'\",\"selected value='\"+s+\"'\");"
|
||||
"var o=os.replace(/}1/g,\"<option value=\").replace(/}2/g,\"</option>\").replace(\"value='\"+s+\"'\",\"selected value='\"+s+\"'\");"
|
||||
"eb('g'+g).innerHTML=o;"
|
||||
"}"
|
||||
"function sl(){"
|
||||
"if(x!=null){x.abort();}" // Abort any request pending
|
||||
"x=new XMLHttpRequest();"
|
||||
"x.onreadystatechange=function(){"
|
||||
"if(x.readyState==4&&x.status==200){"
|
||||
"var i,o=x.responseText.replace(/}1/g,\"<option value=\").replace(/}2/g,\"</option>\");"
|
||||
"i=o.indexOf(\"}3\");" // String separator means do not use "}3" in Module name and Sensor name
|
||||
"os=o.substring(0,i);"
|
||||
"a=new XMLHttpRequest();"
|
||||
"a.onreadystatechange=function(){"
|
||||
"if(a.readyState==4&&a.status==200){"
|
||||
"os=a.responseText;"
|
||||
"sk(}4,99);"
|
||||
"os=o.substring(i+2);"; // +2 is length "}3"
|
||||
"}"
|
||||
"};"
|
||||
"a.open('GET','md?m=1',true);" // ?m related to WebServer->hasArg("m")
|
||||
"a.send();"
|
||||
"b=new XMLHttpRequest();"
|
||||
"b.onreadystatechange=function(){"
|
||||
"if(b.readyState==4&&b.status==200){"
|
||||
"os=b.responseText;";
|
||||
const char HTTP_SCRIPT_MODULE2[] PROGMEM =
|
||||
"}"
|
||||
"};"
|
||||
"x.open('GET','md?m=1',true);" // ?m related to WebServer->hasArg("m")
|
||||
"x.send();"
|
||||
"b.open('GET','md?g=1',true);" // ?g related to WebServer->hasArg("g")
|
||||
"b.send();"
|
||||
"}";
|
||||
const char HTTP_SCRIPT_MODULE3[] PROGMEM =
|
||||
"}1'%d'>%s (%d)}2"; // "}1" and "}2" means do not use "}x" in Module name and Sensor name
|
||||
@ -205,7 +208,7 @@ const char HTTP_HEAD_STYLE[] PROGMEM =
|
||||
"</head>"
|
||||
"<body>"
|
||||
"<div style='text-align:left;display:inline-block;min-width:340px;'>"
|
||||
#ifdef BE_MINIMAL
|
||||
#ifdef FIRMWARE_MINIMAL
|
||||
"<div style='text-align:center;color:red;'><h3>" D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "</h3></div>"
|
||||
#endif
|
||||
"<div style='text-align:center;'><noscript>" D_NOSCRIPT "<br/></noscript>"
|
||||
@ -224,7 +227,7 @@ const char HTTP_MSG_SLIDER2[] PROGMEM =
|
||||
const char HTTP_MSG_RSTRT[] PROGMEM =
|
||||
"<br/><div style='text-align:center;'>" D_DEVICE_WILL_RESTART "</div><br/>";
|
||||
const char HTTP_BTN_MENU1[] PROGMEM =
|
||||
#ifndef BE_MINIMAL
|
||||
#ifndef FIRMWARE_MINIMAL
|
||||
"<br/><form action='cn' method='get'><button>" D_CONFIGURATION "</button></form>"
|
||||
"<br/><form action='in' method='get'><button>" D_INFORMATION "</button></form>"
|
||||
#endif
|
||||
@ -286,7 +289,7 @@ const char HTTP_FORM_LOG3[] PROGMEM =
|
||||
"<br/><b>" D_TELEMETRY_PERIOD "</b> (" STR(TELE_PERIOD) ")<br/><input id='lt' name='lt' placeholder='" STR(TELE_PERIOD) "' value='{l4'><br/>";
|
||||
const char HTTP_FORM_OTHER[] PROGMEM =
|
||||
"<fieldset><legend><b> " D_OTHER_PARAMETERS " </b></legend><form method='get' action='co'>"
|
||||
// "<input id='w' name='w' value='5,1' hidden>"
|
||||
"<br/><b>" D_TEMPLATE "</b><br/><input id='t1' name='t1' placeholder='" D_TEMPLATE "' value='{t1'><br/>"
|
||||
"<br/><b>" D_WEB_ADMIN_PASSWORD "</b><br/><input id='p1' name='p1' type='password' placeholder='" D_WEB_ADMIN_PASSWORD "' value='" D_ASTERIX "'><br/>"
|
||||
"<br/><input style='width:10%;' id='b1' name='b1' type='checkbox'{r1><b>" D_MQTT_ENABLE "</b><br/>";
|
||||
const char HTTP_FORM_OTHER2[] PROGMEM =
|
||||
@ -306,7 +309,7 @@ const char HTTP_FORM_UPG[] PROGMEM =
|
||||
"<div id='f1' name='f1' style='display:block;'>"
|
||||
"<fieldset><legend><b> " D_UPGRADE_BY_WEBSERVER " </b></legend>"
|
||||
"<form method='get' action='u1'>"
|
||||
"<br/>" D_OTA_URL "<br/><input id='o' name='o' placeholder='OTA_URL' value='{o1'><br/>"
|
||||
"<br/><b>" D_OTA_URL "</b><br/><input id='o' name='o' placeholder='OTA_URL' value='{o1'><br/>"
|
||||
"<br/><button type='submit'>" D_START_UPGRADE "</button></form>"
|
||||
"</fieldset><br/><br/>"
|
||||
"<fieldset><legend><b> " D_UPGRADE_BY_FILE_UPLOAD " </b></legend>";
|
||||
@ -398,7 +401,7 @@ void StartWebserver(int type, IPAddress ipweb)
|
||||
WebServer->on("/ay", HandleAjaxStatusRefresh);
|
||||
WebServer->on("/cm", HandleHttpCommand);
|
||||
WebServer->onNotFound(HandleNotFound);
|
||||
#ifndef BE_MINIMAL
|
||||
#ifndef FIRMWARE_MINIMAL
|
||||
WebServer->on("/cn", HandleConfiguration);
|
||||
WebServer->on("/md", HandleModuleConfiguration);
|
||||
WebServer->on("/wi", HandleWifiConfiguration);
|
||||
@ -413,7 +416,7 @@ void StartWebserver(int type, IPAddress ipweb)
|
||||
#endif // USE_EMULATION
|
||||
XdrvCall(FUNC_WEB_ADD_HANDLER);
|
||||
XsnsCall(FUNC_WEB_ADD_HANDLER);
|
||||
#endif // Not BE_MINIMAL
|
||||
#endif // Not FIRMWARE_MINIMAL
|
||||
}
|
||||
reset_web_log_flag = false;
|
||||
WebServer->begin(); // Web server start
|
||||
@ -598,7 +601,7 @@ void HandleRoot(void)
|
||||
}
|
||||
|
||||
if (HTTP_MANAGER == webserver_state) {
|
||||
#ifndef BE_MINIMAL
|
||||
#ifndef FIRMWARE_MINIMAL
|
||||
if ((Settings.web_password[0] != 0) && !(WebServer->hasArg("USER1")) && !(WebServer->hasArg("PASS1"))) {
|
||||
HandleWifiLogin();
|
||||
} else {
|
||||
@ -616,7 +619,7 @@ void HandleRoot(void)
|
||||
HandleWifiLogin();
|
||||
}
|
||||
}
|
||||
#endif // Not BE_MINIMAL
|
||||
#endif // Not FIRMWARE_MINIMAL
|
||||
} else {
|
||||
char stemp[10];
|
||||
String page = FPSTR(HTTP_HEAD);
|
||||
@ -637,7 +640,7 @@ void HandleRoot(void)
|
||||
}
|
||||
page += FPSTR(HTTP_TABLE100);
|
||||
page += F("<tr>");
|
||||
if (SONOFF_IFAN02 == Settings.module) {
|
||||
if (SONOFF_IFAN02 == my_module_type) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_DEVICE_CONTROL, 36, 1, D_BUTTON_TOGGLE, "");
|
||||
page += mqtt_data;
|
||||
for (uint8_t i = 0; i < MAX_FAN_SPEED; i++) {
|
||||
@ -655,7 +658,7 @@ void HandleRoot(void)
|
||||
}
|
||||
page += F("</tr></table>");
|
||||
}
|
||||
if (SONOFF_BRIDGE == Settings.module) {
|
||||
if (SONOFF_BRIDGE == my_module_type) {
|
||||
page += FPSTR(HTTP_TABLE100);
|
||||
page += F("<tr>");
|
||||
uint8_t idx = 0;
|
||||
@ -670,12 +673,12 @@ void HandleRoot(void)
|
||||
page += F("</tr></table>");
|
||||
}
|
||||
|
||||
#ifndef BE_MINIMAL
|
||||
#ifndef FIRMWARE_MINIMAL
|
||||
mqtt_data[0] = '\0';
|
||||
XdrvCall(FUNC_WEB_ADD_MAIN_BUTTON);
|
||||
XsnsCall(FUNC_WEB_ADD_MAIN_BUTTON);
|
||||
page += String(mqtt_data);
|
||||
#endif // Not BE_MINIMAL
|
||||
#endif // Not FIRMWARE_MINIMAL
|
||||
|
||||
if (HTTP_ADMIN == webserver_state) {
|
||||
page += FPSTR(HTTP_BTN_MENU1);
|
||||
@ -696,7 +699,7 @@ void HandleAjaxStatusRefresh(void)
|
||||
if (strlen(tmp)) {
|
||||
ShowWebSource(SRC_WEBGUI);
|
||||
uint8_t device = atoi(tmp);
|
||||
if (SONOFF_IFAN02 == Settings.module) {
|
||||
if (SONOFF_IFAN02 == my_module_type) {
|
||||
if (device < 2) {
|
||||
ExecuteCommandPower(1, POWER_TOGGLE, SRC_IGNORE);
|
||||
} else {
|
||||
@ -736,7 +739,7 @@ void HandleAjaxStatusRefresh(void)
|
||||
if (devices_present) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s{t}<tr>"), mqtt_data);
|
||||
uint8_t fsize = (devices_present < 5) ? 70 - (devices_present * 8) : 32;
|
||||
if (SONOFF_IFAN02 == Settings.module) {
|
||||
if (SONOFF_IFAN02 == my_module_type) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_DEVICE_STATE,
|
||||
mqtt_data, 36, (bitRead(power, 0)) ? "bold" : "normal", 54, GetStateText(bitRead(power, 0)));
|
||||
uint8_t fanspeed = GetFanspeed();
|
||||
@ -770,7 +773,7 @@ bool HttpCheckPriviledgedAccess(bool autorequestauth = true)
|
||||
|
||||
/*-------------------------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef BE_MINIMAL
|
||||
#ifndef FIRMWARE_MINIMAL
|
||||
|
||||
void HandleConfiguration(void)
|
||||
{
|
||||
@ -812,12 +815,31 @@ void HandleModuleConfiguration(void)
|
||||
|
||||
if (WebServer->hasArg("m")) {
|
||||
String page = "";
|
||||
for (uint8_t i = 0; i < MAXMODULE; i++) {
|
||||
/*
|
||||
for (uint8_t i = 0; i < MAXMODULE; i++) { // "}1'%d'>%s (%d)}2" - "}1'0'>Sonoff Basic (1)}2"
|
||||
midx = pgm_read_byte(kModuleNiceList + i);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SCRIPT_MODULE3, midx, AnyModuleName(midx).c_str(), midx +1);
|
||||
page += mqtt_data;
|
||||
}
|
||||
page += "}3"; // String separator means do not use "}3" in Module name and Sensor name
|
||||
*/
|
||||
uint8_t vidx = 0;
|
||||
for (uint8_t i = 0; i <= MAXMODULE; i++) { // "}1'%d'>%s (%d)}2" - "}1'255'>UserTemplate (0)}2" - "}1'0'>Sonoff Basic (1)}2"
|
||||
if (0 == i) {
|
||||
midx = USER_MODULE;
|
||||
vidx = 0;
|
||||
} else {
|
||||
midx = pgm_read_byte(kModuleNiceList + i -1);
|
||||
vidx = midx +1;
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SCRIPT_MODULE3, midx, AnyModuleName(midx).c_str(), vidx);
|
||||
page += mqtt_data;
|
||||
}
|
||||
WebServer->send(200, FPSTR(HDR_CTYPE_PLAIN), page);
|
||||
return;
|
||||
}
|
||||
|
||||
if (WebServer->hasArg("g")) {
|
||||
String page = "";
|
||||
for (uint8_t j = 0; j < sizeof(kGpioNiceList); j++) {
|
||||
midx = pgm_read_byte(kGpioNiceList + j);
|
||||
if (!GetUsedInModule(midx, cmodule.io)) {
|
||||
@ -836,7 +858,7 @@ void HandleModuleConfiguration(void)
|
||||
page += FPSTR(HTTP_SCRIPT_MODULE1);
|
||||
page.replace(F("}4"), String(Settings.module));
|
||||
for (uint8_t i = 0; i < sizeof(cmodule); i++) {
|
||||
if (GPIO_USER == ValidGPIO(i, cmodule.io[i])) {
|
||||
if (ValidGPIO(i, cmodule.io[i])) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("sk(%d,%d);"), my_module.io[i], i); // g0 - g16
|
||||
page += mqtt_data;
|
||||
}
|
||||
@ -854,10 +876,10 @@ void HandleModuleConfiguration(void)
|
||||
|
||||
page += F("<br/><table>");
|
||||
for (uint8_t i = 0; i < sizeof(cmodule); i++) {
|
||||
if (GPIO_USER == ValidGPIO(i, cmodule.io[i])) {
|
||||
if (ValidGPIO(i, cmodule.io[i])) {
|
||||
snprintf_P(stemp, 3, PINS_WEMOS +i*2);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("<tr><td style='width:190px'>%s <b>" D_GPIO "%d</b> %s</td><td style='width:160px'><select id='g%d' name='g%d'></select></td></tr>"),
|
||||
(WEMOS==Settings.module)?stemp:"", i, (0==i)? D_SENSOR_BUTTON "1":(1==i)? D_SERIAL_OUT :(3==i)? D_SERIAL_IN :(9==i)? "<font color='red'>ESP8285</font>" :(10==i)? "<font color='red'>ESP8285</font>" :(12==i)? D_SENSOR_RELAY "1":(13==i)? D_SENSOR_LED "1i":(14==i)? D_SENSOR :"", i, i);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("<tr><td style='width:190px'>%s <b>" D_GPIO "%d</b> %s</td><td style='width:176px'><select id='g%d' name='g%d'></select></td></tr>"),
|
||||
(WEMOS==my_module_type)?stemp:"", i, (0==i)? D_SENSOR_BUTTON "1":(1==i)? D_SERIAL_OUT :(3==i)? D_SERIAL_IN :(9==i)? "<font color='red'>ESP8285</font>" :(10==i)? "<font color='red'>ESP8285</font>" :(12==i)? D_SENSOR_RELAY "1":(13==i)? D_SENSOR_LED "1i":(14==i)? D_SENSOR :"", i, i);
|
||||
page += mqtt_data;
|
||||
}
|
||||
}
|
||||
@ -876,6 +898,7 @@ void ModuleSaveSettings(void)
|
||||
uint8_t new_module = (!strlen(tmp)) ? MODULE : atoi(tmp);
|
||||
Settings.last_module = Settings.module;
|
||||
Settings.module = new_module;
|
||||
SetModuleType();
|
||||
if (Settings.last_module == new_module) {
|
||||
if (my_module_flag.pullup) {
|
||||
Settings.flag3.no_pullup = WebServer->hasArg("b1");
|
||||
@ -886,9 +909,9 @@ void ModuleSaveSettings(void)
|
||||
String gpios = "";
|
||||
for (uint8_t i = 0; i < sizeof(cmodule); i++) {
|
||||
if (Settings.last_module != new_module) {
|
||||
Settings.my_gp.io[i] = 0;
|
||||
Settings.my_gp.io[i] = GPIO_NONE;
|
||||
} else {
|
||||
if (GPIO_USER == ValidGPIO(i, cmodule.io[i])) {
|
||||
if (ValidGPIO(i, cmodule.io[i])) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("g%d"), i);
|
||||
WebGetArg(stemp, tmp, sizeof(tmp));
|
||||
Settings.my_gp.io[i] = (!strlen(tmp)) ? 0 : atoi(tmp);
|
||||
@ -1141,10 +1164,12 @@ void HandleOtherConfiguration(void)
|
||||
page.replace(F("{v}"), FPSTR(S_CONFIGURE_OTHER));
|
||||
page += FPSTR(HTTP_HEAD_STYLE);
|
||||
page += FPSTR(HTTP_FORM_OTHER);
|
||||
TemplateJson();
|
||||
page.replace(F("{t1"), mqtt_data);
|
||||
page.replace(F("{r1"), (Settings.flag.mqtt_enabled) ? F(" checked") : F(""));
|
||||
|
||||
uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : (!devices_present) ? 1 : devices_present;
|
||||
if (SONOFF_IFAN02 == Settings.module) { maxfn = 1; }
|
||||
if (SONOFF_IFAN02 == my_module_type) { maxfn = 1; }
|
||||
for (uint8_t i = 0; i < maxfn; i++) {
|
||||
page += FPSTR(HTTP_FORM_OTHER2);
|
||||
page.replace(F("{1"), String(i +1));
|
||||
@ -1171,7 +1196,7 @@ void HandleOtherConfiguration(void)
|
||||
|
||||
void OtherSaveSettings(void)
|
||||
{
|
||||
char tmp[100];
|
||||
char tmp[128];
|
||||
char stemp[TOPSZ];
|
||||
char stemp2[TOPSZ];
|
||||
|
||||
@ -1191,6 +1216,12 @@ void OtherSaveSettings(void)
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR("%s%s %s"), log_data, (i) ? "," : "", Settings.friendlyname[i]);
|
||||
}
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
WebGetArg("t1", tmp, sizeof(tmp));
|
||||
if (strlen(tmp)) { // {"NAME":"12345678901234","GPIO":[255,255,255,255,255,255,255,255,255,255,255,255,255],"FLAG":255,"BASE":255}
|
||||
char svalue[128];
|
||||
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_TEMPLATE " %s"), tmp);
|
||||
ExecuteWebCommand(svalue, SRC_WEBGUI);
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------------------------*/
|
||||
@ -1312,7 +1343,7 @@ void HandleInformation(void)
|
||||
func += F("}1" D_BOOT_COUNT "}2"); func += String(Settings.bootcount);
|
||||
func += F("}1" D_RESTART_REASON "}2"); func += GetResetReason();
|
||||
uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present;
|
||||
if (SONOFF_IFAN02 == Settings.module) { maxfn = 1; }
|
||||
if (SONOFF_IFAN02 == my_module_type) { maxfn = 1; }
|
||||
for (uint8_t i = 0; i < maxfn; i++) {
|
||||
func += F("}1" D_FRIENDLY_NAME " "); func += i +1; func += F("}2"); func += Settings.friendlyname[i];
|
||||
}
|
||||
@ -1399,7 +1430,7 @@ void HandleInformation(void)
|
||||
page += FPSTR(HTTP_BTN_MAIN);
|
||||
ShowPage(page);
|
||||
}
|
||||
#endif // Not BE_MINIMAL
|
||||
#endif // Not FIRMWARE_MINIMAL
|
||||
|
||||
/*-------------------------------------------------------------------------------------------*/
|
||||
|
||||
@ -1562,7 +1593,7 @@ void HandleUploadLoop(void)
|
||||
}
|
||||
else {
|
||||
#ifdef USE_RF_FLASH
|
||||
if ((SONOFF_BRIDGE == Settings.module) && (upload.buf[0] == ':')) { // Check if this is a RF bridge FW file
|
||||
if ((SONOFF_BRIDGE == my_module_type) && (upload.buf[0] == ':')) { // Check if this is a RF bridge FW file
|
||||
Update.end(); // End esp8266 update session
|
||||
upload_file_type = UPL_EFM8BB1;
|
||||
|
||||
@ -1805,7 +1836,9 @@ void HandleAjaxConsoleRefresh(void)
|
||||
if (strlen(svalue)) { counter = atoi(svalue); }
|
||||
|
||||
bool last_reset_web_log_flag = reset_web_log_flag;
|
||||
String message = F("}9"); // Cannot load mqtt_data here as <> will be encoded by replacements below
|
||||
// mqtt_data used as scratch space
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%d\1%d\1"), web_log_index, last_reset_web_log_flag);
|
||||
String message = mqtt_data;
|
||||
if (!reset_web_log_flag) {
|
||||
counter = 0;
|
||||
reset_web_log_flag = true;
|
||||
@ -1826,20 +1859,13 @@ void HandleAjaxConsoleRefresh(void)
|
||||
cflg = true;
|
||||
}
|
||||
strlcpy(mqtt_data, tmp, len);
|
||||
message += mqtt_data;
|
||||
message += mqtt_data; // mqtt_data used as scratch space
|
||||
}
|
||||
counter++;
|
||||
if (!counter) { counter++; } // Skip 0 as it is not allowed
|
||||
if (!counter) { counter++; } // Skip log index 0 as it is not allowed
|
||||
} while (counter != web_log_index);
|
||||
// XML encoding to fix blank console log in concert with javascript decodeURIComponent
|
||||
message.replace(F("%"), F("%25")); // Needs to be done first as otherwise the % in %26 will also be converted
|
||||
message.replace(F("&"), F("%26"));
|
||||
message.replace(F("<"), F("%3C"));
|
||||
message.replace(F(">"), F("%3E"));
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("<r><i>%d</i><j>%d</j><l>"), web_log_index, last_reset_web_log_flag);
|
||||
message.replace(F("}9"), mqtt_data); // Save to load here
|
||||
message += F("</l></r>");
|
||||
message += F("\1");
|
||||
WebServer->send(200, FPSTR(HDR_CTYPE_XML), message);
|
||||
}
|
||||
|
||||
|
@ -342,7 +342,7 @@ void MqttPublishPowerState(uint8_t device)
|
||||
|
||||
if ((device < 1) || (device > devices_present)) { device = 1; }
|
||||
|
||||
if ((SONOFF_IFAN02 == Settings.module) && (device > 1)) {
|
||||
if ((SONOFF_IFAN02 == my_module_type) && (device > 1)) {
|
||||
if (GetFanspeed() < MAX_FAN_SPEED) { // 4 occurs when fanspeed is 3 and RC button 2 is pressed
|
||||
#ifdef USE_DOMOTICZ
|
||||
DomoticzUpdateFanState(); // RC Button feedback
|
||||
@ -435,7 +435,7 @@ void MqttConnected(void)
|
||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO "3"));
|
||||
for (uint8_t i = 1; i <= devices_present; i++) {
|
||||
MqttPublishPowerState(i);
|
||||
if (SONOFF_IFAN02 == Settings.module) { break; } // Report status of light relay only
|
||||
if (SONOFF_IFAN02 == my_module_type) { break; } // Report status of light relay only
|
||||
}
|
||||
if (Settings.tele_period) { tele_period = Settings.tele_period -9; } // Enable TelePeriod in 9 seconds
|
||||
rules_flag.system_boot = 1;
|
||||
@ -694,8 +694,8 @@ bool MqttCommand(void)
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, fingerprint);
|
||||
}
|
||||
#endif
|
||||
else if ((CMND_MQTTCLIENT == command_code) && !grpflg) {
|
||||
if ((data_len > 0) && (data_len < sizeof(Settings.mqtt_client))) {
|
||||
else if (CMND_MQTTCLIENT == command_code) {
|
||||
if (!grpflg && (data_len > 0) && (data_len < sizeof(Settings.mqtt_client))) {
|
||||
strlcpy(Settings.mqtt_client, (SC_DEFAULT == Shortcut(dataBuf)) ? MQTT_CLIENT_ID : dataBuf, sizeof(Settings.mqtt_client));
|
||||
restart_flag = 2;
|
||||
}
|
||||
@ -766,8 +766,8 @@ bool MqttCommand(void)
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.mqtt_grptopic);
|
||||
}
|
||||
else if ((CMND_TOPIC == command_code) && !grpflg) {
|
||||
if ((data_len > 0) && (data_len < sizeof(Settings.mqtt_topic))) {
|
||||
else if (CMND_TOPIC == command_code) {
|
||||
if (!grpflg && (data_len > 0) && (data_len < sizeof(Settings.mqtt_topic))) {
|
||||
MakeValidMqtt(0, dataBuf);
|
||||
if (!strcmp(dataBuf, mqtt_client)) SetShortcut(dataBuf, SC_DEFAULT);
|
||||
strlcpy(stemp1, (SC_DEFAULT == Shortcut(dataBuf)) ? MQTT_TOPIC : dataBuf, sizeof(stemp1));
|
||||
@ -780,8 +780,8 @@ bool MqttCommand(void)
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.mqtt_topic);
|
||||
}
|
||||
else if ((CMND_BUTTONTOPIC == command_code) && !grpflg) {
|
||||
if ((data_len > 0) && (data_len < sizeof(Settings.button_topic))) {
|
||||
else if (CMND_BUTTONTOPIC == command_code) {
|
||||
if (!grpflg && (data_len > 0) && (data_len < sizeof(Settings.button_topic))) {
|
||||
MakeValidMqtt(0, dataBuf);
|
||||
if (!strcmp(dataBuf, mqtt_client)) SetShortcut(dataBuf, SC_DEFAULT);
|
||||
switch (Shortcut(dataBuf)) {
|
||||
|
@ -695,6 +695,9 @@ bool Xdrv03(uint8_t function)
|
||||
case FUNC_SET_POWER:
|
||||
EnergySetPowerSteadyCounter();
|
||||
break;
|
||||
case FUNC_LOOP:
|
||||
XnrgCall(FUNC_LOOP);
|
||||
break;
|
||||
case FUNC_SERIAL:
|
||||
result = XnrgCall(FUNC_SERIAL);
|
||||
break;
|
||||
|
@ -32,6 +32,9 @@
|
||||
* 11 +WS2812 RGB(W) no (One WS2812 RGB or RGBW ledstrip)
|
||||
* 12 AiLight RGBW no
|
||||
* 13 Sonoff B1 RGBCW yes
|
||||
* 19 SM16716 RGB no
|
||||
* 20 SM16716+W RGBW no
|
||||
* 21 SM16716+CW RGBCW yes
|
||||
*
|
||||
* light_scheme WS2812 3+ Colors 1+2 Colors Effect
|
||||
* ------------ ------ --------- ---------- -----------------
|
||||
@ -354,6 +357,117 @@ void LightMy92x1Duty(uint8_t duty_r, uint8_t duty_g, uint8_t duty_b, uint8_t dut
|
||||
os_delay_us(12); // TStop > 12us.
|
||||
}
|
||||
|
||||
#ifdef USE_SM16716
|
||||
/*********************************************************************************************\
|
||||
* SM16716 - Controlling RGB over a synchronous serial line
|
||||
* Copyright (C) 2019 Gabor Simon
|
||||
*
|
||||
* Source: https://community.home-assistant.io/t/cheap-uk-wifi-bulbs-with-tasmota-teardown-help-tywe3s/40508/27
|
||||
*
|
||||
\*********************************************************************************************/
|
||||
|
||||
// Enable this for debug logging
|
||||
//#define D_LOG_SM16716 "SM16716: "
|
||||
|
||||
uint8_t sm16716_pin_clk = 100;
|
||||
uint8_t sm16716_pin_dat = 100;
|
||||
uint8_t sm16716_pin_sel = 100;
|
||||
uint8_t sm16716_enabled = 0;
|
||||
|
||||
void SM16716_SendBit(uint8_t v)
|
||||
{
|
||||
/* NOTE:
|
||||
* According to the spec sheet, max freq is 30 MHz, that is 16.6 ns per high/low half of the
|
||||
* clk square wave. That is less than the overhead of 'digitalWrite' at this clock rate,
|
||||
* so no additional delays are needed yet. */
|
||||
|
||||
digitalWrite(sm16716_pin_dat, (v != 0) ? HIGH : LOW);
|
||||
//delayMicroseconds(1);
|
||||
digitalWrite(sm16716_pin_clk, HIGH);
|
||||
//delayMicroseconds(1);
|
||||
digitalWrite(sm16716_pin_clk, LOW);
|
||||
}
|
||||
|
||||
void SM16716_SendByte(uint8_t v)
|
||||
{
|
||||
uint8_t mask;
|
||||
|
||||
for (mask = 0x80; mask; mask >>= 1) {
|
||||
SM16716_SendBit(v & mask);
|
||||
}
|
||||
}
|
||||
|
||||
void SM16716_Update(uint8_t duty_r, uint8_t duty_g, uint8_t duty_b)
|
||||
{
|
||||
if (sm16716_pin_sel < 99) {
|
||||
uint8_t sm16716_should_enable = (duty_r | duty_g | duty_b);
|
||||
if (!sm16716_enabled && sm16716_should_enable) {
|
||||
#ifdef D_LOG_SM16716
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_SM16716 "turning color on"));
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
#endif // D_LOG_SM16716
|
||||
sm16716_enabled = 1;
|
||||
digitalWrite(sm16716_pin_sel, HIGH);
|
||||
// in testing I found it takes a minimum of ~380us to wake up the chip
|
||||
// tested on a Merkury RGBW with an SM726EB
|
||||
delayMicroseconds(1000);
|
||||
SM16716_Init();
|
||||
}
|
||||
else if (sm16716_enabled && !sm16716_should_enable) {
|
||||
#ifdef D_LOG_SM16716
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_SM16716 "turning color off"));
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
#endif // D_LOG_SM16716
|
||||
sm16716_enabled = 0;
|
||||
digitalWrite(sm16716_pin_sel, LOW);
|
||||
}
|
||||
}
|
||||
#ifdef D_LOG_SM16716
|
||||
snprintf_P(log_data, sizeof(log_data),
|
||||
PSTR(D_LOG_SM16716 "Update; rgb=%02x%02x%02x"),
|
||||
duty_r, duty_g, duty_b);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
#endif // D_LOG_SM16716
|
||||
|
||||
// send start bit
|
||||
SM16716_SendBit(1);
|
||||
// send 24-bit rgb data
|
||||
SM16716_SendByte(duty_r);
|
||||
SM16716_SendByte(duty_g);
|
||||
SM16716_SendByte(duty_b);
|
||||
// send a 'do it' pulse
|
||||
// (if multiple chips are chained, each one processes the 1st '1rgb' 25-bit block and
|
||||
// passes on the rest, right until the one starting with 0)
|
||||
//SM16716_Init();
|
||||
SM16716_SendBit(0);
|
||||
SM16716_SendByte(0);
|
||||
SM16716_SendByte(0);
|
||||
SM16716_SendByte(0);
|
||||
}
|
||||
|
||||
bool SM16716_ModuleSelected(void)
|
||||
{
|
||||
sm16716_pin_clk = pin[GPIO_SM16716_CLK];
|
||||
sm16716_pin_dat = pin[GPIO_SM16716_DAT];
|
||||
sm16716_pin_sel = pin[GPIO_SM16716_SEL];
|
||||
#ifdef D_LOG_SM16716
|
||||
snprintf_P(log_data, sizeof(log_data),
|
||||
PSTR(D_LOG_SM16716 "ModuleSelected; clk_pin=%d, dat_pin=%d)"),
|
||||
sm16716_pin_clk, sm16716_pin_dat);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
#endif // D_LOG_SM16716
|
||||
return (sm16716_pin_clk < 99) && (sm16716_pin_dat < 99);
|
||||
}
|
||||
|
||||
void SM16716_Init(void)
|
||||
{
|
||||
for (uint8_t t_init = 0; t_init < 50; ++t_init) {
|
||||
SM16716_SendBit(0);
|
||||
}
|
||||
}
|
||||
|
||||
#endif // ifdef USE_SM16716
|
||||
|
||||
/********************************************************************************************/
|
||||
|
||||
void LightInit(void)
|
||||
@ -373,7 +487,7 @@ void LightInit(void)
|
||||
pinMode(pin[GPIO_PWM1 +i], OUTPUT);
|
||||
}
|
||||
}
|
||||
if (SONOFF_LED == Settings.module) { // Fix Sonoff Led instabilities
|
||||
if (SONOFF_LED == my_module_type) { // Fix Sonoff Led instabilities
|
||||
if (!my_module.io[4]) {
|
||||
pinMode(4, OUTPUT); // Stop floating outputs
|
||||
digitalWrite(4, LOW);
|
||||
@ -402,6 +516,32 @@ void LightInit(void)
|
||||
max_scheme = LS_MAX + WS2812_SCHEMES;
|
||||
}
|
||||
#endif // USE_WS2812 ************************************************************************
|
||||
#ifdef USE_SM16716
|
||||
else if (LT_SM16716 == light_type - light_subtype) {
|
||||
// init PWM
|
||||
for (uint8_t i = 0; i < light_subtype; i++) {
|
||||
Settings.pwm_value[i] = 0; // Disable direct PWM control
|
||||
if (pin[GPIO_PWM1 +i] < 99) {
|
||||
pinMode(pin[GPIO_PWM1 +i], OUTPUT);
|
||||
}
|
||||
}
|
||||
// init sm16716
|
||||
pinMode(sm16716_pin_clk, OUTPUT);
|
||||
digitalWrite(sm16716_pin_clk, LOW);
|
||||
|
||||
pinMode(sm16716_pin_dat, OUTPUT);
|
||||
digitalWrite(sm16716_pin_dat, LOW);
|
||||
|
||||
if (sm16716_pin_sel < 99) {
|
||||
pinMode(sm16716_pin_sel, OUTPUT);
|
||||
digitalWrite(sm16716_pin_sel, LOW);
|
||||
// no need to call SM16716_Init here, it will be called after sel goes HIGH
|
||||
} else {
|
||||
// no sel pin means you have an 'always on' chip, so init right away
|
||||
SM16716_Init();
|
||||
}
|
||||
}
|
||||
#endif // ifdef USE_SM16716
|
||||
else {
|
||||
light_pdi_pin = pin[GPIO_DI];
|
||||
light_pdcki_pin = pin[GPIO_DCKI];
|
||||
@ -438,7 +578,7 @@ void LightSetColorTemp(uint16_t ct)
|
||||
}
|
||||
uint16_t icold = (100 * (347 - my_ct)) / 136;
|
||||
uint16_t iwarm = (100 * my_ct) / 136;
|
||||
if (PHILIPS == Settings.module) {
|
||||
if (PHILIPS == my_module_type) {
|
||||
// Xiaomi Philips bulbs follow a different scheme:
|
||||
// channel 0=intensity, channel2=temperature
|
||||
Settings.light_color[1] = (uint8_t)icold;
|
||||
@ -474,7 +614,7 @@ void LightSetDimmer(uint8_t myDimmer)
|
||||
{
|
||||
float temp;
|
||||
|
||||
if (PHILIPS == Settings.module) {
|
||||
if (PHILIPS == my_module_type) {
|
||||
// Xiaomi Philips bulbs use two PWM channels with a different scheme:
|
||||
float dimmer = 100 / (float)myDimmer;
|
||||
temp = (float)Settings.light_color[0] / dimmer; // channel 1 is intensity
|
||||
@ -844,6 +984,24 @@ void LightAnimate(void)
|
||||
Ws2812SetColor(0, cur_col[0], cur_col[1], cur_col[2], cur_col[3]);
|
||||
}
|
||||
#endif // USE_ES2812 ************************************************************************
|
||||
#ifdef USE_SM16716
|
||||
else if (LT_SM16716 == light_type - light_subtype) {
|
||||
// handle any PWM pins, skipping the first 3 values for sm16716
|
||||
for (uint8_t i = 3; i < light_subtype; i++) {
|
||||
if (pin[GPIO_PWM1 +i-3] < 99) {
|
||||
if (cur_col[i] > 0xFC) {
|
||||
cur_col[i] = 0xFC; // Fix unwanted blinking and PWM watchdog errors for values close to pwm_range (H801, Arilux and BN-SZ01)
|
||||
}
|
||||
uint16_t curcol = cur_col[i] * (Settings.pwm_range / 255);
|
||||
// snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION "Cur_Col%d %d, CurCol %d"), i, cur_col[i], curcol);
|
||||
// AddLog(LOG_LEVEL_DEBUG);
|
||||
analogWrite(pin[GPIO_PWM1 +i-3], bitRead(pwm_inverted, i-3) ? Settings.pwm_range - curcol : curcol);
|
||||
}
|
||||
}
|
||||
// handle sm16716 update
|
||||
SM16716_Update(cur_col[0], cur_col[1], cur_col[2]);
|
||||
}
|
||||
#endif // ifdef USE_SM16716
|
||||
else if (light_type > LT_WS2812) {
|
||||
LightMy92x1Duty(cur_col[0], cur_col[1], cur_col[2], cur_col[3], cur_col[4]);
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ IRMitsubishiAC *mitsubir = NULL;
|
||||
|
||||
const char kFanSpeedOptions[] = "A12345S";
|
||||
const char kHvacModeOptions[] = "HDCA";
|
||||
#endif
|
||||
#endif // USE_IR_HVAC
|
||||
|
||||
/*********************************************************************************************\
|
||||
* IR Send
|
||||
@ -67,6 +67,7 @@ const char kHvacModeOptions[] = "HDCA";
|
||||
#include <IRsend.h>
|
||||
|
||||
IRsend *irsend = NULL;
|
||||
bool irsend_active = false;
|
||||
|
||||
void IrSendInit(void)
|
||||
{
|
||||
@ -113,13 +114,13 @@ void IrReceiveCheck(void)
|
||||
|
||||
if (irrecv->decode(&results)) {
|
||||
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_IRR "RawLen %d, Overflow %d, Bits %d, Value %08X, Decode %d"),
|
||||
results.rawlen, results.overflow, results.bits, results.value, results.decode_type);
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_IRR "Echo %d, RawLen %d, Overflow %d, Bits %d, Value %08X, Decode %d"),
|
||||
irsend_active, results.rawlen, results.overflow, results.bits, results.value, results.decode_type);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
|
||||
unsigned long now = millis();
|
||||
// if ((now - ir_lasttime > IR_TIME_AVOID_DUPLICATE) && (UNKNOWN != results.decode_type) && (results.bits > 0)) {
|
||||
if (now - ir_lasttime > IR_TIME_AVOID_DUPLICATE) {
|
||||
if (!irsend_active && (now - ir_lasttime > IR_TIME_AVOID_DUPLICATE)) {
|
||||
ir_lasttime = now;
|
||||
|
||||
iridx = results.decode_type;
|
||||
@ -262,10 +263,11 @@ bool IrHvacToshiba(const char *HVAC_Mode, const char *HVAC_FanMode, bool HVAC_Po
|
||||
rawdata[i++] = HVAC_TOSHIBA_RPT_MARK;
|
||||
rawdata[i++] = HVAC_TOSHIBA_RPT_SPACE;
|
||||
|
||||
noInterrupts();
|
||||
// noInterrupts();
|
||||
irsend_active = true;
|
||||
irsend->sendRaw(rawdata, i, 38);
|
||||
irsend->sendRaw(rawdata, i, 38);
|
||||
interrupts();
|
||||
// interrupts();
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -430,9 +432,10 @@ bool IrHvacLG(const char *HVAC_Mode, const char *HVAC_FanMode, bool HVAC_Power,
|
||||
// AddLog(LOG_LEVEL_DEBUG);
|
||||
|
||||
// Send LG IR Code
|
||||
noInterrupts();
|
||||
// noInterrupts();
|
||||
irsend_active = true;
|
||||
irsend->sendLG(LG_Code, 28);
|
||||
interrupts();
|
||||
// interrupts();
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -451,6 +454,8 @@ bool IrHvacFujitsu(const char *HVAC_Mode, const char *HVAC_FanMode, bool HVAC_Po
|
||||
|
||||
IRFujitsuAC ac(pin[GPIO_IRSEND]);
|
||||
|
||||
irsend_active = true;
|
||||
|
||||
if (0 == HVAC_Power) {
|
||||
ac.off();
|
||||
ac.send();
|
||||
@ -540,6 +545,7 @@ bool IrSendCommand(void)
|
||||
// count, freq, raw_array[0], raw_array[count -1]);
|
||||
// AddLog(LOG_LEVEL_DEBUG);
|
||||
|
||||
irsend_active = true;
|
||||
irsend->sendRaw(raw_array, count, freq);
|
||||
if (!count) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_FAILED);
|
||||
@ -571,6 +577,7 @@ bool IrSendCommand(void)
|
||||
protocol_text, protocol, bits, data, data, protocol_code);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
|
||||
irsend_active = true;
|
||||
switch (protocol_code) {
|
||||
case NEC:
|
||||
irsend->sendNEC(data, (bits > NEC_BITS) ? NEC_BITS : bits); break;
|
||||
@ -589,6 +596,7 @@ bool IrSendCommand(void)
|
||||
case PANASONIC:
|
||||
irsend->sendPanasonic(bits, data); break;
|
||||
default:
|
||||
irsend_active = false;
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_PROTOCOL_NOT_SUPPORTED);
|
||||
}
|
||||
}
|
||||
@ -688,6 +696,7 @@ bool Xdrv05(uint8_t function)
|
||||
IrReceiveCheck(); // check if there's anything on IR side
|
||||
}
|
||||
#endif // USE_IR_RECEIVE
|
||||
irsend_active = false; // re-enable IR reception
|
||||
break;
|
||||
case FUNC_COMMAND:
|
||||
if (pin[GPIO_IRSEND] < 99) {
|
||||
|
@ -570,7 +570,7 @@ bool Xdrv06(uint8_t function)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (SONOFF_BRIDGE == Settings.module) {
|
||||
if (SONOFF_BRIDGE == my_module_type) {
|
||||
switch (function) {
|
||||
case FUNC_INIT:
|
||||
SonoffBridgeInit();
|
||||
|
@ -100,7 +100,7 @@ void MqttPublishDomoticzPowerState(uint8_t device)
|
||||
if (Settings.flag.mqtt_enabled) {
|
||||
if ((device < 1) || (device > devices_present)) { device = 1; }
|
||||
if (Settings.domoticz_relay_idx[device -1]) {
|
||||
if ((SONOFF_IFAN02 == Settings.module) && (device > 1)) {
|
||||
if ((SONOFF_IFAN02 == my_module_type) && (device > 1)) {
|
||||
// Fan handled by MqttPublishDomoticzFanState
|
||||
} else {
|
||||
char svalue[8]; // Dimmer value
|
||||
@ -129,7 +129,7 @@ void DomoticzMqttUpdate(void)
|
||||
if (domoticz_update_timer <= 0) {
|
||||
domoticz_update_timer = Settings.domoticz_update_timer;
|
||||
for (uint8_t i = 1; i <= devices_present; i++) {
|
||||
if ((SONOFF_IFAN02 == Settings.module) && (i > 1)) {
|
||||
if ((SONOFF_IFAN02 == my_module_type) && (i > 1)) {
|
||||
MqttPublishDomoticzFanState();
|
||||
break;
|
||||
} else {
|
||||
@ -215,7 +215,7 @@ bool DomoticzMqttData(void)
|
||||
if (idx == Settings.domoticz_relay_idx[i]) {
|
||||
bool iscolordimmer = strcmp_P(domoticz["dtype"],PSTR("Color Switch")) == 0;
|
||||
snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1);
|
||||
if ((SONOFF_IFAN02 == Settings.module) && (1 == i)) { // Idx 2 is fanspeed
|
||||
if ((SONOFF_IFAN02 == my_module_type) && (1 == i)) { // Idx 2 is fanspeed
|
||||
uint8_t svalue = 0;
|
||||
if (domoticz.containsKey("svalue1")) {
|
||||
svalue = domoticz["svalue1"];
|
||||
@ -475,7 +475,7 @@ void HandleDomoticzConfiguration(void)
|
||||
page.replace("{4", String((int)Settings.domoticz_switch_idx[i]));
|
||||
}
|
||||
page.replace("{1", String(i +1));
|
||||
if ((SONOFF_IFAN02 == Settings.module) && (1 == i)) { break; }
|
||||
if ((SONOFF_IFAN02 == my_module_type) && (1 == i)) { break; }
|
||||
}
|
||||
for (int i = 0; i < DZ_MAX_SENSORS; i++) {
|
||||
page += FPSTR(HTTP_FORM_DOMOTICZ_SENSOR);
|
||||
|
@ -31,38 +31,51 @@
|
||||
enum SerialBridgeCommands { CMND_SSERIALSEND, CMND_SBAUDRATE };
|
||||
const char kSerialBridgeCommands[] PROGMEM = D_CMND_SSERIALSEND "|" D_CMND_SBAUDRATE;
|
||||
|
||||
TasmotaSerial *SerialBridgeSerial;
|
||||
TasmotaSerial *SerialBridgeSerial = NULL;
|
||||
|
||||
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 = NULL;
|
||||
int serial_bridge_in_byte_counter = 0;
|
||||
bool serial_bridge_active = true;
|
||||
bool serial_bridge_raw = false;
|
||||
|
||||
void SerialBridgeInput(void)
|
||||
{
|
||||
while (SerialBridgeSerial->available()) {
|
||||
yield();
|
||||
uint8_t serial_in_uint8_t = SerialBridgeSerial->read();
|
||||
uint8_t serial_in_byte = SerialBridgeSerial->read();
|
||||
|
||||
if (serial_in_byte > 127) { // binary data...
|
||||
if ((serial_in_byte > 127) && !serial_bridge_raw) { // Discard binary data above 127 if no raw reception allowed
|
||||
serial_bridge_in_byte_counter = 0;
|
||||
SerialBridgeSerial->flush();
|
||||
return;
|
||||
}
|
||||
if (serial_in_byte) {
|
||||
if ((serial_in_byte_counter < SERIAL_BRIDGE_BUFFER_SIZE -1) && (serial_in_byte != Settings.serial_delimiter)) { // add char to string if it still fits
|
||||
if (serial_in_byte || serial_bridge_raw) { // Any char between 1 and 127 or any char (0 - 255)
|
||||
|
||||
if ((serial_bridge_in_byte_counter < SERIAL_BRIDGE_BUFFER_SIZE -1) && // Add char to string if it still fits and ...
|
||||
((isprint(serial_in_byte) && (128 == Settings.serial_delimiter)) || // Any char between 32 and 127
|
||||
(serial_in_byte != Settings.serial_delimiter) || // Any char between 1 and 127 and not being delimiter
|
||||
serial_bridge_raw)) { // Any char between 0 and 255
|
||||
serial_bridge_buffer[serial_bridge_in_byte_counter++] = serial_in_byte;
|
||||
serial_bridge_polling_window = millis(); // Wait for more data
|
||||
serial_bridge_polling_window = millis(); // Wait for more data
|
||||
} else {
|
||||
serial_bridge_polling_window = 0; // Publish now
|
||||
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);
|
||||
serial_bridge_buffer[serial_bridge_in_byte_counter] = 0; // Serial data completed
|
||||
if (!serial_bridge_raw) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_SSERIALRECEIVED "\":\"%s\"}"), serial_bridge_buffer);
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_SSERIALRECEIVED "\":\""));
|
||||
for (int i = 0; i < serial_bridge_in_byte_counter; i++) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%02x"), mqtt_data, serial_bridge_buffer[i]);
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"}"), mqtt_data);
|
||||
}
|
||||
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SSERIALRECEIVED));
|
||||
// XdrvRulesProcess();
|
||||
serial_bridge_in_byte_counter = 0;
|
||||
@ -73,15 +86,18 @@ void SerialBridgeInput(void)
|
||||
|
||||
void SerialBridgeInit(void)
|
||||
{
|
||||
serial_bridge_active = 0;
|
||||
serial_bridge_active = false;
|
||||
if ((pin[GPIO_SBR_RX] < 99) && (pin[GPIO_SBR_TX] < 99)) {
|
||||
serial_bridge_buffer = (char*)(malloc(SERIAL_BRIDGE_BUFFER_SIZE));
|
||||
if (serial_bridge_buffer != NULL) {
|
||||
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();
|
||||
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
|
||||
if (SerialBridgeSerial->hardwareSerial()) {
|
||||
ClaimSerial();
|
||||
serial_bridge_buffer = serial_in_buffer; // Use idle serial buffer to save RAM
|
||||
} else {
|
||||
serial_bridge_buffer = (char*)(malloc(SERIAL_BRIDGE_BUFFER_SIZE));
|
||||
}
|
||||
serial_bridge_active = true;
|
||||
SerialBridgeSerial->flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -100,18 +116,19 @@ bool SerialBridgeCommand(void)
|
||||
serviced = false; // Unknown command
|
||||
}
|
||||
else if ((CMND_SSERIALSEND == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) {
|
||||
if (XdrvMailbox.data_len > 0) { // "Hello Tiger\n"
|
||||
serial_bridge_raw = (XdrvMailbox.index > 3);
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
if (1 == XdrvMailbox.index) {
|
||||
SerialBridgeSerial->write(XdrvMailbox.data, XdrvMailbox.data_len);
|
||||
SerialBridgeSerial->write("\n");
|
||||
SerialBridgeSerial->write(XdrvMailbox.data, XdrvMailbox.data_len); // "Hello Tiger"
|
||||
SerialBridgeSerial->write("\n"); // "\n"
|
||||
}
|
||||
else if ((2 == XdrvMailbox.index) || (4 == XdrvMailbox.index)) { // "Hello Tiger" or "A0"
|
||||
SerialBridgeSerial->write(XdrvMailbox.data, XdrvMailbox.data_len);
|
||||
else if ((2 == XdrvMailbox.index) || (4 == XdrvMailbox.index)) {
|
||||
SerialBridgeSerial->write(XdrvMailbox.data, XdrvMailbox.data_len); // "Hello Tiger" or "A0"
|
||||
}
|
||||
else if (3 == XdrvMailbox.index) { // "Hello\f"
|
||||
else if (3 == XdrvMailbox.index) { // "Hello\f"
|
||||
SerialBridgeSerial->write(Unescape(XdrvMailbox.data, &XdrvMailbox.data_len), XdrvMailbox.data_len);
|
||||
}
|
||||
else if (5 == XdrvMailbox.index) { // "AA004566" as hex values
|
||||
else if (5 == XdrvMailbox.index) {
|
||||
char *p;
|
||||
char stemp[3];
|
||||
uint8_t code;
|
||||
@ -122,7 +139,7 @@ bool SerialBridgeCommand(void)
|
||||
while (size > 0) {
|
||||
snprintf(stemp, sizeof(stemp), codes);
|
||||
code = strtol(stemp, &p, 16);
|
||||
SerialBridgeSerial->write(code);
|
||||
SerialBridgeSerial->write(code); // "AA004566" as hex values
|
||||
size -= 2;
|
||||
codes += 2;
|
||||
}
|
||||
@ -159,7 +176,7 @@ bool Xdrv08(uint8_t function)
|
||||
SerialBridgeInit();
|
||||
break;
|
||||
case FUNC_LOOP:
|
||||
SerialBridgeInput();
|
||||
if (SerialBridgeSerial) { SerialBridgeInput(); }
|
||||
break;
|
||||
case FUNC_COMMAND:
|
||||
result = SerialBridgeCommand();
|
||||
|
@ -78,6 +78,18 @@
|
||||
|
||||
#define D_JSON_INITIATED "Initiated"
|
||||
|
||||
#define COMPARE_OPERATOR_NONE -1
|
||||
#define COMPARE_OPERATOR_EQUAL 0
|
||||
#define COMPARE_OPERATOR_BIGGER 1
|
||||
#define COMPARE_OPERATOR_SMALLER 2
|
||||
#define COMPARE_OPERATOR_EXACT_DIVISION 3
|
||||
#define COMPARE_OPERATOR_NUMBER_EQUAL 4
|
||||
#define COMPARE_OPERATOR_NOT_EQUAL 5
|
||||
#define COMPARE_OPERATOR_BIGGER_EQUAL 6
|
||||
#define COMPARE_OPERATOR_SMALLER_EQUAL 7
|
||||
#define MAXIMUM_COMPARE_OPERATOR COMPARE_OPERATOR_SMALLER_EQUAL
|
||||
const char kCompareOperators[] PROGMEM = "=\0>\0<\0|\0==!=>=<=";
|
||||
|
||||
enum RulesCommands { CMND_RULE, CMND_RULETIMER, CMND_EVENT, CMND_VAR, CMND_MEM, CMND_ADD, CMND_SUB, CMND_MULT, CMND_SCALE, CMND_CALC_RESOLUTION };
|
||||
const char kRulesCommands[] PROGMEM = D_CMND_RULE "|" D_CMND_RULETIMER "|" D_CMND_EVENT "|" D_CMND_VAR "|" D_CMND_MEM "|" D_CMND_ADD "|" D_CMND_SUB "|" D_CMND_MULT "|" D_CMND_SCALE "|" D_CMND_CALC_RESOLUTION ;
|
||||
|
||||
@ -128,31 +140,20 @@ bool RulesRuleMatch(uint8_t rule_set, String &event, String &rule)
|
||||
|
||||
String rule_name = rule.substring(pos +1); // "CURRENT>0.100" or "BOOT" or "%var1%" or "MINUTE|5"
|
||||
|
||||
char compare = ' ';
|
||||
pos = rule_name.indexOf(">");
|
||||
if (pos > 0) {
|
||||
compare = '>';
|
||||
} else {
|
||||
pos = rule_name.indexOf("<");
|
||||
if (pos > 0) {
|
||||
compare = '<';
|
||||
} else {
|
||||
pos = rule_name.indexOf("=");
|
||||
if (pos > 0) {
|
||||
compare = '=';
|
||||
} else {
|
||||
pos = rule_name.indexOf("|"); // Modulo, cannot use % easily as it is used for variable detection
|
||||
if (pos > 0) {
|
||||
compare = '%';
|
||||
}
|
||||
}
|
||||
char compare_operator[3];
|
||||
int8_t compare = COMPARE_OPERATOR_NONE;
|
||||
for (int8_t i = MAXIMUM_COMPARE_OPERATOR; i >= 0; i--) {
|
||||
snprintf_P(compare_operator, sizeof(compare_operator), kCompareOperators + (i *2));
|
||||
if ((pos = rule_name.indexOf(compare_operator)) > 0) {
|
||||
compare = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
char rule_svalue[CMDSZ] = { 0 };
|
||||
double rule_value = 0;
|
||||
if (pos > 0) {
|
||||
String rule_param = rule_name.substring(pos + 1);
|
||||
if (compare != COMPARE_OPERATOR_NONE) {
|
||||
String rule_param = rule_name.substring(pos + strlen(compare_operator));
|
||||
for (uint8_t i = 0; i < MAX_RULE_VARS; i++) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("%%VAR%d%%"), i +1);
|
||||
if (rule_param.startsWith(stemp)) {
|
||||
@ -224,24 +225,32 @@ bool RulesRuleMatch(uint8_t rule_set, String &event, String &rule)
|
||||
int int_value = int(value);
|
||||
int int_rule_value = int(rule_value);
|
||||
switch (compare) {
|
||||
case '%':
|
||||
if ((int_value > 0) && (int_rule_value > 0)) {
|
||||
if ((int_value % int_rule_value) == 0) { match = true; }
|
||||
}
|
||||
case COMPARE_OPERATOR_EXACT_DIVISION:
|
||||
match = (int_rule_value && (int_value % int_rule_value) == 0);
|
||||
break;
|
||||
case '>':
|
||||
if (value > rule_value) { match = true; }
|
||||
case COMPARE_OPERATOR_EQUAL:
|
||||
match = (!strcasecmp(str_value, rule_svalue)); // Compare strings - this also works for hexadecimals
|
||||
break;
|
||||
case '<':
|
||||
if (value < rule_value) { match = true; }
|
||||
case COMPARE_OPERATOR_BIGGER:
|
||||
match = (value > rule_value);
|
||||
break;
|
||||
case '=':
|
||||
// if (value == rule_value) { match = true; } // Compare values - only decimals or partly hexadecimals
|
||||
if (!strcasecmp(str_value, rule_svalue)) { match = true; } // Compare strings - this also works for hexadecimals
|
||||
case COMPARE_OPERATOR_SMALLER:
|
||||
match = (value < rule_value);
|
||||
break;
|
||||
case ' ':
|
||||
match = true; // Json value but not needed
|
||||
case COMPARE_OPERATOR_NUMBER_EQUAL:
|
||||
match = (value == rule_value);
|
||||
break;
|
||||
case COMPARE_OPERATOR_NOT_EQUAL:
|
||||
match = (value != rule_value);
|
||||
break;
|
||||
case COMPARE_OPERATOR_BIGGER_EQUAL:
|
||||
match = (value >= rule_value);
|
||||
break;
|
||||
case COMPARE_OPERATOR_SMALLER_EQUAL:
|
||||
match = (value <= rule_value);
|
||||
break;
|
||||
default:
|
||||
match = true;
|
||||
}
|
||||
} else match = true;
|
||||
|
||||
|
@ -499,8 +499,8 @@ void KNX_INIT(void)
|
||||
if (GetUsedInModule(GPIO_DHT22, my_module.io)) { device_param[KNX_HUMIDITY-1].show = true; }
|
||||
if (GetUsedInModule(GPIO_SI7021, my_module.io)) { device_param[KNX_HUMIDITY-1].show = true; }
|
||||
|
||||
// Sonoff 31 or Sonoff Pow or any HLW8012 based device or Sonoff POW R2 or Any device with a Pzem004T
|
||||
if ( ( SONOFF_S31 == Settings.module ) || ( SONOFF_POW_R2 == Settings.module ) || ( energy_flg != ENERGY_NONE ) ) {
|
||||
// Any device with a Power Monitoring
|
||||
if ( energy_flg != ENERGY_NONE ) {
|
||||
device_param[KNX_ENERGY_POWER-1].show = true;
|
||||
device_param[KNX_ENERGY_DAILY-1].show = true;
|
||||
device_param[KNX_ENERGY_START-1].show = true;
|
||||
|
@ -67,7 +67,7 @@ const char HASS_DISCOVER_LIGHT_WHITE[] PROGMEM =
|
||||
"%s,\"whit_val_cmd_t\":\"%s\"," // cmnd/led2/White
|
||||
"\"whit_val_stat_t\":\"%s\"," // stat/led2/RESULT
|
||||
"\"white_value_scale\":100," // (No abbreviation defined)
|
||||
"\"whit_val_tpl\":\"{{ value_json.Channel[3] }}\"";
|
||||
"\"whit_val_tpl\":\"{{value_json.Channel[3]}}\"";
|
||||
|
||||
const char HASS_DISCOVER_LIGHT_CT[] PROGMEM =
|
||||
"%s,\"clr_temp_cmd_t\":\"%s\"," // cmnd/led2/CT
|
||||
@ -122,6 +122,11 @@ const char HASS_DISCOVER_SENSOR_ANY[] PROGMEM =
|
||||
"%s,\"unit_of_meas\":\" \"," // " " As unit of measurement to get a value graph in Hass
|
||||
"\"val_tpl\":\"{{value_json['%s'].%s}}\""; // "COUNTER":{"C1":0} -> {{ value_json['COUNTER'].C1 }}
|
||||
|
||||
const char HASS_DISCOVER_SENSOR_HASS_STATUS[] PROGMEM =
|
||||
"%s,\"json_attributes_topic\":\"%s\","
|
||||
"\"unit_of_meas\":\" \"," // " " As unit of measurement to get a value graph in Hass
|
||||
"\"val_tpl\":\"{{value_json['" D_JSON_RSSI "']}}\"";// "COUNTER":{"C1":0} -> {{ value_json['COUNTER'].C1 }}
|
||||
|
||||
const char HASS_DISCOVER_DEVICE_INFO[] PROGMEM =
|
||||
"%s,\"uniq_id\":\"%s\","
|
||||
"\"device\":{\"identifiers\":[\"%06X\"],"
|
||||
@ -130,11 +135,16 @@ const char HASS_DISCOVER_DEVICE_INFO[] PROGMEM =
|
||||
"\"sw_version\":\"%s%s\","
|
||||
"\"manufacturer\":\"Tasmota\"}";
|
||||
|
||||
const char HASS_DISCOVER_DEVICE_INFO_SHORT[] PROGMEM =
|
||||
"%s,\"uniq_id\":\"%s\","
|
||||
"\"device\":{\"identifiers\":[\"%06X\"]}";
|
||||
|
||||
const char HASS_DISCOVER_TOPIC_PREFIX[] PROGMEM =
|
||||
"%s, \"~\":\"%s\"";
|
||||
|
||||
uint8_t hass_init_step = 0;
|
||||
uint8_t hass_mode = 0;
|
||||
int hass_tele_period = 0;
|
||||
|
||||
static void FindPrefix(char* s1, char* s2, char* out)
|
||||
{
|
||||
@ -156,6 +166,26 @@ static void Shorten(char** s, char *prefix)
|
||||
}
|
||||
}
|
||||
|
||||
int try_snprintf_P(char *s, size_t n, const char *format, ... )
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
int len = vsnprintf_P(NULL, 0, format, args);
|
||||
if (len >= n) {
|
||||
snprintf_P(log_data, sizeof(log_data),
|
||||
PSTR("ERROR: MQTT discovery failed due to too long topic or friendly name. "
|
||||
"Please shorten topic and friendly name. Failed to format(%u/%u):"), len, n);
|
||||
AddLog(LOG_LEVEL_ERROR);
|
||||
va_start(args, format);
|
||||
vsnprintf_P(log_data, sizeof(log_data), format, args);
|
||||
AddLog(LOG_LEVEL_ERROR);
|
||||
} else {
|
||||
va_start(args, format);
|
||||
vsnprintf_P(s, n, format, args);
|
||||
}
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
void HAssAnnounceRelayLight(void)
|
||||
{
|
||||
char stopic[TOPSZ];
|
||||
@ -174,14 +204,16 @@ void HAssAnnounceRelayLight(void)
|
||||
|
||||
// Clear "other" topic first in case the device has been reconfigured from ligth to switch or vice versa
|
||||
snprintf_P(unique_id, sizeof(unique_id), PSTR("%06X_%s_%d"), ESP.getChipId(), (is_topic_light) ? "RL" : "LI", i);
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s/config"), (is_topic_light) ? "switch" : "light", unique_id);
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s/config"),
|
||||
(is_topic_light) ? "switch" : "light", unique_id);
|
||||
MqttPublish(stopic, true);
|
||||
// Clear or Set topic
|
||||
snprintf_P(unique_id, sizeof(unique_id), PSTR("%06X_%s_%d"), ESP.getChipId(), (is_topic_light) ? "LI" : "RL", i);
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s/config"), (is_topic_light) ? "light" : "switch", unique_id);
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s/config"),
|
||||
(is_topic_light) ? "light" : "switch", unique_id);
|
||||
|
||||
if (Settings.flag.hass_discovery && (i <= devices_present)) {
|
||||
char name[33];
|
||||
char name[33+2]; // friendlyname(33) + " " + index
|
||||
char value_template[33];
|
||||
char prefix[TOPSZ];
|
||||
char *command_topic = stemp1;
|
||||
@ -202,27 +234,30 @@ void HAssAnnounceRelayLight(void)
|
||||
Shorten(&command_topic, prefix);
|
||||
Shorten(&state_topic, prefix);
|
||||
Shorten(&availability_topic, prefix);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_RELAY,
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_RELAY,
|
||||
name, command_topic, state_topic, value_template, Settings.state_text[0], Settings.state_text[1], availability_topic);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_DEVICE_INFO_SHORT, mqtt_data,
|
||||
unique_id, ESP.getChipId());
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_TOPIC_PREFIX, mqtt_data, prefix);
|
||||
|
||||
if (is_light) {
|
||||
char *brightness_command_topic = stemp1;
|
||||
|
||||
GetTopic_P(brightness_command_topic, CMND, mqtt_topic, D_CMND_DIMMER);
|
||||
Shorten(&brightness_command_topic, prefix);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_LIGHT_DIMMER, mqtt_data, brightness_command_topic, state_topic);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_LIGHT_DIMMER, mqtt_data, brightness_command_topic, state_topic);
|
||||
|
||||
if (light_subtype >= LST_RGB) {
|
||||
char *rgb_command_topic = stemp1;
|
||||
|
||||
GetTopic_P(rgb_command_topic, CMND, mqtt_topic, D_CMND_COLOR);
|
||||
Shorten(&rgb_command_topic, prefix);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_LIGHT_COLOR, mqtt_data, rgb_command_topic, state_topic);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_LIGHT_COLOR, mqtt_data, rgb_command_topic, state_topic);
|
||||
|
||||
char *effect_command_topic = stemp1;
|
||||
GetTopic_P(effect_command_topic, CMND, mqtt_topic, D_CMND_SCHEME);
|
||||
Shorten(&effect_command_topic, prefix);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_LIGHT_SCHEME, mqtt_data, effect_command_topic, state_topic);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_LIGHT_SCHEME, mqtt_data, effect_command_topic, state_topic);
|
||||
|
||||
}
|
||||
if (LST_RGBW == light_subtype) {
|
||||
@ -230,21 +265,17 @@ void HAssAnnounceRelayLight(void)
|
||||
|
||||
GetTopic_P(white_temp_command_topic, CMND, mqtt_topic, D_CMND_WHITE);
|
||||
Shorten(&white_temp_command_topic, prefix);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_LIGHT_WHITE, mqtt_data, white_temp_command_topic, state_topic);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_LIGHT_WHITE, mqtt_data, white_temp_command_topic, state_topic);
|
||||
}
|
||||
if ((LST_COLDWARM == light_subtype) || (LST_RGBWC == light_subtype)) {
|
||||
char *color_temp_command_topic = stemp1;
|
||||
|
||||
GetTopic_P(color_temp_command_topic, CMND, mqtt_topic, D_CMND_COLORTEMPERATURE);
|
||||
Shorten(&color_temp_command_topic, prefix);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_LIGHT_CT, mqtt_data, color_temp_command_topic, state_topic);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_LIGHT_CT, mqtt_data, color_temp_command_topic, state_topic);
|
||||
}
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_DEVICE_INFO, mqtt_data,
|
||||
unique_id, ESP.getChipId(),
|
||||
Settings.friendlyname[0], ModuleName().c_str(), my_version, my_image);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_TOPIC_PREFIX, mqtt_data, prefix);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
}
|
||||
MqttPublish(stopic, true);
|
||||
}
|
||||
@ -266,7 +297,7 @@ void HAssAnnounceButtonSwitch(uint8_t device, char* topic, uint8_t present, uint
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/binary_sensor/%s/config"), unique_id);
|
||||
|
||||
if (Settings.flag.hass_discovery && present) {
|
||||
char name[33];
|
||||
char name[33+6]; // friendlyname(33) + " " + "BTN" + " " + index
|
||||
char value_template[33];
|
||||
char prefix[TOPSZ];
|
||||
char *state_topic = stemp1;
|
||||
@ -284,16 +315,15 @@ void HAssAnnounceButtonSwitch(uint8_t device, char* topic, uint8_t present, uint
|
||||
FindPrefix(state_topic, availability_topic, prefix);
|
||||
Shorten(&state_topic, prefix);
|
||||
Shorten(&availability_topic, prefix);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_BUTTON_SWITCH,
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_BUTTON_SWITCH,
|
||||
name, state_topic, Settings.state_text[toggle?2:1], availability_topic);
|
||||
if (toggle) snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_BUTTON_SWITCH_TOGGLE, mqtt_data);
|
||||
else snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_BUTTON_SWITCH_ONOFF, mqtt_data, Settings.state_text[0]);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_DEVICE_INFO_SHORT, mqtt_data,
|
||||
unique_id, ESP.getChipId());
|
||||
if (strlen(prefix) > 0 ) try_snprintf_P(mqtt_data-1, sizeof(mqtt_data), HASS_DISCOVER_TOPIC_PREFIX, mqtt_data, prefix);
|
||||
if (toggle) try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_BUTTON_SWITCH_TOGGLE, mqtt_data);
|
||||
else try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_BUTTON_SWITCH_ONOFF, mqtt_data, Settings.state_text[0]);
|
||||
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_DEVICE_INFO, mqtt_data,
|
||||
unique_id, ESP.getChipId(),
|
||||
Settings.friendlyname[0], ModuleName().c_str(), my_version, my_image);
|
||||
if (strlen(prefix) > 0 ) snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_TOPIC_PREFIX, mqtt_data, prefix);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
}
|
||||
MqttPublish(stopic, true);
|
||||
}
|
||||
@ -339,7 +369,7 @@ void HAssAnnounceButtons(void)
|
||||
uint8_t button_present = 0;
|
||||
uint8_t toggle = 1;
|
||||
|
||||
if (!button_index && ((SONOFF_DUAL == Settings.module) || (CH4 == Settings.module))) {
|
||||
if (!button_index && ((SONOFF_DUAL == my_module_type) || (CH4 == my_module_type))) {
|
||||
button_present = 1;
|
||||
} else {
|
||||
if (pin[GPIO_KEY1 + button_index] < 99) {
|
||||
@ -374,7 +404,7 @@ void HAssAnnounceSensor(const char* sensorname, const char* subsensortype)
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/sensor/%s/config"), unique_id);
|
||||
|
||||
if (Settings.flag.hass_discovery) {
|
||||
char name[33];
|
||||
char name[33+42]; // friendlyname(33) + " " + sensorname(20?) + " " + sensortype(20?)
|
||||
char prefix[TOPSZ];
|
||||
char *state_topic = stemp1;
|
||||
char *availability_topic = stemp2;
|
||||
@ -386,39 +416,40 @@ void HAssAnnounceSensor(const char* sensorname, const char* subsensortype)
|
||||
Shorten(&state_topic, prefix);
|
||||
Shorten(&availability_topic, prefix);
|
||||
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_SENSOR,
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR,
|
||||
name, state_topic, availability_topic);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_DEVICE_INFO_SHORT, mqtt_data,
|
||||
unique_id, ESP.getChipId());
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_TOPIC_PREFIX, mqtt_data, prefix);
|
||||
if (!strcmp_P(subsensortype, PSTR(D_JSON_TEMPERATURE))) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_SENSOR_TEMP,
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR_TEMP,
|
||||
mqtt_data, TempUnit(), sensorname);
|
||||
} else if (!strcmp_P(subsensortype, PSTR(D_JSON_HUMIDITY))) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_SENSOR_HUM,
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR_HUM,
|
||||
mqtt_data, sensorname);
|
||||
} else if (!strcmp_P(subsensortype, PSTR(D_JSON_PRESSURE))) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_SENSOR_PRESS,
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR_PRESS,
|
||||
mqtt_data, PressureUnit().c_str(), sensorname);
|
||||
} else if (!strcmp_P(subsensortype, PSTR(D_JSON_TOTAL)) || !strcmp_P(subsensortype, PSTR(D_JSON_TODAY)) || !strcmp_P(subsensortype, PSTR(D_JSON_YESTERDAY))){
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_SENSOR_KWH,
|
||||
} else if (!strcmp_P(subsensortype, PSTR(D_JSON_TOTAL))
|
||||
|| !strcmp_P(subsensortype, PSTR(D_JSON_TODAY))
|
||||
|| !strcmp_P(subsensortype, PSTR(D_JSON_YESTERDAY))){
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR_KWH,
|
||||
mqtt_data, sensorname, subsensortype);
|
||||
} else if (!strcmp_P(subsensortype, PSTR(D_JSON_POWERUSAGE))){
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_SENSOR_WATT,
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR_WATT,
|
||||
mqtt_data, sensorname, subsensortype);
|
||||
} else if (!strcmp_P(subsensortype, PSTR(D_JSON_VOLTAGE))){
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_SENSOR_VOLTAGE,
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR_VOLTAGE,
|
||||
mqtt_data, sensorname, subsensortype);
|
||||
} else if (!strcmp_P(subsensortype, PSTR(D_JSON_CURRENT))){
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_SENSOR_AMPERE,
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR_AMPERE,
|
||||
mqtt_data, sensorname, subsensortype);
|
||||
}
|
||||
else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_SENSOR_ANY,
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR_ANY,
|
||||
mqtt_data, sensorname, subsensortype);
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_DEVICE_INFO, mqtt_data,
|
||||
unique_id, ESP.getChipId(),
|
||||
Settings.friendlyname[0], ModuleName().c_str(), my_version, my_image);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HASS_DISCOVER_TOPIC_PREFIX, mqtt_data, prefix);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
}
|
||||
MqttPublish(stopic, true);
|
||||
}
|
||||
@ -469,6 +500,57 @@ void HAssAnnounceSensors(void)
|
||||
} while (hass_xsns_index != 0);
|
||||
}
|
||||
|
||||
void HAssAnnounceStatusSensor(void)
|
||||
{
|
||||
char stopic[TOPSZ];
|
||||
char stemp1[TOPSZ];
|
||||
char stemp2[TOPSZ];
|
||||
char unique_id[30];
|
||||
|
||||
// Announce sensor
|
||||
mqtt_data[0] = '\0'; // Clear retained message
|
||||
|
||||
// Clear or Set topic
|
||||
snprintf_P(unique_id, sizeof(unique_id), PSTR("%06X_%s"), ESP.getChipId(), "status");
|
||||
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/sensor/%s/config"), unique_id);
|
||||
|
||||
if (Settings.flag.hass_discovery) {
|
||||
char name[33+7]; // friendlyname(33) + " " + "status"
|
||||
char prefix[TOPSZ];
|
||||
char *state_topic = stemp1;
|
||||
char *availability_topic = stemp2;
|
||||
|
||||
snprintf_P(name, sizeof(name), PSTR("%s %s"), Settings.friendlyname[0], "status");
|
||||
GetTopic_P(state_topic, TELE, mqtt_topic, PSTR(D_RSLT_HASS_STATE));
|
||||
GetTopic_P(availability_topic, TELE, mqtt_topic, S_LWT);
|
||||
FindPrefix(state_topic, availability_topic, prefix);
|
||||
Shorten(&state_topic, prefix);
|
||||
Shorten(&availability_topic, prefix);
|
||||
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR,
|
||||
name, state_topic, availability_topic);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_SENSOR_HASS_STATUS,
|
||||
mqtt_data, state_topic);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_DEVICE_INFO, mqtt_data,
|
||||
unique_id, ESP.getChipId(),
|
||||
Settings.friendlyname[0], ModuleName().c_str(), my_version, my_image);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data)-1, HASS_DISCOVER_TOPIC_PREFIX, mqtt_data, prefix);
|
||||
try_snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
}
|
||||
MqttPublish(stopic, true);
|
||||
}
|
||||
|
||||
void HAssPublishStatus(void)
|
||||
{
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data),
|
||||
PSTR("{\"" D_JSON_VERSION "\":\"%s%s\",\"" D_CMND_MODULE "\":\"%s\",\"" D_JSON_RESTARTREASON "\":\"%s\",\""
|
||||
D_JSON_UPTIME "\":\"%s\",\"" D_JSON_BOOTCOUNT "\":%d,\"" D_JSON_SAVECOUNT "\":%d,\""
|
||||
D_CMND_IPADDRESS "\":\"%s\",\"" D_JSON_RSSI "\":\"%d\",\"LoadAvg\":%lu}"),
|
||||
my_version, my_image, ModuleName().c_str(), GetResetReason().c_str(), GetUptime().c_str(), Settings.bootcount,
|
||||
Settings.save_flag, WiFi.localIP().toString().c_str(), WifiGetRssiAsQuality(WiFi.RSSI()), loop_load_avg);
|
||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_HASS_STATE));
|
||||
}
|
||||
|
||||
void HAssDiscovery(void)
|
||||
{
|
||||
// Configure Tasmota for default Home Assistant parameters to keep discovery message as short as possible
|
||||
@ -496,6 +578,9 @@ void HAssDiscovery(void)
|
||||
|
||||
// Send info about sensors
|
||||
HAssAnnounceSensors();
|
||||
|
||||
// Send info about status sensor
|
||||
HAssAnnounceStatusSensor();
|
||||
}
|
||||
}
|
||||
|
||||
@ -525,6 +610,14 @@ bool Xdrv12(uint8_t function)
|
||||
if (!hass_init_step) {
|
||||
HAssDiscovery(); // Scheduled discovery using available resources
|
||||
}
|
||||
} else if (Settings.flag.hass_discovery && Settings.tele_period) {
|
||||
hass_tele_period++;
|
||||
if (hass_tele_period >= Settings.tele_period) {
|
||||
hass_tele_period = 0;
|
||||
|
||||
mqtt_data[0] = '\0';
|
||||
HAssPublishStatus();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -402,7 +402,7 @@ bool Xdrv16(uint8_t function)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (TUYA_DIMMER == Settings.module) {
|
||||
if (TUYA_DIMMER == my_module_type) {
|
||||
switch (function) {
|
||||
case FUNC_MODULE_INIT:
|
||||
result = TuyaModuleSelected();
|
||||
|
@ -173,7 +173,7 @@ bool Xdrv18(uint8_t function)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (ARMTRONIX_DIMMERS == Settings.module) {
|
||||
if (ARMTRONIX_DIMMERS == my_module_type) {
|
||||
switch (function) {
|
||||
case FUNC_MODULE_INIT:
|
||||
result = ArmtronixModuleSelected();
|
||||
|
@ -229,7 +229,7 @@ bool Xdrv19(uint8_t function)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (PS_16_DZ == Settings.module) {
|
||||
if (PS_16_DZ == my_module_type) {
|
||||
switch (function) {
|
||||
case FUNC_MODULE_INIT:
|
||||
result = PS16DZModuleSelected();
|
||||
|
@ -99,15 +99,20 @@ void LcdDisplayOnOff(uint8_t on)
|
||||
|
||||
void LcdCenter(uint8_t row, char* txt)
|
||||
{
|
||||
int offset;
|
||||
int len;
|
||||
char line[Settings.display_cols[0] +2];
|
||||
|
||||
int len = strlen(txt);
|
||||
int offset = 0;
|
||||
if (len >= Settings.display_cols[0]) {
|
||||
len = Settings.display_cols[0];
|
||||
} else {
|
||||
offset = (Settings.display_cols[0] - len) / 2;
|
||||
}
|
||||
memset(line, 0x20, Settings.display_cols[0]);
|
||||
line[Settings.display_cols[0]] = 0;
|
||||
len = strlen(txt);
|
||||
offset = (len < Settings.display_cols[0]) ? offset = (Settings.display_cols[0] - len) / 2 : 0;
|
||||
strlcpy(line +offset, txt, len);
|
||||
for (uint8_t i = 0; i < len; i++) {
|
||||
line[offset +i] = txt[i];
|
||||
}
|
||||
lcd->setCursor(0, row);
|
||||
lcd->print(line);
|
||||
}
|
||||
|
@ -191,7 +191,7 @@ void CseEverySecond(void)
|
||||
void CseDrvInit(void)
|
||||
{
|
||||
if (!energy_flg) {
|
||||
if ((SONOFF_S31 == Settings.module) || (SONOFF_POW_R2 == Settings.module)) { // Sonoff S31 or Sonoff Pow R2
|
||||
if ((3 == pin[GPIO_CSE7766_RX]) && (1 == pin[GPIO_CSE7766_TX])) { // As it uses 8E1 currently only hardware serial is supported
|
||||
baudrate = 4800;
|
||||
serial_config = SERIAL_8E1;
|
||||
energy_flg = XNRG_02;
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#include <TasmotaSerial.h>
|
||||
|
||||
TasmotaSerial *PzemSerial;
|
||||
TasmotaSerial *PzemSerial = NULL;
|
||||
|
||||
#define PZEM_VOLTAGE (uint8_t)0xB0
|
||||
#define RESP_VOLTAGE (uint8_t)0xA0
|
||||
@ -239,7 +239,7 @@ int Xnrg03(uint8_t function)
|
||||
PzemSnsInit();
|
||||
break;
|
||||
case FUNC_EVERY_200_MSECOND:
|
||||
PzemEvery200ms();
|
||||
if (PzemSerial) { PzemEvery200ms(); }
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,7 @@
|
||||
|
||||
#define XNRG_04 4
|
||||
|
||||
#define MCP_BAUDRATE 4800
|
||||
#define MCP_TIMEOUT 4
|
||||
#define MCP_CALIBRATION_TIMEOUT 2
|
||||
|
||||
@ -63,6 +64,11 @@
|
||||
#define MCP_FREQUENCY_GAIN_BASE 0x00AE
|
||||
#define MCP_FREQUENCY_LEN 4
|
||||
|
||||
#define MCP_BUFFER_SIZE 60
|
||||
|
||||
#include <TasmotaSerial.h>
|
||||
TasmotaSerial *McpSerial = NULL;
|
||||
|
||||
typedef struct mcp_cal_registers_type {
|
||||
uint16_t gain_current_rms;
|
||||
uint16_t gain_voltage_rms;
|
||||
@ -86,6 +92,8 @@ typedef struct mcp_cal_registers_type {
|
||||
uint16_t accumulation_interval;
|
||||
} mcp_cal_registers_type;
|
||||
|
||||
char *mcp_buffer = NULL;
|
||||
unsigned long mcp_window = 0;
|
||||
unsigned long mcp_kWhcounter = 0;
|
||||
uint32_t mcp_system_configuration = 0x03000000;
|
||||
uint32_t mcp_active_power;
|
||||
@ -100,6 +108,7 @@ uint8_t mcp_calibration_active = 0;
|
||||
uint8_t mcp_init = 0;
|
||||
uint8_t mcp_timeout = 0;
|
||||
uint8_t mcp_calibrate = 0;
|
||||
uint8_t mcp_byte_counter = 0;
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Olimex tools
|
||||
@ -146,7 +155,7 @@ void McpSend(uint8_t *data)
|
||||
// AddLogBuffer(LOG_LEVEL_DEBUG_MORE, data, data[1]);
|
||||
|
||||
for (uint8_t i = 0; i < data[1]; i++) {
|
||||
Serial.write(data[i]);
|
||||
McpSerial->write(data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -162,7 +171,7 @@ void McpGetAddress(void)
|
||||
void McpAddressReceive(void)
|
||||
{
|
||||
// 06 05 004D 58
|
||||
mcp_address = serial_in_buffer[3];
|
||||
mcp_address = mcp_buffer[3];
|
||||
}
|
||||
|
||||
/********************************************************************************************/
|
||||
@ -183,26 +192,26 @@ void McpParseCalibration(void)
|
||||
mcp_cal_registers_type cal_registers;
|
||||
|
||||
// 06 37 C882 B6AD 0781 9273 06000000 00000000 00000000 0000 D3FF 0300 00000003 9204 120C1300 204E0000 9808 E0AB0000 D9940000 0200 24
|
||||
cal_registers.gain_current_rms = McpExtractInt(serial_in_buffer, 2, 2);
|
||||
cal_registers.gain_voltage_rms = McpExtractInt(serial_in_buffer, 4, 2);
|
||||
cal_registers.gain_active_power = McpExtractInt(serial_in_buffer, 6, 2);
|
||||
cal_registers.gain_reactive_power = McpExtractInt(serial_in_buffer, 8, 2);
|
||||
cal_registers.offset_current_rms = McpExtractInt(serial_in_buffer, 10, 4);
|
||||
cal_registers.offset_active_power = McpExtractInt(serial_in_buffer, 14, 4);
|
||||
cal_registers.offset_reactive_power = McpExtractInt(serial_in_buffer, 18, 4);
|
||||
cal_registers.dc_offset_current = McpExtractInt(serial_in_buffer, 22, 2);
|
||||
cal_registers.phase_compensation = McpExtractInt(serial_in_buffer, 24, 2);
|
||||
cal_registers.apparent_power_divisor = McpExtractInt(serial_in_buffer, 26, 2);
|
||||
cal_registers.gain_current_rms = McpExtractInt(mcp_buffer, 2, 2);
|
||||
cal_registers.gain_voltage_rms = McpExtractInt(mcp_buffer, 4, 2);
|
||||
cal_registers.gain_active_power = McpExtractInt(mcp_buffer, 6, 2);
|
||||
cal_registers.gain_reactive_power = McpExtractInt(mcp_buffer, 8, 2);
|
||||
cal_registers.offset_current_rms = McpExtractInt(mcp_buffer, 10, 4);
|
||||
cal_registers.offset_active_power = McpExtractInt(mcp_buffer, 14, 4);
|
||||
cal_registers.offset_reactive_power = McpExtractInt(mcp_buffer, 18, 4);
|
||||
cal_registers.dc_offset_current = McpExtractInt(mcp_buffer, 22, 2);
|
||||
cal_registers.phase_compensation = McpExtractInt(mcp_buffer, 24, 2);
|
||||
cal_registers.apparent_power_divisor = McpExtractInt(mcp_buffer, 26, 2);
|
||||
|
||||
cal_registers.system_configuration = McpExtractInt(serial_in_buffer, 28, 4);
|
||||
cal_registers.dio_configuration = McpExtractInt(serial_in_buffer, 32, 2);
|
||||
cal_registers.range = McpExtractInt(serial_in_buffer, 34, 4);
|
||||
cal_registers.system_configuration = McpExtractInt(mcp_buffer, 28, 4);
|
||||
cal_registers.dio_configuration = McpExtractInt(mcp_buffer, 32, 2);
|
||||
cal_registers.range = McpExtractInt(mcp_buffer, 34, 4);
|
||||
|
||||
cal_registers.calibration_current = McpExtractInt(serial_in_buffer, 38, 4);
|
||||
cal_registers.calibration_voltage = McpExtractInt(serial_in_buffer, 42, 2);
|
||||
cal_registers.calibration_active_power = McpExtractInt(serial_in_buffer, 44, 4);
|
||||
cal_registers.calibration_reactive_power = McpExtractInt(serial_in_buffer, 48, 4);
|
||||
cal_registers.accumulation_interval = McpExtractInt(serial_in_buffer, 52, 2);
|
||||
cal_registers.calibration_current = McpExtractInt(mcp_buffer, 38, 4);
|
||||
cal_registers.calibration_voltage = McpExtractInt(mcp_buffer, 42, 2);
|
||||
cal_registers.calibration_active_power = McpExtractInt(mcp_buffer, 44, 4);
|
||||
cal_registers.calibration_reactive_power = McpExtractInt(mcp_buffer, 48, 4);
|
||||
cal_registers.accumulation_interval = McpExtractInt(mcp_buffer, 52, 2);
|
||||
|
||||
if (mcp_calibrate & MCP_CALIBRATE_POWER) {
|
||||
cal_registers.calibration_active_power = Settings.energy_power_calibration;
|
||||
@ -373,8 +382,8 @@ void McpGetFrequency(void)
|
||||
void McpParseFrequency(void)
|
||||
{
|
||||
// 06 07 C350 8000 A0
|
||||
uint16_t line_frequency_ref = serial_in_buffer[2] * 256 + serial_in_buffer[3];
|
||||
uint16_t gain_line_frequency = serial_in_buffer[4] * 256 + serial_in_buffer[5];
|
||||
uint16_t line_frequency_ref = mcp_buffer[2] * 256 + mcp_buffer[3];
|
||||
uint16_t gain_line_frequency = mcp_buffer[4] * 256 + mcp_buffer[5];
|
||||
|
||||
if (mcp_calibrate & MCP_CALIBRATE_FREQUENCY) {
|
||||
line_frequency_ref = Settings.energy_frequency_calibration;
|
||||
@ -438,12 +447,12 @@ void McpParseData(void)
|
||||
// 06 19 CE 18 00 00 F2 08 3A 38 00 00 66 00 00 00 93 38 00 00 36 7F 9A C6 B7
|
||||
// Ak Ln Current---- Volt- ActivePower ReActivePow ApparentPow Factr Frequ Ck
|
||||
|
||||
mcp_current_rms = McpExtractInt(serial_in_buffer, 2, 4);
|
||||
mcp_voltage_rms = McpExtractInt(serial_in_buffer, 6, 2);
|
||||
mcp_active_power = McpExtractInt(serial_in_buffer, 8, 4);
|
||||
// mcp_reactive_power = McpExtractInt(serial_in_buffer, 12, 4);
|
||||
// mcp_power_factor = McpExtractInt(serial_in_buffer, 20, 2);
|
||||
mcp_line_frequency = McpExtractInt(serial_in_buffer, 22, 2);
|
||||
mcp_current_rms = McpExtractInt(mcp_buffer, 2, 4);
|
||||
mcp_voltage_rms = McpExtractInt(mcp_buffer, 6, 2);
|
||||
mcp_active_power = McpExtractInt(mcp_buffer, 8, 4);
|
||||
// mcp_reactive_power = McpExtractInt(mcp_buffer, 12, 4);
|
||||
// mcp_power_factor = McpExtractInt(mcp_buffer, 20, 2);
|
||||
mcp_line_frequency = McpExtractInt(mcp_buffer, 22, 2);
|
||||
|
||||
if (energy_power_on) { // Powered on
|
||||
energy_frequency = (float)mcp_line_frequency / 1000;
|
||||
@ -464,49 +473,53 @@ void McpParseData(void)
|
||||
|
||||
/********************************************************************************************/
|
||||
|
||||
bool McpSerialInput(void)
|
||||
void McpSerialInput(void)
|
||||
{
|
||||
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
|
||||
unsigned long start = millis();
|
||||
while (millis() - start < 20) {
|
||||
while ((McpSerial->available()) && (mcp_byte_counter < MCP_BUFFER_SIZE)) {
|
||||
yield();
|
||||
if (Serial.available()) {
|
||||
serial_in_buffer[serial_in_byte_counter++] = Serial.read();
|
||||
start = millis();
|
||||
}
|
||||
mcp_buffer[mcp_byte_counter++] = McpSerial->read();
|
||||
mcp_window = millis();
|
||||
}
|
||||
|
||||
AddLogSerial(LOG_LEVEL_DEBUG_MORE);
|
||||
// Ignore until non received after 2 chars (= 12 bits/char) time
|
||||
if ((mcp_byte_counter) && (millis() - mcp_window > (24000 / MCP_BAUDRATE) +1)) {
|
||||
AddLogBuffer(LOG_LEVEL_DEBUG_MORE, (uint8_t*)mcp_buffer, mcp_byte_counter);
|
||||
|
||||
if (1 == serial_in_byte_counter) {
|
||||
if (MCP_ERROR_CRC == serial_in_buffer[0]) {
|
||||
// AddLog_P(LOG_LEVEL_DEBUG, PSTR("MCP: Send " D_CHECKSUM_FAILURE));
|
||||
mcp_timeout = 0;
|
||||
if (MCP_BUFFER_SIZE == mcp_byte_counter) {
|
||||
// AddLog_P(LOG_LEVEL_DEBUG, PSTR("MCP: Overflow"));
|
||||
}
|
||||
else if (MCP_ERROR_NAK == serial_in_buffer[0]) {
|
||||
// AddLog_P(LOG_LEVEL_DEBUG, PSTR("MCP: NAck"));
|
||||
mcp_timeout = 0;
|
||||
}
|
||||
}
|
||||
else if (MCP_ACK_FRAME == serial_in_buffer[0]) {
|
||||
if (serial_in_byte_counter == serial_in_buffer[1]) {
|
||||
|
||||
if (McpChecksum((uint8_t *)serial_in_buffer) != serial_in_buffer[serial_in_byte_counter -1]) {
|
||||
AddLog_P(LOG_LEVEL_DEBUG, PSTR("MCP: " D_CHECKSUM_FAILURE));
|
||||
} else {
|
||||
if (5 == serial_in_buffer[1]) { McpAddressReceive(); }
|
||||
if (25 == serial_in_buffer[1]) { McpParseData(); }
|
||||
if (MCP_CALIBRATION_LEN + 3 == serial_in_buffer[1]) { McpParseCalibration(); }
|
||||
if (MCP_FREQUENCY_LEN + 3 == serial_in_buffer[1]) { McpParseFrequency(); }
|
||||
else if (1 == mcp_byte_counter) {
|
||||
if (MCP_ERROR_CRC == mcp_buffer[0]) {
|
||||
// AddLog_P(LOG_LEVEL_DEBUG, PSTR("MCP: Send " D_CHECKSUM_FAILURE));
|
||||
mcp_timeout = 0;
|
||||
}
|
||||
else if (MCP_ERROR_NAK == mcp_buffer[0]) {
|
||||
// AddLog_P(LOG_LEVEL_DEBUG, PSTR("MCP: NAck"));
|
||||
mcp_timeout = 0;
|
||||
}
|
||||
|
||||
}
|
||||
mcp_timeout = 0;
|
||||
else if (MCP_ACK_FRAME == mcp_buffer[0]) {
|
||||
if (mcp_byte_counter == mcp_buffer[1]) {
|
||||
|
||||
if (McpChecksum((uint8_t *)mcp_buffer) != mcp_buffer[mcp_byte_counter -1]) {
|
||||
AddLog_P(LOG_LEVEL_DEBUG, PSTR("MCP: " D_CHECKSUM_FAILURE));
|
||||
} else {
|
||||
if (5 == mcp_buffer[1]) { McpAddressReceive(); }
|
||||
if (25 == mcp_buffer[1]) { McpParseData(); }
|
||||
if (MCP_CALIBRATION_LEN + 3 == mcp_buffer[1]) { McpParseCalibration(); }
|
||||
if (MCP_FREQUENCY_LEN + 3 == mcp_buffer[1]) { McpParseFrequency(); }
|
||||
}
|
||||
|
||||
}
|
||||
mcp_timeout = 0;
|
||||
}
|
||||
else if (MCP_SINGLE_WIRE == mcp_buffer[0]) {
|
||||
mcp_timeout = 0;
|
||||
}
|
||||
|
||||
mcp_byte_counter = 0;
|
||||
McpSerial->flush();
|
||||
}
|
||||
else if (MCP_SINGLE_WIRE == serial_in_buffer[0]) {
|
||||
mcp_timeout = 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/********************************************************************************************/
|
||||
@ -543,17 +556,31 @@ void McpEverySecond(void)
|
||||
|
||||
void McpSnsInit(void)
|
||||
{
|
||||
SetSeriallog(LOG_LEVEL_NONE); // Free serial interface from logging interference
|
||||
digitalWrite(15, 1); // GPIO15 - MCP enable
|
||||
// Software serial init needs to be done here as earlier (serial) interrupts may lead to Exceptions
|
||||
McpSerial = new TasmotaSerial(pin[GPIO_MCP39F5_RX], pin[GPIO_MCP39F5_TX], 1);
|
||||
if (McpSerial->begin(MCP_BAUDRATE)) {
|
||||
if (McpSerial->hardwareSerial()) {
|
||||
ClaimSerial();
|
||||
mcp_buffer = serial_in_buffer; // Use idle serial buffer to save RAM
|
||||
} else {
|
||||
mcp_buffer = (char*)(malloc(MCP_BUFFER_SIZE));
|
||||
}
|
||||
if (pin[GPIO_MCP39F5_RST] < 99) {
|
||||
digitalWrite(pin[GPIO_MCP39F5_RST], 1); // MCP enable
|
||||
}
|
||||
} else {
|
||||
energy_flg = ENERGY_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
void McpDrvInit(void)
|
||||
{
|
||||
if (!energy_flg) {
|
||||
if (SHELLY2 == Settings.module) {
|
||||
pinMode(15, OUTPUT);
|
||||
digitalWrite(15, 0); // GPIO15 - MCP disable - Reset Delta Sigma ADC's
|
||||
baudrate = 4800;
|
||||
if ((pin[GPIO_MCP39F5_RX] < 99) && (pin[GPIO_MCP39F5_TX] < 99)) {
|
||||
if (pin[GPIO_MCP39F5_RST] < 99) {
|
||||
pinMode(pin[GPIO_MCP39F5_RST], OUTPUT);
|
||||
digitalWrite(pin[GPIO_MCP39F5_RST], 0); // MCP disable - Reset Delta Sigma ADC's
|
||||
}
|
||||
mcp_calibrate = 0;
|
||||
mcp_timeout = 2; // Initial wait
|
||||
mcp_init = 2; // Initial setup steps
|
||||
@ -628,15 +655,15 @@ int Xnrg04(uint8_t function)
|
||||
case FUNC_INIT:
|
||||
McpSnsInit();
|
||||
break;
|
||||
case FUNC_LOOP:
|
||||
if (McpSerial) { McpSerialInput(); }
|
||||
break;
|
||||
case FUNC_EVERY_SECOND:
|
||||
McpEverySecond();
|
||||
if (McpSerial) { McpEverySecond(); }
|
||||
break;
|
||||
case FUNC_COMMAND:
|
||||
result = McpCommand();
|
||||
break;
|
||||
case FUNC_SERIAL:
|
||||
result = McpSerialInput();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
@ -158,7 +158,7 @@ bool Xsns04(uint8_t function)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (SONOFF_SC == Settings.module) {
|
||||
if (SONOFF_SC == my_module_type) {
|
||||
switch (function) {
|
||||
case FUNC_INIT:
|
||||
SonoffScInit();
|
||||
|
@ -119,7 +119,8 @@ CONFIG REGISTER
|
||||
uint8_t ads1115_type = 0;
|
||||
uint8_t ads1115_address;
|
||||
uint8_t ads1115_addresses[] = { ADS1115_ADDRESS_ADDR_GND, ADS1115_ADDRESS_ADDR_VDD, ADS1115_ADDRESS_ADDR_SDA, ADS1115_ADDRESS_ADDR_SCL };
|
||||
|
||||
uint8_t ads1115_found[] = {false,false,false,false};
|
||||
int16_t ads1115_values[4];
|
||||
//Ads1115StartComparator(channel, ADS1115_REG_CONFIG_MODE_SINGLE);
|
||||
//Ads1115StartComparator(channel, ADS1115_REG_CONFIG_MODE_CONTIN);
|
||||
void Ads1115StartComparator(uint8_t channel, uint16_t mode)
|
||||
@ -160,52 +161,84 @@ int16_t Ads1115GetConversion(uint8_t channel)
|
||||
void Ads1115Detect(void)
|
||||
{
|
||||
uint16_t buffer;
|
||||
|
||||
if (ads1115_type) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (uint8_t i = 0; i < sizeof(ads1115_addresses); i++) {
|
||||
ads1115_address = ads1115_addresses[i];
|
||||
if (I2cValidRead16(&buffer, ads1115_address, ADS1115_REG_POINTER_CONVERT)) {
|
||||
Ads1115StartComparator(i, ADS1115_REG_CONFIG_MODE_CONTIN);
|
||||
ads1115_type = 1;
|
||||
snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, "ADS1115", ads1115_address);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
break;
|
||||
if (!ads1115_found[i]) {
|
||||
ads1115_address = ads1115_addresses[i];
|
||||
if (I2cValidRead16(&buffer, ads1115_address, ADS1115_REG_POINTER_CONVERT) &&
|
||||
I2cValidRead16(&buffer, ads1115_address, ADS1115_REG_POINTER_CONFIG)) {
|
||||
Ads1115StartComparator(i, ADS1115_REG_CONFIG_MODE_CONTIN);
|
||||
ads1115_type = 1;
|
||||
ads1115_found[i] = 1;
|
||||
snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, "ADS1115", ads1115_address);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Ads1115GetValues(uint8_t address)
|
||||
{
|
||||
uint8_t old_address = ads1115_address;
|
||||
ads1115_address = address;
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
ads1115_values[i] = Ads1115GetConversion(i);
|
||||
//snprintf_P(log_data, sizeof(log_data), "Logging ADS1115 %02x (%i) = %i", address, i, ads1115_values[i] );
|
||||
//AddLog(LOG_LEVEL_INFO);
|
||||
}
|
||||
ads1115_address = old_address;
|
||||
}
|
||||
|
||||
void Ads1115toJSON(char *comma_j)
|
||||
{
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s{"), mqtt_data,comma_j);
|
||||
char *comma = (char*)"";
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"A%d\":%d"), mqtt_data, comma, i, ads1115_values[i]);
|
||||
comma = (char*)",";
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
}
|
||||
|
||||
void Ads1115toString(uint8_t address)
|
||||
{
|
||||
char label[15];
|
||||
snprintf_P(label, sizeof(label), "ADS1115(%02x)", address);
|
||||
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_ANALOG, mqtt_data, label, i, ads1115_values[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void Ads1115Show(bool json)
|
||||
{
|
||||
if (ads1115_type) {
|
||||
char stemp[10];
|
||||
if (!ads1115_type) { return; }
|
||||
|
||||
uint8_t dsxflg = 0;
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
int16_t adc_value = Ads1115GetConversion(i);
|
||||
if (json) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"ADS1115\":["), mqtt_data);
|
||||
}
|
||||
|
||||
char *comma = (char*)"";
|
||||
|
||||
for (uint8_t t = 0; t < sizeof(ads1115_addresses); t++) {
|
||||
//snprintf_P(log_data, sizeof(log_data), "Logging ADS1115 %02x", ads1115_addresses[t]);
|
||||
//AddLog(LOG_LEVEL_INFO);
|
||||
if (ads1115_found[t]) {
|
||||
Ads1115GetValues(ads1115_addresses[t]);
|
||||
if (json) {
|
||||
if (!dsxflg ) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"ADS1115\":{"), mqtt_data);
|
||||
stemp[0] = '\0';
|
||||
}
|
||||
dsxflg++;
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"A%d\":%d"), mqtt_data, stemp, i, adc_value);
|
||||
strlcpy(stemp, ",", sizeof(stemp));
|
||||
Ads1115toJSON(comma);
|
||||
comma = (char*)",";
|
||||
}
|
||||
#ifdef USE_WEBSERVER
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_ANALOG, mqtt_data, "ADS1115", i, adc_value);
|
||||
else {
|
||||
Ads1115toString(ads1115_addresses[t]);
|
||||
}
|
||||
#endif // USE_WEBSERVER
|
||||
}
|
||||
}
|
||||
if (json) {
|
||||
if (dsxflg) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (json) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s]"), mqtt_data);
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
|
@ -39,7 +39,10 @@ enum MhzFilterOptions {MHZ19_FILTER_OFF, MHZ19_FILTER_OFF_ALLSAMPLES, MHZ19_FILT
|
||||
/*********************************************************************************************\
|
||||
* Source: http://www.winsen-sensor.com/d/files/infrared-gas-sensor/mh-z19b-co2-ver1_0.pdf
|
||||
*
|
||||
* Automatic Baseline Correction (ABC logic function)
|
||||
* Automatic Baseline Correction (ABC logic function) is enabled by default but may be disabled with command
|
||||
* Sensor15 0
|
||||
* and enabled again with command
|
||||
* Sensor15 1
|
||||
*
|
||||
* ABC logic function refers to that sensor itself do zero point judgment and automatic calibration procedure
|
||||
* intelligently after a continuous operation period. The automatic calibration cycle is every 24 hours after powered on.
|
||||
@ -52,10 +55,6 @@ enum MhzFilterOptions {MHZ19_FILTER_OFF, MHZ19_FILTER_OFF_ALLSAMPLES, MHZ19_FILT
|
||||
* Please do zero calibration timely, such as manual or commend calibration.
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define MHZ19_ABC_ENABLE 1 // Automatic Baseline Correction (0 = off, 1 = on (default))
|
||||
|
||||
/*********************************************************************************************/
|
||||
|
||||
#include <TasmotaSerial.h>
|
||||
|
||||
#ifndef CO2_LOW
|
||||
@ -72,6 +71,9 @@ TasmotaSerial *MhzSerial;
|
||||
|
||||
const char kMhzModels[] PROGMEM = "|B";
|
||||
|
||||
const char ABC_ENABLED[] PROGMEM = "ABC is Enabled";
|
||||
const char ABC_DISABLED[] PROGMEM = "ABC is Enabled";
|
||||
|
||||
enum MhzCommands { MHZ_CMND_READPPM, MHZ_CMND_ABCENABLE, MHZ_CMND_ABCDISABLE, MHZ_CMND_ZEROPOINT, MHZ_CMND_RESET, MHZ_CMND_RANGE_1000, MHZ_CMND_RANGE_2000, MHZ_CMND_RANGE_3000, MHZ_CMND_RANGE_5000 };
|
||||
const uint8_t kMhzCommands[][4] PROGMEM = {
|
||||
// 2 3 6 7
|
||||
@ -88,7 +90,6 @@ const uint8_t kMhzCommands[][4] PROGMEM = {
|
||||
uint8_t mhz_type = 1;
|
||||
uint16_t mhz_last_ppm = 0;
|
||||
uint8_t mhz_filter = MHZ19_FILTER_OPTION;
|
||||
bool mhz_abc_enable = MHZ19_ABC_ENABLE;
|
||||
bool mhz_abc_must_apply = false;
|
||||
|
||||
float mhz_temperature = 0;
|
||||
@ -218,7 +219,7 @@ void MhzEverySecond(void)
|
||||
|
||||
uint16_t u = (mhz_response[6] << 8) | mhz_response[7];
|
||||
if (15000 == u) { // During (and only ever at) sensor boot, 'u' is reported as 15000
|
||||
if (!mhz_abc_enable) {
|
||||
if (Settings.SensorBits1.mhz19b_abc_disable) {
|
||||
// After bootup of the sensor the ABC will be enabled.
|
||||
// Thus only actively disable after bootup.
|
||||
mhz_abc_must_apply = true;
|
||||
@ -235,7 +236,7 @@ void MhzEverySecond(void)
|
||||
if (0 == s || 64 == s) { // Reading is stable.
|
||||
if (mhz_abc_must_apply) {
|
||||
mhz_abc_must_apply = false;
|
||||
if (mhz_abc_enable) {
|
||||
if (!Settings.SensorBits1.mhz19b_abc_disable) {
|
||||
MhzSendCmd(MHZ_CMND_ABCENABLE);
|
||||
} else {
|
||||
MhzSendCmd(MHZ_CMND_ABCDISABLE);
|
||||
@ -252,8 +253,8 @@ void MhzEverySecond(void)
|
||||
/*********************************************************************************************\
|
||||
* Command Sensor15
|
||||
*
|
||||
* 0 - (Not implemented) ABC Off
|
||||
* 1 - (Not implemented) ABC On
|
||||
* 0 - ABC Off
|
||||
* 1 - ABC On (Default)
|
||||
* 2 - Manual start = ABC Off
|
||||
* 3 - (Not implemented) Optional filter settings
|
||||
* 9 - Reset
|
||||
@ -273,6 +274,16 @@ bool MhzCommandSensor(void)
|
||||
bool serviced = true;
|
||||
|
||||
switch (XdrvMailbox.payload) {
|
||||
case 0:
|
||||
Settings.SensorBits1.mhz19b_abc_disable = true;
|
||||
MhzSendCmd(MHZ_CMND_ABCDISABLE);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_DISABLED);
|
||||
break;
|
||||
case 1:
|
||||
Settings.SensorBits1.mhz19b_abc_disable = false;
|
||||
MhzSendCmd(MHZ_CMND_ABCENABLE);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_ENABLED);
|
||||
break;
|
||||
case 2:
|
||||
MhzSendCmd(MHZ_CMND_ZEROPOINT);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_ZERO_POINT_CALIBRATION);
|
||||
@ -298,7 +309,11 @@ bool MhzCommandSensor(void)
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RANGE_5000);
|
||||
break;
|
||||
default:
|
||||
serviced = false;
|
||||
if (!Settings.SensorBits1.mhz19b_abc_disable) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_ENABLED);
|
||||
} else {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_DISABLED);
|
||||
}
|
||||
}
|
||||
|
||||
return serviced;
|
||||
@ -330,7 +345,10 @@ void MhzShow(bool json)
|
||||
if (json) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"%s\":{\"" D_JSON_MODEL "\":\"%s\",\"" D_JSON_CO2 "\":%d,\"" D_JSON_TEMPERATURE "\":%s}"), mqtt_data, types, model, mhz_last_ppm, temperature);
|
||||
#ifdef USE_DOMOTICZ
|
||||
if (0 == tele_period) DomoticzSensor(DZ_AIRQUALITY, mhz_last_ppm);
|
||||
if (0 == tele_period) {
|
||||
DomoticzSensor(DZ_AIRQUALITY, mhz_last_ppm);
|
||||
DomoticzSensor(DZ_TEMP, temperature);
|
||||
}
|
||||
#endif // USE_DOMOTICZ
|
||||
#ifdef USE_WEBSERVER
|
||||
} else {
|
||||
|
@ -64,12 +64,14 @@ bool Tsl2561Read(void)
|
||||
void Tsl2561Detect(void)
|
||||
{
|
||||
if (tsl2561_type) { return; }
|
||||
uint8_t id;
|
||||
|
||||
if (I2cDevice(0x29) || I2cDevice(0x39) || I2cDevice(0x49)) {
|
||||
Tsl.begin();
|
||||
if (!Tsl.id(id)) return;
|
||||
if (Tsl.on()) {
|
||||
tsl2561_type = 1;
|
||||
snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, tsl2561_types, Tsl.address());
|
||||
snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, tsl2561_types, Tsl.address(), id);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
}
|
||||
}
|
||||
|
615
sonoff/xsns_40_pn532.ino
Normal file
615
sonoff/xsns_40_pn532.ino
Normal file
@ -0,0 +1,615 @@
|
||||
/*
|
||||
xsns_40_pn532.ino - Support for PN532 (HSU) NFC Tag Reader
|
||||
|
||||
Copyright (C) 2019 Andre Thomas and 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_PN532_HSU
|
||||
|
||||
#define XSNS_40 40
|
||||
|
||||
#include <TasmotaSerial.h>
|
||||
|
||||
TasmotaSerial *PN532_Serial;
|
||||
|
||||
#define PN532_INVALID_ACK -1
|
||||
#define PN532_TIMEOUT -2
|
||||
#define PN532_INVALID_FRAME -3
|
||||
#define PN532_NO_SPACE -4
|
||||
|
||||
#define PN532_PREAMBLE 0x00
|
||||
#define PN532_STARTCODE1 0x00
|
||||
#define PN532_STARTCODE2 0xFF
|
||||
#define PN532_POSTAMBLE 0x00
|
||||
|
||||
#define PN532_HOSTTOPN532 0xD4
|
||||
#define PN532_PN532TOHOST 0xD5
|
||||
|
||||
#define PN532_ACK_WAIT_TIME 0x0A
|
||||
|
||||
#define PN532_COMMAND_GETFIRMWAREVERSION 0x02
|
||||
#define PN532_COMMAND_SAMCONFIGURATION 0x14
|
||||
#define PN532_COMMAND_RFCONFIGURATION 0x32
|
||||
#define PN532_COMMAND_INDATAEXCHANGE 0x40
|
||||
#define PN532_COMMAND_INLISTPASSIVETARGET 0x4A
|
||||
|
||||
#define PN532_MIFARE_ISO14443A 0x00
|
||||
#define MIFARE_CMD_READ 0x30
|
||||
#define MIFARE_CMD_AUTH_A 0x60
|
||||
#define MIFARE_CMD_AUTH_B 0x61
|
||||
#define MIFARE_CMD_WRITE 0xA0
|
||||
|
||||
uint8_t pn532_model = 0; // Used to maintain detection flag
|
||||
uint8_t pn532_command = 0; // Used to carry command code between functions
|
||||
uint8_t pn532_scantimer = 0; // Used to prevent multiple successful reads within 2 second window
|
||||
|
||||
uint8_t pn532_packetbuffer[64]; // Global buffer used to store packet
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
uint8_t pn532_function = 0;
|
||||
uint8_t pn532_newdata[16];
|
||||
uint8_t pn532_newdata_len = 0;
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
void PN532_Init(void)
|
||||
{
|
||||
if ((pin[GPIO_PN532_RXD] < 99) && (pin[GPIO_PN532_TXD] < 99)) {
|
||||
PN532_Serial = new TasmotaSerial(pin[GPIO_PN532_RXD], pin[GPIO_PN532_TXD], 1);
|
||||
if (PN532_Serial->begin(115200)) {
|
||||
if (PN532_Serial->hardwareSerial()) { ClaimSerial(); }
|
||||
PN532_wakeup();
|
||||
uint32_t ver = PN532_getFirmwareVersion();
|
||||
if (ver) {
|
||||
PN532_setPassiveActivationRetries(0xFF);
|
||||
PN532_SAMConfig();
|
||||
pn532_model = 1;
|
||||
snprintf_P(log_data, sizeof(log_data),"NFC: PN532 NFC Reader detected (V%u.%u)",(ver>>16) & 0xFF, (ver>>8) & 0xFF);
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int8_t PN532_receive(uint8_t *buf, int len, uint16_t timeout)
|
||||
{
|
||||
int read_bytes = 0;
|
||||
int ret;
|
||||
unsigned long start_millis;
|
||||
while (read_bytes < len) {
|
||||
start_millis = millis();
|
||||
do {
|
||||
ret = PN532_Serial->read();
|
||||
if (ret >= 0) {
|
||||
break;
|
||||
}
|
||||
} while((timeout == 0) || ((millis()- start_millis ) < timeout));
|
||||
|
||||
if (ret < 0) {
|
||||
if (read_bytes) {
|
||||
return read_bytes;
|
||||
} else {
|
||||
return PN532_TIMEOUT;
|
||||
}
|
||||
}
|
||||
buf[read_bytes] = (uint8_t)ret;
|
||||
read_bytes++;
|
||||
}
|
||||
return read_bytes;
|
||||
}
|
||||
|
||||
int8_t PN532_readAckFrame(void)
|
||||
{
|
||||
const uint8_t PN532_ACK[] = {0, 0, 0xFF, 0, 0xFF, 0};
|
||||
uint8_t ackBuf[sizeof(PN532_ACK)];
|
||||
|
||||
if (PN532_receive(ackBuf, sizeof(PN532_ACK), PN532_ACK_WAIT_TIME) <= 0) {
|
||||
return PN532_TIMEOUT;
|
||||
}
|
||||
|
||||
if (memcmp(&ackBuf, &PN532_ACK, sizeof(PN532_ACK))) {
|
||||
return PN532_INVALID_ACK;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t PN532_writeCommand(const uint8_t *header, uint8_t hlen, const uint8_t *body = 0, uint8_t blen = 0)
|
||||
{
|
||||
// Clear the serial buffer just in case
|
||||
PN532_Serial->flush();
|
||||
|
||||
pn532_command = header[0];
|
||||
PN532_Serial->write((uint8_t)PN532_PREAMBLE);
|
||||
PN532_Serial->write((uint8_t)PN532_STARTCODE1);
|
||||
PN532_Serial->write(PN532_STARTCODE2);
|
||||
|
||||
uint8_t length = hlen + blen + 1; // length of data field: TFI + DATA
|
||||
PN532_Serial->write(length);
|
||||
PN532_Serial->write(~length + 1); // checksum of length
|
||||
|
||||
PN532_Serial->write(PN532_HOSTTOPN532);
|
||||
uint8_t sum = PN532_HOSTTOPN532; // sum of TFI + DATA
|
||||
|
||||
PN532_Serial->write(header, hlen);
|
||||
for (uint8_t i = 0; i < hlen; i++) {
|
||||
sum += header[i];
|
||||
}
|
||||
|
||||
PN532_Serial->write(body, blen);
|
||||
for (uint8_t i = 0; i < blen; i++) {
|
||||
sum += body[i];
|
||||
}
|
||||
|
||||
uint8_t checksum = ~sum + 1; // checksum of TFI + DATA
|
||||
PN532_Serial->write(checksum);
|
||||
PN532_Serial->write((uint8_t)PN532_POSTAMBLE);
|
||||
|
||||
return PN532_readAckFrame();
|
||||
}
|
||||
|
||||
int16_t PN532_readResponse(uint8_t buf[], uint8_t len, uint16_t timeout = 50)
|
||||
{
|
||||
uint8_t tmp[3];
|
||||
|
||||
// Read preamble and start code
|
||||
if (PN532_receive(tmp, 3, timeout)<=0) {
|
||||
return PN532_TIMEOUT;
|
||||
}
|
||||
if (0 != tmp[0] || 0!= tmp[1] || 0xFF != tmp[2]) {
|
||||
return PN532_INVALID_FRAME;
|
||||
}
|
||||
|
||||
// Get length of data to be received
|
||||
uint8_t length[2];
|
||||
if (PN532_receive(length, 2, timeout) <= 0) {
|
||||
return PN532_TIMEOUT;
|
||||
}
|
||||
// Validate that frame is valid
|
||||
if (0 != (uint8_t)(length[0] + length[1])) {
|
||||
return PN532_INVALID_FRAME;
|
||||
}
|
||||
length[0] -= 2;
|
||||
if (length[0] > len) { // If this happens, then pn532_packetbuffer is not large enough
|
||||
return PN532_NO_SPACE;
|
||||
}
|
||||
|
||||
// Get the command byte
|
||||
uint8_t cmd = pn532_command + 1;
|
||||
if (PN532_receive(tmp, 2, timeout) <= 0) { // Time out while receiving
|
||||
return PN532_TIMEOUT;
|
||||
}
|
||||
if (PN532_PN532TOHOST != tmp[0] || cmd != tmp[1]) { // Invalid frame received
|
||||
return PN532_INVALID_FRAME;
|
||||
}
|
||||
|
||||
if (PN532_receive(buf, length[0], timeout) != length[0]) { // Timed out
|
||||
return PN532_TIMEOUT;
|
||||
}
|
||||
|
||||
uint8_t sum = PN532_PN532TOHOST + cmd;
|
||||
for (uint8_t i=0; i<length[0]; i++) {
|
||||
sum += buf[i];
|
||||
}
|
||||
|
||||
// Checksum & postamble
|
||||
if (PN532_receive(tmp, 2, timeout) <= 0) {
|
||||
return PN532_TIMEOUT;
|
||||
}
|
||||
if (0 != (uint8_t)(sum + tmp[0]) || 0 != tmp[1]) { // Checksum fail, so frame must be invalid
|
||||
return PN532_INVALID_FRAME;
|
||||
}
|
||||
|
||||
return length[0];
|
||||
}
|
||||
|
||||
uint32_t PN532_getFirmwareVersion(void)
|
||||
{
|
||||
uint32_t response;
|
||||
|
||||
pn532_packetbuffer[0] = PN532_COMMAND_GETFIRMWAREVERSION;
|
||||
|
||||
if (PN532_writeCommand(pn532_packetbuffer, 1)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Read data packet
|
||||
int16_t status = PN532_readResponse(pn532_packetbuffer, sizeof(pn532_packetbuffer));
|
||||
if (0 > status) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
response = pn532_packetbuffer[0];
|
||||
response <<= 8;
|
||||
response |= pn532_packetbuffer[1];
|
||||
response <<= 8;
|
||||
response |= pn532_packetbuffer[2];
|
||||
response <<= 8;
|
||||
response |= pn532_packetbuffer[3];
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
void PN532_wakeup(void)
|
||||
{
|
||||
uint8_t wakeup[5] = {0x55, 0x55, 0, 0, 0 };
|
||||
PN532_Serial->write(wakeup,sizeof(wakeup));
|
||||
|
||||
// Flush the serial buffer just in case there's garbage in there
|
||||
PN532_Serial->flush();
|
||||
}
|
||||
|
||||
bool PN532_readPassiveTargetID(uint8_t cardbaudrate, uint8_t *uid, uint8_t *uidLength, uint16_t timeout = 50)
|
||||
{
|
||||
pn532_packetbuffer[0] = PN532_COMMAND_INLISTPASSIVETARGET;
|
||||
pn532_packetbuffer[1] = 1; // max 1 cards at once (we can set this to 2 later)
|
||||
pn532_packetbuffer[2] = cardbaudrate;
|
||||
if (PN532_writeCommand(pn532_packetbuffer, 3)) {
|
||||
return 0x0; // command failed
|
||||
}
|
||||
// read data packet
|
||||
if (PN532_readResponse(pn532_packetbuffer, sizeof(pn532_packetbuffer), timeout) < 0) {
|
||||
return 0x0;
|
||||
}
|
||||
|
||||
/* Check some basic stuff
|
||||
b0 Tags Found
|
||||
b1 Tag Number (only one used in this example)
|
||||
b2..3 SENS_RES
|
||||
b4 SEL_RES
|
||||
b5 NFCID Length
|
||||
b6..NFCIDLen NFCID
|
||||
*/
|
||||
|
||||
if (pn532_packetbuffer[0] != 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint16_t sens_res = pn532_packetbuffer[2];
|
||||
sens_res <<= 8;
|
||||
sens_res |= pn532_packetbuffer[3];
|
||||
|
||||
/* Card appears to be Mifare Classic */
|
||||
*uidLength = pn532_packetbuffer[5];
|
||||
|
||||
for (uint8_t i = 0; i < pn532_packetbuffer[5]; i++) {
|
||||
uid[i] = pn532_packetbuffer[6 + i];
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool PN532_setPassiveActivationRetries(uint8_t maxRetries)
|
||||
{
|
||||
pn532_packetbuffer[0] = PN532_COMMAND_RFCONFIGURATION;
|
||||
pn532_packetbuffer[1] = 5; // Config item 5 (MaxRetries)
|
||||
pn532_packetbuffer[2] = 0xFF; // MxRtyATR (default = 0xFF)
|
||||
pn532_packetbuffer[3] = 0x01; // MxRtyPSL (default = 0x01)
|
||||
pn532_packetbuffer[4] = maxRetries;
|
||||
if (PN532_writeCommand(pn532_packetbuffer, 5)) {
|
||||
return 0; // no ACK
|
||||
}
|
||||
return (0 < PN532_readResponse(pn532_packetbuffer, sizeof(pn532_packetbuffer)));
|
||||
}
|
||||
|
||||
bool PN532_SAMConfig(void)
|
||||
{
|
||||
pn532_packetbuffer[0] = PN532_COMMAND_SAMCONFIGURATION;
|
||||
pn532_packetbuffer[1] = 0x01; // normal mode
|
||||
pn532_packetbuffer[2] = 0x14; // timeout 50ms * 20 = 1 second
|
||||
pn532_packetbuffer[3] = 0x00; // we don't need the external IRQ pin
|
||||
if (PN532_writeCommand(pn532_packetbuffer, 4)) {
|
||||
return false;
|
||||
}
|
||||
return (0 < PN532_readResponse(pn532_packetbuffer, sizeof(pn532_packetbuffer)));
|
||||
}
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
|
||||
uint8_t mifareclassic_AuthenticateBlock (uint8_t *uid, uint8_t uidLen, uint32_t blockNumber, uint8_t keyNumber, uint8_t *keyData)
|
||||
{
|
||||
uint8_t i;
|
||||
uint8_t _key[6];
|
||||
uint8_t _uid[7];
|
||||
uint8_t _uidLen;
|
||||
|
||||
// Hang on to the key and uid data
|
||||
memcpy(&_key, keyData, 6);
|
||||
memcpy(&_uid, uid, uidLen);
|
||||
_uidLen = uidLen;
|
||||
|
||||
// Prepare the authentication command //
|
||||
pn532_packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE; /* Data Exchange Header */
|
||||
pn532_packetbuffer[1] = 1; /* Max card numbers */
|
||||
pn532_packetbuffer[2] = (keyNumber) ? MIFARE_CMD_AUTH_B : MIFARE_CMD_AUTH_A;
|
||||
pn532_packetbuffer[3] = blockNumber; /* Block Number (1K = 0..63, 4K = 0..255 */
|
||||
memcpy(&pn532_packetbuffer[4], &_key, 6);
|
||||
for (i = 0; i < _uidLen; i++) {
|
||||
pn532_packetbuffer[10 + i] = _uid[i]; /* 4 bytes card ID */
|
||||
}
|
||||
|
||||
if (PN532_writeCommand(pn532_packetbuffer, 10 + _uidLen)) { return 0; }
|
||||
|
||||
// Read the response packet
|
||||
PN532_readResponse(pn532_packetbuffer, sizeof(pn532_packetbuffer));
|
||||
|
||||
// Check if the response is valid and we are authenticated???
|
||||
// for an auth success it should be bytes 5-7: 0xD5 0x41 0x00
|
||||
// Mifare auth error is technically byte 7: 0x14 but anything other and 0x00 is not good
|
||||
if (pn532_packetbuffer[0] != 0x00) {
|
||||
// Authentification failed
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8_t mifareclassic_ReadDataBlock (uint8_t blockNumber, uint8_t *data)
|
||||
{
|
||||
/* Prepare the command */
|
||||
pn532_packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE;
|
||||
pn532_packetbuffer[1] = 1; /* Card number */
|
||||
pn532_packetbuffer[2] = MIFARE_CMD_READ; /* Mifare Read command = 0x30 */
|
||||
pn532_packetbuffer[3] = blockNumber; /* Block Number (0..63 for 1K, 0..255 for 4K) */
|
||||
|
||||
/* Send the command */
|
||||
if (PN532_writeCommand(pn532_packetbuffer, 4)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Read the response packet */
|
||||
PN532_readResponse(pn532_packetbuffer, sizeof(pn532_packetbuffer));
|
||||
|
||||
/* If byte 8 isn't 0x00 we probably have an error */
|
||||
if (pn532_packetbuffer[0] != 0x00) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copy the 16 data bytes to the output buffer */
|
||||
/* Block content starts at byte 9 of a valid response */
|
||||
memcpy (data, &pn532_packetbuffer[1], 16);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8_t mifareclassic_WriteDataBlock (uint8_t blockNumber, uint8_t *data)
|
||||
{
|
||||
/* Prepare the first command */
|
||||
pn532_packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE;
|
||||
pn532_packetbuffer[1] = 1; /* Card number */
|
||||
pn532_packetbuffer[2] = MIFARE_CMD_WRITE; /* Mifare Write command = 0xA0 */
|
||||
pn532_packetbuffer[3] = blockNumber; /* Block Number (0..63 for 1K, 0..255 for 4K) */
|
||||
memcpy(&pn532_packetbuffer[4], data, 16); /* Data Payload */
|
||||
|
||||
/* Send the command */
|
||||
if (PN532_writeCommand(pn532_packetbuffer, 20)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Read the response packet */
|
||||
return (0 < PN532_readResponse(pn532_packetbuffer, sizeof(pn532_packetbuffer)));
|
||||
}
|
||||
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
void PN532_ScanForTag(void)
|
||||
{
|
||||
if (!pn532_model) { return; }
|
||||
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
|
||||
uint8_t uid_len = 0;
|
||||
uint8_t card_data[16];
|
||||
bool erase_success = false;
|
||||
bool set_success = false;
|
||||
if (PN532_readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uid_len)) {
|
||||
char uids[15];
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
char card_datas[34];
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
sprintf(uids,"");
|
||||
for (uint8_t i = 0;i < uid_len;i++) {
|
||||
sprintf(uids,"%s%02X",uids,uid[i]);
|
||||
}
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
if (uid_len == 4) { // Lets try to read block 1 of the mifare classic card for more information
|
||||
uint8_t keyuniversal[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
if (mifareclassic_AuthenticateBlock (uid, uid_len, 1, 1, keyuniversal)) {
|
||||
if (mifareclassic_ReadDataBlock(1, card_data)) {
|
||||
#ifdef USE_PN532_DATA_RAW
|
||||
memcpy(&card_datas,&card_data,sizeof(card_data));
|
||||
#else
|
||||
for (uint8_t i = 0;i < sizeof(card_data);i++) {
|
||||
if ((isalpha(card_data[i])) || ((isdigit(card_data[i])))) {
|
||||
card_datas[i] = char(card_data[i]);
|
||||
} else {
|
||||
card_datas[i] = '\0';
|
||||
}
|
||||
}
|
||||
#endif // USE_PN532_DATA_RAW
|
||||
}
|
||||
if (pn532_function == 1) { // erase block 1 of card
|
||||
for (uint8_t i = 0;i<16;i++) {
|
||||
card_data[i] = 0x00;
|
||||
}
|
||||
if (mifareclassic_WriteDataBlock(1, card_data)) {
|
||||
erase_success = true;
|
||||
snprintf_P(log_data, sizeof(log_data),"NFC: PN532 NFC - Erase success");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
memcpy(&card_datas,&card_data,sizeof(card_data)); // Cast block 1 to a string
|
||||
}
|
||||
}
|
||||
if (pn532_function == 2) {
|
||||
#ifdef USE_PN532_DATA_RAW
|
||||
memcpy(&card_data,&pn532_newdata,sizeof(card_data));
|
||||
if (mifareclassic_WriteDataBlock(1, card_data)) {
|
||||
set_success = true;
|
||||
snprintf_P(log_data, sizeof(log_data),"NFC: PN532 NFC - Data write successful");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
memcpy(&card_datas,&card_data,sizeof(card_data)); // Cast block 1 to a string
|
||||
}
|
||||
#else
|
||||
bool IsAlphaNumeric = true;
|
||||
for (uint8_t i = 0;i < pn532_newdata_len;i++) {
|
||||
if ((!isalpha(pn532_newdata[i])) && (!isdigit(pn532_newdata[i]))) {
|
||||
IsAlphaNumeric = false;
|
||||
}
|
||||
}
|
||||
if (IsAlphaNumeric) {
|
||||
memcpy(&card_data,&pn532_newdata,pn532_newdata_len);
|
||||
card_data[pn532_newdata_len] = '\0'; // Enforce null termination
|
||||
if (mifareclassic_WriteDataBlock(1, card_data)) {
|
||||
set_success = true;
|
||||
snprintf_P(log_data, sizeof(log_data),"NFC: PN532 NFC - Data write successful");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
memcpy(&card_datas,&card_data,sizeof(card_data)); // Cast block 1 to a string
|
||||
}
|
||||
} else {
|
||||
snprintf_P(log_data, sizeof(log_data),"NFC: PN532 NFC - Data must be alphanumeric");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
}
|
||||
#endif // USE_PN532_DATA_RAW
|
||||
}
|
||||
} else {
|
||||
sprintf(card_datas,"AUTHFAIL");
|
||||
}
|
||||
}
|
||||
switch (pn532_function) {
|
||||
case 0x01:
|
||||
if (!erase_success) {
|
||||
snprintf_P(log_data, sizeof(log_data),"NFC: PN532 NFC - Erase fail - exiting erase mode");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
}
|
||||
break;
|
||||
case 0x02:
|
||||
if (!set_success) {
|
||||
snprintf_P(log_data, sizeof(log_data),"NFC: PN532 NFC - Write failed - exiting set mode");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
pn532_function = 0;
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_TIME "\":\"%s\""), GetDateAndTime(DT_LOCAL).c_str());
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"PN532\":{\"UID\":\"%s\", \"DATA\":\"%s\"}}"), mqtt_data, uids, card_datas);
|
||||
#else
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"PN532\":{\"UID\":\"%s\"}}"), mqtt_data, uids);
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
|
||||
|
||||
#ifdef USE_PN532_CAUSE_EVENTS
|
||||
|
||||
char command[71];
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
sprintf(command,"backlog event PN532_UID=%s;event PN532_DATA=%s",uids,card_datas);
|
||||
#else
|
||||
sprintf(command,"event PN532_UID=%s",uids);
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
ExecuteCommand(command, SRC_RULE);
|
||||
#endif // USE_PN532_CAUSE_EVENTS
|
||||
|
||||
pn532_scantimer = 7; // Ignore tags found for two seconds
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
|
||||
bool PN532_Command(void)
|
||||
{
|
||||
bool serviced = true;
|
||||
uint8_t paramcount = 0;
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
paramcount=1;
|
||||
} else {
|
||||
serviced = false;
|
||||
return serviced;
|
||||
}
|
||||
char sub_string[XdrvMailbox.data_len];
|
||||
char sub_string_tmp[XdrvMailbox.data_len];
|
||||
for (uint8_t ca=0;ca<XdrvMailbox.data_len;ca++) {
|
||||
if ((' ' == XdrvMailbox.data[ca]) || ('=' == XdrvMailbox.data[ca])) { XdrvMailbox.data[ca] = ','; }
|
||||
if (',' == XdrvMailbox.data[ca]) { paramcount++; }
|
||||
}
|
||||
UpperCase(XdrvMailbox.data,XdrvMailbox.data);
|
||||
if (!strcmp(subStr(sub_string, XdrvMailbox.data, ",", 1),"E")) {
|
||||
pn532_function = 1; // Block 1 of next card/tag will be reset to 0x00...
|
||||
snprintf_P(log_data, sizeof(log_data),"NFC: PN532 NFC - Next scanned tag data block 1 will be erased");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_TIME "\":\"%s\""), GetDateAndTime(DT_LOCAL).c_str());
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"PN532\":{\"COMMAND\":\"E\"\"}}"), mqtt_data);
|
||||
return serviced;
|
||||
}
|
||||
if (!strcmp(subStr(sub_string, XdrvMailbox.data, ",", 1),"S")) {
|
||||
if (paramcount > 1) {
|
||||
if (XdrvMailbox.data[XdrvMailbox.data_len-1] == ',') {
|
||||
serviced = false;
|
||||
return serviced;
|
||||
}
|
||||
sprintf(sub_string_tmp,subStr(sub_string, XdrvMailbox.data, ",", 2));
|
||||
pn532_newdata_len = strlen(sub_string_tmp);
|
||||
if (pn532_newdata_len > 15) { pn532_newdata_len = 15; }
|
||||
memcpy(&pn532_newdata,&sub_string_tmp,pn532_newdata_len);
|
||||
pn532_newdata[pn532_newdata_len] = 0x00; // Null terminate the string
|
||||
pn532_function = 2;
|
||||
snprintf_P(log_data, sizeof(log_data),"NFC: PN532 NFC - Next scanned tag data block 1 will be set to '%s'",pn532_newdata);
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_TIME "\":\"%s\""), GetDateAndTime(DT_LOCAL).c_str());
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"PN532\":{\"COMMAND\":\"S\"\"}}"), mqtt_data);
|
||||
return serviced;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
bool Xsns40(uint8_t function)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
switch (function) {
|
||||
case FUNC_INIT:
|
||||
PN532_Init();
|
||||
result = true;
|
||||
break;
|
||||
case FUNC_EVERY_50_MSECOND:
|
||||
break;
|
||||
case FUNC_EVERY_100_MSECOND:
|
||||
break;
|
||||
case FUNC_EVERY_250_MSECOND:
|
||||
if (pn532_scantimer > 0) {
|
||||
pn532_scantimer--;
|
||||
} else {
|
||||
PN532_ScanForTag();
|
||||
}
|
||||
break;
|
||||
case FUNC_EVERY_SECOND:
|
||||
break;
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
case FUNC_COMMAND:
|
||||
if (XSNS_40 == XdrvMailbox.index) {
|
||||
result = PN532_Command();
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif // USE_PN532_HSU
|
@ -1,604 +0,0 @@
|
||||
/*
|
||||
xsns_40_pn532.ino - Support for PN532 (I2C) NFC Tag Reader
|
||||
|
||||
Copyright (C) 2019 Andre Thomas and Theo Arends
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef USE_I2C
|
||||
#ifdef USE_PN532_I2C
|
||||
|
||||
/*********************************************************************************************\
|
||||
* PN532 - Near Field Communication (NFC) controller
|
||||
*
|
||||
* Datasheet at https://www.nxp.com/docs/en/nxp/data-sheets/PN532_C1.pdf
|
||||
*
|
||||
* I2C Address: 0x24
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define XSNS_40 40
|
||||
|
||||
#define PN532_I2C_ADDRESS 0x24
|
||||
|
||||
#define PN532_COMMAND_GETFIRMWAREVERSION 0x02
|
||||
#define PN532_COMMAND_SAMCONFIGURATION 0x14
|
||||
#define PN532_COMMAND_INDATAEXCHANGE 0x40
|
||||
#define PN532_COMMAND_INLISTPASSIVETARGET 0x4A
|
||||
|
||||
#define MIFARE_CMD_READ 0x30
|
||||
#define MIFARE_CMD_AUTH_A 0x60
|
||||
#define MIFARE_CMD_AUTH_B 0x61
|
||||
#define MIFARE_CMD_WRITE 0xA0
|
||||
|
||||
#define PN532_PREAMBLE 0x00
|
||||
#define PN532_STARTCODE1 0x00
|
||||
#define PN532_STARTCODE2 0xFF
|
||||
#define PN532_POSTAMBLE 0x00
|
||||
|
||||
#define PN532_HOSTTOPN532 0xD4
|
||||
#define PN532_PN532TOHOST 0xD5
|
||||
|
||||
#define PN532_INVALID_ACK -1
|
||||
#define PN532_TIMEOUT -2
|
||||
#define PN532_INVALID_FRAME -3
|
||||
#define PN532_NO_SPACE -4
|
||||
|
||||
#define PN532_MIFARE_ISO14443A 0x00
|
||||
|
||||
uint8_t pn532_i2c_detected = 0;
|
||||
uint8_t pn532_i2c_packetbuffer[64];
|
||||
uint8_t pn532_i2c_scan_defer_report = 0; // If a valid card was found we will not scan for one again in the same two seconds so we set this to 19 if a card was found
|
||||
uint8_t pn532_i2c_command = 0;
|
||||
|
||||
uint8_t pn532_i2c_disable = 0;
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
uint8_t pn532_i2c_function = 0;
|
||||
uint8_t pn532_i2c_newdata[16];
|
||||
uint8_t pn532_i2c_newdata_len = 0;
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
const uint8_t PROGMEM pn532_global_timeout = 10;
|
||||
|
||||
int16_t PN532_getResponseLength(uint8_t buf[], uint8_t len) {
|
||||
const uint8_t PN532_NACK[] = {0, 0, 0xFF, 0xFF, 0, 0};
|
||||
uint8_t time = 0;
|
||||
do {
|
||||
if (Wire.requestFrom(PN532_I2C_ADDRESS, 6)) {
|
||||
if (Wire.read() & 1) { // check first byte --- status
|
||||
break; // PN532 is ready
|
||||
}
|
||||
}
|
||||
delay(1);
|
||||
time++;
|
||||
if (time > pn532_global_timeout) {
|
||||
return -1;
|
||||
}
|
||||
} while (1);
|
||||
|
||||
if ((0x00 != Wire.read()) || (0x00 != Wire.read()) || (0xFF != Wire.read())) { // PREAMBLE || STARTCODE1 || STARTCODE2
|
||||
return PN532_INVALID_FRAME;
|
||||
}
|
||||
|
||||
uint8_t length = Wire.read();
|
||||
|
||||
// request for last respond msg again
|
||||
Wire.beginTransmission(PN532_I2C_ADDRESS);
|
||||
for (uint16_t i = 0;i < sizeof(PN532_NACK); ++i) {
|
||||
Wire.write(PN532_NACK[i]);
|
||||
}
|
||||
Wire.endTransmission();
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
int16_t PN532_readResponse(uint8_t buf[], uint8_t len)
|
||||
{
|
||||
uint8_t time = 0;
|
||||
uint8_t length;
|
||||
|
||||
length = PN532_getResponseLength(buf, len);
|
||||
|
||||
// [RDY] 00 00 FF LEN LCS (TFI PD0 ... PDn) DCS 00
|
||||
|
||||
do {
|
||||
if (Wire.requestFrom(PN532_I2C_ADDRESS, 6 + length + 2)) {
|
||||
if (Wire.read() & 1) { // check first byte --- status
|
||||
break; // PN532 is ready
|
||||
}
|
||||
}
|
||||
delay(1);
|
||||
time++;
|
||||
if (time > pn532_global_timeout) {
|
||||
return -1;
|
||||
}
|
||||
} while (1);
|
||||
|
||||
if ((0x00 != Wire.read()) || (0x00 != Wire.read()) || (0xFF != Wire.read())) { // PREAMBLE || STARTCODE1 || STARTCODE2
|
||||
return PN532_INVALID_FRAME;
|
||||
}
|
||||
|
||||
length = Wire.read();
|
||||
|
||||
if (0 != (uint8_t)(length + Wire.read())) { // checksum of length
|
||||
return PN532_INVALID_FRAME;
|
||||
}
|
||||
|
||||
uint8_t cmd = pn532_i2c_command + 1; // response command
|
||||
if ((PN532_PN532TOHOST != Wire.read()) || ((cmd) != Wire.read())) {
|
||||
return PN532_INVALID_FRAME;
|
||||
}
|
||||
length -= 2;
|
||||
if (length > len) {
|
||||
return PN532_NO_SPACE; // not enough space
|
||||
}
|
||||
uint8_t sum = PN532_PN532TOHOST + cmd;
|
||||
for (uint8_t i = 0; i < length; i++) {
|
||||
buf[i] = Wire.read();
|
||||
sum += buf[i];
|
||||
}
|
||||
uint8_t checksum = Wire.read();
|
||||
if (0 != (uint8_t)(sum + checksum)) {
|
||||
return PN532_INVALID_FRAME;
|
||||
}
|
||||
Wire.read(); // POSTAMBLE
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
int8_t PN532_readAckFrame(void)
|
||||
{
|
||||
const uint8_t PN532_ACK[] = {0, 0, 0xFF, 0, 0xFF, 0};
|
||||
uint8_t ackBuf[sizeof(PN532_ACK)];
|
||||
|
||||
uint8_t time = 0;
|
||||
|
||||
do {
|
||||
if (Wire.requestFrom(PN532_I2C_ADDRESS, sizeof(PN532_ACK) + 1)) {
|
||||
if (Wire.read() & 1) { // check first byte --- status
|
||||
break; // PN532 is ready
|
||||
}
|
||||
}
|
||||
delay(1);
|
||||
time++;
|
||||
if (time > pn532_global_timeout) { // We time out after 10ms
|
||||
return PN532_TIMEOUT;
|
||||
}
|
||||
} while (1);
|
||||
|
||||
for (uint8_t i = 0; i < sizeof(PN532_ACK); i++) {
|
||||
ackBuf[i] = Wire.read();
|
||||
}
|
||||
|
||||
if (memcmp(ackBuf, PN532_ACK, sizeof(PN532_ACK))) {
|
||||
return PN532_INVALID_ACK;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t PN532_writeCommand(const uint8_t *header, uint8_t hlen)
|
||||
{
|
||||
pn532_i2c_command = header[0];
|
||||
Wire.beginTransmission(PN532_I2C_ADDRESS);
|
||||
Wire.write(PN532_PREAMBLE);
|
||||
Wire.write(PN532_STARTCODE1);
|
||||
Wire.write(PN532_STARTCODE2);
|
||||
uint8_t length = hlen + 1; // TFI + DATA
|
||||
Wire.write(length);
|
||||
Wire.write(~length + 1); // checksum of length
|
||||
Wire.write(PN532_HOSTTOPN532);
|
||||
uint8_t sum = PN532_HOSTTOPN532; // Sum of TFI + DATA
|
||||
for (uint8_t i = 0; i < hlen; i++) {
|
||||
if (Wire.write(header[i])) {
|
||||
sum += header[i];
|
||||
} else {
|
||||
return PN532_INVALID_FRAME;
|
||||
}
|
||||
}
|
||||
uint8_t checksum = ~sum + 1; // Checksum of TFI + DATA
|
||||
Wire.write(checksum);
|
||||
Wire.write(PN532_POSTAMBLE);
|
||||
Wire.endTransmission();
|
||||
return PN532_readAckFrame();
|
||||
}
|
||||
|
||||
uint32_t PN532_getFirmwareVersion(void)
|
||||
{
|
||||
uint32_t response;
|
||||
pn532_i2c_packetbuffer[0] = PN532_COMMAND_GETFIRMWAREVERSION;
|
||||
if (PN532_writeCommand(pn532_i2c_packetbuffer, 1)) {
|
||||
return 0;
|
||||
}
|
||||
int16_t status = PN532_readResponse(pn532_i2c_packetbuffer, sizeof(pn532_i2c_packetbuffer));
|
||||
if (0 > status) {
|
||||
return 0;
|
||||
}
|
||||
response = pn532_i2c_packetbuffer[0];
|
||||
response <<= 8;
|
||||
response |= pn532_i2c_packetbuffer[1];
|
||||
response <<= 8;
|
||||
response |= pn532_i2c_packetbuffer[2];
|
||||
response <<= 8;
|
||||
response |= pn532_i2c_packetbuffer[3];
|
||||
return response;
|
||||
}
|
||||
|
||||
bool PN532_SAMConfig(void)
|
||||
{
|
||||
pn532_i2c_packetbuffer[0] = PN532_COMMAND_SAMCONFIGURATION;
|
||||
pn532_i2c_packetbuffer[1] = 0x01; // normal mode;
|
||||
pn532_i2c_packetbuffer[2] = 0x01; // timeout 50ms * 1 = 50ms
|
||||
pn532_i2c_packetbuffer[3] = 0x00; // Disable IRQ pin
|
||||
|
||||
if (PN532_writeCommand(pn532_i2c_packetbuffer, 4))
|
||||
return false;
|
||||
|
||||
return (0 < PN532_readResponse(pn532_i2c_packetbuffer, sizeof(pn532_i2c_packetbuffer)));
|
||||
}
|
||||
|
||||
void PN532_Detect(void)
|
||||
{
|
||||
if ((pn532_i2c_detected) || (pn532_i2c_disable)) { return; }
|
||||
|
||||
Wire.setClockStretchLimit(1000); // Enable 1ms clock stretch as per datasheet Table 12.25 (Timing for the I2C interface)
|
||||
|
||||
uint32_t ver = PN532_getFirmwareVersion();
|
||||
if (ver) {
|
||||
pn532_i2c_detected = 1;
|
||||
snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, "PN532 NFC Reader (V%u.%u)", PN532_I2C_ADDRESS);
|
||||
snprintf_P(log_data, sizeof(log_data), log_data, (ver>>16) & 0xFF, (ver>>8) & 0xFF);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
PN532_SAMConfig();
|
||||
}
|
||||
}
|
||||
|
||||
bool PN532_readPassiveTargetID(uint8_t cardbaudrate, uint8_t *uid, uint8_t *uidLength)
|
||||
{
|
||||
pn532_i2c_packetbuffer[0] = PN532_COMMAND_INLISTPASSIVETARGET;
|
||||
pn532_i2c_packetbuffer[1] = 1;
|
||||
pn532_i2c_packetbuffer[2] = cardbaudrate;
|
||||
|
||||
if (PN532_writeCommand(pn532_i2c_packetbuffer, 3)) {
|
||||
return false; // command failed
|
||||
}
|
||||
|
||||
if (PN532_readResponse(pn532_i2c_packetbuffer, sizeof(pn532_i2c_packetbuffer)) < 0) { // No data packet so no tag was found
|
||||
Wire.beginTransmission(PN532_I2C_ADDRESS);
|
||||
Wire.endTransmission();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pn532_i2c_packetbuffer[0] != 1) { return false; } // Not a valid tag
|
||||
|
||||
*uidLength = pn532_i2c_packetbuffer[5];
|
||||
for (uint8_t i = 0;i < pn532_i2c_packetbuffer[5]; i++) {
|
||||
uid[i] = pn532_i2c_packetbuffer[6 + i];
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
|
||||
uint8_t mifareclassic_AuthenticateBlock (uint8_t *uid, uint8_t uidLen, uint32_t blockNumber, uint8_t keyNumber, uint8_t *keyData)
|
||||
{
|
||||
uint8_t i;
|
||||
uint8_t _key[6];
|
||||
uint8_t _uid[7];
|
||||
uint8_t _uidLen;
|
||||
|
||||
// Hang on to the key and uid data
|
||||
memcpy (_key, keyData, 6);
|
||||
memcpy (_uid, uid, uidLen);
|
||||
_uidLen = uidLen;
|
||||
|
||||
// Prepare the authentication command //
|
||||
pn532_i2c_packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE; /* Data Exchange Header */
|
||||
pn532_i2c_packetbuffer[1] = 1; /* Max card numbers */
|
||||
pn532_i2c_packetbuffer[2] = (keyNumber) ? MIFARE_CMD_AUTH_B : MIFARE_CMD_AUTH_A;
|
||||
pn532_i2c_packetbuffer[3] = blockNumber; /* Block Number (1K = 0..63, 4K = 0..255 */
|
||||
memcpy (&pn532_i2c_packetbuffer[4], _key, 6);
|
||||
for (i = 0; i < _uidLen; i++) {
|
||||
pn532_i2c_packetbuffer[10 + i] = _uid[i]; /* 4 bytes card ID */
|
||||
}
|
||||
|
||||
if (PN532_writeCommand(pn532_i2c_packetbuffer, 10 + _uidLen))
|
||||
return 0;
|
||||
|
||||
// Read the response packet
|
||||
PN532_readResponse(pn532_i2c_packetbuffer, sizeof(pn532_i2c_packetbuffer));
|
||||
|
||||
// Check if the response is valid and we are authenticated???
|
||||
// for an auth success it should be bytes 5-7: 0xD5 0x41 0x00
|
||||
// Mifare auth error is technically byte 7: 0x14 but anything other and 0x00 is not good
|
||||
if (pn532_i2c_packetbuffer[0] != 0x00) {
|
||||
// Authentification failed
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8_t mifareclassic_ReadDataBlock (uint8_t blockNumber, uint8_t *data)
|
||||
{
|
||||
/* Prepare the command */
|
||||
pn532_i2c_packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE;
|
||||
pn532_i2c_packetbuffer[1] = 1; /* Card number */
|
||||
pn532_i2c_packetbuffer[2] = MIFARE_CMD_READ; /* Mifare Read command = 0x30 */
|
||||
pn532_i2c_packetbuffer[3] = blockNumber; /* Block Number (0..63 for 1K, 0..255 for 4K) */
|
||||
|
||||
/* Send the command */
|
||||
if (PN532_writeCommand(pn532_i2c_packetbuffer, 4)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Read the response packet */
|
||||
PN532_readResponse(pn532_i2c_packetbuffer, sizeof(pn532_i2c_packetbuffer));
|
||||
|
||||
/* If byte 8 isn't 0x00 we probably have an error */
|
||||
if (pn532_i2c_packetbuffer[0] != 0x00) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copy the 16 data bytes to the output buffer */
|
||||
/* Block content starts at byte 9 of a valid response */
|
||||
memcpy (data, &pn532_i2c_packetbuffer[1], 16);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8_t mifareclassic_WriteDataBlock (uint8_t blockNumber, uint8_t *data)
|
||||
{
|
||||
/* Prepare the first command */
|
||||
pn532_i2c_packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE;
|
||||
pn532_i2c_packetbuffer[1] = 1; /* Card number */
|
||||
pn532_i2c_packetbuffer[2] = MIFARE_CMD_WRITE; /* Mifare Write command = 0xA0 */
|
||||
pn532_i2c_packetbuffer[3] = blockNumber; /* Block Number (0..63 for 1K, 0..255 for 4K) */
|
||||
memcpy(&pn532_i2c_packetbuffer[4], data, 16); /* Data Payload */
|
||||
|
||||
/* Send the command */
|
||||
if (PN532_writeCommand(pn532_i2c_packetbuffer, 20)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Read the response packet */
|
||||
return (0 < PN532_readResponse(pn532_i2c_packetbuffer, sizeof(pn532_i2c_packetbuffer)));
|
||||
}
|
||||
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
void PN532_ScanForTag(void)
|
||||
{
|
||||
if (pn532_i2c_disable) { return; }
|
||||
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
|
||||
uint8_t uid_len = 0;
|
||||
uint8_t card_data[16];
|
||||
bool erase_success = false;
|
||||
bool set_success = false;
|
||||
if (PN532_readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uid_len)) {
|
||||
if (pn532_i2c_scan_defer_report > 0) {
|
||||
pn532_i2c_scan_defer_report--;
|
||||
} else {
|
||||
char uids[15];
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
char card_datas[34];
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
sprintf(uids,"");
|
||||
for (uint8_t i = 0;i < uid_len;i++) {
|
||||
sprintf(uids,"%s%02X",uids,uid[i]);
|
||||
}
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
if (uid_len == 4) { // Lets try to read block 0 of the mifare classic card for more information
|
||||
uint8_t keyuniversal[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
if (mifareclassic_AuthenticateBlock (uid, uid_len, 1, 1, keyuniversal)) {
|
||||
if (mifareclassic_ReadDataBlock(1, card_data)) {
|
||||
#ifdef USE_PN532_DATA_RAW
|
||||
memcpy(&card_datas,&card_data,sizeof(card_data));
|
||||
#else
|
||||
for (uint8_t i = 0;i < sizeof(card_data);i++) {
|
||||
if ((isalpha(card_data[i])) || ((isdigit(card_data[i])))) {
|
||||
card_datas[i] = char(card_data[i]);
|
||||
} else {
|
||||
card_datas[i] = '\0';
|
||||
}
|
||||
}
|
||||
#endif // USE_PN532_DATA_RAW
|
||||
}
|
||||
if (pn532_i2c_function == 1) { // erase block 1 of card
|
||||
for (uint8_t i = 0;i<16;i++) {
|
||||
card_data[i] = 0x00;
|
||||
}
|
||||
if (mifareclassic_WriteDataBlock(1, card_data)) {
|
||||
erase_success = true;
|
||||
snprintf_P(log_data, sizeof(log_data),"I2C: PN532 NFC - Erase success");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
memcpy(&card_datas,&card_data,sizeof(card_data)); // Cast block 1 to a string
|
||||
}
|
||||
}
|
||||
if (pn532_i2c_function == 2) {
|
||||
#ifdef USE_PN532_DATA_RAW
|
||||
if (mifareclassic_WriteDataBlock(1, card_data)) {
|
||||
set_success = true;
|
||||
snprintf_P(log_data, sizeof(log_data),"I2C: PN532 NFC - Data write successful");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
memcpy(&card_datas,&card_data,sizeof(card_data)); // Cast block 1 to a string
|
||||
}
|
||||
#else
|
||||
bool IsAlphaNumeric = true;
|
||||
for (uint8_t i = 0;i < pn532_i2c_newdata_len;i++) {
|
||||
if ((!isalpha(pn532_i2c_newdata[i])) || (!isdigit(pn532_i2c_newdata[i]))) {
|
||||
IsAlphaNumeric = false;
|
||||
}
|
||||
}
|
||||
if (IsAlphaNumeric) {
|
||||
if (mifareclassic_WriteDataBlock(1, card_data)) {
|
||||
memcpy(&card_data,&pn532_i2c_newdata,sizeof(card_data));
|
||||
set_success = true;
|
||||
snprintf_P(log_data, sizeof(log_data),"I2C: PN532 NFC - Data write successful");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
memcpy(&card_datas,&card_data,sizeof(card_data)); // Cast block 1 to a string
|
||||
}
|
||||
} else {
|
||||
snprintf_P(log_data, sizeof(log_data),"I2C: PN532 NFC - Data must be alphanumeric");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
}
|
||||
#endif // USE_PN532_DATA_RAW
|
||||
}
|
||||
} else {
|
||||
sprintf(card_datas,"AUTHFAIL");
|
||||
}
|
||||
}
|
||||
switch (pn532_i2c_function) {
|
||||
case 0x01:
|
||||
if (!erase_success) {
|
||||
snprintf_P(log_data, sizeof(log_data),"I2C: PN532 NFC - Erase fail - exiting erase mode");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
}
|
||||
break;
|
||||
case 0x02:
|
||||
if (!set_success) {
|
||||
snprintf_P(log_data, sizeof(log_data),"I2C: PN532 NFC - Write failed - exiting set mode");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
pn532_i2c_function = 0;
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_TIME "\":\"%s\""), GetDateAndTime(DT_LOCAL).c_str());
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"PN532\":{\"UID\":\"%s\", \"DATA\":\"%s\"}}"), mqtt_data, uids, card_datas);
|
||||
#else
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"PN532\":{\"UID\":\"%s\"}}"), mqtt_data, uids);
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
|
||||
|
||||
#ifdef USE_PN532_CAUSE_EVENTS
|
||||
|
||||
char command[71];
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
sprintf(command,"backlog event PN532_UID=%s;event PN532_DATA=%s",uids,card_datas);
|
||||
#else
|
||||
sprintf(command,"event PN532_UID=%s",uids);
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
ExecuteCommand(command, SRC_RULE);
|
||||
#endif // USE_PN532_CAUSE_EVENTS
|
||||
|
||||
pn532_i2c_scan_defer_report = 7; // Ignore tags found for two seconds
|
||||
}
|
||||
} else {
|
||||
if (pn532_i2c_scan_defer_report > 0) { pn532_i2c_scan_defer_report--; }
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
|
||||
bool PN532_Command(void)
|
||||
{
|
||||
bool serviced = true;
|
||||
uint8_t paramcount = 0;
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
paramcount=1;
|
||||
} else {
|
||||
serviced = false;
|
||||
return serviced;
|
||||
}
|
||||
char sub_string[XdrvMailbox.data_len];
|
||||
char sub_string_tmp[XdrvMailbox.data_len];
|
||||
for (uint8_t ca=0;ca<XdrvMailbox.data_len;ca++) {
|
||||
if ((' ' == XdrvMailbox.data[ca]) || ('=' == XdrvMailbox.data[ca])) { XdrvMailbox.data[ca] = ','; }
|
||||
if (',' == XdrvMailbox.data[ca]) { paramcount++; }
|
||||
}
|
||||
UpperCase(XdrvMailbox.data,XdrvMailbox.data);
|
||||
if (!strcmp(subStr(sub_string, XdrvMailbox.data, ",", 1),"E")) {
|
||||
pn532_i2c_function = 1; // Block 0 of next card/tag will be reset to 0x00...
|
||||
snprintf_P(log_data, sizeof(log_data),"I2C: PN532 NFC - Next scanned tag data block 1 will be erased");
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_TIME "\":\"%s\""), GetDateAndTime(DT_LOCAL).c_str());
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"PN532\":{\"COMMAND\":\"E\"\"}}"), mqtt_data);
|
||||
return serviced;
|
||||
}
|
||||
if (!strcmp(subStr(sub_string, XdrvMailbox.data, ",", 1),"S")) {
|
||||
if (paramcount > 1) {
|
||||
if (XdrvMailbox.data[XdrvMailbox.data_len-1] == ',') {
|
||||
serviced = false;
|
||||
return serviced;
|
||||
}
|
||||
sprintf(sub_string_tmp,subStr(sub_string, XdrvMailbox.data, ",", 2));
|
||||
pn532_i2c_newdata_len = strlen(sub_string_tmp);
|
||||
if (pn532_i2c_newdata_len > 15) { pn532_i2c_newdata_len = 15; }
|
||||
memcpy(&pn532_i2c_newdata,&sub_string_tmp,pn532_i2c_newdata_len);
|
||||
pn532_i2c_newdata[pn532_i2c_newdata_len] = 0x00; // Null terminate the string
|
||||
pn532_i2c_function = 2;
|
||||
snprintf_P(log_data, sizeof(log_data),"I2C: PN532 NFC - Next scanned tag data block 1 will be set to '%s'",pn532_i2c_newdata);
|
||||
AddLog(LOG_LEVEL_INFO);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_TIME "\":\"%s\""), GetDateAndTime(DT_LOCAL).c_str());
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"PN532\":{\"COMMAND\":\"S\"\"}}"), mqtt_data);
|
||||
return serviced;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Interface
|
||||
\*********************************************************************************************/
|
||||
|
||||
bool Xsns40(uint8_t function)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if (i2c_flg) {
|
||||
switch (function) {
|
||||
case FUNC_EVERY_250_MSECOND:
|
||||
if (pn532_i2c_detected) {
|
||||
PN532_ScanForTag();
|
||||
}
|
||||
break;
|
||||
case FUNC_EVERY_SECOND:
|
||||
PN532_Detect();
|
||||
break;
|
||||
|
||||
#ifdef USE_PN532_DATA_FUNCTION
|
||||
case FUNC_COMMAND:
|
||||
if (XSNS_40 == XdrvMailbox.index) {
|
||||
result = PN532_Command();
|
||||
}
|
||||
break;
|
||||
#endif // USE_PN532_DATA_FUNCTION
|
||||
|
||||
case FUNC_SAVE_BEFORE_RESTART:
|
||||
if (!pn532_i2c_disable) {
|
||||
pn532_i2c_disable = 1;
|
||||
snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, "PN532 NFC Reader - Disabling for reboot", PN532_I2C_ADDRESS);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif // USE_PN532_I2C
|
||||
#endif // USE_I2C
|
@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
VER = '2.1.0019'
|
||||
VER = '2.1.0020'
|
||||
|
||||
"""
|
||||
decode-config.py - Backup/Restore Sonoff-Tasmota configuration data
|
||||
@ -835,7 +835,16 @@ Setting_6_4_1_11.update ({
|
||||
'interlock': ('B', 0x4CA, ([4], None, ('Main', None)), '"0x{:02x}".format($)' ),
|
||||
})
|
||||
# ======================================================================
|
||||
Setting_6_4_1_13 = copy.deepcopy(Setting_6_4_1_11)
|
||||
Setting_6_4_1_13.update ({
|
||||
'SensorBits1': ({
|
||||
'mhz19b_abc_disable': ('B', (0x717,1, 7), (None, None, ('Sensor', '"Sensor15 {}".format($)')) ),
|
||||
}, 0x717, (None, None, ('*', None)), (None, False) ),
|
||||
})
|
||||
|
||||
# ======================================================================
|
||||
Settings = [
|
||||
(0x604010D, 0xe00, Setting_6_4_1_13),
|
||||
(0x604010B, 0xe00, Setting_6_4_1_11),
|
||||
(0x6040108, 0xe00, Setting_6_4_1_8),
|
||||
(0x6040107, 0xe00, Setting_6_4_1_7),
|
||||
@ -2841,4 +2850,4 @@ if __name__ == "__main__":
|
||||
tasmotacmnds = Mapping2Cmnd(decode_cfg, configmapping)
|
||||
OutputTasmotaCmnds(tasmotacmnds)
|
||||
|
||||
sys.exit(exitcode)
|
||||
sys.exit(exitcode)
|
@ -84,6 +84,15 @@ a_setoption = [[
|
||||
"Enforce HASS light group",
|
||||
"Do not show Wifi and Mqtt state using Led"
|
||||
],[
|
||||
"Key hold time (ms)",
|
||||
"Sonoff POW Max_Power_Retry",
|
||||
"Tuya dimmer device id",
|
||||
"(not used) mDNS delayed start (Sec)",
|
||||
"Boot loop retry offset (0 = disable)",
|
||||
"",
|
||||
"","","","","","",
|
||||
"","","","","","",
|
||||
],[
|
||||
"Timers enabled",
|
||||
"Generic ESP8285 GPIO enabled",
|
||||
"Add UTC time offset to JSON message",
|
||||
@ -114,8 +123,8 @@ a_features = [[
|
||||
"USE_TIMERS","USE_SUNRISE","USE_TIMERS_WEB","USE_RULES",
|
||||
"USE_KNX","USE_WPS","USE_SMARTCONFIG","MQTT_ARDUINOMQTT"
|
||||
],[
|
||||
"USE_CONFIG_OVERRIDE","BE_MINIMAL","USE_SENSORS","USE_CLASSIC",
|
||||
"USE_KNX_NO_EMULATION","USE_DISPLAY_MODES1TO5","USE_DISPLAY_GRAPH","USE_DISPLAY_LCD",
|
||||
"USE_CONFIG_OVERRIDE","FIRMWARE_MINIMAL","FIRMWARE_SENSORS","FIRMWARE_CLASSIC",
|
||||
"FIRMWARE_KNX_NO_EMULATION","USE_DISPLAY_MODES1TO5","USE_DISPLAY_GRAPH","USE_DISPLAY_LCD",
|
||||
"USE_DISPLAY_SSD1306","USE_DISPLAY_MATRIX","USE_DISPLAY_ILI9341","USE_DISPLAY_EPAPER",
|
||||
"USE_DISPLAY_SH1106","USE_MP3_PLAYER","USE_PCA9685","USE_TUYA_DIMMER",
|
||||
"USE_RC_SWITCH","USE_ARMTRONIX_DIMMERS","","",
|
||||
@ -168,66 +177,73 @@ if (options.device):
|
||||
obj = json.loads(body)
|
||||
else:
|
||||
jsonfile = options.jsonfile
|
||||
fp = open(jsonfile, "r")
|
||||
obj = json.load(fp)
|
||||
fp.close()
|
||||
with open(jsonfile, "r") as fp:
|
||||
obj = json.load(fp)
|
||||
|
||||
def StartDecode():
|
||||
print ("\n*** decode-status.py v20180730 by Theo Arends ***")
|
||||
print ("\n*** decode-status.py v20190204 by Theo Arends and Jacek Ziolkowski ***")
|
||||
|
||||
# print("Decoding\n{}".format(obj))
|
||||
|
||||
if ("StatusSNS" in obj):
|
||||
if ("Time" in obj["StatusSNS"]):
|
||||
if "StatusSNS" in obj:
|
||||
if "Time" in obj["StatusSNS"]:
|
||||
time = str(" from status report taken at {}".format(obj["StatusSNS"]["Time"]))
|
||||
|
||||
if ("Status" in obj):
|
||||
if ("FriendlyName" in obj["Status"]):
|
||||
if "Status" in obj:
|
||||
if "FriendlyName" in obj["Status"]:
|
||||
print("Decoding information for device {}{}".format(obj["Status"]["FriendlyName"][0], time))
|
||||
|
||||
if ("StatusLOG" in obj):
|
||||
if ("SetOption" in obj["StatusLOG"]):
|
||||
if "StatusLOG" in obj:
|
||||
if "SetOption" in obj["StatusLOG"]:
|
||||
options = []
|
||||
o = 0
|
||||
p = 0
|
||||
|
||||
r = 1
|
||||
if (len(obj["StatusLOG"]["SetOption"]) == 3):
|
||||
r = 2
|
||||
i = 0
|
||||
for r,opt_group in enumerate(a_setoption):
|
||||
register = obj["StatusLOG"]["SetOption"][r]
|
||||
|
||||
for f in range(r):
|
||||
if (f == 1):
|
||||
o = 2
|
||||
p = 50
|
||||
if r > 0 and len(obj["StatusLOG"]["SetOption"]) == 2: # old firmware: array consisted only of SetOptions 0..31 and resolution
|
||||
break
|
||||
|
||||
option = obj["StatusLOG"]["SetOption"][o]
|
||||
i_option = int(option,16)
|
||||
for i in range(len(a_setoption[f])):
|
||||
if (a_setoption[f][i]):
|
||||
state = (i_option >> i) & 1
|
||||
options.append(str("{0:2d} ({1}) {2}".format(i + p, a_on_off[state], a_setoption[f][i])))
|
||||
if r == 1:
|
||||
if len(register) == 8: # pre 6.1.1.14: array consisted of SetOptions 0..31, resolution, and SetOptions 50..81
|
||||
i += 18 # adjust option index and skip 2nd register
|
||||
continue
|
||||
|
||||
elif len(register) == 36: # 6.1.1.14: array consists of SetOptions 0..31, SetOptions 32..49, and SetOptions 50..81
|
||||
split_register = [int(register[opt*2:opt*2+2],16) for opt in range(18)] # split register into 18 values
|
||||
|
||||
for opt_idx, option in enumerate(opt_group):
|
||||
options.append(str("{0:2d} ({1:3d}) {2}".format(i, split_register[opt_idx], option)))
|
||||
i += 1
|
||||
|
||||
if r in (0, 2): #registers 1 and 3 hold binary values
|
||||
for opt_idx, option in enumerate(opt_group):
|
||||
i_register = int(register,16)
|
||||
state = (i_register >> opt_idx) & 1
|
||||
options.append(str("{0:2d} ({1}) {2}".format(i, a_on_off[state], option)))
|
||||
i += 1
|
||||
|
||||
print("\nOptions")
|
||||
for i in range(len(options)):
|
||||
print(" {}".format(options[i]))
|
||||
for o in options:
|
||||
print(" {}".format(o))
|
||||
|
||||
if ("StatusMEM" in obj):
|
||||
if ("Features" in obj["StatusMEM"]):
|
||||
if "StatusMEM" in obj:
|
||||
if "Features" in obj["StatusMEM"]:
|
||||
features = []
|
||||
for f in range(5):
|
||||
feature = obj["StatusMEM"]["Features"][f]
|
||||
i_feature = int(feature,16)
|
||||
if (f == 0):
|
||||
if f == 0:
|
||||
features.append(str("Language LCID = {}".format(i_feature & 0xFFFF)))
|
||||
else:
|
||||
for i in range(len(a_features[f -1])):
|
||||
if ((i_feature >> i) & 1):
|
||||
if (i_feature >> i) & 1:
|
||||
features.append(a_features[f -1][i])
|
||||
|
||||
features.sort()
|
||||
print("\nFeatures")
|
||||
for i in range(len(features)):
|
||||
print(" {}".format(features[i]))
|
||||
for f in features:
|
||||
print(" {}".format(f))
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
|
Loading…
x
Reference in New Issue
Block a user