diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index a2fa5648e..2839ba02b 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -6,6 +6,6 @@
- [ ] The pull request is done against the latest dev branch
- [ ] Only relevant files were touched
- [ ] Only one feature/fix was added per PR.
- - [ ] The code change is tested and works on core 2.6.1
+ - [ ] The code change is tested and works on core Tasmota_core_stage
- [ ] The code change pass travis tests. **Your PR cannot be merged unless tests pass**
- [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla).
diff --git a/.gitignore b/.gitignore
index e9c55b5b9..500f720ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,9 +10,11 @@
.cache
tasmota/user_config_override.h
build
+build_output
firmware.map
firmware.asm
tasmota*.bin
+tasmota*.bin.gz
tasmota*.map
platformio_override.ini
diff --git a/.travis.yml b/.travis.yml
index ffd47f546..5e5885f65 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,7 +4,7 @@ python:
sudo: false
install:
- pip install -U platformio
- - platformio upgrade
+ - platformio upgrade --dev
- platformio update
cache: false
@@ -32,6 +32,7 @@ env:
- ENV=tasmota-NL
- ENV=tasmota-PL
- ENV=tasmota-PT
+ - ENV=tasmota-RO
- ENV=tasmota-RU
- ENV=tasmota-SE
- ENV=tasmota-SK
diff --git a/API.md b/API.md
index 354382cfc..f10ae2c93 100644
--- a/API.md
+++ b/API.md
@@ -25,7 +25,7 @@ FUNC_EVERY_250_MSECOND | | 1 | 3 | 2 | |
FUNC_EVERY_SECOND | | 1 | 2 | | |
FUNC_SAVE_AT_MIDNIGHT | | | x | | | At midnight
FUNC_SAVE_BEFORE_RESTART | | 2 | 1 | | | Just before a planned restart
-FUNC_AFTER_TELEPERIOD | | x | | | | At end of teleperiod
+FUNC_AFTER_TELEPERIOD | | 2 | 1 | | | At end of teleperiod
FUNC_JSON_APPEND | | 2 | 1 | 3 | | Extend teleperiod JSON text
FUNC_WEB_SENSOR | | 2 | 1 | 3 | | Add sensor data to web GUI
FUNC_COMMAND | x | 1 | 2 | 3 | 4 | When a command is not recognized
diff --git a/BUILDS.md b/BUILDS.md
index 5c897746a..0134d5fd7 100644
--- a/BUILDS.md
+++ b/BUILDS.md
@@ -26,21 +26,26 @@
| USE_SCRIPT | - | - | - | - | - | - | - |
| USE_EXPRESSION | - | - | - | - | - | - | - |
| SUPPORT_IF_STATEMENT | - | - | - | - | - | - | - |
+| USE_HOTPLUG | - | - | - | - | - | - | - |
| | | | | | | | |
| Feature or Sensor | minimal | lite | tasmota | knx | sensors | ir | display | Remarks
| ROTARY_V1 | - | - | - | - | - | - | - |
| USE_SONOFF_RF | - | - | x | x | x | - | - |
| USE_RF_FLASH | - | - | x | x | x | - | - |
-| USE_SONOFF_SC | - | - | x | - | x | - | - |
+| USE_SONOFF_SC | - | - | x | x | x | - | - |
| USE_TUYA_MCU | - | x | x | x | x | - | x |
| USE_ARMTRONIX_DIMMERS | - | - | x | x | - | - | - |
-| USE_PS_16_DZ | - | - | x | x | x | - | - |
-| USE_SONOFF_IFAN | - | - | x | x | x | - | - |
+| USE_PS_16_DZ | - | - | x | x | - | - | - |
+| USE_SONOFF_IFAN | - | - | x | x | - | - | - |
| USE_BUZZER | - | - | x | x | x | - | - |
-| USE_ARILUX_RF | - | - | x | x | x | - | - |
-| USE_SHUTTER | - | - | - | - | - | - | - |
+| USE_ARILUX_RF | - | - | x | x | - | - | - |
+| USE_SHUTTER | - | - | x | x | - | - | - |
| USE_DEEPSLEEP | - | - | x | - | x | - | - |
| USE_EXS_DIMMER | - | - | x | x | - | - | - |
+| USE_DEVICE_GROUPS | - | - | x | - | - | - | - |
+| USE_PWM_DIMMER | - | - | x | x | - | - | - |
+| USE_KEELOQ | - | - | - | - | - | - | - |
+| USE_SONOFF_D1 | - | - | x | x | - | - | - |
| | | | | | | | |
| Feature or Sensor | minimal | lite | tasmota | knx | sensors | ir | display | Remarks
| USE_LIGHT | - | x | x | x | x | x | x |
@@ -50,6 +55,7 @@
| USE_SM16716 | - | - | x | x | x | - | x |
| USE_SM2135 | - | - | x | x | x | - | x |
| USE_SONOFF_L1 | - | - | x | x | x | - | x |
+| USE_ELECTRIQ_MOODL | - | - | x | x | x | - | x |
| | | | | | | | |
| USE_ENERGY_SENSOR | - | x | x | x | x | - | - |
| USE_PZEM004T | - | - | x | x | x | - | - |
@@ -61,6 +67,7 @@
| USE_DDS2382 | - | - | - | - | x | - | - |
| USE_DDSU666 | - | - | - | - | x | - | - |
| USE_SOLAX_X1 | - | - | - | - | - | - | - |
+| USE_LE01MR | - | - | - | - | - | - | - |
| | | | | | | | |
| USE_ADC_VCC | x | x | - | - | - | - | - |
| USE_COUNTER | - | - | x | x | x | x | x |
@@ -71,28 +78,27 @@
| | | | | | | | |
| Feature or Sensor | minimal | lite | tasmota | knx | sensors | ir | display | Remarks
| USE_I2C | - | - | x | x | x | - | x |
-| USE_SHT | - | - | x | x | x | - | x |
-| USE_HTU | - | - | x | x | x | - | x |
-| USE_BMP | - | - | x | x | x | - | x |
+| USE_SHT | - | - | - | - | x | - | - |
+| USE_HTU | - | - | - | - | x | - | - |
+| USE_BMP | - | - | - | - | x | - | - |
| USE_BME680 | - | - | - | - | x | - | - |
-| USE_BH1750 | - | - | x | x | x | - | x |
+| USE_BH1750 | - | - | - | - | x | - | - |
| USE_VEML6070 | - | - | - | - | x | - | - |
| USE_ADS1115 | - | - | - | - | x | - | - |
-| USE_ADS1115_I2CDEV | - | - | - | - | - | - | - |
| USE_INA219 | - | - | - | - | x | - | - |
| USE_INA226 | - | - | - | - | - | - | - |
-| USE_SHT3X | - | - | x | x | x | - | x |
+| USE_SHT3X | - | - | - | - | x | - | - |
| USE_TSL2561 | - | - | - | - | x | - | - |
| USE_TSL2591 | - | - | - | - | - | - | - |
| USE_MGS | - | - | - | - | x | - | - |
-| USE_SGP30 | - | - | x | x | x | - | x |
+| USE_SGP30 | - | - | - | - | x | - | - |
| USE_SI1145 | - | - | - | - | - | - | - |
-| USE_LM75AD | - | - | x | x | x | - | x |
+| USE_LM75AD | - | - | - | - | x | - | - |
| USE_APDS9960 | - | - | - | - | - | - | - |
| USE_MCP230xx | - | - | - | - | - | - | - |
| USE_PCA9685 | - | - | - | - | - | - | - |
| USE_MPR121 | - | - | - | - | - | - | - |
-| USE_CCS811 | - | - | - | - | - | - | - |
+| USE_CCS811 | - | - | - | - | x | - | - |
| USE_MPU6050 | - | - | - | - | - | - | - |
| USE_DS3231 | - | - | - | - | - | - | - |
| USE_MGC3130 | - | - | - | - | - | - | - |
@@ -107,13 +113,17 @@
| USE_PCF8574 | - | - | - | - | - | - | - |
| USE_HIH6 | - | - | - | - | x | - | - |
| USE_DHT12 | - | - | - | - | x | - | - |
+| USE_DS1624 | - | - | - | - | x | - | - |
+| USE_AHT1x | - | - | - | - | - | - | - |
+| USE_HDC1080 | - | - | - | - | - | - | - |
+| USE_WEMOS_MOTOR_V1 | - | - | - | - | x | - | - |
| | | | | | | | |
| Feature or Sensor | minimal | lite | tasmota | knx | sensors | ir | display | Remarks
| USE_SPI | - | - | - | - | - | - | x |
-| USE_MHZ19 | - | - | x | x | x | - | x |
-| USE_SENSEAIR | - | - | x | x | x | - | x |
-| USE_PMS5003 | - | - | x | x | x | - | x |
-| USE_NOVA_SDS | - | - | x | x | x | - | x |
+| USE_MHZ19 | - | - | - | - | x | - | - |
+| USE_SENSEAIR | - | - | - | - | x | - | - |
+| USE_PMS5003 | - | - | - | - | x | - | - |
+| USE_NOVA_SDS | - | - | - | - | x | - | - |
| USE_HPMA | - | - | - | - | x | - | - |
| USE_SERIAL_BRIDGE | - | - | x | x | x | - | x |
| USE_MP3_PLAYER | - | - | - | - | x | - | - |
@@ -122,15 +132,21 @@
| USE_RDM6300 | - | - | - | - | x | - | - |
| USE_IBEACON | - | - | - | - | x | - | - |
| USE_GPS | - | - | - | - | - | - | - |
+| USE_HM10 | - | - | - | - | x | - | - |
+| USE_HRXL | - | - | - | - | x | - | - |
+| | | | | | | | |
+| USE_NRF24 | - | - | - | - | - | - | - |
+| USE_MIBLE | - | - | - | - | - | - | - |
| USE_ZIGBEE | - | - | - | - | - | - | - |
| | | | | | | | |
| USE_IR_REMOTE | - | - | x | x | x | x | x |
| USE_IR_RECEIVE | - | - | x | x | x | x | x |
+| USE_IR_REMOTE_FULL | - | - | - | - | - | x | - | Enable ALL protocols
| | | | | | | | |
-| USE_SR04 | - | - | x | x | x | - | x |
+| USE_SR04 | - | - | - | - | x | - | - |
| USE_TM1638 | - | - | - | - | x | - | - |
-| USE_HX711 | - | - | x | x | x | - | x |
-| USE_TX20_WIND_SENSOR | - | - | - | - | x | - | - |
+| USE_HX711 | - | - | - | - | x | - | - |
+| USE_TX2x_WIND_SENSOR | - | - | - | - | - | - | - |
| USE_RC_SWITCH | - | - | - | - | x | - | - |
| USE_RF_SENSOR | - | - | - | - | x | - | - | AlectoV2 only
| USE_HRE | - | - | - | - | x | - | - |
@@ -148,4 +164,4 @@
| USE_DISPLAY_EPAPER_42 | - | - | - | - | - | - | x |
| USE_DISPLAY_ILI9488 | - | - | - | - | - | - | - |
| USE_DISPLAY_SSD1351 | - | - | - | - | - | - | - |
-| USE_DISPLAY_RA8876 | - | - | - | - | - | - | - |
\ No newline at end of file
+| USE_DISPLAY_RA8876 | - | - | - | - | - | - | - |
diff --git a/Device_Groups.md b/Device_Groups.md
new file mode 100644
index 000000000..40bca68a7
--- /dev/null
+++ b/Device_Groups.md
@@ -0,0 +1,43 @@
+# Device Groups
+
+The device groups module provides a framework to allow multiple devices to be in a group with values such as power, light color/temperature/brightness, PWM values, sensor values, etc. shared with other devices in the group. For example, with multiple light modules in a device group, the light settings can be changed on one module and the settings will automatically be changed on the other light modules. Dimmer switch modules could be in a device group with light modules and the dimmer switch could control the power, brightness and colors of all the lights in the group. Multiple dimmer switches could be in a device group to form a 3-way/4-way dimmer switch.
+
+UDP multicasts, followed by UDP unicasts if necessary, are used to send updates to all devices so updates are fast. There is no need for an MQTT server but all the devices in a group must be on the same IP network.
+
+To include device groups support in the build, define USE_DEVICE_GROUPS in your user_config_override. This adds 3.5K to the code size. All devices in a group must be running firmware with device group support and have device groups enabled.
+
+To enable device groups, execute the command SetOption85 1.
+
+
+## Device Groups Operation
+
+The device group name is the MQTT group topic set with the GroupTopic command. All devices in the same IP network with the same group topic are in the same group. Some modules may define additional device groups. For example, if Remote Device Mode is enabled, the PWM Dimmer module defines three devices groups.
+
+The items that are sent to the group and the items that are received from the group are selected with the DevGroupShare command. By default all items are sent and received from the group. An example of when the DevGroupShare command would be used is when you have a group of lights that you control with a dimmer switch and home automation software. You want the dimmer switch to be able to control all items. The home automation software controls each light individually. When it controls the whole group, it actually sends command to each light in the group. If you use the home automation software to turn an individual light on or off or change it’s brightness, color or scheme, you do not want the change to be replicated to the other lights. In this case, you would set the incoming and outgoing item masks to 0xffffffff (all items) on the dimmer switch (DevGroupShare 0xffffffff,0xffffffff) and set the incoming item mask to 0xffffffff and outgoing item mask to 0 on all the lights (DevGroupShare 0xffffffff,0).
+
+
+### Commands
+
+
+
+
+ Command
+
+ Parameters
+
+
+
+ DevGroupShare
+
+ <in>,<out> = set incoming and outgoing shared item mask (default = 0xffffffff,0xffffffff)
+1 = Power, 2 = Light brightness, 4 = Light fade/speed, 8 = Light scheme, 16 = Light color, 32 = Dimmer settings (presets)
+
+
+
+ GroupTopic<x>
+
+ 1 = reset device group <x> MQTT group topic to firmware default (MQTT_GRPTOPIC) and restart
+<value> = set device group <x> MQTT group topic (32 chars max) and restart
+
+
+
\ No newline at end of file
diff --git a/I2CDEVICES.md b/I2CDEVICES.md
index 6d0de4e1a..75c0a1a9a 100644
--- a/I2CDEVICES.md
+++ b/I2CDEVICES.md
@@ -62,4 +62,8 @@ Index | Define | Driver | Device | Address(es) | Description
39 | USE_DISPLAY_RA8876 | xdsp_10 | FT5316 | 0x38 | Touch panel controller
40 | USE_TSL2591 | xsns_57 | TLS2591 | 0x29 | Light intensity sensor
41 | USE_DHT12 | xsns_58 | DHT12 | 0x5C | Temperature and humidity sensor
-
+ 42 | USE_DS1624 | xsns_59 | DS1621 | 0x48 - 0x4F | Temperature sensor
+ 42 | USE_DS1624 | xsns_59 | DS1624 | 0x48 - 0x4F | Temperature sensor
+ 43 | USE_AHT1x | xsns_63 | AHT10/15 | 0x38 | Temperature and humidity sensor
+ 44 | USE_WEMOS_MOTOR_V1 | xdrv_34 | | 0x2D - 0x30 | WEMOS motor shield v1.0.0 (6612FNG)
+ 45 | USE_HDC1080 | xsns_65 | HDC1080 | 0x40 | Temperature and Humidity sensor
diff --git a/MODULES.md b/MODULES.md
index bb02bfe73..b47769998 100644
--- a/MODULES.md
+++ b/MODULES.md
@@ -76,5 +76,7 @@ Module | Description
70 Sonoff L1 | Sonoff L1 light strip
71 Sonoff iFan03 | Sonoff iFan03 Wifi Smart Ceiling Fan with Light
72 EXS Dimmer | EXS Wifi Dimmer v4
+73 PWM Dimmer | Martin Jerry/acenx/Tessan/NTONPOWER SD0x PWM Dimmer Switches
+74 Sonoff D1 | Sonoff D1 Wifi and RF Dimmer
-Over 600 additional devices are supported using [templates](TEMPLATES.md).
+Over 1000 additional devices are supported using [templates](TEMPLATES.md).
diff --git a/PWM_Dimmer.md b/PWM_Dimmer.md
new file mode 100644
index 000000000..7254a5da2
--- /dev/null
+++ b/PWM_Dimmer.md
@@ -0,0 +1,94 @@
+# PWM Dimmer
+
+The PWM Dimmer module adds support for Martin Jerry/acenx/Tessan/NTONPOWER SD0x PWM dimmer switches. The brightness of the load for these dimmers is controlled by a PWM GPIO pin. They typically have power, up and down buttons, a powered-on LED, five brightness LEDs and another status LED. Examples are:[ https://www.amazon.com/dp/B07FXYSVR1](https://www.amazon.com/dp/B07FXYSVR1),[ https://www.amazon.com/dp/B07V26Q3VD](https://www.amazon.com/dp/B07V26Q3VD),[ https://www.amazon.com/dp/B07K67D43J](https://www.amazon.com/dp/B07K67D43J),[ https://www.amazon.com/dp/B07TTGFWFM](https://www.amazon.com/dp/B07TTGFWFM)
+
+To include PWM dimmer support in the build, define USE_PWM_DIMMER in your user_config_override. This adds 4.5K to the code size. The light module is not required for PWM dimmer operation so you can #undef USE_LIGHT to reduce the firmware bin size.
+
+To enable PWM dimmer operation, select the PWM Dimmer module.
+
+
+## PWM Dimmer Operation
+
+Pressing and releasing the power button toggles the power on/off. If the toggle turns the power on, the load is returned to the last brightness it was adjusted to. If Fade is enabled, the load is faded on/off at the rate defined by the Speed setting.
+
+When the power is on, holding the down or up button decreases/increases the brightness. The brightness can also be changed using just the power button. When the power is on, holding the power button alternately increases or decreases the brightness. Initially, holding the power button increases the brightness. Releasing and then holding the power button again decreases the brightness.
+
+When the power is off, pressing and releasing the down or up button turns the power on at a temporary brightness of the low/high levels set by the DimmerPreset command. Turning the power on at the low preset can also be accomplished by holding the power button while the power is off. The dimmer presets are intended to enable quickly turning on a light to a dim or bright level without changing the normal desired brightness. Turning the power on to a preset does not change the brightness the load will be set to when the switch is turned on the next time. For example, if the light is on and you adjust the brightness to 80 and then turn the light off, when you turn it back on, the brightness will return to 80. If you turn the power off again and then press the down button, the light will be turned on with a brightness of the low preset. If you then turn the light off and on again, the brightness will return to 80.
+
+When the power is off, holding the down or up button publishes an MQTT EVENT command. The topic follows the format of the Full Topic with a prefix of Event (ex. cmnd/LightSwitch1/EVENT). The MQTT payload is Trigger#, where # is 1 if the down button is held or 2 if the up button is held. These triggers can be used in rules on remote devices (ON Event#Trigger1) or by automation software to trigger automations such as scene changes. For example, the Event topic Trigger1 payload could trigger the automation software to turn on the previous scene in a list and the Trigger2 payload could trigger the automation software to turn on the next scene in a list.
+
+If there are LED’s defined in the template, they are turned on to indicate the current brightness. More LEDs are turned on at higher brightnesses. The LedTimeout command enables/disables an LED timeout. If LED timeout is enabled, the LED’s turn off five seconds after the last change in brightness. Note that the lowest LED and the blue power LED are always on when the power is on. The LED timeout can also be enabled/disabled by holding the power button while tapping (pressing and releasing quickly) the down button.
+
+The LEDLink LED can be used as a nightlight/powered-off indicator. The PoweredOffLed command enables/disables turning the LEDLink LED on when the power is off. The powered-off indicator can also be enabled/disabled by holding the power button and tapping the up button.
+
+Holding the power button, tapping the down button and then tapping or holding the down or up button sends a device group message to set RGB lights in the device group to the previous/next fixed color. The command is sent/value is adjusted once every .5 seconds for as long as the button is held. The color sequence as defined by the Light module is red, green, blue, orange, light green, light blue, amber, cyan, purple, yellow, pink, white using RGB channels, white using CT channels.
+
+Holding the power button, tapping the up button and then tapping or holding the down or up button publishes an MQTT Event command. The command is sent/value is adjusted once every .5 seconds for as long as the button is held. The MQTT topic is as described above. The MQTT payload is Trigger#, where # is 3 if the down button is held or 4 if the up button is held.
+
+Holding the down or up button alone for over 10 seconds executes the WiFiConfig 2 command.
+
+Pressing and releasing any button publishes an MQTT TOGGLE command for the button. Holding a button publishes an MQTT HOLD command followed by an MQTT OFF command when the button is released.
+
+When Device Groups are enabled, the PWM Dimmer brightness presets are kept in sync across all switches in the group. The powered-off LED and LED timeout settings are specific to each switch. Changing them does not replicate the change to the other switches in the group.
+
+### Commands
+
+
+
+ Command
+
+ Parameters
+
+
+
+ BriPreset
+
+ <low>,<high> = set brightness low and high presets
+1..255 = set brightness preset
++ = increase brightness preset
+- = decrease brightness preset
+
+
+
+ SetOption86
+
+ Set brightness LED timeout
+0 = disable timeout (default)
+1 = enable timeout
+
+
+
+ SetOption87
+
+ Set powered-off LED (nightlight)
+0 = disable powered-off LED (default)
+1 = enable powered-off LED
+
+
+
+ SetOption88
+
+ Set remote device mode
+0 = disable remote device mode(default)
+1 = enable remote device mode
+
+
+
+
+
+
+### Remote Device Mode
+
+Remote device mode allows PWM Dimmer switches to control remote devices. With remote device mode enabled, each button controls a different device. Note that dimmer switches with toggle-style down/up buttons have limited functionality as remote device mode switches because you can not push the down and up buttons simultaneously.
+
+To include remote device mode support in the build, define USE_PWM_DIMMER_REMOTE in your user_config_override. Remote device mode support requires device group support so USE_DEVICE_GROUPS is automatically defined if USE_PWM_DIMMER_REMOTE is defined. Remote device mode support adds 0.7K to the code size in addition to the code size required for device groups support.
+
+To enable remote device mode, execute the command SetOption88 1 (the device will restart). Each remote device must be running firmware with device group support and have remote device support enabled. The remote devices do not need to be built with PWM dimmer support nor do they need to be switches.
+
+If a remote device is a PWM dimmer, the device acts like a 3-way dimmer switch would and may or may not have a load connected to it. It’s also possible to use a PWM dimmer switch without a load to act as a wall switch to control the power, brightness and color of one or more smart lights with Tasmota with device group support loaded on them.
+
+With remote device mode is enabled, button 1 is the power button for the local device while buttons 2 and 3 are the power buttons for remote devices. Group names for buttons 2 and 3 are set by the GroupTopic2 and GroupTopic3 commands respectively. Note that the button numbers are defined by the module template and can be in any physical order on the switch (button 1 can be defined as the top button, the middle button or the bottom button). Button combinations that publish MQTT Event commands use a topic in the format cmnd/%group-topic%/EVENT.
+
+Pressing and releasing a power button toggles the power on all devices in the group assigned to the button. When the power is on, holding the button alternately increases or decreases the brightness. When the power is off, holding the button turns the power on at a temporary brightness of the low level set by the BriPreset command.
+
+While holding a power button, the other two buttons act like the down and up buttons for the remote device. All the functions performed by the down and up buttons in non-remote device mode are available in remote device mode. While holding button 1, button 2 performs the functions of the down button and button 3 performs the functions of the up button. While holding button 2, button 1 performs the functions of the down button and button 3 performs the functions of the up button. While holding button 3, button 1 performs the functions of the down button and button 2 performs the functions of the up button.
diff --git a/README.md b/README.md
index 35abdb7e6..53f977ae2 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ In addition to the [release webpage](https://github.com/arendst/Tasmota/releases
## Development
-[](https://github.com/arendst/Tasmota)
+[](https://github.com/arendst/Tasmota)
[](http://thehackbox.org/tasmota/)
[](https://travis-ci.org/arendst/Tasmota)
@@ -124,7 +124,8 @@ People helping to keep the show on the road:
- reloxx13 for his [TasmoAdmin](https://github.com/reloxx13/TasmoAdmin) management tool
- Joachim Banzhaf for his TSL2561 library and driver
- Gijs Noorlander for his MHZ19, SenseAir and updated PubSubClient drivers
-- Emontnemery for his HomeAssistant Discovery concept and many code tuning tips
+- Erik Montnemery for his HomeAssistant Discovery concept and many code tuning tips
+- Federico Leoni for continued HomeAssistant Discovery support
- Aidan Mountford for his HSB support
- Daniel Ztolnai for his Serial Bridge implementation
- Gerhard Mutz for multiple sensor & display drivers, Sunrise/Sunset, and scripting
@@ -132,15 +133,18 @@ People helping to keep the show on the road:
- Adrian Scillato for his (security)fixes and implementing and maintaining KNX
- Gennaro Tortone for implementing and maintaining Eastron drivers
- Raymond Mouthaan for managing Wemos Wiki information
-- Norbert Richter for his decode-config.py tool
+- Norbert Richter for his [decode-config.py](https://github.com/tasmota/decode-config) tool
- Andre Thomas for providing [thehackbox](http://thehackbox.org/tasmota/) OTA support and daily development builds
- Joel Stein, digiblur and Shantur Rathore for their Tuya research and driver
-- Frogmore42 and Jason2866 for providing many issue answers
-- Blakadder for editing the wiki and providing template management
+- Frogmore42 for providing many issue answers
+- Jason2866 for platformio support and providing many issue answers
+- Blakadder for managing the new document site and providing template management
- Stephan Hadinger for refactoring light driver, enhancing HueEmulation and Zigbee support
- tmo for designing the official Tasmota logo
- Stefan Bode for his Shutter and Deep sleep drivers
-- Jacek Ziółkowski for his [TDM](https://github.com/jziolkowski/tdm) management tool
+- Jacek Ziółkowski for his [TDM](https://github.com/jziolkowski/tdm) management tool and [Tasmotizer](https://github.com/tasmota/tasmotizer) flashing tool
+- Christian Staars for NRF24L01 and HM-10 Bluetooth sensor support
+- Pail Diem for UDP Group communication support
- Many more providing Tips, Wips, Pocs, PRs and Donations
## License
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 578d145b9..811941f43 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -21,7 +21,7 @@ While fallback or downgrading is common practice it was never supported due to S
## Supported Core versions
-This release will be supported from ESP8266/Arduino library Core version **2.6.1** due to reported security and stability issues on previous Core version.
+This release will be supported from ESP8266/Arduino library Core version **2.6.3 + 372a3ec** due to reported security and stability issues on previous Core version. This will also support gzipped binaries.
Although it might still compile on previous Core versions all support will be removed in the near future.
@@ -35,11 +35,11 @@ For initial configuration this release supports Webserver based **WifiManager**
## Provided Binary Downloads
-The following binary downloads have been compiled with ESP8266/Arduino library core version **2.6.1**.
+The following binary downloads have been compiled with ESP8266/Arduino library core version **2.6.3 + 372a3ec**.
-- **tasmota.bin** = The Tasmota version with sensors. **RECOMMENDED RELEASE BINARY**
+- **tasmota.bin** = The Tasmota version with most drivers. **RECOMMENDED RELEASE BINARY**
- **tasmota-BG.bin** to **tasmota-TW.bin** = The Tasmota version in different languages.
-- **tasmota-lite.bin** = The Lite version without most sensors.
+- **tasmota-lite.bin** = The Lite version without most drivers and sensors.
- **tasmota-knx.bin** = The Knx version without some features but adds KNX support.
- **tasmota-sensors.bin** = The Sensors version adds more useful sensors.
- **tasmota-ir** = The InfraRed Receiver and transmitter version allowing all available protocols provided by library IRremoteESP8266 but without most other features.
@@ -52,16 +52,76 @@ The following binary downloads have been compiled with ESP8266/Arduino library c
## Changelog
-### Version 8.1.0 Doris
+### Version 8.2.0 Elliot
-- Change Settings text handling allowing variable length text within a total text pool of 699 characters
-- Change Smoother ``Fade`` using 100Hz instead of 20Hz animation (#7179)
-- Change number of rule ``Var``s and ``Mem``s from 5 to 16 (#4933)
-- Change number of ``FriendlyName``s from 4 to 8
-- Add commands ``WebButton1`` until ``WebButton16`` to support user defined GUI button text (#7166)
-- Add support for max 150 characters in most command parameter strings (#3686, #4754)
-- Add support for GPS as NTP server by Christian Baars and Adrian Scillato
-- Add support for ``AdcParam`` parameters to control ADC0 Moisture formula by Federico Leoni (#7309)
-- Add Zigbee coalesce sensor attributes into a single message
-- Add Zigbee better support for Xiaomi Double Switch and Xiaomi Vibration sensor
-- Add Deepsleep start delay based on Teleperiod if ``Teleperiod`` differs from 10 or 300
+- Change default my_user_config.h driver and sensor support removing most sensors and adding most drivers to tasmota.bin
+- Change DHT driver (#7468, #7717)
+- Change Lights: simplified gamma correction and 10 bits internal computation
+- Change commands ``Prefix``, ``Ssid``, ``StateText``, ``NTPServer``, and ``FriendlyName`` displaying all items
+- Change Zigbee command prefix from ``Zigbee*`` to ``Zb*``
+- Change MQTT message size with additional 200 characters
+- Change display of some date and time messages from "Wed Feb 19 10:45:12 2020" to "2020-02-19T10:45:12"
+- Change IRremoteESP8266 library updated to v2.7.4
+- Fix ``PowerDelta`` zero power detection (#7515)
+- Fix ``White`` added to light status (#7142)
+- Fix ``WakeUp `` ignores provided value (#7473)
+- Fix ``RGBWWTable`` ignored (#7572)
+- Fix commands ``Display`` and ``Counter`` from overruling command processing (#7322)
+- Fix Sonoff Bridge, Sc, L1, iFan03 and CSE7766 serial interface to forced speed, config and disable logging
+- Fix Improved fade linearity with gamma correction
+- Fix PWM flickering at low levels (#7415)
+- Fix LCD line and column positioning (#7387)
+- Fix Display handling of hexadecimal escape characters (#7387)
+- Fix exception 9 restart on log message in Ticker interrupt service routines NTP, Wemos and Hue emulation (#7496)
+- Fix Hass sensor discovery by Federico Leoni (#7582, #7548)
+- Fix MaxPower functionality (#7647)
+- Fix relation between Wifi RSSI and signal strength
+- Add command ``SetOption79 0/1`` to enable reset of counters at teleperiod time by Andre Thomas (#7355)
+- Add command ``SetOption82 0/1`` to limit the CT range for Alexa to 200..380
+- Add command ``SetOption84 0/1`` to send AWS IoT device shadow updates (alternative to retained)
+- Add commands ``SetOption85 0/1`` and ``DevGroupShare`` supporting UDP Group command using ``GroupTopic`` without MQTT by Paul Diem (#7790)
+- Add command ``SetOption86 0/1`` for PWM dimmer to turn brightness LED's off 5 seconds after last change
+- Add command ``SetOption87 0/1`` for PWM dimmer to turn red LED on when powered off
+- Add command ``SetOption88 0/1`` for PWM dimmer to let buttons control remote devices
+- Add command ``SetOption89 0/1`` for Zigbee distinct MQTT topics per device for SENSOR, allowing retained messages (#7835)
+- Add command ``ShutterButton `` to control shutter(s) by to-scho (#7403)
+- Add commands ``SwitchMode 8`` ToggleMulti, ``SwitchMode 9`` FollowMulti and ``SwitchMode 10`` FollowMultiInverted (#7522)
+- Add commands ``SwitchMode 11`` PushHoldMulti and ``SwitchMode 12`` PushHoldInverted (#7603)
+- Add commands ``SwitchMode 13`` PushOn and ``SwitchMode 14`` PushOnInverted (#7912)
+- Add command ``Buzzer -1`` for infinite mode and command ``Buzzer -2`` for following led mode (#7623)
+- Add command ``HumOffset -10.0 .. 10.0`` to set global humidity sensor offset (#7934)
+- Add support for ``AdcParam`` parameters to control ADC0 Current Transformer Apparent Power formula by Jodi Dillon (#7100)
+- Add optional parameter ```` to command ``Scheme , `` to control initial start color
+- Add web page sliders when ``SetOption37 128`` is active allowing control of white(s)
+- Add SerialConfig to ``Status 1``
+- Add BootCount Reset Time as BCResetTime to ``Status 1``
+- Add WifiPower to ``Status 5``
+- Add most SetOptions as defines to my_user_config.h
+- Add optional Wifi AccessPoint passphrase define WIFI_AP_PASSPHRASE in my_user_config.h (#7690)
+- Add SoftwareSerial to CSE7766 driver allowing different GPIOs (#7563)
+- Add rule trigger on one level deeper using syntax with two ``#`` like ``on zbreceived#vibration_sensor#aqaracubeside=0 do ...``
+- Add Zigbee attribute decoder for Xiaomi Aqara Cube
+- Add ``ZbZNPReceived``and ``ZbZCLReceived`` being published to MQTT when ``SetOption66 1``
+- Add Zigbee enhanced commands decoding, added ``ZbPing``
+- Add Zigbee features and improvements
+- Add Zigbee support for Hue emulation by Stefan Hadinger
+- Add HAss Discovery support for Button and Switch triggers by Federico Leoni (#7901)
+- Add Dew Point to Temperature and Humidity sensors
+- Add optional support for Prometheus using file xsns_91_prometheus.ino (#7216)
+- Add support for gzipped binaries
+- Add support for Romanian language translations by Augustin Marti
+- Add support for sensors DS18x20 and DHT family on Shelly 1 and Shelly 1PM using Shelly Add-On adapter (#7469)
+- Add support to BMP driver to enter reset state (sleep enable) when deep sleep is used in Tasmota
+- Add support for DS1624, DS1621 Temperature sensor by Leonid Myravjev
+- Add support for NRF24L01 as BLE-bridge for Mijia Bluetooth sensors by Christian Baars (#7394)
+- Add support for MI-BLE sensors using HM-10 Bluetooth 4.0 module by Christian Staars (#7683)
+- Add support for FiF LE-01MR energy meter by saper-2 (#7584)
+- Add support for Sensors AHT10 and AHT15 by Martin Wagner (#7596)
+- Add support for Wemos Motor Shield V1 by Denis Sborets (#7764)
+- Add support for La Crosse TX23 Anemometer by Norbert Richter (#3146, #7765)
+- Add support for Martin Jerry/acenx/Tessan/NTONPOWER SD0x PWM dimmer switches by Paul Diem (#7791)
+- Add support for UDP Group control without MQTT by Paul Diem (#7790)
+- Add support for Jarolift rollers by Keeloq algorithm
+- Add support for MaxBotix HRXL-MaxSonar ultrasonic range finders by Jon Little (#7814)
+- Add support for HDC1080 Temperature and Humidity sensor by Luis Teixeira (#7888)
+- Add support for ElectriQ iQ-wifiMOODL RGBW light by Ian King (#7947)
diff --git a/TEMPLATES.md b/TEMPLATES.md
index 2cb5b4773..e34fb2ea5 100644
--- a/TEMPLATES.md
+++ b/TEMPLATES.md
@@ -2,612 +2,1177 @@
# Templates
-Find below the available templates as of October 22nd, 2019. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates)
+Find below the available templates as of March 2020. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates)
-## Bulb
+## Aromatherapy Diffuser
```
-A19 RGBW 8W E26 {"NAME":"OOOLED 60W RGB","GPIO":[255,255,255,255,39,40,255,255,37,255,38,255,255],"FLAG":1,"BASE":18}
-Aisirer 9W A19 E26 {"NAME":"AISIRER E26","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
-Anoopsyche CW/WW 60W {"NAME":"Anoop-CW-WW","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18}
-Aoycocr A19 {"NAME":"AoycocrA19","GPIO":[0,0,0,0,0,39,0,0,38,0,37,40,0],"FLAG":0,"BASE":18}
-Arlec GLD112HA {"NAME":"Arlec CCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":48}
-Arlec GLD122HA {"NAME":"Arlec RGBWW","GPIO":[255,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18}
-Ausein E14 7W White {"NAME":"Tuya RGBW","GPIO":[255,255,255,255,40,255,255,255,38,39,37,255,255],"FLAG":0,"BASE":18}
-Avatar 5W E14 {"NAME":"AVATAR","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
-BNeta A60 E27 {"NAME":"OM60/RGBW","GPIO":[255,255,255,255,140,37,0,0,38,142,141,255,255],"FLAG":0,"BASE":18}
-BNeta GU10 RGB {"NAME":"BNeta","GPIO":[255,255,255,255,140,37,0,0,38,142,141,255,255],"FLAG":0,"BASE":18}
-Bomcosy 7W E27 RGB CW {"NAME":"Generic","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":1,"BASE":18}
-Brilliant 20741 {"NAME":"Brilliant RGB+","GPIO":[255,255,255,255,37,40,255,255,38,0,39,0,0],"FLAG":0,"BASE":18}
-Brilliant HK17653S72 {"NAME":"Brilliant E14 ","GPIO":[255,255,255,255,37,40,255,255,38,255,39,255,255],"FLAG":0,"BASE":18}
-Candle 6W E14/E27 RGBWW {"NAME":"E14_RGBWW_6W","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":0,"BASE":20}
-DGM L-WT9W1 {"NAME":"DGM L-WT9W1","GPIO":[0,0,0,0,140,142,0,0,38,37,141,0,0],"FLAG":0,"BASE":18}
-electriQ RGBW B22 {"NAME":"ElectricQ B22","GPIO":[255,255,255,255,37,41,255,255,38,40,39,255,255],"FLAG":0,"BASE":18}
-EleLight 7W A19 E27 RGBW {"NAME":"EleLight 7wA19","GPIO":[255,255,255,255,140,37,255,255,255,142,141,255,255],"FLAG":0,"BASE":18}
-Esicoo 9W E26 {"NAME":"Esicoo Bulb","GPIO":[0,0,0,0,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
-Fcmila 7W RGBW E27 {"NAME":"FCMILA 7W","GPIO":[255,255,255,255,39,40,255,255,37,255,38,255,255],"FLAG":0,"BASE":18}
-Fcmila EQ723 {"NAME":"FCMILA LED E27","GPIO":[255,255,255,255,40,255,255,255,38,39,37,255,255],"FLAG":0,"BASE":18}
-Fcmila FC-12W {"NAME":"SYF05","GPIO":[255,0,255,0,140,37,0,0,255,255,141,0,255],"FLAG":1,"BASE":69}
-Feit Electric BPA800/RGBW/AG/2 {"NAME":" BPA800/RGBW","GPIO":[255,255,255,255,37,38,255,255,141,142,140,255,255],"FLAG":0,"BASE":48}
-Feit Electric BR30/927CA/AG {"NAME":"Feit BR30 WW","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
-Feit Electric BR30/950CA/AG {"NAME":"Feit BR30 CW","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
-Feit Electric OM60/927CA/AG {"NAME":" Feit P_A800_2","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
-Feit Electric OM60/RGBW/CA/AG {"NAME":"OM60/RGBW","GPIO":[255,255,255,255,140,37,0,0,38,142,141,255,255],"FLAG":0,"BASE":18}
-Geeni Lux A21 White {"NAME":"Geeni-1050-WW","GPIO":[0,0,0,0,37,37,0,0,38,0,0,0,0],"FLAG":1,"BASE":18}
-Generic 10W E26/E27 RGBW {"NAME":"10W E27 RGBW","GPIO":[0,0,0,0,0,39,0,0,38,0,37,40,0],"FLAG":0,"BASE":18}
-Globe CW/WW {"NAME":"Globe CW/WW","GPIO":[0,0,0,0,38,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
-Globe RGBW {"NAME":"GlobeRGBWW","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
-Gosund E27 8W RGBW {"NAME":"Gosund RGB+W","GPIO":[255,255,255,255,40,255,255,255,37,38,39,255,255],"FLAG":0,"BASE":18}
-Jomarto 9W B22 {"NAME":"Jomarto Wifi S","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":1,"BASE":18}
-Kainsy 7W E27 RGBW {"NAME":"KAINSY","GPIO":[17,255,255,255,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
-Kogan SmarterHome™ White 10W B22 {"NAME":"Kogan White/Wa","GPIO":[0,0,0,0,37,40,0,0,41,38,39,0,0],"FLAG":0,"BASE":18}
-Kohree A19 7W {"NAME":"Kohree VHP560","GPIO":[255,255,255,255,37,41,255,255,38,40,39,255,255],"FLAG":0,"BASE":18}
-LE A19 RGBCT 9W E26 {"NAME":"LE RGBWW 60W","GPIO":[255,0,255,0,140,37,0,0,38,142,141,0,255],"FLAG":1,"BASE":18}
-Legelite E26 {"NAME":"Legelite E26","GPIO":[255,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18}
-Linganzh LWE3 6W RGBW {"NAME":"Linganzh LWE3 ","GPIO":[255,255,255,255,255,38,255,255,39,255,40,37,255],"FLAG":0,"BASE":18}
-Lohas 5W E12 {"NAME":"LH-5W-ZN01204","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
-Lohas 9W E26 RGBW {"NAME":"Lohas RGBW","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":18}
-Lohas A19 RGBW E12 {"NAME":"Lohas","GPIO":[17,255,255,255,0,0,0,0,0,143,0,144,0],"FLAG":1,"BASE":26}
-Lohas E14 R50 {"NAME":"Lohas E14 R50","GPIO":[17,255,255,255,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
-Lohas ZN031 {"NAME":"Lohas ZN031","GPIO":[255,255,255,255,38,37,255,255,41,39,40,255,255],"FLAG":0,"BASE":18}
-LSC Smart Connect Multicolor Spot GU10 {"NAME":"LSC RGBCW LED","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18}
-LSC Smart Connect Smart Filament LED {"NAME":"LSC-Filam-Big","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
-Lumiman E27 Multicolor {"NAME":"Lumiman RGB","GPIO":[255,255,255,255,37,40,255,255,38,41,39,52,255],"FLAG":1,"BASE":18}
-Lumiman LM530 E26 {"NAME":"Lumiman LM530","GPIO":[255,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":1,"BASE":18}
-Lumiman LM650 {"NAME":"Legelite E26","GPIO":[255,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18}
-Luminea ZX-2831 E27 CCT {"NAME":"Luminea CCT","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
-Luminea ZX-2832 E27 RGBW {"NAME":"Luminea RGBW","GPIO":[255,255,255,255,140,37,255,255,38,142,141,255,255],"FLAG":1,"BASE":18}
-Lyasi PT-BW09 {"NAME":"Lyasi PT-BW09","GPIO":[17,255,255,255,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
-Maxcio YX-L01P-E7 {"NAME":"Maxcio YXL01P","GPIO":[17,255,255,255,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
-Merkury A19 60W {"NAME":"MI-BW902-999W","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
-Merkury A21 75W {"NAME":"MI-BW904-999W","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":1,"BASE":69}
-Merkury BR30 65W {"NAME":"MI-BW905-999W","GPIO":[0,0,0,0,37,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
-Mirabella Genio CW {"NAME":"GenioBulbCW","GPIO":[0,0,0,0,38,37,0,0,0,40,39,0,0],"FLAG":0,"BASE":18}
-Mirabella Genio Dimmable {"NAME":"GenioBulbCCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18}
-Mirabella Genio RGBW {"NAME":"GenioBulbRGB","GPIO":[255,255,255,255,37,40,255,255,38,255,39,255,255],"FLAG":1,"BASE":18}
-Mixigoo 10W E27 RGBW {"NAME":"Mixigoo Bulb","GPIO":[255,255,255,255,41,38,255,255,39,255,37,40,255],"FLAG":0,"BASE":18}
-MOKO YX-L01C-E27 {"NAME":"MOKO","GPIO":[17,255,255,255,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
-Nedis WIFILC10WTE27 {"NAME":"Nedis RGBW","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":1,"BASE":18}
-Nedis WIFILW10WTE27 {"NAME":"WIFILW10WTE27","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
-NiteBird TT-WB4 {"NAME":"NiteBird TT-WB","GPIO":[255,255,255,255,40,255,255,255,37,38,39,255,255],"FLAG":0,"BASE":18}
-Novostella 12W RGBCT E27 {"NAME":"Novostella","GPIO":[255,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18}
-Novostella B22 7W {"NAME":"Novostella B22","GPIO":[255,255,255,255,37,41,255,255,38,40,39,255,255],"FLAG":0,"BASE":18}
-Oobest RGBW E27 {"NAME":"WifiBulb","GPIO":[0,0,0,0,0,37,0,0,39,40,38,0,0],"FLAG":1,"BASE":18}
-Oobest ZN93028 11W E27 RGB {"NAME":"RGB Bulb 11W","GPIO":[255,255,255,255,40,255,255,255,38,39,37,255,255],"FLAG":1,"BASE":18}
-Reafoo 9W A26 {"NAME":"ReaFooE26","GPIO":[0,0,0,0,41,38,0,0,39,0,40,37,0],"FLAG":0,"BASE":18}
-RGBW 7W B22 {"NAME":"SM16716","GPIO":[255,255,255,255,140,37,255,255,255,255,141,255,255],"FLAG":0,"BASE":18}
-RGBW 7W E14 {"NAME":"7W-E14-RGBW-La","GPIO":[255,255,255,255,38,37,255,255,39,255,40,255,255],"FLAG":0,"BASE":18}
-Solimo 12W B22 RGBWW {"NAME":"Solimo RGBWW12","GPIO":[255,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18}
-Solimo 9W B22 RGBWW {"NAME":"Solimo RGBWW 9","GPIO":[255,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18}
-Sonoff B1 (R2) {"NAME":"Sonoff B1","GPIO":[17,255,255,255,0,0,0,0,143,0,144,0,0],"FLAG":0,"BASE":26}
-TCP B22 RGBW {"NAME":"TCP Smart RGBW","GPIO":[255,255,255,255,140,37,0,0,38,142,141,255,255],"FLAG":0,"BASE":18}
-Teckin SB50 {"NAME":"Teckin SB50","GPIO":[255,255,255,255,40,255,255,255,38,39,37,255,255],"FLAG":0,"BASE":18}
-Teckin SB50 v2 {"NAME":"Teckin SB50","GPIO":[255,255,255,255,37,255,255,255,38,40,39,255,255],"FLAG":0,"BASE":18}
-Teckin SB50 V3 {"NAME":"Teckin SB50v3","GPIO":[255,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18}
-Teckin SB51 {"NAME":"Teckin SB51","GPIO":[255,255,255,255,40,255,255,255,38,39,37,255,255],"FLAG":0,"BASE":18}
-Teckin SB53 {"NAME":"Teckin SB53","GPIO":[255,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18}
-TikLOk 7.5W A19 E26 {"NAME":"TikLOk WW-CW-L","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
-Wipro Garnet B22 9W {"NAME":"WiproSmartBulb","GPIO":[255,255,255,255,37,41,255,255,38,40,39,255,255],"FLAG":0,"BASE":18}
-Woopower RGBW E14 5W {"NAME":"Woopower E14","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
-Xiaomi Phillips E14 {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,38,0,0,37,0],"FLAG":0,"BASE":48}
-Xiaomi Phillips E27 {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,38,0,0,37,0],"FLAG":0,"BASE":48}
-XMRJ {"NAME":"XMRJ","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
-ZZHXON 6W E14/E27 {"NAME":"E27_RGB_Bulb","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+Asakuki 500ml {"NAME":"Oil Diffuser","GPIO":[255,255,255,255,255,255,0,0,255,255,255,21,22],"FLAG":0,"BASE":18}
+Essential Oil 400ml {"NAME":"XD800W","GPIO":[255,255,255,255,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
+GD-30W 300ml {"NAME":"GD-30W","GPIO":[255,255,255,255,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
+Maxcio 400ml {"NAME":"MaxcioDiffuser","GPIO":[255,255,255,255,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
+Mirabella Genio Glass Aroma Diffuser 250ml {"NAME":"Genio Diffuser","GPIO":[0,0,0,0,37,38,0,0,0,160,22,39,21],"FLAG":15,"BASE":18}
+Wood Grain 550ML {"NAME":"MY-KCL01800FB","GPIO":[255,255,255,255,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
+```
+
+## Bulb CCT
+```
+AICase 800lm {"NAME":"AICase Smart L","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18}
+Ajax Online 380lm {"NAME":"AjaxOnline","GPIO":[17,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":38}
+Ajax Online 7W Vintage {"NAME":"AjaxOnline-7W","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+Anoopsyche 9W 800lm {"NAME":"Anoop-CW-WW","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18}
+Arlec GLD112HA 806lm {"NAME":"Arlec CCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":48}
+BrilliantSmart 20696 9W 900lm {"NAME":"Brilliant20696","GPIO":[0,0,0,0,0,0,0,0,37,0,38,0,0],"FLAG":0,"BASE":48}
+BrilliantSmart 20697 9W 900lm {"NAME":"Brilliant20699","GPIO":[0,0,0,0,0,0,0,0,37,0,38,0,0],"FLAG":0,"BASE":48}
+Bulbrite Solana A19 Edison Filament {"NAME":"BulbBrite01","GPIO":[0,0,0,0,0,0,0,0,37,0,38,0,0],"FLAG":0,"BASE":18}
+Calex 429036 G125 1055lm {"NAME":"Calex G125 E27","GPIO":[0,0,0,0,0,140,0,0,38,0,37,142,141],"FLAG":0,"BASE":18}
+Deltaco SH-LE14W 470lm {"NAME":"SH-LE14W","GPIO":[0,0,0,0,0,140,0,0,38,0,37,142,141],"FLAG":0,"BASE":18}
+Deltaco SH-LE27W 810lm {"NAME":"SH-LE27W","GPIO":[0,0,0,0,0,140,0,0,38,0,37,142,141],"FLAG":0,"BASE":18}
+DGM L-WT9W1 800lm {"NAME":"DGM L-WT9W1","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
+DORESshop A60 720lm Filament {"NAME":"DORESshop-A60","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+Energizer A19 10W {"NAME":"Energizer CCT ","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
+Geeni LUX 1050lm {"NAME":"Geeni-1050-WW","GPIO":[0,0,0,0,37,37,0,0,38,0,0,0,0],"FLAG":1,"BASE":18}
+Globe 34919 ST19 Edison 500lm {"NAME":"Globe 34919","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+Hama 176550 806lm {"NAME":"Hama Bulb xW","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18}
+Hykker SL-0392 650lm {"NAME":"Hykker 7W","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
+Iotton 9W 700lm {"NAME":"Iotton Light","GPIO":[0,0,0,0,37,38,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Kogan 10W Cool & Warm White 1050lm {"NAME":"Kogan White/Wa","GPIO":[0,0,0,0,37,40,0,0,41,38,39,0,0],"FLAG":0,"BASE":18}
+LE LampUX 4.5W 410lm {"NAME":"LE LampUX","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":48}
+ledscom.de 4.5W 430lm {"NAME":"GX53","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":0}
+Lohas ZN070 720lm {"NAME":"Lohas ZN070","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+Lumiman A19 7.5W 800lm {"NAME":"Lumiman LM520","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
+Luminea ZX-2831 {"NAME":"Luminea CCT","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Merkury MI-BW905-999W 700lm {"NAME":"MI-BW905-999W","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
+Mimoodz 1050lm {"NAME":"ID Components","GPIO":[0,0,0,0,21,22,0,0,23,24,25,26,27],"FLAG":0,"BASE":18}
+Mirabella Genio 1002336 800lm {"NAME":"GenioBulbCCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio 1002337 800lm {"NAME":"GenioBulbCCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio 9W 800lm {"NAME":"GenioBulbCCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio I002745 SES 470lm {"NAME":"Mirabella Candle","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio I002746 500lm {"NAME":"GenioGU10","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio I002747 G95 470lm {"NAME":"Genio Filament","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+Nedis A60 800lm {"NAME":"WIFILW10WTE27","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
+Nedis C10 350lm {"NAME":"WIFILW10WTE14","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18}
+Nedis PAR16 330lm {"NAME":"Nedis WIFILW30","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
+Philips Zhirui Candle 250lm {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,38,0,0,37,0],"FLAG":0,"BASE":48}
+Phillips Zhirui 450lm {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,38,0,0,37,0],"FLAG":0,"BASE":48}
+Swisstone SH 330 806lm {"NAME":"SwisstoneSH330","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Wipro Garnet NS9100 810lm {"NAME":"WiproSmartBulb","GPIO":[0,0,0,0,38,38,0,0,37,37,0,0,0],"FLAG":0,"BASE":18}
+Wyze WLPA19 A19 800lm {"NAME":"Wyze Bulb","GPIO":[0,0,0,0,0,0,0,0,0,37,47,0,0],"FLAG":0,"BASE":48}
+```
+
+## Bulb Cold White
+```
+Feit Electric BR30/950CA/AG 650lm {"NAME":"Feit BR30 CW","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+KMC 70113 A19 7.5W {"NAME":"Generic","GPIO":[0,0,0,0,0,0,37,38,0,0,0,0,0],"FLAG":15,"BASE":18}
+Lohas LZN127 G25 800lm {"NAME":"Lohas Globe","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18}
+Lohas ZN014 550lm {"NAME":"Lohas MR16","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+Lohas ZN124 980lm {"NAME":"Lohas LH-ZN124","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio 1002334 800lm {"NAME":"GenioBulbCW","GPIO":[0,0,0,0,38,37,0,0,0,40,39,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio A70 1400lm {"NAME":"GenioB_CW2744","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+```
+
+## Bulb Red Green Blue
+```
+Deltaco SH-LE27RGB 810lm {"NAME":"SH-LE27RGB","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Halonix Prime Prizm 12W {"NAME":"Halonix Prizm ","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Jomarto 9W {"NAME":"Jomarto Wifi S","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":1,"BASE":18}
+Lyasi PT-BW09 {"NAME":"Lyasi PT-BW09","GPIO":[17,0,0,0,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
+MoKo YX-L01C-E27 810lm {"NAME":"MOKO","GPIO":[17,0,0,0,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
+muvit IO miobulb001 600lm {"NAME":"miobulb001","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":15,"BASE":18}
+Oobest ZN93028 11W {"NAME":"RGB Bulb 11W","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":1,"BASE":18}
+Wipro Garnet NS7001 480lm {"NAME":"WiproSmartBulb","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+```
+
+## Bulb Red Green Blue CCT
+```
+Aigital LE13 800lm {"NAME":"Aigital 9W RGB","GPIO":[0,0,0,0,41,38,0,0,39,0,40,37,0],"FLAG":0,"BASE":18}
+Alfawise LE12 9W 900LM {"NAME":"Alfawise LE12 ","GPIO":[0,0,0,0,41,38,0,0,39,0,40,37,0],"FLAG":0,"BASE":18}
+Aoycocr JL81 5W 400lm {"NAME":"AoycocrJLB1","GPIO":[0,0,0,0,39,0,0,0,38,41,37,40,0],"FLAG":0,"BASE":18}
+Aoycocr Q0 750lm {"NAME":"AoycocrA19","GPIO":[0,0,0,0,0,39,0,0,38,0,37,40,0],"FLAG":0,"BASE":18}
+Aoycocr Q10CWM 720lm {"NAME":"AoycocrBR30","GPIO":[0,0,0,0,0,39,0,0,38,0,37,40,0],"FLAG":0,"BASE":18}
+Arlec GLD122HA 806lm {"NAME":"Arlec RGBWW","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Aunics 7W 600lm {"NAME":"Aunics RGBW","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Avatar ALB201W 720lm {"NAME":"AVATAR ALB201W","GPIO":[0,0,0,0,0,39,0,0,38,0,37,40,0],"FLAG":0,"BASE":18}
+Avatar ALS18L A60 800lm {"NAME":"Avatar E14 7W","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":20}
+B.K.Licht BKL1253 9W 806lm {"NAME":"BKL1253","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Bakibo TB95 9W 1000lm {"NAME":"Bakibo A19 9W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+BlitzWolf BW-LT27 w/ remote 850lm {"NAME":"BW-LT27","GPIO":[0,0,0,0,41,38,0,0,39,51,40,37,0],"FLAG":0,"BASE":18}
+BNeta IO-WIFI60-E27P 800lm {"NAME":"OM60/RGBW","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Bomcosy 600lm {"NAME":"Generic","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":1,"BASE":18}
+Calex 429002 Reflector 350lm {"NAME":"Calex RGBW","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18}
+Calex 429004 A60 806lm {"NAME":"Calex E27 RGB ","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Cleverio 51395 806lm {"NAME":"CleverioE27RGB","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+CMARS 4W Reflector {"NAME":"RGBWW GU10","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":15,"BASE":18}
+Dogain 320lm {"NAME":"DOGAIN","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+Emuni TB95 9W 850Lm {"NAME":"TB95","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Ener-J SHA5262 800lm {"NAME":"ENER-J RGBWWW ","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+Euri Lighting LIS-A1001 800lm {"NAME":"Euri Lighting ","GPIO":[0,0,0,0,37,40,0,0,38,41,39,37,0],"FLAG":0,"BASE":18}
+EXUP C37 5W {"NAME":"EXUP","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":15,"BASE":18}
+Feit Electric BPA800/RGBW/AG/2 800lm {"NAME":" BPA800/RGBW/AG/2","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Feit Electric BPA800/RGBW/AG/2(P) 800lm {"NAME":" BPA800/RGBW/AG/2P","GPIO":[0,0,0,0,37,38,0,0,141,142,140,0,0],"FLAG":0,"BASE":48}
+Feit Electric OM100/RGBW/CA/AG 1600lm {"NAME":"OM100/RGBWW","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Feit Electric OM60/RGBW/15K/AG 800lm {"NAME":"FE-OM60-15K-AG","GPIO":[0,0,0,0,141,140,0,0,37,142,38,0,0],"FLAG":0,"BASE":18}
+Feit Electric OM60/RGBW/CA/AG 800lm {"NAME":"OM60/RGBW","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Fulighture 9W 810lm {"NAME":"Fulighture 9W","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Geeni Prisma Plus 800lm {"NAME":"Geeni Prisma P","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Globe 34207 800lm {"NAME":"GlobeRGBWW","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Jeeo TF-QPZ13 800lm {"NAME":"Jeeo","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Julun JL-021 5W Candle {"NAME":"E14 RGBCCT","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+Kohree 600lm {"NAME":"Kohree VHP560","GPIO":[0,0,0,0,37,41,0,0,38,40,39,0,0],"FLAG":0,"BASE":18}
+LE lampUX A19 850lm {"NAME":"LE RGBWW 60W","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":1,"BASE":18}
+Ledmundo 6W 600lm {"NAME":"LEDMUNDO 6W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Legelite 5W Candle {"NAME":"Legelite E12","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Legelite A60 7W {"NAME":"Legelite A60 7","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Legelite A60 7W 600lm {"NAME":"Legelite E26","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Lohas ZN031 650lm {"NAME":"Lohas ZN031","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Lohas ZN033 810lm {"NAME":"Lohas RGBWW","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Lohas ZN036 900 lm {"NAME":"Lohas RGBCCT","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Lohas ZN037 450lm {"NAME":"Lohas LH-ZN037","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":20}
+Lumary 9W 800lm {"NAME":"Lumary / iLint","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+LVWIT A60 8.5W 806lm {"NAME":"LVWIT A60 8.5W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+LVWIT A70 12W 1521lm {"NAME":"LVWIT A70 12W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Novostella HM-LB09 13W 1300lm {"NAME":"Novostella 13W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Novostella NTB10 9W 900lm {"NAME":"NTB10","GPIO":[0,0,0,0,41,38,0,0,39,0,40,37,0],"FLAG":0,"BASE":18}
+Novostella UT55505 7W 600lm {"NAME":"Novostella B22","GPIO":[0,0,0,0,37,41,0,0,38,40,39,0,0],"FLAG":0,"BASE":18}
+Novostella UT55508 12W 1150lm {"NAME":"Novostella","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Novostella UT55509 13W 1300lm {"NAME":"Novostella 13W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Ohlux A19 7W 600lm {"NAME":"OHLUX","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Ohlux BR30 10W 900lm {"NAME":"OHLUX","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Powertech SL225X 800lm {"NAME":"Jaycar SL225X","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Qualitel ALS08L 1100lm {"NAME":"Qualitel ALS08","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Reafoo A26 9W {"NAME":"ReaFooE26","GPIO":[0,0,0,0,41,38,0,0,39,0,40,37,0],"FLAG":0,"BASE":18}
+RYE 5W 450LM Candle {"NAME":"RYE Candlebra","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Saudio A19 7W 700lm {"NAME":"X002BU0DOL","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Slitinto TB95 9W 1000lm {"NAME":"Slitinto 9W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Sonoff B1 (R2) {"NAME":"Sonoff B1","GPIO":[17,0,0,0,0,0,0,0,143,0,144,0,0],"FLAG":0,"BASE":26}
+Sunco G25 5W 450lm {"NAME":"Sunco G25","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Sunco PAR20 5W 400lm {"NAME":"Sunco PAR20","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Teckin SB50-2 800lm {"NAME":"Teckin SB50v3","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Teckin SB53 1300lm {"NAME":"Teckin SB53","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+V-Tac VT-5164 400lm {"NAME":"V-TAC VT5164","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18}
+Wipro Garnet NS9001 810lm {"NAME":"WiproSmartBulb","GPIO":[0,0,0,0,37,41,0,0,38,40,39,0,0],"FLAG":0,"BASE":18}
+ZZHXON 600lm {"NAME":"E27_RGB_Bulb","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+```
+
+## Bulb Red Green Blue White
+```
+3Stone EBE-QPW36 1050lm {"NAME":"3STONE","GPIO":[0,0,0,0,141,140,0,0,37,142,0,0,0],"FLAG":15,"BASE":18}
+Accewit 7W 650lm {"NAME":"Accewit Bulb","GPIO":[0,0,0,0,0,38,0,0,39,0,40,37,0],"FLAG":0,"BASE":18}
+Aisirer 7W 580lm {"NAME":"Aisirer RGBW","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Aisirer 7W 580lm {"NAME":"Aisirer RGBW","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+AL Above Lights 810lm {"NAME":"AL 810LM","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Aoycocr Q3CM 230lm {"NAME":"Aoycocr_GU10","GPIO":[0,0,0,0,0,0,0,0,143,0,144,0,0],"FLAG":0,"BASE":27}
+Avatar ALS08L A19 910lm {"NAME":"Avatar E27 7W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":20}
+Avatar ALS09L A60 900lm {"NAME":"Avatar E14 9W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":20}
+Avatar ALS11L PAR16 500lm {"NAME":"Avatar_GU10","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
+AWOW A60 9W 800lm {"NAME":"AWOW 9W RGBW","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Axtee AI-003 A19 700lm {"NAME":"Axtee E26 7W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":20}
+Bawoo EUWL122130 925lm {"NAME":"Bawoo","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":0,"BASE":18}
+BlitzWolf BW-LT21 900lm {"NAME":"BlitzWolf LT21","GPIO":[0,0,0,0,41,39,0,0,38,0,37,40,0],"FLAG":0,"BASE":18}
+BNeta IO-WIFI-GU10 380lm {"NAME":"BNeta","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+BriHome 6,5W 500lm {"NAME":"BRI E27 6,5W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":20}
+Brilliant HK17653S72 350lm {"NAME":"HK17653S72","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+BrilliantSmart 20698 9W 800lm {"NAME":"Brilliant20698","GPIO":[0,0,0,0,141,140,0,0,37,142,0,0,0],"FLAG":0,"BASE":18}
+BrilliantSmart 20699 9W 800lm {"NAME":"Brilliant20699","GPIO":[0,0,0,0,141,140,0,0,37,142,0,0,0],"FLAG":0,"BASE":18}
+BrilliantSmart 20741 9W 750lm {"NAME":"Brilliant RGB+","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+BrizLabs A19 9W 806LM {"NAME":"TCP Smart RGBW","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+BrizLabs Candle 4,5W 350lm {"NAME":"BrizLabs RGBW","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Brizlabs EBE-LZW10 350Lm {"NAME":"Brizlabs E14","GPIO":[0,0,0,0,141,140,0,0,37,142,0,0,0],"FLAG":15,"BASE":18}
+BrizLabs EBE-SHW03 380lm {"NAME":"BrizLabs","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":0,"BASE":18}
+BTZ1 {"NAME":"WifiBulb","GPIO":[0,0,0,0,0,37,0,0,39,40,38,0,0],"FLAG":0,"BASE":18}
+Calex 429008 B35 5W 470lm {"NAME":"Calex E14 RGBW","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18}
+Cleverio 51398 370lm {"NAME":"CleverioGU10","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Cocoon DY180363-B 800lm {"NAME":"Cocoon RGBW","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+electriQ 600lm {"NAME":"ElectricQ B22","GPIO":[0,0,0,0,37,41,0,0,38,40,39,0,0],"FLAG":0,"BASE":18}
+EleLight 350lm {"NAME":"EleLight 7wA19","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":0,"BASE":18}
+Esicoo 810lm {"NAME":"Esicoo Bulb","GPIO":[0,0,0,0,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
+Fcmila 10W {"NAME":"FCMILA LED E27","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+Fcmila 7W {"NAME":"FCMILA E27 0.1","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Fcmila Spotlight 460lm {"NAME":"Fcmila LED 6W","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+Feit Electric BR30/RGBW/CA/AG 650lm {"NAME":"BR30/RGBW","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Fulighture A60 810lm {"NAME":"Fulighture A60","GPIO":[0,0,0,0,38,37,0,0,0,39,40,0,0],"FLAG":0,"BASE":18}
+Geeni Prisma 1050lm {"NAME":"Geeni 1050 RGB","GPIO":[37,0,0,0,140,38,0,0,0,142,141,0,0],"FLAG":0,"BASE":18}
+Generic 10W {"NAME":"10W E27 RGBW","GPIO":[0,0,0,0,0,39,0,0,38,0,37,40,0],"FLAG":0,"BASE":18}
+Generic GU10 5W 450lm {"NAME":"RGBCW GU10","GPIO":[0,255,0,255,40,0,0,0,38,39,37,0,0],"FLAG":0,"BASE":3}
+Gosund WB3 8W 800lm {"NAME":"Gosund WB3","GPIO":[0,0,0,0,40,0,0,0,37,38,39,0,0],"FLAG":0,"BASE":18}
+Hama 176531 1050lm {"NAME":"Hama Bulb RGBW","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":0,"BASE":18}
+Hama 176547 806lm {"NAME":"hama_rgb","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Hykker SL-0492 810lm {"NAME":"Hykker RBGW 9W","GPIO":[0,0,0,0,0,40,0,0,37,0,39,38,0],"FLAG":0,"BASE":18}
+iDigital Smart Home Wifi Globe 9W {"NAME":"iDigitalRGB+WW","GPIO":[0,0,0,0,0,40,0,0,37,0,39,38,0],"FLAG":0,"BASE":18}
+Kainsy 600lm {"NAME":"KAINSY","GPIO":[17,0,0,0,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
+Koaanw 650lm {"NAME":"KOAANW Bulb","GPIO":[0,0,0,0,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
+Kogan 10W Ambient 1050lm {"NAME":"Kogan RGB","GPIO":[0,0,0,0,140,37,0,0,0,0,141,0,0],"FLAG":0,"BASE":18}
+Kogan Ambient Candle {"NAME":"Kogan_E14","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Kogan Ambient Spotlight 330lm {"NAME":"Kogan_GU10","GPIO":[0,0,0,0,39,40,0,0,37,0,38,0,0],"FLAG":0,"BASE":18}
+Kuled 800lm {"NAME":"KULED 60W RGB","GPIO":[0,0,0,0,39,40,0,0,37,0,38,0,0],"FLAG":1,"BASE":18}
+Laideyi 7W {"NAME":"7W-E14-RGBW-La","GPIO":[0,0,0,0,38,37,0,0,39,0,40,0,0],"FLAG":0,"BASE":18}
+LeCardio 10W 980lm {"NAME":"LeCardio RGBW","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+Lohas ZN001 810lm {"NAME":"Lohas RGBW","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":18}
+Lohas ZN001-E12 810lm {"NAME":"Lohas","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":26}
+Lohas ZN005 420lm {"NAME":"Lohas E14 R50","GPIO":[17,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
+Lohas ZN006 1380lm {"NAME":"Lohas100 RGBW","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":18}
+Lohas ZN012 450lm {"NAME":"LH-5W-ZN01204","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
+Lonsonho 900lm {"NAME":"RGB+W+C Bulb","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+LSC Smart Connect C45 400lm {"NAME":"LSC RGBCW E14","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18}
+LSC Smart Connect MR16 380lm {"NAME":"LSC RGBCW GU10","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18}
+Lumiman LM530 7.5W 800lm {"NAME":"Lumiman LM530","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":1,"BASE":18}
+Lumiman LM530 7.5W 800lm {"NAME":"Lumiman LM530","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":1,"BASE":18}
+Lumiman LM530 7.5W 800lm {"NAME":"LM530","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":1,"BASE":18}
+Luminea ZX-2832 {"NAME":"Luminea RGBW","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":1,"BASE":18}
+Luminea ZX-2986 1400lm {"NAME":"Luminea RGBW","GPIO":[0,0,0,0,37,41,0,0,0,38,39,40,0],"FLAG":0,"BASE":18}
+LWE3 600lm {"NAME":"Linganzh LWE3 ","GPIO":[0,0,0,0,0,38,0,0,39,0,40,37,0],"FLAG":0,"BASE":18}
+Manzoku XS-001 1050lm {"NAME":"Manzoku RGBW","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+Maxcio YX-L01P-E27-2P 9W {"NAME":"Maxcio YXL01P","GPIO":[17,0,0,0,143,144,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
+Merkury MI-BW210-999W 1050lm {"NAME":"MI-BW210-999W","GPIO":[0,0,0,0,140,37,0,0,142,38,141,0,0],"FLAG":0,"BASE":48}
+Merkury MI-BW904-999W 1050lm {"NAME":"MI-BW904-999W","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":0,"BASE":18}
+Merkury MI-BW904-999W v2 1050lm {"NAME":"MI-BW210-999W","GPIO":[0,0,0,0,38,37,0,0,141,142,140,0,0],"FLAG":0,"BASE":48}
+Merkury MI-BW904-999W v3 {"NAME":"MI-BW904-999W","GPIO":[0,0,0,0,37,38,0,0,141,142,140,0,0],"FLAG":0,"BASE":69}
+Merkury MI-BW906-999W BR30 750lm {"NAME":"MI-BW906-999W","GPIO":[0,0,0,0,38,37,0,0,141,142,140,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio 1002338 800lm {"NAME":"GenioBulbRGB","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":1,"BASE":18}
+Mixigoo 950lm {"NAME":"Mixigoo Bulb","GPIO":[0,0,0,0,41,38,0,0,39,0,37,40,0],"FLAG":0,"BASE":18}
+MoKo JL81 5W 400lm {"NAME":"MoKo E14","GPIO":[0,0,0,0,0,0,0,0,143,0,144,0,0],"FLAG":0,"BASE":27}
+Nedis A60 800lm {"NAME":"Nedis RGBW","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":1,"BASE":18}
+Nedis C10 350lm {"NAME":"Nedis WIFILC10","GPIO":[0,0,0,0,39,37,0,0,40,38,41,0,0],"FLAG":1,"BASE":18}
+Nedis PAR16 330lm {"NAME":"Nedis GU10","GPIO":[0,0,0,0,39,37,0,0,40,38,41,0,0],"FLAG":0,"BASE":18}
+NiteBird TT-WB4 800lm {"NAME":"NiteBird TT-WB","GPIO":[0,0,0,0,40,0,0,0,37,38,39,0,0],"FLAG":0,"BASE":18}
+Orbecco 5W 400lm {"NAME":"Orbecco Bulb","GPIO":[0,0,0,0,0,0,0,0,143,0,144,0,0],"FLAG":0,"BASE":27}
+Premier A19 10W {"NAME":"Premier Light","GPIO":[0,0,0,0,0,39,0,0,38,0,37,40,0],"FLAG":1,"BASE":18}
+Riversong Juno 10W {"NAME":"Juno10","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":0,"BASE":18}
+Rogoei EBE-QPZ04 6.5W 450lm {"NAME":"EBE-QPZ04","GPIO":[0,0,0,0,180,0,0,0,0,0,181,0,0],"FLAG":0,"BASE":18}
+Smart 810lm {"NAME":"OOOLED 60W RGB","GPIO":[0,0,0,0,39,40,0,0,37,0,38,0,0],"FLAG":1,"BASE":18}
+Smartyfi 600lm {"NAME":"SMARTYFI 9W","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Solimo 12W {"NAME":"Solimo RGBWW12","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Solimo 810lm {"NAME":"Solimo RGBWW 9","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Swisstone SH 340 806lm {"NAME":"SH 340","GPIO":[0,0,0,0,140,37,0,0,0,142,141,0,0],"FLAG":15,"BASE":18}
+Syska 720lm {"NAME":"SyskaSmartBulb","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+TCP Smart 806lm {"NAME":"TCP Smart RGBW","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Teckin SB50 800lm {"NAME":"Teckin SB50","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+Teckin SB50 v2 800lm {"NAME":"Teckin SB50","GPIO":[0,0,0,0,37,0,0,0,38,40,39,0,0],"FLAG":0,"BASE":18}
+Teckin SB51 800lm {"NAME":"Teckin SB51","GPIO":[0,0,0,0,40,0,0,0,38,39,37,0,0],"FLAG":0,"BASE":18}
+TikLOk TL530 A19 7.5W 800lm {"NAME":"TikLOk WW-CW-L","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
+Utorch LE7 600lm {"NAME":"Utorch LE7","GPIO":[0,0,0,0,0,38,0,0,39,0,40,37,0],"FLAG":0,"BASE":18}
+V-Tac VT-5113 1055lm {"NAME":"V-TAC LED A60 ","GPIO":[0,0,0,0,180,0,0,0,0,0,181,0,0],"FLAG":0,"BASE":18}
+Wallfire WF-05 {"NAME":"Wallfire E27","GPIO":[17,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
+Woopower 460lm {"NAME":"Woopower E14","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
+WOOX R4553 650lm {"NAME":"WOOX R4553","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+WOOX R5076 4W 350lm {"NAME":"WOOX R4553","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Woox R5077 {"NAME":"WOOX R5077","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+Zemismart 5W {"NAME":"Zemismart_GU10","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
+Zilotek A19 800lm {"NAME":"Zilotek RGBW","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18}
+```
+
+## Bulb Warm White
+```
+Aisirer 9W 806lm {"NAME":"Aisirer 9W","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Aisirer 9W 806lm {"NAME":"AISIRER E26","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Aisirer 9W 806lm {"NAME":"Aisirer 9W","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Avatar ALS15L Candle {"NAME":"AVATAR","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
+Cleverio 51396 800lm {"NAME":"Cleverio E27","GPIO":[0,0,0,0,0,0,0,0,0,0,46,0,0],"FLAG":0,"BASE":18}
+Connect Smart 10W {"NAME":"CSH-B22WW10W","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18}
+DORESshop B11 600lm Filament {"NAME":"Doresshop-cand","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18}
+DORESshop ST64 720lm Filament {"NAME":"DORESshop-ST64","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+Feit Electric BR30/927CA/AG 650lm {"NAME":"Feit BR30 WW","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Feit Electric OM60/927CA/AG 800lm {"NAME":" Feit P_A800_2","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Geeni LUX Edison {"NAME":"Geeni-Edison","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18}
+Globe 34209 800lm {"NAME":"Globe WW 800lm","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Kogan ST-20 Filament {"NAME":"Kogan Filament","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":15,"BASE":18}
+LeDesign 8W ST21 Filament {"NAME":"Edison Bulb","GPIO":[0,0,0,0,0,0,0,0,0,37,0,0,0],"FLAG":0,"BASE":18}
+LSC Smart Connect Filament A60 {"NAME":"LSC Filam E27","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+LSC Smart Connect Filament C35 {"NAME":"LSC Filam E14","GPIO":[0,255,0,255,0,0,0,0,38,0,37,0,0],"FLAG":15,"BASE":18}
+LSC Smart Connect Filament G125 {"NAME":"LSC Filam Huge","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+LSC Smart Connect Filament ST64 {"NAME":"LSC Filam Big","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18}
+Lumary 6W 700lm Edison {"NAME":"Lumary TS3Y","GPIO":[0,0,0,0,0,0,0,0,0,37,0,0,0],"FLAG":0,"BASE":18}
+Luminea ZX-2982 ST64 Filament {"NAME":"Luminea ZX2982","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18}
+Merkury MI-BW902-999W 800lm {"NAME":"MI-BW902-999W","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Merkury MI-BW942-999W 800lm {"NAME":"MI-BW942-999W","GPIO":[0,0,0,0,37,0,0,0,0,52,0,0,0],"FLAG":0,"BASE":18}
+Merkury MIC-BW902-999W {"NAME":"MI-BW902-999W","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18}
+Merkury Vintage Edison A19 {"NAME":"Merkury A19 Ed","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18}
+Nedis A60 Filament {"NAME":"WIFILF10WTA60","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18}
+Nedis G125 Filament {"NAME":"WIFILF10GDG125","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18}
+Nedis PAR16 330lm {"NAME":"Nedis WIFILW31","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Sealight Vintage Edison A19 {"NAME":"SealightEdison","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
```
## Bulb Socket
```
-Elegant Choice E27/E26 {"NAME":"Sm Lghtg Base","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-Slampher {"NAME":"Slampher","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":9}
-SmartBase E0260 {"NAME":"SmartBaseE0260","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Elegant Choice E27/E26 {"NAME":"name","GPIO":[0,0,0,0,0,0,0,0,0,0,0,21,0],"FLAG":0,"BASE":18}
+Slampher {"NAME":"Slampher","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":9}
+SmartBase E0260 {"NAME":"SmartBaseE0260","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+```
+
+## Curtain Motor
+```
+Zemismart BCM300D-TY {"NAME":"Zemistart_Curt","GPIO":[0,0,0,0,0,0,0,0,0,108,0,107,0],"FLAG":0,"BASE":54}
```
## Curtain Switch
```
-Teepao {"NAME":"Taopao","GPIO":[255,255,255,18,22,19,255,255,255,21,255,255,17],"FLAG":1,"BASE":18}
-WF-CS01 {"NAME":"Tuya Shutter","GPIO":[157,0,54,10,22,19,0,0,17,21,53,23,52],"FLAG":0,"BASE":18}
+Anccy Relax {"NAME":"Tuya Shutter","GPIO":[157,0,54,10,22,19,0,0,17,21,53,23,52],"FLAG":0,"BASE":18}
+Homecube Blinds and Curtains {"NAME":"Jinvoo Curtain","GPIO":[52,0,0,18,22,19,0,0,17,21,0,23,0],"FLAG":1,"BASE":18}
+Jinvoo SM-SW101-C Curtain {"NAME":"Jinvoo Curtain","GPIO":[52,0,0,18,22,19,0,0,17,21,0,23,0],"FLAG":1,"BASE":18}
+LoraTap SC511WSC Roller Shutter {"NAME":"SC511WSC","GPIO":[0,255,0,56,17,18,0,0,21,19,22,0,0],"FLAG":0,"BASE":18}
+Teekar SYS-CS 01 {"NAME":"Teekar-Tag","GPIO":[56,0,157,18,22,11,0,0,0,21,57,31,17],"FLAG":0,"BASE":18}
+Teepao {"NAME":"Taopao","GPIO":[255,255,255,18,22,19,0,0,255,21,255,255,17],"FLAG":1,"BASE":18}
+WF-CS01 {"NAME":"Tuya Shutter","GPIO":[157,0,54,10,22,19,0,0,17,21,53,23,52],"FLAG":0,"BASE":18}
+WF-CS02 {"NAME":"WF-CS02 Tuya","GPIO":[157,0,53,11,23,18,0,0,17,21,54,22,52],"FLAG":0,"BASE":18}
```
-## DIY Project
+## DIY
```
-LC-Tech 1Ch and PZEM-004T {"NAME":"HW-655 PZEM","GPIO":[0,63,0,62,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
-Luani HVIO {"NAME":"Luani HVIO","GPIO":[0,255,255,255,21,22,0,0,9,10,255,52,0],"FLAG":1,"BASE":35}
-SUPLA inCan by Espablo {"NAME":"Supla Espablo","GPIO":[0,255,4,255,17,21,0,0,255,22,255,0,52],"FLAG":1,"BASE":31}
-```
-
-## Development Board
-```
-Witty Cloud {"NAME":"Witty Cloud","GPIO":[255,255,56,255,17,255,0,0,38,39,255,37,255],"FLAG":1,"BASE":32}
+Adafruit HUZZAH {"NAME":"Huzzah","GPIO":[17,0,56,0,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":18}
+Heltec WiFi Kit 8 {"NAME":"HTIT-W8266","GPIO":[255,255,255,255,6,5,0,0,255,255,255,255,162],"FLAG":15,"BASE":18}
+LC Tech relay and PZEM-004T {"NAME":"HW-655 PZEM","GPIO":[0,63,0,62,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Luani HVIO {"NAME":"Luani HVIO","GPIO":[0,255,255,255,21,22,0,0,9,10,255,52,0],"FLAG":1,"BASE":35}
+Splatura USB Device Power Switch {"NAME":"Splatura USB","GPIO":[0,0,52,0,0,0,0,0,0,21,0,122,0],"FLAG":0,"BASE":18}
+SUPLA inCan by Espablo {"NAME":"Supla Espablo","GPIO":[0,255,4,255,17,21,0,0,255,22,255,0,52],"FLAG":1,"BASE":31}
+Witty Cloud {"NAME":"Witty Cloud","GPIO":[255,255,56,255,17,255,0,0,38,39,255,37,255],"FLAG":1,"BASE":32}
```
## Dimmer
```
-Armtronix AC Dimmer One Triac Board {"NAME":"ARMTR Dimmer","GPIO":[255,148,255,149,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":56}
-Armtronix AC Dimmer Two Triac Board {"NAME":"ARMTR Dimmer","GPIO":[255,148,255,149,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":56}
-CE Smart Home WF500D {"NAME":"CE-WF500D","GPIO":[255,255,255,255,255,255,0,0,255,108,255,107,255],"FLAG":0,"BASE":54}
-EVA LOGIK WF31 {"NAME":"WF31 Dimmer","GPIO":[255,107,255,108,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
-EX-Store 2 Kanal RS232 V4 {"NAME":"EXS Dimmer","GPIO":[0,148,0,149,255,255,0,0,255,183,255,0,0],"FLAG":0,"BASE":72}
-Kingart Touch {"NAME":"PS-16-DZ","GPIO":[255,148,255,149,255,255,0,0,255,52,255,255,255],"FLAG":0,"BASE":58}
-Moes DS01 {"NAME":"MOES - DS01","GPIO":[255,255,255,255,255,255,0,0,255,108,255,107,255],"FLAG":0,"BASE":54}
-Moes QS-WiFi-D01 Dimmer 150W {"NAME":"WiFi-Dimmer","GPIO":[0,148,0,149,0,0,0,0,0,42,37,0,0],"FLAG":0,"BASE":18}
-PS-16-DZ {"NAME":"PS-16-DZ","GPIO":[255,148,255,149,255,255,0,0,255,52,255,255,255],"FLAG":0,"BASE":58}
-Zemismart KS-7011 {"NAME":"KS-7011 Dimmer","GPIO":[255,107,255,108,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
+Armtronix AC Dimmer One Triac Board {"NAME":"ARMTR Dimmer","GPIO":[0,148,0,149,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":56}
+Armtronix AC Dimmer Two Triac Board {"NAME":"ARMTR Dimmer","GPIO":[0,148,0,149,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":56}
+BrilliantSmart D350W {"NAME":"Generic","GPIO":[255,107,255,108,255,255,0,0,255,0,255,0,255],"FLAG":0,"BASE":54}
+CE Smart Home CFW500D-3W 3 Way {"NAME":"CE-WF500D-3W","GPIO":[0,0,0,0,0,0,0,0,0,108,0,107,0],"FLAG":0,"BASE":54}
+CE Smart Home CWF500D-3W {"NAME":"CE-WF500D-3W","GPIO":[0,0,0,0,0,0,0,0,0,108,0,107,0],"FLAG":0,"BASE":54}
+CE Smart Home WF500D {"NAME":"CE-WF500D","GPIO":[0,0,0,0,0,0,0,0,0,108,0,107,0],"FLAG":0,"BASE":54}
+Eva Logik WF31 {"NAME":"WF31 Dimmer","GPIO":[255,107,255,108,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
+EX-Store 2 Kanal RS232 V4 {"NAME":"EXS Dimmer","GPIO":[0,148,0,149,0,0,0,0,0,183,0,0,0],"FLAG":0,"BASE":72}
+Gosund SW2 {"NAME":"Gosund Dimmer","GPIO":[255,148,255,149,17,0,255,255,56,158,37,255,255],"FLAG":0,"BASE":18}
+Martin Jerry MJ-SD02 {"NAME":"MJ-SD02","GPIO":[19,17,0,33,34,32,255,255,31,37,30,127,29],"FLAG":15,"BASE":18}
+Moes DS01-1 {"NAME":"MOES DS01","GPIO":[255,255,255,255,255,255,0,0,255,108,255,107,255],"FLAG":0,"BASE":54}
+Moes MS-105-1 v2 {"NAME":"MS-105","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
+PS-16-DZ {"NAME":"PS-16-DZ","GPIO":[255,148,255,149,255,255,0,0,255,52,255,255,255],"FLAG":0,"BASE":58}
+QS-WiFi-D01 150W {"NAME":"WiFi-Dimmer","GPIO":[0,148,0,149,0,0,0,0,0,42,37,0,0],"FLAG":0,"BASE":18}
+RJWF-02A {"NAME":"RJWF-02A","GPIO":[17,107,0,108,0,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":54}
+Sonoff D1 {"NAME":"Sonoff D1","GPIO":[255,148,0,149,0,0,0,0,0,56,0,0,0],"FLAG":0,"BASE":74}
+Teekar UIW001-1 {"NAME":"Teekar UIW001-","GPIO":[0,149,37,148,6,5,0,0,9,0,0,0,0],"FLAG":0,"BASE":18}
+TreatLife DS01 {"NAME":"DS02S Dimmer","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
+TreatLife DS02S {"NAME":"DS02S Dimmer","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
+WF-DS01 {"NAME":"Dimmer WF-DS01","GPIO":[255,255,255,255,255,255,0,0,255,255,54,255,255],"FLAG":0,"BASE":54}
+WiFi Dimmer Switch {"NAME":"PS-16-DZ","GPIO":[0,148,0,149,0,0,0,0,0,52,0,0,0],"FLAG":0,"BASE":58}
+Zemismart KS-7011 {"NAME":"KS-7011 Dimmer","GPIO":[255,107,255,108,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
```
-## Environment Monitor
+## Fan
```
-Sonoff SC {"NAME":"Sonoff SC","GPIO":[17,148,255,149,0,0,0,0,0,56,0,0,0],"FLAG":0,"BASE":21}
+Anko HEGSM40 {"NAME":"Anko HEGSM40","GPIO":[0,0,0,0,0,0,0,0,0,108,0,107,0],"FLAG":0,"BASE":54}
+Arlec 45cm Smart DC Wall {"NAME":"Arlec 45cm Fan","GPIO":[0,0,0,0,0,0,0,0,0,108,0,107,0],"FLAG":0,"BASE":54}
+Goldair SleepSmart GCPF315 {"NAME":"Goldair Fan","GPIO":[0,0,0,0,0,0,0,0,0,108,0,107,0],"FLAG":0,"BASE":54}
```
## Fan Controller
```
-Sonoff iFan02 {"NAME":"Sonoff iFan02","GPIO":[17,255,0,255,23,22,18,19,21,56,20,24,0],"FLAG":0,"BASE":44}
-Sonoff iFan03 {"NAME":"SonoffiFan03","GPIO":[17,148,0,149,0,0,29,161,23,56,22,24,0],"FLAG":0,"BASE":71}
+BrilliantSmart 99111 {"NAME":"Brilliant Fan","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
+Lucci Connect Remote Control {"NAME":"Lucci Fan","GPIO":[0,0,0,0,0,0,0,0,0,108,0,107,0],"FLAG":0,"BASE":54}
+Sonoff iFan02 {"NAME":"Sonoff iFan02","GPIO":[17,255,0,255,23,22,18,19,21,56,20,24,0],"FLAG":0,"BASE":44}
+Sonoff iFan03 {"NAME":"SonoffiFan03","GPIO":[17,148,0,149,0,0,29,161,23,56,22,24,0],"FLAG":0,"BASE":71}
```
## Humidifier
```
-Asakuki 500ml {"NAME":"Oil Diffuser","GPIO":[255,255,255,255,255,255,255,255,255,255,255,21,22],"FLAG":0,"BASE":18}
-Maxcio 400ml {"NAME":"MaxcioDiffuser","GPIO":[255,255,255,255,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
-Oil Diffuser 550ML {"NAME":"Oil Diffuser","GPIO":[255,255,255,255,255,255,255,255,255,255,255,21,22],"FLAG":0,"BASE":18}
+Proscenic 807C {"NAME":"Generic","GPIO":[255,255,255,255,255,255,0,0,255,255,255,255,255],"FLAG":15,"BASE":54}
```
## IR Bridge
```
-Alfawise KS1 {"NAME":"KS1","GPIO":[255,71,17,72,17,51,0,0,56,0,8,0,0],"FLAG":1,"BASE":62}
-auvisio S06 {"NAME":"NX-4519-675","GPIO":[255,255,255,255,52,51,255,255,255,255,8,255,255],"FLAG":1,"BASE":18}
-Eachen SANT-IR 01 {"NAME":"Eachen IR","GPIO":[0,0,0,0,56,51,255,255,255,17,8,0,0],"FLAG":0,"BASE":18}
-Geeklink {"NAME":"GL IR Blaster","GPIO":[255,255,255,255,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
-Mirabella Genio HKWL-IR02W {"NAME":"Genio IR TxRx","GPIO":[255,255,255,255,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
-STITCH by Monoprice 35753 {"NAME":"Stitch 35753","GPIO":[0,0,0,0,52,51,0,0,0,90,8,0,0],"FLAG":0,"BASE":18}
-YTF {"NAME":"YTF IR Bridge","GPIO":[255,255,255,255,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
+A1 Universal Remote Control {"NAME":"A1 IR Bridge","GPIO":[255,255,255,255,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
+Alfawise KS1 {"NAME":"KS1","GPIO":[255,71,17,72,17,51,0,0,56,0,8,0,0],"FLAG":1,"BASE":62}
+auvisio S06 {"NAME":"NX-4519-675","GPIO":[255,255,255,255,52,51,0,0,255,255,8,255,255],"FLAG":1,"BASE":18}
+BlitzWolf BW-RC1 Smart IR Controller {"NAME":"BW-RC1","GPIO":[0,0,0,0,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
+Connect SmartHome Universal Smart IR Remote {"NAME":"CSH IR Bridge","GPIO":[255,255,255,255,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
+Cusam CS-IRC-1 {"NAME":"YTF IR Bridge","GPIO":[255,255,255,255,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
+Eachen IR DC6 {"NAME":"Eachen IR","GPIO":[0,0,0,0,56,51,0,0,255,17,8,0,0],"FLAG":0,"BASE":18}
+Geeklink GK01 {"NAME":"GL IR Blaster","GPIO":[255,255,255,255,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
+Mirabella Genio I002577 {"NAME":"Genio IR TxRx","GPIO":[255,255,255,255,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
+NEO Coolcam NAS-IR03W0 {"NAME":"Neo Coolcam IR","GPIO":[0,0,0,0,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
+STITCH by Monoprice 35753 {"NAME":"Stitch 35753","GPIO":[0,0,0,0,52,51,0,0,0,90,8,0,0],"FLAG":0,"BASE":18}
+YTF Universal Remote {"NAME":"YTF IR Bridge","GPIO":[255,255,255,255,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
+```
+
+## Kettle
+```
+Kogan 1.7L Smart Glass {"NAME":"Kogan Kettle","GPIO":[255,107,255,108,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
+ProfiCook PC-WKS 1167 G 1.5 L {"NAME":"PC-WKS Kettle","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
```
## LED Controller
```
-Arilux AL-LC01 {"NAME":"Arilux LC01","GPIO":[17,255,59,255,147,37,0,0,38,39,255,0,0],"FLAG":0,"BASE":37}
-Arilux AL-LC06 {"NAME":"Arilux LC06","GPIO":[17,255,255,255,255,255,255,255,38,39,37,41,40],"FLAG":0,"BASE":18}
-Arilux AL-LC11 {"NAME":"Arilux LC11","GPIO":[17,255,59,255,38,37,0,0,41,40,39,147,0],"FLAG":0,"BASE":38}
-Electrodragon Mosfet Drive {"NAME":"LEDBoard RGBW","GPIO":[255,0,0,0,255,255,0,0,39,38,40,37,52],"FLAG":0,"BASE":18}
-H801 {"NAME":"H801","GPIO":[255,52,255,255,41,57,0,0,39,38,40,37,0],"FLAG":0,"BASE":20}
-LEDEnet {"NAME":"LEDEnet","GPIO":[0,255,56,255,147,0,0,0,38,39,37,40,0],"FLAG":0,"BASE":34}
-Luminea ZX-2844 {"NAME":"Luminea ZX-284","GPIO":[40,255,255,255,0,39,255,255,38,17,37,255,255],"FLAG":0,"BASE":18}
-MagicHome RGB ZJ-WFMN-A V1.1 {"NAME":"MagicHome RGB","GPIO":[0,0,0,0,0,37,0,0,38,39,0,0,0],"FLAG":0,"BASE":34}
-MagicHome RGBW ZJ-WFMN-A V1.1 {"NAME":"MagicHome RGBW","GPIO":[0,0,0,0,51,38,0,0,37,39,0,40,0],"FLAG":0,"BASE":34}
-MagicHome ZJ-ESP-IR-F V1 {"NAME":"ZJ-ESP-IR-F V1","GPIO":[255,255,255,255,51,38,255,255,37,39,255,40,255],"FLAG":0,"BASE":18}
-Nexlux {"NAME":"MagicHome V1.1","GPIO":[0,0,0,0,51,37,0,0,38,39,0,0,0],"FLAG":0,"BASE":34}
-Shelly RGBW2 {"NAME":"RGBW2","GPIO":[255,255,33,255,24,91,255,255,21,17,23,22,255],"FLAG":0,"BASE":18}
+Anncoe C350 RGB {"NAME":"TUYA LED","GPIO":[0,0,0,0,0,38,0,0,39,17,37,0,0],"FLAG":0,"BASE":18}
+Arilux AL-LC01 {"NAME":"Arilux LC01","GPIO":[17,0,59,0,147,37,0,0,38,39,0,0,0],"FLAG":0,"BASE":37}
+Arilux AL-LC06 {"NAME":"Arilux LC06","GPIO":[17,0,0,0,0,0,0,0,38,39,37,41,40],"FLAG":0,"BASE":18}
+Arilux AL-LC11 {"NAME":"Arilux LC11","GPIO":[17,0,59,0,38,37,0,0,41,40,39,147,0],"FLAG":0,"BASE":38}
+Arilux SL-LC 09 {"NAME":"Arilux LC09","GPIO":[0,0,0,0,106,37,0,0,39,0,38,0,0],"FLAG":0,"BASE":18}
+DD001-MINI(G)-IR-V08 {"NAME":"WIFI-RGB","GPIO":[0,0,0,0,37,0,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Electrodragon ESP LED Strip Board, Mosfet Drive {"NAME":"LEDBoard RGBW","GPIO":[0,0,0,0,0,0,0,0,39,38,40,37,52],"FLAG":0,"BASE":18}
+H801 {"NAME":"H801","GPIO":[0,52,0,0,41,57,0,0,39,38,40,37,0],"FLAG":0,"BASE":20}
+LEDEnet {"NAME":"LEDEnet","GPIO":[0,255,56,255,147,41,0,0,38,39,37,40,0],"FLAG":0,"BASE":34}
+Luminea ZX-2844 {"NAME":"Luminea ZX-284","GPIO":[40,0,0,0,0,39,0,0,38,17,37,0,0],"FLAG":0,"BASE":18}
+Luminea ZX-2844-675 {"NAME":"ZX-2844-675","GPIO":[17,0,0,0,38,40,0,0,37,0,39,0,0],"FLAG":0,"BASE":18}
+Magic UFO RGBW {"NAME":"Magic UFO","GPIO":[17,0,157,0,0,37,0,0,39,40,38,56,0],"FLAG":0,"BASE":18}
+MagicHome RGB ZJ-WFMN-A V1.1 {"NAME":"MagicHome RGB","GPIO":[0,0,0,0,0,37,0,0,38,39,0,0,0],"FLAG":0,"BASE":34}
+MagicHome RGBW ESP-IR-B-v2.3 {"NAME":"ESP-IR-B-v2.3","GPIO":[0,0,51,0,0,38,0,0,37,39,0,40,0],"FLAG":0,"BASE":18}
+MagicHome RGBW ZJ-WFMN-A V1.1 {"NAME":"MagicHome RGBW","GPIO":[0,0,0,0,51,38,0,0,37,39,0,40,0],"FLAG":0,"BASE":34}
+MagicHome RGBWW w/ RF {"NAME":"MagicHome RF","GPIO":[0,0,159,0,37,38,0,0,41,40,39,147,0],"FLAG":0,"BASE":38}
+MagicHome RGBWW w/ RF {"NAME":"MagicHome RF","GPIO":[0,0,0,0,147,40,0,0,38,39,37,41,159],"FLAG":0,"BASE":18}
+MagicHome ZJ-ESP-IR-F V1 {"NAME":"ZJ-ESP-IR-F V1","GPIO":[0,0,0,0,51,38,0,0,37,39,0,40,0],"FLAG":0,"BASE":18}
+Maxonar Lightstrip Pro XS-SLD001 {"NAME":"Maxonar LED","GPIO":[0,0,0,0,0,37,0,0,39,17,38,0,0],"FLAG":0,"BASE":18}
+Nexlux {"NAME":"MagicHome V1.1","GPIO":[0,0,0,0,51,37,0,0,38,39,0,0,0],"FLAG":0,"BASE":34}
+Shelly RGBW2 {"NAME":"Shelly RGBW2","GPIO":[0,0,52,0,40,255,0,0,37,17,39,38,0],"FLAG":0,"BASE":18}
+ZJ-WF-ESP-A v1.1 {"NAME":"RGB2","GPIO":[0,0,0,0,0,0,0,0,38,37,39,0,0],"FLAG":0,"BASE":18}
```
## LED Strip
```
-BlitzWolf BW-LT11 {"NAME":"BW-LT11 Strip","GPIO":[17,255,255,255,37,40,255,255,38,255,39,255,255],"FLAG":0,"BASE":18}
-LSC Smart Connect RGBW {"NAME":"LSC-RGBW-Strip","GPIO":[51,0,0,0,37,0,0,0,38,40,39,0,0],"FLAG":0,"BASE":18}
-Merkury Innovations MI-EW003-999W {"NAME":"MI-EW003-999W ","GPIO":[17,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18}
-Mirabella Genio 3 Metre {"NAME":"MirabellaStrip","GPIO":[17,255,255,255,37,40,255,255,38,255,39,255,255],"FLAG":0,"BASE":18}
-Monster Smart IlluminEssence {"NAME":"MI-EW003-999W ","GPIO":[17,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18}
-Sonoff L1 {"NAME":"SonoffL1","GPIO":[0,148,0,149,0,0,0,0,0,56,0,0,0],"FLAG":0,"BASE":70}
-Torchstar {"NAME":"Torchstar","GPIO":[255,255,255,255,52,255,255,255,255,255,255,37,53],"FLAG":1,"BASE":18}
+Arlec 2m LED Colour Changing Strip Light {"NAME":"Arlec ALD233AH","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+B.K. Licht BKL1268 2m RGB {"NAME":"RGBW-Strip","GPIO":[0,0,0,0,37,17,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+BlitzWolf BW-LT11 {"NAME":"BW-LT11 Strip","GPIO":[17,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+BrilliantSmart 20743 RGB+W {"NAME":"BrilliantStrip","GPIO":[17,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Briloner 2256-150 RGB {"NAME":"Briloner2256-1","GPIO":[51,0,0,0,37,0,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Cocoon Smart {"NAME":"Cocoon Smart","GPIO":[17,0,0,0,37,0,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+LE LampUX 2m RGB TV Backlight {"NAME":"LE 904102","GPIO":[0,17,18,0,0,38,0,0,39,19,0,37,0],"FLAG":0,"BASE":18}
+LE LampUX 5m RGB LED Strip {"NAME":"LampUX","GPIO":[17,0,0,0,0,38,0,0,39,0,0,37,0],"FLAG":0,"BASE":18}
+LE lampUX 5m RGBW {"NAME":"LampUX","GPIO":[17,0,0,0,37,40,255,255,38,41,39,0,0],"FLAG":0,"BASE":18}
+LSC Smart Connect RGBW {"NAME":"LSC RGBW Strip","GPIO":[51,0,0,0,37,0,0,0,38,40,39,0,0],"FLAG":0,"BASE":18}
+Lumary RGBCCT {"NAME":"Lumary LED","GPIO":[17,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Lumary RGBCCT {"NAME":"Lumary LED","GPIO":[17,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Merkury Innovations MI-EW003-999W {"NAME":"MI-EW003-999W ","GPIO":[17,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio I002579 {"NAME":"MirabellaStrip","GPIO":[17,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Monster Smart IlluminEssence {"NAME":"MI-EW003-999W ","GPIO":[17,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Sonoff L1 {"NAME":"SonoffL1","GPIO":[0,148,0,149,0,0,0,0,0,56,0,0,0],"FLAG":0,"BASE":70}
+Teckin SL02 {"NAME":"Teckin SL02","GPIO":[51,0,0,0,37,0,0,0,38,0,39,0,0],"FLAG":0,"BASE":52}
+Torchstar Safe Lighting Kit {"NAME":"Torchstar","GPIO":[0,0,0,0,52,0,0,0,0,0,0,37,53],"FLAG":1,"BASE":18}
+Zemismart RGBW {"NAME":"Zemismart LED","GPIO":[0,0,0,0,38,37,0,0,0,39,40,0,0],"FLAG":0,"BASE":18}
```
## Light
```
-Brilliant 20702/06 Garden {"NAME":"Brilliant Gard","GPIO":[0,0,0,0,37,0,255,255,38,0,39,0,0],"FLAG":0,"BASE":18}
-Brilliant Smart WiFi Downlight CCT {"NAME":"SmartCCTDwnLgt","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":48}
-Fcmila XDD-48W {"NAME":"XDD-48W","GPIO":[0,0,0,0,37,40,0,0,38,25,39,0,0],"FLAG":0,"BASE":18}
-Mi LED Desk Lamp MJTD01YL {"NAME":"Mi Desk Lamp","GPIO":[0,0,17,0,37,38,0,0,150,151,0,0,0],"FLAG":0,"BASE":66}
-Mirabella Genio Dimmable CCT Downlight {"NAME":"GenioDLightCCT","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":48}
-Mirabella Genio Dimmable RGBCCT Downlight {"NAME":"GenioDLightRGB","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
-Sonoff BN-SZ01 {"NAME":"Sonoff BN-SZ","GPIO":[0,0,0,0,0,0,0,0,37,56,0,0,0],"FLAG":0,"BASE":22}
-Spotlight 9cm RGB+W 7W {"NAME":"Spotlight RGBW","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
-Utorch PZE-911 {"NAME":"Utorch PZE-911","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":1}
-Utorch UT40 {"NAME":"Utorch UT40","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":1}
-Wipro Next 20W Smart LED Batten {"NAME":"WIPROBatten","GPIO":[255,255,255,255,255,37,255,255,255,47,255,255,255],"FLAG":1,"BASE":18}
-Zemismart 14W RGB-CCT {"NAME":"ZemiDownLight6","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
-Zemismart 4" 10W RGBW {"NAME":"ZemiDownLight","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
+Arlec 15W Security Floodlight {"NAME":"ArlecFlood","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":15,"BASE":18}
+Arlec 40W 4000lm LED Batten Light {"NAME":"Arlec Batten","GPIO":[0,0,0,0,0,37,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+BlitzWolf BW-LT20 {"NAME":"BW-LT20","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":15,"BASE":18}
+Brilliant CORDIA Colour Temperature Changing LED Flush Ceiling Light {"NAME":"Brilliant Oyst","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18}
+BrilliantSmart 20695 Downlight CCT {"NAME":"SmartCCTDwnLgt","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":48}
+BrilliantSmart Prism LED RGBCCT Downlight {"NAME":"Prism","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+BrilliantSmart RGB Garden Kit {"NAME":"Brilliant Gard","GPIO":[0,0,0,0,37,0,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Calex 429250 Ceiling {"NAME":"Calex_LED","GPIO":[0,0,0,0,0,0,0,0,52,37,38,54,0],"FLAG":0,"BASE":18}
+Connect SmartHome CSH-240RGB10W {"NAME":"Connect1","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Connect SmartHome CSH-FSTN12 {"NAME":"CSH-FSTN12","GPIO":[0,0,0,0,37,0,0,0,38,0,39,0,0],"FLAG":0,"BASE":18}
+Deta DET902HA 10W 940lm RGB+CCT {"NAME":"Deta DownLight","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Fcmila XDD-48W {"NAME":"XDD-48W","GPIO":[0,0,0,0,37,40,0,0,38,25,39,0,0],"FLAG":0,"BASE":18}
+Hama 10W RGB+WW {"NAME":"Hama Smart WiF","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Hyperikon 14W 1000lm 6" Downlight {"NAME":"HyperikonDL6","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+iHomma Downlight {"NAME":"iHommaLEDDownl","GPIO":[0,0,0,0,0,40,0,0,37,38,39,0,0],"FLAG":0,"BASE":18}
+Infray 9W 900LM {"NAME":"InfrayRGBCCT","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+LE lampUX 15W RGBCCT Ceiling {"NAME":"LE lampUX 15W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Lohas ZN026CL10 RGBCCT {"NAME":"Lohas LED Lamp","GPIO":[0,0,0,0,38,37,0,0,40,39,41,0,0],"FLAG":0,"BASE":18}
+Mi LED Desk Lamp MJTD01YL {"NAME":"Mi Desk Lamp","GPIO":[0,0,17,0,37,38,0,0,150,151,0,0,0],"FLAG":0,"BASE":66}
+Mirabella Genio I002741 {"NAME":"GenioDLightRGB","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio I002742 {"NAME":"GenioDLightCCT","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":48}
+Mirabella Genio I002798 Warm White Filament Festoon {"NAME":"GenioFestoon","GPIO":[0,0,0,0,0,0,0,0,0,0,37,0,0],"FLAG":0,"BASE":18}
+Novostella UT88835 20W Floodlight {"NAME":"Novo 20W Flood","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Sonoff BN-SZ01 {"NAME":"Sonoff BN-SZ","GPIO":[0,0,0,0,0,0,0,0,37,56,0,0,0],"FLAG":0,"BASE":22}
+Spotlight 9cm RGB+W 7W {"NAME":"Spotlight RGBW","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
+Teckin FL41 {"NAME":"Teckin FL41","GPIO":[0,0,0,0,0,17,0,0,0,0,21,0,0],"FLAG":0,"BASE":18}
+Utorch PZE-911 {"NAME":"Utorch PZE-911","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":1}
+Utorch UT40 {"NAME":"Utorch UT40","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":1}
+Verve Design Angie 18W Ceiling Light With RGB Ring {"NAME":"ACL12HA Light","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18}
+Verve Design Hana 24W CCT Ceiling {"NAME":"Verve ACL03HA","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":48}
+Wipro Next 20W Smart LED Batten {"NAME":"WIPROBatten","GPIO":[0,0,0,0,0,37,0,0,0,47,0,0,0],"FLAG":1,"BASE":18}
+Zemismart 4" 10W RGBCCT {"NAME":"ZemiDownLight4","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
+Zemismart 4" 10W RGBW {"NAME":"ZemiDownLight","GPIO":[0,0,0,0,0,0,0,0,0,143,0,144,0],"FLAG":0,"BASE":27}
+Zemismart 6" 14W RGBCCT {"NAME":"ZemiDownLight6","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18}
```
## Outdoor Plug
```
-Acenx SOP04-US Dual {"NAME":"SOP04-US Dual","GPIO":[255,255,255,255,56,57,255,255,21,17,22,255,255],"FLAG":0,"BASE":18}
-Albohes PC-1606 {"NAME":"Albohes PC1606","GPIO":[17,0,0,0,0,22,18,0,21,0,0,0,0],"FLAG":1,"BASE":39}
-ECF-SOP03 {"NAME":"Outdoor3Outlet","GPIO":[0,0,0,23,56,0,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
-Feit Electric Dual {"NAME":"Prime Smart ou","GPIO":[255,255,255,255,157,56,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
-Geeni GN-OW101-101 {"NAME":"Geeni Outdoor","GPIO":[17,0,0,0,0,57,0,0,0,52,21,0,0],"FLAG":0,"BASE":18}
-LEPOWER {"NAME":"LEPOWER Outdoo","GPIO":[255,255,255,255,56,57,255,255,21,17,22,255,255],"FLAG":0,"BASE":18}
-Oittm Outdoor {"NAME":"Oittm Outdoor","GPIO":[17,0,0,0,0,0,0,0,0,0,56,21,255],"FLAG":0,"BASE":18}
-SK03 {"NAME":"SK03 Outdoor","GPIO":[17,0,0,0,133,132,0,0,131,57,56,21,0],"FLAG":0,"BASE":57}
-Top-Max PS-1602 {"NAME":"PS-1602","GPIO":[17,255,255,255,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":29}
+Acenx SOP04-US Dual {"NAME":"SOP04-US Dual","GPIO":[255,255,255,255,56,57,0,0,21,17,22,255,255],"FLAG":0,"BASE":18}
+Aicliv SOP03-US {"NAME":"AICLIV SOP03US","GPIO":[0,0,0,23,57,0,0,0,21,18,22,0,0],"FLAG":15,"BASE":18}
+Albohes PC-1606 {"NAME":"Albohes PC1606","GPIO":[17,0,0,0,0,22,18,0,21,0,0,0,0],"FLAG":1,"BASE":39}
+Albohes PS-1602 {"NAME":"Albohes PC1606","GPIO":[17,0,0,0,0,22,18,0,21,0,0,0,0],"FLAG":1,"BASE":39}
+Aoycocr X13 {"NAME":"Aoycocr X13","GPIO":[0,0,56,0,0,0,0,0,21,17,0,22,0],"FLAG":0,"BASE":18}
+Brennenstuhl WA 3000 XS02 {"NAME":"WA 3000 XS02","GPIO":[0,0,0,0,21,17,0,0,158,52,0,0,0],"FLAG":0,"BASE":61}
+C137 IP55 {"NAME":"C137 Outdoor","GPIO":[0,17,0,56,134,132,0,0,21,131,22,0,0],"FLAG":15,"BASE":18}
+C168 IP64 {"NAME":"C188","GPIO":[56,0,57,0,18,0,0,0,21,17,157,22,0],"FLAG":0,"BASE":18}
+ECF-SOP03 {"NAME":"Outdoor3Outlet","GPIO":[0,0,0,23,56,0,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
+Ecoolbuy 4 socket {"NAME":"ECCOLBUY 4","GPIO":[0,0,0,0,22,23,0,0,21,57,17,0,24],"FLAG":0,"BASE":18}
+Feit Electric PLUG/WIFI/WP {"NAME":"Prime Smart ou","GPIO":[0,255,0,255,157,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Geeni Outdoor {"NAME":"Geeni Outdoor","GPIO":[17,0,0,0,0,57,0,0,0,52,21,0,0],"FLAG":0,"BASE":18}
+Geeni Outdoor DUO Dual Outlet {"NAME":"Geeni Dual Out","GPIO":[17,0,0,0,0,57,0,0,0,56,21,0,22],"FLAG":0,"BASE":18}
+HA109US {"NAME":"HA109US","GPIO":[17,0,0,0,52,53,0,0,21,0,22,0,0],"FLAG":0,"BASE":18}
+iClever IC-BS06 {"NAME":"iClever Switch","GPIO":[0,0,0,0,157,56,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
+King-Link C128 {"NAME":"King-Link C128","GPIO":[0,0,58,0,22,56,0,0,23,157,17,21,57],"FLAG":0,"BASE":18}
+LEPOWER {"NAME":"LEPOWER Outdoo","GPIO":[255,255,255,255,56,57,0,0,21,17,22,255,255],"FLAG":0,"BASE":18}
+Luminea NX-4458 {"NAME":"Luminea NX4458","GPIO":[17,0,0,0,133,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":65}
+Maxcio EOP03-EU {"NAME":"Maxcio EOP03-EU","GPIO":[0,0,0,0,22,57,0,0,21,52,17,0,58],"FLAG":0,"BASE":18}
+Maxcio SOP02-US {"NAME":"Maxcio SOP02US","GPIO":[0,0,0,0,0,157,0,0,21,17,22,0,0],"FLAG":15,"BASE":18}
+Merkury MI-OW101-101W {"NAME":"Merkury Switch","GPIO":[17,255,255,255,0,56,0,0,0,54,21,255,255],"FLAG":1,"BASE":18}
+Minoston MP22W {"NAME":"Minoston MP22W","GPIO":[0,0,0,0,56,0,0,0,21,90,0,0,0],"FLAG":0,"BASE":18}
+Nedis IP44 PO120 {"NAME":"WIFIPO120FWT","GPIO":[17,0,0,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":49}
+Obi Stecker IP44 {"NAME":"OBI Socket 2","GPIO":[0,0,0,0,21,17,0,0,56,53,0,0,0],"FLAG":0,"BASE":61}
+Oittm Outdoor {"NAME":"Oittm Outdoor","GPIO":[17,0,0,0,0,0,0,0,0,0,56,21,255],"FLAG":0,"BASE":18}
+Peteme PS-1602 {"NAME":"Peteme Outdoor","GPIO":[17,0,0,0,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":18}
+Prime CCRCWFIO2PK {"NAME":"Prime Outdoor","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Signstek EOP03-EU {"NAME":"Signstek EOP03","GPIO":[0,0,0,0,56,57,0,0,21,17,22,0,0],"FLAG":15,"BASE":18}
+SK03 {"NAME":"SK03 Outdoor","GPIO":[17,0,0,0,133,132,0,0,131,57,56,21,0],"FLAG":0,"BASE":57}
+STITCH by Monoprice 35556 {"NAME":"STITCH 35556","GPIO":[255,255,255,255,22,57,0,0,21,56,17,255,255],"FLAG":0,"BASE":18}
+Teckin SS31 {"NAME":"Teckin SS31","GPIO":[255,255,255,255,56,57,255,255,21,17,22,255,255],"FLAG":15,"BASE":18}
+Teckin SS33 {"NAME":"Teckin SS31","GPIO":[0,0,0,23,56,57,0,0,21,17,22,0,0],"FLAG":15,"BASE":18}
+Teckin SS42 {"NAME":"Teckin SS42","GPIO":[0,0,0,0,56,57,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
+Top-Max PS-1602 {"NAME":"PS-1602","GPIO":[17,255,255,255,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":29}
+Torchstar LITEdge 2-in-1 {"NAME":"LITEdge Plug","GPIO":[0,0,0,0,56,57,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
+Ucomen PA-GEBA-01SWP {"NAME":"PA-GEBA-01SWP","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
```
## Plug
```
-3Stone Mini {"NAME":"3Stone Smart P","GPIO":[0,17,0,0,0,0,0,0,0,57,21,0,0],"FLAG":0,"BASE":18}
-Acashna HS108 {"NAME":"HS108","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":1,"BASE":18}
-Aisirer UK1 {"NAME":"AISIRER","GPIO":[255,255,255,255,56,255,255,255,21,17,255,255,255],"FLAG":1,"BASE":18}
-Albohes PS-1602 {"NAME":"Albohes PC1606","GPIO":[17,0,0,0,0,22,18,0,21,0,0,0,0],"FLAG":1,"BASE":39}
-Aldi Medion Life+ S85225 {"NAME":"Medion","GPIO":[0,0,0,17,134,132,0,0,131,158,21,0,0],"FLAG":0,"BASE":52}
-Alexfirst TV-ASP801EU {"NAME":"Alexfirst","GPIO":[17,0,0,0,54,56,0,0,21,0,0,0,0],"FLAG":0,"BASE":18}
-Alfawise PE1004T {"NAME":"PE1004T","GPIO":[255,255,255,255,56,57,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
-Amysen YX-WS01 {"NAME":"Amyse YX WS01","GPIO":[255,17,255,255,255,255,255,255,255,56,21,255,255],"FLAG":1,"BASE":18}
-ANBES ABS-CZ004 {"NAME":"ANBES ABS-CZ00","GPIO":[0,0,0,0,21,133,0,0,131,17,132,22,18],"FLAG":0,"BASE":18}
-Anoopsyche AWP07L {"NAME":"Anoopsyche AWP","GPIO":[0,0,0,0,56,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
-Anoopsyche JH-G01B1 {"NAME":"JH-G01B1","GPIO":[0,145,0,146,0,0,0,0,17,56,21,0,0],"FLAG":0,"BASE":41}
-Anoopsyche UK1D {"NAME":"UK1D","GPIO":[0,17,0,0,133,132,0,0,130,52,21,0,0],"FLAG":0,"BASE":6}
-Aoycocr EU5-16A {"NAME":"Aoycocr","GPIO":[255,0,56,0,0,0,0,0,255,17,0,21,0],"FLAG":0,"BASE":17}
-Aoycocr Smart Plug {"NAME":"Aoycocr Smart ","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":1,"BASE":18}
-Arlec Grid Connect PC189HA {"NAME":"Arlec","GPIO":[0,0,0,0,123,0,0,0,21,56,17,0,0],"FLAG":0,"BASE":18}
-Arlec Twin PC288HA {"NAME":"Arlec Twin","GPIO":[0,17,0,22,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
-Aukey SH-PA1 {"NAME":"AUKEY SH-PA1","GPIO":[0,0,57,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
-Avatar 10A {"NAME":"AWP07L","GPIO":[56,255,255,255,255,134,255,255,130,17,132,21,255],"FLAG":1,"BASE":18}
-Avatar AWP07L 10A {"NAME":"Avatar AWP07L","GPIO":[56,255,255,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Avatto JH-G01E {"NAME":"AVATTO JH-G01E","GPIO":[0,145,0,146,0,0,0,0,17,56,21,0,0],"FLAG":0,"BASE":41}
-AWP02L-N {"NAME":"AWP02L-N","GPIO":[57,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":1,"BASE":18}
-AWP04L {"NAME":"AWP04L","GPIO":[57,255,255,131,255,134,0,0,21,17,132,56,255],"FLAG":0,"BASE":18}
-AWP07L {"NAME":"AISIRER AWP07L","GPIO":[0,0,0,0,56,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
-AWP08L {"NAME":"AWP08L","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":1,"BASE":18}
-AzpenHome Smart {"NAME":"Socket2Me","GPIO":[52,255,255,255,22,255,0,0,21,255,17,255,255],"FLAG":0,"BASE":18}
-Bestek MRJ1011 {"NAME":"BestekMRJ1011","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":1}
-Bilikay SP10 {"NAME":"Bilikay SP10","GPIO":[255,37,255,17,255,255,255,255,255,56,21,255,255],"FLAG":0,"BASE":18}
-Blitzwolf BW-SHP2 {"NAME":"BlitzWolf SHP","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Blitzwolf BW-SHP3 {"NAME":"Blitzwolf SHP3","GPIO":[56,0,57,0,22,134,0,0,131,18,132,21,17],"FLAG":0,"BASE":45}
-Blitzwolf BW-SHP3 alt {"NAME":"Blitzwolf SHP3","GPIO":[18,56,0,131,134,132,0,0,17,0,22,21,0],"FLAG":0,"BASE":18}
-Blitzwolf BW-SHP4 {"NAME":"BlitzWolf SHP","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Blitzwolf BW-SHP5 {"NAME":"SHP5","GPIO":[57,145,56,146,0,22,0,0,0,0,21,0,17],"FLAG":0,"BASE":18}
-Blitzwolf BW-SHP6 {"NAME":"BlitzWolf SHP","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Blitzwolf BW-SHP8 {"NAME":"SHP8","GPIO":[0,56,0,17,134,132,0,0,131,53,21,0,0],"FLAG":0,"BASE":64}
-BN-LINK BNC-60/U133TJ-2P {"NAME":"BNC-60/U133TJ","GPIO":[0,56,0,17,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":18}
-Brilliant USB Charger {"NAME":"Brilliant","GPIO":[0,0,0,0,0,21,0,0,0,52,90,0,0],"FLAG":0,"BASE":18}
-BSD15 {"NAME":"TuyaPlugBSD15","GPIO":[255,255,255,255,255,255,255,255,21,17,56,255,255],"FLAG":1,"BASE":18}
-BSD25 {"NAME":"Tuya Wifi Plug","GPIO":[255,255,255,255,56,255,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
-BSD29 {"NAME":"BSD29","GPIO":[0,0,0,131,134,132,0,0,21,17,56,0,0],"FLAG":0,"BASE":52}
-BSD33 {"NAME":"Generic","GPIO":[255,255,255,131,134,132,255,255,21,17,56,255,255],"FLAG":0,"BASE":18}
-BSD34 {"NAME":"BSD34 Plug","GPIO":[255,255,255,255,255,255,255,255,21,17,56,255,255],"FLAG":0,"BASE":18}
-CE Smart Home - LA-WF3 {"NAME":"CE LA-WF3","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-Conico SM-PW70 {"NAME":"Conico SM-PW70","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":1,"BASE":18}
-Coosa {"NAME":"COOSA","GPIO":[0,0,0,0,57,52,0,0,21,17,255,0,0],"FLAG":0,"BASE":1}
-Coosa SP1 {"NAME":"COOSA SP1","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-CrazyLynX WiFi {"NAME":"CrazyLynX","GPIO":[255,255,255,255,57,56,255,255,21,17,255,255,255],"FLAG":1,"BASE":18}
-CYYLTF BIFANS J23 {"NAME":"CYYLTD BIFANS J23","GPIO":[56,0,0,0,0,0,0,0,21,17,0,0,0],"FLAG":1,"BASE":18}
-Delock 11826 {"NAME":"Delock 11826","GPIO":[17,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
-Digoo DG-SP01 {"NAME":"DG-SP01","GPIO":[255,17,255,21,56,37,255,255,38,39,40,255,255],"FLAG":0,"BASE":18}
-Digoo NX-SP202 {"NAME":"Generic_SP202","GPIO":[52,0,0,131,91,134,0,0,22,17,132,21,0],"FLAG":0,"BASE":63}
-DILISENS SP201 {"NAME":"Dilisens SP201","GPIO":[0,0,131,0,133,132,52,21,18,22,17,0,0],"FLAG":0,"BASE":18}
-DWFeng AWP02L-N {"NAME":"AWP02L-N","GPIO":[255,255,56,255,255,255,255,255,255,17,255,21,255],"FLAG":0,"BASE":18}
-ECO Plugs CT-065W {"NAME":"ECO/CT-065W","GPIO":[255,255,255,255,255,255,255,255,255,17,255,21,255],"FLAG":0,"BASE":18}
-EFUN SH331W {"NAME":"Efun-Plug","GPIO":[56,0,158,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":18}
-EletecPro 2 {"NAME":"EletecPro-2","GPIO":[255,255,255,255,17,255,255,255,53,52,21,255,255],"FLAG":1,"BASE":18}
-ENJOWI SP111-EU-W {"NAME":"Enjowi SP111-E","GPIO":[17,56,0,0,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":55}
-Epicka {"NAME":"Epicka","GPIO":[255,255,255,255,57,56,255,255,21,17,255,255,255],"FLAG":1,"BASE":18}
-Esicoo YX-WS01 {"NAME":"Esicoo Plug","GPIO":[255,17,255,255,255,255,255,255,255,56,21,255,255],"FLAG":0,"BASE":18}
-Estink C178 {"NAME":"Estink C178","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-ESW01-US {"NAME":"ESW01-US","GPIO":[0,0,0,0,21,56,0,0,0,0,9,0,0],"FLAG":1,"BASE":18}
-ET RGB {"NAME":"RGB Smart Plug","GPIO":[37,0,39,0,38,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-EVA LOGIK NWF001 {"NAME":"EVA LOGIK Plug","GPIO":[255,17,255,255,255,255,255,255,255,52,21,255,255],"FLAG":0,"BASE":18}
-EVO-Smart JH-G01U {"NAME":"EVO JH-G01U","GPIO":[0,0,0,0,21,17,0,0,56,0,0,0,0],"FLAG":0,"BASE":18}
-FK-PW901U {"NAME":"FK-PW901U","GPIO":[56,255,255,255,255,23,255,255,21,17,24,22,255],"FLAG":0,"BASE":18}
-FLHS-ZN04 {"NAME":"FLHS-ZN04","GPIO":[57,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Fontastic SH01 {"NAME":"Fontastic","GPIO":[255,0,255,0,56,0,255,255,21,17,0,0,0],"FLAG":1,"BASE":18}
-FrankEver FLHS-ZN04 {"NAME":"Israel plug","GPIO":[57,0,56,131,0,134,0,0,0,17,132,21,0],"FLAG":0,"BASE":45}
-GDTech W-US001 {"NAME":"GDTech W-US001","GPIO":[255,17,255,255,255,255,255,255,255,56,21,255,255],"FLAG":1,"BASE":18}
-GDTech W-US003 {"NAME":"W-US003","GPIO":[0,17,255,255,255,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
-Geeni Charge {"NAME":"Geeni Charge","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-Geeni Glo {"NAME":"Geeni Glo","GPIO":[0,0,0,0,56,0,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
-Geeni Spot {"NAME":"Geeni Spot","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-Geeni Switch Duo {"NAME":"Geeni Duo","GPIO":[0,0,0,0,18,22,0,0,17,52,21,0,53],"FLAG":0,"BASE":18}
-Globe Smart {"NAME":"GlobeSmartPlug","GPIO":[0,0,0,0,56,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":18}
-Gosund SP1 {"NAME":"Gosund SP1 v23","GPIO":[0,56,0,17,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":55}
-Gosund SP111 {"NAME":"Gosund SP111","GPIO":[56,0,57,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":18}
-Gosund SP112 {"NAME":"SHP5","GPIO":[56,145,57,146,255,22,0,0,255,255,21,255,18],"FLAG":0,"BASE":18}
-Gosund WP1-1 {"NAME":"Gosund WP1-1","GPIO":[0,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Gosund WP211 {"NAME":"Gosund wp211","GPIO":[0,0,0,0,21,0,0,0,0,17,0,22,18],"FLAG":0,"BASE":18}
-Gosund WP212 {"NAME":"Gosund_WP212","GPIO":[17,0,0,0,18,0,0,0,21,0,22,0,0],"FLAG":0,"BASE":18}
-Gosund WP3 {"NAME":"Gosund WP3","GPIO":[0,0,0,0,17,0,0,0,56,57,21,0,0],"FLAG":0,"BASE":18}
-Gosund WP5 {"NAME":"Gosund-WP5","GPIO":[255,255,255,255,17,255,255,255,53,52,21,255,255],"FLAG":1,"BASE":18}
-Gosund WP6 {"NAME":"Gosund WP6","GPIO":[0,0,0,17,0,0,0,0,56,57,21,0,0],"FLAG":0,"BASE":18}
-Grefic TE101 {"NAME":"Grefic TE101","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":1}
-Gyman SM-PW701U {"NAME":"Gyman","GPIO":[255,255,157,255,56,255,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
-Hauppauge SL-1642 {"NAME":"SL-1642","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-HiHome WPP-16T {"NAME":"HiHome WPP-16T","GPIO":[17,56,255,255,134,132,255,255,18,255,22,130,21],"FLAG":1,"BASE":18}
-hiwild W-US002 {"NAME":"W-US002","GPIO":[0,17,0,0,0,0,0,0,0,52,21,0,158],"FLAG":0,"BASE":18}
-Houzetek AWP07L {"NAME":"AWP07L","GPIO":[56,255,255,130,255,134,255,255,0,17,132,21,255],"FLAG":0,"BASE":18}
-HuaFan QinLu {"NAME":"Huafan SS","GPIO":[56,0,0,57,17,29,0,0,132,130,133,0,0],"FLAG":0,"BASE":24}
-Hyleton 313 {"NAME":"Hyleton 313","GPIO":[57,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
-Hyleton 317 {"NAME":"hyleton-317","GPIO":[56,0,57,0,58,0,0,0,0,90,0,21,0],"FLAG":0,"BASE":18}
-Innens BSD29 {"NAME":"BSD29","GPIO":[0,0,56,131,0,134,0,0,0,17,132,21,0],"FLAG":0,"BASE":52}
-iSwitch {"NAME":"Smart Plug XSA","GPIO":[255,17,255,255,255,255,255,255,255,56,21,255,255],"FLAG":0,"BASE":18}
-Jeeo TF-SH330 {"NAME":"Jeeo TF-SH330","GPIO":[56,255,255,255,255,255,255,255,255,17,255,21,255],"FLAG":1,"BASE":18}
-Jinvoo SM-PW701U {"NAME":"SM-PW702","GPIO":[0,0,0,0,57,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-Jinvoo SM-PW762U {"NAME":"SM-PW762U","GPIO":[0,0,0,0,158,56,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
-Jules V (Upgrade Version) {"NAME":"Jules-V_UV","GPIO":[56,0,0,0,0,134,0,0,21,17,132,57,131],"FLAG":0,"BASE":18}
-Jules.V NX-SM300 {"NAME":"NX-SM300","GPIO":[52,0,0,0,0,130,0,0,21,132,133,52,0],"FLAG":0,"BASE":6}
-Kimire S12 {"NAME":"Kimire S12","GPIO":[255,255,255,17,255,255,255,255,255,56,21,255,255],"FLAG":0,"BASE":18}
-King-Link C128 {"NAME":"King-Link C128","GPIO":[0,0,55,0,22,53,0,0,23,52,17,21,54],"FLAG":0,"BASE":18}
-KMC 4 30608 {"NAME":"KMC 4 Outlet","GPIO":[0,56,0,0,133,132,0,0,130,22,23,21,17],"FLAG":0,"BASE":36}
-KMC 70011 {"NAME":"KMC 70011","GPIO":[17,0,0,0,133,132,0,0,130,56,21,0,0],"FLAG":0,"BASE":36}
-Kogan SmarterHome™ Energy Meter {"NAME":"Kogan Smart Sw","GPIO":[17,0,0,0,133,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18}
-Koogeek KLSP1 {"NAME":"Koogeek-KLSP1","GPIO":[0,0,0,17,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18}
-Koogeek KLUP1 {"NAME":"Koogeek-KLUP1","GPIO":[0,0,0,17,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18}
-LA-WF3 {"NAME":"CE Smart Plug","GPIO":[255,255,255,255,56,57,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
-Laduo YX-DE01 {"NAME":"YX-DE01","GPIO":[255,17,255,255,255,255,255,255,255,56,21,255,255],"FLAG":0,"BASE":18}
-LESHP KS-501 {"NAME":"LESHP KS-501","GPIO":[17,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
-LINGANZH 16A {"NAME":"Linganzh Smart","GPIO":[56,0,0,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
-Lonsonho 10A Type E {"NAME":"Lonsonho10ALed","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-Lonsonho RGB {"NAME":"RGB Smart Plug","GPIO":[37,0,38,0,0,39,0,0,0,17,0,21,0],"FLAG":0,"BASE":45}
-LSC Smart Connect {"NAME":"LSC Smart Plug","GPIO":[255,255,255,255,56,255,255,255,21,255,17,255,255],"FLAG":0,"BASE":18}
-Luminea ZX-2820-675 {"NAME":"ZX2820-675","GPIO":[0,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Luminea ZX-2820-919 {"NAME":"Luminea ZX2820","GPIO":[17,0,0,0,133,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":65}
-Martin Jerry {"NAME":"MJ V01","GPIO":[255,255,255,255,56,255,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
-Martin Jerry XS-SSA01 {"NAME":"MJ_XS-SSA01","GPIO":[0,0,0,0,0,0,0,0,56,17,0,21,0],"FLAG":0,"BASE":18}
-Maxcio W-DE004 {"NAME":"Maxcio W-DE004","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":1,"BASE":18}
-Maxcio W-UK007 {"NAME":"Maxcio","GPIO":[0,17,0,0,0,0,255,255,0,56,21,0,0],"FLAG":0,"BASE":18}
-Maxcio W-UK007S {"NAME":"Maxcio","GPIO":[56,0,255,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Maxcio W-US002S {"NAME":"W-US002S","GPIO":[57,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Maxcio W-US003 {"NAME":"W-US003","GPIO":[255,17,255,255,255,255,255,255,255,22,21,255,255],"FLAG":0,"BASE":18}
-Maxcio YX-DE02 {"NAME":"Generic","GPIO":[255,17,255,21,56,37,255,255,38,39,40,255,255],"FLAG":1,"BASE":18}
-Merisny P2 {"NAME":"Generic","GPIO":[0,0,52,0,0,0,0,0,0,17,0,21,0],"FLAG":1,"BASE":18}
-Merkury 70011 MIC-WW102 {"NAME":"MIC-WW102","GPIO":[17,0,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":36}
-Merkury Innovations {"NAME":"Merkury Switch","GPIO":[255,255,255,255,53,56,255,255,21,17,255,255,255],"FLAG":1,"BASE":18}
-Merkury MI-OW101-101W {"NAME":"Merkury Switch","GPIO":[17,255,255,255,255,56,255,255,255,255,21,255,255],"FLAG":1,"BASE":18}
-Mirabella Genio {"NAME":"Genio 1","GPIO":[0,0,56,0,0,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":1}
-Nanxin NX-SM200 16A {"NAME":"NX-SM200","GPIO":[56,0,0,0,0,134,0,0,21,17,132,57,131],"FLAG":0,"BASE":18}
-NEO Coolcam 16A {"NAME":"Neo Coolcam 16","GPIO":[17,0,0,0,133,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":49}
-Obi Stecker {"NAME":"OBI Socket","GPIO":[255,255,0,255,52,21,0,0,54,255,17,0,255],"FLAG":1,"BASE":51}
-Obi Stecker 2 {"NAME":"OBI Socket 2","GPIO":[0,0,0,0,21,17,0,0,56,53,0,0,0],"FLAG":0,"BASE":61}
-Obi Stecker IP44 {"NAME":"OBI Socket 2","GPIO":[0,0,0,0,21,17,0,0,56,53,0,0,0],"FLAG":0,"BASE":61}
-Oittm Smart {"NAME":"Oittm","GPIO":[0,0,0,0,21,56,0,0,17,0,0,0,0],"FLAG":0,"BASE":1}
-Oukitel P1 {"NAME":"Oukitel P1Dual","GPIO":[52,255,255,255,255,255,255,255,22,17,255,21,255],"FLAG":0,"BASE":18}
-Oukitel X6P {"NAME":"OUKITEL X6P","GPIO":[255,255,57,255,255,255,255,255,255,17,255,21,255],"FLAG":0,"BASE":18}
-OxaOxe NX-SM200 {"NAME":"NX-SM200","GPIO":[17,0,0,0,133,132,0,0,131,158,21,0,0],"FLAG":0,"BASE":18}
-Oxaoxe NX-SM800 {"NAME":"NX-SM800","GPIO":[0,0,0,131,0,134,0,0,21,17,132,0,0],"FLAG":0,"BASE":45}
-OxaOxe NX-SP202 {"NAME":"oxaoxe-dual","GPIO":[18,0,0,0,134,132,0,0,131,56,21,22,17],"FLAG":0,"BASE":18}
-OxaOxe NX-SP202 v2 {"NAME":"oxaoxe-dold","GPIO":[56,0,0,131,17,134,0,0,21,18,132,22,0],"FLAG":0,"BASE":18}
-Panamalar NX-SM200 16A {"NAME":"NX-SM200","GPIO":[0,0,0,0,56,134,0,0,131,17,132,21,0],"FLAG":1,"BASE":18}
-Powertech {"NAME":"Jaycar","GPIO":[56,0,0,0,0,0,0,0,0,9,0,21,0],"FLAG":0,"BASE":6}
-Powrui AW-08 {"NAME":"POWRUI AW-08","GPIO":[0,0,0,0,9,21,0,0,0,52,57,0,0],"FLAG":1,"BASE":18}
-Prime CCRCWFII113PK {"NAME":"Prime","GPIO":[0,0,0,0,57,56,0,0,21,122,0,0,0],"FLAG":0,"BASE":18}
-RGB Light {"NAME":"RGB Light","GPIO":[37,0,38,0,0,39,0,0,0,90,0,21,0],"FLAG":0,"BASE":18}
-RSH-WS007 {"NAME":"RSH-WS007","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":1,"BASE":18}
-Shelly Plug S {"NAME":"Shelly Plug S","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":2,"BASE":45}
-Slitinto NX-SM110 {"NAME":"Slitinto SM110","GPIO":[0,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Slitinto NX-SM112 {"NAME":"NX-SM112","GPIO":[158,0,0,131,0,134,0,0,0,17,132,21,0],"FLAG":0,"BASE":45}
-Slitinto NX-SP202 {"NAME":"Slitinto SP202","GPIO":[17,0,0,0,134,132,0,0,131,52,22,21,91],"FLAG":0,"BASE":64}
-SM-PW702 {"NAME":"SM-PW702","GPIO":[0,0,0,0,57,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-SmartDGM PP-W162 {"NAME":"SmartDGM Plug","GPIO":[0,0,0,17,134,132,0,0,131,52,21,0,0],"FLAG":0,"BASE":18}
-Sonoff S20 {"NAME":"Sonoff S20","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":8}
-Sonoff S22 TH {"NAME":"Sonoff S22","GPIO":[17,255,0,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":4}
-Sonoff S26 {"NAME":"Sonoff S26","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":8}
-Sonoff S31 {"NAME":"Sonoff S31","GPIO":[17,145,0,146,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":41}
-SP201 Dual {"NAME":"SP-201","GPIO":[31,0,0,131,17,134,0,0,21,18,132,22,0],"FLAG":0,"BASE":45}
-SS01 {"NAME":"Smart Plug SS0","GPIO":[255,255,255,255,255,255,255,255,21,17,255,255,255],"FLAG":1,"BASE":18}
-STITCH by Monoprice 27937 {"NAME":"Stitch 27937","GPIO":[17,0,56,0,133,132,0,0,131,0,21,0,57],"FLAG":0,"BASE":18}
-STITCH by Monoprice 35511 {"NAME":"Stitch 35511","GPIO":[56,0,57,0,0,0,0,0,0,17,0,21,0],"FLAG":1,"BASE":18}
-SuperNight Dual {"NAME":"SuperNight Dua","GPIO":[255,17,255,21,132,133,255,255,22,130,58,255,255],"FLAG":1,"BASE":18}
-SWA1 {"NAME":"SWA1","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
-SWA1 {"NAME":"SWA1","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
-SWA11 {"NAME":"SWA1","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
-SWA9 {"NAME":"SWA9","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
-TanTan WP3 {"NAME":"TanTan WP3","GPIO":[57,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
-Teckin SP10 {"NAME":"Teckin SP10","GPIO":[255,255,56,255,255,255,255,255,255,17,255,21,255],"FLAG":0,"BASE":18}
-Teckin SP20 {"NAME":"TECKIN SP20","GPIO":[56,255,57,255,21,134,0,0,131,17,132,0,0],"FLAG":0,"BASE":45}
-Teckin SP21 {"NAME":"Teckin SP21","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":45}
-Teckin SP22 {"NAME":"Teckin","GPIO":[0,17,0,57,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":52}
-Teckin SP23 {"NAME":"Teckin SP23","GPIO":[56,255,57,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
-Teckin SP25 {"NAME":"Teckin SP25","GPIO":[56,255,255,255,255,255,255,255,22,17,255,21,255],"FLAG":1,"BASE":18}
-Teckin SP27 {"NAME":"Teckin SP27","GPIO":[56,255,255,255,255,255,255,255,255,17,255,21,255],"FLAG":0,"BASE":18}
-Tflag NX-SM100 {"NAME":"NX-SM100","GPIO":[56,0,0,0,0,134,0,0,21,17,132,57,131],"FLAG":0,"BASE":18}
-THRUMM XS-A11 {"NAME":"THRUMM XS-A11 ","GPIO":[255,17,255,255,255,255,255,255,255,56,29,255,255],"FLAG":0,"BASE":18}
-Timethinker TK04 {"NAME":"TimethinkerEU","GPIO":[255,255,255,255,17,255,0,0,255,52,21,255,0],"FLAG":0,"BASE":18}
-TimeThinker WS2 {"NAME":"TimeThinkerWS2","GPIO":[0,0,0,0,17,0,0,0,0,52,21,0,0],"FLAG":0,"BASE":18}
-TomaxUSA HKWL-SO07W {"NAME":"HKWL-SO07W","GPIO":[17,255,255,255,255,255,255,255,255,255,21,255,56],"FLAG":0,"BASE":18}
-WAGA life CHCZ02MB {"NAME":"WAGA CHCZ02MB","GPIO":[57,0,0,131,0,134,0,0,21,17,132,56,0],"FLAG":0,"BASE":68}
-WAZA 10A {"NAME":"WAZA","GPIO":[0,0,0,0,21,17,0,0,56,0,0,0,0],"FLAG":1,"BASE":18}
-WAZA JH-G01B {"NAME":"Teckin SP27","GPIO":[255,255,255,255,53,255,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
-WAZA JH-G01E {"NAME":"Waza JH-G01E","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":1,"BASE":18}
-WiOn 50055 {"NAME":"WiOn","GPIO":[255,0,52,0,0,0,0,0,255,17,0,21,0],"FLAG":0,"BASE":17}
-WL-SC01 {"NAME":"WL-SC01","GPIO":[0,0,0,0,56,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":1}
-Woox R4026 {"NAME":"WOOX R4026","GPIO":[0,0,0,17,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
-XS-SSA01 {"NAME":"XS-SSA01","GPIO":[255,17,255,255,255,255,255,255,255,56,21,255,255],"FLAG":0,"BASE":18}
-XS-SSA01 Alternate {"NAME":"XS-SSA01","GPIO":[255,17,255,255,255,255,255,255,56,255,255,21,255],"FLAG":0,"BASE":18}
-XS-SSA05 {"NAME":"XS-SSA05","GPIO":[30,255,255,131,255,133,255,255,21,17,132,31,255],"FLAG":1,"BASE":18}
-XS-SSA06 {"NAME":"RGB Light","GPIO":[37,0,38,0,0,39,0,0,0,90,0,21,0],"FLAG":0,"BASE":18}
-Yelomin JH-G01E {"NAME":"Yelomin","GPIO":[0,145,0,146,0,0,0,0,17,56,21,0,0],"FLAG":0,"BASE":18}
-YERON US101 {"NAME":"YERON_US101","GPIO":[255,255,255,17,133,132,255,255,131,56,21,255,255],"FLAG":0,"BASE":18}
-YT-E003 {"NAME":"YT-E003-SP202","GPIO":[17,0,0,0,134,132,0,0,131,52,22,21,91],"FLAG":0,"BASE":64}
-YX-WS02 {"NAME":"Amysen YX-WS02","GPIO":[255,17,255,255,255,255,255,255,255,56,21,255,255],"FLAG":1,"BASE":18}
-ZBR-001 {"NAME":"ZBR-001","GPIO":[17,255,255,255,133,132,255,255,130,56,21,255,57],"FLAG":1,"BASE":18}
-ZooZee {"NAME":"ZooZee","GPIO":[57,255,56,255,255,255,255,255,255,17,255,21,255],"FLAG":0,"BASE":18}
-ZooZee SA102 {"NAME":"ZooZee","GPIO":[57,255,56,255,21,133,255,255,131,17,132,255,255],"FLAG":0,"BASE":18}
-ZooZee SE131 {"NAME":"ZooZee SE131","GPIO":[255,0,56,0,0,0,0,0,255,17,0,21,0],"FLAG":0,"BASE":17}
-ZSP-001 {"NAME":"ZSP-001","GPIO":[17,255,255,255,133,132,255,255,130,57,21,255,56],"FLAG":1,"BASE":18}
+2nice SP111 {"NAME":"2NICE SP111","GPIO":[56,0,57,0,0,0,0,0,0,17,0,21,0],"FLAG":2,"BASE":18}
+2nice UP111 {"NAME":"2NICE UP111","GPIO":[0,52,0,17,134,132,0,0,131,157,21,0,0],"FLAG":0,"BASE":18}
+3Stone Mini {"NAME":"3Stone Smart P","GPIO":[0,17,0,0,0,0,0,0,0,57,21,0,0],"FLAG":0,"BASE":18}
+Ablue WP1 {"NAME":"Ablue","GPIO":[57,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":1,"BASE":18}
+Aigoss 16A Mini {"NAME":"Aigoss Plug","GPIO":[255,255,0,255,52,21,0,0,54,255,17,0,255],"FLAG":15,"BASE":51}
+Aisirer AWP07L {"NAME":"AISIRER AWP07L","GPIO":[56,0,57,0,0,133,0,0,131,17,132,21,0],"FLAG":0,"BASE":18}
+Aisirer AWP07L v2 {"NAME":"AWP07L v2","GPIO":[0,17,57,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18}
+Aisirer AWP08L {"NAME":"AISIRER AWP08L","GPIO":[0,0,56,0,0,0,0,0,0,0,0,21,0],"FLAG":0,"BASE":18}
+Aisirer AWP08L v2 {"NAME":"AISIRER AWP08L","GPIO":[0,0,0,0,17,57,0,0,21,0,0,0,0],"FLAG":0,"BASE":18}
+Aisirer JH-G018 v2 {"NAME":"AISIRER JH-G01","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Aisirer JH-G01B {"NAME":"AISIRER","GPIO":[0,0,0,0,21,0,0,0,56,17,0,0,0],"FLAG":1,"BASE":18}
+Aisirer SWA11 {"NAME":"SWA11","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
+Aisirer UK-1 {"NAME":"AISIRER","GPIO":[0,17,0,0,0,0,0,0,0,52,21,0,0],"FLAG":1,"BASE":18}
+Alexfirst TV-ASP801EU {"NAME":"Alexfirst","GPIO":[17,0,0,0,54,56,0,0,21,0,0,0,0],"FLAG":0,"BASE":18}
+Alfawise PE1004T {"NAME":"PE1004T","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Alfawise PME1606 {"NAME":"PME1606","GPIO":[0,0,0,17,133,132,0,0,131,52,21,0,0],"FLAG":0,"BASE":18}
+Amysen JSM-WF02 {"NAME":"Amysen JSMWF02","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+Amysen YX-WS01 {"NAME":"Amysen YX-WS01","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+ANBES ABS-CZ004 {"NAME":"ANBES ABS-CZ00","GPIO":[0,0,0,0,21,133,0,0,131,17,132,22,18],"FLAG":0,"BASE":18}
+Anncoe C318 {"NAME":"Anncoe C318","GPIO":[90,145,255,146,0,0,0,0,21,53,0,0,0],"FLAG":0,"BASE":18}
+Anoopsyche AWP08L {"NAME":"AWP08L-Annopsy","GPIO":[0,0,0,0,17,56,0,0,21,0,0,0,0],"FLAG":0,"BASE":18}
+Anoopsyche SP-G01 {"NAME":"SP-G01","GPIO":[0,145,0,146,0,0,0,0,17,56,21,0,0],"FLAG":0,"BASE":41}
+Anoopsyche SP15 {"NAME":"Anoop SP15","GPIO":[0,0,0,0,56,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
+Anoopsyche UK1D {"NAME":"UK1D","GPIO":[0,17,0,0,133,132,0,0,130,52,21,0,0],"FLAG":0,"BASE":6}
+Aoycocr EU5 16A {"NAME":"Aoycocr","GPIO":[255,0,56,0,0,0,0,0,255,17,0,21,0],"FLAG":0,"BASE":17}
+Aoycocr EU6S {"NAME":"Aoycocr EU6S","GPIO":[255,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":17}
+Aoycocr U2S {"NAME":"Aoycocr U2S","GPIO":[56,0,57,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Aoycocr U3S {"NAME":"Aoycocr U3S","GPIO":[56,255,57,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Aoycocr X10S {"NAME":"Aoycocr X10S","GPIO":[56,0,57,0,21,134,0,0,131,17,132,0,0],"FLAG":0,"BASE":45}
+Aoycocr X5P {"NAME":"Aoycocr X5P","GPIO":[56,0,57,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Aoycocr X6 {"NAME":"Aoycocr X6","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Arlec PC189HA {"NAME":"Arlec Single","GPIO":[0,0,0,0,57,0,0,0,21,0,90,0,0],"FLAG":0,"BASE":18}
+Arlec PC190HA {"NAME":"Arlec-PC190HA","GPIO":[0,0,0,0,0,0,0,0,21,56,17,0,0],"FLAG":0,"BASE":18}
+Arlec Twin PC288HA {"NAME":"Arlec Twin","GPIO":[0,17,0,22,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+Atomi AT1217 {"NAME":"AT1217","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Aukey SH-PA1 {"NAME":"AUKEY SH-PA1","GPIO":[0,0,57,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Aunics Smart EU {"NAME":"AUNICS","GPIO":[0,0,0,17,134,132,0,0,131,157,21,0,0],"FLAG":0,"BASE":18}
+Aunics Smart IT {"NAME":"AUNICS","GPIO":[0,0,0,17,134,132,0,0,131,157,21,0,0],"FLAG":0,"BASE":18}
+Avatar AWP01L {"NAME":"AWP01L","GPIO":[0,0,0,0,0,56,0,0,0,17,21,0,0],"FLAG":0,"BASE":18}
+Avatar AWP02L-N {"NAME":"AWP02L-N","GPIO":[158,0,0,0,56,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Avatar AWP04L {"NAME":"AWP04L","GPIO":[57,255,255,131,255,134,0,0,21,17,132,56,255],"FLAG":0,"BASE":18}
+Avatar AWP07L {"NAME":"AWP07L","GPIO":[56,255,255,255,255,134,0,0,130,17,132,21,255],"FLAG":1,"BASE":18}
+Avatar AWP07L v2 {"NAME":"AWP07L","GPIO":[56,255,255,255,255,134,255,255,131,17,132,21,255],"FLAG":0,"BASE":18}
+Avatar AWP08L {"NAME":"AWP08L","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Avatar AWP12L Capsule 2-in-1 {"NAME":"Dual Plug","GPIO":[0,0,0,0,0,0,0,0,21,17,0,22,0],"FLAG":0,"BASE":18}
+Avatar AWP14H {"NAME":"Avatar UK 10A","GPIO":[0,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Avatto JH-G01E {"NAME":"AVATTO JH-G01E","GPIO":[0,145,0,146,0,0,0,0,17,56,21,0,0],"FLAG":0,"BASE":41}
+Avatto NAS-WR01W 10A {"NAME":"AvattoNAS-WR01W","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Avatto OT06 16A {"NAME":"Avatto OT06","GPIO":[17,0,0,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":49}
+AWP02L-N {"NAME":"AWP02L-N","GPIO":[57,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":1,"BASE":18}
+AzpenHome Smart {"NAME":"Socket2Me","GPIO":[52,255,255,255,22,255,0,0,21,255,17,255,255],"FLAG":0,"BASE":18}
+Bakibo TP22Y {"NAME":"Bakibo TP22Y","GPIO":[0,0,0,17,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":52}
+Bauhn ASPU-1019 {"NAME":"Buahn Smart Pl","GPIO":[0,0,0,0,21,22,0,0,0,56,17,0,0],"FLAG":0,"BASE":18}
+Bestek MRJ1011 {"NAME":"BestekMRJ1011","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":1}
+BlitzWolf BW-SHP2 {"NAME":"BlitzWolf SHP","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+BlitzWolf BW-SHP3 {"NAME":"BlitzWolf SHP3","GPIO":[56,0,57,0,22,134,0,0,131,18,132,21,17],"FLAG":0,"BASE":45}
+BlitzWolf BW-SHP3 alt {"NAME":"BlitzWolf SHP3","GPIO":[18,56,0,131,134,132,0,0,17,0,22,21,0],"FLAG":0,"BASE":18}
+BlitzWolf BW-SHP4 {"NAME":"BlitzWolf SHP","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+BlitzWolf BW-SHP5 {"NAME":"SHP5","GPIO":[57,145,56,146,0,22,0,0,0,0,21,0,17],"FLAG":0,"BASE":18}
+BlitzWolf BW-SHP6 10A {"NAME":"BW-SHP6 10A","GPIO":[158,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Blitzwolf BW-SHP6 15A {"NAME":"Blitzwolf SHP6","GPIO":[56,255,158,255,132,134,0,0,131,17,0,21,0],"FLAG":0,"BASE":45}
+BlitzWolf BW-SHP7 {"NAME":"SHP7","GPIO":[17,158,57,131,134,132,0,0,18,56,21,0,22],"FLAG":0,"BASE":45}
+BN-LINK BNC-60/U133TJ-2P {"NAME":"BNC-60/U133TJ","GPIO":[0,56,0,17,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":18}
+Brennenstuhl WA 3000 XS01 {"NAME":"WA 3000 XS01","GPIO":[0,0,0,0,21,17,0,0,158,52,0,0,0],"FLAG":0,"BASE":61}
+Brilliant HK17654S05 {"NAME":"HK17654S05","GPIO":[17,255,255,255,133,132,255,255,131,56,21,255,255],"FLAG":0,"BASE":18}
+Brilliant Lighting BL20925 {"NAME":"BL20925","GPIO":[0,0,0,17,133,132,0,0,131,158,21,0,0],"FLAG":0,"BASE":52}
+BrilliantSmart 20676 USB Charger {"NAME":"Brilliant","GPIO":[0,0,0,0,0,21,0,0,0,52,90,0,0],"FLAG":0,"BASE":18}
+BSD13 {"NAME":"TuyaPlugBSD13","GPIO":[0,57,0,0,0,0,0,0,21,17,52,0,0],"FLAG":0,"BASE":18}
+BSD15 {"NAME":"TuyaPlugBSD15","GPIO":[255,255,255,255,255,255,0,0,21,17,56,255,255],"FLAG":1,"BASE":18}
+BSD25 {"NAME":"Tuya Wifi Plug","GPIO":[255,255,255,255,56,255,0,0,21,17,255,255,255],"FLAG":0,"BASE":18}
+BSD29 {"NAME":"BSD29","GPIO":[0,0,0,131,134,132,0,0,21,17,56,0,0],"FLAG":0,"BASE":52}
+BSD33 10A {"NAME":"BSD33 type 2","GPIO":[0,0,56,0,0,0,0,0,255,17,255,21,255],"FLAG":0,"BASE":18}
+BSD33 16A {"NAME":"Generic","GPIO":[0,255,0,131,134,132,0,0,21,17,56,0,0],"FLAG":0,"BASE":18}
+BSD34 {"NAME":"BSD34 Plug","GPIO":[0,0,0,0,0,0,0,0,21,17,56,0,0],"FLAG":0,"BASE":18}
+BSD48 16A {"NAME":"BSD48 Plug","GPIO":[0,52,0,0,0,0,0,0,21,17,57,0,0],"FLAG":0,"BASE":18}
+CE Smart Home LA-WF3 {"NAME":"CE LA-WF3","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+CE Smart Home LA-WF7 {"NAME":"LITESUN LA-WF7","GPIO":[0,56,0,17,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":18}
+Conico SM-PW70 {"NAME":"Conico SM-PW70","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":1,"BASE":18}
+Connex CC-P1000 {"NAME":"Connex Smart T","GPIO":[17,0,0,0,133,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18}
+Coosa {"NAME":"COOSA","GPIO":[0,0,0,0,57,52,0,0,21,17,255,0,0],"FLAG":0,"BASE":1}
+Coosa SP1 {"NAME":"COOSA SP1","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+CrazyLynX WiFi {"NAME":"CrazyLynX","GPIO":[0,0,0,0,57,56,0,0,21,17,0,0,0],"FLAG":1,"BASE":18}
+CYYLTF BIFANS J23 {"NAME":"CYYLTD BIFANS J23","GPIO":[56,0,0,0,0,0,0,0,21,17,0,0,0],"FLAG":1,"BASE":18}
+DE-1 16A {"NAME":"DE-1","GPIO":[0,17,0,0,133,0,0,0,0,52,21,0,0],"FLAG":1,"BASE":18}
+DeLock 11826 {"NAME":"DeLock 11826","GPIO":[17,0,0,0,0,0,0,0,21,158,0,0,0],"FLAG":0,"BASE":1}
+Deltaco SH-P01 {"NAME":"DELTACO SH-P01","GPIO":[0,0,0,0,0,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Deltaco SH-P01E {"NAME":"DELTACO SH-P01E","GPIO":[0,56,0,17,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":55}
+Deltaco SH-P02 {"NAME":"Deltaco SH-P02","GPIO":[18,0,0,0,134,132,0,0,131,56,21,22,17],"FLAG":0,"BASE":18}
+Deta 6930HA {"NAME":"DetaSmartPlug","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+Digoo DG-SP01 {"NAME":"DG-SP01","GPIO":[255,17,255,21,56,37,0,0,38,39,40,255,255],"FLAG":0,"BASE":18}
+Digoo NX-SP202 {"NAME":"Generic_SP202","GPIO":[52,0,0,131,91,134,0,0,22,17,132,21,0],"FLAG":0,"BASE":63}
+Dilisens NX-SP201 Mini 2 in 1 {"NAME":"NX-SP201","GPIO":[0,0,131,0,134,132,52,21,18,22,17,0,0],"FLAG":0,"BASE":18}
+DILISENS SP201 {"NAME":"Dilisens SP201","GPIO":[0,0,131,0,133,132,52,21,18,22,17,0,0],"FLAG":0,"BASE":18}
+Dunnes Stores {"NAME":"SmartLifePlug","GPIO":[0,0,0,17,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+DWFeng AWP02L-N {"NAME":"AWP02L-N","GPIO":[255,255,56,255,255,255,0,0,255,17,255,21,255],"FLAG":0,"BASE":18}
+DWFeng BSD01 {"NAME":"DWFeng BSD01","GPIO":[255,255,255,255,255,255,255,255,21,17,56,255,255],"FLAG":15,"BASE":18}
+ECO Plugs CT-065W {"NAME":"ECO/CT-065W","GPIO":[255,255,255,255,255,255,0,0,255,17,255,21,255],"FLAG":0,"BASE":18}
+eco4life DPS1101S {"NAME":"Eco4Life Plug","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+ednet 84334 {"NAME":"84334","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+eFamilyCloud ASDFEE174 {"NAME":"eFamily Plug","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
+EFUN SH331W {"NAME":"Efun-Plug","GPIO":[56,0,158,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":18}
+EletecPro 2 {"NAME":"EletecPro-2","GPIO":[255,255,255,255,17,255,0,0,53,52,21,255,255],"FLAG":1,"BASE":18}
+Enjowi SP111-EU-W {"NAME":"Enjowi SP111-E","GPIO":[17,56,0,0,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":55}
+Epicka {"NAME":"Epicka","GPIO":[255,255,255,255,57,56,0,0,21,17,255,255,255],"FLAG":1,"BASE":18}
+Esicoo JSM-WF02 {"NAME":"Esicoo Plug","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+Esicoo YX-WS01 {"NAME":"Esicoo Plug","GPIO":[255,17,255,255,255,255,0,0,255,56,21,255,255],"FLAG":0,"BASE":18}
+Estink C178 {"NAME":"Estink C178","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Etekcity ESW01-USA {"NAME":"ESW01-USA","GPIO":[0,0,0,0,21,157,0,0,132,133,17,130,52],"FLAG":0,"BASE":55}
+Eva Logik NWF001 {"NAME":"EVA LOGIK Plug","GPIO":[255,17,255,255,255,255,0,0,255,52,21,255,255],"FLAG":0,"BASE":18}
+EVO-Smart JH-G01U {"NAME":"EVO JH-G01U","GPIO":[0,0,0,0,21,17,0,0,56,0,0,0,0],"FLAG":0,"BASE":18}
+Feit Electric PLUG/WIFI {"NAME":"Feit Wifi Plug","GPIO":[0,0,0,56,0,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":18}
+FK-PW901U {"NAME":"FK-PW901U","GPIO":[56,255,255,255,255,23,0,0,21,17,24,22,255],"FLAG":0,"BASE":18}
+FLHS-ZN04 {"NAME":"FLHS-ZN04","GPIO":[57,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Fontastic SH01 {"NAME":"Fontastic","GPIO":[255,0,255,0,56,0,0,0,21,17,0,0,0],"FLAG":1,"BASE":18}
+FrankEver FLHS-ZN04 {"NAME":"Israel plug","GPIO":[57,0,56,131,0,134,0,0,0,17,132,21,0],"FLAG":0,"BASE":45}
+GDTech W-US001 {"NAME":"GDTech W-US001","GPIO":[255,17,255,255,255,255,0,0,255,56,21,255,255],"FLAG":1,"BASE":18}
+GDTech W-US003 {"NAME":"W-US003","GPIO":[0,17,255,255,255,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+Geeni Spot {"NAME":"Geeni Spot","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Geeni Spot Glo {"NAME":"Geeni Glo","GPIO":[0,0,0,0,56,0,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
+Geeni Switch {"NAME":"Geeni Switch","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Geeni Switch Duo {"NAME":"Geeni Duo","GPIO":[0,0,0,0,18,22,0,0,17,52,21,0,53],"FLAG":0,"BASE":18}
+Globe 50020 2 Outlet {"NAME":"Globe 50020","GPIO":[0,158,0,57,18,17,0,0,21,56,22,0,0],"FLAG":0,"BASE":18}
+Globe Smart {"NAME":"GlobeSmartPlug","GPIO":[0,0,0,0,56,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":18}
+GoldenDot Mini {"NAME":"GoldenDot Mini","GPIO":[0,17,0,0,0,0,0,0,0,57,21,0,0],"FLAG":0,"BASE":52}
+Gosund SP1 {"NAME":"Gosund SP1 v23","GPIO":[0,56,0,17,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":55}
+Gosund SP111 {"NAME":"Gosund SP111","GPIO":[56,0,57,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":18}
+Gosund SP111 v1.1 {"NAME":"SP111 v1.1","GPIO":[56,0,158,0,132,134,0,0,131,17,0,21,0],"FLAG":0,"BASE":45}
+Gosund SP111 v1.4 {"NAME":"Gosund SP111","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Gosund SP112 {"NAME":"SHP5","GPIO":[57,145,56,146,255,22,0,0,255,255,21,255,18],"FLAG":0,"BASE":18}
+Gosund UP111 {"NAME":"Gosund UP111","GPIO":[0,52,0,17,134,132,0,0,131,157,21,0,0],"FLAG":0,"BASE":18}
+Gosund WP1 {"NAME":"Gosund WP1-1","GPIO":[0,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Gosund WP2 {"NAME":"Gosund WP2","GPIO":[17,158,57,0,18,0,0,0,22,56,21,0,0],"FLAG":0,"BASE":18}
+Gosund WP211 {"NAME":"Gosund wp211","GPIO":[0,0,0,0,21,0,0,0,0,17,0,22,18],"FLAG":0,"BASE":18}
+Gosund WP212 {"NAME":"Gosund_WP212","GPIO":[17,0,0,0,18,0,0,0,21,0,22,0,0],"FLAG":0,"BASE":18}
+Gosund WP3 {"NAME":"Gosund WP3","GPIO":[0,0,0,0,17,0,0,0,56,57,21,0,0],"FLAG":0,"BASE":18}
+Gosund WP5 {"NAME":"Gosund-WP5","GPIO":[255,255,255,255,17,255,0,0,56,158,21,255,255],"FLAG":0,"BASE":18}
+Gosund WP6 {"NAME":"Gosund WP6","GPIO":[0,0,0,17,0,0,0,0,56,57,21,0,0],"FLAG":0,"BASE":18}
+Grefic TE101 {"NAME":"Grefic TE101","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":1}
+Gyman SM-PW701U {"NAME":"Gyman","GPIO":[255,255,157,255,56,255,0,0,21,17,255,255,255],"FLAG":0,"BASE":18}
+Hama 176565 {"NAME":"hama","GPIO":[0,0,0,17,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":52}
+Hauppauge 01647 {"NAME":"SL-1642","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+HiHome WPP-10S1 {"NAME":"HIhome WPP-10S","GPIO":[56,0,158,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":49}
+HiHome WPP-10S2 {"NAME":"HiHome WPP-10S","GPIO":[17,0,0,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":49}
+HiHome WPP-16S {"NAME":"HIhome WPP-16S","GPIO":[17,0,0,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":49}
+HiHome WPP-16T {"NAME":"HiHome WPP-16T","GPIO":[17,56,255,255,134,132,0,0,18,255,22,130,21],"FLAG":1,"BASE":18}
+HIPER IoT P01 {"NAME":"HIPER IoT P01","GPIO":[0,0,0,0,0,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+hiwild W-US002 {"NAME":"W-US002","GPIO":[0,17,0,0,0,0,0,0,0,52,21,0,158],"FLAG":0,"BASE":18}
+Houzetek AWP07L {"NAME":"AWP07L","GPIO":[56,255,255,130,255,134,0,0,0,17,132,21,255],"FLAG":0,"BASE":18}
+HS108 {"NAME":"HS108","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":1,"BASE":18}
+HS108A {"NAME":"HS108A","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":1,"BASE":18}
+HuaFan QinLu {"NAME":"Huafan SS","GPIO":[56,0,0,57,17,29,0,0,132,130,133,0,0],"FLAG":0,"BASE":24}
+Hykker SE-0792 {"NAME":"Hykker SE-0792","GPIO":[17,0,0,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18}
+Hyleton 312 {"NAME":"MANZOKU HLT312","GPIO":[0,0,57,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Hyleton 313 {"NAME":"Hyleton 313","GPIO":[57,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Hyleton 314 {"NAME":"hyleton-314","GPIO":[57,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Hyleton 315 {"NAME":"hyleton-315","GPIO":[0,0,0,0,57,56,0,0,21,90,0,0,0],"FLAG":0,"BASE":18}
+Hyleton 317 {"NAME":"hyleton-317","GPIO":[56,0,57,0,58,0,0,0,0,90,0,21,0],"FLAG":0,"BASE":18}
+Ihommate ZCH-02 {"NAME":"ZCH-02","GPIO":[0,0,0,17,133,132,0,0,130,56,21,0,0],"FLAG":1,"BASE":18}
+iSwitch {"NAME":"Smart Plug XSA","GPIO":[255,17,255,255,255,255,0,0,255,56,21,255,255],"FLAG":0,"BASE":18}
+Jeeo TF-SH330 {"NAME":"Jeeo TF-SH330","GPIO":[56,0,0,0,0,0,0,0,0,17,0,21,0],"FLAG":1,"BASE":18}
+Jeeo TF-SH331W {"NAME":"Jeeo SH331W","GPIO":[56,0,158,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":18}
+Jinvoo SM-PW701U {"NAME":"SM-PW702","GPIO":[0,0,0,0,57,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Jinvoo SM-PW712UA 10A {"NAME":"SM-PW712UA","GPIO":[0,0,0,158,56,57,0,0,22,17,21,0,0],"FLAG":15,"BASE":18}
+Jinvoo SM-PW762U {"NAME":"SM-PW762U","GPIO":[0,0,0,0,158,56,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
+Jomarto SH1123 {"NAME":"SH1123","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Jules V (Upgrade Version) {"NAME":"Jules-V_UV","GPIO":[56,0,0,0,0,134,0,0,21,17,132,57,131],"FLAG":0,"BASE":18}
+Jules.V NX-SM300 {"NAME":"NX-SM300","GPIO":[52,0,0,0,0,130,0,0,21,132,133,52,0],"FLAG":0,"BASE":6}
+Jules.V NX-SP203 {"NAME":"NX-SP203","GPIO":[52,0,0,0,17,134,255,255,21,18,0,22,0],"FLAG":0,"BASE":18}
+JVMAC-EU01 {"NAME":"JVMAC","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+Kimire S12 {"NAME":"Kimire S12","GPIO":[255,255,255,17,255,255,0,0,255,56,21,255,255],"FLAG":0,"BASE":18}
+King-Link KL-US-WF002 {"NAME":"Kinglink-plug","GPIO":[0,0,0,0,0,21,0,0,52,17,0,0,0],"FLAG":0,"BASE":18}
+Kisslink SP200 {"NAME":"Kisslink SP200","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":1,"BASE":18}
+KMC 30137 {"NAME":"KMC 30137","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+KMC 4 {"NAME":"KMC 4 Outlet","GPIO":[0,56,0,0,133,132,0,0,130,22,23,21,17],"FLAG":0,"BASE":36}
+KMC 70011 {"NAME":"KMC 70011","GPIO":[17,0,0,0,133,132,0,0,130,56,21,0,0],"FLAG":0,"BASE":36}
+Kogan Energy Meter {"NAME":"Kogan Smart Sw","GPIO":[17,0,0,0,133,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18}
+Kogan Energy Meter & USB {"NAME":"KoganPOW","GPIO":[0,0,0,17,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":52}
+Koogeek KLSP1 {"NAME":"Koogeek-KLSP1","GPIO":[0,56,0,17,134,132,0,0,131,158,21,0,0],"FLAG":0,"BASE":18}
+Koogeek KLSP2 {"NAME":"KOOGEEK KLSP2","GPIO":[57,145,56,146,0,22,0,0,0,0,21,0,17],"FLAG":0,"BASE":45}
+Koogeek KLUP1 {"NAME":"Koogeek-KLUP1","GPIO":[0,0,0,17,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18}
+Koogeek W-DEXI {"NAME":"W-DEXI","GPIO":[0,90,0,0,134,132,0,0,130,52,21,0,0],"FLAG":0,"BASE":18}
+Laduo YX-DE01 {"NAME":"YX-DE01","GPIO":[255,17,255,255,255,255,0,0,255,56,21,255,255],"FLAG":0,"BASE":18}
+LESHP KS-501 {"NAME":"LESHP KS-501","GPIO":[17,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
+Loetad EU3S 16A {"NAME":"Loetad EU3S 16","GPIO":[0,255,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":18}
+Lonsonho 10A Type E {"NAME":"Lonsonho10ALed","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+LoraTap SP400W-IT {"NAME":"LoraTap SP400W","GPIO":[0,0,0,0,157,56,0,0,21,17,0,0,0],"FLAG":15,"BASE":18}
+LSC Smart Connect Power {"NAME":"LSC Smart Plug","GPIO":[255,255,255,255,56,255,0,0,21,255,17,255,255],"FLAG":0,"BASE":18}
+LSC Smart Connect Power Plug v2 {"NAME":"LSC Smart Plug","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Lumiman LM650 {"NAME":"Lumiman LM650","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Luminea NX-4491 {"NAME":"Luminea NX-449","GPIO":[56,0,158,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Luminea ZX-2820 {"NAME":"ZX2820-675","GPIO":[0,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Luminea ZX-2820 v2 {"NAME":"ZX2820-675","GPIO":[0,0,0,17,133,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":65}
+Luminea ZX-2858 {"NAME":"Luminea SF-200","GPIO":[0,0,0,17,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+Martin Jerry XS-SSA01 {"NAME":"MJ_XS-SSA01","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+Maxcio W-DE004 {"NAME":"Maxcio W-DE004","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":1,"BASE":18}
+Maxcio W-UK007 {"NAME":"Maxcio","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+Maxcio W-UK007S {"NAME":"Maxcio","GPIO":[56,0,255,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Maxcio W-US002S {"NAME":"W-US002S","GPIO":[57,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Maxcio W-US003 {"NAME":"W-US003","GPIO":[255,17,255,255,255,255,0,0,255,22,21,255,255],"FLAG":0,"BASE":18}
+Maxcio YX-DE02 {"NAME":"Maxcio DE02","GPIO":[0,17,0,21,56,22,0,0,37,38,39,0,0],"FLAG":0,"BASE":18}
+Maxcio YX-DE04 {"NAME":"Maxcio YX-DE04","GPIO":[255,17,255,21,56,40,0,0,37,38,39,255,255],"FLAG":1,"BASE":18}
+MaxKare XKJJ-0218 {"NAME":"MaxKare XKJJ-0","GPIO":[0,0,0,0,18,133,0,0,21,17,132,22,130],"FLAG":0,"BASE":18}
+Medion Life+ S85225 {"NAME":"Medion","GPIO":[0,0,0,17,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":52}
+Merkury MI-WW101-199 {"NAME":"merkury WW101","GPIO":[0,0,0,0,0,0,0,0,56,90,0,21,0],"FLAG":0,"BASE":18}
+Merkury MI-WW102-199L {"NAME":"MIC-WW102","GPIO":[17,0,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":36}
+Merkury MI-WW105-199W {"NAME":"Merkury Switch","GPIO":[255,255,255,255,53,56,0,0,21,17,255,255,255],"FLAG":1,"BASE":18}
+Minleaf W-DEXI {"NAME":"W-DEXI","GPIO":[0,17,0,0,134,132,0,0,131,52,21,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio 1002341 {"NAME":"Genio 1","GPIO":[0,0,56,0,0,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":1}
+Moes NX-SP203 {"NAME":"Moes NX-SP203","GPIO":[52,0,0,0,17,134,0,0,21,18,0,22,0],"FLAG":0,"BASE":18}
+Moes WS-UEU {"NAME":"MoesHouse","GPIO":[0,0,0,21,17,0,0,0,57,0,0,0,0],"FLAG":0,"BASE":18}
+Nanxin NX-SM400 {"NAME":"NX-SM400","GPIO":[0,0,0,17,134,132,0,0,130,52,21,0,0],"FLAG":0,"BASE":18}
+Nedis P110 {"NAME":"Nedis WIFIP110","GPIO":[17,0,0,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":49}
+Nedis P130 {"NAME":"WIFIP130FWT","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+NEO Coolcam 16A {"NAME":"Neo Coolcam 16","GPIO":[17,0,0,0,133,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":49}
+NEO Coolcam 16A v2 {"NAME":"Neo Coolcam 16","GPIO":[17,0,0,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":49}
+NEO Coolcam NAS-WR01W {"NAME":"NAS-WR01W","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Nishica SM-PW701I {"NAME":"SM-PW701I","GPIO":[255,255,255,255,255,255,255,255,21,52,17,255,255],"FLAG":15,"BASE":18}
+NX-SM112 {"NAME":"NX-SM112v3","GPIO":[0,0,0,0,134,132,0,0,158,17,130,21,0],"FLAG":0,"BASE":45}
+NX-SM200 {"NAME":"NX-SM200","GPIO":[56,0,0,0,0,134,0,0,21,17,132,57,131],"FLAG":0,"BASE":18}
+Obi Stecker {"NAME":"OBI Socket","GPIO":[255,255,0,255,52,21,0,0,54,255,17,0,255],"FLAG":1,"BASE":51}
+Obi Stecker 2 {"NAME":"OBI Socket 2","GPIO":[0,0,0,0,21,17,0,0,56,53,0,0,0],"FLAG":0,"BASE":61}
+Oittm Smart {"NAME":"Oittm","GPIO":[0,0,0,0,21,56,0,0,17,0,0,0,0],"FLAG":0,"BASE":1}
+Oukitel P1 {"NAME":"Oukitel P1Dual","GPIO":[52,255,0,255,0,0,0,0,22,17,0,21,0],"FLAG":0,"BASE":18}
+Oukitel P2 {"NAME":"Oukitel P2","GPIO":[0,0,57,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Oukitel X6P {"NAME":"OUKITEL X6P","GPIO":[0,0,57,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+OxaOxe NX-SM200 {"NAME":"NX-SM200","GPIO":[17,0,0,0,133,132,0,0,131,158,21,0,0],"FLAG":0,"BASE":18}
+Oxaoxe NX-SM800 {"NAME":"NX-SM800","GPIO":[0,0,0,131,0,134,0,0,21,17,132,0,0],"FLAG":0,"BASE":45}
+OxaOxe NX-SP202 {"NAME":"oxaoxe-dual","GPIO":[18,0,0,0,134,132,0,0,131,56,21,22,17],"FLAG":0,"BASE":18}
+OxaOxe NX-SP202 v2 {"NAME":"oxaoxe-dold","GPIO":[56,0,0,131,17,134,0,0,21,18,132,22,0],"FLAG":0,"BASE":18}
+Panamalar NX-SM200 {"NAME":"NX-SM200","GPIO":[0,0,0,0,56,134,0,0,131,17,132,21,0],"FLAG":1,"BASE":18}
+Positivo PPW1000 {"NAME":"PPW1000","GPIO":[0,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Powertech {"NAME":"Jaycar","GPIO":[56,0,0,0,0,0,0,0,0,9,0,21,0],"FLAG":0,"BASE":6}
+Powrui AW-08 {"NAME":"POWRUI AW-08","GPIO":[0,0,0,0,9,21,0,0,0,52,57,0,0],"FLAG":1,"BASE":18}
+Powrui Surge Protector 4USB+3AC {"NAME":"POWRUI AHR-077","GPIO":[0,0,0,0,19,18,0,0,22,23,17,21,157],"FLAG":0,"BASE":18}
+Premier PWIFPLG {"NAME":"Premier Plug","GPIO":[0,0,0,17,0,0,0,0,0,56,21,0,0],"FLAG":1,"BASE":18}
+Prime CCRCWFII113PK {"NAME":"Prime","GPIO":[0,0,0,0,57,56,0,0,21,122,0,0,0],"FLAG":0,"BASE":18}
+RenPho RF-SM004 {"NAME":"RenPho RFSM004","GPIO":[0,0,0,0,157,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+RSH-WS007-EU {"NAME":"RSH-WS007","GPIO":[0,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":1,"BASE":18}
+Shelly Plug S {"NAME":"Shelly Plug S","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":2,"BASE":45}
+Slitinto NX-SM110 {"NAME":"Slitinto SM110","GPIO":[0,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Slitinto NX-SM112 {"NAME":"NX-SM112","GPIO":[158,0,0,131,0,134,0,0,0,17,132,21,0],"FLAG":0,"BASE":45}
+Slitinto NX-SM112 v2 {"NAME":"Slitinto NX SM","GPIO":[56,255,158,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Slitinto NX-SM200 {"NAME":"NX-SM200","GPIO":[0,0,0,17,134,132,0,0,0,52,21,130,0],"FLAG":0,"BASE":45}
+Slitinto NX-SM2001 {"NAME":"NX-SM2001","GPIO":[0,0,0,17,134,132,0,0,131,52,21,0,0],"FLAG":0,"BASE":45}
+Slitinto NX-SP201 Mini 2 in 1 {"NAME":"Slitinto Dual ","GPIO":[158,0,0,131,90,134,0,0,21,91,132,22,0],"FLAG":0,"BASE":18}
+Slitinto NX-SP202 {"NAME":"Slitinto SP202","GPIO":[17,0,0,0,134,132,0,0,131,52,22,21,91],"FLAG":0,"BASE":64}
+Smaho {"NAME":"SMAHO WiFi P.","GPIO":[17,0,0,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18}
+SmartDGM PP-W162 {"NAME":"SmartDGM Plug","GPIO":[0,0,0,17,134,132,0,0,131,52,21,0,0],"FLAG":0,"BASE":18}
+Sonoff S20 {"NAME":"Sonoff S20","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":8}
+Sonoff S22 TH {"NAME":"Sonoff S22","GPIO":[17,255,0,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":4}
+Sonoff S26 {"NAME":"Sonoff S26","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":8}
+Sonoff S31 {"NAME":"Sonoff S31","GPIO":[17,145,0,146,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":41}
+Sonoff S31 Lite {"NAME":"Sonoff S31","GPIO":[17,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":41}
+SP10 {"NAME":"Bilikay SP10","GPIO":[0,37,0,17,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+SP201 Dual {"NAME":"SP-201","GPIO":[31,0,0,131,17,134,0,0,21,18,132,22,0],"FLAG":0,"BASE":45}
+SPARKE JH-G01E 10A {"NAME":"SPARKE JH-G01E","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+SPC Clever 6201B {"NAME":"SPC Clever Plu","GPIO":[17,0,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+SS01 {"NAME":"Smart Plug SS0","GPIO":[255,255,255,255,255,255,0,0,21,17,255,255,255],"FLAG":1,"BASE":18}
+STITCH by Monoprice 27937 {"NAME":"Stitch 27937","GPIO":[17,0,56,0,133,132,0,0,131,0,21,0,57],"FLAG":0,"BASE":18}
+STITCH by Monoprice 35511 {"NAME":"Stitch 35511","GPIO":[56,0,57,0,0,133,0,0,0,17,132,21,131],"FLAG":0,"BASE":18}
+SuperNight Dual {"NAME":"SuperNight Dua","GPIO":[255,17,255,21,132,133,0,0,22,130,58,255,255],"FLAG":1,"BASE":18}
+SWA1 {"NAME":"SWA1","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
+SWA1 FR {"NAME":"SWA1","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
+SWA1 UK {"NAME":"SWA1","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
+SWA11 {"NAME":"SWA11","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
+SWA5 {"NAME":"Lingan SWA5","GPIO":[56,0,0,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+SWA9 {"NAME":"SWA9","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
+SwissTone SH 100 {"NAME":"SwissTone","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Sygonix SY-4276902 {"NAME":"SYGONIX","GPIO":[0,0,0,17,133,132,0,0,131,52,21,0,0],"FLAG":0,"BASE":18}
+TanTan WP3 {"NAME":"TanTan WP3","GPIO":[57,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+TCP WISSINWUK {"NAME":"TCP_Plug","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":45}
+Teckin SP10 {"NAME":"Teckin SP10","GPIO":[255,255,56,255,255,255,0,0,255,17,255,21,255],"FLAG":0,"BASE":18}
+Teckin SP20 {"NAME":"TECKIN SP20","GPIO":[56,255,57,255,21,134,0,0,131,17,132,0,0],"FLAG":0,"BASE":45}
+Teckin SP21 {"NAME":"Teckin SP21","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":45}
+Teckin SP22 {"NAME":"Teckin","GPIO":[0,17,0,57,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":52}
+Teckin SP23 {"NAME":"Teckin SP23","GPIO":[56,255,57,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Teckin SP25 {"NAME":"Teckin SP25","GPIO":[56,255,255,255,255,255,0,0,22,17,255,21,255],"FLAG":1,"BASE":18}
+Teckin SP27 {"NAME":"Teckin SP27","GPIO":[56,255,255,255,255,255,0,0,255,17,255,21,255],"FLAG":0,"BASE":18}
+Tflag NX-SM100 {"NAME":"NX-SM100","GPIO":[56,0,0,0,0,134,0,0,21,17,132,57,131],"FLAG":0,"BASE":18}
+TikLok TL650 {"NAME":"TikLok Mini","GPIO":[0,0,0,0,57,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Timethinker TK04 {"NAME":"TimethinkerEU","GPIO":[255,255,255,255,17,255,0,0,255,52,21,255,0],"FLAG":0,"BASE":18}
+TimeThinker WS2 {"NAME":"TimeThinkerWS2","GPIO":[0,0,0,0,17,0,0,0,0,52,21,0,0],"FLAG":0,"BASE":18}
+TomaxUSA HKWL-SO07W {"NAME":"HKWL-SO07W","GPIO":[17,255,255,255,255,255,0,0,255,255,21,255,56],"FLAG":0,"BASE":18}
+Topersun WL-SC01 {"NAME":"Topersun ","GPIO":[0,0,0,0,52,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":18}
+TopGreener TGWF115APM {"NAME":"TGWF115APM","GPIO":[0,56,0,17,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":18}
+Torchstar LITEdge Smart {"NAME":"LITEdge Plug","GPIO":[0,17,0,0,0,0,0,0,0,52,21,0,0],"FLAG":0,"BASE":18}
+TP20 {"NAME":"TP20","GPIO":[0,0,0,17,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+TP24 {"NAME":"TP24","GPIO":[0,0,0,17,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+U10 Series {"NAME":"WIFI-Socket","GPIO":[255,17,255,255,255,255,255,255,255,56,21,255,255],"FLAG":1,"BASE":18}
+Ultralink UL-P01W {"NAME":"UL-P01W","GPIO":[0,52,0,17,134,132,0,0,131,157,21,0,0],"FLAG":0,"BASE":18}
+Varna Crafts 16A {"NAME":"VC Plug","GPIO":[157,0,0,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+Vaupan X6P {"NAME":"Vaupan 10a X6P","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+Vingo {"NAME":"Karpal-01","GPIO":[0,0,0,0,0,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Vivanco 39625 Smart Home Power Adapter {"NAME":"Vivianco","GPIO":[0,0,0,17,133,132,0,0,131,52,21,0,0],"FLAG":0,"BASE":18}
+Vivitar HA-1006 {"NAME":"HA-1006","GPIO":[0,0,0,0,56,0,0,0,21,90,0,0,0],"FLAG":0,"BASE":18}
+Vivitar HA-1006-AU {"NAME":"HA-1006-AU","GPIO":[0,0,0,0,56,0,0,0,21,90,0,0,0],"FLAG":0,"BASE":18}
+WAGA life CHCZ02MB {"NAME":"WAGA CHCZ02MB","GPIO":[57,0,0,131,0,134,0,0,21,17,132,56,0],"FLAG":0,"BASE":68}
+WAZA 10A {"NAME":"WAZA","GPIO":[0,0,0,0,21,17,0,0,56,0,0,0,0],"FLAG":1,"BASE":18}
+WAZA JH-G01B {"NAME":"Teckin SP27","GPIO":[255,255,255,255,53,255,0,0,21,17,255,255,255],"FLAG":0,"BASE":18}
+WAZA JH-G01E 10A {"NAME":"Waza JH-G01E","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":1,"BASE":18}
+Waza JH-G01E 16A {"NAME":"Waza JH-G01E 2","GPIO":[0,0,0,0,0,0,0,0,17,52,21,0,0],"FLAG":1,"BASE":18}
+WiOn 50055 {"NAME":"WiOn","GPIO":[255,0,52,0,0,0,0,0,255,17,0,21,0],"FLAG":0,"BASE":17}
+Wisdom ZY_ACU02 {"NAME":"ZY-ACU02","GPIO":[255,255,255,52,22,21,0,0,31,17,32,255,255],"FLAG":15,"BASE":18}
+WL-SC01 {"NAME":"WL-SC01","GPIO":[0,0,0,0,56,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":1}
+Woox R4026 {"NAME":"WOOX R4026","GPIO":[0,0,0,17,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+Woox R4785 {"NAME":"WooxR4785","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
+WOOX R5024 {"NAME":"Woox5024","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18}
+WP211 {"NAME":"YUNTAB WP211","GPIO":[56,0,158,0,22,0,0,0,0,18,0,21,17],"FLAG":0,"BASE":18}
+Wsiiroon {"NAME":"WSIIROON","GPIO":[0,0,0,0,17,56,0,0,21,0,0,0,0],"FLAG":0,"BASE":18}
+Wsiiroon {"NAME":"Wsiiroon/Wsky","GPIO":[0,0,0,0,17,56,0,0,21,0,0,0,0],"FLAG":0,"BASE":18}
+Wyze WLPP1 {"NAME":"WyzePlugWLPP1","GPIO":[0,0,0,0,0,56,0,0,21,0,17,0,0],"FLAG":0,"BASE":18}
+Xenon SM-PW702-U {"NAME":"SM-PW702","GPIO":[0,0,0,0,57,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+XS-A11 {"NAME":"THRUMM XS-A11","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+XS-A12 {"NAME":"XS-A12","GPIO":[37,0,39,0,38,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45}
+XS-A14 {"NAME":"NETVIP XS-A14","GPIO":[37,0,38,0,0,17,0,0,39,21,0,0,0],"FLAG":0,"BASE":18}
+XS-A17 {"NAME":"XS-A18","GPIO":[37,0,38,0,0,39,0,0,0,17,0,21,0],"FLAG":0,"BASE":45}
+XS-A18 {"NAME":"XS-A18","GPIO":[37,0,38,0,0,39,0,0,0,17,0,21,0],"FLAG":0,"BASE":45}
+XS-A23 {"NAME":"XS-A23","GPIO":[56,255,0,131,17,134,0,0,0,18,132,21,22],"FLAG":0,"BASE":45}
+XS-SSA01 {"NAME":"XS-SSA01","GPIO":[255,17,255,255,255,255,0,0,255,56,21,255,255],"FLAG":0,"BASE":18}
+XS-SSA01 v2 {"NAME":"XS-SSA01","GPIO":[255,17,255,255,255,255,0,0,56,255,255,21,255],"FLAG":0,"BASE":18}
+XS-SSA05 {"NAME":"XS-SSA05","GPIO":[30,255,255,131,255,133,0,0,21,17,132,31,255],"FLAG":1,"BASE":18}
+XS-SSA06 {"NAME":"XS-SSA06","GPIO":[37,0,38,0,0,39,0,0,0,90,0,21,0],"FLAG":0,"BASE":18}
+Yagala SWA9 {"NAME":"SWA9","GPIO":[0,0,0,0,52,21,0,0,0,17,0,0,0],"FLAG":0,"BASE":18}
+Yelomin JH-G01E {"NAME":"Yelomin","GPIO":[0,145,0,146,0,0,0,0,17,56,21,0,0],"FLAG":0,"BASE":18}
+YERON US101 {"NAME":"YERON_US101","GPIO":[255,255,255,17,133,132,0,0,131,56,21,255,255],"FLAG":0,"BASE":18}
+YT-E003 {"NAME":"YT-E003-SP202","GPIO":[17,0,0,0,134,132,0,0,131,52,22,21,91],"FLAG":0,"BASE":64}
+YX-WS02 {"NAME":"Amysen YX-WS02","GPIO":[255,17,255,255,255,255,0,0,255,56,21,255,255],"FLAG":1,"BASE":18}
+ZBR-001 {"NAME":"ZBR-001","GPIO":[17,255,255,255,133,132,0,0,130,56,21,255,57],"FLAG":1,"BASE":18}
+ZooZee SA101 {"NAME":"ZooZee","GPIO":[57,255,56,255,255,255,0,0,255,17,255,21,255],"FLAG":0,"BASE":18}
+ZooZee SA102 {"NAME":"ZooZee","GPIO":[57,255,56,255,21,133,0,0,131,17,132,255,255],"FLAG":0,"BASE":18}
+ZooZee SE131 {"NAME":"ZooZee SE131","GPIO":[255,0,56,0,0,0,0,0,255,17,0,21,0],"FLAG":0,"BASE":17}
+ZSP-001 {"NAME":"ZSP-001","GPIO":[17,255,255,255,133,132,0,0,130,57,21,255,56],"FLAG":1,"BASE":18}
```
## Power Strip
```
-3Stone (2019 Model) {"NAME":"3Stone-2019","GPIO":[0,0,56,0,25,22,0,0,24,17,23,21,0],"FLAG":0,"BASE":18}
-ACENX 3AC+3USB {"NAME":"ACENX 3-Outlet","GPIO":[56,55,54,53,0,21,0,0,23,24,22,0,17],"FLAG":0,"BASE":18}
-Annhome 3AC + 2USB {"NAME":"1200W WiFi SPS","GPIO":[32,0,0,0,57,52,0,0,21,17,22,23,33],"FLAG":0,"BASE":18}
-AOFO 3AC+4USB {"NAME":"AOFO","GPIO":[0,56,0,17,22,21,0,0,0,23,24,0,0],"FLAG":1,"BASE":18}
-AOFO 4AC+4USB {"NAME":"AOFO4AC4USB","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":1,"BASE":18}
-CE Garden Power Stake {"NAME":"CE Power Stake","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-CE Smart Home LTS-6A-W5 {"NAME":"CE Power Strip","GPIO":[52,0,0,0,22,21,0,0,24,23,25,26,17],"FLAG":0,"BASE":18}
-CRST LTS-4G-W {"NAME":"CRST LTS-4G-W","GPIO":[0,0,0,0,24,0,255,255,22,23,21,0,0],"FLAG":0,"BASE":18}
-Digoo DG-PS01 {"NAME":"Digoo DG-PS01","GPIO":[0,56,0,17,23,22,0,0,0,24,21,0,0],"FLAG":1,"BASE":18}
-Geekbes 4AC+4USB {"NAME":"Geekbes 4xStri","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":1,"BASE":18}
-Geeni GN-SW003 {"NAME":"Geeni GNCSW003","GPIO":[52,0,0,0,22,21,0,0,24,25,23,26,17],"FLAG":0,"BASE":18}
-Hyleton 330 {"NAME":"Hyleton-330","GPIO":[57,0,0,56,29,17,0,0,31,30,32,0,25],"FLAG":0,"BASE":18}
-Hyleton 331 {"NAME":"HLT-331","GPIO":[52,255,255,57,29,17,255,255,31,30,32,255,58],"FLAG":0,"BASE":18}
-Hyleton 336 {"NAME":"HLT-336","GPIO":[52,0,0,57,29,17,0,0,31,30,0,0,32],"FLAG":0,"BASE":18}
-KMC 5 {"NAME":"KMC 5-Outlet","GPIO":[56,0,0,0,25,9,0,0,22,21,23,0,24],"FLAG":0,"BASE":18}
-Koogeek KLOE4 {"NAME":"Koogeek KLOE4","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":1,"BASE":18}
-LeFun SK2 {"NAME":"LeFun SK2","GPIO":[0,0,0,17,22,21,0,0,23,24,25,0,0],"FLAG":0,"BASE":18}
-Meross MSS425 {"NAME":"Meross MSS425","GPIO":[33,0,0,0,56,0,0,0,21,17,22,23,32],"FLAG":0,"BASE":18}
-Monoprice 34082 {"NAME":"Stitch 34082","GPIO":[255,255,255,255,21,20,255,255,23,22,24,255,255],"FLAG":0,"BASE":18}
-Nedis WIFIP310FWT {"NAME":"Nedis WIFIP310","GPIO":[0,56,0,17,22,21,0,0,0,23,24,0,0],"FLAG":1,"BASE":18}
-Powrui AW-39 {"NAME":"Porui AW-39","GPIO":[56,0,0,0,21,255,0,0,23,24,22,0,9],"FLAG":0,"BASE":18}
-S2199EU {"NAME":"S2199EU","GPIO":[0,17,0,52,23,25,0,0,21,24,22,0,0],"FLAG":1,"BASE":18}
-SM-S0301 {"NAME":"SM-SO301","GPIO":[56,0,0,0,30,17,0,0,32,31,33,0,21],"FLAG":0,"BASE":18}
-SM-S0301 {"NAME":"SM-SO301","GPIO":[52,255,255,57,29,17,255,255,31,30,32,255,25],"FLAG":0,"BASE":18}
-SWB1 {"NAME":"SWB1","GPIO":[52,0,0,0,0,24,0,0,21,17,22,23,0],"FLAG":0,"BASE":18}
-Teckin SS30 {"NAME":"Teckin SS30","GPIO":[52,255,255,57,29,17,255,255,31,30,32,255,58],"FLAG":0,"BASE":18}
-Tellur TLL331031 {"NAME":"Tellur","GPIO":[0,56,0,17,22,21,0,0,0,23,24,0,0],"FLAG":1,"BASE":18}
-TESSAN A4L-BK {"NAME":"TESSAN A4L-BK","GPIO":[0,0,0,24,23,0,255,255,21,0,22,0,0],"FLAG":0,"BASE":18}
-Viflykoo 3AC+4USB {"NAME":"Viflykoo 3xStr","GPIO":[0,0,53,0,0,23,0,0,21,56,17,24,22],"FLAG":1,"BASE":18}
-Woox R4028 {"NAME":"Woox R4028","GPIO":[0,56,0,17,23,22,0,0,0,24,21,0,0],"FLAG":1,"BASE":18}
-Xenon SM-S0301 {"NAME":"SM-SO301","GPIO":[52,255,255,57,29,17,255,255,31,30,32,255,25],"FLAG":0,"BASE":18}
-XS-A25 {"NAME":"XS-A25","GPIO":[52,0,53,0,25,22,0,0,24,17,23,21,0],"FLAG":0,"BASE":18}
-XSA26-EU {"NAME":"XSA26-EU","GPIO":[52,0,53,0,25,22,0,0,24,17,23,21,0],"FLAG":0,"BASE":18}
-Yagala {"NAME":"Yagala","GPIO":[0,0,0,17,22,24,0,0,23,25,21,0,0],"FLAG":0,"BASE":18}
-Yagala SWB3 {"NAME":"YAGALA SWB3","GPIO":[0,0,53,0,0,23,0,0,21,0,22,24,0],"FLAG":1,"BASE":18}
-Yagala SWB3 v2 {"NAME":"YAGALA SWB3","GPIO":[157,0,53,0,0,23,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
-Yuanguo 4AC + 2 USB {"NAME":"YUANGUO","GPIO":[0,20,0,24,19,18,0,0,17,22,21,23,0],"FLAG":0,"BASE":1}
-Zeoota PS022 {"NAME":"ZEOOTA 3x plus","GPIO":[0,57,0,56,22,21,0,0,17,23,24,0,0],"FLAG":1,"BASE":18}
-ZLD-44EU-W {"NAME":"ZLD-44EU-W","GPIO":[17,255,255,255,22,21,18,19,23,24,25,0,0],"FLAG":0,"BASE":23}
-ZLD-44USA-W {"NAME":"ZLD-44USA-W","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":1,"BASE":18}
-ZLD64-EU-W {"NAME":"ZLD64-EU-W","GPIO":[0,56,0,17,22,21,0,0,0,0,23,0,0],"FLAG":0,"BASE":18}
+A0F0 ZLD-44EU-W {"NAME":"AOFO-4AC-4USB","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":1,"BASE":18}
+ACENX 3AC+3USB {"NAME":"ACENX 3-Outlet","GPIO":[56,55,54,53,0,21,0,0,23,24,22,0,17],"FLAG":0,"BASE":18}
+Annhome 3AC + 2USB {"NAME":"1200W WiFi SPS","GPIO":[32,0,0,0,57,52,0,0,21,17,22,23,33],"FLAG":0,"BASE":18}
+AOFO 3AC+4USB {"NAME":"AOFO","GPIO":[0,56,0,17,22,21,0,0,0,23,24,0,0],"FLAG":1,"BASE":18}
+AOFO 4AC+4USB {"NAME":"AOFO4AC4USB","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":0,"BASE":18}
+AOFO 4AC+4USB Tuya {"NAME":"AOFO-4AC-4USB","GPIO":[255,255,255,255,255,255,0,0,255,255,255,255,255],"FLAG":1,"BASE":54}
+AOFO 4AC+4USB UK {"NAME":"AOFO4AC4USB-UK","GPIO":[0,56,0,17,23,24,0,0,22,21,33,0,0],"FLAG":0,"BASE":18}
+Arlec PB88UHA {"NAME":"ArlecPowerStri","GPIO":[0,0,0,255,22,21,0,0,24,23,0,0,0],"FLAG":0,"BASE":18}
+Arlec PB89HA {"NAME":"Arlec PB89HA","GPIO":[255,255,255,255,22,21,0,0,24,23,255,255,255],"FLAG":15,"BASE":18}
+Bauhn ASPBU-1019 {"NAME":"Bauhn 3AC+3USB","GPIO":[0,157,0,0,22,21,0,0,0,23,17,0,0],"FLAG":0,"BASE":18}
+BlitzWolf BW-SHP9 {"NAME":"BlitzWolf SHP9","GPIO":[158,255,0,255,0,23,0,0,21,17,22,24,0],"FLAG":0,"BASE":45}
+BrilliantSmart 20691 Powerboard with USB Chargers {"NAME":"B_WiFi-4","GPIO":[56,0,0,57,29,17,0,0,31,30,32,0,25],"FLAG":1,"BASE":18}
+CE Smart Home LTS-6A-W5 {"NAME":"CE Power Strip","GPIO":[52,0,0,0,22,21,0,0,24,23,25,26,17],"FLAG":0,"BASE":18}
+CE Smart Home Garden Stake LH-7-1 {"NAME":"CE Power Stake","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+CRST LTS-4G-W {"NAME":"CRST LTS-4G-W","GPIO":[0,0,0,0,24,0,0,0,22,23,21,0,0],"FLAG":0,"BASE":18}
+Deltaco SH-P03USB {"NAME":"Deltaco SH-P03","GPIO":[0,56,0,0,0,21,0,0,23,17,22,24,0],"FLAG":1,"BASE":18}
+Digoo DG-PS01 {"NAME":"Digoo DG-PS01","GPIO":[0,56,0,17,23,22,0,0,0,24,21,0,0],"FLAG":1,"BASE":18}
+Geekbes 4AC+4USB {"NAME":"Geekbes 4xStri","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":1,"BASE":18}
+Geeni Surge {"NAME":"Geeni GNCSW003","GPIO":[52,0,0,0,22,21,0,0,24,25,23,26,17],"FLAG":0,"BASE":18}
+Geeni Surge Mini {"NAME":"Geeni-GN-SW004","GPIO":[56,0,0,17,0,0,0,0,22,21,23,0,0],"FLAG":15,"BASE":18}
+Gousund WP9 {"NAME":"Gosund WP9","GPIO":[56,55,54,53,0,21,0,0,23,24,22,0,17],"FLAG":0,"BASE":18}
+Hyleton 330 {"NAME":"Hyleton-330","GPIO":[57,0,0,56,29,17,0,0,31,30,32,0,25],"FLAG":0,"BASE":18}
+Hyleton 331 {"NAME":"HLT-331","GPIO":[52,255,255,57,29,17,0,0,31,30,32,255,58],"FLAG":0,"BASE":18}
+Hyleton 333 {"NAME":"HLT-333","GPIO":[52,0,0,57,29,17,0,0,31,30,0,0,24],"FLAG":0,"BASE":18}
+Hyleton 336 {"NAME":"HLT-336","GPIO":[52,0,0,57,29,17,0,0,31,30,0,0,32],"FLAG":0,"BASE":18}
+KMC 5 {"NAME":"KMC 5-Outlet","GPIO":[56,0,0,0,25,9,0,0,22,21,23,0,24],"FLAG":0,"BASE":18}
+Kogan Power Strip USB Ports & Energy Meter {"NAME":"Generic","GPIO":[90,56,0,24,134,132,0,0,131,22,23,21,0],"FLAG":0,"BASE":18}
+Koogeek KLOE4 {"NAME":"Koogeek KLOE4","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":1,"BASE":18}
+LeFun SK2 {"NAME":"LeFun SK2","GPIO":[0,0,0,17,22,21,0,0,23,24,25,0,0],"FLAG":0,"BASE":18}
+Maxcio ZLD-34EU-W {"NAME":"MAXCIO","GPIO":[0,56,0,17,22,21,0,0,0,23,24,0,0],"FLAG":1,"BASE":18}
+Meross MSS425 {"NAME":"Meross MSS425","GPIO":[33,0,0,0,56,0,0,0,21,17,22,23,32],"FLAG":0,"BASE":18}
+Mirabella Genio Powerboard I002578 {"NAME":"Genio Powerboa","GPIO":[21,52,0,0,23,22,0,0,25,17,26,24,0],"FLAG":0,"BASE":18}
+Nedis P310 {"NAME":"Nedis WIFIP310","GPIO":[0,56,0,17,22,21,0,0,0,23,24,0,0],"FLAG":1,"BASE":18}
+Powrui AHR-079 {"NAME":"Powrui Power S","GPIO":[56,0,0,17,19,21,0,0,23,20,22,24,18],"FLAG":0,"BASE":18}
+Powrui AW-39 {"NAME":"Powrui AW-39","GPIO":[56,0,0,0,21,255,0,0,23,24,22,0,9],"FLAG":0,"BASE":18}
+S2199EU {"NAME":"S2199EU","GPIO":[0,17,0,52,23,25,0,0,21,24,22,0,0],"FLAG":1,"BASE":18}
+SA-P402A {"NAME":"SA-P402A","GPIO":[0,17,0,56,23,25,21,24,22,0,0,1,0],"FLAG":1,"BASE":18}
+STITCH by Monoprice 34082 {"NAME":"Stitch 34082","GPIO":[255,255,255,255,21,20,0,0,23,22,24,255,255],"FLAG":0,"BASE":18}
+SWB1 {"NAME":"SWB1","GPIO":[52,0,0,0,0,24,0,0,21,17,22,23,0],"FLAG":0,"BASE":18}
+Teckin SS30 {"NAME":"Teckin SS30","GPIO":[52,255,255,57,29,17,0,0,31,30,32,255,25],"FLAG":0,"BASE":18}
+Tellur TLL331031 {"NAME":"Tellur","GPIO":[0,56,0,17,22,21,0,0,0,23,24,0,0],"FLAG":1,"BASE":18}
+TESSAN A4L-BK {"NAME":"TESSAN A4L-BK","GPIO":[0,0,0,24,23,0,0,0,21,0,22,0,0],"FLAG":0,"BASE":18}
+Tonbux SM-SO301-U {"NAME":"Tonbux SM-SO30","GPIO":[56,0,0,0,29,0,0,0,31,30,32,0,25],"FLAG":0,"BASE":18}
+Vivitar HA-1007 {"NAME":"Vivitar HA1007","GPIO":[56,0,0,0,30,17,0,0,32,31,33,0,21],"FLAG":15,"BASE":18}
+Vivitar HA-1007-AU {"NAME":"HA-1007-AU","GPIO":[56,17,0,58,29,57,0,0,31,30,32,0,25],"FLAG":0,"BASE":18}
+wesmartify essentials 4AC+4USB {"NAME":"essential_4_po","GPIO":[56,0,0,0,24,25,0,0,22,21,23,0,17],"FLAG":0,"BASE":18}
+Woox R4028 {"NAME":"Woox R4028","GPIO":[0,56,0,17,23,22,0,0,0,24,21,0,0],"FLAG":1,"BASE":18}
+Xenon SM-S0301 {"NAME":"SM-SO301","GPIO":[52,255,255,57,29,17,0,0,31,30,32,255,25],"FLAG":0,"BASE":18}
+Xenon SM-S0301-U {"NAME":"SM-SO301-U","GPIO":[52,255,255,57,29,17,0,0,31,30,32,255,25],"FLAG":0,"BASE":18}
+Xenon SM-SO301 v2 {"NAME":"SM-SO301","GPIO":[56,0,0,0,30,17,0,0,32,31,33,0,21],"FLAG":0,"BASE":18}
+XS-A25 {"NAME":"XS-A25","GPIO":[52,0,53,0,25,22,0,0,24,17,23,21,0],"FLAG":0,"BASE":18}
+XS-A26 {"NAME":"XS-A26","GPIO":[52,0,53,0,25,22,0,0,24,17,23,21,0],"FLAG":0,"BASE":18}
+XS-A34 {"NAME":"XS-A24","GPIO":[52,0,53,0,25,22,0,0,24,17,23,21,0],"FLAG":0,"BASE":18}
+Yagala {"NAME":"Yagala","GPIO":[0,0,0,17,22,24,0,0,23,25,21,0,0],"FLAG":0,"BASE":18}
+Yagala SWB3 {"NAME":"YAGALA SWB3","GPIO":[0,0,53,0,0,23,0,0,21,0,22,24,0],"FLAG":1,"BASE":18}
+Yagala SWB3 v2 {"NAME":"YAGALA SWB3","GPIO":[157,0,53,0,0,23,0,0,21,17,22,24,0],"FLAG":0,"BASE":18}
+Yuanguo 4AC + 2 USB {"NAME":"YUANGUO","GPIO":[0,20,0,24,19,18,0,0,17,22,21,23,0],"FLAG":0,"BASE":1}
+Yuanguo 4AC+2USB {"NAME":"YUANGUO","GPIO":[13,20,0,24,19,18,0,0,17,22,21,23,157],"FLAG":0,"BASE":1}
+Zeoota PS022 {"NAME":"ZEOOTA 3x plus","GPIO":[0,57,0,56,22,21,0,0,17,23,24,0,0],"FLAG":1,"BASE":18}
+Zeoota ZLD-44EU-W {"NAME":"ZEOOTA-ZLD-44E","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":1,"BASE":18}
+ZLD-44EU-W {"NAME":"ZLD-44EU-W","GPIO":[17,255,255,255,22,21,18,19,23,24,25,0,0],"FLAG":0,"BASE":23}
+ZLD-44USA-W {"NAME":"ZLD-44USA-W","GPIO":[0,56,0,17,22,21,0,0,23,24,25,0,0],"FLAG":1,"BASE":18}
+ZLD64-EU-W {"NAME":"ZLD64-EU-W","GPIO":[0,56,0,17,22,21,0,0,0,0,23,0,0],"FLAG":0,"BASE":18}
```
## RF Bridge
```
-Sonoff RF Bridge 433 {"NAME":"Sonoff Bridge","GPIO":[17,148,255,149,255,255,0,0,255,56,255,0,0],"FLAG":0,"BASE":25}
+Sonoff RF Bridge 433 {"NAME":"Sonoff Bridge","GPIO":[17,148,255,149,255,255,0,0,255,56,255,0,0],"FLAG":0,"BASE":25}
```
## Relay
```
-1 Channel Inching/Self-Locking {"NAME":"1 Channel","GPIO":[17,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":12}
-Blitzwolf BW-SS1 {"NAME":"BW-SS1","GPIO":[255,255,255,255,157,21,0,0,255,17,255,255,0],"FLAG":0,"BASE":18}
-Canwing CW-001 {"NAME":"Canwing CW-001","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
-EACHEN ST-DC2 {"NAME":"Garage Control","GPIO":[11,0,0,0,23,22,18,0,21,52,12,24,0],"FLAG":1,"BASE":18}
-Electrodragon Board SPDT {"NAME":"ED Relay Board","GPIO":[255,255,255,255,255,255,255,255,21,22,255,255,52],"FLAG":1,"BASE":18}
-Electrodragon ESP8266 {"NAME":"ElectroDragon","GPIO":[18,255,17,255,255,255,0,0,22,21,255,255,52],"FLAG":1,"BASE":15}
-eMylo SS-8839-03 {"NAME":"eMylo","GPIO":[0,0,0,0,56,0,0,0,21,0,17,0,0],"FLAG":1,"BASE":18}
-eMylo XL9251WI {"NAME":"XL9251WI","GPIO":[255,255,255,255,56,255,255,255,21,255,17,255,255],"FLAG":0,"BASE":18}
-eMylo YSA111A1N-FBA {"NAME":"Emylo","GPIO":[255,255,255,255,52,255,255,255,21,255,17,255,255],"FLAG":0,"BASE":18}
-ESP-01 Relay V4.0 {"NAME":"ESP01v4","GPIO":[29,52,0,255,255,255,255,255,255,255,255,255,255],"FLAG":0,"BASE":18}
-EX Store 2 Kanal V5 {"NAME":"EXS Relay V5","GPIO":[255,255,255,255,255,255,0,0,21,22,31,52,32],"FLAG":0,"BASE":16}
-Geekcreit 2 Channel {"NAME":"Geekcreit 2ch","GPIO":[17,0,0,0,0,22,18,0,21,52,0,0,0],"FLAG":1,"BASE":18}
-Gocomma Wi-Fi Smart Switch {"NAME":"GoCommaSmartSw","GPIO":[17,255,255,255,21,255,255,255,255,56,255,255,255],"FLAG":0,"BASE":18}
-LC Technology 4CH {"NAME":"LC-Tech_4CH ","GPIO":[52,255,17,255,255,255,255,255,21,22,23,24,255],"FLAG":0,"BASE":18}
-LinkNode R4 {"NAME":"LinkNode R4","GPIO":[0,0,0,0,0,0,0,0,21,22,23,0,24],"FLAG":0,"BASE":18}
-LinkNode R8 {"NAME":"LinkNode R8","GPIO":[0,0,0,0,25,26,0,28,23,24,22,27,21],"FLAG":0,"BASE":18}
-MHCOZY {"NAME":"Portail","GPIO":[9,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":1,"BASE":18}
-Moeshouse 2 way 2 gang MS-104B {"NAME":"moeshouse2gang","GPIO":[0,0,17,0,160,0,0,0,43,42,21,22,0],"FLAG":0,"BASE":18}
-Nova Digital Basic 1 MS101 {"NAME":"NovaDigBasic1","GPIO":[255,255,255,255,56,255,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
-QS-WIFI-S03 {"NAME":"Generic","GPIO":[17,255,255,255,255,0,0,0,82,21,0,0,0],"FLAG":0,"BASE":1}
-Shelly 1 {"NAME":"Shelly 1","GPIO":[0,0,0,0,21,82,0,0,0,0,0,0,0],"FLAG":0,"BASE":46}
-Shelly 1PM {"NAME":"Shelly 1PM","GPIO":[56,0,0,0,82,134,0,0,0,0,0,21,0],"FLAG":2,"BASE":18}
-Shelly 2 {"NAME":"Shelly 2","GPIO":[0,135,0,136,21,22,0,0,9,0,10,137,0],"FLAG":0,"BASE":47}
-Shelly 2.5 {"NAME":"Shelly 2.5","GPIO":[56,255,17,255,21,83,0,0,6,82,5,22,156],"FLAG":2,"BASE":18}
-SmartHome Smart Breaker {"NAME":"SmartHome Swit","GPIO":[255,255,255,255,21,255,255,255,17,57,255,56,255],"FLAG":0,"BASE":18}
-Sonoff 4CH (R2) {"NAME":"Sonoff 4CH","GPIO":[17,255,255,255,23,22,18,19,21,56,20,24,0],"FLAG":0,"BASE":7}
-Sonoff 4CH Pro (R2) {"NAME":"Sonoff 4CH Pro","GPIO":[17,255,255,255,23,22,18,19,21,56,20,24,0],"FLAG":0,"BASE":23}
-Sonoff 5V Inching/Selflock Module RE5V1C {"NAME":"Sonoff RE5V1C","GPIO":[17,255,255,255,255,255,0,0,21,56,0,0,0],"FLAG":0,"BASE":18}
-Sonoff Basic {"NAME":"Sonoff Basic","GPIO":[17,255,255,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":1}
-Sonoff Basic R3 {"NAME":"Basic R3","GPIO":[17,255,0,255,255,0,255,255,21,56,255,0,255],"FLAG":0,"BASE":1}
-Sonoff Dual {"NAME":"Sonoff Dual","GPIO":[0,148,0,149,255,0,0,0,0,56,255,0,0],"FLAG":0,"BASE":5}
-Sonoff Dual R2 {"NAME":"Sonoff Dual R2","GPIO":[255,255,0,255,0,22,255,17,21,56,0,0,0],"FLAG":0,"BASE":39}
-Sonoff Mini {"NAME":"Sonoff Mini","GPIO":[17,0,0,0,9,0,0,0,21,56,0,0,255],"FLAG":0,"BASE":1}
-Sonoff Pow {"NAME":"Sonoff Pow","GPIO":[17,0,0,0,0,130,0,0,21,132,133,52,0],"FLAG":0,"BASE":6}
-Sonoff Pow R2 {"NAME":"Sonoff Pow R2","GPIO":[17,145,0,146,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":43}
-Sonoff RF {"NAME":"Sonoff RF","GPIO":[17,255,255,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":2}
-Sonoff SV {"NAME":"Sonoff SV","GPIO":[17,255,0,255,255,255,0,0,21,56,255,0,0],"FLAG":1,"BASE":3}
-Sonoff TH10/TH16 {"NAME":"Sonoff TH","GPIO":[17,255,0,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":4}
-Tuya Kinetic Switch {"NAME":"Kinetic Switch","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-Wemos Module 10A {"NAME":"WeMos Relay","GPIO":[17,255,52,255,21,255,255,255,255,255,255,255,255],"FLAG":0,"BASE":18}
-WL-SW01_10 {"NAME":"WL-SW01_10","GPIO":[17,149,0,148,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
-Yunshan 10A 7-30VDC {"NAME":"Yunshan Relay","GPIO":[0,255,56,255,21,17,0,0,0,0,0,0,0],"FLAG":0,"BASE":33}
-Zemismart ERC309 Kinetic {"NAME":"Kinetic Switch","GPIO":[255,255,255,255,255,255,0,0,255,108,255,107,255],"FLAG":0,"BASE":54}
+1 Channel Inching/Self-Locking {"NAME":"1 Channel","GPIO":[17,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":12}
+BlitzWolf BW-SS1 {"NAME":"BW-SS1","GPIO":[255,255,255,255,157,21,0,0,255,17,255,255,0],"FLAG":0,"BASE":18}
+Canwing CW-001 {"NAME":"Canwing CW-001","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
+Century Aoke Smart Switch {"NAME":"CenturyAoke","GPIO":[0,255,0,255,21,0,0,0,17,56,255,0,0],"FLAG":0,"BASE":18}
+Deta 6000HA Smart Inline Switch {"NAME":"DETA-6000HA","GPIO":[0,17,0,0,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18}
+DoHome HomeKit DIY Switch {"NAME":"DoHome DIY","GPIO":[255,255,0,255,255,157,0,0,21,0,0,0,0],"FLAG":0,"BASE":1}
+Eachen ST-DC2 {"NAME":"Garage Control","GPIO":[11,0,0,0,23,22,18,0,21,52,12,24,0],"FLAG":1,"BASE":18}
+Eachen ST-UDC1 {"NAME":"ST-UDC1","GPIO":[9,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":1,"BASE":18}
+Electrodragon Board SPDT {"NAME":"ED Relay Board","GPIO":[255,255,255,255,255,255,0,0,21,22,255,255,52],"FLAG":1,"BASE":18}
+Electrodragon ESP8266 {"NAME":"ElectroDragon","GPIO":[18,255,17,255,255,255,0,0,22,21,255,255,52],"FLAG":1,"BASE":15}
+eMylo SS-8839-02 {"NAME":"SS-8839-02","GPIO":[0,255,0,255,56,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":18}
+eMylo SS-8839-03 {"NAME":"SS-8839-03","GPIO":[0,255,0,255,52,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":18}
+ESP-01 Relay V4.0 {"NAME":"ESP01v4","GPIO":[29,52,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+ESP-01S 5V Relay Module V1.0 {"NAME":"ESP-01S Relay","GPIO":[29,52,255,255,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+ESP12F 220V 10A 7V-30V DC {"NAME":"Yunshan 10A","GPIO":[17,255,52,255,21,10,0,0,22,0,0,0,0],"FLAG":0,"BASE":18}
+EX Store 2 Kanal V5 {"NAME":"EXS Relay V5","GPIO":[255,255,255,255,255,255,0,0,21,22,31,52,32],"FLAG":0,"BASE":16}
+Garage Door Controller {"NAME":"Garage Opener","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
+Geekcreit 2 Channel AC 85V-250V {"NAME":"Geekcreit 2ch","GPIO":[17,0,0,0,0,22,18,0,21,52,0,0,0],"FLAG":1,"BASE":18}
+Geekcreit 5V DIY 4 Channel Jog Inching Self-Locking {"NAME":"Geekcreit-4ch","GPIO":[9,0,0,0,23,22,10,11,21,52,12,24,0],"FLAG":0,"BASE":18}
+Geekcreit Module 220V 10A {"NAME":"WeMos Relay","GPIO":[17,255,52,255,21,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Gocomma Wi-Fi Smart Switch {"NAME":"GoCommaSmartSw","GPIO":[17,255,255,255,21,0,0,0,255,56,0,0,0],"FLAG":0,"BASE":18}
+Hoch Circuit Breaker 1P {"NAME":"HOCH ZJSB9","GPIO":[17,255,255,255,255,255,0,0,21,56,0,0,0],"FLAG":0,"BASE":18}
+L-5A01 {"NAME":"L-5A01","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
+LC Technology 5V 2 Channel {"NAME":"LC-ESP01-2R-5V","GPIO":[0,148,0,149,0,0,0,0,21,22,0,0,0],"FLAG":0,"BASE":18}
+LC Technology 5V 4 Channel {"NAME":"LC-Tech_4CH ","GPIO":[52,255,17,255,0,0,0,0,21,22,23,24,0],"FLAG":0,"BASE":18}
+LC Technology AC/DC 1 Channel ESP-12F Dev Board {"NAME":"LC-ESP12-1R-MV","GPIO":[255,255,157,255,255,21,255,255,255,255,255,255,57],"FLAG":15,"BASE":18}
+LinkNode R4 {"NAME":"LinkNode R4","GPIO":[0,0,0,0,0,0,0,0,21,22,23,0,24],"FLAG":0,"BASE":18}
+LinkNode R8 {"NAME":"LinkNode R8","GPIO":[0,0,0,0,25,26,0,28,23,24,22,27,21],"FLAG":0,"BASE":18}
+LoraTap RR500W {"NAME":"LoraTap RR500W","GPIO":[157,255,255,255,9,255,255,255,255,21,255,255,56],"FLAG":15,"BASE":18}
+LoraTap SC500W Roller Shutter {"NAME":"SC500W","GPIO":[0,0,0,158,9,10,0,0,21,17,22,0,0],"FLAG":0,"BASE":18}
+Mhcozy 5V {"NAME":"Portail","GPIO":[9,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":1,"BASE":18}
+Moes MS-104B-1 {"NAME":"Moes MS-104B","GPIO":[0,0,17,0,160,0,0,0,43,42,21,22,0],"FLAG":0,"BASE":18}
+Nova Digital Basic 1 MS101 {"NAME":"NovaDigBasic1","GPIO":[0,255,0,255,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Protium PS-1604 {"NAME":"Protium16A","GPIO":[17,255,255,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":1}
+QS-WIFI-S03 {"NAME":"QS-WIFI-S03","GPIO":[17,255,255,255,255,0,0,0,82,21,0,0,0],"FLAG":0,"BASE":1}
+Shelly 1 {"NAME":"Shelly 1","GPIO":[0,0,0,0,21,82,0,0,0,0,0,0,0],"FLAG":0,"BASE":46}
+Shelly 1PM {"NAME":"Shelly 1PM","GPIO":[56,0,0,0,82,134,0,0,0,0,0,21,0],"FLAG":2,"BASE":18}
+Shelly 2 {"NAME":"Shelly 2","GPIO":[0,135,0,136,21,22,0,0,9,0,10,137,0],"FLAG":0,"BASE":47}
+Shelly 2.5 {"NAME":"Shelly 2.5","GPIO":[56,255,17,255,21,83,0,0,6,82,5,22,156],"FLAG":2,"BASE":18}
+Sinilink XY-WF36V DC6V-36V Switch Module {"NAME":"Sinilink XY-WF5V","GPIO":[0,0,0,0,21,255,0,0,17,52,0,0,255],"FLAG":0,"BASE":18}
+Sinilink XY-WFMS MOS Switch Module {"NAME":"Sinilink MOS","GPIO":[0,0,0,0,21,255,0,0,17,52,0,0,255],"FLAG":0,"BASE":18}
+Sinilink XY-WFUSB USB Switch {"NAME":"XY-WFUSB","GPIO":[255,255,0,255,17,21,0,0,0,0,56,0,157],"FLAG":0,"BASE":18}
+Smart Home SS-8839-01 {"NAME":"SS-8839-01","GPIO":[0,255,0,255,21,0,0,0,17,57,0,56,0],"FLAG":0,"BASE":18}
+Sonoff 4CH (R2) {"NAME":"Sonoff 4CH","GPIO":[17,255,255,255,23,22,18,19,21,56,20,24,0],"FLAG":0,"BASE":7}
+Sonoff 4CH Pro (R2) {"NAME":"Sonoff 4CH Pro","GPIO":[17,255,255,255,23,22,18,19,21,56,20,24,0],"FLAG":0,"BASE":23}
+Sonoff 5V Inching/Selflock Module RE5V1C {"NAME":"Sonoff RE5V1C","GPIO":[17,255,255,255,255,255,0,0,21,56,0,0,0],"FLAG":0,"BASE":18}
+Sonoff Basic {"NAME":"Sonoff Basic","GPIO":[17,255,255,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":1}
+Sonoff Basic R3 {"NAME":"Basic R3","GPIO":[17,255,0,255,255,0,0,0,21,56,255,0,255],"FLAG":0,"BASE":1}
+Sonoff Dual {"NAME":"Sonoff Dual","GPIO":[0,148,0,149,255,0,0,0,0,56,255,0,0],"FLAG":0,"BASE":5}
+Sonoff Dual R2 {"NAME":"Sonoff Dual R2","GPIO":[255,255,0,255,0,22,255,17,21,56,0,0,0],"FLAG":0,"BASE":39}
+Sonoff Mini {"NAME":"Sonoff Mini","GPIO":[17,0,0,0,9,0,0,0,21,56,0,0,255],"FLAG":0,"BASE":1}
+Sonoff Pow {"NAME":"Sonoff Pow","GPIO":[17,0,0,0,0,130,0,0,21,132,133,52,0],"FLAG":0,"BASE":6}
+Sonoff Pow R2 {"NAME":"Sonoff Pow R2","GPIO":[17,145,0,146,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":43}
+Sonoff RF {"NAME":"Sonoff RF","GPIO":[17,255,255,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":2}
+Sonoff SV {"NAME":"Sonoff SV","GPIO":[17,255,0,255,255,255,0,0,21,56,255,0,0],"FLAG":1,"BASE":3}
+Sonoff TH10/TH16 {"NAME":"Sonoff TH","GPIO":[17,255,0,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":4}
+SS-8839-02 {"NAME":"SS-8839-02","GPIO":[0,255,0,255,56,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":18}
+SS311KWS RF Kinetic Switch and WiFi {"NAME":"SS311KWS","GPIO":[0,0,0,0,52,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+SW-R03 {"NAME":"SW-R03","GPIO":[0,0,0,0,0,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+WL-SW01_10 {"NAME":"WL-SW01_10","GPIO":[17,149,0,148,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
+Zemismart ERC309 Kinetic Switch {"NAME":"Kinetic Switch","GPIO":[255,255,255,255,255,255,0,0,255,108,255,107,255],"FLAG":0,"BASE":54}
+```
+
+## Sensor
+```
+DP-WP001 PIR {"NAME":"TUYA PIR","GPIO":[255,107,255,108,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
+DS18B20 ESP01 Module Temperature {"NAME":"ESP01S ds18b20","GPIO":[255,255,4,255,255,255,0,0,255,255,255,255,255],"FLAG":15,"BASE":18}
+Earykong TYMC-1 Door Window {"NAME":"TYMC-1","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
+IOT4SH01DS Temperature {"NAME":"IOT4SH01DS","GPIO":[255,255,255,255,255,255,0,0,255,4,255,255,255],"FLAG":15,"BASE":18}
+Mirabella Genio I002576 Motion {"NAME":"GenioPir","GPIO":[17,107,0,108,0,0,0,0,0,56,0,0,0],"FLAG":0,"BASE":54}
+Sonoff SC {"NAME":"Sonoff SC","GPIO":[17,148,255,149,0,0,0,0,0,56,0,0,0],"FLAG":0,"BASE":21}
+Zemismart Door Window {"NAME":"Zemismart","GPIO":[255,107,255,108,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54}
```
## Switch
```
-3A Smart Home HGZB-043 {"NAME":"3A Smart Home ","GPIO":[52,0,55,18,22,19,0,0,17,21,54,23,53],"FLAG":0,"BASE":18}
-Deta 6912HA {"NAME":"DETA 2G Switch","GPIO":[0,0,0,0,157,0,0,0,91,21,22,0,90],"FLAG":0,"BASE":18}
-DS-102 1 Gang {"NAME":"DS-102 1 Gang","GPIO":[57,0,0,17,0,0,0,0,0,21,56,0,0],"FLAG":1,"BASE":18}
-DS-102 2 Gang {"NAME":"DS-102 2 Gang","GPIO":[56,58,0,17,22,18,0,0,0,21,57,255,0],"FLAG":0,"BASE":18}
-DS-102 3 Gang {"NAME":"DS-102 3 Gang","GPIO":[158,58,0,18,22,19,0,0,17,21,57,23,56],"FLAG":0,"BASE":18}
-Enjowi WF-SK301 {"NAME":"Tuya 3 Channel","GPIO":[0,0,0,0,23,18,0,0,17,21,19,22,157],"FLAG":0,"BASE":18}
-Etekcity 3-way {"NAME":"Etekcity 3Way","GPIO":[255,255,0,255,23,29,0,0,82,22,10,0,0],"FLAG":0,"BASE":18}
-EtekCity ESWL01 {"NAME":"EtekCityESWL01","GPIO":[255,255,255,255,52,53,255,255,255,21,122,255,255],"FLAG":1,"BASE":18}
-Gosund KS-602S {"NAME":"Gosund KS-602S","GPIO":[17,56,0,0,0,0,0,0,0,0,21,0,158],"FLAG":0,"BASE":18}
-Jinvoo SM-SW101-1 {"NAME":"SM-SW101-1","GPIO":[52,0,0,18,0,0,0,0,17,21,0,0,0],"FLAG":1,"BASE":18}
-Jinvoo SM-SW101-2 {"NAME":"SM-SW101-2","GPIO":[52,0,0,18,22,0,0,0,17,21,0,0,0],"FLAG":1,"BASE":18}
-Jinvoo SM-SW101-3 {"NAME":"Jinvoo Wall Sw","GPIO":[52,0,0,18,22,19,0,0,17,21,0,23,0],"FLAG":1,"BASE":18}
-Jinvoo SM-SW101-C Curtain {"NAME":"Jinvoo Curtain","GPIO":[52,0,0,18,22,19,0,0,17,21,0,23,0],"FLAG":1,"BASE":18}
-KMC 70008 {"NAME":"KMC 70008","GPIO":[17,255,255,0,0,255,255,255,0,56,21,255,255],"FLAG":0,"BASE":18}
-KOAANW DS302 {"NAME":"DS302","GPIO":[0,0,0,19,23,18,0,0,17,21,0,22,52],"FLAG":1,"BASE":18}
-KS-601 2-way {"NAME":"2way Switch","GPIO":[255,255,158,255,255,83,255,255,22,21,255,82,255],"FLAG":0,"BASE":18}
-Kuled K36 {"NAME":"KULED-B","GPIO":[9,255,255,255,255,255,21,52,29,56,255,255,255],"FLAG":0,"BASE":18}
-Kuled KS602S {"NAME":"KULED","GPIO":[9,255,255,255,255,255,255,255,21,56,255,255,255],"FLAG":0,"BASE":18}
-KYGNE CD-301 {"NAME":"KYGNE Touch","GPIO":[0,0,0,0,52,53,0,0,21,17,0,0,0],"FLAG":0,"BASE":10}
-Lonsonho SK3-01 {"NAME":"Tuya 1 Channel","GPIO":[0,0,0,0,0,17,0,0,0,0,0,21,52],"FLAG":0,"BASE":18}
-Lonsonho SK3-02 {"NAME":"Tuya 2 Channel","GPIO":[0,0,0,0,22,0,0,0,17,21,18,0,52],"FLAG":0,"BASE":18}
-Luminea LHC-101.on {"NAME":"LHC-101.on","GPIO":[157,0,0,17,21,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":18}
-Luminea LHC-102.on {"NAME":"LHC-102.on","GPIO":[157,0,53,0,0,18,0,0,17,21,0,22,52],"FLAG":0,"BASE":18}
-LX-WIFI-00M 4 Gang {"NAME":"LX-WIFI-00M","GPIO":[17,25,255,255,23,22,18,19,21,0,20,24,0],"FLAG":0,"BASE":7}
-LYASI B07PYMG3WD {"NAME":"LYASI Touch Sw","GPIO":[0,0,0,0,56,52,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-Martin Jerry 15A {"NAME":"MJ Switch","GPIO":[255,255,255,255,57,56,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
-Martin Jerry 3 Way {"NAME":"MJ 3Way Switch","GPIO":[255,255,255,255,52,53,0,0,21,9,157,255,0],"FLAG":0,"BASE":18}
-Merkury MI-WW107-199W {"NAME":"MI-WW107-199W","GPIO":[52,0,0,0,0,0,0,0,17,21,0,0,0],"FLAG":0,"BASE":18}
-Minitiger 1 Gang {"NAME":"minitiger 1 Gang","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
-Minitiger 2 Gang {"NAME":"minitiger 2 Gang","GPIO":[17,255,255,255,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":28}
-Moes 1 Gang Touch {"NAME":"B07C8FJY3G","GPIO":[54,0,0,17,21,0,0,0,0,0,52,0,55],"FLAG":0,"BASE":18}
-Moes 2 Gang Touch {"NAME":"B07BLZFQZZ ","GPIO":[52,0,53,0,0,18,0,0,17,21,0,22,54],"FLAG":0,"BASE":18}
-Moes 2 Gang Touch {"NAME":"Tuya Moes 2 Ch","GPIO":[25,255,24,0,0,18,0,0,17,21,0,22,23],"FLAG":0,"BASE":18}
-Moes 3 Gang Touch {"NAME":"Tuya Moes 3 Ch","GPIO":[27,255,26,18,22,19,0,0,17,21,25,23,24],"FLAG":0,"BASE":18}
-Moes 3-Way {"NAME":"Moes 3-Way","GPIO":[255,255,255,255,21,57,0,0,30,10,9,255,255],"FLAG":0,"BASE":18}
-Moko {"NAME":"Moko Switch","GPIO":[0,0,0,17,21,134,0,0,0,0,0,0,0],"FLAG":0,"BASE":59}
-Nexete DS-123 {"NAME":"DS-123","GPIO":[157,57,255,17,21,18,0,0,255,22,56,255,255],"FLAG":0,"BASE":18}
-Sainko 1-Way {"NAME":"SAINKO 1CH","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
-SANA {"NAME":"SW02-03","GPIO":[56,255,255,19,23,18,255,255,17,21,255,22,255],"FLAG":0,"BASE":18}
-SANA SASW-03 {"NAME":"SANA SASW-03","GPIO":[54,0,0,19,23,18,0,0,17,21,0,22,0],"FLAG":0,"BASE":18}
-Sesoo SK3-04 {"NAME":"Tuya 4 Channel","GPIO":[52,255,255,19,23,17,0,0,20,24,22,21,18],"FLAG":0,"BASE":18}
-Sesoo WIFI-US-SK3-04 {"NAME":"WIFI-US-SK3-04","GPIO":[255,255,255,19,23,17,0,0,20,24,22,21,18],"FLAG":0,"BASE":18}
-SmartPlex 3 Gang {"NAME":"Tuya 3 Channel","GPIO":[255,255,255,255,21,18,0,0,19,23,17,22,255],"FLAG":0,"BASE":18}
-Sonoff T1 EU 1 Gang {"NAME":"Sonoff T1 1CH","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
-Sonoff T1 EU 2 Gang {"NAME":"Sonoff T1 2CH","GPIO":[17,255,255,255,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":29}
-Sonoff T1 UK 1 Gang {"NAME":"Sonoff T1 1CH","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
-Sonoff T1 UK 2 Gang {"NAME":"Sonoff T1 2CH","GPIO":[17,255,255,255,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":29}
-Sonoff T1 UK 3 Gang {"NAME":"Sonoff T1 3CH","GPIO":[17,255,255,255,23,22,18,19,21,56,0,0,0],"FLAG":0,"BASE":30}
-Sonoff T1 US 1 Gang {"NAME":"Sonoff T1 1CH","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
-Sonoff T1 US 2 Gang {"NAME":"Sonoff T1 2CH","GPIO":[17,255,255,255,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":29}
-Sonoff T1 US 3 Gang {"NAME":"Sonoff T1 3CH","GPIO":[17,255,255,255,23,22,18,19,21,56,0,0,0],"FLAG":0,"BASE":30}
-Sonoff Touch EU {"NAME":"Sonoff Touch","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":10}
-Sonoff Touch US {"NAME":"Sonoff Touch","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":10}
-SS118-01K1 {"NAME":"SS118-01K1","GPIO":[255,255,255,17,21,255,255,255,255,255,56,255,255],"FLAG":0,"BASE":18}
-STITCH by Monoprice 35557 {"NAME":"Tuya WF15S ","GPIO":[255,255,0,0,255,255,0,0,255,108,255,107,0],"FLAG":0,"BASE":54}
-Teepao Smart-Rollladen-Schalter {"NAME":"Teepao","GPIO":[158,58,23,18,22,19,0,0,56,21,57,0,17],"FLAG":0,"BASE":18}
-Tonbux AMZ180648-2 {"NAME":"Tonbux","GPIO":[17,255,255,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":1}
-Touch 2 Gang {"NAME":"tuya_2_gang","GPIO":[52,0,0,0,18,0,0,0,17,21,255,22,29],"FLAG":0,"BASE":18}
-TreatLife SS01S {"NAME":"TL SS01S Swtch","GPIO":[0,0,0,0,52,158,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
-WS-US-03 {"NAME":"WS-US-03","GPIO":[17,255,255,255,23,22,18,19,21,56,0,0,0],"FLAG":0,"BASE":30}
-Xenon SM-SW102-2 {"NAME":"SM SW102","GPIO":[255,255,255,18,22,255,255,255,17,21,255,255,255],"FLAG":0,"BASE":18}
-Youngzuth SW02 2-way {"NAME":"SW02 2W","GPIO":[52,255,255,9,21,255,255,255,10,22,255,255,255],"FLAG":0,"BASE":18}
-Zemismart KS-611 3 Gang {"NAME":"Zemismart 3 Ga","GPIO":[0,0,56,0,19,18,0,0,22,21,23,0,17],"FLAG":0,"BASE":18}
-Zemismart KS-811 1 gang {"NAME":"KS-811 Single","GPIO":[17,255,255,255,255,255,255,255,21,56,255,255,255],"FLAG":0,"BASE":18}
-Zemismart KS-811 2 Gang {"NAME":"KS-811 Dual","GPIO":[255,255,52,255,255,18,255,255,22,21,255,255,17],"FLAG":0,"BASE":18}
-Zemismart KS-811 3 Gang {"NAME":"KS-811 Triple","GPIO":[255,255,56,255,19,18,255,255,22,21,23,255,17],"FLAG":0,"BASE":18}
-Zemismart WF-BS01 {"NAME":"WF-BS01","GPIO":[53,0,0,17,21,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":18}
-Zemismart ZM-L02E {"NAME":"ZSmart ZM-L02E","GPIO":[255,255,255,255,255,17,255,255,18,21,22,255,255],"FLAG":0,"BASE":18}
+3A Smart Home HGZB-043 {"NAME":"3A Smart Home ","GPIO":[52,0,55,18,22,19,0,0,17,21,54,23,53],"FLAG":0,"BASE":18}
+Aoycocr SW1 {"NAME":"Aoycocr SW1","GPIO":[158,255,57,255,255,255,255,255,56,17,255,21,255],"FLAG":15,"BASE":18}
+Bardi Smart Wallswitch 2 {"NAME":"BARDI 2 Gang","GPIO":[56,0,157,18,22,0,0,0,52,21,57,0,17],"FLAG":0,"BASE":18}
+Bardi Smart Wallswitch 3 {"NAME":"BARDI 3 Gang","GPIO":[56,57,157,19,23,18,0,0,52,21,58,22,17],"FLAG":0,"BASE":18}
+BlitzWolf BW-SS3 2 Gang {"NAME":"BW-SS3-2G-EU","GPIO":[157,255,255,255,22,18,255,255,17,21,255,255,255],"FLAG":15,"BASE":18}
+BlitzWolf BW-SS3 3 Gang {"NAME":"BlitzWolf SS3","GPIO":[158,0,0,10,22,11,0,0,9,21,0,23,0],"FLAG":0,"BASE":18}
+CD303 3 Gang Touch {"NAME":"Touch Switch 3","GPIO":[54,57,255,19,23,18,255,255,17,21,255,22,52],"FLAG":15,"BASE":18}
+Deta 6911HA {"NAME":"Deta 1G Switch","GPIO":[0,0,0,0,157,0,0,0,0,21,0,0,90],"FLAG":0,"BASE":18}
+Deta 6912HA {"NAME":"DETA 2G Switch","GPIO":[0,0,0,0,157,0,0,0,91,21,22,0,90],"FLAG":0,"BASE":18}
+Digoo DG-S811 3 Gang {"NAME":"DIGOO Switch","GPIO":[0,0,0,0,19,18,0,0,22,21,23,0,17],"FLAG":0,"BASE":18}
+DS-102 1 Gang {"NAME":"DS-102 1 Gang","GPIO":[57,0,0,17,0,0,0,0,0,21,56,0,0],"FLAG":1,"BASE":18}
+DS-102 2 Gang {"NAME":"DS-102 2 Gang","GPIO":[158,57,0,17,22,18,0,0,0,21,56,255,0],"FLAG":0,"BASE":18}
+DS-102 3 Gang {"NAME":"DS-102 3 Gang","GPIO":[158,58,0,18,22,19,0,0,17,21,57,23,56],"FLAG":0,"BASE":18}
+Eachen CD303 3 Gang {"NAME":"ID Components","GPIO":[157,53,0,11,21,10,0,0,9,22,54,23,52],"FLAG":15,"BASE":18}
+Eachen SWT-2Gang {"NAME":"ID Components","GPIO":[157,255,255,255,255,10,255,255,9,21,53,22,52],"FLAG":15,"BASE":18}
+Enjowi WF-SK301 {"NAME":"Tuya 3 Channel","GPIO":[0,0,0,0,23,18,0,0,17,21,19,22,157],"FLAG":0,"BASE":18}
+Etekcity ESWL01 {"NAME":"EtekCityESWL01","GPIO":[0,255,0,255,52,53,0,0,0,21,122,0,0],"FLAG":1,"BASE":18}
+Etekcity ESWL03 3-way {"NAME":"Etekcity 3Way","GPIO":[0,0,0,0,23,29,0,0,82,22,10,0,0],"FLAG":0,"BASE":18}
+Eva Logik WF30 3-Way {"NAME":"WF30 Switch","GPIO":[0,0,0,0,18,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Geeni TAP 3-Way {"NAME":"Geeni 3-Way","GPIO":[157,0,0,0,0,0,0,0,17,21,0,0,0],"FLAG":0,"BASE":18}
+Girier JRSWR-SEU01 1 Gang {"NAME":"W601","GPIO":[0,0,0,0,0,17,0,0,0,0,0,21,157],"FLAG":15,"BASE":18}
+Girier JRSWR-SEU01 2 Gang {"NAME":"W602","GPIO":[0,0,0,0,22,0,0,0,17,21,18,0,157],"FLAG":15,"BASE":18}
+Girier JRSWR-US01 No Neutral {"NAME":"Tuya 1 Channel","GPIO":[0,0,0,0,0,17,0,0,0,0,0,21,157],"FLAG":0,"BASE":18}
+GoKlug Glass Touch 1 Gang {"NAME":"GoKlug 1x","GPIO":[56,57,0,0,0,9,0,0,0,0,0,21,0],"FLAG":0,"BASE":18}
+Gosund KS-602S {"NAME":"Gosund KS-602S","GPIO":[17,56,0,0,0,0,0,0,0,0,21,0,158],"FLAG":0,"BASE":18}
+Gosund SW1 {"NAME":"Gosund SW1","GPIO":[17,56,0,0,0,0,0,0,0,0,21,0,158],"FLAG":0,"BASE":18}
+Gosund SW1 v2 {"NAME":"Gosund SW1","GPIO":[17,0,56,0,0,0,0,0,0,0,21,0,57],"FLAG":0,"BASE":18}
+HBN Wall-Mounted Timer {"NAME":"HBN Time Switc","GPIO":[0,0,0,0,54,57,0,0,21,0,0,0,0],"FLAG":0,"BASE":18}
+Jinvoo SM-SW101-1 {"NAME":"SM-SW101-1","GPIO":[52,0,0,18,0,0,0,0,17,21,0,0,0],"FLAG":1,"BASE":18}
+Jinvoo SM-SW101-2 {"NAME":"SM-SW101-2","GPIO":[52,0,0,18,22,0,0,0,17,21,0,0,0],"FLAG":1,"BASE":18}
+Jinvoo SM-SW101-3 {"NAME":"Jinvoo Wall Sw","GPIO":[52,0,0,18,22,19,0,0,17,21,0,23,0],"FLAG":1,"BASE":18}
+KMC 70008 {"NAME":"KMC 70008","GPIO":[17,255,255,0,0,255,0,0,0,56,21,255,255],"FLAG":0,"BASE":18}
+Koaanw CD302-EU-1 {"NAME":"CD302-EU-1","GPIO":[0,0,0,0,157,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Koaanw CD302-EU-2 {"NAME":"CD302-EU-2","GPIO":[157,0,0,0,0,18,0,0,17,21,57,22,56],"FLAG":0,"BASE":18}
+Koaanw CD302-EU-3 {"NAME":"CD302-EU-3","GPIO":[158,53,0,19,23,18,0,0,17,21,54,22,52],"FLAG":0,"BASE":18}
+KS-601 2-way {"NAME":"2way Switch","GPIO":[255,255,158,255,255,83,0,0,22,21,255,82,255],"FLAG":0,"BASE":18}
+KS-605 {"NAME":"KS-605","GPIO":[17,0,0,0,0,0,0,0,21,158,0,0,0],"FLAG":0,"BASE":18}
+Kuled K36 {"NAME":"KULED-B","GPIO":[9,255,255,255,255,255,21,52,29,56,255,255,255],"FLAG":0,"BASE":18}
+Kuled KS602S {"NAME":"KULED","GPIO":[17,255,255,255,255,255,0,0,21,56,255,255,255],"FLAG":0,"BASE":18}
+Kygne CD-301 {"NAME":"KYGNE Touch","GPIO":[0,0,0,0,52,53,0,0,21,17,0,0,0],"FLAG":0,"BASE":10}
+Laghten SS02S {"NAME":"Laghten SS02S","GPIO":[0,0,0,0,52,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+LerLink X801A-L No Neutral {"NAME":"LerLink X801-L","GPIO":[0,0,0,0,17,0,0,0,21,56,0,0,0],"FLAG":15,"BASE":18}
+Lerlink X802A 2 Gang {"NAME":"Lerlink X802A","GPIO":[0,0,0,18,17,0,0,0,21,23,22,0,0],"FLAG":15,"BASE":18}
+LerLink X802A-L No Neutral {"NAME":"LerLink X802-L","GPIO":[0,0,0,18,17,0,0,0,21,158,22,0,0],"FLAG":15,"BASE":18}
+Lightstory WT02S {"NAME":"WT02S","GPIO":[0,0,0,0,57,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":50}
+Lonsonho SK3-01 {"NAME":"Tuya 1 Channel","GPIO":[0,0,0,0,0,17,0,0,0,0,0,21,52],"FLAG":0,"BASE":18}
+Lonsonho SK3-02 {"NAME":"Tuya 2 Channel","GPIO":[0,0,0,0,22,0,0,0,17,21,18,0,52],"FLAG":0,"BASE":18}
+Lonsonho SK3-03 {"NAME":"ID Components","GPIO":[0,0,0,0,21,18,0,0,19,23,17,22,157],"FLAG":0,"BASE":18}
+LoraTap WH100W-US 20A {"NAME":"LoraTap Boiler","GPIO":[0,0,0,0,0,0,0,0,17,21,0,0,56],"FLAG":0,"BASE":18}
+Luminea LHC-101.on {"NAME":"LHC-101.on","GPIO":[157,0,0,17,21,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":18}
+Luminea LHC-102.on {"NAME":"LHC-102.on","GPIO":[157,0,53,0,0,18,0,0,17,21,0,22,52],"FLAG":0,"BASE":18}
+LX-WIFI-00M 4 Gang {"NAME":"LX-WIFI-00M","GPIO":[17,25,255,255,23,22,18,19,21,0,20,24,0],"FLAG":0,"BASE":7}
+Markevina KS-602S {"NAME":"Markevina KS-6","GPIO":[17,255,0,255,0,0,0,0,21,52,0,0,0],"FLAG":0,"BASE":18}
+Martin Jerry MJ-S01 15A {"NAME":"MJ Switch","GPIO":[0,0,0,0,57,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Martin Jerry ST01 3 Way {"NAME":"MJ 3Way Switch","GPIO":[255,255,255,255,52,53,0,0,21,9,157,255,0],"FLAG":0,"BASE":18}
+Merkury MI-WW107-199W {"NAME":"MI-WW107-199W","GPIO":[52,0,0,0,0,0,0,0,17,21,0,0,0],"FLAG":0,"BASE":18}
+Micmi K38 {"NAME":"KS-605","GPIO":[17,0,0,0,0,0,0,0,21,158,0,0,0],"FLAG":0,"BASE":18}
+Minitiger 1 Gang {"NAME":"minitiger 1 Gang","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
+Minitiger 1 Gang v2 {"NAME":"MiniTiger1Band","GPIO":[0,56,0,0,0,17,0,0,21,0,0,0,0],"FLAG":0,"BASE":18}
+Minitiger 2 Gang {"NAME":"minitiger 2 Gang","GPIO":[17,255,255,255,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":28}
+Minitiger 2 Gang v2 {"NAME":"Minitiger2Band","GPIO":[0,0,0,17,18,0,0,0,0,21,22,0,0],"FLAG":0,"BASE":18}
+Moes BS-US-W Boiler {"NAME":"BS-US-W","GPIO":[54,0,0,17,21,0,0,0,0,0,52,0,55],"FLAG":0,"BASE":18}
+Moes SS01-1 3-Way {"NAME":"Moes 3-Way","GPIO":[255,255,255,255,21,57,0,0,30,10,9,255,255],"FLAG":0,"BASE":18}
+Moes SS01S-1 {"NAME":"Moes Switch","GPIO":[255,255,255,255,56,0,0,0,21,17,255,255,255],"FLAG":0,"BASE":18}
+Moes SS86-01 AI {"NAME":"SS86-AI 1 Gang","GPIO":[157,0,0,17,21,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":18}
+Moes WS-EU1-LB 1 Gang No Neutral {"NAME":"Moes WS-EU1-LB","GPIO":[0,0,0,0,0,17,0,0,0,0,0,21,157],"FLAG":0,"BASE":18}
+Moes WS-EU2-LW 2 Gang No Neutral {"NAME":"Tuya 2 Channel","GPIO":[0,0,0,0,22,0,0,0,17,21,18,0,157],"FLAG":0,"BASE":18}
+Moes WS-EU3-LW 3 Gang No Neutral {"NAME":"Tuya 3 Channel","GPIO":[0,0,0,0,21,19,0,0,18,22,17,23,157],"FLAG":0,"BASE":18}
+Moes WS-EUY3-W {"NAME":"WS-EUY3-W","GPIO":[157,0,58,18,22,19,0,0,17,21,57,23,56],"FLAG":0,"BASE":18}
+Moes WS-US1-W 1 Gang {"NAME":"WS-US1-W","GPIO":[54,0,0,17,21,0,0,0,0,0,52,0,55],"FLAG":0,"BASE":18}
+Moes WS-US2-W 2 Gang {"NAME":"WS-US2-W ","GPIO":[52,0,53,0,0,18,0,0,17,21,0,22,54],"FLAG":0,"BASE":18}
+Moes WS-US3-W 3 Gang {"NAME":"Tuya Moes 3 Ch","GPIO":[27,255,26,18,22,19,0,0,17,21,25,23,24],"FLAG":0,"BASE":18}
+Moes WT02S {"NAME":"Moes WT02S","GPIO":[0,0,0,0,56,158,0,0,21,9,0,0,0],"FLAG":15,"BASE":18}
+MoKo Smart Life {"NAME":"Moko Switch","GPIO":[0,0,0,17,21,134,0,0,0,0,0,0,0],"FLAG":0,"BASE":59}
+NaamaSmart KS602 {"NAME":"KS-602","GPIO":[17,0,0,0,0,0,0,0,21,158,0,0,0],"FLAG":0,"BASE":18}
+Nexete DS-123 {"NAME":"DS-123","GPIO":[157,57,255,17,21,18,0,0,255,22,56,255,255],"FLAG":0,"BASE":18}
+Nexete DS-123 Single {"NAME":"DS-123","GPIO":[157,0,255,18,0,17,0,0,255,21,56,255,255],"FLAG":0,"BASE":18}
+Sainko 1-Way {"NAME":"SAINKO 1CH","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
+SANA SASW-03 {"NAME":"SANA SASW-03","GPIO":[54,0,0,19,23,18,0,0,17,21,0,22,0],"FLAG":0,"BASE":18}
+SANA SW02-02 {"NAME":"SW02-02","GPIO":[31,255,255,18,22,0,0,0,17,21,255,0,255],"FLAG":0,"BASE":18}
+SANA SW02-03 {"NAME":"SW02-03","GPIO":[56,255,255,19,23,18,0,0,17,21,255,22,255],"FLAG":0,"BASE":18}
+SavEnergy 3 Gang {"NAME":"SavEnergy 3-sw","GPIO":[55,157,54,18,23,19,255,255,17,22,53,21,52],"FLAG":15,"BASE":18}
+Semicom LM-HP/GEVD-W {"NAME":"WaterHeater","GPIO":[158,56,0,0,0,17,0,0,0,0,0,21,0],"FLAG":0,"BASE":18}
+Sesoo WIFI-EU-SK3-01 {"NAME":"Sensoo SK3-01","GPIO":[255,255,57,255,255,17,0,0,255,255,255,21,52],"FLAG":0,"BASE":18}
+Sesoo WIFI-EU-SK3-02 {"NAME":"Sesoo SK3-02","GPIO":[0,0,57,0,22,0,0,0,17,21,18,0,52],"FLAG":0,"BASE":18}
+Sesoo WIFI-US-SK3-04 {"NAME":"Tuya 4 Channel","GPIO":[52,255,255,19,23,17,0,0,20,24,22,21,18],"FLAG":0,"BASE":18}
+Smartlife Opard CD302 {"NAME":"CD302","GPIO":[0,0,0,0,52,57,0,0,29,17,0,0,0],"FLAG":0,"BASE":18}
+SmartPlex 3 Gang {"NAME":"Tuya 3 Channel","GPIO":[255,255,255,255,21,18,0,0,19,23,17,22,255],"FLAG":0,"BASE":18}
+Sonoff T1 EU 1 Gang {"NAME":"Sonoff T1 1CH","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
+Sonoff T1 EU 2 Gang {"NAME":"Sonoff T1 2CH","GPIO":[17,255,255,255,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":29}
+Sonoff T1 UK 1 Gang {"NAME":"Sonoff T1 1CH","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
+Sonoff T1 UK 2 Gang {"NAME":"Sonoff T1 2CH","GPIO":[17,255,255,255,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":29}
+Sonoff T1 UK 3 Gang {"NAME":"Sonoff T1 3CH","GPIO":[17,255,255,255,23,22,18,19,21,56,0,0,0],"FLAG":0,"BASE":30}
+Sonoff T1 US 1 Gang {"NAME":"Sonoff T1 1CH","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
+Sonoff T1 US 2 Gang {"NAME":"Sonoff T1 2CH","GPIO":[17,255,255,255,0,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":29}
+Sonoff T1 US 3 Gang {"NAME":"Sonoff T1 3CH","GPIO":[17,255,255,255,23,22,18,19,21,56,0,0,0],"FLAG":0,"BASE":30}
+Sonoff Touch EU {"NAME":"Sonoff Touch","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":10}
+Sonoff Touch US {"NAME":"Sonoff Touch","GPIO":[17,255,0,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":10}
+Sonoff TX T3 3 Gang {"NAME":"TX T3EU3C","GPIO":[17,255,0,255,23,22,18,19,21,158,0,0,0],"FLAG":0,"BASE":30}
+SS118-01K1 {"NAME":"SS118-01K1","GPIO":[255,255,255,17,21,255,0,0,255,255,56,255,255],"FLAG":0,"BASE":18}
+SS86-AI 3-Gang {"NAME":"SS86-AI 3 Gang","GPIO":[157,0,58,18,22,19,0,0,17,21,57,23,56],"FLAG":0,"BASE":18}
+SSMS118-01A1 Scene Light Smart {"NAME":"RGB Switch","GPIO":[30,0,32,10,39,38,0,0,31,9,37,21,0],"FLAG":0,"BASE":18}
+STITCH by Monoprice 35557 {"NAME":"Tuya WF15S ","GPIO":[255,255,0,0,255,255,0,0,255,108,255,107,0],"FLAG":0,"BASE":54}
+Teekar 10 Way 1 Gang {"NAME":"Teekar 10way","GPIO":[9,10,11,20,13,14,0,0,15,16,0,0,0],"FLAG":0,"BASE":18}
+Teekar Wi-Fi Light 1 Gang {"NAME":"TeeKar Touch","GPIO":[0,0,255,0,255,21,0,0,0,255,17,0,255],"FLAG":0,"BASE":18}
+Teepao Smart-Rollladen-Schalter {"NAME":"Teepao","GPIO":[158,58,23,18,22,19,0,0,56,21,57,0,17],"FLAG":0,"BASE":18}
+Tonbux AMZ180648-2 {"NAME":"Tonbux","GPIO":[17,255,255,255,255,0,0,0,21,56,255,0,0],"FLAG":0,"BASE":1}
+Touch 2 Gang {"NAME":"tuya_2_gang","GPIO":[52,0,0,0,18,0,0,0,17,21,255,22,29],"FLAG":0,"BASE":18}
+TreatLife SS01S {"NAME":"TL SS01S Swtch","GPIO":[0,0,0,0,52,158,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+TreatLife SS02 3-Way {"NAME":"TreatLife 3Way","GPIO":[0,0,0,0,53,29,0,0,30,18,9,0,0],"FLAG":0,"BASE":18}
+TreatLife SS02S {"NAME":"Treatlife SS02","GPIO":[0,0,0,0,53,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Vaticas 1 {"NAME":"Vaticas","GPIO":[0,0,0,17,21,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":18}
+WiFi Smart Switch 2 Gang {"NAME":"Kingart N2","GPIO":[17,255,0,255,0,22,18,0,21,0,0,0,0],"FLAG":15,"BASE":18}
+WiFi Smart Switch 3 Gang {"NAME":"KingArt-3CH","GPIO":[17,255,0,255,23,22,18,19,21,52,0,0,0],"FLAG":15,"BASE":18}
+WS-US-03 {"NAME":"WS-US-03","GPIO":[17,255,255,255,23,22,18,19,21,56,0,0,0],"FLAG":0,"BASE":30}
+Xenon SM-SW102U 2 Gang {"NAME":"SM-SW102U-2","GPIO":[52,0,0,18,22,0,0,0,17,21,0,0,0],"FLAG":1,"BASE":18}
+Xenon SM-SW202 {"NAME":"SM-SW202","GPIO":[0,0,0,17,21,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":18}
+Yapmor 1-gang {"NAME":"YAPMOR 1CH","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28}
+Youngzuth 3in1 {"NAME":"SW02 3W","GPIO":[52,0,255,19,23,18,0,0,17,21,255,22,255],"FLAG":0,"BASE":18}
+Youngzuth SW02 2-way {"NAME":"SW02 2W","GPIO":[52,255,255,9,21,255,0,0,10,22,255,255,255],"FLAG":0,"BASE":18}
+Zemismart KS-611 3 Gang {"NAME":"Zemismart 3 Ga","GPIO":[0,0,56,0,19,18,0,0,22,21,23,0,17],"FLAG":0,"BASE":18}
+Zemismart KS-811 1 Gang {"NAME":"KS-811 Single","GPIO":[17,0,0,0,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":18}
+Zemismart KS-811 2 Gang {"NAME":"KS-811 Dual","GPIO":[0,0,52,0,0,18,0,0,22,21,0,0,17],"FLAG":0,"BASE":18}
+Zemismart KS-811 3 Gang {"NAME":"KS-811 Triple","GPIO":[0,0,56,0,19,18,0,0,22,21,23,0,17],"FLAG":0,"BASE":18}
+ZemiSmart SS118-01K2 {"NAME":"SS118-01K2","GPIO":[0,0,0,17,21,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Zemismart WF-BS01 {"NAME":"WF-BS01","GPIO":[53,0,0,17,21,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":18}
+Zemismart ZM-L01E {"NAME":"ZSmart ZM-L01E","GPIO":[255,255,255,255,255,255,0,0,255,21,255,255,17],"FLAG":0,"BASE":18}
+Zemismart ZM-L02E {"NAME":"ZSmart ZM-L02E","GPIO":[255,255,255,255,255,17,0,0,18,21,22,255,255],"FLAG":0,"BASE":18}
+Zemismart ZM-L03E {"NAME":"ZSmart ZM-L03E","GPIO":[52,53,0,0,23,17,0,0,19,21,22,0,18],"FLAG":0,"BASE":18}
```
## Valve
```
-Hoenyzy DN20 3/4 {"NAME":"Unbranded TYWE3S DN20 WIFI Valve","GPIO":[0,0,0,0,0,0,0,0,17,21,0,0,0],"FLAG":0,"BASE":18}
-Jinvoo SM-PW713 {"NAME":"Jinvoo Valve","GPIO":[0,0,0,0,21,52,0,0,17,53,0,0,0],"FLAG":1,"BASE":18}
-TopKitchen Irrigation Timer {"NAME":"HoseController","GPIO":[255,255,255,255,255,255,255,255,255,255,255,21,22],"FLAG":1,"BASE":18}
+Garden Water Timer BQ05 {"NAME":"BQ05","GPIO":[255,255,255,255,255,255,0,0,255,255,255,21,22],"FLAG":1,"BASE":18}
+Hoenyzy DN20 3/4 {"NAME":"DN20 Valve","GPIO":[0,0,0,0,0,0,0,0,17,21,0,0,0],"FLAG":0,"BASE":18}
+Jinvoo SM-AW713 {"NAME":"Jinvoo Valve","GPIO":[0,0,0,0,0,52,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+Jinvoo SM-AW713 v2 {"NAME":"Jinvoo Valve v2","GPIO":[0,0,0,0,52,53,0,0,21,17,0,0,0],"FLAG":0,"BASE":1}
+Jinvoo SM-PW713 {"NAME":"Jinvoo Valve","GPIO":[0,0,0,0,21,52,0,0,17,53,0,0,0],"FLAG":1,"BASE":18}
```
## Wall Outlet
```
-Bestten LO-2-W2 {"NAME":"BESTTEN LO-2-W","GPIO":[17,0,0,0,57,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
-Charging Essentials WiFi Smart {"NAME":"CESmart-Wall","GPIO":[255,255,255,255,255,17,255,255,21,255,255,255,255],"FLAG":0,"BASE":18}
-Kesen KS-604 {"NAME":"KS-604","GPIO":[255,255,52,255,255,18,255,255,22,21,255,255,17],"FLAG":0,"BASE":18}
-Kesen KS-604S {"NAME":"KS-604S","GPIO":[255,255,31,255,255,18,255,255,22,21,255,255,17],"FLAG":1,"BASE":18}
-MakeGood MG-AUWF01 {"NAME":"MG-AUWF01","GPIO":[56,10,157,59,134,132,255,255,131,22,57,21,9],"FLAG":0,"BASE":18}
-MoesHouse Smart Socket {"NAME":"Smart Socket","GPIO":[255,255,255,255,52,53,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
-Smanergy KA10 {"NAME":"KA10","GPIO":[0,56,0,17,134,132,0,0,131,53,21,0,0],"FLAG":0,"BASE":64}
-Sonoff S55 {"NAME":"Sonoff S55","GPIO":[17,255,0,255,255,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
-Topgreener TGWF15RM {"NAME":"TGWF15RM","GPIO":[0,56,0,17,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":55}
-Vigica VGSPK00815 {"NAME":"VIGICA outlet","GPIO":[17,255,255,255,255,22,18,255,21,255,255,255,255],"FLAG":1,"BASE":18}
-WWK-UN-W Glass Panel {"NAME":"tuya wall sock","GPIO":[255,255,255,255,52,53,255,255,21,17,255,255,255],"FLAG":0,"BASE":18}
+Bestten LO-2-W v2 {"NAME":"BESTTEN LO-2-W","GPIO":[0,0,0,0,158,17,0,0,21,0,0,0,0],"FLAG":0,"BASE":18}
+Bestten LO-2-W2 {"NAME":"BESTTEN LO-2-W","GPIO":[17,0,0,0,57,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
+BlitzWolf BW-SHP8 {"NAME":"SHP8","GPIO":[0,56,0,17,134,132,0,0,131,53,21,0,0],"FLAG":0,"BASE":64}
+BSEED Smart Socket / WIFI {"NAME":"BSEED Socket","GPIO":[0,0,0,0,157,52,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+CE Smart Home LA-2-W3 {"NAME":"CE Smart Wall","GPIO":[255,255,255,255,157,17,0,0,21,255,255,255,255],"FLAG":15,"BASE":18}
+CE Smart Home LQ-2-W3 {"NAME":"CE LQ-2-W3","GPIO":[255,255,255,255,255,17,255,255,21,255,255,255,255],"FLAG":15,"BASE":18}
+CE Smart Home LQ-2-W3 {"NAME":"LITESUN","GPIO":[0,0,0,0,157,17,0,0,21,0,0,0,0],"FLAG":0,"BASE":18}
+Deta 6922HA {"NAME":"DETA 2G GPO","GPIO":[0,0,0,17,157,0,0,0,91,21,22,0,90],"FLAG":0,"BASE":18}
+Ener-J 13A Twin Wall Sockets with USB {"NAME":"Ener-J 2-Gang ","GPIO":[17,0,0,0,0,21,18,0,22,56,0,0,0],"FLAG":0,"BASE":18}
+Kapok T16 {"NAME":"tiltech-t16","GPIO":[0,56,0,17,82,0,0,0,21,22,0,0,0],"FLAG":0,"BASE":18}
+Kesen KS-604 {"NAME":"KS-604","GPIO":[255,255,52,255,255,18,0,0,22,21,255,255,17],"FLAG":0,"BASE":18}
+Kesen KS-604S {"NAME":"KS-604S","GPIO":[255,255,31,255,255,18,0,0,22,21,255,255,17],"FLAG":1,"BASE":18}
+Keygma KS-15TW {"NAME":"Keygma KS-15T","GPIO":[0,0,0,0,0,56,0,0,21,9,0,0,0],"FLAG":0,"BASE":18}
+KS-621 {"NAME":"KS-621","GPIO":[17,0,0,0,133,132,0,0,130,52,0,21,91],"FLAG":15,"BASE":18}
+Makegood MG-AUWF01 {"NAME":"MG-AUWF01","GPIO":[56,10,157,59,134,132,0,0,131,22,57,21,9],"FLAG":0,"BASE":18}
+Makegood MG-UKWSG01 {"NAME":"Aseer 2-Gang","GPIO":[57,9,157,59,134,132,0,0,131,21,56,22,10],"FLAG":0,"BASE":18}
+Makegood MG-UKWSW/B {"NAME":"Aseer 1-Gang","GPIO":[56,0,157,57,134,132,0,0,131,0,0,21,9],"FLAG":0,"BASE":18}
+Moes WWK Glass Panel {"NAME":"Smart Socket","GPIO":[0,0,0,0,52,53,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+PS-1607 {"NAME":"PS-1607","GPIO":[17,0,0,0,0,22,18,0,21,0,0,0,0],"FLAG":0,"BASE":18}
+Smanergy KA10 {"NAME":"KA10","GPIO":[0,56,0,17,134,132,0,0,131,53,21,0,0],"FLAG":0,"BASE":64}
+Sonoff IW100 {"NAME":"Sonoff IW100","GPIO":[17,145,0,146,0,0,0,0,21,157,0,0,0],"FLAG":0,"BASE":41}
+Sonoff S55 {"NAME":"Sonoff S55","GPIO":[17,255,0,255,255,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":1}
+Teckin RF-SR40-US {"NAME":"RF-SR40-US","GPIO":[0,0,0,0,57,56,0,0,21,17,0,0,0],"FLAG":0,"BASE":18}
+TopGreener TGWF15RM {"NAME":"TGWF15RM","GPIO":[0,56,0,17,134,132,0,0,131,57,21,0,0],"FLAG":0,"BASE":55}
+Vigica VGSPK00815 {"NAME":"VIGICA outlet","GPIO":[17,255,255,255,255,22,18,255,21,255,255,255,255],"FLAG":1,"BASE":18}
```
\ No newline at end of file
diff --git a/api/upload-arduino.php b/api/upload-arduino.php
index 2b472c643..bf1f60846 100644
--- a/api/upload-arduino.php
+++ b/api/upload-arduino.php
@@ -3,12 +3,46 @@
//
//var_dump($_FILES);
+/**
+ * GZIPs a file on disk (appending .gz to the name)
+ *
+ * From http://stackoverflow.com/questions/6073397/how-do-you-create-a-gz-file-using-php
+ * Based on function by Kioob at:
+ * http://www.php.net/manual/en/function.gzwrite.php#34955
+ *
+ * @param string $source Path to file that should be compressed
+ * @param integer $level GZIP compression level (default: 9)
+ * @return string New filename (with .gz appended) if success, or false if operation fails
+ */
+function gzCompressFile($source, $level = 9){
+ $dest = $source . '.gz';
+ $mode = 'wb' . $level;
+ $error = false;
+ if ($fp_out = gzopen($dest, $mode)) {
+ if ($fp_in = fopen($source,'rb')) {
+ while (!feof($fp_in))
+ gzwrite($fp_out, fread($fp_in, 1024 * 512));
+ fclose($fp_in);
+ } else {
+ $error = true;
+ }
+ gzclose($fp_out);
+ } else {
+ $error = true;
+ }
+ if ($error)
+ return false;
+ else
+ return $dest;
+}
+
$image = basename($_FILES["file"]["name"]);
$target_file = "arduino/".$image;
$hostname = $_SERVER['SERVER_NAME'];
if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
- echo "The file $image has been uploaded to OTA server $hostname. \n";
+ gzCompressFile($target_file);
+ echo "The files $image and $image.gz have been uploaded to OTA server $hostname. \n";
} else {
echo "Sorry, there was an error uploading your file $image to OTA server $hostname. \n";
}
diff --git a/arduino/version 2.3.0/boards.txt b/arduino/version 2.3.0/boards.txt
deleted file mode 100644
index 9b3f2db8d..000000000
--- a/arduino/version 2.3.0/boards.txt
+++ /dev/null
@@ -1,1897 +0,0 @@
-menu.UploadSpeed=Upload Speed
-menu.CpuFrequency=CPU Frequency
-menu.FlashSize=Flash Size
-menu.FlashMode=Flash Mode
-menu.FlashFreq=Flash Frequency
-menu.UploadTool=Upload Using
-menu.ResetMethod=Reset Method
-menu.ESPModule=Module
-menu.Debug=Debug port
-menu.DebugLevel=Debug Level
-menu.LwIPVariant=lwIP Variant
-
-##############################################################
-generic.name=Generic ESP8266 Module
-
-generic.upload.tool=esptool
-generic.upload.speed=115200
-generic.upload.resetmethod=ck
-generic.upload.maximum_size=434160
-generic.upload.maximum_data_size=81920
-generic.upload.wait_for_upload_port=true
-generic.serial.disableDTR=true
-generic.serial.disableRTS=true
-
-generic.build.mcu=esp8266
-generic.build.f_cpu=80000000L
-generic.build.board=ESP8266_ESP01
-generic.build.core=esp8266
-generic.build.variant=generic
-generic.build.flash_mode=qio
-generic.build.spiffs_pagesize=256
-generic.build.debug_port=
-generic.build.debug_level=
-
-generic.menu.UploadTool.esptool=Serial
-generic.menu.UploadTool.esptool.upload.tool=esptool
-generic.menu.UploadTool.esptool.upload.verbose=-vv
-generic.menu.UploadTool.espupload=OTA_upload
-generic.menu.UploadTool.espupload.upload.tool=espupload
-
-generic.menu.CpuFrequency.80=80 MHz
-generic.menu.CpuFrequency.80.build.f_cpu=80000000L
-generic.menu.CpuFrequency.160=160 MHz
-generic.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-generic.menu.FlashFreq.40=40MHz
-generic.menu.FlashFreq.40.build.flash_freq=40
-generic.menu.FlashFreq.80=80MHz
-generic.menu.FlashFreq.80.build.flash_freq=80
-
-generic.menu.FlashMode.dio=DIO
-generic.menu.FlashMode.dio.build.flash_mode=dio
-generic.menu.FlashMode.qio=QIO
-generic.menu.FlashMode.qio.build.flash_mode=qio
-generic.menu.FlashMode.dout=DOUT
-generic.menu.FlashMode.dout.build.flash_mode=dout
-generic.menu.FlashMode.qout=QOUT
-generic.menu.FlashMode.qout.build.flash_mode=qout
-
-generic.menu.UploadSpeed.115200=115200
-generic.menu.UploadSpeed.115200.upload.speed=115200
-generic.menu.UploadSpeed.9600=9600
-generic.menu.UploadSpeed.9600.upload.speed=9600
-generic.menu.UploadSpeed.57600=57600
-generic.menu.UploadSpeed.57600.upload.speed=57600
-generic.menu.UploadSpeed.256000.windows=256000
-generic.menu.UploadSpeed.256000.upload.speed=256000
-generic.menu.UploadSpeed.230400.linux=230400
-generic.menu.UploadSpeed.230400.macosx=230400
-generic.menu.UploadSpeed.230400.upload.speed=230400
-generic.menu.UploadSpeed.460800.linux=460800
-generic.menu.UploadSpeed.460800.macosx=460800
-generic.menu.UploadSpeed.460800.upload.speed=460800
-generic.menu.UploadSpeed.512000.windows=512000
-generic.menu.UploadSpeed.512000.upload.speed=512000
-generic.menu.UploadSpeed.921600=921600
-generic.menu.UploadSpeed.921600.upload.speed=921600
-
-generic.menu.FlashSize.512K64=512K (64K SPIFFS)
-generic.menu.FlashSize.512K64.build.flash_size=512K
-generic.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-generic.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-generic.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-generic.menu.FlashSize.512K64.upload.maximum_size=434160
-
-generic.menu.FlashSize.512K128=512K (128K SPIFFS)
-generic.menu.FlashSize.512K128.build.flash_size=512K
-generic.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-generic.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-generic.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-generic.menu.FlashSize.512K128.upload.maximum_size=368624
-
-generic.menu.FlashSize.512K0=512K (no SPIFFS)
-generic.menu.FlashSize.512K0.build.flash_size=512K
-generic.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-generic.menu.FlashSize.512K0.upload.maximum_size=499696
-
-generic.menu.FlashSize.1M512=1M (512K SPIFFS)
-generic.menu.FlashSize.1M512.build.flash_size=1M
-generic.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-generic.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-generic.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-generic.menu.FlashSize.1M512.upload.maximum_size=499696
-
-generic.menu.FlashSize.1M256=1M (256K SPIFFS)
-generic.menu.FlashSize.1M256.build.flash_size=1M
-generic.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-generic.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-generic.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M256.upload.maximum_size=761840
-
-generic.menu.FlashSize.1M192=1M (192K SPIFFS)
-generic.menu.FlashSize.1M192.build.flash_size=1M
-generic.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-generic.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-generic.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M192.upload.maximum_size=827376
-
-generic.menu.FlashSize.1M160=1M (160K SPIFFS)
-generic.menu.FlashSize.1M160.build.flash_size=1M
-generic.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-generic.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-generic.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M160.upload.maximum_size=860144
-
-generic.menu.FlashSize.1M144=1M (144K SPIFFS)
-generic.menu.FlashSize.1M144.build.flash_size=1M
-generic.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-generic.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-generic.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M144.upload.maximum_size=876528
-
-generic.menu.FlashSize.1M128=1M (128K SPIFFS)
-generic.menu.FlashSize.1M128.build.flash_size=1M
-generic.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-generic.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-generic.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M128.upload.maximum_size=892912
-
-generic.menu.FlashSize.1M64=1M (64K SPIFFS)
-generic.menu.FlashSize.1M64.build.flash_size=1M
-generic.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-generic.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-generic.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M64.upload.maximum_size=958448
-
-generic.menu.FlashSize.1M0=1M (no SPIFFS)
-generic.menu.FlashSize.1M0.build.flash_size=1M
-generic.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-generic.menu.FlashSize.1M0.upload.maximum_size=1023984
-
-generic.menu.FlashSize.2M=2M (1M SPIFFS)
-generic.menu.FlashSize.2M.build.flash_size=2M
-generic.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld
-generic.menu.FlashSize.2M.build.spiffs_start=0x100000
-generic.menu.FlashSize.2M.build.spiffs_end=0x1FB000
-generic.menu.FlashSize.2M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.2M.upload.maximum_size=1044464
-
-generic.menu.FlashSize.4M1M=4M (1M SPIFFS)
-generic.menu.FlashSize.4M1M.build.flash_size=4M
-generic.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-generic.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-generic.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-generic.menu.FlashSize.4M1M.upload.maximum_size=1044464
-
-generic.menu.FlashSize.4M3M=4M (3M SPIFFS)
-generic.menu.FlashSize.4M3M.build.flash_size=4M
-generic.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-generic.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-generic.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M3M.upload.maximum_size=1044464
-
-generic.menu.ResetMethod.ck=ck
-generic.menu.ResetMethod.ck.upload.resetmethod=ck
-generic.menu.ResetMethod.nodemcu=nodemcu
-generic.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-
-generic.menu.Debug.Disabled=Disabled
-generic.menu.Debug.Disabled.build.debug_port=
-generic.menu.Debug.Serial=Serial
-generic.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-generic.menu.Debug.Serial1=Serial1
-generic.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-
-generic.menu.DebugLevel.None____=None
-generic.menu.DebugLevel.None____.build.debug_level=
-generic.menu.DebugLevel.Core____=Core
-generic.menu.DebugLevel.Core____.build.debug_level=-DDEBUG_ESP_CORE
-generic.menu.DebugLevel.SSL_____=Core + SSL
-generic.menu.DebugLevel.SSL_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL
-generic.menu.DebugLevel.SSL_MEM_=Core + SSL + TLS Mem
-generic.menu.DebugLevel.SSL_MEM_.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_TLS_MEM
-generic.menu.DebugLevel.WiFic___=Core + WiFi
-generic.menu.DebugLevel.WiFic___.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI
-generic.menu.DebugLevel.WiFi____=WiFi
-generic.menu.DebugLevel.WiFi____.build.debug_level=-DDEBUG_ESP_WIFI
-generic.menu.DebugLevel.HTTPClient=HTTPClient
-generic.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.HTTPClient2=HTTPClient + SSL
-generic.menu.DebugLevel.HTTPClient2.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_SSL
-generic.menu.DebugLevel.HTTPUpdate=HTTPUpdate
-generic.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE
-generic.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate
-generic.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE
-generic.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater
-generic.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER
-generic.menu.DebugLevel.HTTPServer=HTTPServer
-generic.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.UPDATER=Updater
-generic.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER
-generic.menu.DebugLevel.OTA_____=OTA
-generic.menu.DebugLevel.OTA_____.build.debug_level=-DDEBUG_ESP_OTA
-generic.menu.DebugLevel.OTA2____=OTA + Updater
-generic.menu.DebugLevel.OTA2____.build.debug_level=-DDEBUG_ESP_OTA -DDEBUG_ESP_UPDATER
-generic.menu.DebugLevel.all_____=All
-generic.menu.DebugLevel.all_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_TLS_MEM
-
-# disabled because espressif's bootloader refuses to write above 4M
-# generic.menu.FlashSize.8M=8M (7M SPIFFS)
-# generic.menu.FlashSize.8M.build.flash_size=1M
-# generic.menu.FlashSize.8M.build.flash_ld=eagle.flash.8m.ld
-# generic.menu.FlashSize.8M.build.spiffs_start=0x100000
-# generic.menu.FlashSize.8M.build.spiffs_end=0x800000
-# generic.menu.FlashSize.8M.build.spiffs_blocksize=8192
-# generic.menu.FlashSize.16M=16M (15M SPIFFS)
-# generic.menu.FlashSize.16M.build.flash_size=1M
-# generic.menu.FlashSize.16M.build.flash_ld=eagle.flash.16m.ld
-# generic.menu.FlashSize.16M.build.spiffs_start=0x100000
-# generic.menu.FlashSize.16M.build.spiffs_end=0x1000000
-# generic.menu.FlashSize.16M.build.spiffs_blocksize=8192
-
-##############################################################
-# ESP8285 chip has built-in 1MB flash
-
-esp8285.name=Generic ESP8285 Module
-
-esp8285.upload.tool=esptool
-esp8285.upload.speed=115200
-esp8285.upload.resetmethod=ck
-esp8285.upload.maximum_size=434160
-esp8285.upload.maximum_data_size=81920
-esp8285.upload.wait_for_upload_port=true
-esp8285.serial.disableDTR=true
-esp8285.serial.disableRTS=true
-
-esp8285.build.mcu=esp8266
-esp8285.build.f_cpu=80000000L
-esp8285.build.board=ESP8266_ESP01
-esp8285.build.core=esp8266
-esp8285.build.variant=generic
-esp8285.build.flash_mode=dout
-esp8285.build.flash_freq=40
-esp8285.build.spiffs_pagesize=256
-esp8285.build.debug_port=
-esp8285.build.debug_level=
-
-esp8285.menu.UploadTool.esptool=Serial
-esp8285.menu.UploadTool.esptool.upload.tool=esptool
-esp8285.menu.UploadTool.esptool.upload.verbose=-vv
-esp8285.menu.UploadTool.espupload=OTA_upload
-esp8285.menu.UploadTool.espupload.upload.tool=espupload
-
-esp8285.menu.CpuFrequency.80=80 MHz
-esp8285.menu.CpuFrequency.80.build.f_cpu=80000000L
-esp8285.menu.CpuFrequency.160=160 MHz
-esp8285.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-esp8285.menu.UploadSpeed.115200=115200
-esp8285.menu.UploadSpeed.115200.upload.speed=115200
-esp8285.menu.UploadSpeed.9600=9600
-esp8285.menu.UploadSpeed.9600.upload.speed=9600
-esp8285.menu.UploadSpeed.57600=57600
-esp8285.menu.UploadSpeed.57600.upload.speed=57600
-esp8285.menu.UploadSpeed.256000.windows=256000
-esp8285.menu.UploadSpeed.256000.upload.speed=256000
-esp8285.menu.UploadSpeed.230400.linux=230400
-esp8285.menu.UploadSpeed.230400.macosx=230400
-esp8285.menu.UploadSpeed.230400.upload.speed=230400
-esp8285.menu.UploadSpeed.460800.linux=460800
-esp8285.menu.UploadSpeed.460800.macosx=460800
-esp8285.menu.UploadSpeed.460800.upload.speed=460800
-esp8285.menu.UploadSpeed.512000.windows=512000
-esp8285.menu.UploadSpeed.512000.upload.speed=512000
-esp8285.menu.UploadSpeed.921600=921600
-esp8285.menu.UploadSpeed.921600.upload.speed=921600
-
-esp8285.menu.FlashSize.1M512=1M (512K SPIFFS)
-esp8285.menu.FlashSize.1M512.build.flash_size=1M
-esp8285.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-esp8285.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-esp8285.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-esp8285.menu.FlashSize.1M512.upload.maximum_size=499696
-
-esp8285.menu.FlashSize.1M256=1M (256K SPIFFS)
-esp8285.menu.FlashSize.1M256.build.flash_size=1M
-esp8285.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-esp8285.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-esp8285.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M256.upload.maximum_size=761840
-
-esp8285.menu.FlashSize.1M192=1M (192K SPIFFS)
-esp8285.menu.FlashSize.1M192.build.flash_size=1M
-esp8285.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-esp8285.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-esp8285.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M192.upload.maximum_size=827376
-
-esp8285.menu.FlashSize.1M160=1M (160K SPIFFS)
-esp8285.menu.FlashSize.1M160.build.flash_size=1M
-esp8285.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-esp8285.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-esp8285.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M160.upload.maximum_size=860144
-
-esp8285.menu.FlashSize.1M144=1M (144K SPIFFS)
-esp8285.menu.FlashSize.1M144.build.flash_size=1M
-esp8285.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-esp8285.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-esp8285.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M144.upload.maximum_size=876528
-
-esp8285.menu.FlashSize.1M128=1M (128K SPIFFS)
-esp8285.menu.FlashSize.1M128.build.flash_size=1M
-esp8285.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-esp8285.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-esp8285.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M128.upload.maximum_size=892912
-
-esp8285.menu.FlashSize.1M64=1M (64K SPIFFS)
-esp8285.menu.FlashSize.1M64.build.flash_size=1M
-esp8285.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-esp8285.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-esp8285.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M64.upload.maximum_size=958448
-
-esp8285.menu.FlashSize.1M0=1M (no SPIFFS)
-esp8285.menu.FlashSize.1M0.build.flash_size=1M
-esp8285.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-esp8285.menu.FlashSize.1M0.upload.maximum_size=1023984
-
-##############################################################
-
-espduino.name=ESPDuino (ESP-13 Module)
-
-espduino.upload.tool=esptool
-espduino.upload.speed=115200
-espduino.upload.resetmethod=ck
-espduino.upload.maximum_size=1044464
-espduino.upload.maximum_data_size=81920
-espduino.upload.wait_for_upload_port=true
-espduino.serial.disableDTR=true
-espduino.serial.disableRTS=true
-
-espduino.build.mcu=esp8266
-espduino.build.f_cpu=80000000L
-espduino.build.board=ESP8266_ESP13
-espduino.build.core=esp8266
-espduino.build.variant=ESPDuino
-espduino.build.flash_mode=dio
-espduino.build.flash_size=4M
-espduino.build.flash_freq=40
-espduino.build.debug_port=
-espduino.build.debug_level=
-
-espduino.menu.CpuFrequency.80=80 MHz
-espduino.menu.CpuFrequency.80.build.f_cpu=80000000L
-espduino.menu.CpuFrequency.160=160 MHz
-espduino.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-espduino.menu.UploadSpeed.115200=115200
-espduino.menu.UploadSpeed.115200.upload.speed=115200
-espduino.menu.UploadSpeed.9600=9600
-espduino.menu.UploadSpeed.9600.upload.speed=9600
-espduino.menu.UploadSpeed.57600=57600
-espduino.menu.UploadSpeed.57600.upload.speed=57600
-espduino.menu.UploadSpeed.256000.windows=256000
-espduino.menu.UploadSpeed.256000.upload.speed=256000
-espduino.menu.UploadSpeed.230400.linux=230400
-espduino.menu.UploadSpeed.230400.macosx=230400
-espduino.menu.UploadSpeed.230400.macosx=230400
-espduino.menu.UploadSpeed.230400.upload.speed=230400
-espduino.menu.UploadSpeed.460800.linux=460800
-espduino.menu.UploadSpeed.460800.macosx=460800
-espduino.menu.UploadSpeed.460800.upload.speed=460800
-espduino.menu.UploadSpeed.512000.windows=512000
-espduino.menu.UploadSpeed.512000.upload.speed=512000
-espduino.menu.UploadSpeed.921600=921600
-espduino.menu.UploadSpeed.921600.upload.speed=921600
-
-espduino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espduino.menu.FlashSize.4M3M.build.flash_size=4M
-espduino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espduino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espduino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espduino.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-espduino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espduino.menu.FlashSize.4M1M.build.flash_size=4M
-espduino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espduino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espduino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espduino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-##############################################################
-huzzah.name=Adafruit HUZZAH ESP8266
-
-huzzah.upload.tool=esptool
-huzzah.upload.speed=115200
-huzzah.upload.resetmethod=nodemcu
-huzzah.upload.maximum_size=1044464
-huzzah.upload.maximum_data_size=81920
-huzzah.upload.wait_for_upload_port=true
-huzzah.serial.disableDTR=true
-huzzah.serial.disableRTS=true
-
-huzzah.build.mcu=esp8266
-huzzah.build.f_cpu=80000000L
-huzzah.build.board=ESP8266_ESP12
-huzzah.build.core=esp8266
-huzzah.build.variant=adafruit
-huzzah.build.flash_mode=qio
-huzzah.build.flash_size=4M
-huzzah.build.flash_freq=40
-huzzah.build.debug_port=
-huzzah.build.debug_level=
-
-huzzah.menu.CpuFrequency.80=80 MHz
-huzzah.menu.CpuFrequency.80.build.f_cpu=80000000L
-huzzah.menu.CpuFrequency.160=160 MHz
-huzzah.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-huzzah.menu.UploadSpeed.115200=115200
-huzzah.menu.UploadSpeed.115200.upload.speed=115200
-huzzah.menu.UploadSpeed.9600=9600
-huzzah.menu.UploadSpeed.9600.upload.speed=9600
-huzzah.menu.UploadSpeed.57600=57600
-huzzah.menu.UploadSpeed.57600.upload.speed=57600
-huzzah.menu.UploadSpeed.256000=256000
-huzzah.menu.UploadSpeed.256000.upload.speed=256000
-huzzah.menu.UploadSpeed.921600=921600
-huzzah.menu.UploadSpeed.921600.upload.speed=921600
-
-huzzah.menu.FlashSize.4M3M=4M (3M SPIFFS)
-huzzah.menu.FlashSize.4M3M.build.flash_size=4M
-huzzah.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-huzzah.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-huzzah.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-huzzah.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-huzzah.menu.FlashSize.4M1M=4M (1M SPIFFS)
-huzzah.menu.FlashSize.4M1M.build.flash_size=4M
-huzzah.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-huzzah.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-huzzah.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-huzzah.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
-##############################################################
-espresso_lite_v1.name=ESPresso Lite 1.0
-espresso_lite_v1.upload.tool=esptool
-espresso_lite_v1.upload.speed=115200
-espresso_lite_v1.upload.maximum_size=1044464
-espresso_lite_v1.upload.maximum_data_size=81920
-espresso_lite_v1.upload.wait_for_upload_port=true
-
-espresso_lite_v1.build.mcu=esp8266
-espresso_lite_v1.build.f_cpu=80000000L
-espresso_lite_v1.build.board=ESP8266_ESPRESSO_LITE_V1
-espresso_lite_v1.build.core=esp8266
-espresso_lite_v1.build.variant=espresso_lite_v1
-espresso_lite_v1.build.flash_mode=dio
-espresso_lite_v1.build.flash_size=4M
-espresso_lite_v1.build.flash_freq=40
-
-espresso_lite_v1.menu.CpuFrequency.80=80 MHz
-espresso_lite_v1.menu.CpuFrequency.80.build.f_cpu=80000000L
-espresso_lite_v1.menu.CpuFrequency.160=160 MHz
-espresso_lite_v1.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-espresso_lite_v1.menu.UploadSpeed.115200=115200
-espresso_lite_v1.menu.UploadSpeed.115200.upload.speed=115200
-espresso_lite_v1.menu.UploadSpeed.57600=57600
-espresso_lite_v1.menu.UploadSpeed.57600.upload.speed=57600
-espresso_lite_v1.menu.UploadSpeed.256000.windows=256000
-espresso_lite_v1.menu.UploadSpeed.256000.upload.speed=256000
-espresso_lite_v1.menu.UploadSpeed.230400.linux=230400
-espresso_lite_v1.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v1.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v1.menu.UploadSpeed.230400.upload.speed=230400
-espresso_lite_v1.menu.UploadSpeed.460800.linux=460800
-espresso_lite_v1.menu.UploadSpeed.460800.macosx=460800
-espresso_lite_v1.menu.UploadSpeed.460800.upload.speed=460800
-espresso_lite_v1.menu.UploadSpeed.512000.windows=512000
-espresso_lite_v1.menu.UploadSpeed.512000.upload.speed=512000
-espresso_lite_v1.menu.UploadSpeed.921600=921600
-espresso_lite_v1.menu.UploadSpeed.921600.upload.speed=921600
-
-espresso_lite_v1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-
-espresso_lite_v1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espresso_lite_v1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-
-espresso_lite_v1.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espresso_lite_v1.menu.ResetMethod.ck=ck
-espresso_lite_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-
-espresso_lite_v1.menu.Debug.Disabled=Disabled
-espresso_lite_v1.menu.Debug.Disabled.build.debug_port=
-espresso_lite_v1.menu.Debug.Serial=Serial
-espresso_lite_v1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espresso_lite_v1.menu.Debug.Serial1=Serial1
-espresso_lite_v1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-
-espresso_lite_v1.menu.DebugLevel.None____=None
-espresso_lite_v1.menu.DebugLevel.None____.build.debug_level=
-espresso_lite_v1.menu.DebugLevel.Core____=Core
-espresso_lite_v1.menu.DebugLevel.Core____.build.debug_level=-DDEBUG_ESP_CORE
-espresso_lite_v1.menu.DebugLevel.SSL_____=Core + SSL
-espresso_lite_v1.menu.DebugLevel.SSL_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL
-espresso_lite_v1.menu.DebugLevel.SSL_MEM_=Core + SSL + TLS Mem
-espresso_lite_v1.menu.DebugLevel.SSL_MEM_.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_TLS_MEM
-espresso_lite_v1.menu.DebugLevel.WiFic___=Core + WiFi
-espresso_lite_v1.menu.DebugLevel.WiFic___.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI
-espresso_lite_v1.menu.DebugLevel.WiFi____=WiFi
-espresso_lite_v1.menu.DebugLevel.WiFi____.build.debug_level=-DDEBUG_ESP_WIFI
-espresso_lite_v1.menu.DebugLevel.HTTPClient=HTTPClient
-espresso_lite_v1.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.HTTPClient2=HTTPClient + SSL
-espresso_lite_v1.menu.DebugLevel.HTTPClient2.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_SSL
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate=HTTPUpdate
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER
-espresso_lite_v1.menu.DebugLevel.HTTPServer=HTTPServer
-espresso_lite_v1.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.UPDATER=Updater
-espresso_lite_v1.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER
-espresso_lite_v1.menu.DebugLevel.OTA_____=OTA
-espresso_lite_v1.menu.DebugLevel.OTA_____.build.debug_level=-DDEBUG_ESP_OTA
-espresso_lite_v1.menu.DebugLevel.OTA2____=OTA + Updater
-espresso_lite_v1.menu.DebugLevel.OTA2____.build.debug_level=-DDEBUG_ESP_OTA -DDEBUG_ESP_UPDATER
-espresso_lite_v1.menu.DebugLevel.all_____=All
-espresso_lite_v1.menu.DebugLevel.all_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_TLS_MEM
-
-espresso_lite_v1.build.debug_port=
-espresso_lite_v1.build.debug_level=
-
-##############################################################
-espresso_lite_v2.name=ESPresso Lite 2.0
-espresso_lite_v2.upload.tool=esptool
-espresso_lite_v2.upload.speed=115200
-espresso_lite_v2.upload.maximum_size=1044464
-espresso_lite_v2.upload.maximum_data_size=81920
-espresso_lite_v2.upload.wait_for_upload_port=true
-
-espresso_lite_v2.build.mcu=esp8266
-espresso_lite_v2.build.f_cpu=80000000L
-espresso_lite_v2.build.board=ESP8266_ESPRESSO_LITE_V2
-espresso_lite_v2.build.core=esp8266
-espresso_lite_v2.build.variant=espresso_lite_v2
-espresso_lite_v2.build.flash_mode=dio
-espresso_lite_v2.build.flash_size=4M
-espresso_lite_v2.build.flash_freq=40
-
-espresso_lite_v2.menu.CpuFrequency.80=80 MHz
-espresso_lite_v2.menu.CpuFrequency.80.build.f_cpu=80000000L
-espresso_lite_v2.menu.CpuFrequency.160=160 MHz
-espresso_lite_v2.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-espresso_lite_v2.menu.UploadSpeed.115200=115200
-espresso_lite_v2.menu.UploadSpeed.115200.upload.speed=115200
-espresso_lite_v2.menu.UploadSpeed.57600=57600
-espresso_lite_v2.menu.UploadSpeed.57600.upload.speed=57600
-espresso_lite_v2.menu.UploadSpeed.256000.windows=256000
-espresso_lite_v2.menu.UploadSpeed.256000.upload.speed=256000
-espresso_lite_v2.menu.UploadSpeed.230400.linux=230400
-espresso_lite_v2.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v2.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v2.menu.UploadSpeed.230400.upload.speed=230400
-espresso_lite_v2.menu.UploadSpeed.460800.linux=460800
-espresso_lite_v2.menu.UploadSpeed.460800.macosx=460800
-espresso_lite_v2.menu.UploadSpeed.460800.upload.speed=460800
-espresso_lite_v2.menu.UploadSpeed.512000.windows=512000
-espresso_lite_v2.menu.UploadSpeed.512000.upload.speed=512000
-espresso_lite_v2.menu.UploadSpeed.921600=921600
-espresso_lite_v2.menu.UploadSpeed.921600.upload.speed=921600
-
-espresso_lite_v2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-
-espresso_lite_v2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espresso_lite_v2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-
-espresso_lite_v2.menu.ResetMethod.ck=ck
-espresso_lite_v2.menu.ResetMethod.ck.upload.resetmethod=ck
-espresso_lite_v2.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-
-espresso_lite_v2.menu.Debug.Disabled=Disabled
-espresso_lite_v2.menu.Debug.Disabled.build.debug_port=
-espresso_lite_v2.menu.Debug.Serial=Serial
-espresso_lite_v2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espresso_lite_v2.menu.Debug.Serial1=Serial1
-espresso_lite_v2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-
-espresso_lite_v2.menu.DebugLevel.None____=None
-espresso_lite_v2.menu.DebugLevel.None____.build.debug_level=
-espresso_lite_v2.menu.DebugLevel.Core____=Core
-espresso_lite_v2.menu.DebugLevel.Core____.build.debug_level=-DDEBUG_ESP_CORE
-espresso_lite_v2.menu.DebugLevel.SSL_____=Core + SSL
-espresso_lite_v2.menu.DebugLevel.SSL_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL
-espresso_lite_v2.menu.DebugLevel.SSL_MEM_=Core + SSL + TLS Mem
-espresso_lite_v2.menu.DebugLevel.SSL_MEM_.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_TLS_MEM
-espresso_lite_v2.menu.DebugLevel.WiFic___=Core + WiFi
-espresso_lite_v2.menu.DebugLevel.WiFic___.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI
-espresso_lite_v2.menu.DebugLevel.WiFi____=WiFi
-espresso_lite_v2.menu.DebugLevel.WiFi____.build.debug_level=-DDEBUG_ESP_WIFI
-espresso_lite_v2.menu.DebugLevel.HTTPClient=HTTPClient
-espresso_lite_v2.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.HTTPClient2=HTTPClient + SSL
-espresso_lite_v2.menu.DebugLevel.HTTPClient2.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_SSL
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate=HTTPUpdate
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER
-espresso_lite_v2.menu.DebugLevel.HTTPServer=HTTPServer
-espresso_lite_v2.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.UPDATER=Updater
-espresso_lite_v2.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER
-espresso_lite_v2.menu.DebugLevel.OTA_____=OTA
-espresso_lite_v2.menu.DebugLevel.OTA_____.build.debug_level=-DDEBUG_ESP_OTA
-espresso_lite_v2.menu.DebugLevel.OTA2____=OTA + Updater
-espresso_lite_v2.menu.DebugLevel.OTA2____.build.debug_level=-DDEBUG_ESP_OTA -DDEBUG_ESP_UPDATER
-espresso_lite_v2.menu.DebugLevel.all_____=All
-espresso_lite_v2.menu.DebugLevel.all_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_TLS_MEM
-
-espresso_lite_v2.build.debug_port=
-espresso_lite_v2.build.debug_level=
-
-##############################################################
-phoenix_v1.name=Phoenix 1.0
-phoenix_v1.upload.tool=esptool
-phoenix_v1.upload.speed=115200
-phoenix_v1.upload.maximum_size=1044464
-phoenix_v1.upload.maximum_data_size=81920
-phoenix_v1.upload.wait_for_upload_port=true
-
-phoenix_v1.build.mcu=esp8266
-phoenix_v1.build.f_cpu=80000000L
-phoenix_v1.build.board=ESP8266_PHOENIX_V1
-phoenix_v1.build.core=esp8266
-phoenix_v1.build.variant=phoenix_v1
-phoenix_v1.build.flash_mode=dio
-phoenix_v1.build.flash_size=4M
-phoenix_v1.build.flash_freq=40
-
-phoenix_v1.menu.CpuFrequency.80=80 MHz
-phoenix_v1.menu.CpuFrequency.80.build.f_cpu=80000000L
-phoenix_v1.menu.CpuFrequency.160=160 MHz
-phoenix_v1.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-phoenix_v1.menu.UploadSpeed.115200=115200
-phoenix_v1.menu.UploadSpeed.115200.upload.speed=115200
-phoenix_v1.menu.UploadSpeed.57600=57600
-phoenix_v1.menu.UploadSpeed.57600.upload.speed=57600
-phoenix_v1.menu.UploadSpeed.256000.windows=256000
-phoenix_v1.menu.UploadSpeed.256000.upload.speed=256000
-phoenix_v1.menu.UploadSpeed.230400.linux=230400
-phoenix_v1.menu.UploadSpeed.230400.macosx=230400
-phoenix_v1.menu.UploadSpeed.230400.macosx=230400
-phoenix_v1.menu.UploadSpeed.230400.upload.speed=230400
-phoenix_v1.menu.UploadSpeed.460800.linux=460800
-phoenix_v1.menu.UploadSpeed.460800.macosx=460800
-phoenix_v1.menu.UploadSpeed.460800.upload.speed=460800
-phoenix_v1.menu.UploadSpeed.512000.windows=512000
-phoenix_v1.menu.UploadSpeed.512000.upload.speed=512000
-phoenix_v1.menu.UploadSpeed.921600=921600
-phoenix_v1.menu.UploadSpeed.921600.upload.speed=921600
-
-phoenix_v1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-phoenix_v1.menu.FlashSize.4M3M.build.flash_size=4M
-phoenix_v1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-phoenix_v1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-
-phoenix_v1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-phoenix_v1.menu.FlashSize.4M1M.build.flash_size=4M
-phoenix_v1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-phoenix_v1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-
-phoenix_v1.menu.ResetMethod.nodemcu=nodemcu
-phoenix_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-phoenix_v1.menu.ResetMethod.ck=ck
-phoenix_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-
-phoenix_v1.menu.Debug.Disabled=Disabled
-phoenix_v1.menu.Debug.Disabled.build.debug_port=
-phoenix_v1.menu.Debug.Serial=Serial
-phoenix_v1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-phoenix_v1.menu.Debug.Serial1=Serial1
-phoenix_v1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-
-phoenix_v1.menu.DebugLevel.None____=None
-phoenix_v1.menu.DebugLevel.None____.build.debug_level=
-phoenix_v1.menu.DebugLevel.Core____=Core
-phoenix_v1.menu.DebugLevel.Core____.build.debug_level=-DDEBUG_ESP_CORE
-phoenix_v1.menu.DebugLevel.SSL_____=Core + SSL
-phoenix_v1.menu.DebugLevel.SSL_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL
-phoenix_v1.menu.DebugLevel.SSL_MEM_=Core + SSL + TLS Mem
-phoenix_v1.menu.DebugLevel.SSL_MEM_.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_TLS_MEM
-phoenix_v1.menu.DebugLevel.WiFic___=Core + WiFi
-phoenix_v1.menu.DebugLevel.WiFic___.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI
-phoenix_v1.menu.DebugLevel.WiFi____=WiFi
-phoenix_v1.menu.DebugLevel.WiFi____.build.debug_level=-DDEBUG_ESP_WIFI
-phoenix_v1.menu.DebugLevel.HTTPClient=HTTPClient
-phoenix_v1.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.HTTPClient2=HTTPClient + SSL
-phoenix_v1.menu.DebugLevel.HTTPClient2.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_SSL
-phoenix_v1.menu.DebugLevel.HTTPUpdate=HTTPUpdate
-phoenix_v1.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE
-phoenix_v1.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate
-phoenix_v1.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE
-phoenix_v1.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater
-phoenix_v1.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER
-phoenix_v1.menu.DebugLevel.HTTPServer=HTTPServer
-phoenix_v1.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.UPDATER=Updater
-phoenix_v1.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER
-phoenix_v1.menu.DebugLevel.OTA_____=OTA
-phoenix_v1.menu.DebugLevel.OTA_____.build.debug_level=-DDEBUG_ESP_OTA
-phoenix_v1.menu.DebugLevel.OTA2____=OTA + Updater
-phoenix_v1.menu.DebugLevel.OTA2____.build.debug_level=-DDEBUG_ESP_OTA -DDEBUG_ESP_UPDATER
-phoenix_v1.menu.DebugLevel.all_____=All
-phoenix_v1.menu.DebugLevel.all_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_TLS_MEM
-
-phoenix_v1.build.debug_port=
-phoenix_v1.build.debug_level=
-
-##############################################################
-phoenix_v2.name=Phoenix 2.0
-phoenix_v2.upload.tool=esptool
-phoenix_v2.upload.speed=115200
-phoenix_v2.upload.maximum_size=1044464
-phoenix_v2.upload.maximum_data_size=81920
-phoenix_v2.upload.wait_for_upload_port=true
-
-phoenix_v2.build.mcu=esp8266
-phoenix_v2.build.f_cpu=80000000L
-phoenix_v2.build.board=ESP8266_PHOENIX_V2
-phoenix_v2.build.core=esp8266
-phoenix_v2.build.variant=phoenix_v2
-phoenix_v2.build.flash_mode=dio
-phoenix_v2.build.flash_size=4M
-phoenix_v2.build.flash_freq=40
-
-phoenix_v2.menu.CpuFrequency.80=80 MHz
-phoenix_v2.menu.CpuFrequency.80.build.f_cpu=80000000L
-phoenix_v2.menu.CpuFrequency.160=160 MHz
-phoenix_v2.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-phoenix_v2.menu.UploadSpeed.115200=115200
-phoenix_v2.menu.UploadSpeed.115200.upload.speed=115200
-phoenix_v2.menu.UploadSpeed.57600=57600
-phoenix_v2.menu.UploadSpeed.57600.upload.speed=57600
-phoenix_v2.menu.UploadSpeed.256000.windows=256000
-phoenix_v2.menu.UploadSpeed.256000.upload.speed=256000
-phoenix_v2.menu.UploadSpeed.230400.linux=230400
-phoenix_v2.menu.UploadSpeed.230400.macosx=230400
-phoenix_v2.menu.UploadSpeed.230400.macosx=230400
-phoenix_v2.menu.UploadSpeed.230400.upload.speed=230400
-phoenix_v2.menu.UploadSpeed.460800.linux=460800
-phoenix_v2.menu.UploadSpeed.460800.macosx=460800
-phoenix_v2.menu.UploadSpeed.460800.upload.speed=460800
-phoenix_v2.menu.UploadSpeed.512000.windows=512000
-phoenix_v2.menu.UploadSpeed.512000.upload.speed=512000
-phoenix_v2.menu.UploadSpeed.921600=921600
-phoenix_v2.menu.UploadSpeed.921600.upload.speed=921600
-
-phoenix_v2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-phoenix_v2.menu.FlashSize.4M3M.build.flash_size=4M
-phoenix_v2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-phoenix_v2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-
-phoenix_v2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-phoenix_v2.menu.FlashSize.4M1M.build.flash_size=4M
-phoenix_v2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-phoenix_v2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-
-phoenix_v2.menu.ResetMethod.ck=ck
-phoenix_v2.menu.ResetMethod.ck.upload.resetmethod=ck
-phoenix_v2.menu.ResetMethod.nodemcu=nodemcu
-phoenix_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-
-phoenix_v2.menu.Debug.Disabled=Disabled
-phoenix_v2.menu.Debug.Disabled.build.debug_port=
-phoenix_v2.menu.Debug.Serial=Serial
-phoenix_v2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-phoenix_v2.menu.Debug.Serial1=Serial1
-phoenix_v2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-
-phoenix_v2.menu.DebugLevel.None____=None
-phoenix_v2.menu.DebugLevel.None____.build.debug_level=
-phoenix_v2.menu.DebugLevel.Core____=Core
-phoenix_v2.menu.DebugLevel.Core____.build.debug_level=-DDEBUG_ESP_CORE
-phoenix_v2.menu.DebugLevel.SSL_____=Core + SSL
-phoenix_v2.menu.DebugLevel.SSL_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL
-phoenix_v2.menu.DebugLevel.SSL_MEM_=Core + SSL + TLS Mem
-phoenix_v2.menu.DebugLevel.SSL_MEM_.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_TLS_MEM
-phoenix_v2.menu.DebugLevel.WiFic___=Core + WiFi
-phoenix_v2.menu.DebugLevel.WiFic___.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI
-phoenix_v2.menu.DebugLevel.WiFi____=WiFi
-phoenix_v2.menu.DebugLevel.WiFi____.build.debug_level=-DDEBUG_ESP_WIFI
-phoenix_v2.menu.DebugLevel.HTTPClient=HTTPClient
-phoenix_v2.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.HTTPClient2=HTTPClient + SSL
-phoenix_v2.menu.DebugLevel.HTTPClient2.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_SSL
-phoenix_v2.menu.DebugLevel.HTTPUpdate=HTTPUpdate
-phoenix_v2.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE
-phoenix_v2.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate
-phoenix_v2.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE
-phoenix_v2.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater
-phoenix_v2.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER
-phoenix_v2.menu.DebugLevel.HTTPServer=HTTPServer
-phoenix_v2.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.UPDATER=Updater
-phoenix_v2.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER
-phoenix_v2.menu.DebugLevel.OTA_____=OTA
-phoenix_v2.menu.DebugLevel.OTA_____.build.debug_level=-DDEBUG_ESP_OTA
-phoenix_v2.menu.DebugLevel.OTA2____=OTA + Updater
-phoenix_v2.menu.DebugLevel.OTA2____.build.debug_level=-DDEBUG_ESP_OTA -DDEBUG_ESP_UPDATER
-phoenix_v2.menu.DebugLevel.all_____=All
-phoenix_v2.menu.DebugLevel.all_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_TLS_MEM
-
-phoenix_v2.build.debug_port=
-phoenix_v2.build.debug_level=
-
-##############################################################
-nodemcu.name=NodeMCU 0.9 (ESP-12 Module)
-
-nodemcu.upload.tool=esptool
-nodemcu.upload.speed=115200
-nodemcu.upload.resetmethod=nodemcu
-nodemcu.upload.maximum_size=1044464
-nodemcu.upload.maximum_data_size=81920
-nodemcu.upload.wait_for_upload_port=true
-nodemcu.serial.disableDTR=true
-nodemcu.serial.disableRTS=true
-
-nodemcu.build.mcu=esp8266
-nodemcu.build.f_cpu=80000000L
-nodemcu.build.board=ESP8266_NODEMCU
-nodemcu.build.core=esp8266
-nodemcu.build.variant=nodemcu
-nodemcu.build.flash_mode=qio
-nodemcu.build.flash_size=4M
-nodemcu.build.flash_freq=40
-nodemcu.build.debug_port=
-nodemcu.build.debug_level=
-
-nodemcu.menu.CpuFrequency.80=80 MHz
-nodemcu.menu.CpuFrequency.80.build.f_cpu=80000000L
-nodemcu.menu.CpuFrequency.160=160 MHz
-nodemcu.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-nodemcu.menu.UploadSpeed.115200=115200
-nodemcu.menu.UploadSpeed.115200.upload.speed=115200
-nodemcu.menu.UploadSpeed.9600=9600
-nodemcu.menu.UploadSpeed.9600.upload.speed=9600
-nodemcu.menu.UploadSpeed.57600=57600
-nodemcu.menu.UploadSpeed.57600.upload.speed=57600
-nodemcu.menu.UploadSpeed.256000.windows=256000
-nodemcu.menu.UploadSpeed.256000.upload.speed=256000
-nodemcu.menu.UploadSpeed.230400.linux=230400
-nodemcu.menu.UploadSpeed.230400.macosx=230400
-nodemcu.menu.UploadSpeed.230400.macosx=230400
-nodemcu.menu.UploadSpeed.230400.upload.speed=230400
-nodemcu.menu.UploadSpeed.460800.linux=460800
-nodemcu.menu.UploadSpeed.460800.macosx=460800
-nodemcu.menu.UploadSpeed.460800.upload.speed=460800
-nodemcu.menu.UploadSpeed.512000.windows=512000
-nodemcu.menu.UploadSpeed.512000.upload.speed=512000
-nodemcu.menu.UploadSpeed.921600=921600
-nodemcu.menu.UploadSpeed.921600.upload.speed=921600
-
-nodemcu.menu.FlashSize.4M3M=4M (3M SPIFFS)
-nodemcu.menu.FlashSize.4M3M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-nodemcu.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-nodemcu.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-nodemcu.menu.FlashSize.4M1M=4M (1M SPIFFS)
-nodemcu.menu.FlashSize.4M1M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcu.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-nodemcu.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
-##############################################################
-nodemcuv2.name=NodeMCU 1.0 (ESP-12E Module)
-
-nodemcuv2.upload.tool=esptool
-nodemcuv2.upload.speed=115200
-nodemcuv2.upload.resetmethod=nodemcu
-nodemcuv2.upload.maximum_size=1044464
-nodemcuv2.upload.maximum_data_size=81920
-nodemcuv2.upload.wait_for_upload_port=true
-nodemcuv2.serial.disableDTR=true
-nodemcuv2.serial.disableRTS=true
-
-nodemcuv2.build.mcu=esp8266
-nodemcuv2.build.f_cpu=80000000L
-nodemcuv2.build.board=ESP8266_NODEMCU
-nodemcuv2.build.core=esp8266
-nodemcuv2.build.variant=nodemcu
-nodemcuv2.build.flash_mode=dio
-nodemcuv2.build.flash_size=4M
-nodemcuv2.build.flash_freq=40
-nodemcuv2.build.debug_port=
-nodemcuv2.build.debug_level=
-
-nodemcuv2.menu.CpuFrequency.80=80 MHz
-nodemcuv2.menu.CpuFrequency.80.build.f_cpu=80000000L
-nodemcuv2.menu.CpuFrequency.160=160 MHz
-nodemcuv2.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-nodemcuv2.menu.UploadSpeed.115200=115200
-nodemcuv2.menu.UploadSpeed.115200.upload.speed=115200
-nodemcuv2.menu.UploadSpeed.9600=9600
-nodemcuv2.menu.UploadSpeed.9600.upload.speed=9600
-nodemcuv2.menu.UploadSpeed.57600=57600
-nodemcuv2.menu.UploadSpeed.57600.upload.speed=57600
-nodemcuv2.menu.UploadSpeed.256000.windows=256000
-nodemcuv2.menu.UploadSpeed.256000.upload.speed=256000
-nodemcuv2.menu.UploadSpeed.230400.linux=230400
-nodemcuv2.menu.UploadSpeed.230400.macosx=230400
-nodemcuv2.menu.UploadSpeed.230400.macosx=230400
-nodemcuv2.menu.UploadSpeed.230400.upload.speed=230400
-nodemcuv2.menu.UploadSpeed.460800.linux=460800
-nodemcuv2.menu.UploadSpeed.460800.macosx=460800
-nodemcuv2.menu.UploadSpeed.460800.upload.speed=460800
-nodemcuv2.menu.UploadSpeed.512000.windows=512000
-nodemcuv2.menu.UploadSpeed.512000.upload.speed=512000
-nodemcuv2.menu.UploadSpeed.921600=921600
-nodemcuv2.menu.UploadSpeed.921600.upload.speed=921600
-
-nodemcuv2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-nodemcuv2.menu.FlashSize.4M3M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-nodemcuv2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-nodemcuv2.menu.FlashSize.4M1M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
-
-##############################################################
-modwifi.name=Olimex MOD-WIFI-ESP8266(-DEV)
-
-modwifi.upload.tool=esptool
-modwifi.upload.speed=115200
-modwifi.upload.resetmethod=ck
-modwifi.upload.maximum_size=1044464
-modwifi.upload.maximum_data_size=81920
-modwifi.upload.wait_for_upload_port=true
-modwifi.serial.disableDTR=true
-modwifi.serial.disableRTS=true
-
-modwifi.build.mcu=esp8266
-modwifi.build.f_cpu=80000000L
-modwifi.build.board=MOD_WIFI_ESP8266
-modwifi.build.core=esp8266
-modwifi.build.variant=generic
-# Winbond W25Q16 flash
-modwifi.build.flash_mode=qio
-modwifi.build.flash_size=2M
-modwifi.build.flash_freq=40
-modwifi.build.flash_ld=eagle.flash.2m.ld
-modwifi.build.spiffs_start=0x100000
-modwifi.build.spiffs_end=0x1FB000
-modwifi.build.spiffs_pagesize=256
-modwifi.build.spiffs_blocksize=8192
-modwifi.build.debug_port=
-modwifi.build.debug_level=
-
-modwifi.menu.CpuFrequency.80=80 MHz
-modwifi.menu.CpuFrequency.80.build.f_cpu=80000000L
-modwifi.menu.CpuFrequency.160=160 MHz
-modwifi.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-modwifi.menu.UploadSpeed.115200=115200
-modwifi.menu.UploadSpeed.115200.upload.speed=115200
-modwifi.menu.UploadSpeed.9600=9600
-modwifi.menu.UploadSpeed.9600.upload.speed=9600
-modwifi.menu.UploadSpeed.57600=57600
-modwifi.menu.UploadSpeed.57600.upload.speed=57600
-modwifi.menu.UploadSpeed.256000.windows=256000
-modwifi.menu.UploadSpeed.256000.upload.speed=256000
-modwifi.menu.UploadSpeed.230400.linux=230400
-modwifi.menu.UploadSpeed.230400.macosx=230400
-modwifi.menu.UploadSpeed.230400.macosx=230400
-modwifi.menu.UploadSpeed.230400.upload.speed=230400
-modwifi.menu.UploadSpeed.460800.linux=460800
-modwifi.menu.UploadSpeed.460800.macosx=460800
-modwifi.menu.UploadSpeed.460800.upload.speed=460800
-modwifi.menu.UploadSpeed.512000.windows=512000
-modwifi.menu.UploadSpeed.512000.upload.speed=512000
-modwifi.menu.UploadSpeed.921600=921600
-modwifi.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-thing.name=SparkFun ESP8266 Thing
-
-thing.upload.tool=esptool
-thing.upload.speed=921600
-thing.upload.resetmethod=ck
-thing.upload.maximum_size=434160
-thing.upload.maximum_data_size=81920
-thing.upload.wait_for_upload_port=true
-thing.serial.disableDTR=true
-thing.serial.disableRTS=true
-
-thing.build.mcu=esp8266
-thing.build.f_cpu=80000000L
-thing.build.board=ESP8266_THING
-thing.build.core=esp8266
-thing.build.variant=thing
-thing.build.flash_mode=qio
-# flash chip: AT25SF041 (512 kbyte, 4Mbit)
-thing.build.flash_size=512K
-thing.build.flash_ld=eagle.flash.512k64.ld
-thing.build.flash_freq=40
-thing.build.spiffs_start=0x6B000
-thing.build.spiffs_end=0x7B000
-thing.build.spiffs_blocksize=4096
-thing.build.spiffs_pagesize=256
-thing.build.debug_port=
-thing.build.debug_level=
-
-thing.menu.CpuFrequency.80=80 MHz
-thing.menu.CpuFrequency.80.build.f_cpu=80000000L
-thing.menu.CpuFrequency.160=160 MHz
-thing.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-thing.menu.UploadSpeed.115200=115200
-thing.menu.UploadSpeed.115200.upload.speed=115200
-thing.menu.UploadSpeed.9600=9600
-thing.menu.UploadSpeed.9600.upload.speed=9600
-thing.menu.UploadSpeed.57600=57600
-thing.menu.UploadSpeed.57600.upload.speed=57600
-thing.menu.UploadSpeed.256000.windows=256000
-thing.menu.UploadSpeed.256000.upload.speed=256000
-thing.menu.UploadSpeed.230400.linux=230400
-thing.menu.UploadSpeed.230400.macosx=230400
-thing.menu.UploadSpeed.230400.upload.speed=230400
-thing.menu.UploadSpeed.460800.linux=460800
-thing.menu.UploadSpeed.460800.macosx=460800
-thing.menu.UploadSpeed.460800.upload.speed=460800
-thing.menu.UploadSpeed.512000.windows=512000
-thing.menu.UploadSpeed.512000.upload.speed=512000
-thing.menu.UploadSpeed.921600=921600
-thing.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-thingdev.name=SparkFun ESP8266 Thing Dev
-
-thingdev.upload.tool=esptool
-thingdev.upload.speed=921600
-thingdev.upload.resetmethod=nodemcu
-thingdev.upload.maximum_size=434160
-thingdev.upload.maximum_data_size=81920
-thingdev.upload.wait_for_upload_port=true
-thingdev.serial.disableDTR=true
-thingdev.serial.disableRTS=true
-
-thingdev.build.mcu=esp8266
-thingdev.build.f_cpu=80000000L
-thingdev.build.board=ESP8266_THING_DEV
-thingdev.build.core=esp8266
-thingdev.build.variant=thing
-thingdev.build.flash_mode=dio
-# flash chip: AT25SF041 (512 kbyte, 4Mbit)
-thingdev.build.flash_size=512K
-thingdev.build.flash_ld=eagle.flash.512k64.ld
-thingdev.build.flash_freq=40
-thingdev.build.debug_port=
-thingdev.build.debug_level=
-
-thingdev.menu.CpuFrequency.80=80 MHz
-thingdev.menu.CpuFrequency.80.build.f_cpu=80000000L
-thingdev.menu.CpuFrequency.160=160 MHz
-thingdev.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-thingdev.menu.UploadSpeed.115200=115200
-thingdev.menu.UploadSpeed.115200.upload.speed=115200
-thingdev.menu.UploadSpeed.9600=9600
-thingdev.menu.UploadSpeed.9600.upload.speed=9600
-thingdev.menu.UploadSpeed.57600=57600
-thingdev.menu.UploadSpeed.57600.upload.speed=57600
-thingdev.menu.UploadSpeed.256000.windows=256000
-thingdev.menu.UploadSpeed.256000.upload.speed=256000
-thingdev.menu.UploadSpeed.230400.linux=230400
-thingdev.menu.UploadSpeed.230400.macosx=230400
-thingdev.menu.UploadSpeed.230400.upload.speed=230400
-thingdev.menu.UploadSpeed.460800.linux=460800
-thingdev.menu.UploadSpeed.460800.macosx=460800
-thingdev.menu.UploadSpeed.460800.upload.speed=460800
-thingdev.menu.UploadSpeed.512000.windows=512000
-thingdev.menu.UploadSpeed.512000.upload.speed=512000
-thingdev.menu.UploadSpeed.921600=921600
-thingdev.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-esp210.name=SweetPea ESP-210
-
-esp210.upload.tool=esptool
-esp210.upload.speed=115200
-esp210.upload.resetmethod=ck
-esp210.upload.maximum_size=1044464
-esp210.upload.maximum_data_size=81920
-esp210.upload.wait_for_upload_port=true
-esp210.serial.disableDTR=true
-esp210.serial.disableRTS=true
-
-esp210.build.mcu=esp8266
-esp210.build.f_cpu=80000000L
-esp210.build.board=ESP8266_ESP210
-esp210.build.core=esp8266
-esp210.build.variant=generic
-esp210.build.flash_mode=qio
-esp210.build.flash_size=4M
-esp210.build.flash_freq=40
-esp210.build.debug_port=
-esp210.build.debug_level=
-
-esp210.menu.CpuFrequency.80=80 MHz
-esp210.menu.CpuFrequency.80.build.f_cpu=80000000L
-esp210.menu.CpuFrequency.160=160 MHz
-esp210.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-esp210.menu.UploadSpeed.57600=57600
-esp210.menu.UploadSpeed.57600.upload.speed=57600
-esp210.menu.UploadSpeed.115200=115200
-esp210.menu.UploadSpeed.115200.upload.speed=115200
-esp210.menu.UploadSpeed.256000.windows=256000
-esp210.menu.UploadSpeed.256000.upload.speed=256000
-esp210.menu.UploadSpeed.230400.linux=230400
-esp210.menu.UploadSpeed.230400.macosx=230400
-esp210.menu.UploadSpeed.230400.macosx=230400
-esp210.menu.UploadSpeed.230400.upload.speed=230400
-esp210.menu.UploadSpeed.460800.linux=460800
-esp210.menu.UploadSpeed.460800.macosx=460800
-esp210.menu.UploadSpeed.460800.upload.speed=460800
-esp210.menu.UploadSpeed.512000.windows=512000
-esp210.menu.UploadSpeed.512000.upload.speed=512000
-esp210.menu.UploadSpeed.921600=921600
-esp210.menu.UploadSpeed.921600.upload.speed=921600
-
-esp210.menu.FlashSize.4M3M=4M (3M SPIFFS)
-esp210.menu.FlashSize.4M3M.build.flash_size=4M
-esp210.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-esp210.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-esp210.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-esp210.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-esp210.menu.FlashSize.4M1M=4M (1M SPIFFS)
-esp210.menu.FlashSize.4M1M.build.flash_size=4M
-esp210.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-esp210.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-esp210.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-esp210.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
-##############################################################
-# wifio.name=Wifio
-#
-# wifio.upload.tool=esptool
-# wifio.upload.speed=115200
-# wifio.upload.resetmethod=wifio
-# wifio.upload.maximum_size=524288
-# wifio.upload.wait_for_upload_port=true
-#
-# wifio.build.mcu=esp8266
-# wifio.build.f_cpu=80000000L
-# wifio.build.board=ESP8266_WIFIO
-# wifio.build.core=esp8266
-# wifio.build.variant=wifio
-# wifio.build.flash_mode=qio
-# wifio.build.flash_size=512K
-# wifio.build.flash_freq=40
-# wifio.build.flash_ld=eagle.flash.512k64.ld
-# wifio.build.spiffs_start=0x6B000
-# wifio.build.spiffs_end=0x7B000
-#
-# wifio.menu.CpuFrequency.80=80MHz
-# wifio.menu.CpuFrequency.80.build.f_cpu=80000000L
-# wifio.menu.CpuFrequency.160=160MHz
-# wifio.menu.CpuFrequency.160.build.f_cpu=160000000L
-#
-# wifio.upload.tool=esptool
-#
-
-##############################################################
-d1_mini.name=WeMos D1 R2 & mini
-
-d1_mini.upload.tool=esptool
-d1_mini.upload.speed=460800
-d1_mini.upload.resetmethod=nodemcu
-d1_mini.upload.maximum_size=1044464
-d1_mini.upload.maximum_data_size=81920
-d1_mini.upload.wait_for_upload_port=true
-d1_mini.serial.disableDTR=true
-d1_mini.serial.disableRTS=true
-
-d1_mini.build.mcu=esp8266
-d1_mini.build.f_cpu=80000000L
-d1_mini.build.board=ESP8266_WEMOS_D1MINI
-d1_mini.build.core=esp8266
-d1_mini.build.variant=d1_mini
-d1_mini.build.flash_mode=dio
-d1_mini.build.flash_size=4M
-d1_mini.build.flash_freq=40
-d1_mini.build.debug_port=
-d1_mini.build.debug_level=
-
-d1_mini.menu.CpuFrequency.80=80 MHz
-d1_mini.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini.menu.CpuFrequency.160=160 MHz
-d1_mini.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-d1_mini.menu.UploadSpeed.921600=921600
-d1_mini.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini.menu.UploadSpeed.115200=115200
-d1_mini.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini.menu.UploadSpeed.9600=9600
-d1_mini.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini.menu.UploadSpeed.57600=57600
-d1_mini.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini.menu.UploadSpeed.256000.windows=256000
-d1_mini.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini.menu.UploadSpeed.230400.linux=230400
-d1_mini.menu.UploadSpeed.230400.macosx=230400
-d1_mini.menu.UploadSpeed.230400.macosx=230400
-d1_mini.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini.menu.UploadSpeed.460800.linux=460800
-d1_mini.menu.UploadSpeed.460800.macosx=460800
-d1_mini.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini.menu.UploadSpeed.512000.windows=512000
-d1_mini.menu.UploadSpeed.512000.upload.speed=512000
-
-
-d1_mini.menu.FlashSize.4M3M=4M (3M SPIFFS)
-d1_mini.menu.FlashSize.4M3M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-d1_mini.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-d1_mini.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-d1_mini.menu.FlashSize.4M1M=4M (1M SPIFFS)
-d1_mini.menu.FlashSize.4M1M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1_mini.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-d1_mini.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
-##############################################################
-d1.name=WeMos D1(Retired)
-
-d1.upload.tool=esptool
-d1.upload.speed=460800
-d1.upload.resetmethod=nodemcu
-d1.upload.maximum_size=1044464
-d1.upload.maximum_data_size=81920
-d1.upload.wait_for_upload_port=true
-d1.serial.disableDTR=true
-d1.serial.disableRTS=true
-
-d1.build.mcu=esp8266
-d1.build.f_cpu=80000000L
-d1.build.board=ESP8266_WEMOS_D1MINI
-d1.build.core=esp8266
-d1.build.variant=d1
-d1.build.flash_mode=dio
-d1.build.flash_size=4M
-d1.build.flash_freq=40
-d1.build.debug_port=
-d1.build.debug_level=
-
-d1.menu.CpuFrequency.80=80 MHz
-d1.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1.menu.CpuFrequency.160=160 MHz
-d1.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-d1.menu.UploadSpeed.921600=921600
-d1.menu.UploadSpeed.921600.upload.speed=921600
-d1.menu.UploadSpeed.115200=115200
-d1.menu.UploadSpeed.115200.upload.speed=115200
-d1.menu.UploadSpeed.9600=9600
-d1.menu.UploadSpeed.9600.upload.speed=9600
-d1.menu.UploadSpeed.57600=57600
-d1.menu.UploadSpeed.57600.upload.speed=57600
-d1.menu.UploadSpeed.256000.windows=256000
-d1.menu.UploadSpeed.256000.upload.speed=256000
-d1.menu.UploadSpeed.230400.linux=230400
-d1.menu.UploadSpeed.230400.macosx=230400
-d1.menu.UploadSpeed.230400.macosx=230400
-d1.menu.UploadSpeed.230400.upload.speed=230400
-d1.menu.UploadSpeed.460800.linux=460800
-d1.menu.UploadSpeed.460800.macosx=460800
-d1.menu.UploadSpeed.460800.upload.speed=460800
-d1.menu.UploadSpeed.512000.windows=512000
-d1.menu.UploadSpeed.512000.upload.speed=512000
-
-
-d1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-d1.menu.FlashSize.4M3M.build.flash_size=4M
-d1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-d1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-d1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-d1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-d1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-d1.menu.FlashSize.4M1M.build.flash_size=4M
-d1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-d1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-d1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
-
-##############################################################
-
-espino.name=ESPino (ESP-12 Module)
-
-espino.upload.tool=esptool
-espino.upload.speed=115200
-espino.upload.resetmethod=ck
-espino.upload.maximum_size=1044464
-espino.upload.maximum_data_size=81920
-espino.upload.wait_for_upload_port=true
-espino.serial.disableDTR=true
-espino.serial.disableRTS=true
-
-espino.build.mcu=esp8266
-espino.build.f_cpu=80000000L
-espino.build.board=ESP8266_ESP12
-espino.build.core=esp8266
-espino.build.variant=espino
-espino.build.flash_mode=qio
-espino.build.flash_size=4M
-espino.build.flash_freq=40
-espino.build.spiffs_pagesize=256
-espino.build.debug_port=
-espino.build.debug_level=
-
-espino.menu.CpuFrequency.80=80 MHz
-espino.menu.CpuFrequency.80.build.f_cpu=80000000L
-espino.menu.CpuFrequency.160=160 MHz
-espino.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-espino.menu.FlashMode.dio=DIO
-espino.menu.FlashMode.dio.build.flash_mode=dio
-espino.menu.FlashMode.qio=QIO
-espino.menu.FlashMode.qio.build.flash_mode=qio
-
-espino.menu.UploadSpeed.115200=115200
-espino.menu.UploadSpeed.115200.upload.speed=115200
-espino.menu.UploadSpeed.9600=9600
-espino.menu.UploadSpeed.9600.upload.speed=9600
-espino.menu.UploadSpeed.57600=57600
-espino.menu.UploadSpeed.57600.upload.speed=57600
-espino.menu.UploadSpeed.256000.windows=256000
-espino.menu.UploadSpeed.256000.upload.speed=256000
-espino.menu.UploadSpeed.230400.linux=230400
-espino.menu.UploadSpeed.230400.macosx=230400
-espino.menu.UploadSpeed.230400.upload.speed=230400
-espino.menu.UploadSpeed.460800.linux=460800
-espino.menu.UploadSpeed.460800.macosx=460800
-espino.menu.UploadSpeed.460800.upload.speed=460800
-espino.menu.UploadSpeed.512000.windows=512000
-espino.menu.UploadSpeed.512000.upload.speed=512000
-espino.menu.UploadSpeed.921600=921600
-espino.menu.UploadSpeed.921600.upload.speed=921600
-
-espino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espino.menu.FlashSize.4M1M.build.flash_size=4M
-espino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espino.menu.FlashSize.4M1M.upload.maximum_size=1044464
-
-espino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espino.menu.FlashSize.4M3M.build.flash_size=4M
-espino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espino.menu.FlashSize.4M3M.upload.maximum_size=1044464
-
-espino.menu.ResetMethod.ck=ck
-espino.menu.ResetMethod.ck.upload.resetmethod=ck
-espino.menu.ResetMethod.nodemcu=nodemcu
-espino.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-
-##############################################################
-espinotee.name=ThaiEasyElec's ESPino
-
-espinotee.upload.tool=esptool
-espinotee.upload.speed=115200
-espinotee.upload.resetmethod=nodemcu
-espinotee.upload.maximum_size=1044464
-espinotee.upload.maximum_data_size=81920
-espinotee.upload.wait_for_upload_port=true
-espinotee.serial.disableDTR=true
-espinotee.serial.disableRTS=true
-
-espinotee.build.mcu=esp8266
-espinotee.build.f_cpu=80000000L
-espinotee.build.board=ESP8266_ESP13
-espinotee.build.core=esp8266
-espinotee.build.variant=espinotee
-espinotee.build.flash_mode=qio
-espinotee.build.flash_size=4M
-espinotee.build.flash_freq=40
-espinotee.build.debug_port=
-espinotee.build.debug_level=
-
-espinotee.menu.CpuFrequency.80=80 MHz
-espinotee.menu.CpuFrequency.80.build.f_cpu=80000000L
-espinotee.menu.CpuFrequency.160=160 MHz
-espinotee.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-espinotee.menu.UploadSpeed.115200=115200
-espinotee.menu.UploadSpeed.115200.upload.speed=115200
-espinotee.menu.UploadSpeed.9600=9600
-espinotee.menu.UploadSpeed.9600.upload.speed=9600
-espinotee.menu.UploadSpeed.57600=57600
-espinotee.menu.UploadSpeed.57600.upload.speed=57600
-espinotee.menu.UploadSpeed.256000.windows=256000
-espinotee.menu.UploadSpeed.256000.upload.speed=256000
-espinotee.menu.UploadSpeed.230400.linux=230400
-espinotee.menu.UploadSpeed.230400.macosx=230400
-espinotee.menu.UploadSpeed.230400.macosx=230400
-espinotee.menu.UploadSpeed.230400.upload.speed=230400
-espinotee.menu.UploadSpeed.460800.linux=460800
-espinotee.menu.UploadSpeed.460800.macosx=460800
-espinotee.menu.UploadSpeed.460800.upload.speed=460800
-espinotee.menu.UploadSpeed.512000.windows=512000
-espinotee.menu.UploadSpeed.512000.upload.speed=512000
-espinotee.menu.UploadSpeed.921600=921600
-espinotee.menu.UploadSpeed.921600.upload.speed=921600
-
-espinotee.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espinotee.menu.FlashSize.4M3M.build.flash_size=4M
-espinotee.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espinotee.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espinotee.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espinotee.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-espinotee.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espinotee.menu.FlashSize.4M1M.build.flash_size=4M
-espinotee.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espinotee.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espinotee.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espinotee.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
-##############################################################
-wifinfo.name=WifInfo
-
-wifinfo.upload.tool=esptool
-wifinfo.upload.speed=115200
-wifinfo.upload.resetmethod=nodemcu
-wifinfo.upload.maximum_size=434160
-wifinfo.upload.maximum_data_size=81920
-wifinfo.upload.wait_for_upload_port=true
-wifinfo.serial.disableDTR=true
-wifinfo.serial.disableRTS=true
-
-wifinfo.build.mcu=esp8266
-wifinfo.build.core=esp8266
-wifinfo.build.variant=wifinfo
-wifinfo.build.board=WIFINFO
-wifinfo.build.spiffs_pagesize=256
-wifinfo.build.debug_port=Serial1
-wifinfo.build.debug_level=Wifinfo
-
-wifinfo.menu.Debug.Disabled=Disabled
-wifinfo.menu.Debug.Disabled.build.debug_port=
-wifinfo.menu.Debug.Serial=Serial
-wifinfo.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-wifinfo.menu.Debug.Serial1=Serial1
-wifinfo.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-
-wifinfo.menu.DebugLevel.None=None
-wifinfo.menu.DebugLevel.None.build.debug_level=
-wifinfo.menu.DebugLevel.Wifinfo=Wifinfo
-wifinfo.menu.DebugLevel.Wifinfo.build.debug_level=-DDEBUG_ESP_WIFINFO
-
-#wifinfo.menu.ESPModule.ESP07512=ESP07 (1M/512K SPIFFS)
-#wifinfo.menu.ESPModule.ESP07512.build.board=ESP8266_ESP07
-#wifinfo.menu.ESPModule.ESP07512.build.flash_size=1M
-#wifinfo.menu.ESPModule.ESP07512.build.flash_ld=eagle.flash.1m512.ld
-#wifinfo.menu.ESPModule.ESP07512.build.spiffs_start=0x7B000
-#wifinfo.menu.ESPModule.ESP07512.build.spiffs_end=0xFB000
-#wifinfo.menu.ESPModule.ESP07512.build.spiffs_blocksize=8192
-#wifinfo.menu.ESPModule.ESP07512.upload.maximum_size=499696
-
-#wifinfo.menu.ESPModule.ESP07256=ESP07 (1M/256K SPIFFS)
-#wifinfo.menu.ESPModule.ESP07256.build.board=ESP8266_ESP07
-#wifinfo.menu.ESPModule.ESP07256.build.flash_size=1M
-#wifinfo.menu.ESPModule.ESP07256.build.flash_ld=eagle.flash.1m256.ld
-#wifinfo.menu.ESPModule.ESP07256.build.spiffs_start=0xBB000
-#wifinfo.menu.ESPModule.ESP07256.build.spiffs_end=0xFB000
-##wifinfo.menu.ESPModule.ESP07256.build.spiffs_blocksize=4096
-#wifinfo.menu.ESPModule.ESP07256.upload.maximum_size=761840
-
-wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K SPIFFS)
-wifinfo.menu.ESPModule.ESP07192.build.board=ESP8266_ESP07
-wifinfo.menu.ESPModule.ESP07192.build.flash_size=1M
-wifinfo.menu.ESPModule.ESP07192.build.flash_ld=eagle.flash.1m192.ld
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_start=0xCB000
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_end=0xFB000
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_blocksize=4096
-wifinfo.menu.ESPModule.ESP07192.upload.maximum_size=827376
-
-#wifinfo.menu.ESPModule.ESP07160=ESP07 (1M/160K SPIFFS)
-#wifinfo.menu.ESPModule.ESP07160.build.board=ESP8266_ESP07
-#wifinfo.menu.ESPModule.ESP07160.build.flash_size=1M
-#wifinfo.menu.ESPModule.ESP07160.build.flash_ld=eagle.flash.1m160.ld
-#wifinfo.menu.ESPModule.ESP07160.build.spiffs_start=0xD3000
-#wifinfo.menu.ESPModule.ESP07160.build.spiffs_end=0xFB000
-#wifinfo.menu.ESPModule.ESP07160.build.spiffs_blocksize=4096
-#wifinfo.menu.ESPModule.ESP07160.upload.maximum_size=860144
-#
-#wifinfo.menu.ESPModule.ESP07144=ESP07 (1M/144K SPIFFS)
-#wifinfo.menu.ESPModule.ESP07144.build.board=ESP8266_ESP07
-#wifinfo.menu.ESPModule.ESP07144.build.flash_size=1M
-#wifinfo.menu.ESPModule.ESP07144.build.flash_ld=eagle.flash.1m144.ld
-#wifinfo.menu.ESPModule.ESP07144.build.spiffs_start=0xD7000
-#wifinfo.menu.ESPModule.ESP07144.build.spiffs_end=0xFB000
-#wifinfo.menu.ESPModule.ESP07144.build.spiffs_blocksize=4096
-#wifinfo.menu.ESPModule.ESP07144.upload.maximum_size=876528
-#
-#wifinfo.menu.ESPModule.ESP07=ESP07 (1M/64K SPIFFS)
-#wifinfo.menu.ESPModule.ESP07.build.board=ESP8266_ESP07
-#wifinfo.menu.ESPModule.ESP07.build.flash_size=1M
-#wifinfo.menu.ESPModule.ESP07.build.flash_ld=eagle.flash.1m64.ld
-#wifinfo.menu.ESPModule.ESP07.build.spiffs_start=0xEB000
-#wifinfo.menu.ESPModule.ESP07.build.spiffs_end=0xFB000
-#wifinfo.menu.ESPModule.ESP07.build.spiffs_blocksize=4096
-#wifinfo.menu.ESPModule.ESP07.upload.maximum_size=958448
-
-wifinfo.menu.ESPModule.ESP12=ESP12 (4M/1M SPIFFS)
-wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12
-wifinfo.menu.ESPModule.ESP12.build.flash_size=4M
-wifinfo.menu.ESPModule.ESP12.build.flash_ld=eagle.flash.4m1m.ld
-wifinfo.menu.ESPModule.ESP12.build.spiffs_start=0x300000
-wifinfo.menu.ESPModule.ESP12.build.spiffs_end=0x3FB000
-wifinfo.menu.ESPModule.ESP12.build.spiffs_blocksize=8192
-wifinfo.menu.ESPModule.ESP12.build.spiffs_pagesize=256
-wifinfo.menu.ESPModule.ESP12.upload.maximum_size=1044464
-
-wifinfo.menu.CpuFrequency.160=160 MHz
-wifinfo.menu.CpuFrequency.160.build.f_cpu=160000000L
-wifinfo.menu.CpuFrequency.80=80 MHz
-wifinfo.menu.CpuFrequency.80.build.f_cpu=80000000L
-
-wifinfo.menu.FlashFreq.40=40MHz
-wifinfo.menu.FlashFreq.40.build.flash_freq=40
-wifinfo.menu.FlashFreq.80=80MHz
-wifinfo.menu.FlashFreq.80.build.flash_freq=80
-
-wifinfo.menu.FlashMode.qio=QIO
-wifinfo.menu.FlashMode.qio.build.flash_mode=qio
-wifinfo.menu.FlashMode.dio=DIO
-wifinfo.menu.FlashMode.dio.build.flash_mode=dio
-
-wifinfo.menu.UploadSpeed.115200=115200
-wifinfo.menu.UploadSpeed.115200.upload.speed=115200
-wifinfo.menu.UploadSpeed.9600=9600
-wifinfo.menu.UploadSpeed.9600.upload.speed=9600
-wifinfo.menu.UploadSpeed.57600=57600
-wifinfo.menu.UploadSpeed.57600.upload.speed=57600
-wifinfo.menu.UploadSpeed.256000.windows=256000
-wifinfo.menu.UploadSpeed.256000.upload.speed=256000
-wifinfo.menu.UploadSpeed.230400.linux=230400
-wifinfo.menu.UploadSpeed.230400.macosx=230400
-wifinfo.menu.UploadSpeed.230400.upload.speed=230400
-wifinfo.menu.UploadSpeed.460800.linux=460800
-wifinfo.menu.UploadSpeed.460800.macosx=460800
-wifinfo.menu.UploadSpeed.460800.upload.speed=460800
-wifinfo.menu.UploadSpeed.512000.windows=512000
-wifinfo.menu.UploadSpeed.512000.upload.speed=512000
-wifinfo.menu.UploadSpeed.921600=921600
-wifinfo.menu.UploadSpeed.921600.upload.speed=921600
-
-
-##############################################################
-coredev.name=Core Development Module
-
-coredev.upload.tool=esptool
-coredev.upload.speed=115200
-coredev.upload.resetmethod=ck
-coredev.upload.maximum_size=434160
-coredev.upload.maximum_data_size=81920
-coredev.upload.wait_for_upload_port=true
-coredev.serial.disableDTR=true
-coredev.serial.disableRTS=true
-
-coredev.build.mcu=esp8266
-coredev.build.f_cpu=80000000L
-coredev.build.board=ESP8266_ESP01
-coredev.build.core=esp8266
-coredev.build.variant=generic
-coredev.build.flash_mode=qio
-coredev.build.spiffs_pagesize=256
-coredev.build.debug_port=
-coredev.build.debug_level=
-coredev.build.lwip_lib=-llwip
-coredev.build.lwip_flags=
-
-
-coredev.menu.LwIPVariant.Espressif=Espressif (xcc)
-coredev.menu.LwIPVariant.Espressif.build.lwip_lib=-llwip
-coredev.menu.LwIPVariant.Espressif.build.lwip_flags=
-coredev.menu.LwIPVariant.Prebuilt=Prebuilt Source (gcc)
-coredev.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-coredev.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-coredev.menu.LwIPVariant.OpenSource=Open Source (gcc)
-coredev.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-coredev.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-coredev.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-
-coredev.menu.CpuFrequency.80=80 MHz
-coredev.menu.CpuFrequency.80.build.f_cpu=80000000L
-coredev.menu.CpuFrequency.160=160 MHz
-coredev.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-coredev.menu.FlashFreq.40=40MHz
-coredev.menu.FlashFreq.40.build.flash_freq=40
-coredev.menu.FlashFreq.80=80MHz
-coredev.menu.FlashFreq.80.build.flash_freq=80
-
-coredev.menu.FlashMode.dio=DIO
-coredev.menu.FlashMode.dio.build.flash_mode=dio
-coredev.menu.FlashMode.qio=QIO
-coredev.menu.FlashMode.qio.build.flash_mode=qio
-coredev.menu.FlashMode.dout=DOUT
-coredev.menu.FlashMode.dout.build.flash_mode=dout
-coredev.menu.FlashMode.qout=QOUT
-coredev.menu.FlashMode.qout.build.flash_mode=qout
-
-coredev.menu.UploadSpeed.115200=115200
-coredev.menu.UploadSpeed.115200.upload.speed=115200
-coredev.menu.UploadSpeed.9600=9600
-coredev.menu.UploadSpeed.9600.upload.speed=9600
-coredev.menu.UploadSpeed.57600=57600
-coredev.menu.UploadSpeed.57600.upload.speed=57600
-coredev.menu.UploadSpeed.256000.windows=256000
-coredev.menu.UploadSpeed.256000.upload.speed=256000
-coredev.menu.UploadSpeed.230400.linux=230400
-coredev.menu.UploadSpeed.230400.macosx=230400
-coredev.menu.UploadSpeed.230400.upload.speed=230400
-coredev.menu.UploadSpeed.460800.linux=460800
-coredev.menu.UploadSpeed.460800.macosx=460800
-coredev.menu.UploadSpeed.460800.upload.speed=460800
-coredev.menu.UploadSpeed.512000.windows=512000
-coredev.menu.UploadSpeed.512000.upload.speed=512000
-coredev.menu.UploadSpeed.921600=921600
-coredev.menu.UploadSpeed.921600.upload.speed=921600
-
-coredev.menu.FlashSize.512K64=512K (64K SPIFFS)
-coredev.menu.FlashSize.512K64.build.flash_size=512K
-coredev.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-coredev.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-coredev.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-coredev.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-coredev.menu.FlashSize.512K64.upload.maximum_size=434160
-
-coredev.menu.FlashSize.512K128=512K (128K SPIFFS)
-coredev.menu.FlashSize.512K128.build.flash_size=512K
-coredev.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-coredev.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-coredev.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-coredev.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-coredev.menu.FlashSize.512K128.upload.maximum_size=368624
-
-coredev.menu.FlashSize.512K0=512K (no SPIFFS)
-coredev.menu.FlashSize.512K0.build.flash_size=512K
-coredev.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-coredev.menu.FlashSize.512K0.upload.maximum_size=499696
-
-coredev.menu.FlashSize.1M512=1M (512K SPIFFS)
-coredev.menu.FlashSize.1M512.build.flash_size=1M
-coredev.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-coredev.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-coredev.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-coredev.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-coredev.menu.FlashSize.1M512.upload.maximum_size=499696
-
-coredev.menu.FlashSize.1M256=1M (256K SPIFFS)
-coredev.menu.FlashSize.1M256.build.flash_size=1M
-coredev.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-coredev.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-coredev.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-coredev.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-coredev.menu.FlashSize.1M256.upload.maximum_size=761840
-
-coredev.menu.FlashSize.1M192=1M (192K SPIFFS)
-coredev.menu.FlashSize.1M192.build.flash_size=1M
-coredev.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-coredev.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-coredev.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-coredev.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-coredev.menu.FlashSize.1M192.upload.maximum_size=827376
-
-coredev.menu.FlashSize.1M160=1M (160K SPIFFS)
-coredev.menu.FlashSize.1M160.build.flash_size=1M
-coredev.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-coredev.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-coredev.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-coredev.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-coredev.menu.FlashSize.1M160.upload.maximum_size=860144
-
-coredev.menu.FlashSize.1M144=1M (144K SPIFFS)
-coredev.menu.FlashSize.1M144.build.flash_size=1M
-coredev.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-coredev.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-coredev.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-coredev.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-coredev.menu.FlashSize.1M144.upload.maximum_size=876528
-
-coredev.menu.FlashSize.1M128=1M (128K SPIFFS)
-coredev.menu.FlashSize.1M128.build.flash_size=1M
-coredev.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-coredev.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-coredev.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-coredev.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-coredev.menu.FlashSize.1M128.upload.maximum_size=892912
-
-coredev.menu.FlashSize.1M64=1M (64K SPIFFS)
-coredev.menu.FlashSize.1M64.build.flash_size=1M
-coredev.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-coredev.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-coredev.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-coredev.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-coredev.menu.FlashSize.1M64.upload.maximum_size=958448
-
-coredev.menu.FlashSize.2M=2M (1M SPIFFS)
-coredev.menu.FlashSize.2M.build.flash_size=2M
-coredev.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld
-coredev.menu.FlashSize.2M.build.spiffs_start=0x100000
-coredev.menu.FlashSize.2M.build.spiffs_end=0x1FB000
-coredev.menu.FlashSize.2M.build.spiffs_blocksize=8192
-coredev.menu.FlashSize.2M.upload.maximum_size=1044464
-
-coredev.menu.FlashSize.4M1M=4M (1M SPIFFS)
-coredev.menu.FlashSize.4M1M.build.flash_size=4M
-coredev.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-coredev.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-coredev.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-coredev.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-coredev.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-coredev.menu.FlashSize.4M1M.upload.maximum_size=1044464
-
-coredev.menu.FlashSize.4M3M=4M (3M SPIFFS)
-coredev.menu.FlashSize.4M3M.build.flash_size=4M
-coredev.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-coredev.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-coredev.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-coredev.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-coredev.menu.FlashSize.4M3M.upload.maximum_size=1044464
-
-coredev.menu.ResetMethod.ck=ck
-coredev.menu.ResetMethod.ck.upload.resetmethod=ck
-coredev.menu.ResetMethod.nodemcu=nodemcu
-coredev.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-
-coredev.menu.Debug.Disabled=Disabled
-coredev.menu.Debug.Disabled.build.debug_port=
-coredev.menu.Debug.Serial=Serial
-coredev.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-coredev.menu.Debug.Serial1=Serial1
-coredev.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-
-coredev.menu.DebugLevel.None____=None
-coredev.menu.DebugLevel.None____.build.debug_level=
-coredev.menu.DebugLevel.Core____=Core
-coredev.menu.DebugLevel.Core____.build.debug_level=-DDEBUG_ESP_CORE
-coredev.menu.DebugLevel.SSL_____=Core + SSL
-coredev.menu.DebugLevel.SSL_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL
-coredev.menu.DebugLevel.SSL_MEM_=Core + SSL + TLS Mem
-coredev.menu.DebugLevel.SSL_MEM_.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_TLS_MEM
-coredev.menu.DebugLevel.WiFic___=Core + WiFi
-coredev.menu.DebugLevel.WiFic___.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI
-coredev.menu.DebugLevel.WiFi____=WiFi
-coredev.menu.DebugLevel.WiFi____.build.debug_level=-DDEBUG_ESP_WIFI
-coredev.menu.DebugLevel.HTTPClient=HTTPClient
-coredev.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT
-coredev.menu.DebugLevel.HTTPClient2=HTTPClient + SSL
-coredev.menu.DebugLevel.HTTPClient2.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_SSL
-coredev.menu.DebugLevel.HTTPUpdate=HTTPUpdate
-coredev.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE
-coredev.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate
-coredev.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE
-coredev.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater
-coredev.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER
-coredev.menu.DebugLevel.HTTPServer=HTTPServer
-coredev.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER
-coredev.menu.DebugLevel.UPDATER=Updater
-coredev.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER
-coredev.menu.DebugLevel.OTA_____=OTA
-coredev.menu.DebugLevel.OTA_____.build.debug_level=-DDEBUG_ESP_OTA
-coredev.menu.DebugLevel.OTA2____=OTA + Updater
-coredev.menu.DebugLevel.OTA2____.build.debug_level=-DDEBUG_ESP_OTA -DDEBUG_ESP_UPDATER
-coredev.menu.DebugLevel.all_____=All
-coredev.menu.DebugLevel.all_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_TLS_MEM
diff --git a/arduino/version 2.3.0/platform.txt b/arduino/version 2.3.0/platform.txt
deleted file mode 100644
index d9c60b3f1..000000000
--- a/arduino/version 2.3.0/platform.txt
+++ /dev/null
@@ -1,130 +0,0 @@
-
-# ESP8266 platform
-# ------------------------------
-
-# For more info:
-# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification
-
-name=ESP8266 Modules
-version=2.2.0
-
-
-
-
-compiler.warning_flags=-w
-compiler.warning_flags.none=-w
-compiler.warning_flags.default=
-compiler.warning_flags.more=-Wall
-compiler.warning_flags.all=-Wall -Wextra
-
-build.lwip_lib=-llwip_gcc
-build.lwip_flags=-DLWIP_OPEN_SRC
-
-compiler.path={runtime.tools.xtensa-lx106-elf-gcc.path}/bin/
-compiler.sdk.path={runtime.platform.path}/tools/sdk
-compiler.cpreprocessor.flags=-D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ "-I{compiler.sdk.path}/include" "-I{compiler.sdk.path}/lwip/include" "-I{build.path}/core"
-
-compiler.c.cmd=xtensa-lx106-elf-gcc
-compiler.c.flags=-c {compiler.warning_flags} -Os -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -falign-functions=4 -MMD -std=gnu99 -ffunction-sections -fdata-sections
-
-compiler.S.cmd=xtensa-lx106-elf-gcc
-compiler.S.flags=-c -g -x assembler-with-cpp -MMD -mlongcalls
-
-compiler.c.elf.flags=-g {compiler.warning_flags} -Os -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-T{build.flash_ld}" -Wl,--gc-sections -Wl,-wrap,system_restart_local -Wl,-wrap,register_chipv6_phy
-
-compiler.c.elf.cmd=xtensa-lx106-elf-gcc
-compiler.c.elf.libs=-lm -lgcc -lhal -lphy -lpp -lnet80211 -lwpa -lcrypto -lmain -lwps -laxtls -lsmartconfig -lmesh -lwpa2 {build.lwip_lib} -lstdc++
-
-compiler.cpp.cmd=xtensa-lx106-elf-g++
-compiler.cpp.flags=-c {compiler.warning_flags} -Os -g -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -falign-functions=4 -std=c++11 -MMD -ffunction-sections -fdata-sections
-
-compiler.as.cmd=xtensa-lx106-elf-as
-
-compiler.ar.cmd=xtensa-lx106-elf-ar
-compiler.ar.flags=cru
-
-compiler.elf2hex.cmd=esptool
-compiler.elf2hex.flags=
-
-compiler.size.cmd=xtensa-lx106-elf-size
-
-compiler.esptool.cmd=esptool
-compiler.esptool.cmd.windows=esptool.exe
-
-# This can be overriden in boards.txt
-build.extra_flags=-DESP8266
-
-# These can be overridden in platform.local.txt
-compiler.c.extra_flags=
-compiler.c.elf.extra_flags=
-compiler.S.extra_flags=
-compiler.cpp.extra_flags=
-compiler.ar.extra_flags=
-compiler.objcopy.eep.extra_flags=
-compiler.elf2hex.extra_flags=
-
-## generate file with git version number
-## needs bash, git, and echo
-
-## windows-compatible version may be added later
-
-
-## Compile c files
-recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
-
-## Compile c++ files
-recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor.flags} {compiler.cpp.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
-
-## Compile S files
-recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.S.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
-
-## Create archives
-recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/arduino.ar" "{object_file}"
-
-## Combine gc-sections, archives, and objects
-recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{build.path}/arduino.ar" {compiler.c.elf.libs} -Wl,--end-group "-L{build.path}"
-
-## Create eeprom
-recipe.objcopy.eep.pattern=
-
-## Create hex
-#recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"
-
-recipe.objcopy.hex.pattern="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
-
-## Save hex
-recipe.output.tmp_file={build.project_name}.bin
-recipe.output.save_file={build.project_name}.{build.variant}.bin
-
-## Compute size
-recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf"
-recipe.size.regex=^(?:\.irom0\.text|\.text|\.data|\.rodata|)\s+([0-9]+).*
-recipe.size.regex.data=^(?:\.data|\.rodata|\.bss)\s+([0-9]+).*
-#recipe.size.regex.eeprom=^(?:\.eeprom)\s+([0-9]+).*
-
-# ------------------------------
-
-tools.esptool.cmd=esptool
-tools.esptool.cmd.windows=esptool.exe
-tools.esptool.path={runtime.tools.esptool.path}
-tools.esptool.network_cmd=python
-tools.esptool.network_cmd.windows=python.exe
-
-tools.esptool.upload.protocol=esp
-tools.esptool.upload.params.verbose=-vv
-tools.esptool.upload.params.quiet=
-tools.esptool.upload.pattern="{path}/{cmd}" {upload.verbose} -cd {upload.resetmethod} -cb {upload.speed} -cp "{serial.port}" -ca 0x00000 -cf "{build.path}/{build.project_name}.bin"
-tools.esptool.upload.network_pattern="{network_cmd}" "{runtime.platform.path}/tools/espota.py" -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin"
-
-tools.mkspiffs.cmd=mkspiffs
-tools.mkspiffs.cmd.windows=mkspiffs.exe
-tools.mkspiffs.path={runtime.tools.mkspiffs.path}
-
-tools.espupload.cmd=python
-tools.espupload.cmd.windows=python.exe
-tools.espupload.path={runtime.platform.path}/tools
-
-tools.espupload.upload.protocol=espupload
-tools.espupload.upload.params.verbose=
-tools.espupload.upload.params.quiet=
-tools.espupload.upload.pattern="{cmd}" "{path}/espupload.py" -f "{build.path}/{build.project_name}.bin"
diff --git a/arduino/version 2.3.0/tools/sdk/ld/eagle.flash.1m0.ld b/arduino/version 2.3.0/tools/sdk/ld/eagle.flash.1m0.ld
deleted file mode 100644
index 250962962..000000000
--- a/arduino/version 2.3.0/tools/sdk/ld/eagle.flash.1m0.ld
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Flash Split for 1M chips, no SPIFFS */
-/* sketch 999KB */
-/* eeprom 20KB */
-
-MEMORY
-{
- dport0_0_seg : org = 0x3FF00000, len = 0x10
- dram0_0_seg : org = 0x3FFE8000, len = 0x14000
- iram1_0_seg : org = 0x40100000, len = 0x8000
- irom0_0_seg : org = 0x40201010, len = 0xf9ff0
-}
-
-PROVIDE ( _SPIFFS_start = 0x402FB000 );
-PROVIDE ( _SPIFFS_end = 0x402FB000 );
-PROVIDE ( _SPIFFS_page = 0 );
-PROVIDE ( _SPIFFS_block = 0 );
-
-INCLUDE "../ld/eagle.app.v6.common.ld"
diff --git a/arduino/version 2.4.2/boards.txt b/arduino/version 2.4.2/boards.txt
deleted file mode 100644
index ead81b6f0..000000000
--- a/arduino/version 2.4.2/boards.txt
+++ /dev/null
@@ -1,4829 +0,0 @@
-#
-# Do not create pull-requests for this file only, CI will not accept them.
-# You *must* edit/modify/run boards.txt.py to regenerate boards.txt.
-# All modified files after running with option "--allgen" must be included in the pull-request.
-#
-
-menu.BoardModel=Model
-menu.UploadSpeed=Upload Speed
-menu.UploadTool=Upload Using
-menu.CpuFrequency=CPU Frequency
-menu.CrystalFreq=Crystal Frequency
-menu.FlashSize=Flash Size
-menu.FlashMode=Flash Mode
-menu.FlashFreq=Flash Frequency
-menu.ResetMethod=Reset Method
-menu.ESPModule=Module
-menu.Debug=Debug port
-menu.DebugLevel=Debug Level
-menu.LwIPVariant=lwIP Variant
-menu.VTable=VTables
-menu.led=Builtin Led
-menu.FlashErase=Erase Flash
-
-##############################################################
-generic.name=Generic ESP8266 Module
-generic.build.board=ESP8266_GENERIC
-generic.upload.tool=esptool
-generic.upload.maximum_data_size=81920
-generic.upload.wait_for_upload_port=true
-generic.upload.erase_cmd=
-generic.serial.disableDTR=true
-generic.serial.disableRTS=true
-generic.build.mcu=esp8266
-generic.build.core=esp8266
-generic.build.variant=generic
-generic.build.spiffs_pagesize=256
-generic.build.debug_port=
-generic.build.debug_level=
-
-generic.menu.UploadTool.esptool=Serial
-generic.menu.UploadTool.esptool.upload.tool=esptool
-generic.menu.UploadTool.esptool.upload.verbose=-vv
-generic.menu.UploadTool.espupload=OTA_upload
-generic.menu.UploadTool.espupload.upload.tool=espupload
-
-generic.menu.CpuFrequency.80=80 MHz
-generic.menu.CpuFrequency.80.build.f_cpu=80000000L
-generic.menu.CpuFrequency.160=160 MHz
-generic.menu.CpuFrequency.160.build.f_cpu=160000000L
-generic.menu.VTable.flash=Flash
-generic.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-generic.menu.VTable.heap=Heap
-generic.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-generic.menu.VTable.iram=IRAM
-generic.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-generic.menu.ResetMethod.ck=ck
-generic.menu.ResetMethod.ck.upload.resetmethod=ck
-generic.menu.ResetMethod.nodemcu=nodemcu
-generic.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-generic.menu.ResetMethod.none=none
-generic.menu.ResetMethod.none.upload.resetmethod=none
-generic.menu.ResetMethod.dtrset=dtrset
-generic.menu.ResetMethod.dtrset.upload.resetmethod=dtrset
-generic.menu.CrystalFreq.26=26 MHz
-generic.menu.CrystalFreq.40=40 MHz
-generic.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-generic.menu.FlashFreq.40=40MHz
-generic.menu.FlashFreq.40.build.flash_freq=40
-generic.menu.FlashFreq.80=80MHz
-generic.menu.FlashFreq.80.build.flash_freq=80
-generic.menu.FlashMode.qio=QIO
-generic.menu.FlashMode.qio.build.flash_mode=qio
-generic.menu.FlashMode.qout=QOUT
-generic.menu.FlashMode.qout.build.flash_mode=qout
-generic.menu.FlashMode.dio=DIO
-generic.menu.FlashMode.dio.build.flash_mode=dio
-generic.menu.FlashMode.dout=DOUT
-generic.menu.FlashMode.dout.build.flash_mode=dout
-generic.menu.FlashSize.512K0=512K (no SPIFFS)
-generic.menu.FlashSize.512K0.build.flash_size=512K
-generic.menu.FlashSize.512K0.build.flash_size_bytes=0x80000
-generic.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-generic.menu.FlashSize.512K0.build.spiffs_pagesize=256
-generic.menu.FlashSize.512K0.upload.maximum_size=499696
-generic.menu.FlashSize.512K0.build.rfcal_addr=0x7C000
-generic.menu.FlashSize.512K32=512K (32K SPIFFS)
-generic.menu.FlashSize.512K32.build.flash_size=512K
-generic.menu.FlashSize.512K32.build.flash_size_bytes=0x80000
-generic.menu.FlashSize.512K32.build.flash_ld=eagle.flash.512k32.ld
-generic.menu.FlashSize.512K32.build.spiffs_pagesize=256
-generic.menu.FlashSize.512K32.upload.maximum_size=466928
-generic.menu.FlashSize.512K32.build.rfcal_addr=0x7C000
-generic.menu.FlashSize.512K32.build.spiffs_start=0x73000
-generic.menu.FlashSize.512K32.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K32.build.spiffs_blocksize=4096
-generic.menu.FlashSize.512K64=512K (64K SPIFFS)
-generic.menu.FlashSize.512K64.build.flash_size=512K
-generic.menu.FlashSize.512K64.build.flash_size_bytes=0x80000
-generic.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-generic.menu.FlashSize.512K64.build.spiffs_pagesize=256
-generic.menu.FlashSize.512K64.upload.maximum_size=434160
-generic.menu.FlashSize.512K64.build.rfcal_addr=0x7C000
-generic.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-generic.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-generic.menu.FlashSize.512K128=512K (128K SPIFFS)
-generic.menu.FlashSize.512K128.build.flash_size=512K
-generic.menu.FlashSize.512K128.build.flash_size_bytes=0x80000
-generic.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-generic.menu.FlashSize.512K128.build.spiffs_pagesize=256
-generic.menu.FlashSize.512K128.upload.maximum_size=368624
-generic.menu.FlashSize.512K128.build.rfcal_addr=0x7C000
-generic.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-generic.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M0=1M (no SPIFFS)
-generic.menu.FlashSize.1M0.build.flash_size=1M
-generic.menu.FlashSize.1M0.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-generic.menu.FlashSize.1M0.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M0.upload.maximum_size=1023984
-generic.menu.FlashSize.1M0.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M64=1M (64K SPIFFS)
-generic.menu.FlashSize.1M64.build.flash_size=1M
-generic.menu.FlashSize.1M64.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-generic.menu.FlashSize.1M64.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M64.upload.maximum_size=958448
-generic.menu.FlashSize.1M64.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-generic.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M128=1M (128K SPIFFS)
-generic.menu.FlashSize.1M128.build.flash_size=1M
-generic.menu.FlashSize.1M128.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-generic.menu.FlashSize.1M128.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M128.upload.maximum_size=892912
-generic.menu.FlashSize.1M128.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-generic.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M144=1M (144K SPIFFS)
-generic.menu.FlashSize.1M144.build.flash_size=1M
-generic.menu.FlashSize.1M144.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-generic.menu.FlashSize.1M144.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M144.upload.maximum_size=876528
-generic.menu.FlashSize.1M144.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-generic.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M160=1M (160K SPIFFS)
-generic.menu.FlashSize.1M160.build.flash_size=1M
-generic.menu.FlashSize.1M160.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-generic.menu.FlashSize.1M160.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M160.upload.maximum_size=860144
-generic.menu.FlashSize.1M160.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-generic.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M192=1M (192K SPIFFS)
-generic.menu.FlashSize.1M192.build.flash_size=1M
-generic.menu.FlashSize.1M192.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-generic.menu.FlashSize.1M192.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M192.upload.maximum_size=827376
-generic.menu.FlashSize.1M192.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-generic.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M256=1M (256K SPIFFS)
-generic.menu.FlashSize.1M256.build.flash_size=1M
-generic.menu.FlashSize.1M256.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-generic.menu.FlashSize.1M256.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M256.upload.maximum_size=761840
-generic.menu.FlashSize.1M256.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-generic.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M512=1M (512K SPIFFS)
-generic.menu.FlashSize.1M512.build.flash_size=1M
-generic.menu.FlashSize.1M512.build.flash_size_bytes=0x100000
-generic.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-generic.menu.FlashSize.1M512.build.spiffs_pagesize=256
-generic.menu.FlashSize.1M512.upload.maximum_size=499696
-generic.menu.FlashSize.1M512.build.rfcal_addr=0xFC000
-generic.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-generic.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-generic.menu.FlashSize.2M=2M (1M SPIFFS)
-generic.menu.FlashSize.2M.build.flash_size=2M
-generic.menu.FlashSize.2M.build.flash_size_bytes=0x200000
-generic.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld
-generic.menu.FlashSize.2M.build.spiffs_pagesize=256
-generic.menu.FlashSize.2M.upload.maximum_size=1044464
-generic.menu.FlashSize.2M.build.rfcal_addr=0x1FC000
-generic.menu.FlashSize.2M.build.spiffs_start=0x100000
-generic.menu.FlashSize.2M.build.spiffs_end=0x1FB000
-generic.menu.FlashSize.2M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M1M=4M (1M SPIFFS)
-generic.menu.FlashSize.4M1M.build.flash_size=4M
-generic.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-generic.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-generic.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-generic.menu.FlashSize.4M1M.upload.maximum_size=1044464
-generic.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-generic.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-generic.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M2M=4M (2M SPIFFS)
-generic.menu.FlashSize.4M2M.build.flash_size=4M
-generic.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-generic.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-generic.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-generic.menu.FlashSize.4M2M.upload.maximum_size=1044464
-generic.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-generic.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-generic.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M3M=4M (3M SPIFFS)
-generic.menu.FlashSize.4M3M.build.flash_size=4M
-generic.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-generic.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-generic.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-generic.menu.FlashSize.4M3M.upload.maximum_size=1044464
-generic.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-generic.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-generic.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.8M7M=8M (7M SPIFFS)
-generic.menu.FlashSize.8M7M.build.flash_size=8M
-generic.menu.FlashSize.8M7M.build.flash_size_bytes=0x800000
-generic.menu.FlashSize.8M7M.build.flash_ld=eagle.flash.8m.ld
-generic.menu.FlashSize.8M7M.build.spiffs_pagesize=256
-generic.menu.FlashSize.8M7M.upload.maximum_size=1044464
-generic.menu.FlashSize.8M7M.build.rfcal_addr=0x7FC000
-generic.menu.FlashSize.8M7M.build.spiffs_start=0x100000
-generic.menu.FlashSize.8M7M.build.spiffs_end=0x7FB000
-generic.menu.FlashSize.8M7M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.16M15M=16M (15M SPIFFS)
-generic.menu.FlashSize.16M15M.build.flash_size=16M
-generic.menu.FlashSize.16M15M.build.flash_size_bytes=0x1000000
-generic.menu.FlashSize.16M15M.build.flash_ld=eagle.flash.16m.ld
-generic.menu.FlashSize.16M15M.build.spiffs_pagesize=256
-generic.menu.FlashSize.16M15M.upload.maximum_size=1044464
-generic.menu.FlashSize.16M15M.build.rfcal_addr=0xFFC000
-generic.menu.FlashSize.16M15M.build.spiffs_start=0x100000
-generic.menu.FlashSize.16M15M.build.spiffs_end=0xFFB000
-generic.menu.FlashSize.16M15M.build.spiffs_blocksize=8192
-generic.menu.led.2=2
-generic.menu.led.2.build.led=-DLED_BUILTIN=2
-generic.menu.led.0=0
-generic.menu.led.0.build.led=-DLED_BUILTIN=0
-generic.menu.led.1=1
-generic.menu.led.1.build.led=-DLED_BUILTIN=1
-generic.menu.led.3=3
-generic.menu.led.3.build.led=-DLED_BUILTIN=3
-generic.menu.led.4=4
-generic.menu.led.4.build.led=-DLED_BUILTIN=4
-generic.menu.led.5=5
-generic.menu.led.5.build.led=-DLED_BUILTIN=5
-generic.menu.led.6=6
-generic.menu.led.6.build.led=-DLED_BUILTIN=6
-generic.menu.led.7=7
-generic.menu.led.7.build.led=-DLED_BUILTIN=7
-generic.menu.led.8=8
-generic.menu.led.8.build.led=-DLED_BUILTIN=8
-generic.menu.led.9=9
-generic.menu.led.9.build.led=-DLED_BUILTIN=9
-generic.menu.led.10=10
-generic.menu.led.10.build.led=-DLED_BUILTIN=10
-generic.menu.led.11=11
-generic.menu.led.11.build.led=-DLED_BUILTIN=11
-generic.menu.led.12=12
-generic.menu.led.12.build.led=-DLED_BUILTIN=12
-generic.menu.led.13=13
-generic.menu.led.13.build.led=-DLED_BUILTIN=13
-generic.menu.led.14=14
-generic.menu.led.14.build.led=-DLED_BUILTIN=14
-generic.menu.led.15=15
-generic.menu.led.15.build.led=-DLED_BUILTIN=15
-generic.menu.LwIPVariant.v2mss536=v2 Lower Memory
-generic.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-generic.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-generic.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-generic.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-generic.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-generic.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-generic.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-generic.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-generic.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-generic.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-generic.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-generic.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-generic.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-generic.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-generic.menu.Debug.Disabled=Disabled
-generic.menu.Debug.Disabled.build.debug_port=
-generic.menu.Debug.Serial=Serial
-generic.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-generic.menu.Debug.Serial1=Serial1
-generic.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-generic.menu.DebugLevel.None____=None
-generic.menu.DebugLevel.None____.build.debug_level=
-generic.menu.DebugLevel.SSL=SSL
-generic.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-generic.menu.DebugLevel.TLS_MEM=TLS_MEM
-generic.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-generic.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-generic.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-generic.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-generic.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-generic.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-generic.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-generic.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.CORE=CORE
-generic.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-generic.menu.DebugLevel.WIFI=WIFI
-generic.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-generic.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-generic.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-generic.menu.DebugLevel.UPDATER=UPDATER
-generic.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-generic.menu.DebugLevel.OTA=OTA
-generic.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-generic.menu.DebugLevel.OOM=OOM
-generic.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-generic.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-generic.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-generic.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-generic.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-generic.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-generic.menu.FlashErase.none=Only Sketch
-generic.menu.FlashErase.none.upload.erase_cmd=
-generic.menu.FlashErase.sdk=Sketch + WiFi Settings
-generic.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-generic.menu.FlashErase.all=All Flash Contents
-generic.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-generic.menu.UploadSpeed.115200=115200
-generic.menu.UploadSpeed.115200.upload.speed=115200
-generic.menu.UploadSpeed.9600=9600
-generic.menu.UploadSpeed.9600.upload.speed=9600
-generic.menu.UploadSpeed.57600=57600
-generic.menu.UploadSpeed.57600.upload.speed=57600
-generic.menu.UploadSpeed.230400.linux=230400
-generic.menu.UploadSpeed.230400.macosx=230400
-generic.menu.UploadSpeed.230400.upload.speed=230400
-generic.menu.UploadSpeed.256000.windows=256000
-generic.menu.UploadSpeed.256000.upload.speed=256000
-generic.menu.UploadSpeed.460800.linux=460800
-generic.menu.UploadSpeed.460800.macosx=460800
-generic.menu.UploadSpeed.460800.upload.speed=460800
-generic.menu.UploadSpeed.512000.windows=512000
-generic.menu.UploadSpeed.512000.upload.speed=512000
-generic.menu.UploadSpeed.921600=921600
-generic.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-esp8285.name=Generic ESP8285 Module
-esp8285.build.board=ESP8266_ESP01
-esp8285.upload.tool=esptool
-esp8285.upload.maximum_data_size=81920
-esp8285.upload.wait_for_upload_port=true
-esp8285.upload.erase_cmd=
-esp8285.serial.disableDTR=true
-esp8285.serial.disableRTS=true
-esp8285.build.mcu=esp8266
-esp8285.build.core=esp8266
-esp8285.build.variant=generic
-esp8285.build.spiffs_pagesize=256
-esp8285.build.debug_port=
-esp8285.build.debug_level=
-esp8285.menu.CpuFrequency.80=80 MHz
-esp8285.menu.CpuFrequency.80.build.f_cpu=80000000L
-esp8285.menu.CpuFrequency.160=160 MHz
-esp8285.menu.CpuFrequency.160.build.f_cpu=160000000L
-esp8285.menu.VTable.flash=Flash
-esp8285.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-esp8285.menu.VTable.heap=Heap
-esp8285.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-esp8285.menu.VTable.iram=IRAM
-esp8285.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-esp8285.menu.ResetMethod.ck=ck
-esp8285.menu.ResetMethod.ck.upload.resetmethod=ck
-esp8285.menu.ResetMethod.nodemcu=nodemcu
-esp8285.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-esp8285.menu.ResetMethod.none=none
-esp8285.menu.ResetMethod.none.upload.resetmethod=none
-esp8285.menu.ResetMethod.dtrset=dtrset
-esp8285.menu.ResetMethod.dtrset.upload.resetmethod=dtrset
-esp8285.menu.CrystalFreq.26=26 MHz
-esp8285.menu.CrystalFreq.40=40 MHz
-esp8285.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-esp8285.build.flash_mode=dout
-esp8285.build.flash_freq=40
-esp8285.menu.FlashSize.1M0=1M (no SPIFFS)
-esp8285.menu.FlashSize.1M0.build.flash_size=1M
-esp8285.menu.FlashSize.1M0.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-esp8285.menu.FlashSize.1M0.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M0.upload.maximum_size=1023984
-esp8285.menu.FlashSize.1M0.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M64=1M (64K SPIFFS)
-esp8285.menu.FlashSize.1M64.build.flash_size=1M
-esp8285.menu.FlashSize.1M64.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-esp8285.menu.FlashSize.1M64.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M64.upload.maximum_size=958448
-esp8285.menu.FlashSize.1M64.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-esp8285.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M128=1M (128K SPIFFS)
-esp8285.menu.FlashSize.1M128.build.flash_size=1M
-esp8285.menu.FlashSize.1M128.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-esp8285.menu.FlashSize.1M128.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M128.upload.maximum_size=892912
-esp8285.menu.FlashSize.1M128.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-esp8285.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M144=1M (144K SPIFFS)
-esp8285.menu.FlashSize.1M144.build.flash_size=1M
-esp8285.menu.FlashSize.1M144.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-esp8285.menu.FlashSize.1M144.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M144.upload.maximum_size=876528
-esp8285.menu.FlashSize.1M144.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-esp8285.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M160=1M (160K SPIFFS)
-esp8285.menu.FlashSize.1M160.build.flash_size=1M
-esp8285.menu.FlashSize.1M160.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-esp8285.menu.FlashSize.1M160.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M160.upload.maximum_size=860144
-esp8285.menu.FlashSize.1M160.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-esp8285.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M192=1M (192K SPIFFS)
-esp8285.menu.FlashSize.1M192.build.flash_size=1M
-esp8285.menu.FlashSize.1M192.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-esp8285.menu.FlashSize.1M192.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M192.upload.maximum_size=827376
-esp8285.menu.FlashSize.1M192.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-esp8285.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M256=1M (256K SPIFFS)
-esp8285.menu.FlashSize.1M256.build.flash_size=1M
-esp8285.menu.FlashSize.1M256.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-esp8285.menu.FlashSize.1M256.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M256.upload.maximum_size=761840
-esp8285.menu.FlashSize.1M256.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-esp8285.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-esp8285.menu.FlashSize.1M512=1M (512K SPIFFS)
-esp8285.menu.FlashSize.1M512.build.flash_size=1M
-esp8285.menu.FlashSize.1M512.build.flash_size_bytes=0x100000
-esp8285.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-esp8285.menu.FlashSize.1M512.build.spiffs_pagesize=256
-esp8285.menu.FlashSize.1M512.upload.maximum_size=499696
-esp8285.menu.FlashSize.1M512.build.rfcal_addr=0xFC000
-esp8285.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-esp8285.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-esp8285.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-esp8285.menu.led.2=2
-esp8285.menu.led.2.build.led=-DLED_BUILTIN=2
-esp8285.menu.led.0=0
-esp8285.menu.led.0.build.led=-DLED_BUILTIN=0
-esp8285.menu.led.1=1
-esp8285.menu.led.1.build.led=-DLED_BUILTIN=1
-esp8285.menu.led.3=3
-esp8285.menu.led.3.build.led=-DLED_BUILTIN=3
-esp8285.menu.led.4=4
-esp8285.menu.led.4.build.led=-DLED_BUILTIN=4
-esp8285.menu.led.5=5
-esp8285.menu.led.5.build.led=-DLED_BUILTIN=5
-esp8285.menu.led.6=6
-esp8285.menu.led.6.build.led=-DLED_BUILTIN=6
-esp8285.menu.led.7=7
-esp8285.menu.led.7.build.led=-DLED_BUILTIN=7
-esp8285.menu.led.8=8
-esp8285.menu.led.8.build.led=-DLED_BUILTIN=8
-esp8285.menu.led.9=9
-esp8285.menu.led.9.build.led=-DLED_BUILTIN=9
-esp8285.menu.led.10=10
-esp8285.menu.led.10.build.led=-DLED_BUILTIN=10
-esp8285.menu.led.11=11
-esp8285.menu.led.11.build.led=-DLED_BUILTIN=11
-esp8285.menu.led.12=12
-esp8285.menu.led.12.build.led=-DLED_BUILTIN=12
-esp8285.menu.led.13=13
-esp8285.menu.led.13.build.led=-DLED_BUILTIN=13
-esp8285.menu.led.14=14
-esp8285.menu.led.14.build.led=-DLED_BUILTIN=14
-esp8285.menu.led.15=15
-esp8285.menu.led.15.build.led=-DLED_BUILTIN=15
-esp8285.menu.LwIPVariant.v2mss536=v2 Lower Memory
-esp8285.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-esp8285.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-esp8285.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-esp8285.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-esp8285.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-esp8285.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-esp8285.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-esp8285.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-esp8285.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-esp8285.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-esp8285.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-esp8285.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-esp8285.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-esp8285.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-esp8285.menu.Debug.Disabled=Disabled
-esp8285.menu.Debug.Disabled.build.debug_port=
-esp8285.menu.Debug.Serial=Serial
-esp8285.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-esp8285.menu.Debug.Serial1=Serial1
-esp8285.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-esp8285.menu.DebugLevel.None____=None
-esp8285.menu.DebugLevel.None____.build.debug_level=
-esp8285.menu.DebugLevel.SSL=SSL
-esp8285.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-esp8285.menu.DebugLevel.TLS_MEM=TLS_MEM
-esp8285.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-esp8285.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-esp8285.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-esp8285.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-esp8285.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-esp8285.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp8285.menu.DebugLevel.CORE=CORE
-esp8285.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-esp8285.menu.DebugLevel.WIFI=WIFI
-esp8285.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-esp8285.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-esp8285.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-esp8285.menu.DebugLevel.UPDATER=UPDATER
-esp8285.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-esp8285.menu.DebugLevel.OTA=OTA
-esp8285.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-esp8285.menu.DebugLevel.OOM=OOM
-esp8285.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-esp8285.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-esp8285.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-esp8285.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-esp8285.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-esp8285.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-esp8285.menu.FlashErase.none=Only Sketch
-esp8285.menu.FlashErase.none.upload.erase_cmd=
-esp8285.menu.FlashErase.sdk=Sketch + WiFi Settings
-esp8285.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-esp8285.menu.FlashErase.all=All Flash Contents
-esp8285.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-esp8285.menu.UploadSpeed.115200=115200
-esp8285.menu.UploadSpeed.115200.upload.speed=115200
-esp8285.menu.UploadSpeed.9600=9600
-esp8285.menu.UploadSpeed.9600.upload.speed=9600
-esp8285.menu.UploadSpeed.57600=57600
-esp8285.menu.UploadSpeed.57600.upload.speed=57600
-esp8285.menu.UploadSpeed.230400.linux=230400
-esp8285.menu.UploadSpeed.230400.macosx=230400
-esp8285.menu.UploadSpeed.230400.upload.speed=230400
-esp8285.menu.UploadSpeed.256000.windows=256000
-esp8285.menu.UploadSpeed.256000.upload.speed=256000
-esp8285.menu.UploadSpeed.460800.linux=460800
-esp8285.menu.UploadSpeed.460800.macosx=460800
-esp8285.menu.UploadSpeed.460800.upload.speed=460800
-esp8285.menu.UploadSpeed.512000.windows=512000
-esp8285.menu.UploadSpeed.512000.upload.speed=512000
-esp8285.menu.UploadSpeed.921600=921600
-esp8285.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espduino.name=ESPDuino (ESP-13 Module)
-espduino.build.board=ESP8266_ESP13
-espduino.build.variant=ESPDuino
-espduino.menu.ResetMethod.v2=ESPduino-V2
-espduino.menu.ResetMethod.v2.upload.resetmethod=nodemcu
-espduino.menu.ResetMethod.v1=ESPduino-V1
-espduino.menu.ResetMethod.v1.upload.resetmethod=ck
-espduino.menu.UploadTool.esptool=Serial
-espduino.menu.UploadTool.esptool.upload.tool=esptool
-espduino.menu.UploadTool.esptool.upload.verbose=-vv
-espduino.menu.UploadTool.espota=OTA
-espduino.menu.UploadTool.espota.upload.tool=espota
-espduino.upload.tool=esptool
-espduino.upload.maximum_data_size=81920
-espduino.upload.wait_for_upload_port=true
-espduino.upload.erase_cmd=
-espduino.serial.disableDTR=true
-espduino.serial.disableRTS=true
-espduino.build.mcu=esp8266
-espduino.build.core=esp8266
-espduino.build.spiffs_pagesize=256
-espduino.build.debug_port=
-espduino.build.debug_level=
-espduino.menu.CpuFrequency.80=80 MHz
-espduino.menu.CpuFrequency.80.build.f_cpu=80000000L
-espduino.menu.CpuFrequency.160=160 MHz
-espduino.menu.CpuFrequency.160.build.f_cpu=160000000L
-espduino.menu.VTable.flash=Flash
-espduino.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-espduino.menu.VTable.heap=Heap
-espduino.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-espduino.menu.VTable.iram=IRAM
-espduino.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-espduino.build.flash_mode=dio
-espduino.build.flash_freq=40
-espduino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espduino.menu.FlashSize.4M1M.build.flash_size=4M
-espduino.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-espduino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espduino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espduino.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espduino.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-espduino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espduino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espduino.menu.FlashSize.4M2M=4M (2M SPIFFS)
-espduino.menu.FlashSize.4M2M.build.flash_size=4M
-espduino.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-espduino.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-espduino.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-espduino.menu.FlashSize.4M2M.upload.maximum_size=1044464
-espduino.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-espduino.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-espduino.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-espduino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espduino.menu.FlashSize.4M3M.build.flash_size=4M
-espduino.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-espduino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espduino.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espduino.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espduino.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-espduino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espduino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espduino.menu.LwIPVariant.v2mss536=v2 Lower Memory
-espduino.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espduino.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espduino.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espduino.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-espduino.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espduino.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espduino.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espduino.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-espduino.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espduino.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espduino.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-espduino.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espduino.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espduino.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espduino.menu.Debug.Disabled=Disabled
-espduino.menu.Debug.Disabled.build.debug_port=
-espduino.menu.Debug.Serial=Serial
-espduino.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espduino.menu.Debug.Serial1=Serial1
-espduino.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espduino.menu.DebugLevel.None____=None
-espduino.menu.DebugLevel.None____.build.debug_level=
-espduino.menu.DebugLevel.SSL=SSL
-espduino.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espduino.menu.DebugLevel.TLS_MEM=TLS_MEM
-espduino.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espduino.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espduino.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espduino.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espduino.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espduino.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espduino.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espduino.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espduino.menu.DebugLevel.CORE=CORE
-espduino.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espduino.menu.DebugLevel.WIFI=WIFI
-espduino.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espduino.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espduino.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espduino.menu.DebugLevel.UPDATER=UPDATER
-espduino.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espduino.menu.DebugLevel.OTA=OTA
-espduino.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espduino.menu.DebugLevel.OOM=OOM
-espduino.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-espduino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espduino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-espduino.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espduino.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espduino.menu.FlashErase.none=Only Sketch
-espduino.menu.FlashErase.none.upload.erase_cmd=
-espduino.menu.FlashErase.sdk=Sketch + WiFi Settings
-espduino.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-espduino.menu.FlashErase.all=All Flash Contents
-espduino.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-espduino.menu.UploadSpeed.115200=115200
-espduino.menu.UploadSpeed.115200.upload.speed=115200
-espduino.menu.UploadSpeed.9600=9600
-espduino.menu.UploadSpeed.9600.upload.speed=9600
-espduino.menu.UploadSpeed.57600=57600
-espduino.menu.UploadSpeed.57600.upload.speed=57600
-espduino.menu.UploadSpeed.230400.linux=230400
-espduino.menu.UploadSpeed.230400.macosx=230400
-espduino.menu.UploadSpeed.230400.upload.speed=230400
-espduino.menu.UploadSpeed.256000.windows=256000
-espduino.menu.UploadSpeed.256000.upload.speed=256000
-espduino.menu.UploadSpeed.460800.linux=460800
-espduino.menu.UploadSpeed.460800.macosx=460800
-espduino.menu.UploadSpeed.460800.upload.speed=460800
-espduino.menu.UploadSpeed.512000.windows=512000
-espduino.menu.UploadSpeed.512000.upload.speed=512000
-espduino.menu.UploadSpeed.921600=921600
-espduino.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-huzzah.name=Adafruit Feather HUZZAH ESP8266
-huzzah.build.board=ESP8266_ESP12
-huzzah.build.variant=adafruit
-huzzah.upload.tool=esptool
-huzzah.upload.maximum_data_size=81920
-huzzah.upload.wait_for_upload_port=true
-huzzah.upload.erase_cmd=
-huzzah.serial.disableDTR=true
-huzzah.serial.disableRTS=true
-huzzah.build.mcu=esp8266
-huzzah.build.core=esp8266
-huzzah.build.spiffs_pagesize=256
-huzzah.build.debug_port=
-huzzah.build.debug_level=
-huzzah.menu.CpuFrequency.80=80 MHz
-huzzah.menu.CpuFrequency.80.build.f_cpu=80000000L
-huzzah.menu.CpuFrequency.160=160 MHz
-huzzah.menu.CpuFrequency.160.build.f_cpu=160000000L
-huzzah.menu.VTable.flash=Flash
-huzzah.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-huzzah.menu.VTable.heap=Heap
-huzzah.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-huzzah.menu.VTable.iram=IRAM
-huzzah.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-huzzah.upload.resetmethod=nodemcu
-huzzah.build.flash_mode=qio
-huzzah.build.flash_freq=40
-huzzah.menu.FlashSize.4M1M=4M (1M SPIFFS)
-huzzah.menu.FlashSize.4M1M.build.flash_size=4M
-huzzah.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-huzzah.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-huzzah.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-huzzah.menu.FlashSize.4M1M.upload.maximum_size=1044464
-huzzah.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-huzzah.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-huzzah.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-huzzah.menu.FlashSize.4M2M=4M (2M SPIFFS)
-huzzah.menu.FlashSize.4M2M.build.flash_size=4M
-huzzah.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-huzzah.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-huzzah.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-huzzah.menu.FlashSize.4M2M.upload.maximum_size=1044464
-huzzah.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-huzzah.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-huzzah.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-huzzah.menu.FlashSize.4M3M=4M (3M SPIFFS)
-huzzah.menu.FlashSize.4M3M.build.flash_size=4M
-huzzah.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-huzzah.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-huzzah.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-huzzah.menu.FlashSize.4M3M.upload.maximum_size=1044464
-huzzah.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-huzzah.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-huzzah.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-huzzah.menu.LwIPVariant.v2mss536=v2 Lower Memory
-huzzah.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-huzzah.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-huzzah.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-huzzah.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-huzzah.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-huzzah.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-huzzah.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-huzzah.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-huzzah.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-huzzah.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-huzzah.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-huzzah.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-huzzah.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-huzzah.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-huzzah.menu.Debug.Disabled=Disabled
-huzzah.menu.Debug.Disabled.build.debug_port=
-huzzah.menu.Debug.Serial=Serial
-huzzah.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-huzzah.menu.Debug.Serial1=Serial1
-huzzah.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-huzzah.menu.DebugLevel.None____=None
-huzzah.menu.DebugLevel.None____.build.debug_level=
-huzzah.menu.DebugLevel.SSL=SSL
-huzzah.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-huzzah.menu.DebugLevel.TLS_MEM=TLS_MEM
-huzzah.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-huzzah.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-huzzah.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-huzzah.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-huzzah.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-huzzah.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-huzzah.menu.DebugLevel.CORE=CORE
-huzzah.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-huzzah.menu.DebugLevel.WIFI=WIFI
-huzzah.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-huzzah.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-huzzah.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-huzzah.menu.DebugLevel.UPDATER=UPDATER
-huzzah.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-huzzah.menu.DebugLevel.OTA=OTA
-huzzah.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-huzzah.menu.DebugLevel.OOM=OOM
-huzzah.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-huzzah.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-huzzah.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-huzzah.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-huzzah.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-huzzah.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-huzzah.menu.FlashErase.none=Only Sketch
-huzzah.menu.FlashErase.none.upload.erase_cmd=
-huzzah.menu.FlashErase.sdk=Sketch + WiFi Settings
-huzzah.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-huzzah.menu.FlashErase.all=All Flash Contents
-huzzah.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-huzzah.menu.UploadSpeed.115200=115200
-huzzah.menu.UploadSpeed.115200.upload.speed=115200
-huzzah.menu.UploadSpeed.9600=9600
-huzzah.menu.UploadSpeed.9600.upload.speed=9600
-huzzah.menu.UploadSpeed.57600=57600
-huzzah.menu.UploadSpeed.57600.upload.speed=57600
-huzzah.menu.UploadSpeed.230400.linux=230400
-huzzah.menu.UploadSpeed.230400.macosx=230400
-huzzah.menu.UploadSpeed.230400.upload.speed=230400
-huzzah.menu.UploadSpeed.256000.windows=256000
-huzzah.menu.UploadSpeed.256000.upload.speed=256000
-huzzah.menu.UploadSpeed.460800.linux=460800
-huzzah.menu.UploadSpeed.460800.macosx=460800
-huzzah.menu.UploadSpeed.460800.upload.speed=460800
-huzzah.menu.UploadSpeed.512000.windows=512000
-huzzah.menu.UploadSpeed.512000.upload.speed=512000
-huzzah.menu.UploadSpeed.921600=921600
-huzzah.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-cw01.name=XinaBox CW01
-cw01.build.board=ESP8266_GENERIC
-cw01.build.variant=xinabox
-cw01.upload.tool=esptool
-cw01.upload.maximum_data_size=81920
-cw01.upload.wait_for_upload_port=true
-cw01.upload.erase_cmd=
-cw01.serial.disableDTR=true
-cw01.serial.disableRTS=true
-cw01.build.mcu=esp8266
-cw01.build.core=esp8266
-cw01.build.spiffs_pagesize=256
-cw01.build.debug_port=
-cw01.build.debug_level=
-cw01.menu.CpuFrequency.80=80 MHz
-cw01.menu.CpuFrequency.80.build.f_cpu=80000000L
-cw01.menu.CpuFrequency.160=160 MHz
-cw01.menu.CpuFrequency.160.build.f_cpu=160000000L
-cw01.menu.VTable.flash=Flash
-cw01.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-cw01.menu.VTable.heap=Heap
-cw01.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-cw01.menu.VTable.iram=IRAM
-cw01.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-cw01.upload.resetmethod=nodemcu
-cw01.menu.CrystalFreq.26=26 MHz
-cw01.menu.CrystalFreq.40=40 MHz
-cw01.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-cw01.build.flash_mode=qio
-cw01.build.flash_freq=40
-cw01.menu.FlashSize.4M1M=4M (1M SPIFFS)
-cw01.menu.FlashSize.4M1M.build.flash_size=4M
-cw01.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-cw01.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-cw01.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-cw01.menu.FlashSize.4M1M.upload.maximum_size=1044464
-cw01.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-cw01.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-cw01.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-cw01.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-cw01.menu.FlashSize.4M2M=4M (2M SPIFFS)
-cw01.menu.FlashSize.4M2M.build.flash_size=4M
-cw01.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-cw01.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-cw01.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-cw01.menu.FlashSize.4M2M.upload.maximum_size=1044464
-cw01.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-cw01.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-cw01.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-cw01.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-cw01.menu.FlashSize.4M3M=4M (3M SPIFFS)
-cw01.menu.FlashSize.4M3M.build.flash_size=4M
-cw01.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-cw01.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-cw01.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-cw01.menu.FlashSize.4M3M.upload.maximum_size=1044464
-cw01.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-cw01.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-cw01.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-cw01.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-cw01.menu.LwIPVariant.v2mss536=v2 Lower Memory
-cw01.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-cw01.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-cw01.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-cw01.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-cw01.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-cw01.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-cw01.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-cw01.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-cw01.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-cw01.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-cw01.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-cw01.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-cw01.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-cw01.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-cw01.menu.Debug.Disabled=Disabled
-cw01.menu.Debug.Disabled.build.debug_port=
-cw01.menu.Debug.Serial=Serial
-cw01.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-cw01.menu.Debug.Serial1=Serial1
-cw01.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-cw01.menu.DebugLevel.None____=None
-cw01.menu.DebugLevel.None____.build.debug_level=
-cw01.menu.DebugLevel.SSL=SSL
-cw01.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-cw01.menu.DebugLevel.TLS_MEM=TLS_MEM
-cw01.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-cw01.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-cw01.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-cw01.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-cw01.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-cw01.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-cw01.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-cw01.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-cw01.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-cw01.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-cw01.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-cw01.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-cw01.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-cw01.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-cw01.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-cw01.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-cw01.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-cw01.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-cw01.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-cw01.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-cw01.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-cw01.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-cw01.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-cw01.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-cw01.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-cw01.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-cw01.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-cw01.menu.DebugLevel.CORE=CORE
-cw01.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-cw01.menu.DebugLevel.WIFI=WIFI
-cw01.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-cw01.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-cw01.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-cw01.menu.DebugLevel.UPDATER=UPDATER
-cw01.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-cw01.menu.DebugLevel.OTA=OTA
-cw01.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-cw01.menu.DebugLevel.OOM=OOM
-cw01.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-cw01.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-cw01.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-cw01.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-cw01.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-cw01.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-cw01.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-cw01.menu.FlashErase.none=Only Sketch
-cw01.menu.FlashErase.none.upload.erase_cmd=
-cw01.menu.FlashErase.sdk=Sketch + WiFi Settings
-cw01.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-cw01.menu.FlashErase.all=All Flash Contents
-cw01.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-cw01.menu.UploadSpeed.115200=115200
-cw01.menu.UploadSpeed.115200.upload.speed=115200
-cw01.menu.UploadSpeed.9600=9600
-cw01.menu.UploadSpeed.9600.upload.speed=9600
-cw01.menu.UploadSpeed.57600=57600
-cw01.menu.UploadSpeed.57600.upload.speed=57600
-cw01.menu.UploadSpeed.230400.linux=230400
-cw01.menu.UploadSpeed.230400.macosx=230400
-cw01.menu.UploadSpeed.230400.upload.speed=230400
-cw01.menu.UploadSpeed.256000.windows=256000
-cw01.menu.UploadSpeed.256000.upload.speed=256000
-cw01.menu.UploadSpeed.460800.linux=460800
-cw01.menu.UploadSpeed.460800.macosx=460800
-cw01.menu.UploadSpeed.460800.upload.speed=460800
-cw01.menu.UploadSpeed.512000.windows=512000
-cw01.menu.UploadSpeed.512000.upload.speed=512000
-cw01.menu.UploadSpeed.921600=921600
-cw01.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espresso_lite_v1.name=ESPresso Lite 1.0
-espresso_lite_v1.build.board=ESP8266_ESPRESSO_LITE_V1
-espresso_lite_v1.build.variant=espresso_lite_v1
-espresso_lite_v1.upload.tool=esptool
-espresso_lite_v1.upload.maximum_data_size=81920
-espresso_lite_v1.upload.wait_for_upload_port=true
-espresso_lite_v1.upload.erase_cmd=
-espresso_lite_v1.serial.disableDTR=true
-espresso_lite_v1.serial.disableRTS=true
-espresso_lite_v1.build.mcu=esp8266
-espresso_lite_v1.build.core=esp8266
-espresso_lite_v1.build.spiffs_pagesize=256
-espresso_lite_v1.build.debug_port=
-espresso_lite_v1.build.debug_level=
-espresso_lite_v1.menu.CpuFrequency.80=80 MHz
-espresso_lite_v1.menu.CpuFrequency.80.build.f_cpu=80000000L
-espresso_lite_v1.menu.CpuFrequency.160=160 MHz
-espresso_lite_v1.menu.CpuFrequency.160.build.f_cpu=160000000L
-espresso_lite_v1.menu.VTable.flash=Flash
-espresso_lite_v1.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-espresso_lite_v1.menu.VTable.heap=Heap
-espresso_lite_v1.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-espresso_lite_v1.menu.VTable.iram=IRAM
-espresso_lite_v1.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-espresso_lite_v1.build.flash_mode=dio
-espresso_lite_v1.build.flash_freq=40
-espresso_lite_v1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espresso_lite_v1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espresso_lite_v1.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.FlashSize.4M2M=4M (2M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M2M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-espresso_lite_v1.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-espresso_lite_v1.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-espresso_lite_v1.menu.FlashSize.4M2M.upload.maximum_size=1044464
-espresso_lite_v1.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-espresso_lite_v1.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-espresso_lite_v1.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espresso_lite_v1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espresso_lite_v1.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.ResetMethod.ck=ck
-espresso_lite_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-espresso_lite_v1.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espresso_lite_v1.menu.LwIPVariant.v2mss536=v2 Lower Memory
-espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espresso_lite_v1.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-espresso_lite_v1.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espresso_lite_v1.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espresso_lite_v1.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espresso_lite_v1.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-espresso_lite_v1.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espresso_lite_v1.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v1.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-espresso_lite_v1.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espresso_lite_v1.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v1.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espresso_lite_v1.menu.Debug.Disabled=Disabled
-espresso_lite_v1.menu.Debug.Disabled.build.debug_port=
-espresso_lite_v1.menu.Debug.Serial=Serial
-espresso_lite_v1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espresso_lite_v1.menu.Debug.Serial1=Serial1
-espresso_lite_v1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espresso_lite_v1.menu.DebugLevel.None____=None
-espresso_lite_v1.menu.DebugLevel.None____.build.debug_level=
-espresso_lite_v1.menu.DebugLevel.SSL=SSL
-espresso_lite_v1.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espresso_lite_v1.menu.DebugLevel.TLS_MEM=TLS_MEM
-espresso_lite_v1.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.CORE=CORE
-espresso_lite_v1.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espresso_lite_v1.menu.DebugLevel.WIFI=WIFI
-espresso_lite_v1.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espresso_lite_v1.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espresso_lite_v1.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v1.menu.DebugLevel.UPDATER=UPDATER
-espresso_lite_v1.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espresso_lite_v1.menu.DebugLevel.OTA=OTA
-espresso_lite_v1.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espresso_lite_v1.menu.DebugLevel.OOM=OOM
-espresso_lite_v1.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-espresso_lite_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espresso_lite_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espresso_lite_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-espresso_lite_v1.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espresso_lite_v1.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espresso_lite_v1.menu.FlashErase.none=Only Sketch
-espresso_lite_v1.menu.FlashErase.none.upload.erase_cmd=
-espresso_lite_v1.menu.FlashErase.sdk=Sketch + WiFi Settings
-espresso_lite_v1.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-espresso_lite_v1.menu.FlashErase.all=All Flash Contents
-espresso_lite_v1.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-espresso_lite_v1.menu.UploadSpeed.115200=115200
-espresso_lite_v1.menu.UploadSpeed.115200.upload.speed=115200
-espresso_lite_v1.menu.UploadSpeed.9600=9600
-espresso_lite_v1.menu.UploadSpeed.9600.upload.speed=9600
-espresso_lite_v1.menu.UploadSpeed.57600=57600
-espresso_lite_v1.menu.UploadSpeed.57600.upload.speed=57600
-espresso_lite_v1.menu.UploadSpeed.230400.linux=230400
-espresso_lite_v1.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v1.menu.UploadSpeed.230400.upload.speed=230400
-espresso_lite_v1.menu.UploadSpeed.256000.windows=256000
-espresso_lite_v1.menu.UploadSpeed.256000.upload.speed=256000
-espresso_lite_v1.menu.UploadSpeed.460800.linux=460800
-espresso_lite_v1.menu.UploadSpeed.460800.macosx=460800
-espresso_lite_v1.menu.UploadSpeed.460800.upload.speed=460800
-espresso_lite_v1.menu.UploadSpeed.512000.windows=512000
-espresso_lite_v1.menu.UploadSpeed.512000.upload.speed=512000
-espresso_lite_v1.menu.UploadSpeed.921600=921600
-espresso_lite_v1.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espresso_lite_v2.name=ESPresso Lite 2.0
-espresso_lite_v2.build.board=ESP8266_ESPRESSO_LITE_V2
-espresso_lite_v2.build.variant=espresso_lite_v2
-espresso_lite_v2.upload.tool=esptool
-espresso_lite_v2.upload.maximum_data_size=81920
-espresso_lite_v2.upload.wait_for_upload_port=true
-espresso_lite_v2.upload.erase_cmd=
-espresso_lite_v2.serial.disableDTR=true
-espresso_lite_v2.serial.disableRTS=true
-espresso_lite_v2.build.mcu=esp8266
-espresso_lite_v2.build.core=esp8266
-espresso_lite_v2.build.spiffs_pagesize=256
-espresso_lite_v2.build.debug_port=
-espresso_lite_v2.build.debug_level=
-espresso_lite_v2.menu.CpuFrequency.80=80 MHz
-espresso_lite_v2.menu.CpuFrequency.80.build.f_cpu=80000000L
-espresso_lite_v2.menu.CpuFrequency.160=160 MHz
-espresso_lite_v2.menu.CpuFrequency.160.build.f_cpu=160000000L
-espresso_lite_v2.menu.VTable.flash=Flash
-espresso_lite_v2.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-espresso_lite_v2.menu.VTable.heap=Heap
-espresso_lite_v2.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-espresso_lite_v2.menu.VTable.iram=IRAM
-espresso_lite_v2.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-espresso_lite_v2.build.flash_mode=dio
-espresso_lite_v2.build.flash_freq=40
-espresso_lite_v2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espresso_lite_v2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espresso_lite_v2.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.FlashSize.4M2M=4M (2M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M2M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-espresso_lite_v2.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-espresso_lite_v2.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-espresso_lite_v2.menu.FlashSize.4M2M.upload.maximum_size=1044464
-espresso_lite_v2.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-espresso_lite_v2.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-espresso_lite_v2.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espresso_lite_v2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espresso_lite_v2.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.ResetMethod.ck=ck
-espresso_lite_v2.menu.ResetMethod.ck.upload.resetmethod=ck
-espresso_lite_v2.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espresso_lite_v2.menu.LwIPVariant.v2mss536=v2 Lower Memory
-espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espresso_lite_v2.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-espresso_lite_v2.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espresso_lite_v2.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espresso_lite_v2.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espresso_lite_v2.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-espresso_lite_v2.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espresso_lite_v2.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v2.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-espresso_lite_v2.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espresso_lite_v2.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v2.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espresso_lite_v2.menu.Debug.Disabled=Disabled
-espresso_lite_v2.menu.Debug.Disabled.build.debug_port=
-espresso_lite_v2.menu.Debug.Serial=Serial
-espresso_lite_v2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espresso_lite_v2.menu.Debug.Serial1=Serial1
-espresso_lite_v2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espresso_lite_v2.menu.DebugLevel.None____=None
-espresso_lite_v2.menu.DebugLevel.None____.build.debug_level=
-espresso_lite_v2.menu.DebugLevel.SSL=SSL
-espresso_lite_v2.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espresso_lite_v2.menu.DebugLevel.TLS_MEM=TLS_MEM
-espresso_lite_v2.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.CORE=CORE
-espresso_lite_v2.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espresso_lite_v2.menu.DebugLevel.WIFI=WIFI
-espresso_lite_v2.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espresso_lite_v2.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espresso_lite_v2.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v2.menu.DebugLevel.UPDATER=UPDATER
-espresso_lite_v2.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espresso_lite_v2.menu.DebugLevel.OTA=OTA
-espresso_lite_v2.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espresso_lite_v2.menu.DebugLevel.OOM=OOM
-espresso_lite_v2.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-espresso_lite_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espresso_lite_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espresso_lite_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-espresso_lite_v2.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espresso_lite_v2.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espresso_lite_v2.menu.FlashErase.none=Only Sketch
-espresso_lite_v2.menu.FlashErase.none.upload.erase_cmd=
-espresso_lite_v2.menu.FlashErase.sdk=Sketch + WiFi Settings
-espresso_lite_v2.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-espresso_lite_v2.menu.FlashErase.all=All Flash Contents
-espresso_lite_v2.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-espresso_lite_v2.menu.UploadSpeed.115200=115200
-espresso_lite_v2.menu.UploadSpeed.115200.upload.speed=115200
-espresso_lite_v2.menu.UploadSpeed.9600=9600
-espresso_lite_v2.menu.UploadSpeed.9600.upload.speed=9600
-espresso_lite_v2.menu.UploadSpeed.57600=57600
-espresso_lite_v2.menu.UploadSpeed.57600.upload.speed=57600
-espresso_lite_v2.menu.UploadSpeed.230400.linux=230400
-espresso_lite_v2.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v2.menu.UploadSpeed.230400.upload.speed=230400
-espresso_lite_v2.menu.UploadSpeed.256000.windows=256000
-espresso_lite_v2.menu.UploadSpeed.256000.upload.speed=256000
-espresso_lite_v2.menu.UploadSpeed.460800.linux=460800
-espresso_lite_v2.menu.UploadSpeed.460800.macosx=460800
-espresso_lite_v2.menu.UploadSpeed.460800.upload.speed=460800
-espresso_lite_v2.menu.UploadSpeed.512000.windows=512000
-espresso_lite_v2.menu.UploadSpeed.512000.upload.speed=512000
-espresso_lite_v2.menu.UploadSpeed.921600=921600
-espresso_lite_v2.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-phoenix_v1.name=Phoenix 1.0
-phoenix_v1.build.board=ESP8266_PHOENIX_V1
-phoenix_v1.build.variant=phoenix_v1
-phoenix_v1.upload.tool=esptool
-phoenix_v1.upload.maximum_data_size=81920
-phoenix_v1.upload.wait_for_upload_port=true
-phoenix_v1.upload.erase_cmd=
-phoenix_v1.serial.disableDTR=true
-phoenix_v1.serial.disableRTS=true
-phoenix_v1.build.mcu=esp8266
-phoenix_v1.build.core=esp8266
-phoenix_v1.build.spiffs_pagesize=256
-phoenix_v1.build.debug_port=
-phoenix_v1.build.debug_level=
-phoenix_v1.menu.CpuFrequency.80=80 MHz
-phoenix_v1.menu.CpuFrequency.80.build.f_cpu=80000000L
-phoenix_v1.menu.CpuFrequency.160=160 MHz
-phoenix_v1.menu.CpuFrequency.160.build.f_cpu=160000000L
-phoenix_v1.menu.VTable.flash=Flash
-phoenix_v1.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-phoenix_v1.menu.VTable.heap=Heap
-phoenix_v1.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-phoenix_v1.menu.VTable.iram=IRAM
-phoenix_v1.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-phoenix_v1.build.flash_mode=dio
-phoenix_v1.build.flash_freq=40
-phoenix_v1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-phoenix_v1.menu.FlashSize.4M1M.build.flash_size=4M
-phoenix_v1.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-phoenix_v1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-phoenix_v1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-phoenix_v1.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-phoenix_v1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-phoenix_v1.menu.FlashSize.4M2M=4M (2M SPIFFS)
-phoenix_v1.menu.FlashSize.4M2M.build.flash_size=4M
-phoenix_v1.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-phoenix_v1.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-phoenix_v1.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-phoenix_v1.menu.FlashSize.4M2M.upload.maximum_size=1044464
-phoenix_v1.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-phoenix_v1.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-phoenix_v1.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-phoenix_v1.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-phoenix_v1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-phoenix_v1.menu.FlashSize.4M3M.build.flash_size=4M
-phoenix_v1.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-phoenix_v1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-phoenix_v1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-phoenix_v1.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-phoenix_v1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-phoenix_v1.menu.ResetMethod.ck=ck
-phoenix_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-phoenix_v1.menu.ResetMethod.nodemcu=nodemcu
-phoenix_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-phoenix_v1.menu.LwIPVariant.v2mss536=v2 Lower Memory
-phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-phoenix_v1.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-phoenix_v1.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-phoenix_v1.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-phoenix_v1.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-phoenix_v1.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-phoenix_v1.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-phoenix_v1.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v1.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-phoenix_v1.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-phoenix_v1.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v1.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-phoenix_v1.menu.Debug.Disabled=Disabled
-phoenix_v1.menu.Debug.Disabled.build.debug_port=
-phoenix_v1.menu.Debug.Serial=Serial
-phoenix_v1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-phoenix_v1.menu.Debug.Serial1=Serial1
-phoenix_v1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-phoenix_v1.menu.DebugLevel.None____=None
-phoenix_v1.menu.DebugLevel.None____.build.debug_level=
-phoenix_v1.menu.DebugLevel.SSL=SSL
-phoenix_v1.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-phoenix_v1.menu.DebugLevel.TLS_MEM=TLS_MEM
-phoenix_v1.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-phoenix_v1.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-phoenix_v1.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-phoenix_v1.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v1.menu.DebugLevel.CORE=CORE
-phoenix_v1.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-phoenix_v1.menu.DebugLevel.WIFI=WIFI
-phoenix_v1.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-phoenix_v1.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-phoenix_v1.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-phoenix_v1.menu.DebugLevel.UPDATER=UPDATER
-phoenix_v1.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-phoenix_v1.menu.DebugLevel.OTA=OTA
-phoenix_v1.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-phoenix_v1.menu.DebugLevel.OOM=OOM
-phoenix_v1.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-phoenix_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-phoenix_v1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-phoenix_v1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-phoenix_v1.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-phoenix_v1.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-phoenix_v1.menu.FlashErase.none=Only Sketch
-phoenix_v1.menu.FlashErase.none.upload.erase_cmd=
-phoenix_v1.menu.FlashErase.sdk=Sketch + WiFi Settings
-phoenix_v1.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-phoenix_v1.menu.FlashErase.all=All Flash Contents
-phoenix_v1.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-phoenix_v1.menu.UploadSpeed.115200=115200
-phoenix_v1.menu.UploadSpeed.115200.upload.speed=115200
-phoenix_v1.menu.UploadSpeed.9600=9600
-phoenix_v1.menu.UploadSpeed.9600.upload.speed=9600
-phoenix_v1.menu.UploadSpeed.57600=57600
-phoenix_v1.menu.UploadSpeed.57600.upload.speed=57600
-phoenix_v1.menu.UploadSpeed.230400.linux=230400
-phoenix_v1.menu.UploadSpeed.230400.macosx=230400
-phoenix_v1.menu.UploadSpeed.230400.upload.speed=230400
-phoenix_v1.menu.UploadSpeed.256000.windows=256000
-phoenix_v1.menu.UploadSpeed.256000.upload.speed=256000
-phoenix_v1.menu.UploadSpeed.460800.linux=460800
-phoenix_v1.menu.UploadSpeed.460800.macosx=460800
-phoenix_v1.menu.UploadSpeed.460800.upload.speed=460800
-phoenix_v1.menu.UploadSpeed.512000.windows=512000
-phoenix_v1.menu.UploadSpeed.512000.upload.speed=512000
-phoenix_v1.menu.UploadSpeed.921600=921600
-phoenix_v1.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-phoenix_v2.name=Phoenix 2.0
-phoenix_v2.build.board=ESP8266_PHOENIX_V2
-phoenix_v2.build.variant=phoenix_v2
-phoenix_v2.upload.tool=esptool
-phoenix_v2.upload.maximum_data_size=81920
-phoenix_v2.upload.wait_for_upload_port=true
-phoenix_v2.upload.erase_cmd=
-phoenix_v2.serial.disableDTR=true
-phoenix_v2.serial.disableRTS=true
-phoenix_v2.build.mcu=esp8266
-phoenix_v2.build.core=esp8266
-phoenix_v2.build.spiffs_pagesize=256
-phoenix_v2.build.debug_port=
-phoenix_v2.build.debug_level=
-phoenix_v2.menu.CpuFrequency.80=80 MHz
-phoenix_v2.menu.CpuFrequency.80.build.f_cpu=80000000L
-phoenix_v2.menu.CpuFrequency.160=160 MHz
-phoenix_v2.menu.CpuFrequency.160.build.f_cpu=160000000L
-phoenix_v2.menu.VTable.flash=Flash
-phoenix_v2.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-phoenix_v2.menu.VTable.heap=Heap
-phoenix_v2.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-phoenix_v2.menu.VTable.iram=IRAM
-phoenix_v2.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-phoenix_v2.build.flash_mode=dio
-phoenix_v2.build.flash_freq=40
-phoenix_v2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-phoenix_v2.menu.FlashSize.4M1M.build.flash_size=4M
-phoenix_v2.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-phoenix_v2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-phoenix_v2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-phoenix_v2.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-phoenix_v2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-phoenix_v2.menu.FlashSize.4M2M=4M (2M SPIFFS)
-phoenix_v2.menu.FlashSize.4M2M.build.flash_size=4M
-phoenix_v2.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-phoenix_v2.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-phoenix_v2.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-phoenix_v2.menu.FlashSize.4M2M.upload.maximum_size=1044464
-phoenix_v2.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-phoenix_v2.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-phoenix_v2.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-phoenix_v2.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-phoenix_v2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-phoenix_v2.menu.FlashSize.4M3M.build.flash_size=4M
-phoenix_v2.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-phoenix_v2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-phoenix_v2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-phoenix_v2.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-phoenix_v2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-phoenix_v2.menu.ResetMethod.ck=ck
-phoenix_v2.menu.ResetMethod.ck.upload.resetmethod=ck
-phoenix_v2.menu.ResetMethod.nodemcu=nodemcu
-phoenix_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-phoenix_v2.menu.LwIPVariant.v2mss536=v2 Lower Memory
-phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-phoenix_v2.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-phoenix_v2.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-phoenix_v2.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-phoenix_v2.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-phoenix_v2.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-phoenix_v2.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-phoenix_v2.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v2.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-phoenix_v2.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-phoenix_v2.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v2.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-phoenix_v2.menu.Debug.Disabled=Disabled
-phoenix_v2.menu.Debug.Disabled.build.debug_port=
-phoenix_v2.menu.Debug.Serial=Serial
-phoenix_v2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-phoenix_v2.menu.Debug.Serial1=Serial1
-phoenix_v2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-phoenix_v2.menu.DebugLevel.None____=None
-phoenix_v2.menu.DebugLevel.None____.build.debug_level=
-phoenix_v2.menu.DebugLevel.SSL=SSL
-phoenix_v2.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-phoenix_v2.menu.DebugLevel.TLS_MEM=TLS_MEM
-phoenix_v2.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-phoenix_v2.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-phoenix_v2.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-phoenix_v2.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-phoenix_v2.menu.DebugLevel.CORE=CORE
-phoenix_v2.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-phoenix_v2.menu.DebugLevel.WIFI=WIFI
-phoenix_v2.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-phoenix_v2.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-phoenix_v2.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-phoenix_v2.menu.DebugLevel.UPDATER=UPDATER
-phoenix_v2.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-phoenix_v2.menu.DebugLevel.OTA=OTA
-phoenix_v2.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-phoenix_v2.menu.DebugLevel.OOM=OOM
-phoenix_v2.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-phoenix_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-phoenix_v2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-phoenix_v2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-phoenix_v2.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-phoenix_v2.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-phoenix_v2.menu.FlashErase.none=Only Sketch
-phoenix_v2.menu.FlashErase.none.upload.erase_cmd=
-phoenix_v2.menu.FlashErase.sdk=Sketch + WiFi Settings
-phoenix_v2.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-phoenix_v2.menu.FlashErase.all=All Flash Contents
-phoenix_v2.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-phoenix_v2.menu.UploadSpeed.115200=115200
-phoenix_v2.menu.UploadSpeed.115200.upload.speed=115200
-phoenix_v2.menu.UploadSpeed.9600=9600
-phoenix_v2.menu.UploadSpeed.9600.upload.speed=9600
-phoenix_v2.menu.UploadSpeed.57600=57600
-phoenix_v2.menu.UploadSpeed.57600.upload.speed=57600
-phoenix_v2.menu.UploadSpeed.230400.linux=230400
-phoenix_v2.menu.UploadSpeed.230400.macosx=230400
-phoenix_v2.menu.UploadSpeed.230400.upload.speed=230400
-phoenix_v2.menu.UploadSpeed.256000.windows=256000
-phoenix_v2.menu.UploadSpeed.256000.upload.speed=256000
-phoenix_v2.menu.UploadSpeed.460800.linux=460800
-phoenix_v2.menu.UploadSpeed.460800.macosx=460800
-phoenix_v2.menu.UploadSpeed.460800.upload.speed=460800
-phoenix_v2.menu.UploadSpeed.512000.windows=512000
-phoenix_v2.menu.UploadSpeed.512000.upload.speed=512000
-phoenix_v2.menu.UploadSpeed.921600=921600
-phoenix_v2.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-nodemcu.name=NodeMCU 0.9 (ESP-12 Module)
-nodemcu.build.board=ESP8266_NODEMCU
-nodemcu.build.variant=nodemcu
-nodemcu.upload.tool=esptool
-nodemcu.upload.maximum_data_size=81920
-nodemcu.upload.wait_for_upload_port=true
-nodemcu.upload.erase_cmd=
-nodemcu.serial.disableDTR=true
-nodemcu.serial.disableRTS=true
-nodemcu.build.mcu=esp8266
-nodemcu.build.core=esp8266
-nodemcu.build.spiffs_pagesize=256
-nodemcu.build.debug_port=
-nodemcu.build.debug_level=
-nodemcu.menu.CpuFrequency.80=80 MHz
-nodemcu.menu.CpuFrequency.80.build.f_cpu=80000000L
-nodemcu.menu.CpuFrequency.160=160 MHz
-nodemcu.menu.CpuFrequency.160.build.f_cpu=160000000L
-nodemcu.menu.VTable.flash=Flash
-nodemcu.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-nodemcu.menu.VTable.heap=Heap
-nodemcu.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-nodemcu.menu.VTable.iram=IRAM
-nodemcu.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-nodemcu.upload.resetmethod=nodemcu
-nodemcu.build.flash_mode=qio
-nodemcu.build.flash_freq=40
-nodemcu.menu.FlashSize.4M1M=4M (1M SPIFFS)
-nodemcu.menu.FlashSize.4M1M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-nodemcu.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcu.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-nodemcu.menu.FlashSize.4M1M.upload.maximum_size=1044464
-nodemcu.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-nodemcu.menu.FlashSize.4M2M=4M (2M SPIFFS)
-nodemcu.menu.FlashSize.4M2M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-nodemcu.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-nodemcu.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-nodemcu.menu.FlashSize.4M2M.upload.maximum_size=1044464
-nodemcu.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-nodemcu.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-nodemcu.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-nodemcu.menu.FlashSize.4M3M=4M (3M SPIFFS)
-nodemcu.menu.FlashSize.4M3M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-nodemcu.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-nodemcu.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-nodemcu.menu.FlashSize.4M3M.upload.maximum_size=1044464
-nodemcu.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-nodemcu.menu.LwIPVariant.v2mss536=v2 Lower Memory
-nodemcu.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-nodemcu.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-nodemcu.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-nodemcu.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-nodemcu.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-nodemcu.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-nodemcu.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-nodemcu.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-nodemcu.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-nodemcu.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcu.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-nodemcu.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-nodemcu.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcu.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-nodemcu.menu.Debug.Disabled=Disabled
-nodemcu.menu.Debug.Disabled.build.debug_port=
-nodemcu.menu.Debug.Serial=Serial
-nodemcu.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-nodemcu.menu.Debug.Serial1=Serial1
-nodemcu.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-nodemcu.menu.DebugLevel.None____=None
-nodemcu.menu.DebugLevel.None____.build.debug_level=
-nodemcu.menu.DebugLevel.SSL=SSL
-nodemcu.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-nodemcu.menu.DebugLevel.TLS_MEM=TLS_MEM
-nodemcu.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-nodemcu.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-nodemcu.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-nodemcu.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-nodemcu.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcu.menu.DebugLevel.CORE=CORE
-nodemcu.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-nodemcu.menu.DebugLevel.WIFI=WIFI
-nodemcu.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-nodemcu.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-nodemcu.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-nodemcu.menu.DebugLevel.UPDATER=UPDATER
-nodemcu.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-nodemcu.menu.DebugLevel.OTA=OTA
-nodemcu.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-nodemcu.menu.DebugLevel.OOM=OOM
-nodemcu.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-nodemcu.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-nodemcu.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-nodemcu.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-nodemcu.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-nodemcu.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-nodemcu.menu.FlashErase.none=Only Sketch
-nodemcu.menu.FlashErase.none.upload.erase_cmd=
-nodemcu.menu.FlashErase.sdk=Sketch + WiFi Settings
-nodemcu.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-nodemcu.menu.FlashErase.all=All Flash Contents
-nodemcu.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-nodemcu.menu.UploadSpeed.115200=115200
-nodemcu.menu.UploadSpeed.115200.upload.speed=115200
-nodemcu.menu.UploadSpeed.9600=9600
-nodemcu.menu.UploadSpeed.9600.upload.speed=9600
-nodemcu.menu.UploadSpeed.57600=57600
-nodemcu.menu.UploadSpeed.57600.upload.speed=57600
-nodemcu.menu.UploadSpeed.230400.linux=230400
-nodemcu.menu.UploadSpeed.230400.macosx=230400
-nodemcu.menu.UploadSpeed.230400.upload.speed=230400
-nodemcu.menu.UploadSpeed.256000.windows=256000
-nodemcu.menu.UploadSpeed.256000.upload.speed=256000
-nodemcu.menu.UploadSpeed.460800.linux=460800
-nodemcu.menu.UploadSpeed.460800.macosx=460800
-nodemcu.menu.UploadSpeed.460800.upload.speed=460800
-nodemcu.menu.UploadSpeed.512000.windows=512000
-nodemcu.menu.UploadSpeed.512000.upload.speed=512000
-nodemcu.menu.UploadSpeed.921600=921600
-nodemcu.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-nodemcuv2.name=NodeMCU 1.0 (ESP-12E Module)
-nodemcuv2.build.board=ESP8266_NODEMCU
-nodemcuv2.build.variant=nodemcu
-nodemcuv2.upload.tool=esptool
-nodemcuv2.upload.maximum_data_size=81920
-nodemcuv2.upload.wait_for_upload_port=true
-nodemcuv2.upload.erase_cmd=
-nodemcuv2.serial.disableDTR=true
-nodemcuv2.serial.disableRTS=true
-nodemcuv2.build.mcu=esp8266
-nodemcuv2.build.core=esp8266
-nodemcuv2.build.spiffs_pagesize=256
-nodemcuv2.build.debug_port=
-nodemcuv2.build.debug_level=
-nodemcuv2.menu.CpuFrequency.80=80 MHz
-nodemcuv2.menu.CpuFrequency.80.build.f_cpu=80000000L
-nodemcuv2.menu.CpuFrequency.160=160 MHz
-nodemcuv2.menu.CpuFrequency.160.build.f_cpu=160000000L
-nodemcuv2.menu.VTable.flash=Flash
-nodemcuv2.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-nodemcuv2.menu.VTable.heap=Heap
-nodemcuv2.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-nodemcuv2.menu.VTable.iram=IRAM
-nodemcuv2.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-nodemcuv2.upload.resetmethod=nodemcu
-nodemcuv2.build.flash_mode=dio
-nodemcuv2.build.flash_freq=40
-nodemcuv2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-nodemcuv2.menu.FlashSize.4M1M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-nodemcuv2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-nodemcuv2.menu.FlashSize.4M1M.upload.maximum_size=1044464
-nodemcuv2.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-nodemcuv2.menu.FlashSize.4M2M=4M (2M SPIFFS)
-nodemcuv2.menu.FlashSize.4M2M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-nodemcuv2.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-nodemcuv2.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-nodemcuv2.menu.FlashSize.4M2M.upload.maximum_size=1044464
-nodemcuv2.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-nodemcuv2.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-nodemcuv2.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-nodemcuv2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-nodemcuv2.menu.FlashSize.4M3M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-nodemcuv2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-nodemcuv2.menu.FlashSize.4M3M.upload.maximum_size=1044464
-nodemcuv2.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-nodemcuv2.menu.LwIPVariant.v2mss536=v2 Lower Memory
-nodemcuv2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-nodemcuv2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-nodemcuv2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-nodemcuv2.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-nodemcuv2.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-nodemcuv2.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-nodemcuv2.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-nodemcuv2.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-nodemcuv2.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-nodemcuv2.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcuv2.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-nodemcuv2.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-nodemcuv2.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcuv2.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-nodemcuv2.menu.Debug.Disabled=Disabled
-nodemcuv2.menu.Debug.Disabled.build.debug_port=
-nodemcuv2.menu.Debug.Serial=Serial
-nodemcuv2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-nodemcuv2.menu.Debug.Serial1=Serial1
-nodemcuv2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-nodemcuv2.menu.DebugLevel.None____=None
-nodemcuv2.menu.DebugLevel.None____.build.debug_level=
-nodemcuv2.menu.DebugLevel.SSL=SSL
-nodemcuv2.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-nodemcuv2.menu.DebugLevel.TLS_MEM=TLS_MEM
-nodemcuv2.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-nodemcuv2.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-nodemcuv2.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-nodemcuv2.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-nodemcuv2.menu.DebugLevel.CORE=CORE
-nodemcuv2.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-nodemcuv2.menu.DebugLevel.WIFI=WIFI
-nodemcuv2.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-nodemcuv2.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-nodemcuv2.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-nodemcuv2.menu.DebugLevel.UPDATER=UPDATER
-nodemcuv2.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-nodemcuv2.menu.DebugLevel.OTA=OTA
-nodemcuv2.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-nodemcuv2.menu.DebugLevel.OOM=OOM
-nodemcuv2.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-nodemcuv2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-nodemcuv2.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-nodemcuv2.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-nodemcuv2.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-nodemcuv2.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-nodemcuv2.menu.FlashErase.none=Only Sketch
-nodemcuv2.menu.FlashErase.none.upload.erase_cmd=
-nodemcuv2.menu.FlashErase.sdk=Sketch + WiFi Settings
-nodemcuv2.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-nodemcuv2.menu.FlashErase.all=All Flash Contents
-nodemcuv2.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-nodemcuv2.menu.UploadSpeed.115200=115200
-nodemcuv2.menu.UploadSpeed.115200.upload.speed=115200
-nodemcuv2.menu.UploadSpeed.9600=9600
-nodemcuv2.menu.UploadSpeed.9600.upload.speed=9600
-nodemcuv2.menu.UploadSpeed.57600=57600
-nodemcuv2.menu.UploadSpeed.57600.upload.speed=57600
-nodemcuv2.menu.UploadSpeed.230400.linux=230400
-nodemcuv2.menu.UploadSpeed.230400.macosx=230400
-nodemcuv2.menu.UploadSpeed.230400.upload.speed=230400
-nodemcuv2.menu.UploadSpeed.256000.windows=256000
-nodemcuv2.menu.UploadSpeed.256000.upload.speed=256000
-nodemcuv2.menu.UploadSpeed.460800.linux=460800
-nodemcuv2.menu.UploadSpeed.460800.macosx=460800
-nodemcuv2.menu.UploadSpeed.460800.upload.speed=460800
-nodemcuv2.menu.UploadSpeed.512000.windows=512000
-nodemcuv2.menu.UploadSpeed.512000.upload.speed=512000
-nodemcuv2.menu.UploadSpeed.921600=921600
-nodemcuv2.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-modwifi.name=Olimex MOD-WIFI-ESP8266(-DEV)
-modwifi.build.board=MOD_WIFI_ESP8266
-modwifi.build.variant=modwifi
-modwifi.upload.tool=esptool
-modwifi.upload.maximum_data_size=81920
-modwifi.upload.wait_for_upload_port=true
-modwifi.upload.erase_cmd=
-modwifi.serial.disableDTR=true
-modwifi.serial.disableRTS=true
-modwifi.build.mcu=esp8266
-modwifi.build.core=esp8266
-modwifi.build.spiffs_pagesize=256
-modwifi.build.debug_port=
-modwifi.build.debug_level=
-modwifi.menu.CpuFrequency.80=80 MHz
-modwifi.menu.CpuFrequency.80.build.f_cpu=80000000L
-modwifi.menu.CpuFrequency.160=160 MHz
-modwifi.menu.CpuFrequency.160.build.f_cpu=160000000L
-modwifi.menu.VTable.flash=Flash
-modwifi.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-modwifi.menu.VTable.heap=Heap
-modwifi.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-modwifi.menu.VTable.iram=IRAM
-modwifi.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-modwifi.upload.resetmethod=ck
-modwifi.build.flash_mode=qio
-modwifi.build.flash_freq=40
-modwifi.menu.FlashSize.2M=2M (1M SPIFFS)
-modwifi.menu.FlashSize.2M.build.flash_size=2M
-modwifi.menu.FlashSize.2M.build.flash_size_bytes=0x200000
-modwifi.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld
-modwifi.menu.FlashSize.2M.build.spiffs_pagesize=256
-modwifi.menu.FlashSize.2M.upload.maximum_size=1044464
-modwifi.menu.FlashSize.2M.build.rfcal_addr=0x1FC000
-modwifi.menu.FlashSize.2M.build.spiffs_start=0x100000
-modwifi.menu.FlashSize.2M.build.spiffs_end=0x1FB000
-modwifi.menu.FlashSize.2M.build.spiffs_blocksize=8192
-modwifi.menu.LwIPVariant.v2mss536=v2 Lower Memory
-modwifi.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-modwifi.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-modwifi.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-modwifi.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-modwifi.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-modwifi.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-modwifi.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-modwifi.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-modwifi.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-modwifi.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-modwifi.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-modwifi.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-modwifi.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-modwifi.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-modwifi.menu.Debug.Disabled=Disabled
-modwifi.menu.Debug.Disabled.build.debug_port=
-modwifi.menu.Debug.Serial=Serial
-modwifi.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-modwifi.menu.Debug.Serial1=Serial1
-modwifi.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-modwifi.menu.DebugLevel.None____=None
-modwifi.menu.DebugLevel.None____.build.debug_level=
-modwifi.menu.DebugLevel.SSL=SSL
-modwifi.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-modwifi.menu.DebugLevel.TLS_MEM=TLS_MEM
-modwifi.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-modwifi.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-modwifi.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-modwifi.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-modwifi.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-modwifi.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-modwifi.menu.DebugLevel.CORE=CORE
-modwifi.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-modwifi.menu.DebugLevel.WIFI=WIFI
-modwifi.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-modwifi.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-modwifi.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-modwifi.menu.DebugLevel.UPDATER=UPDATER
-modwifi.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-modwifi.menu.DebugLevel.OTA=OTA
-modwifi.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-modwifi.menu.DebugLevel.OOM=OOM
-modwifi.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-modwifi.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-modwifi.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-modwifi.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-modwifi.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-modwifi.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-modwifi.menu.FlashErase.none=Only Sketch
-modwifi.menu.FlashErase.none.upload.erase_cmd=
-modwifi.menu.FlashErase.sdk=Sketch + WiFi Settings
-modwifi.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-modwifi.menu.FlashErase.all=All Flash Contents
-modwifi.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-modwifi.menu.UploadSpeed.115200=115200
-modwifi.menu.UploadSpeed.115200.upload.speed=115200
-modwifi.menu.UploadSpeed.9600=9600
-modwifi.menu.UploadSpeed.9600.upload.speed=9600
-modwifi.menu.UploadSpeed.57600=57600
-modwifi.menu.UploadSpeed.57600.upload.speed=57600
-modwifi.menu.UploadSpeed.230400.linux=230400
-modwifi.menu.UploadSpeed.230400.macosx=230400
-modwifi.menu.UploadSpeed.230400.upload.speed=230400
-modwifi.menu.UploadSpeed.256000.windows=256000
-modwifi.menu.UploadSpeed.256000.upload.speed=256000
-modwifi.menu.UploadSpeed.460800.linux=460800
-modwifi.menu.UploadSpeed.460800.macosx=460800
-modwifi.menu.UploadSpeed.460800.upload.speed=460800
-modwifi.menu.UploadSpeed.512000.windows=512000
-modwifi.menu.UploadSpeed.512000.upload.speed=512000
-modwifi.menu.UploadSpeed.921600=921600
-modwifi.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-thing.name=SparkFun ESP8266 Thing
-thing.build.board=ESP8266_THING
-thing.build.variant=thing
-thing.upload.tool=esptool
-thing.upload.maximum_data_size=81920
-thing.upload.wait_for_upload_port=true
-thing.upload.erase_cmd=
-thing.serial.disableDTR=true
-thing.serial.disableRTS=true
-thing.build.mcu=esp8266
-thing.build.core=esp8266
-thing.build.spiffs_pagesize=256
-thing.build.debug_port=
-thing.build.debug_level=
-thing.menu.CpuFrequency.80=80 MHz
-thing.menu.CpuFrequency.80.build.f_cpu=80000000L
-thing.menu.CpuFrequency.160=160 MHz
-thing.menu.CpuFrequency.160.build.f_cpu=160000000L
-thing.menu.VTable.flash=Flash
-thing.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-thing.menu.VTable.heap=Heap
-thing.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-thing.menu.VTable.iram=IRAM
-thing.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-thing.upload.resetmethod=ck
-thing.build.flash_mode=qio
-thing.build.flash_freq=40
-thing.menu.FlashSize.512K0=512K (no SPIFFS)
-thing.menu.FlashSize.512K0.build.flash_size=512K
-thing.menu.FlashSize.512K0.build.flash_size_bytes=0x80000
-thing.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-thing.menu.FlashSize.512K0.build.spiffs_pagesize=256
-thing.menu.FlashSize.512K0.upload.maximum_size=499696
-thing.menu.FlashSize.512K0.build.rfcal_addr=0x7C000
-thing.menu.FlashSize.512K32=512K (32K SPIFFS)
-thing.menu.FlashSize.512K32.build.flash_size=512K
-thing.menu.FlashSize.512K32.build.flash_size_bytes=0x80000
-thing.menu.FlashSize.512K32.build.flash_ld=eagle.flash.512k32.ld
-thing.menu.FlashSize.512K32.build.spiffs_pagesize=256
-thing.menu.FlashSize.512K32.upload.maximum_size=466928
-thing.menu.FlashSize.512K32.build.rfcal_addr=0x7C000
-thing.menu.FlashSize.512K32.build.spiffs_start=0x73000
-thing.menu.FlashSize.512K32.build.spiffs_end=0x7B000
-thing.menu.FlashSize.512K32.build.spiffs_blocksize=4096
-thing.menu.FlashSize.512K64=512K (64K SPIFFS)
-thing.menu.FlashSize.512K64.build.flash_size=512K
-thing.menu.FlashSize.512K64.build.flash_size_bytes=0x80000
-thing.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-thing.menu.FlashSize.512K64.build.spiffs_pagesize=256
-thing.menu.FlashSize.512K64.upload.maximum_size=434160
-thing.menu.FlashSize.512K64.build.rfcal_addr=0x7C000
-thing.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-thing.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-thing.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-thing.menu.FlashSize.512K128=512K (128K SPIFFS)
-thing.menu.FlashSize.512K128.build.flash_size=512K
-thing.menu.FlashSize.512K128.build.flash_size_bytes=0x80000
-thing.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-thing.menu.FlashSize.512K128.build.spiffs_pagesize=256
-thing.menu.FlashSize.512K128.upload.maximum_size=368624
-thing.menu.FlashSize.512K128.build.rfcal_addr=0x7C000
-thing.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-thing.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-thing.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-thing.menu.LwIPVariant.v2mss536=v2 Lower Memory
-thing.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-thing.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-thing.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-thing.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-thing.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-thing.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-thing.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-thing.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-thing.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-thing.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-thing.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-thing.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-thing.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-thing.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-thing.menu.Debug.Disabled=Disabled
-thing.menu.Debug.Disabled.build.debug_port=
-thing.menu.Debug.Serial=Serial
-thing.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-thing.menu.Debug.Serial1=Serial1
-thing.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-thing.menu.DebugLevel.None____=None
-thing.menu.DebugLevel.None____.build.debug_level=
-thing.menu.DebugLevel.SSL=SSL
-thing.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-thing.menu.DebugLevel.TLS_MEM=TLS_MEM
-thing.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-thing.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-thing.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-thing.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-thing.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-thing.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-thing.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-thing.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thing.menu.DebugLevel.CORE=CORE
-thing.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-thing.menu.DebugLevel.WIFI=WIFI
-thing.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-thing.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-thing.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-thing.menu.DebugLevel.UPDATER=UPDATER
-thing.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-thing.menu.DebugLevel.OTA=OTA
-thing.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-thing.menu.DebugLevel.OOM=OOM
-thing.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-thing.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-thing.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-thing.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-thing.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-thing.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-thing.menu.FlashErase.none=Only Sketch
-thing.menu.FlashErase.none.upload.erase_cmd=
-thing.menu.FlashErase.sdk=Sketch + WiFi Settings
-thing.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-thing.menu.FlashErase.all=All Flash Contents
-thing.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-thing.menu.UploadSpeed.115200=115200
-thing.menu.UploadSpeed.115200.upload.speed=115200
-thing.menu.UploadSpeed.9600=9600
-thing.menu.UploadSpeed.9600.upload.speed=9600
-thing.menu.UploadSpeed.57600=57600
-thing.menu.UploadSpeed.57600.upload.speed=57600
-thing.menu.UploadSpeed.230400.linux=230400
-thing.menu.UploadSpeed.230400.macosx=230400
-thing.menu.UploadSpeed.230400.upload.speed=230400
-thing.menu.UploadSpeed.256000.windows=256000
-thing.menu.UploadSpeed.256000.upload.speed=256000
-thing.menu.UploadSpeed.460800.linux=460800
-thing.menu.UploadSpeed.460800.macosx=460800
-thing.menu.UploadSpeed.460800.upload.speed=460800
-thing.menu.UploadSpeed.512000.windows=512000
-thing.menu.UploadSpeed.512000.upload.speed=512000
-thing.menu.UploadSpeed.921600=921600
-thing.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-thingdev.name=SparkFun ESP8266 Thing Dev
-thingdev.build.board=ESP8266_THING_DEV
-thingdev.build.variant=thing
-thingdev.upload.tool=esptool
-thingdev.upload.maximum_data_size=81920
-thingdev.upload.wait_for_upload_port=true
-thingdev.upload.erase_cmd=
-thingdev.serial.disableDTR=true
-thingdev.serial.disableRTS=true
-thingdev.build.mcu=esp8266
-thingdev.build.core=esp8266
-thingdev.build.spiffs_pagesize=256
-thingdev.build.debug_port=
-thingdev.build.debug_level=
-thingdev.menu.CpuFrequency.80=80 MHz
-thingdev.menu.CpuFrequency.80.build.f_cpu=80000000L
-thingdev.menu.CpuFrequency.160=160 MHz
-thingdev.menu.CpuFrequency.160.build.f_cpu=160000000L
-thingdev.menu.VTable.flash=Flash
-thingdev.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-thingdev.menu.VTable.heap=Heap
-thingdev.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-thingdev.menu.VTable.iram=IRAM
-thingdev.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-thingdev.upload.resetmethod=nodemcu
-thingdev.build.flash_mode=dio
-thingdev.build.flash_freq=40
-thingdev.menu.FlashSize.512K0=512K (no SPIFFS)
-thingdev.menu.FlashSize.512K0.build.flash_size=512K
-thingdev.menu.FlashSize.512K0.build.flash_size_bytes=0x80000
-thingdev.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-thingdev.menu.FlashSize.512K0.build.spiffs_pagesize=256
-thingdev.menu.FlashSize.512K0.upload.maximum_size=499696
-thingdev.menu.FlashSize.512K0.build.rfcal_addr=0x7C000
-thingdev.menu.FlashSize.512K32=512K (32K SPIFFS)
-thingdev.menu.FlashSize.512K32.build.flash_size=512K
-thingdev.menu.FlashSize.512K32.build.flash_size_bytes=0x80000
-thingdev.menu.FlashSize.512K32.build.flash_ld=eagle.flash.512k32.ld
-thingdev.menu.FlashSize.512K32.build.spiffs_pagesize=256
-thingdev.menu.FlashSize.512K32.upload.maximum_size=466928
-thingdev.menu.FlashSize.512K32.build.rfcal_addr=0x7C000
-thingdev.menu.FlashSize.512K32.build.spiffs_start=0x73000
-thingdev.menu.FlashSize.512K32.build.spiffs_end=0x7B000
-thingdev.menu.FlashSize.512K32.build.spiffs_blocksize=4096
-thingdev.menu.FlashSize.512K64=512K (64K SPIFFS)
-thingdev.menu.FlashSize.512K64.build.flash_size=512K
-thingdev.menu.FlashSize.512K64.build.flash_size_bytes=0x80000
-thingdev.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-thingdev.menu.FlashSize.512K64.build.spiffs_pagesize=256
-thingdev.menu.FlashSize.512K64.upload.maximum_size=434160
-thingdev.menu.FlashSize.512K64.build.rfcal_addr=0x7C000
-thingdev.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-thingdev.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-thingdev.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-thingdev.menu.FlashSize.512K128=512K (128K SPIFFS)
-thingdev.menu.FlashSize.512K128.build.flash_size=512K
-thingdev.menu.FlashSize.512K128.build.flash_size_bytes=0x80000
-thingdev.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-thingdev.menu.FlashSize.512K128.build.spiffs_pagesize=256
-thingdev.menu.FlashSize.512K128.upload.maximum_size=368624
-thingdev.menu.FlashSize.512K128.build.rfcal_addr=0x7C000
-thingdev.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-thingdev.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-thingdev.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-thingdev.menu.LwIPVariant.v2mss536=v2 Lower Memory
-thingdev.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-thingdev.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-thingdev.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-thingdev.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-thingdev.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-thingdev.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-thingdev.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-thingdev.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-thingdev.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-thingdev.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-thingdev.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-thingdev.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-thingdev.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-thingdev.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-thingdev.menu.Debug.Disabled=Disabled
-thingdev.menu.Debug.Disabled.build.debug_port=
-thingdev.menu.Debug.Serial=Serial
-thingdev.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-thingdev.menu.Debug.Serial1=Serial1
-thingdev.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-thingdev.menu.DebugLevel.None____=None
-thingdev.menu.DebugLevel.None____.build.debug_level=
-thingdev.menu.DebugLevel.SSL=SSL
-thingdev.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-thingdev.menu.DebugLevel.TLS_MEM=TLS_MEM
-thingdev.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-thingdev.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-thingdev.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-thingdev.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-thingdev.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-thingdev.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-thingdev.menu.DebugLevel.CORE=CORE
-thingdev.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-thingdev.menu.DebugLevel.WIFI=WIFI
-thingdev.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-thingdev.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-thingdev.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-thingdev.menu.DebugLevel.UPDATER=UPDATER
-thingdev.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-thingdev.menu.DebugLevel.OTA=OTA
-thingdev.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-thingdev.menu.DebugLevel.OOM=OOM
-thingdev.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-thingdev.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-thingdev.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-thingdev.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-thingdev.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-thingdev.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-thingdev.menu.FlashErase.none=Only Sketch
-thingdev.menu.FlashErase.none.upload.erase_cmd=
-thingdev.menu.FlashErase.sdk=Sketch + WiFi Settings
-thingdev.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-thingdev.menu.FlashErase.all=All Flash Contents
-thingdev.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-thingdev.menu.UploadSpeed.115200=115200
-thingdev.menu.UploadSpeed.115200.upload.speed=115200
-thingdev.menu.UploadSpeed.9600=9600
-thingdev.menu.UploadSpeed.9600.upload.speed=9600
-thingdev.menu.UploadSpeed.57600=57600
-thingdev.menu.UploadSpeed.57600.upload.speed=57600
-thingdev.menu.UploadSpeed.230400.linux=230400
-thingdev.menu.UploadSpeed.230400.macosx=230400
-thingdev.menu.UploadSpeed.230400.upload.speed=230400
-thingdev.menu.UploadSpeed.256000.windows=256000
-thingdev.menu.UploadSpeed.256000.upload.speed=256000
-thingdev.menu.UploadSpeed.460800.linux=460800
-thingdev.menu.UploadSpeed.460800.macosx=460800
-thingdev.menu.UploadSpeed.460800.upload.speed=460800
-thingdev.menu.UploadSpeed.512000.windows=512000
-thingdev.menu.UploadSpeed.512000.upload.speed=512000
-thingdev.menu.UploadSpeed.921600=921600
-thingdev.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-esp210.name=SweetPea ESP-210
-esp210.build.board=ESP8266_ESP210
-esp210.upload.tool=esptool
-esp210.upload.maximum_data_size=81920
-esp210.upload.wait_for_upload_port=true
-esp210.upload.erase_cmd=
-esp210.serial.disableDTR=true
-esp210.serial.disableRTS=true
-esp210.build.mcu=esp8266
-esp210.build.core=esp8266
-esp210.build.variant=generic
-esp210.build.spiffs_pagesize=256
-esp210.build.debug_port=
-esp210.build.debug_level=
-esp210.menu.CpuFrequency.80=80 MHz
-esp210.menu.CpuFrequency.80.build.f_cpu=80000000L
-esp210.menu.CpuFrequency.160=160 MHz
-esp210.menu.CpuFrequency.160.build.f_cpu=160000000L
-esp210.menu.VTable.flash=Flash
-esp210.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-esp210.menu.VTable.heap=Heap
-esp210.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-esp210.menu.VTable.iram=IRAM
-esp210.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-esp210.upload.resetmethod=ck
-esp210.build.flash_mode=qio
-esp210.build.flash_freq=40
-esp210.menu.FlashSize.4M1M=4M (1M SPIFFS)
-esp210.menu.FlashSize.4M1M.build.flash_size=4M
-esp210.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-esp210.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-esp210.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-esp210.menu.FlashSize.4M1M.upload.maximum_size=1044464
-esp210.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-esp210.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-esp210.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-esp210.menu.FlashSize.4M2M=4M (2M SPIFFS)
-esp210.menu.FlashSize.4M2M.build.flash_size=4M
-esp210.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-esp210.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-esp210.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-esp210.menu.FlashSize.4M2M.upload.maximum_size=1044464
-esp210.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-esp210.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-esp210.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-esp210.menu.FlashSize.4M3M=4M (3M SPIFFS)
-esp210.menu.FlashSize.4M3M.build.flash_size=4M
-esp210.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-esp210.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-esp210.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-esp210.menu.FlashSize.4M3M.upload.maximum_size=1044464
-esp210.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-esp210.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-esp210.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-esp210.menu.LwIPVariant.v2mss536=v2 Lower Memory
-esp210.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-esp210.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-esp210.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-esp210.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-esp210.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-esp210.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-esp210.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-esp210.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-esp210.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-esp210.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-esp210.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-esp210.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-esp210.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-esp210.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-esp210.menu.Debug.Disabled=Disabled
-esp210.menu.Debug.Disabled.build.debug_port=
-esp210.menu.Debug.Serial=Serial
-esp210.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-esp210.menu.Debug.Serial1=Serial1
-esp210.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-esp210.menu.DebugLevel.None____=None
-esp210.menu.DebugLevel.None____.build.debug_level=
-esp210.menu.DebugLevel.SSL=SSL
-esp210.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-esp210.menu.DebugLevel.TLS_MEM=TLS_MEM
-esp210.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-esp210.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-esp210.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-esp210.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-esp210.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-esp210.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-esp210.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-esp210.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-esp210.menu.DebugLevel.CORE=CORE
-esp210.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-esp210.menu.DebugLevel.WIFI=WIFI
-esp210.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-esp210.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-esp210.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-esp210.menu.DebugLevel.UPDATER=UPDATER
-esp210.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-esp210.menu.DebugLevel.OTA=OTA
-esp210.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-esp210.menu.DebugLevel.OOM=OOM
-esp210.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-esp210.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-esp210.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-esp210.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-esp210.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-esp210.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-esp210.menu.FlashErase.none=Only Sketch
-esp210.menu.FlashErase.none.upload.erase_cmd=
-esp210.menu.FlashErase.sdk=Sketch + WiFi Settings
-esp210.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-esp210.menu.FlashErase.all=All Flash Contents
-esp210.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-esp210.menu.UploadSpeed.57600=57600
-esp210.menu.UploadSpeed.57600.upload.speed=57600
-esp210.menu.UploadSpeed.9600=9600
-esp210.menu.UploadSpeed.9600.upload.speed=9600
-esp210.menu.UploadSpeed.115200=115200
-esp210.menu.UploadSpeed.115200.upload.speed=115200
-esp210.menu.UploadSpeed.230400.linux=230400
-esp210.menu.UploadSpeed.230400.macosx=230400
-esp210.menu.UploadSpeed.230400.upload.speed=230400
-esp210.menu.UploadSpeed.256000.windows=256000
-esp210.menu.UploadSpeed.256000.upload.speed=256000
-esp210.menu.UploadSpeed.460800.linux=460800
-esp210.menu.UploadSpeed.460800.macosx=460800
-esp210.menu.UploadSpeed.460800.upload.speed=460800
-esp210.menu.UploadSpeed.512000.windows=512000
-esp210.menu.UploadSpeed.512000.upload.speed=512000
-esp210.menu.UploadSpeed.921600=921600
-esp210.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-d1_mini.name=LOLIN(WEMOS) D1 R2 & mini
-d1_mini.build.board=ESP8266_WEMOS_D1MINI
-d1_mini.build.variant=d1_mini
-d1_mini.upload.tool=esptool
-d1_mini.upload.maximum_data_size=81920
-d1_mini.upload.wait_for_upload_port=true
-d1_mini.upload.erase_cmd=
-d1_mini.serial.disableDTR=true
-d1_mini.serial.disableRTS=true
-d1_mini.build.mcu=esp8266
-d1_mini.build.core=esp8266
-d1_mini.build.spiffs_pagesize=256
-d1_mini.build.debug_port=
-d1_mini.build.debug_level=
-d1_mini.menu.CpuFrequency.80=80 MHz
-d1_mini.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini.menu.CpuFrequency.160=160 MHz
-d1_mini.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1_mini.menu.VTable.flash=Flash
-d1_mini.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-d1_mini.menu.VTable.heap=Heap
-d1_mini.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-d1_mini.menu.VTable.iram=IRAM
-d1_mini.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-d1_mini.upload.resetmethod=nodemcu
-d1_mini.build.flash_mode=dio
-d1_mini.build.flash_freq=40
-d1_mini.menu.FlashSize.4M1M=4M (1M SPIFFS)
-d1_mini.menu.FlashSize.4M1M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-d1_mini.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1_mini.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-d1_mini.menu.FlashSize.4M1M.upload.maximum_size=1044464
-d1_mini.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-d1_mini.menu.FlashSize.4M2M=4M (2M SPIFFS)
-d1_mini.menu.FlashSize.4M2M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-d1_mini.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-d1_mini.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-d1_mini.menu.FlashSize.4M2M.upload.maximum_size=1044464
-d1_mini.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-d1_mini.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-d1_mini.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-d1_mini.menu.FlashSize.4M3M=4M (3M SPIFFS)
-d1_mini.menu.FlashSize.4M3M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-d1_mini.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-d1_mini.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-d1_mini.menu.FlashSize.4M3M.upload.maximum_size=1044464
-d1_mini.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-d1_mini.menu.LwIPVariant.v2mss536=v2 Lower Memory
-d1_mini.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1_mini.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1_mini.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1_mini.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-d1_mini.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1_mini.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1_mini.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1_mini.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-d1_mini.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1_mini.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-d1_mini.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1_mini.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1_mini.menu.Debug.Disabled=Disabled
-d1_mini.menu.Debug.Disabled.build.debug_port=
-d1_mini.menu.Debug.Serial=Serial
-d1_mini.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1_mini.menu.Debug.Serial1=Serial1
-d1_mini.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1_mini.menu.DebugLevel.None____=None
-d1_mini.menu.DebugLevel.None____.build.debug_level=
-d1_mini.menu.DebugLevel.SSL=SSL
-d1_mini.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1_mini.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1_mini.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1_mini.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1_mini.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1_mini.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1_mini.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini.menu.DebugLevel.CORE=CORE
-d1_mini.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1_mini.menu.DebugLevel.WIFI=WIFI
-d1_mini.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1_mini.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1_mini.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1_mini.menu.DebugLevel.UPDATER=UPDATER
-d1_mini.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1_mini.menu.DebugLevel.OTA=OTA
-d1_mini.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1_mini.menu.DebugLevel.OOM=OOM
-d1_mini.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-d1_mini.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-d1_mini.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1_mini.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1_mini.menu.FlashErase.none=Only Sketch
-d1_mini.menu.FlashErase.none.upload.erase_cmd=
-d1_mini.menu.FlashErase.sdk=Sketch + WiFi Settings
-d1_mini.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-d1_mini.menu.FlashErase.all=All Flash Contents
-d1_mini.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-d1_mini.menu.UploadSpeed.921600=921600
-d1_mini.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini.menu.UploadSpeed.9600=9600
-d1_mini.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini.menu.UploadSpeed.57600=57600
-d1_mini.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini.menu.UploadSpeed.115200=115200
-d1_mini.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini.menu.UploadSpeed.230400.linux=230400
-d1_mini.menu.UploadSpeed.230400.macosx=230400
-d1_mini.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini.menu.UploadSpeed.256000.windows=256000
-d1_mini.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini.menu.UploadSpeed.460800.linux=460800
-d1_mini.menu.UploadSpeed.460800.macosx=460800
-d1_mini.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini.menu.UploadSpeed.512000.windows=512000
-d1_mini.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-d1_mini_pro.name=LOLIN(WEMOS) D1 mini Pro
-d1_mini_pro.build.board=ESP8266_WEMOS_D1MINIPRO
-d1_mini_pro.build.variant=d1_mini
-d1_mini_pro.upload.tool=esptool
-d1_mini_pro.upload.maximum_data_size=81920
-d1_mini_pro.upload.wait_for_upload_port=true
-d1_mini_pro.upload.erase_cmd=
-d1_mini_pro.serial.disableDTR=true
-d1_mini_pro.serial.disableRTS=true
-d1_mini_pro.build.mcu=esp8266
-d1_mini_pro.build.core=esp8266
-d1_mini_pro.build.spiffs_pagesize=256
-d1_mini_pro.build.debug_port=
-d1_mini_pro.build.debug_level=
-d1_mini_pro.menu.CpuFrequency.80=80 MHz
-d1_mini_pro.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini_pro.menu.CpuFrequency.160=160 MHz
-d1_mini_pro.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1_mini_pro.menu.VTable.flash=Flash
-d1_mini_pro.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-d1_mini_pro.menu.VTable.heap=Heap
-d1_mini_pro.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-d1_mini_pro.menu.VTable.iram=IRAM
-d1_mini_pro.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-d1_mini_pro.upload.resetmethod=nodemcu
-d1_mini_pro.build.flash_mode=dio
-d1_mini_pro.build.flash_freq=40
-d1_mini_pro.menu.FlashSize.16M15M=16M (15M SPIFFS)
-d1_mini_pro.menu.FlashSize.16M15M.build.flash_size=16M
-d1_mini_pro.menu.FlashSize.16M15M.build.flash_size_bytes=0x1000000
-d1_mini_pro.menu.FlashSize.16M15M.build.flash_ld=eagle.flash.16m.ld
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_pagesize=256
-d1_mini_pro.menu.FlashSize.16M15M.upload.maximum_size=1044464
-d1_mini_pro.menu.FlashSize.16M15M.build.rfcal_addr=0xFFC000
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_start=0x100000
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_end=0xFFB000
-d1_mini_pro.menu.FlashSize.16M15M.build.spiffs_blocksize=8192
-d1_mini_pro.menu.LwIPVariant.v2mss536=v2 Lower Memory
-d1_mini_pro.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1_mini_pro.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1_mini_pro.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1_mini_pro.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-d1_mini_pro.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1_mini_pro.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1_mini_pro.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1_mini_pro.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-d1_mini_pro.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1_mini_pro.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_pro.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-d1_mini_pro.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1_mini_pro.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_pro.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1_mini_pro.menu.Debug.Disabled=Disabled
-d1_mini_pro.menu.Debug.Disabled.build.debug_port=
-d1_mini_pro.menu.Debug.Serial=Serial
-d1_mini_pro.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1_mini_pro.menu.Debug.Serial1=Serial1
-d1_mini_pro.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1_mini_pro.menu.DebugLevel.None____=None
-d1_mini_pro.menu.DebugLevel.None____.build.debug_level=
-d1_mini_pro.menu.DebugLevel.SSL=SSL
-d1_mini_pro.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1_mini_pro.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1_mini_pro.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_pro.menu.DebugLevel.CORE=CORE
-d1_mini_pro.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1_mini_pro.menu.DebugLevel.WIFI=WIFI
-d1_mini_pro.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1_mini_pro.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1_mini_pro.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1_mini_pro.menu.DebugLevel.UPDATER=UPDATER
-d1_mini_pro.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1_mini_pro.menu.DebugLevel.OTA=OTA
-d1_mini_pro.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1_mini_pro.menu.DebugLevel.OOM=OOM
-d1_mini_pro.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-d1_mini_pro.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini_pro.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini_pro.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-d1_mini_pro.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1_mini_pro.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1_mini_pro.menu.FlashErase.none=Only Sketch
-d1_mini_pro.menu.FlashErase.none.upload.erase_cmd=
-d1_mini_pro.menu.FlashErase.sdk=Sketch + WiFi Settings
-d1_mini_pro.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-d1_mini_pro.menu.FlashErase.all=All Flash Contents
-d1_mini_pro.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-d1_mini_pro.menu.UploadSpeed.921600=921600
-d1_mini_pro.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini_pro.menu.UploadSpeed.9600=9600
-d1_mini_pro.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini_pro.menu.UploadSpeed.57600=57600
-d1_mini_pro.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini_pro.menu.UploadSpeed.115200=115200
-d1_mini_pro.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini_pro.menu.UploadSpeed.230400.linux=230400
-d1_mini_pro.menu.UploadSpeed.230400.macosx=230400
-d1_mini_pro.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini_pro.menu.UploadSpeed.256000.windows=256000
-d1_mini_pro.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini_pro.menu.UploadSpeed.460800.linux=460800
-d1_mini_pro.menu.UploadSpeed.460800.macosx=460800
-d1_mini_pro.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini_pro.menu.UploadSpeed.512000.windows=512000
-d1_mini_pro.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-d1_mini_lite.name=LOLIN(WEMOS) D1 mini Lite
-d1_mini_lite.build.board=ESP8266_WEMOS_D1MINILITE
-d1_mini_lite.build.variant=d1_mini
-d1_mini_lite.upload.tool=esptool
-d1_mini_lite.upload.maximum_data_size=81920
-d1_mini_lite.upload.wait_for_upload_port=true
-d1_mini_lite.upload.erase_cmd=
-d1_mini_lite.serial.disableDTR=true
-d1_mini_lite.serial.disableRTS=true
-d1_mini_lite.build.mcu=esp8266
-d1_mini_lite.build.core=esp8266
-d1_mini_lite.build.spiffs_pagesize=256
-d1_mini_lite.build.debug_port=
-d1_mini_lite.build.debug_level=
-d1_mini_lite.menu.CpuFrequency.80=80 MHz
-d1_mini_lite.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini_lite.menu.CpuFrequency.160=160 MHz
-d1_mini_lite.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1_mini_lite.menu.VTable.flash=Flash
-d1_mini_lite.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-d1_mini_lite.menu.VTable.heap=Heap
-d1_mini_lite.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-d1_mini_lite.menu.VTable.iram=IRAM
-d1_mini_lite.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-d1_mini_lite.upload.resetmethod=nodemcu
-d1_mini_lite.build.flash_mode=dout
-d1_mini_lite.build.flash_freq=40
-d1_mini_lite.menu.FlashSize.1M0=1M (no SPIFFS)
-d1_mini_lite.menu.FlashSize.1M0.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M0.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-d1_mini_lite.menu.FlashSize.1M0.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M0.upload.maximum_size=1023984
-d1_mini_lite.menu.FlashSize.1M0.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M64=1M (64K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M64.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M64.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M64.upload.maximum_size=958448
-d1_mini_lite.menu.FlashSize.1M64.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M128=1M (128K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M128.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M128.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M128.upload.maximum_size=892912
-d1_mini_lite.menu.FlashSize.1M128.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M144=1M (144K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M144.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M144.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M144.upload.maximum_size=876528
-d1_mini_lite.menu.FlashSize.1M144.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M160=1M (160K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M160.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M160.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M160.upload.maximum_size=860144
-d1_mini_lite.menu.FlashSize.1M160.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M192=1M (192K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M192.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M192.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M192.upload.maximum_size=827376
-d1_mini_lite.menu.FlashSize.1M192.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M256=1M (256K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M256.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M256.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M256.upload.maximum_size=761840
-d1_mini_lite.menu.FlashSize.1M256.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-d1_mini_lite.menu.FlashSize.1M512=1M (512K SPIFFS)
-d1_mini_lite.menu.FlashSize.1M512.build.flash_size=1M
-d1_mini_lite.menu.FlashSize.1M512.build.flash_size_bytes=0x100000
-d1_mini_lite.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_pagesize=256
-d1_mini_lite.menu.FlashSize.1M512.upload.maximum_size=499696
-d1_mini_lite.menu.FlashSize.1M512.build.rfcal_addr=0xFC000
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-d1_mini_lite.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-d1_mini_lite.menu.LwIPVariant.v2mss536=v2 Lower Memory
-d1_mini_lite.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1_mini_lite.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1_mini_lite.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1_mini_lite.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-d1_mini_lite.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1_mini_lite.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1_mini_lite.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1_mini_lite.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-d1_mini_lite.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1_mini_lite.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_lite.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-d1_mini_lite.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1_mini_lite.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_lite.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1_mini_lite.menu.Debug.Disabled=Disabled
-d1_mini_lite.menu.Debug.Disabled.build.debug_port=
-d1_mini_lite.menu.Debug.Serial=Serial
-d1_mini_lite.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1_mini_lite.menu.Debug.Serial1=Serial1
-d1_mini_lite.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1_mini_lite.menu.DebugLevel.None____=None
-d1_mini_lite.menu.DebugLevel.None____.build.debug_level=
-d1_mini_lite.menu.DebugLevel.SSL=SSL
-d1_mini_lite.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1_mini_lite.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1_mini_lite.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1_mini_lite.menu.DebugLevel.CORE=CORE
-d1_mini_lite.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1_mini_lite.menu.DebugLevel.WIFI=WIFI
-d1_mini_lite.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1_mini_lite.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1_mini_lite.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1_mini_lite.menu.DebugLevel.UPDATER=UPDATER
-d1_mini_lite.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1_mini_lite.menu.DebugLevel.OTA=OTA
-d1_mini_lite.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1_mini_lite.menu.DebugLevel.OOM=OOM
-d1_mini_lite.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-d1_mini_lite.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini_lite.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1_mini_lite.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-d1_mini_lite.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1_mini_lite.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1_mini_lite.menu.FlashErase.none=Only Sketch
-d1_mini_lite.menu.FlashErase.none.upload.erase_cmd=
-d1_mini_lite.menu.FlashErase.sdk=Sketch + WiFi Settings
-d1_mini_lite.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-d1_mini_lite.menu.FlashErase.all=All Flash Contents
-d1_mini_lite.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-d1_mini_lite.menu.UploadSpeed.921600=921600
-d1_mini_lite.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini_lite.menu.UploadSpeed.9600=9600
-d1_mini_lite.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini_lite.menu.UploadSpeed.57600=57600
-d1_mini_lite.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini_lite.menu.UploadSpeed.115200=115200
-d1_mini_lite.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini_lite.menu.UploadSpeed.230400.linux=230400
-d1_mini_lite.menu.UploadSpeed.230400.macosx=230400
-d1_mini_lite.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini_lite.menu.UploadSpeed.256000.windows=256000
-d1_mini_lite.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini_lite.menu.UploadSpeed.460800.linux=460800
-d1_mini_lite.menu.UploadSpeed.460800.macosx=460800
-d1_mini_lite.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini_lite.menu.UploadSpeed.512000.windows=512000
-d1_mini_lite.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-d1.name=WeMos D1 R1
-d1.build.board=ESP8266_WEMOS_D1R1
-d1.build.variant=d1
-d1.upload.tool=esptool
-d1.upload.maximum_data_size=81920
-d1.upload.wait_for_upload_port=true
-d1.upload.erase_cmd=
-d1.serial.disableDTR=true
-d1.serial.disableRTS=true
-d1.build.mcu=esp8266
-d1.build.core=esp8266
-d1.build.spiffs_pagesize=256
-d1.build.debug_port=
-d1.build.debug_level=
-d1.menu.CpuFrequency.80=80 MHz
-d1.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1.menu.CpuFrequency.160=160 MHz
-d1.menu.CpuFrequency.160.build.f_cpu=160000000L
-d1.menu.VTable.flash=Flash
-d1.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-d1.menu.VTable.heap=Heap
-d1.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-d1.menu.VTable.iram=IRAM
-d1.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-d1.upload.resetmethod=nodemcu
-d1.build.flash_mode=dio
-d1.build.flash_freq=40
-d1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-d1.menu.FlashSize.4M1M.build.flash_size=4M
-d1.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-d1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-d1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-d1.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-d1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-d1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-d1.menu.FlashSize.4M2M=4M (2M SPIFFS)
-d1.menu.FlashSize.4M2M.build.flash_size=4M
-d1.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-d1.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-d1.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-d1.menu.FlashSize.4M2M.upload.maximum_size=1044464
-d1.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-d1.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-d1.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-d1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-d1.menu.FlashSize.4M3M.build.flash_size=4M
-d1.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-d1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-d1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-d1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-d1.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-d1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-d1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-d1.menu.LwIPVariant.v2mss536=v2 Lower Memory
-d1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-d1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-d1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-d1.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-d1.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-d1.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-d1.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-d1.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-d1.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-d1.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-d1.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-d1.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-d1.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-d1.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-d1.menu.Debug.Disabled=Disabled
-d1.menu.Debug.Disabled.build.debug_port=
-d1.menu.Debug.Serial=Serial
-d1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-d1.menu.Debug.Serial1=Serial1
-d1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-d1.menu.DebugLevel.None____=None
-d1.menu.DebugLevel.None____.build.debug_level=
-d1.menu.DebugLevel.SSL=SSL
-d1.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-d1.menu.DebugLevel.TLS_MEM=TLS_MEM
-d1.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-d1.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-d1.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-d1.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-d1.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-d1.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-d1.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-d1.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-d1.menu.DebugLevel.CORE=CORE
-d1.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-d1.menu.DebugLevel.WIFI=WIFI
-d1.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-d1.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-d1.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-d1.menu.DebugLevel.UPDATER=UPDATER
-d1.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-d1.menu.DebugLevel.OTA=OTA
-d1.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-d1.menu.DebugLevel.OOM=OOM
-d1.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-d1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-d1.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-d1.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-d1.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-d1.menu.FlashErase.none=Only Sketch
-d1.menu.FlashErase.none.upload.erase_cmd=
-d1.menu.FlashErase.sdk=Sketch + WiFi Settings
-d1.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-d1.menu.FlashErase.all=All Flash Contents
-d1.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-d1.menu.UploadSpeed.921600=921600
-d1.menu.UploadSpeed.921600.upload.speed=921600
-d1.menu.UploadSpeed.9600=9600
-d1.menu.UploadSpeed.9600.upload.speed=9600
-d1.menu.UploadSpeed.57600=57600
-d1.menu.UploadSpeed.57600.upload.speed=57600
-d1.menu.UploadSpeed.115200=115200
-d1.menu.UploadSpeed.115200.upload.speed=115200
-d1.menu.UploadSpeed.230400.linux=230400
-d1.menu.UploadSpeed.230400.macosx=230400
-d1.menu.UploadSpeed.230400.upload.speed=230400
-d1.menu.UploadSpeed.256000.windows=256000
-d1.menu.UploadSpeed.256000.upload.speed=256000
-d1.menu.UploadSpeed.460800.linux=460800
-d1.menu.UploadSpeed.460800.macosx=460800
-d1.menu.UploadSpeed.460800.upload.speed=460800
-d1.menu.UploadSpeed.512000.windows=512000
-d1.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-espino.name=ESPino (ESP-12 Module)
-espino.build.board=ESP8266_ESP12
-espino.build.variant=espino
-espino.upload.tool=esptool
-espino.upload.maximum_data_size=81920
-espino.upload.wait_for_upload_port=true
-espino.upload.erase_cmd=
-espino.serial.disableDTR=true
-espino.serial.disableRTS=true
-espino.build.mcu=esp8266
-espino.build.core=esp8266
-espino.build.spiffs_pagesize=256
-espino.build.debug_port=
-espino.build.debug_level=
-espino.menu.CpuFrequency.80=80 MHz
-espino.menu.CpuFrequency.80.build.f_cpu=80000000L
-espino.menu.CpuFrequency.160=160 MHz
-espino.menu.CpuFrequency.160.build.f_cpu=160000000L
-espino.menu.VTable.flash=Flash
-espino.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-espino.menu.VTable.heap=Heap
-espino.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-espino.menu.VTable.iram=IRAM
-espino.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-espino.menu.ResetMethod.ck=ck
-espino.menu.ResetMethod.ck.upload.resetmethod=ck
-espino.menu.ResetMethod.nodemcu=nodemcu
-espino.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espino.build.flash_mode=qio
-espino.build.flash_freq=40
-espino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espino.menu.FlashSize.4M1M.build.flash_size=4M
-espino.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-espino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espino.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espino.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-espino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espino.menu.FlashSize.4M2M=4M (2M SPIFFS)
-espino.menu.FlashSize.4M2M.build.flash_size=4M
-espino.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-espino.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-espino.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-espino.menu.FlashSize.4M2M.upload.maximum_size=1044464
-espino.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-espino.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-espino.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-espino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espino.menu.FlashSize.4M3M.build.flash_size=4M
-espino.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-espino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espino.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espino.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espino.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-espino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espino.menu.LwIPVariant.v2mss536=v2 Lower Memory
-espino.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espino.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espino.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espino.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-espino.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espino.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espino.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espino.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-espino.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espino.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espino.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-espino.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espino.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espino.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espino.menu.Debug.Disabled=Disabled
-espino.menu.Debug.Disabled.build.debug_port=
-espino.menu.Debug.Serial=Serial
-espino.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espino.menu.Debug.Serial1=Serial1
-espino.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espino.menu.DebugLevel.None____=None
-espino.menu.DebugLevel.None____.build.debug_level=
-espino.menu.DebugLevel.SSL=SSL
-espino.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espino.menu.DebugLevel.TLS_MEM=TLS_MEM
-espino.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espino.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espino.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espino.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espino.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espino.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espino.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espino.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espino.menu.DebugLevel.CORE=CORE
-espino.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espino.menu.DebugLevel.WIFI=WIFI
-espino.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espino.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espino.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espino.menu.DebugLevel.UPDATER=UPDATER
-espino.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espino.menu.DebugLevel.OTA=OTA
-espino.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espino.menu.DebugLevel.OOM=OOM
-espino.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-espino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-espino.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espino.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espino.menu.FlashErase.none=Only Sketch
-espino.menu.FlashErase.none.upload.erase_cmd=
-espino.menu.FlashErase.sdk=Sketch + WiFi Settings
-espino.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-espino.menu.FlashErase.all=All Flash Contents
-espino.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-espino.menu.UploadSpeed.115200=115200
-espino.menu.UploadSpeed.115200.upload.speed=115200
-espino.menu.UploadSpeed.9600=9600
-espino.menu.UploadSpeed.9600.upload.speed=9600
-espino.menu.UploadSpeed.57600=57600
-espino.menu.UploadSpeed.57600.upload.speed=57600
-espino.menu.UploadSpeed.230400.linux=230400
-espino.menu.UploadSpeed.230400.macosx=230400
-espino.menu.UploadSpeed.230400.upload.speed=230400
-espino.menu.UploadSpeed.256000.windows=256000
-espino.menu.UploadSpeed.256000.upload.speed=256000
-espino.menu.UploadSpeed.460800.linux=460800
-espino.menu.UploadSpeed.460800.macosx=460800
-espino.menu.UploadSpeed.460800.upload.speed=460800
-espino.menu.UploadSpeed.512000.windows=512000
-espino.menu.UploadSpeed.512000.upload.speed=512000
-espino.menu.UploadSpeed.921600=921600
-espino.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-espinotee.name=ThaiEasyElec's ESPino
-espinotee.build.board=ESP8266_ESP13
-espinotee.build.variant=espinotee
-espinotee.upload.tool=esptool
-espinotee.upload.maximum_data_size=81920
-espinotee.upload.wait_for_upload_port=true
-espinotee.upload.erase_cmd=
-espinotee.serial.disableDTR=true
-espinotee.serial.disableRTS=true
-espinotee.build.mcu=esp8266
-espinotee.build.core=esp8266
-espinotee.build.spiffs_pagesize=256
-espinotee.build.debug_port=
-espinotee.build.debug_level=
-espinotee.menu.CpuFrequency.80=80 MHz
-espinotee.menu.CpuFrequency.80.build.f_cpu=80000000L
-espinotee.menu.CpuFrequency.160=160 MHz
-espinotee.menu.CpuFrequency.160.build.f_cpu=160000000L
-espinotee.menu.VTable.flash=Flash
-espinotee.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-espinotee.menu.VTable.heap=Heap
-espinotee.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-espinotee.menu.VTable.iram=IRAM
-espinotee.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-espinotee.upload.resetmethod=nodemcu
-espinotee.build.flash_mode=qio
-espinotee.build.flash_freq=40
-espinotee.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espinotee.menu.FlashSize.4M1M.build.flash_size=4M
-espinotee.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-espinotee.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espinotee.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espinotee.menu.FlashSize.4M1M.upload.maximum_size=1044464
-espinotee.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-espinotee.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espinotee.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espinotee.menu.FlashSize.4M2M=4M (2M SPIFFS)
-espinotee.menu.FlashSize.4M2M.build.flash_size=4M
-espinotee.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-espinotee.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-espinotee.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-espinotee.menu.FlashSize.4M2M.upload.maximum_size=1044464
-espinotee.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-espinotee.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-espinotee.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-espinotee.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espinotee.menu.FlashSize.4M3M.build.flash_size=4M
-espinotee.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-espinotee.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espinotee.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-espinotee.menu.FlashSize.4M3M.upload.maximum_size=1044464
-espinotee.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-espinotee.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espinotee.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espinotee.menu.LwIPVariant.v2mss536=v2 Lower Memory
-espinotee.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-espinotee.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-espinotee.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-espinotee.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-espinotee.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-espinotee.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-espinotee.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-espinotee.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-espinotee.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-espinotee.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-espinotee.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-espinotee.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-espinotee.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-espinotee.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-espinotee.menu.Debug.Disabled=Disabled
-espinotee.menu.Debug.Disabled.build.debug_port=
-espinotee.menu.Debug.Serial=Serial
-espinotee.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espinotee.menu.Debug.Serial1=Serial1
-espinotee.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-espinotee.menu.DebugLevel.None____=None
-espinotee.menu.DebugLevel.None____.build.debug_level=
-espinotee.menu.DebugLevel.SSL=SSL
-espinotee.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-espinotee.menu.DebugLevel.TLS_MEM=TLS_MEM
-espinotee.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-espinotee.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-espinotee.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-espinotee.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-espinotee.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-espinotee.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-espinotee.menu.DebugLevel.CORE=CORE
-espinotee.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-espinotee.menu.DebugLevel.WIFI=WIFI
-espinotee.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-espinotee.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-espinotee.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-espinotee.menu.DebugLevel.UPDATER=UPDATER
-espinotee.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-espinotee.menu.DebugLevel.OTA=OTA
-espinotee.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-espinotee.menu.DebugLevel.OOM=OOM
-espinotee.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-espinotee.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espinotee.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-espinotee.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-espinotee.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-espinotee.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-espinotee.menu.FlashErase.none=Only Sketch
-espinotee.menu.FlashErase.none.upload.erase_cmd=
-espinotee.menu.FlashErase.sdk=Sketch + WiFi Settings
-espinotee.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-espinotee.menu.FlashErase.all=All Flash Contents
-espinotee.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-espinotee.menu.UploadSpeed.115200=115200
-espinotee.menu.UploadSpeed.115200.upload.speed=115200
-espinotee.menu.UploadSpeed.9600=9600
-espinotee.menu.UploadSpeed.9600.upload.speed=9600
-espinotee.menu.UploadSpeed.57600=57600
-espinotee.menu.UploadSpeed.57600.upload.speed=57600
-espinotee.menu.UploadSpeed.230400.linux=230400
-espinotee.menu.UploadSpeed.230400.macosx=230400
-espinotee.menu.UploadSpeed.230400.upload.speed=230400
-espinotee.menu.UploadSpeed.256000.windows=256000
-espinotee.menu.UploadSpeed.256000.upload.speed=256000
-espinotee.menu.UploadSpeed.460800.linux=460800
-espinotee.menu.UploadSpeed.460800.macosx=460800
-espinotee.menu.UploadSpeed.460800.upload.speed=460800
-espinotee.menu.UploadSpeed.512000.windows=512000
-espinotee.menu.UploadSpeed.512000.upload.speed=512000
-espinotee.menu.UploadSpeed.921600=921600
-espinotee.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-wifinfo.name=WifInfo
-wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12
-wifinfo.menu.ESPModule.ESP12.upload.maximum_size=1044464
-wifinfo.menu.ESPModule.ESP12.build.spiffs_pagesize=256
-wifinfo.menu.ESPModule.ESP12.build.flash_ld=eagle.flash.4m1m.ld
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_blocksize=4096
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_end=0xFB000
-wifinfo.menu.ESPModule.ESP12=ESP12 (4M/1M SPIFFS)
-wifinfo.menu.ESPModule.ESP12.build.spiffs_start=0x300000
-wifinfo.menu.ESPModule.ESP12.build.spiffs_end=0x3FB000
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_start=0xCB000
-wifinfo.menu.ESPModule.ESP07192.build.board=ESP8266_ESP07
-wifinfo.menu.ESPModule.ESP12.build.spiffs_blocksize=8192
-wifinfo.menu.ESPModule.ESP12.build.flash_size=4M
-wifinfo.build.board=WIFINFO
-wifinfo.build.variant=wifinfo
-wifinfo.menu.ESPModule.ESP07192.build.flash_ld=eagle.flash.1m192.ld
-wifinfo.menu.ESPModule.ESP07192.build.flash_size=1M
-wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K SPIFFS)
-wifinfo.menu.ESPModule.ESP07192.upload.maximum_size=827376
-wifinfo.upload.tool=esptool
-wifinfo.upload.maximum_data_size=81920
-wifinfo.upload.wait_for_upload_port=true
-wifinfo.upload.erase_cmd=
-wifinfo.serial.disableDTR=true
-wifinfo.serial.disableRTS=true
-wifinfo.build.mcu=esp8266
-wifinfo.build.core=esp8266
-wifinfo.build.spiffs_pagesize=256
-wifinfo.build.debug_port=
-wifinfo.build.debug_level=
-wifinfo.menu.CpuFrequency.80=80 MHz
-wifinfo.menu.CpuFrequency.80.build.f_cpu=80000000L
-wifinfo.menu.CpuFrequency.160=160 MHz
-wifinfo.menu.CpuFrequency.160.build.f_cpu=160000000L
-wifinfo.menu.VTable.flash=Flash
-wifinfo.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-wifinfo.menu.VTable.heap=Heap
-wifinfo.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-wifinfo.menu.VTable.iram=IRAM
-wifinfo.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-wifinfo.upload.resetmethod=nodemcu
-wifinfo.build.flash_mode=qio
-wifinfo.menu.FlashFreq.40=40MHz
-wifinfo.menu.FlashFreq.40.build.flash_freq=40
-wifinfo.menu.FlashFreq.80=80MHz
-wifinfo.menu.FlashFreq.80.build.flash_freq=80
-wifinfo.menu.FlashSize.1M0=1M (no SPIFFS)
-wifinfo.menu.FlashSize.1M0.build.flash_size=1M
-wifinfo.menu.FlashSize.1M0.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-wifinfo.menu.FlashSize.1M0.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M0.upload.maximum_size=1023984
-wifinfo.menu.FlashSize.1M0.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M64=1M (64K SPIFFS)
-wifinfo.menu.FlashSize.1M64.build.flash_size=1M
-wifinfo.menu.FlashSize.1M64.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-wifinfo.menu.FlashSize.1M64.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M64.upload.maximum_size=958448
-wifinfo.menu.FlashSize.1M64.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-wifinfo.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M128=1M (128K SPIFFS)
-wifinfo.menu.FlashSize.1M128.build.flash_size=1M
-wifinfo.menu.FlashSize.1M128.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-wifinfo.menu.FlashSize.1M128.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M128.upload.maximum_size=892912
-wifinfo.menu.FlashSize.1M128.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-wifinfo.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M144=1M (144K SPIFFS)
-wifinfo.menu.FlashSize.1M144.build.flash_size=1M
-wifinfo.menu.FlashSize.1M144.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-wifinfo.menu.FlashSize.1M144.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M144.upload.maximum_size=876528
-wifinfo.menu.FlashSize.1M144.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-wifinfo.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M160=1M (160K SPIFFS)
-wifinfo.menu.FlashSize.1M160.build.flash_size=1M
-wifinfo.menu.FlashSize.1M160.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-wifinfo.menu.FlashSize.1M160.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M160.upload.maximum_size=860144
-wifinfo.menu.FlashSize.1M160.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-wifinfo.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M192=1M (192K SPIFFS)
-wifinfo.menu.FlashSize.1M192.build.flash_size=1M
-wifinfo.menu.FlashSize.1M192.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-wifinfo.menu.FlashSize.1M192.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M192.upload.maximum_size=827376
-wifinfo.menu.FlashSize.1M192.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-wifinfo.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M256=1M (256K SPIFFS)
-wifinfo.menu.FlashSize.1M256.build.flash_size=1M
-wifinfo.menu.FlashSize.1M256.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-wifinfo.menu.FlashSize.1M256.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M256.upload.maximum_size=761840
-wifinfo.menu.FlashSize.1M256.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-wifinfo.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-wifinfo.menu.FlashSize.1M512=1M (512K SPIFFS)
-wifinfo.menu.FlashSize.1M512.build.flash_size=1M
-wifinfo.menu.FlashSize.1M512.build.flash_size_bytes=0x100000
-wifinfo.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-wifinfo.menu.FlashSize.1M512.build.spiffs_pagesize=256
-wifinfo.menu.FlashSize.1M512.upload.maximum_size=499696
-wifinfo.menu.FlashSize.1M512.build.rfcal_addr=0xFC000
-wifinfo.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-wifinfo.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-wifinfo.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-wifinfo.menu.LwIPVariant.v2mss536=v2 Lower Memory
-wifinfo.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-wifinfo.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-wifinfo.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-wifinfo.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-wifinfo.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-wifinfo.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-wifinfo.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-wifinfo.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-wifinfo.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-wifinfo.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-wifinfo.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-wifinfo.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-wifinfo.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-wifinfo.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-wifinfo.menu.Debug.Disabled=Disabled
-wifinfo.menu.Debug.Disabled.build.debug_port=
-wifinfo.menu.Debug.Serial=Serial
-wifinfo.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-wifinfo.menu.Debug.Serial1=Serial1
-wifinfo.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-wifinfo.menu.DebugLevel.None____=None
-wifinfo.menu.DebugLevel.None____.build.debug_level=
-wifinfo.menu.DebugLevel.SSL=SSL
-wifinfo.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-wifinfo.menu.DebugLevel.TLS_MEM=TLS_MEM
-wifinfo.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-wifinfo.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-wifinfo.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-wifinfo.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-wifinfo.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifinfo.menu.DebugLevel.CORE=CORE
-wifinfo.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-wifinfo.menu.DebugLevel.WIFI=WIFI
-wifinfo.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-wifinfo.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-wifinfo.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-wifinfo.menu.DebugLevel.UPDATER=UPDATER
-wifinfo.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-wifinfo.menu.DebugLevel.OTA=OTA
-wifinfo.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-wifinfo.menu.DebugLevel.OOM=OOM
-wifinfo.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-wifinfo.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-wifinfo.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-wifinfo.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-wifinfo.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-wifinfo.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-wifinfo.menu.FlashErase.none=Only Sketch
-wifinfo.menu.FlashErase.none.upload.erase_cmd=
-wifinfo.menu.FlashErase.sdk=Sketch + WiFi Settings
-wifinfo.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-wifinfo.menu.FlashErase.all=All Flash Contents
-wifinfo.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-wifinfo.menu.UploadSpeed.115200=115200
-wifinfo.menu.UploadSpeed.115200.upload.speed=115200
-wifinfo.menu.UploadSpeed.9600=9600
-wifinfo.menu.UploadSpeed.9600.upload.speed=9600
-wifinfo.menu.UploadSpeed.57600=57600
-wifinfo.menu.UploadSpeed.57600.upload.speed=57600
-wifinfo.menu.UploadSpeed.230400.linux=230400
-wifinfo.menu.UploadSpeed.230400.macosx=230400
-wifinfo.menu.UploadSpeed.230400.upload.speed=230400
-wifinfo.menu.UploadSpeed.256000.windows=256000
-wifinfo.menu.UploadSpeed.256000.upload.speed=256000
-wifinfo.menu.UploadSpeed.460800.linux=460800
-wifinfo.menu.UploadSpeed.460800.macosx=460800
-wifinfo.menu.UploadSpeed.460800.upload.speed=460800
-wifinfo.menu.UploadSpeed.512000.windows=512000
-wifinfo.menu.UploadSpeed.512000.upload.speed=512000
-wifinfo.menu.UploadSpeed.921600=921600
-wifinfo.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-arduino-esp8266.name=Arduino
-arduino-esp8266.menu.BoardModel.starottodeved.build.board=ESP8266_ARDUINO_STAR_OTTO
-arduino-esp8266.menu.BoardModel.primo.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-arduino-esp8266.menu.BoardModel.starottodeved.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-arduino-esp8266.menu.BoardModel.starottodeved.build.variant=arduino_uart
-arduino-esp8266.menu.BoardModel.unowifideved.build.board=ESP8266_ARDUINO_UNOWIFI
-arduino-esp8266.menu.BoardModel.unowifideved.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-arduino-esp8266.menu.BoardModel.primo=Primo
-arduino-esp8266.menu.BoardModel.unowifideved.build.variant=arduino_uart
-arduino-esp8266.menu.BoardModel.primo.build.variant=arduino_spi
-arduino-esp8266.menu.BoardModel.starottodeved=Star OTTO
-arduino-esp8266.build.board=ESP8266_ARDUINO
-arduino-esp8266.menu.BoardModel.primo.build.board=ESP8266_ARDUINO_PRIMO
-arduino-esp8266.menu.BoardModel.unowifideved=Uno WiFi
-arduino-esp8266.upload.tool=esptool
-arduino-esp8266.upload.maximum_data_size=81920
-arduino-esp8266.upload.wait_for_upload_port=true
-arduino-esp8266.upload.erase_cmd=
-arduino-esp8266.serial.disableDTR=true
-arduino-esp8266.serial.disableRTS=true
-arduino-esp8266.build.mcu=esp8266
-arduino-esp8266.build.core=esp8266
-arduino-esp8266.build.variant=generic
-arduino-esp8266.build.spiffs_pagesize=256
-arduino-esp8266.build.debug_port=
-arduino-esp8266.build.debug_level=
-arduino-esp8266.menu.CpuFrequency.80=80 MHz
-arduino-esp8266.menu.CpuFrequency.80.build.f_cpu=80000000L
-arduino-esp8266.menu.CpuFrequency.160=160 MHz
-arduino-esp8266.menu.CpuFrequency.160.build.f_cpu=160000000L
-arduino-esp8266.menu.VTable.flash=Flash
-arduino-esp8266.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-arduino-esp8266.menu.VTable.heap=Heap
-arduino-esp8266.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-arduino-esp8266.menu.VTable.iram=IRAM
-arduino-esp8266.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-arduino-esp8266.upload.resetmethod=ck
-arduino-esp8266.build.flash_mode=qio
-arduino-esp8266.build.flash_freq=40
-arduino-esp8266.menu.FlashSize.4M1M=4M (1M SPIFFS)
-arduino-esp8266.menu.FlashSize.4M1M.build.flash_size=4M
-arduino-esp8266.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-arduino-esp8266.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-arduino-esp8266.menu.FlashSize.4M1M.upload.maximum_size=1044464
-arduino-esp8266.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-arduino-esp8266.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-arduino-esp8266.menu.FlashSize.4M2M=4M (2M SPIFFS)
-arduino-esp8266.menu.FlashSize.4M2M.build.flash_size=4M
-arduino-esp8266.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-arduino-esp8266.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-arduino-esp8266.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-arduino-esp8266.menu.FlashSize.4M2M.upload.maximum_size=1044464
-arduino-esp8266.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-arduino-esp8266.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-arduino-esp8266.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-arduino-esp8266.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-arduino-esp8266.menu.FlashSize.4M3M=4M (3M SPIFFS)
-arduino-esp8266.menu.FlashSize.4M3M.build.flash_size=4M
-arduino-esp8266.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-arduino-esp8266.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-arduino-esp8266.menu.FlashSize.4M3M.upload.maximum_size=1044464
-arduino-esp8266.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-arduino-esp8266.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-arduino-esp8266.menu.LwIPVariant.v2mss536=v2 Lower Memory
-arduino-esp8266.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-arduino-esp8266.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-arduino-esp8266.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-arduino-esp8266.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-arduino-esp8266.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-arduino-esp8266.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-arduino-esp8266.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-arduino-esp8266.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-arduino-esp8266.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-arduino-esp8266.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-arduino-esp8266.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-arduino-esp8266.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-arduino-esp8266.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-arduino-esp8266.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-arduino-esp8266.menu.Debug.Disabled=Disabled
-arduino-esp8266.menu.Debug.Disabled.build.debug_port=
-arduino-esp8266.menu.Debug.Serial=Serial
-arduino-esp8266.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-arduino-esp8266.menu.Debug.Serial1=Serial1
-arduino-esp8266.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-arduino-esp8266.menu.DebugLevel.None____=None
-arduino-esp8266.menu.DebugLevel.None____.build.debug_level=
-arduino-esp8266.menu.DebugLevel.SSL=SSL
-arduino-esp8266.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-arduino-esp8266.menu.DebugLevel.TLS_MEM=TLS_MEM
-arduino-esp8266.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-arduino-esp8266.menu.DebugLevel.CORE=CORE
-arduino-esp8266.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-arduino-esp8266.menu.DebugLevel.WIFI=WIFI
-arduino-esp8266.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-arduino-esp8266.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-arduino-esp8266.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-arduino-esp8266.menu.DebugLevel.UPDATER=UPDATER
-arduino-esp8266.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-arduino-esp8266.menu.DebugLevel.OTA=OTA
-arduino-esp8266.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-arduino-esp8266.menu.DebugLevel.OOM=OOM
-arduino-esp8266.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-arduino-esp8266.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-arduino-esp8266.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-arduino-esp8266.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-arduino-esp8266.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-arduino-esp8266.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-arduino-esp8266.menu.FlashErase.none=Only Sketch
-arduino-esp8266.menu.FlashErase.none.upload.erase_cmd=
-arduino-esp8266.menu.FlashErase.sdk=Sketch + WiFi Settings
-arduino-esp8266.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-arduino-esp8266.menu.FlashErase.all=All Flash Contents
-arduino-esp8266.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-arduino-esp8266.menu.UploadSpeed.115200=115200
-arduino-esp8266.menu.UploadSpeed.115200.upload.speed=115200
-arduino-esp8266.menu.UploadSpeed.9600=9600
-arduino-esp8266.menu.UploadSpeed.9600.upload.speed=9600
-arduino-esp8266.menu.UploadSpeed.57600=57600
-arduino-esp8266.menu.UploadSpeed.57600.upload.speed=57600
-arduino-esp8266.menu.UploadSpeed.230400.linux=230400
-arduino-esp8266.menu.UploadSpeed.230400.macosx=230400
-arduino-esp8266.menu.UploadSpeed.230400.upload.speed=230400
-arduino-esp8266.menu.UploadSpeed.256000.windows=256000
-arduino-esp8266.menu.UploadSpeed.256000.upload.speed=256000
-arduino-esp8266.menu.UploadSpeed.460800.linux=460800
-arduino-esp8266.menu.UploadSpeed.460800.macosx=460800
-arduino-esp8266.menu.UploadSpeed.460800.upload.speed=460800
-arduino-esp8266.menu.UploadSpeed.512000.windows=512000
-arduino-esp8266.menu.UploadSpeed.512000.upload.speed=512000
-arduino-esp8266.menu.UploadSpeed.921600=921600
-arduino-esp8266.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-gen4iod.name=4D Systems gen4 IoD Range
-gen4iod.build.board=GEN4_IOD
-gen4iod.build.f_cpu=160000000L
-gen4iod.build.variant=generic
-gen4iod.upload.tool=esptool
-gen4iod.upload.maximum_data_size=81920
-gen4iod.upload.wait_for_upload_port=true
-gen4iod.upload.erase_cmd=
-gen4iod.serial.disableDTR=true
-gen4iod.serial.disableRTS=true
-gen4iod.build.mcu=esp8266
-gen4iod.build.core=esp8266
-gen4iod.build.spiffs_pagesize=256
-gen4iod.build.debug_port=
-gen4iod.build.debug_level=
-gen4iod.menu.CpuFrequency.80=80 MHz
-gen4iod.menu.CpuFrequency.80.build.f_cpu=80000000L
-gen4iod.menu.CpuFrequency.160=160 MHz
-gen4iod.menu.CpuFrequency.160.build.f_cpu=160000000L
-gen4iod.menu.VTable.flash=Flash
-gen4iod.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-gen4iod.menu.VTable.heap=Heap
-gen4iod.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-gen4iod.menu.VTable.iram=IRAM
-gen4iod.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-gen4iod.upload.resetmethod=nodemcu
-gen4iod.build.flash_mode=dio
-gen4iod.build.flash_freq=80
-gen4iod.menu.FlashSize.512K0=512K (no SPIFFS)
-gen4iod.menu.FlashSize.512K0.build.flash_size=512K
-gen4iod.menu.FlashSize.512K0.build.flash_size_bytes=0x80000
-gen4iod.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-gen4iod.menu.FlashSize.512K0.build.spiffs_pagesize=256
-gen4iod.menu.FlashSize.512K0.upload.maximum_size=499696
-gen4iod.menu.FlashSize.512K0.build.rfcal_addr=0x7C000
-gen4iod.menu.FlashSize.512K32=512K (32K SPIFFS)
-gen4iod.menu.FlashSize.512K32.build.flash_size=512K
-gen4iod.menu.FlashSize.512K32.build.flash_size_bytes=0x80000
-gen4iod.menu.FlashSize.512K32.build.flash_ld=eagle.flash.512k32.ld
-gen4iod.menu.FlashSize.512K32.build.spiffs_pagesize=256
-gen4iod.menu.FlashSize.512K32.upload.maximum_size=466928
-gen4iod.menu.FlashSize.512K32.build.rfcal_addr=0x7C000
-gen4iod.menu.FlashSize.512K32.build.spiffs_start=0x73000
-gen4iod.menu.FlashSize.512K32.build.spiffs_end=0x7B000
-gen4iod.menu.FlashSize.512K32.build.spiffs_blocksize=4096
-gen4iod.menu.FlashSize.512K64=512K (64K SPIFFS)
-gen4iod.menu.FlashSize.512K64.build.flash_size=512K
-gen4iod.menu.FlashSize.512K64.build.flash_size_bytes=0x80000
-gen4iod.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-gen4iod.menu.FlashSize.512K64.build.spiffs_pagesize=256
-gen4iod.menu.FlashSize.512K64.upload.maximum_size=434160
-gen4iod.menu.FlashSize.512K64.build.rfcal_addr=0x7C000
-gen4iod.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-gen4iod.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-gen4iod.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-gen4iod.menu.FlashSize.512K128=512K (128K SPIFFS)
-gen4iod.menu.FlashSize.512K128.build.flash_size=512K
-gen4iod.menu.FlashSize.512K128.build.flash_size_bytes=0x80000
-gen4iod.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-gen4iod.menu.FlashSize.512K128.build.spiffs_pagesize=256
-gen4iod.menu.FlashSize.512K128.upload.maximum_size=368624
-gen4iod.menu.FlashSize.512K128.build.rfcal_addr=0x7C000
-gen4iod.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-gen4iod.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-gen4iod.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-gen4iod.menu.LwIPVariant.v2mss536=v2 Lower Memory
-gen4iod.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-gen4iod.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-gen4iod.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-gen4iod.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-gen4iod.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-gen4iod.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-gen4iod.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-gen4iod.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-gen4iod.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-gen4iod.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-gen4iod.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-gen4iod.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-gen4iod.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-gen4iod.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-gen4iod.menu.Debug.Disabled=Disabled
-gen4iod.menu.Debug.Disabled.build.debug_port=
-gen4iod.menu.Debug.Serial=Serial
-gen4iod.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-gen4iod.menu.Debug.Serial1=Serial1
-gen4iod.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-gen4iod.menu.DebugLevel.None____=None
-gen4iod.menu.DebugLevel.None____.build.debug_level=
-gen4iod.menu.DebugLevel.SSL=SSL
-gen4iod.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-gen4iod.menu.DebugLevel.TLS_MEM=TLS_MEM
-gen4iod.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-gen4iod.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-gen4iod.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-gen4iod.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-gen4iod.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-gen4iod.menu.DebugLevel.CORE=CORE
-gen4iod.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-gen4iod.menu.DebugLevel.WIFI=WIFI
-gen4iod.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-gen4iod.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-gen4iod.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-gen4iod.menu.DebugLevel.UPDATER=UPDATER
-gen4iod.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-gen4iod.menu.DebugLevel.OTA=OTA
-gen4iod.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-gen4iod.menu.DebugLevel.OOM=OOM
-gen4iod.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-gen4iod.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-gen4iod.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-gen4iod.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-gen4iod.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-gen4iod.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-gen4iod.menu.FlashErase.none=Only Sketch
-gen4iod.menu.FlashErase.none.upload.erase_cmd=
-gen4iod.menu.FlashErase.sdk=Sketch + WiFi Settings
-gen4iod.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-gen4iod.menu.FlashErase.all=All Flash Contents
-gen4iod.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-gen4iod.menu.UploadSpeed.115200=115200
-gen4iod.menu.UploadSpeed.115200.upload.speed=115200
-gen4iod.menu.UploadSpeed.9600=9600
-gen4iod.menu.UploadSpeed.9600.upload.speed=9600
-gen4iod.menu.UploadSpeed.57600=57600
-gen4iod.menu.UploadSpeed.57600.upload.speed=57600
-gen4iod.menu.UploadSpeed.230400.linux=230400
-gen4iod.menu.UploadSpeed.230400.macosx=230400
-gen4iod.menu.UploadSpeed.230400.upload.speed=230400
-gen4iod.menu.UploadSpeed.256000.windows=256000
-gen4iod.menu.UploadSpeed.256000.upload.speed=256000
-gen4iod.menu.UploadSpeed.460800.linux=460800
-gen4iod.menu.UploadSpeed.460800.macosx=460800
-gen4iod.menu.UploadSpeed.460800.upload.speed=460800
-gen4iod.menu.UploadSpeed.512000.windows=512000
-gen4iod.menu.UploadSpeed.512000.upload.speed=512000
-gen4iod.menu.UploadSpeed.921600=921600
-gen4iod.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-oak.name=Digistump Oak
-oak.build.board=ESP8266_OAK
-oak.build.variant=oak
-oak.upload.maximum_size=1040368
-oak.upload.tool=esptool
-oak.upload.maximum_data_size=81920
-oak.upload.wait_for_upload_port=true
-oak.upload.erase_cmd=
-oak.serial.disableDTR=true
-oak.serial.disableRTS=true
-oak.build.mcu=esp8266
-oak.build.core=esp8266
-oak.build.spiffs_pagesize=256
-oak.build.debug_port=
-oak.build.debug_level=
-oak.menu.CpuFrequency.80=80 MHz
-oak.menu.CpuFrequency.80.build.f_cpu=80000000L
-oak.menu.CpuFrequency.160=160 MHz
-oak.menu.CpuFrequency.160.build.f_cpu=160000000L
-oak.menu.VTable.flash=Flash
-oak.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-oak.menu.VTable.heap=Heap
-oak.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-oak.menu.VTable.iram=IRAM
-oak.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-oak.upload.resetmethod=none
-oak.build.flash_mode=dio
-oak.build.flash_freq=40
-oak.menu.FlashSize.4M1M=4M (1M SPIFFS)
-oak.menu.FlashSize.4M1M.build.flash_size=4M
-oak.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-oak.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-oak.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-oak.menu.FlashSize.4M1M.upload.maximum_size=1044464
-oak.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-oak.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-oak.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-oak.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-oak.menu.FlashSize.4M2M=4M (2M SPIFFS)
-oak.menu.FlashSize.4M2M.build.flash_size=4M
-oak.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-oak.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-oak.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-oak.menu.FlashSize.4M2M.upload.maximum_size=1044464
-oak.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-oak.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-oak.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-oak.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-oak.menu.FlashSize.4M3M=4M (3M SPIFFS)
-oak.menu.FlashSize.4M3M.build.flash_size=4M
-oak.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-oak.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-oak.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-oak.menu.FlashSize.4M3M.upload.maximum_size=1044464
-oak.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-oak.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-oak.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-oak.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-oak.menu.LwIPVariant.v2mss536=v2 Lower Memory
-oak.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-oak.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-oak.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-oak.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-oak.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-oak.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-oak.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-oak.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-oak.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-oak.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-oak.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-oak.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-oak.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-oak.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-oak.menu.Debug.Disabled=Disabled
-oak.menu.Debug.Disabled.build.debug_port=
-oak.menu.Debug.Serial=Serial
-oak.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-oak.menu.Debug.Serial1=Serial1
-oak.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-oak.menu.DebugLevel.None____=None
-oak.menu.DebugLevel.None____.build.debug_level=
-oak.menu.DebugLevel.SSL=SSL
-oak.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-oak.menu.DebugLevel.TLS_MEM=TLS_MEM
-oak.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-oak.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-oak.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-oak.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-oak.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-oak.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-oak.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-oak.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-oak.menu.DebugLevel.CORE=CORE
-oak.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-oak.menu.DebugLevel.WIFI=WIFI
-oak.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-oak.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-oak.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-oak.menu.DebugLevel.UPDATER=UPDATER
-oak.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-oak.menu.DebugLevel.OTA=OTA
-oak.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-oak.menu.DebugLevel.OOM=OOM
-oak.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-oak.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-oak.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-oak.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-oak.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-oak.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-oak.menu.FlashErase.none=Only Sketch
-oak.menu.FlashErase.none.upload.erase_cmd=
-oak.menu.FlashErase.sdk=Sketch + WiFi Settings
-oak.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-oak.menu.FlashErase.all=All Flash Contents
-oak.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-oak.menu.UploadSpeed.921600=921600
-oak.menu.UploadSpeed.921600.upload.speed=921600
-oak.menu.UploadSpeed.9600=9600
-oak.menu.UploadSpeed.9600.upload.speed=9600
-oak.menu.UploadSpeed.57600=57600
-oak.menu.UploadSpeed.57600.upload.speed=57600
-oak.menu.UploadSpeed.115200=115200
-oak.menu.UploadSpeed.115200.upload.speed=115200
-oak.menu.UploadSpeed.230400.linux=230400
-oak.menu.UploadSpeed.230400.macosx=230400
-oak.menu.UploadSpeed.230400.upload.speed=230400
-oak.menu.UploadSpeed.256000.windows=256000
-oak.menu.UploadSpeed.256000.upload.speed=256000
-oak.menu.UploadSpeed.460800.linux=460800
-oak.menu.UploadSpeed.460800.macosx=460800
-oak.menu.UploadSpeed.460800.upload.speed=460800
-oak.menu.UploadSpeed.512000.windows=512000
-oak.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-wifiduino.name=WiFiduino
-wifiduino.build.board=WIFIDUINO_ESP8266
-wifiduino.build.variant=wifiduino
-wifiduino.upload.tool=esptool
-wifiduino.upload.maximum_data_size=81920
-wifiduino.upload.wait_for_upload_port=true
-wifiduino.upload.erase_cmd=
-wifiduino.serial.disableDTR=true
-wifiduino.serial.disableRTS=true
-wifiduino.build.mcu=esp8266
-wifiduino.build.core=esp8266
-wifiduino.build.spiffs_pagesize=256
-wifiduino.build.debug_port=
-wifiduino.build.debug_level=
-wifiduino.menu.CpuFrequency.80=80 MHz
-wifiduino.menu.CpuFrequency.80.build.f_cpu=80000000L
-wifiduino.menu.CpuFrequency.160=160 MHz
-wifiduino.menu.CpuFrequency.160.build.f_cpu=160000000L
-wifiduino.menu.VTable.flash=Flash
-wifiduino.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-wifiduino.menu.VTable.heap=Heap
-wifiduino.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-wifiduino.menu.VTable.iram=IRAM
-wifiduino.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-wifiduino.upload.resetmethod=nodemcu
-wifiduino.build.flash_mode=dio
-wifiduino.build.flash_freq=40
-wifiduino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-wifiduino.menu.FlashSize.4M1M.build.flash_size=4M
-wifiduino.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-wifiduino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-wifiduino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-wifiduino.menu.FlashSize.4M1M.upload.maximum_size=1044464
-wifiduino.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-wifiduino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-wifiduino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-wifiduino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-wifiduino.menu.FlashSize.4M2M=4M (2M SPIFFS)
-wifiduino.menu.FlashSize.4M2M.build.flash_size=4M
-wifiduino.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-wifiduino.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-wifiduino.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-wifiduino.menu.FlashSize.4M2M.upload.maximum_size=1044464
-wifiduino.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-wifiduino.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-wifiduino.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-wifiduino.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-wifiduino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-wifiduino.menu.FlashSize.4M3M.build.flash_size=4M
-wifiduino.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-wifiduino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-wifiduino.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-wifiduino.menu.FlashSize.4M3M.upload.maximum_size=1044464
-wifiduino.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-wifiduino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-wifiduino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-wifiduino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-wifiduino.menu.LwIPVariant.v2mss536=v2 Lower Memory
-wifiduino.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-wifiduino.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-wifiduino.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-wifiduino.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-wifiduino.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-wifiduino.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-wifiduino.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-wifiduino.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-wifiduino.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-wifiduino.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-wifiduino.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-wifiduino.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-wifiduino.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-wifiduino.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-wifiduino.menu.Debug.Disabled=Disabled
-wifiduino.menu.Debug.Disabled.build.debug_port=
-wifiduino.menu.Debug.Serial=Serial
-wifiduino.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-wifiduino.menu.Debug.Serial1=Serial1
-wifiduino.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-wifiduino.menu.DebugLevel.None____=None
-wifiduino.menu.DebugLevel.None____.build.debug_level=
-wifiduino.menu.DebugLevel.SSL=SSL
-wifiduino.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-wifiduino.menu.DebugLevel.TLS_MEM=TLS_MEM
-wifiduino.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-wifiduino.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-wifiduino.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-wifiduino.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-wifiduino.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-wifiduino.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-wifiduino.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-wifiduino.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-wifiduino.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-wifiduino.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-wifiduino.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-wifiduino.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-wifiduino.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wifiduino.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-wifiduino.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wifiduino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-wifiduino.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifiduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-wifiduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wifiduino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-wifiduino.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wifiduino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-wifiduino.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifiduino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wifiduino.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifiduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wifiduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifiduino.menu.DebugLevel.CORE=CORE
-wifiduino.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-wifiduino.menu.DebugLevel.WIFI=WIFI
-wifiduino.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-wifiduino.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-wifiduino.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-wifiduino.menu.DebugLevel.UPDATER=UPDATER
-wifiduino.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-wifiduino.menu.DebugLevel.OTA=OTA
-wifiduino.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-wifiduino.menu.DebugLevel.OOM=OOM
-wifiduino.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-wifiduino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-wifiduino.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-wifiduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-wifiduino.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-wifiduino.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-wifiduino.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-wifiduino.menu.FlashErase.none=Only Sketch
-wifiduino.menu.FlashErase.none.upload.erase_cmd=
-wifiduino.menu.FlashErase.sdk=Sketch + WiFi Settings
-wifiduino.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-wifiduino.menu.FlashErase.all=All Flash Contents
-wifiduino.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-wifiduino.menu.UploadSpeed.921600=921600
-wifiduino.menu.UploadSpeed.921600.upload.speed=921600
-wifiduino.menu.UploadSpeed.9600=9600
-wifiduino.menu.UploadSpeed.9600.upload.speed=9600
-wifiduino.menu.UploadSpeed.57600=57600
-wifiduino.menu.UploadSpeed.57600.upload.speed=57600
-wifiduino.menu.UploadSpeed.115200=115200
-wifiduino.menu.UploadSpeed.115200.upload.speed=115200
-wifiduino.menu.UploadSpeed.230400.linux=230400
-wifiduino.menu.UploadSpeed.230400.macosx=230400
-wifiduino.menu.UploadSpeed.230400.upload.speed=230400
-wifiduino.menu.UploadSpeed.256000.windows=256000
-wifiduino.menu.UploadSpeed.256000.upload.speed=256000
-wifiduino.menu.UploadSpeed.460800.linux=460800
-wifiduino.menu.UploadSpeed.460800.macosx=460800
-wifiduino.menu.UploadSpeed.460800.upload.speed=460800
-wifiduino.menu.UploadSpeed.512000.windows=512000
-wifiduino.menu.UploadSpeed.512000.upload.speed=512000
-
-##############################################################
-wifi_slot.name=Amperka WiFi Slot
-wifi_slot.build.board=AMPERKA_WIFI_SLOT
-wifi_slot.build.variant=wifi_slot
-wifi_slot.upload.tool=esptool
-wifi_slot.upload.maximum_data_size=81920
-wifi_slot.upload.wait_for_upload_port=true
-wifi_slot.upload.erase_cmd=
-wifi_slot.serial.disableDTR=true
-wifi_slot.serial.disableRTS=true
-wifi_slot.build.mcu=esp8266
-wifi_slot.build.core=esp8266
-wifi_slot.build.spiffs_pagesize=256
-wifi_slot.build.debug_port=
-wifi_slot.build.debug_level=
-wifi_slot.menu.CpuFrequency.80=80 MHz
-wifi_slot.menu.CpuFrequency.80.build.f_cpu=80000000L
-wifi_slot.menu.CpuFrequency.160=160 MHz
-wifi_slot.menu.CpuFrequency.160.build.f_cpu=160000000L
-wifi_slot.menu.VTable.flash=Flash
-wifi_slot.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-wifi_slot.menu.VTable.heap=Heap
-wifi_slot.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-wifi_slot.menu.VTable.iram=IRAM
-wifi_slot.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-wifi_slot.upload.resetmethod=nodemcu
-wifi_slot.menu.FlashFreq.40=40MHz
-wifi_slot.menu.FlashFreq.40.build.flash_freq=40
-wifi_slot.menu.FlashFreq.80=80MHz
-wifi_slot.menu.FlashFreq.80.build.flash_freq=80
-wifi_slot.menu.FlashMode.qio=QIO
-wifi_slot.menu.FlashMode.qio.build.flash_mode=qio
-wifi_slot.menu.FlashMode.qout=QOUT
-wifi_slot.menu.FlashMode.qout.build.flash_mode=qout
-wifi_slot.menu.FlashMode.dio=DIO
-wifi_slot.menu.FlashMode.dio.build.flash_mode=dio
-wifi_slot.menu.FlashMode.dout=DOUT
-wifi_slot.menu.FlashMode.dout.build.flash_mode=dout
-wifi_slot.menu.FlashSize.1M0=1M (no SPIFFS)
-wifi_slot.menu.FlashSize.1M0.build.flash_size=1M
-wifi_slot.menu.FlashSize.1M0.build.flash_size_bytes=0x100000
-wifi_slot.menu.FlashSize.1M0.build.flash_ld=eagle.flash.1m0.ld
-wifi_slot.menu.FlashSize.1M0.build.spiffs_pagesize=256
-wifi_slot.menu.FlashSize.1M0.upload.maximum_size=1023984
-wifi_slot.menu.FlashSize.1M0.build.rfcal_addr=0xFC000
-wifi_slot.menu.FlashSize.1M64=1M (64K SPIFFS)
-wifi_slot.menu.FlashSize.1M64.build.flash_size=1M
-wifi_slot.menu.FlashSize.1M64.build.flash_size_bytes=0x100000
-wifi_slot.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-wifi_slot.menu.FlashSize.1M64.build.spiffs_pagesize=256
-wifi_slot.menu.FlashSize.1M64.upload.maximum_size=958448
-wifi_slot.menu.FlashSize.1M64.build.rfcal_addr=0xFC000
-wifi_slot.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-wifi_slot.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-wifi_slot.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-wifi_slot.menu.FlashSize.1M128=1M (128K SPIFFS)
-wifi_slot.menu.FlashSize.1M128.build.flash_size=1M
-wifi_slot.menu.FlashSize.1M128.build.flash_size_bytes=0x100000
-wifi_slot.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-wifi_slot.menu.FlashSize.1M128.build.spiffs_pagesize=256
-wifi_slot.menu.FlashSize.1M128.upload.maximum_size=892912
-wifi_slot.menu.FlashSize.1M128.build.rfcal_addr=0xFC000
-wifi_slot.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-wifi_slot.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-wifi_slot.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-wifi_slot.menu.FlashSize.1M144=1M (144K SPIFFS)
-wifi_slot.menu.FlashSize.1M144.build.flash_size=1M
-wifi_slot.menu.FlashSize.1M144.build.flash_size_bytes=0x100000
-wifi_slot.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-wifi_slot.menu.FlashSize.1M144.build.spiffs_pagesize=256
-wifi_slot.menu.FlashSize.1M144.upload.maximum_size=876528
-wifi_slot.menu.FlashSize.1M144.build.rfcal_addr=0xFC000
-wifi_slot.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-wifi_slot.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-wifi_slot.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-wifi_slot.menu.FlashSize.1M160=1M (160K SPIFFS)
-wifi_slot.menu.FlashSize.1M160.build.flash_size=1M
-wifi_slot.menu.FlashSize.1M160.build.flash_size_bytes=0x100000
-wifi_slot.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-wifi_slot.menu.FlashSize.1M160.build.spiffs_pagesize=256
-wifi_slot.menu.FlashSize.1M160.upload.maximum_size=860144
-wifi_slot.menu.FlashSize.1M160.build.rfcal_addr=0xFC000
-wifi_slot.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-wifi_slot.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-wifi_slot.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-wifi_slot.menu.FlashSize.1M192=1M (192K SPIFFS)
-wifi_slot.menu.FlashSize.1M192.build.flash_size=1M
-wifi_slot.menu.FlashSize.1M192.build.flash_size_bytes=0x100000
-wifi_slot.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-wifi_slot.menu.FlashSize.1M192.build.spiffs_pagesize=256
-wifi_slot.menu.FlashSize.1M192.upload.maximum_size=827376
-wifi_slot.menu.FlashSize.1M192.build.rfcal_addr=0xFC000
-wifi_slot.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-wifi_slot.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-wifi_slot.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-wifi_slot.menu.FlashSize.1M256=1M (256K SPIFFS)
-wifi_slot.menu.FlashSize.1M256.build.flash_size=1M
-wifi_slot.menu.FlashSize.1M256.build.flash_size_bytes=0x100000
-wifi_slot.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-wifi_slot.menu.FlashSize.1M256.build.spiffs_pagesize=256
-wifi_slot.menu.FlashSize.1M256.upload.maximum_size=761840
-wifi_slot.menu.FlashSize.1M256.build.rfcal_addr=0xFC000
-wifi_slot.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-wifi_slot.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-wifi_slot.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-wifi_slot.menu.FlashSize.1M512=1M (512K SPIFFS)
-wifi_slot.menu.FlashSize.1M512.build.flash_size=1M
-wifi_slot.menu.FlashSize.1M512.build.flash_size_bytes=0x100000
-wifi_slot.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-wifi_slot.menu.FlashSize.1M512.build.spiffs_pagesize=256
-wifi_slot.menu.FlashSize.1M512.upload.maximum_size=499696
-wifi_slot.menu.FlashSize.1M512.build.rfcal_addr=0xFC000
-wifi_slot.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-wifi_slot.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-wifi_slot.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-wifi_slot.menu.FlashSize.2M=2M (1M SPIFFS)
-wifi_slot.menu.FlashSize.2M.build.flash_size=2M
-wifi_slot.menu.FlashSize.2M.build.flash_size_bytes=0x200000
-wifi_slot.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld
-wifi_slot.menu.FlashSize.2M.build.spiffs_pagesize=256
-wifi_slot.menu.FlashSize.2M.upload.maximum_size=1044464
-wifi_slot.menu.FlashSize.2M.build.rfcal_addr=0x1FC000
-wifi_slot.menu.FlashSize.2M.build.spiffs_start=0x100000
-wifi_slot.menu.FlashSize.2M.build.spiffs_end=0x1FB000
-wifi_slot.menu.FlashSize.2M.build.spiffs_blocksize=8192
-wifi_slot.menu.LwIPVariant.v2mss536=v2 Lower Memory
-wifi_slot.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-wifi_slot.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-wifi_slot.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-wifi_slot.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-wifi_slot.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-wifi_slot.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-wifi_slot.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-wifi_slot.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-wifi_slot.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-wifi_slot.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-wifi_slot.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-wifi_slot.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-wifi_slot.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-wifi_slot.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-wifi_slot.menu.Debug.Disabled=Disabled
-wifi_slot.menu.Debug.Disabled.build.debug_port=
-wifi_slot.menu.Debug.Serial=Serial
-wifi_slot.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-wifi_slot.menu.Debug.Serial1=Serial1
-wifi_slot.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-wifi_slot.menu.DebugLevel.None____=None
-wifi_slot.menu.DebugLevel.None____.build.debug_level=
-wifi_slot.menu.DebugLevel.SSL=SSL
-wifi_slot.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-wifi_slot.menu.DebugLevel.TLS_MEM=TLS_MEM
-wifi_slot.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-wifi_slot.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-wifi_slot.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-wifi_slot.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-wifi_slot.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-wifi_slot.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-wifi_slot.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-wifi_slot.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-wifi_slot.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-wifi_slot.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-wifi_slot.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-wifi_slot.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-wifi_slot.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wifi_slot.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-wifi_slot.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wifi_slot.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-wifi_slot.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifi_slot.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-wifi_slot.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wifi_slot.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-wifi_slot.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wifi_slot.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-wifi_slot.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifi_slot.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wifi_slot.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifi_slot.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wifi_slot.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wifi_slot.menu.DebugLevel.CORE=CORE
-wifi_slot.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-wifi_slot.menu.DebugLevel.WIFI=WIFI
-wifi_slot.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-wifi_slot.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-wifi_slot.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-wifi_slot.menu.DebugLevel.UPDATER=UPDATER
-wifi_slot.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-wifi_slot.menu.DebugLevel.OTA=OTA
-wifi_slot.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-wifi_slot.menu.DebugLevel.OOM=OOM
-wifi_slot.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-wifi_slot.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-wifi_slot.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-wifi_slot.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-wifi_slot.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-wifi_slot.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-wifi_slot.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-wifi_slot.menu.FlashErase.none=Only Sketch
-wifi_slot.menu.FlashErase.none.upload.erase_cmd=
-wifi_slot.menu.FlashErase.sdk=Sketch + WiFi Settings
-wifi_slot.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-wifi_slot.menu.FlashErase.all=All Flash Contents
-wifi_slot.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-wifi_slot.menu.UploadSpeed.115200=115200
-wifi_slot.menu.UploadSpeed.115200.upload.speed=115200
-wifi_slot.menu.UploadSpeed.9600=9600
-wifi_slot.menu.UploadSpeed.9600.upload.speed=9600
-wifi_slot.menu.UploadSpeed.57600=57600
-wifi_slot.menu.UploadSpeed.57600.upload.speed=57600
-wifi_slot.menu.UploadSpeed.230400.linux=230400
-wifi_slot.menu.UploadSpeed.230400.macosx=230400
-wifi_slot.menu.UploadSpeed.230400.upload.speed=230400
-wifi_slot.menu.UploadSpeed.256000.windows=256000
-wifi_slot.menu.UploadSpeed.256000.upload.speed=256000
-wifi_slot.menu.UploadSpeed.460800.linux=460800
-wifi_slot.menu.UploadSpeed.460800.macosx=460800
-wifi_slot.menu.UploadSpeed.460800.upload.speed=460800
-wifi_slot.menu.UploadSpeed.512000.windows=512000
-wifi_slot.menu.UploadSpeed.512000.upload.speed=512000
-wifi_slot.menu.UploadSpeed.921600=921600
-wifi_slot.menu.UploadSpeed.921600.upload.speed=921600
-
-##############################################################
-wiolink.name=Seeed Wio Link
-wiolink.build.board=ESP8266_WIO_LINK
-wiolink.build.variant=wiolink
-wiolink.upload.tool=esptool
-wiolink.upload.maximum_data_size=81920
-wiolink.upload.wait_for_upload_port=true
-wiolink.upload.erase_cmd=
-wiolink.serial.disableDTR=true
-wiolink.serial.disableRTS=true
-wiolink.build.mcu=esp8266
-wiolink.build.core=esp8266
-wiolink.build.spiffs_pagesize=256
-wiolink.build.debug_port=
-wiolink.build.debug_level=
-wiolink.menu.CpuFrequency.80=80 MHz
-wiolink.menu.CpuFrequency.80.build.f_cpu=80000000L
-wiolink.menu.CpuFrequency.160=160 MHz
-wiolink.menu.CpuFrequency.160.build.f_cpu=160000000L
-wiolink.menu.VTable.flash=Flash
-wiolink.menu.VTable.flash.build.vtable_flags=-DVTABLES_IN_FLASH
-wiolink.menu.VTable.heap=Heap
-wiolink.menu.VTable.heap.build.vtable_flags=-DVTABLES_IN_DRAM
-wiolink.menu.VTable.iram=IRAM
-wiolink.menu.VTable.iram.build.vtable_flags=-DVTABLES_IN_IRAM
-wiolink.upload.resetmethod=nodemcu
-wiolink.build.flash_mode=qio
-wiolink.build.flash_freq=40
-wiolink.menu.FlashSize.4M1M=4M (1M SPIFFS)
-wiolink.menu.FlashSize.4M1M.build.flash_size=4M
-wiolink.menu.FlashSize.4M1M.build.flash_size_bytes=0x400000
-wiolink.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-wiolink.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-wiolink.menu.FlashSize.4M1M.upload.maximum_size=1044464
-wiolink.menu.FlashSize.4M1M.build.rfcal_addr=0x3FC000
-wiolink.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-wiolink.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-wiolink.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-wiolink.menu.FlashSize.4M2M=4M (2M SPIFFS)
-wiolink.menu.FlashSize.4M2M.build.flash_size=4M
-wiolink.menu.FlashSize.4M2M.build.flash_size_bytes=0x400000
-wiolink.menu.FlashSize.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-wiolink.menu.FlashSize.4M2M.build.spiffs_pagesize=256
-wiolink.menu.FlashSize.4M2M.upload.maximum_size=1044464
-wiolink.menu.FlashSize.4M2M.build.rfcal_addr=0x3FC000
-wiolink.menu.FlashSize.4M2M.build.spiffs_start=0x200000
-wiolink.menu.FlashSize.4M2M.build.spiffs_end=0x3FB000
-wiolink.menu.FlashSize.4M2M.build.spiffs_blocksize=8192
-wiolink.menu.FlashSize.4M3M=4M (3M SPIFFS)
-wiolink.menu.FlashSize.4M3M.build.flash_size=4M
-wiolink.menu.FlashSize.4M3M.build.flash_size_bytes=0x400000
-wiolink.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-wiolink.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-wiolink.menu.FlashSize.4M3M.upload.maximum_size=1044464
-wiolink.menu.FlashSize.4M3M.build.rfcal_addr=0x3FC000
-wiolink.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-wiolink.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-wiolink.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-wiolink.menu.LwIPVariant.v2mss536=v2 Lower Memory
-wiolink.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include
-wiolink.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2
-wiolink.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536
-wiolink.menu.LwIPVariant.v2mss1460=v2 Higher Bandwidth
-wiolink.menu.LwIPVariant.v2mss1460.build.lwip_include=lwip2/include
-wiolink.menu.LwIPVariant.v2mss1460.build.lwip_lib=-llwip2_1460
-wiolink.menu.LwIPVariant.v2mss1460.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460
-wiolink.menu.LwIPVariant.Prebuilt=v1.4 Higher Bandwidth
-wiolink.menu.LwIPVariant.Prebuilt.build.lwip_lib=-llwip_gcc
-wiolink.menu.LwIPVariant.Prebuilt.build.lwip_flags=-DLWIP_OPEN_SRC
-wiolink.menu.LwIPVariant.OpenSource=v1.4 Compile from source
-wiolink.menu.LwIPVariant.OpenSource.build.lwip_lib=-llwip_src
-wiolink.menu.LwIPVariant.OpenSource.build.lwip_flags=-DLWIP_OPEN_SRC
-wiolink.menu.LwIPVariant.OpenSource.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-wiolink.menu.Debug.Disabled=Disabled
-wiolink.menu.Debug.Disabled.build.debug_port=
-wiolink.menu.Debug.Serial=Serial
-wiolink.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-wiolink.menu.Debug.Serial1=Serial1
-wiolink.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-wiolink.menu.DebugLevel.None____=None
-wiolink.menu.DebugLevel.None____.build.debug_level=
-wiolink.menu.DebugLevel.SSL=SSL
-wiolink.menu.DebugLevel.SSL.build.debug_level= -DDEBUG_ESP_SSL
-wiolink.menu.DebugLevel.TLS_MEM=TLS_MEM
-wiolink.menu.DebugLevel.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
-wiolink.menu.DebugLevel.HTTP_CLIENT=HTTP_CLIENT
-wiolink.menu.DebugLevel.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
-wiolink.menu.DebugLevel.HTTP_SERVER=HTTP_SERVER
-wiolink.menu.DebugLevel.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
-wiolink.menu.DebugLevel.SSLTLS_MEM=SSL+TLS_MEM
-wiolink.menu.DebugLevel.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
-wiolink.menu.DebugLevel.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
-wiolink.menu.DebugLevel.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
-wiolink.menu.DebugLevel.SSLHTTP_SERVER=SSL+HTTP_SERVER
-wiolink.menu.DebugLevel.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
-wiolink.menu.DebugLevel.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
-wiolink.menu.DebugLevel.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wiolink.menu.DebugLevel.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
-wiolink.menu.DebugLevel.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wiolink.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
-wiolink.menu.DebugLevel.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wiolink.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
-wiolink.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
-wiolink.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
-wiolink.menu.DebugLevel.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
-wiolink.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
-wiolink.menu.DebugLevel.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wiolink.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wiolink.menu.DebugLevel.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wiolink.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
-wiolink.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
-wiolink.menu.DebugLevel.CORE=CORE
-wiolink.menu.DebugLevel.CORE.build.debug_level= -DDEBUG_ESP_CORE
-wiolink.menu.DebugLevel.WIFI=WIFI
-wiolink.menu.DebugLevel.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
-wiolink.menu.DebugLevel.HTTP_UPDATE=HTTP_UPDATE
-wiolink.menu.DebugLevel.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
-wiolink.menu.DebugLevel.UPDATER=UPDATER
-wiolink.menu.DebugLevel.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
-wiolink.menu.DebugLevel.OTA=OTA
-wiolink.menu.DebugLevel.OTA.build.debug_level= -DDEBUG_ESP_OTA
-wiolink.menu.DebugLevel.OOM=OOM
-wiolink.menu.DebugLevel.OOM.build.debug_level= -DDEBUG_ESP_OOM
-wiolink.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-wiolink.menu.DebugLevel.COREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-wiolink.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM
-wiolink.menu.DebugLevel.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM
-wiolink.menu.DebugLevel.NoAssert-NDEBUG=NoAssert-NDEBUG
-wiolink.menu.DebugLevel.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
-wiolink.menu.FlashErase.none=Only Sketch
-wiolink.menu.FlashErase.none.upload.erase_cmd=
-wiolink.menu.FlashErase.sdk=Sketch + WiFi Settings
-wiolink.menu.FlashErase.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
-wiolink.menu.FlashErase.all=All Flash Contents
-wiolink.menu.FlashErase.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
-wiolink.menu.UploadSpeed.115200=115200
-wiolink.menu.UploadSpeed.115200.upload.speed=115200
-wiolink.menu.UploadSpeed.9600=9600
-wiolink.menu.UploadSpeed.9600.upload.speed=9600
-wiolink.menu.UploadSpeed.57600=57600
-wiolink.menu.UploadSpeed.57600.upload.speed=57600
-wiolink.menu.UploadSpeed.230400.linux=230400
-wiolink.menu.UploadSpeed.230400.macosx=230400
-wiolink.menu.UploadSpeed.230400.upload.speed=230400
-wiolink.menu.UploadSpeed.256000.windows=256000
-wiolink.menu.UploadSpeed.256000.upload.speed=256000
-wiolink.menu.UploadSpeed.460800.linux=460800
-wiolink.menu.UploadSpeed.460800.macosx=460800
-wiolink.menu.UploadSpeed.460800.upload.speed=460800
-wiolink.menu.UploadSpeed.512000.windows=512000
-wiolink.menu.UploadSpeed.512000.upload.speed=512000
-wiolink.menu.UploadSpeed.921600=921600
-wiolink.menu.UploadSpeed.921600.upload.speed=921600
-
diff --git a/arduino/version 2.4.2/platform.txt b/arduino/version 2.4.2/platform.txt
deleted file mode 100644
index 097ec545c..000000000
--- a/arduino/version 2.4.2/platform.txt
+++ /dev/null
@@ -1,143 +0,0 @@
-
-# ESP8266 platform
-# ------------------------------
-
-# For more info:
-# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification
-
-name=ESP8266 Modules
-version=2.4.2
-
-
-
-
-compiler.warning_flags=-w
-compiler.warning_flags.none=-w
-compiler.warning_flags.default=
-compiler.warning_flags.more=-Wall
-compiler.warning_flags.all=-Wall -Wextra
-
-build.lwip_lib=-llwip_gcc
-build.lwip_include=lwip/include
-build.lwip_flags=-DLWIP_OPEN_SRC
-
-build.vtable_flags=-DVTABLES_IN_FLASH
-
-#build.float=-u _printf_float -u _scanf_float
-build.float=
-build.led=
-build.noextra4kheap=
-
-compiler.path={runtime.tools.xtensa-lx106-elf-gcc.path}/bin/
-compiler.sdk.path={runtime.platform.path}/tools/sdk
-compiler.libc.path={runtime.platform.path}/tools/sdk/libc/xtensa-lx106-elf
-compiler.cpreprocessor.flags=-D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ "-I{compiler.sdk.path}/include" "-I{compiler.sdk.path}/{build.lwip_include}" "-I{compiler.libc.path}/include" "-I{build.path}/core"
-
-compiler.c.cmd=xtensa-lx106-elf-gcc
-compiler.c.flags=-c {compiler.warning_flags} {build.noextra4kheap} -Os -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -falign-functions=4 -MMD -std=gnu99 -ffunction-sections -fdata-sections
-
-compiler.S.cmd=xtensa-lx106-elf-gcc
-compiler.S.flags=-c -g -x assembler-with-cpp -MMD -mlongcalls
-
-compiler.c.elf.flags=-g {compiler.warning_flags} -Os -nostdlib -Wl,--no-check-sections -u app_entry {build.float} -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-L{compiler.libc.path}/lib" "-T{build.flash_ld}" -Wl,--gc-sections -Wl,-wrap,system_restart_local -Wl,-wrap,spi_flash_read
-
-compiler.c.elf.cmd=xtensa-lx106-elf-gcc
-compiler.c.elf.libs=-lhal -lphy -lpp -lnet80211 {build.lwip_lib} -lwpa -lcrypto -lmain -lwps -lbearssl -laxtls -lespnow -lsmartconfig -lairkiss -lwpa2 -lstdc++ -lm -lc -lgcc
-
-compiler.cpp.cmd=xtensa-lx106-elf-g++
-compiler.cpp.flags=-c {compiler.warning_flags} {build.noextra4kheap} -Os -g -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -falign-functions=4 -std=c++11 -MMD -ffunction-sections -fdata-sections
-
-compiler.as.cmd=xtensa-lx106-elf-as
-
-compiler.ar.cmd=xtensa-lx106-elf-ar
-compiler.ar.flags=cru
-
-compiler.elf2hex.cmd=esptool
-compiler.elf2hex.flags=
-
-compiler.size.cmd=xtensa-lx106-elf-size
-
-compiler.esptool.cmd=esptool
-compiler.esptool.cmd.windows=esptool.exe
-
-# This can be overriden in boards.txt
-build.extra_flags=-DESP8266
-
-# These can be overridden in platform.local.txt
-compiler.c.extra_flags=
-compiler.c.elf.extra_flags=
-compiler.S.extra_flags=
-compiler.cpp.extra_flags=
-compiler.ar.extra_flags=
-compiler.objcopy.eep.extra_flags=
-compiler.elf2hex.extra_flags=
-
-## generate file with git version number
-## needs bash, git, and echo
-
-
-## windows-compatible version without git
-
-
-
-## Build the app.ld linker file
-recipe.hooks.linking.prelink.1.pattern="{compiler.path}{compiler.c.cmd}" -CC -E -P {build.vtable_flags} "{runtime.platform.path}/tools/sdk/ld/eagle.app.v6.common.ld.h" -o "{runtime.platform.path}/tools/sdk/ld/eagle.app.v6.common.ld"
-
-## Compile c files
-recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {build.led} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
-
-## Compile c++ files
-recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor.flags} {compiler.cpp.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {build.led} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
-
-## Compile S files
-recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.S.flags} -DF_CPU={build.f_cpu} {build.lwip_flags} {build.debug_port} {build.debug_level} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" {build.led} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
-
-## Create archives
-recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/arduino.ar" "{object_file}"
-
-## Combine gc-sections, archives, and objects
-recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" -Wl,-Map "-Wl,{build.path}/{build.project_name}.map" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{build.path}/arduino.ar" {compiler.c.elf.libs} -Wl,--end-group "-L{build.path}"
-
-## Create eeprom
-recipe.objcopy.eep.pattern=
-
-## Create hex
-#recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"
-
-recipe.objcopy.hex.pattern="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
-
-## Save hex
-recipe.output.tmp_file={build.project_name}.bin
-recipe.output.save_file={build.project_name}.{build.variant}.bin
-
-## Compute size
-recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf"
-recipe.size.regex=^(?:\.irom0\.text|\.text|\.data|\.rodata|)\s+([0-9]+).*
-recipe.size.regex.data=^(?:\.data|\.rodata|\.bss)\s+([0-9]+).*
-#recipe.size.regex.eeprom=^(?:\.eeprom)\s+([0-9]+).*
-
-# ------------------------------
-
-tools.esptool.cmd=esptool
-tools.esptool.cmd.windows=esptool.exe
-tools.esptool.path={runtime.tools.esptool.path}
-tools.esptool.network_cmd=python
-tools.esptool.network_cmd.windows=python.exe
-
-tools.esptool.upload.protocol=esp
-tools.esptool.upload.params.verbose=-vv
-tools.esptool.upload.params.quiet=
-tools.esptool.upload.pattern="{path}/{cmd}" {upload.verbose} -cd {upload.resetmethod} -cb {upload.speed} -cp "{serial.port}" {upload.erase_cmd} -ca 0x00000 -cf "{build.path}/{build.project_name}.bin"
-tools.esptool.upload.network_pattern="{network_cmd}" "{runtime.platform.path}/tools/espota.py" -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin"
-
-tools.mkspiffs.cmd=mkspiffs
-tools.mkspiffs.cmd.windows=mkspiffs.exe
-tools.mkspiffs.path={runtime.tools.mkspiffs.path}
-
-tools.espupload.cmd=python
-tools.espupload.cmd.windows=python.exe
-tools.espupload.path={runtime.platform.path}/tools
-tools.espupload.upload.protocol=espupload
-tools.espupload.upload.params.verbose=
-tools.espupload.upload.params.quiet=
-tools.espupload.upload.pattern="{cmd}" "{path}/espupload.py" -f "{build.path}/{build.project_name}.bin"
diff --git a/arduino/version 2.6.1/boards.txt b/arduino/version 2.6.3/boards.txt
similarity index 99%
rename from arduino/version 2.6.1/boards.txt
rename to arduino/version 2.6.3/boards.txt
index e0eab55a7..3fbb48f33 100644
--- a/arduino/version 2.6.1/boards.txt
+++ b/arduino/version 2.6.3/boards.txt
@@ -382,12 +382,14 @@ generic.menu.led.15=15
generic.menu.led.15.build.led=-DLED_BUILTIN=15
generic.menu.led.16=16
generic.menu.led.16.build.led=-DLED_BUILTIN=16
-generic.menu.sdk.nonosdk_191024=nonos-sdk 2.2.1+111 (191024)
-generic.menu.sdk.nonosdk_191024.build.sdk=NONOSDK22x_191024
-generic.menu.sdk.nonosdk_191105=nonos-sdk 2.2.1+113 (191105)
-generic.menu.sdk.nonosdk_191105.build.sdk=NONOSDK22x_191105
generic.menu.sdk.nonosdk_190703=nonos-sdk 2.2.1+100 (190703)
generic.menu.sdk.nonosdk_190703.build.sdk=NONOSDK22x_190703
+generic.menu.sdk.nonosdk_191122=nonos-sdk 2.2.1+119 (191122)
+generic.menu.sdk.nonosdk_191122.build.sdk=NONOSDK22x_191122
+generic.menu.sdk.nonosdk_191105=nonos-sdk 2.2.1+113 (191105)
+generic.menu.sdk.nonosdk_191105.build.sdk=NONOSDK22x_191105
+generic.menu.sdk.nonosdk_191024=nonos-sdk 2.2.1+111 (191024)
+generic.menu.sdk.nonosdk_191024.build.sdk=NONOSDK22x_191024
generic.menu.sdk.nonosdk221=nonos-sdk 2.2.1 (legacy)
generic.menu.sdk.nonosdk221.build.sdk=NONOSDK221
generic.menu.sdk.nonosdk3v0=nonos-sdk pre-3 (180626 known issues)
diff --git a/arduino/version 2.6.1/platform.txt b/arduino/version 2.6.3/platform.txt
similarity index 98%
rename from arduino/version 2.6.1/platform.txt
rename to arduino/version 2.6.3/platform.txt
index 76c8aba60..204b5793b 100644
--- a/arduino/version 2.6.1/platform.txt
+++ b/arduino/version 2.6.3/platform.txt
@@ -5,8 +5,8 @@
# For more info:
# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification
-name=ESP8266 Boards (2.6.1)
-version=2.6.1
+name=ESP8266 Boards (2.6.3)
+version=2.6.3
# These will be removed by the packager script when doing a JSON release
@@ -150,7 +150,7 @@ tools.esptool.upload.params.quiet=
# First, potentially perform an erase or nothing
# Next, do the binary upload
# Combined in one rule because Arduino doesn't suport upload.1.pattern/upload.3.pattern
-tools.esptool.upload.pattern="{cmd}" "{runtime.platform.path}/tools/upload.py" --chip esp8266 --port "{serial.port}" --baud "{upload.speed}" "{upload.verbose}" {upload.erase_cmd} {upload.resetmethod} "{build.path}/{build.project_name}.bin"
+tools.esptool.upload.pattern="{cmd}" "{runtime.platform.path}/tools/upload.py" --chip esp8266 --port "{serial.port}" --baud "{upload.speed}" "{upload.verbose}" {upload.erase_cmd} {upload.resetmethod} write_flash 0x0 "{build.path}/{build.project_name}.bin"
tools.esptool.upload.network_pattern="{network_cmd}" "{runtime.platform.path}/tools/espota.py" -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin"
diff --git a/esp8266.flash.1m0.ld b/esp8266.flash.1m0.ld
deleted file mode 100644
index 1f9b56a87..000000000
--- a/esp8266.flash.1m0.ld
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Flash Split for 1M chips */
-/* sketch 999KB */
-/* eeprom 20KB */
-
-MEMORY
-{
- dport0_0_seg : org = 0x3FF00000, len = 0x10
- dram0_0_seg : org = 0x3FFE8000, len = 0x14000
- iram1_0_seg : org = 0x40100000, len = 0x8000
- irom0_0_seg : org = 0x40201010, len = 0xf9ff0
-}
-
-PROVIDE ( _SPIFFS_start = 0x402FB000 );
-PROVIDE ( _SPIFFS_end = 0x402FB000 );
-PROVIDE ( _SPIFFS_page = 0 );
-PROVIDE ( _SPIFFS_block = 0 );
-
-INCLUDE "esp8266.flash.common.ld"
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_LG.h b/lib/IRremoteESP8266-2.7.1/src/ir_LG.h
deleted file mode 100644
index 01f81e2c1..000000000
--- a/lib/IRremoteESP8266-2.7.1/src/ir_LG.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 David Conran
-
-// Supports:
-// Brand: LG, Model: 6711A20083V remote
-// Brand: LG, Model: AKB74395308 remote
-
-#ifndef IR_LG_H_
-#define IR_LG_H_
-
-#define __STDC_LIMIT_MACROS
-#include
-
-uint8_t calcLGChecksum(uint16_t data);
-
-#endif // IR_LG_H_
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_NEC.h b/lib/IRremoteESP8266-2.7.1/src/ir_NEC.h
deleted file mode 100644
index e45ff702c..000000000
--- a/lib/IRremoteESP8266-2.7.1/src/ir_NEC.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2009 Ken Shirriff
-// Copyright 2017, 2018 David Conran
-
-// NEC originally added from https://github.com/shirriff/Arduino-IRremote/
-
-#ifndef IR_NEC_H_
-#define IR_NEC_H_
-
-#include
-#include "IRremoteESP8266.h"
-
-// Supports:
-// Brand: Yamaha, Model: RAV561 remote
-// Brand: Yamaha, Model: RXV585B A/V Receiver
-
-// Constants
-// Ref:
-// http://www.sbprojects.com/knowledge/ir/nec.php
-const uint16_t kNecTick = 560;
-const uint16_t kNecHdrMarkTicks = 16;
-const uint16_t kNecHdrMark = kNecHdrMarkTicks * kNecTick;
-const uint16_t kNecHdrSpaceTicks = 8;
-const uint16_t kNecHdrSpace = kNecHdrSpaceTicks * kNecTick;
-const uint16_t kNecBitMarkTicks = 1;
-const uint16_t kNecBitMark = kNecBitMarkTicks * kNecTick;
-const uint16_t kNecOneSpaceTicks = 3;
-const uint16_t kNecOneSpace = kNecOneSpaceTicks * kNecTick;
-const uint16_t kNecZeroSpaceTicks = 1;
-const uint16_t kNecZeroSpace = kNecZeroSpaceTicks * kNecTick;
-const uint16_t kNecRptSpaceTicks = 4;
-const uint16_t kNecRptSpace = kNecRptSpaceTicks * kNecTick;
-const uint16_t kNecRptLength = 4;
-const uint16_t kNecMinCommandLengthTicks = 193;
-const uint32_t kNecMinCommandLength = kNecMinCommandLengthTicks * kNecTick;
-const uint32_t kNecMinGap =
- kNecMinCommandLength -
- (kNecHdrMark + kNecHdrSpace + kNECBits * (kNecBitMark + kNecOneSpace) +
- kNecBitMark);
-const uint16_t kNecMinGapTicks =
- kNecMinCommandLengthTicks -
- (kNecHdrMarkTicks + kNecHdrSpaceTicks +
- kNECBits * (kNecBitMarkTicks + kNecOneSpaceTicks) + kNecBitMarkTicks);
-
-#endif // IR_NEC_H_
diff --git a/lib/IRremoteESP8266-2.7.1/CPPLINT.cfg b/lib/IRremoteESP8266-2.7.4/CPPLINT.cfg
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/CPPLINT.cfg
rename to lib/IRremoteESP8266-2.7.4/CPPLINT.cfg
diff --git a/lib/IRremoteESP8266-2.7.1/LICENSE.txt b/lib/IRremoteESP8266-2.7.4/LICENSE.txt
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/LICENSE.txt
rename to lib/IRremoteESP8266-2.7.4/LICENSE.txt
diff --git a/lib/IRremoteESP8266-2.7.1/README.md b/lib/IRremoteESP8266-2.7.4/README.md
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/README.md
rename to lib/IRremoteESP8266-2.7.4/README.md
index e06c8fb79..093b15cc1 100644
--- a/lib/IRremoteESP8266-2.7.1/README.md
+++ b/lib/IRremoteESP8266-2.7.4/README.md
@@ -9,8 +9,8 @@
This library enables you to **send _and_ receive** infra-red signals on an [ESP8266](https://github.com/esp8266/Arduino) or an
[ESP32](https://github.com/espressif/arduino-esp32) using the [Arduino framework](https://www.arduino.cc/) using common 940nm IR LEDs and common IR receiver modules. e.g. TSOP{17,22,24,36,38,44,48}* demodulators etc.
-## v2.7.1 Now Available
-Version 2.7.1 of the library is now [available](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). You can view the [Release Notes](ReleaseNotes.md) for all the significant changes.
+## v2.7.4 Now Available
+Version 2.7.4 of the library is now [available](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). You can view the [Release Notes](ReleaseNotes.md) for all the significant changes.
#### Upgrading from pre-v2.0
Usage of the library has been slightly changed in v2.0. You will need to change your usage to work with v2.0 and beyond. You can read more about the changes required on our [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) page.
diff --git a/lib/IRremoteESP8266-2.7.1/README_fr.md b/lib/IRremoteESP8266-2.7.4/README_fr.md
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/README_fr.md
rename to lib/IRremoteESP8266-2.7.4/README_fr.md
index b24d935c5..f95bcc945 100644
--- a/lib/IRremoteESP8266-2.7.1/README_fr.md
+++ b/lib/IRremoteESP8266-2.7.4/README_fr.md
@@ -9,8 +9,8 @@
Cette librairie vous permetra de **recevoir et d'envoyer des signaux** infrarouge sur le protocole [ESP8266](https://github.com/esp8266/Arduino) ou sur le protocole
[ESP32](https://github.com/espressif/arduino-esp32) en utilisant le [Arduino framework](https://www.arduino.cc/) qui utilise la norme 940nm IR LEDs et le module basique de reception d'onde IR. Exemple : TSOP{17,22,24,36,38,44,48}* modules etc.
-## v2.7.1 disponible
-Version 2.7.1 de la libraire est maintenant [disponible](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Vous pouvez voir le [Release Notes](ReleaseNotes.md) pour tous les changements importants.
+## v2.7.4 disponible
+Version 2.7.4 de la libraire est maintenant [disponible](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Vous pouvez voir le [Release Notes](ReleaseNotes.md) pour tous les changements importants.
#### mise à jour depuis pre-v2.0
L'utilisation de la librairie à un peu changer depuis la version in v2.0. Si vous voulez l'utiliser vous devrez changer votre utilisation aussi. Vous pouvez vous renseigner sur les précondition d'utilisation ici : [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) page.
diff --git a/lib/IRremoteESP8266-2.7.1/ReleaseNotes.md b/lib/IRremoteESP8266-2.7.4/ReleaseNotes.md
similarity index 92%
rename from lib/IRremoteESP8266-2.7.1/ReleaseNotes.md
rename to lib/IRremoteESP8266-2.7.4/ReleaseNotes.md
index 537960ac9..4c6b1a967 100644
--- a/lib/IRremoteESP8266-2.7.1/ReleaseNotes.md
+++ b/lib/IRremoteESP8266-2.7.4/ReleaseNotes.md
@@ -1,5 +1,55 @@
# Release Notes
+## _v2.7.4 (20200226)_
+
+**[Bug Fixes]**
+- IRMQTTServer: Fix bug when receiving an IR A/C message and not re-transmitting it. (#1035, #1038)
+- Coolix: `setRaw()` doesn't update power state. (#1040, #1041)
+
+**[Features]**
+- Electra: Add improved feature support. (#1033, #1051)
+- Add support for Epson protocol. (#1034, #1050)
+- Add options to `decode()` to aid detection. Improve NEC detection. (#1042, #1046)
+- SamsungAc: Add support for Light & Ion (VirusDoctor). (#1045, #1048, #1049)
+- Add Italian (it-IT) locale/language support. (#1047) (kudos @egueli)
+- gc_decode: Add repeat support for pronto codes. (#1034, #1043)
+
+**[Misc]**
+- Update supported SamsungAc devices (#1045)
+- Coolix: Subtle protocol timing adjustments (#1036, #1037)
+- Add supported Electra device model info (#1033)
+
+
+## _v2.7.3 (20200130)_
+
+**[Features]**
+- Allow protocols to be enabled or disabled with compiler flags. (#1013, #1012)
+- Panasonic AC: Add Ion Filter support for DKE models. (#1025, #1024)
+- Add support for sending Sony at 38Khz (#1029, #1018, #1019)
+- auto_analyse_raw_data.py: Handle analysing messages with no headers. (#1017)
+
+**[Misc]**
+- Fix Coolix unit test errors when using Apple c++ compiler. (#1030, #1028)
+- Fix Apple clang c++ compiler error in unit tests. (#1027, #1026)
+- Improve/fix scraping of supported devices (#1022)
+- Panasonic PKR series A/C uses DKE protocol. (#1020, #1021)
+- Update NEC supported devices. (#1018)
+- Add note to avoid GPIO16 on the ESP8266 for receiving. (#1016, #1015)
+
+
+## _v2.7.2 (20200106)_
+
+**[Bug Fixes]**
+- Common AC api: Better handle protocols with power toggles. (#1002)
+
+**[Features]**
+- Experimental detailed support for LG a/c. (#1008 #1009)
+
+**[Misc]**
+- Add remote codes for Aloka LED lamp. (#1005)
+- Improve Supported Devices scraping. (#1006)
+
+
## _v2.7.1 (20191125)_
**[Bug Fixes]**
diff --git a/lib/IRremoteESP8266-2.7.1/SupportedProtocols.md b/lib/IRremoteESP8266-2.7.4/SupportedProtocols.md
similarity index 84%
rename from lib/IRremoteESP8266-2.7.1/SupportedProtocols.md
rename to lib/IRremoteESP8266-2.7.4/SupportedProtocols.md
index 02d51093a..04661c3bb 100644
--- a/lib/IRremoteESP8266-2.7.1/SupportedProtocols.md
+++ b/lib/IRremoteESP8266-2.7.4/SupportedProtocols.md
@@ -1,6 +1,6 @@
+ Last generated: Wed Feb 26 16:31:08 2020 --->
# IR Protocols supported by this library
| Protocol | Brand | Model | A/C Model | Detailed A/C Support |
@@ -11,68 +11,72 @@
| [Carrier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Carrier.cpp) | **Carrier/Surrey** | 42QG5A55970 remote 53NGK009/012 Inverter 619EGX0090E0 A/C 619EGX0120E0 A/C 619EGX0180E0 A/C 619EGX0220E0 A/C | | - |
| [Coolix](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.cpp) | **[Beko](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.h)** | BINR 070/071 split-type A/C BINR 070/071 split-type A/C RG57K7(B)/BGEF Remote RG57K7(B)/BGEF Remote | | Yes |
| [Coolix](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.cpp) | **[Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.h)** | MS12FU-10HRDN1-QRD0GW(B) A/C MS12FU-10HRDN1-QRD0GW(B) A/C MSABAU-07HRFN1-QRD0GW A/C (circa 2016) MSABAU-07HRFN1-QRD0GW A/C (circa 2016) RG52D/BGE Remote RG52D/BGE Remote | | Yes |
-| [Coolix](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.cpp) | **[Tokio](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.h)** | AATOEMF17-12CHR1SW split-type RG51|50/BGE Remote AATOEMF17-12CHR1SW split-type RG51|50/BGE Remote | | Yes |
+| [Coolix](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.cpp) | **[Tokio](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.h)** | AATOEMF17-12CHR1SW split-type RG51\|50/BGE Remote AATOEMF17-12CHR1SW split-type RG51\|50/BGE Remote | | Yes |
| [Daikin](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Daikin.cpp) | **[Daikin](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Daikin.h)** | 17 Series A/C (DAIKIN128) ARC423A5 remote ARC433** remote ARC433B69 remote ARC477A1 remote ARC480A5 remote (DAIKIN152) BRC4C153 remote BRC52B63 remote (DAIKIN128) FTE12HV2S A/C FTXB09AXVJU A/C (DAIKIN128) FTXB12AXVJU A/C (DAIKIN128) FTXZ25NV1B A/C FTXZ35NV1B A/C FTXZ50NV1B A/C | | Yes |
| [Denon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Denon.cpp) | **Unknown** | | | - |
| [Dish](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Dish.cpp) | **DISH NETWORK** | echostar 301 | | - |
| [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[AUX](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | KFR-35GW/BpNFW=3 A/C YKR-T/011 remote | | Yes |
-| [Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.cpp) | **[Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.h)** | AGTV14LAC A/C AR-DB1 remote AR-DL10 remote AR-RAC1E remote AR-RAE1E remote AR-RAH2E remote AR-REB1E remote AR-RY4 remote AST9RSGCW A/C ASTB09LBC A/C ASU30C1 A/C ASYG30LFCA A/C ASYG7LMCA A/C | | Yes |
-| [Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.cpp) | **[Fujitsu General](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.h)** | AR-JW2 remote | | Yes |
+| [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | Classic INV 17 / AXW12DCS A/C YKR-M/003E remote | | Yes |
+| [Epson](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Epson.cpp) | **Unknown** | | | - |
+| [Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.cpp) | **[Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.h)** | AGTV14LAC A/C AR-DB1 remote AR-DL10 remote AR-RAC1E remote AR-RAE1E remote AR-RAH2E remote AR-REB1E remote AR-RY4 remote AST9RSGCW A/C ASTB09LBC A/C ASU30C1 A/C ASYG30LFCA A/C ASYG7LMCA A/C | ARDB1 ARJW2 ARRAH2E ARREB1E ARRY4 | Yes |
+| [Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.cpp) | **[Fujitsu General](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.h)** | AR-JW2 remote | ARDB1 ARJW2 ARRAH2E ARREB1E ARRY4 | Yes |
| [GICable](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_GICable.cpp) | **Unknown** | | | - |
| [GlobalCache](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_GlobalCache.cpp) | **Unknown** | | | - |
| [Goodweather](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Goodweather.cpp) | **[Goodweather](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Goodweather.h)** | ZH/JT-03 remote | | Yes |
-| [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[EKOKAI](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | A/C | | Yes |
-| [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[Green](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | YBOFB remote YBOFB2 remote | | Yes |
-| [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[RusClimate](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | EACS/I-09HAR_X/N3 A/C YAW1F remote | | Yes |
-| [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[Ultimate](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | Heat Pump | | Yes |
+| [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[EKOKAI](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | A/C | YAW1F YBOFB | Yes |
+| [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[Green](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | YBOFB remote YBOFB2 remote | YAW1F YBOFB | Yes |
+| [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[RusClimate](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | EACS/I-09HAR_X/N3 A/C YAW1F remote | YAW1F YBOFB | Yes |
+| [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[Ultimate](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | Heat Pump | YAW1F YBOFB | Yes |
| [Haier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Haier.cpp) | **[Haier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Haier.h)** | HSU-09HMC203 A/C HSU07-HEA03 remote YR-W02 remote | | Yes |
| [Hitachi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Hitachi.cpp) | **[Hitachi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Hitachi.h)** | LT0541-HTA remote RAR-8P2 remote RAS-35THA6 remote RAS-AJ25H A/C Series VI A/C (Circa 2007) | | Yes |
| [Inax](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Inax.cpp) | **Lixil** | Inax DT-BA283 Toilet | | - |
| [JVC](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_JVC.cpp) | **Unknown** | | | - |
| [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Green](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | YAPOF3 remote | | Yes |
| [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | KSV26CRC A/C KSV26HRC A/C KSV35CRC A/C KSV35HRC A/C KSV53HRC A/C KSV62HRC A/C KSV70CRC A/C KSV70HRC A/C KSV80HRC A/C YALIF Remote | | Yes |
-| [LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.cpp) | **[LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.h)** | 6711A20083V remote 6711A20083V remote AKB74395308 remote AKB74395308 remote | | Yes |
+| [LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.cpp) | **[General Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.h)** | 6711AR2853M A/C Remote AG1BH09AW101 Split A/C | | Yes |
+| [LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.cpp) | **[LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.h)** | 6711A20083V remote 6711A20083V remote AKB74395308 remote AKB74395308 remote AKB75215403 remote (LG2) S4-W12JA3AA A/C (LG2) | | Yes |
| [Lasertag](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Lasertag.cpp) | **Unknown** | | | - |
| [Lego](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Lego.cpp) | **LEGO Power Functions** | IR Receiver | | - |
| [Lutron](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Lutron.cpp) | **Unknown** | | | - |
| [MWM](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_MWM.cpp) | **Unknown** | | | - |
-| [Magiquest](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Magiquest.cpp) | **[Unknown](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Magiquest.h)** | | | Yes |
+| [Magiquest](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Magiquest.cpp) | **[Unknown](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Magiquest.h)** | | | - |
| [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Comfee](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | MPD1-12CRN7 A/C | | Yes |
| [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Keystone](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | RG57H4(B)BGEF remote | | Yes |
| [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Pioneer System](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | RUBO18GMFILCAD A/C (18K BTU) RYBO12GMFILCAD A/C (12K BTU) | | Yes |
| [Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.cpp) | **[Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.h)** | HC3000 Projector KM14A 0179213 remote MS-GK24VA A/C TV | | Yes |
| [Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.cpp) | **[Mitsubishi Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.h)** | 001CP T7WE10714 remote KPOA remote MSH-A24WV / MUH-A24WV A/C PEAD-RP71JAA Ducted A/C | | Yes |
| [MitsubishiHeavy](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_MitsubishiHeavy.cpp) | **[Mitsubishi Heavy Industries](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_MitsubishiHeavy.h)** | RKX502A001C remote RLA502A700B remote SRKxxZJ-S A/C SRKxxZM-S A/C SRKxxZMXA-S A/C | | Yes |
-| [NEC](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.cpp) | **[Yamaha](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.h)** | RAV561 remote RXV585B A/V Receiver | | Yes |
+| [NEC](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.cpp) | **[Aloka](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.h)** | SleepyLights LED Lamp | | - |
+| [NEC](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.cpp) | **[Toshiba](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.h)** | 42TL838 LCD TV | | - |
+| [NEC](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.cpp) | **[Yamaha](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.h)** | RAV561 remote RXV585B A/V Receiver | | - |
| [Neoclima](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Neoclima.cpp) | **[Neoclima](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Neoclima.h)** | NS-09AHTI A/C NS-09AHTI A/C ZH/TY-01 remote ZH/TY-01 remote | | Yes |
| [Nikai](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Nikai.cpp) | **Unknown** | | | - |
-| [Panasonic](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Panasonic.cpp) | **[Panasonic](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Panasonic.h)** | A75C2311 remote (CKP) A75C3704 remote A75C3747 remote A75C3747 remote A75C3747 remote A75C3747 remote CKP series A/C CS-ME10CKPG A/C CS-ME12CKPG A/C CS-ME14CKPG A/C CS-YW9MKD A/C CS-Z9RKR A/C DKE series A/C JKE series A/C NKE series A/C RKR series A/C TV | | Yes |
+| [Panasonic](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Panasonic.cpp) | **[Panasonic](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Panasonic.h)** | A75C2311 remote (CKP) A75C2616-1 remote (DKE) A75C3704 remote A75C3747 remote CKP series A/C CS-E7PKR A/C (DKE) CS-ME10CKPG A/C CS-ME12CKPG A/C CS-ME14CKPG A/C CS-YW9MKD A/C CS-Z9RKR A/C DKE series A/C DKW series A/C (DKE) JKE series A/C NKE series A/C PKR series A/C (DKE) RKR series A/C TV | CKP DKE JKE LKE NKE RKR | Yes |
| [Pioneer](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Pioneer.cpp) | **Unknown** | | | - |
| [Pronto](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Pronto.cpp) | **Unknown** | | | - |
| [RC5_RC6](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_RC5_RC6.cpp) | **Unknown** | | | - |
| [RCMM](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_RCMM.cpp) | **Microsoft** | XBOX 360 | | - |
-| [Samsung](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Samsung.cpp) | **[Samsung](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Samsung.h)** | AR12HSSDBWKNEU A/C AR12KSFPEWQNET A/C IEC-R03 remote UA55H6300 TV | | Yes |
+| [Samsung](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Samsung.cpp) | **[Samsung](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Samsung.h)** | AR09FSSDAWKNFA A/C AR12HSSDBWKNEU A/C AR12KSFPEWQNET A/C DB63-03556X003 remote IEC-R03 remote UA55H6300 TV | | Yes |
| [Sanyo](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sanyo.cpp) | **Unknown** | | | - |
| [Sharp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sharp.cpp) | **[Sharp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sharp.h)** | AY-ZP40KR A/C LC-52D62U TV | | Yes |
| [Sherwood](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sherwood.cpp) | **Sherwood** | RC-138 remote RD6505(B) Receiver | | - |
-| [Sony](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sony.cpp) | **Unknown** | | | - |
+| [Sony](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sony.cpp) | **Sony** | HT-CT380 Soundbar (Uses 38kHz & 3 repeats) | | - |
| [Tcl](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Tcl.cpp) | **[Leberg](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Tcl.h)** | LBS-TOR07 A/C | | Yes |
| [Teco](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Teco.cpp) | **[Alaska](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Teco.h)** | SAC9010QC A/C SAC9010QC remote | | Yes |
| [Toshiba](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Toshiba.cpp) | **[Toshiba](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Toshiba.h)** | Akita EVO II RAS 18SKP-ES RAS-B13N3KV2 RAS-B13N3KVP-E WC-L03SE WH-TA04NE | | Yes |
| [Trotec](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Trotec.cpp) | **[Unknown](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Trotec.h)** | | | Yes |
| [Vestel](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Vestel.cpp) | **[Vestel](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Vestel.h)** | BIOX CXP-9 A/C (9K BTU) | | Yes |
-| [Whirlpool](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Whirlpool.cpp) | **[Whirlpool](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Whirlpool.h)** | DG11J1-04 remote DG11J1-3A remote DG11J1-91 remote SPIS409L A/C SPIS412L A/C SPIW409L A/C SPIW412L A/C SPIW418L A/C | | Yes |
+| [Whirlpool](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Whirlpool.cpp) | **[Whirlpool](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Whirlpool.h)** | DG11J1-04 remote DG11J1-3A remote DG11J1-91 remote SPIS409L A/C SPIS412L A/C SPIW409L A/C SPIW412L A/C SPIW418L A/C | DG11J13A DG11J191 | Yes |
| [Whynter](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Whynter.cpp) | **Whynter** | ARC-110WD A/C | | - |
## Send only protocols:
- GLOBALCACHE
-- MITSUBISHI112
- PRONTO
- RAW
- SHERWOOD
-- TCL112AC
+- SONY_38K
## Send & decodable protocols:
@@ -92,6 +96,7 @@
- DENON
- DISH
- ELECTRA_AC
+- EPSON
- FUJITSU_AC
- GICABLE
- GOODWEATHER
@@ -113,6 +118,7 @@
- MAGIQUEST
- MIDEA
- MITSUBISHI
+- MITSUBISHI112
- MITSUBISHI136
- MITSUBISHI2
- MITSUBISHI_AC
@@ -138,10 +144,10 @@
- SHARP
- SHARP_AC
- SONY
+- TCL112AC
- TECO
- TOSHIBA_AC
- TROTEC
- VESTEL_AC
- WHIRLPOOL_AC
- WHYNTER
-- typeguess
diff --git a/lib/IRremoteESP8266-2.7.1/examples/CommonAcControl/CommonAcControl.ino b/lib/IRremoteESP8266-2.7.4/examples/CommonAcControl/CommonAcControl.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/CommonAcControl/CommonAcControl.ino
rename to lib/IRremoteESP8266-2.7.4/examples/CommonAcControl/CommonAcControl.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/CommonAcControl/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/CommonAcControl/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/CommonAcControl/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/CommonAcControl/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/ControlSamsungAC/ControlSamsungAC.ino b/lib/IRremoteESP8266-2.7.4/examples/ControlSamsungAC/ControlSamsungAC.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/ControlSamsungAC/ControlSamsungAC.ino
rename to lib/IRremoteESP8266-2.7.4/examples/ControlSamsungAC/ControlSamsungAC.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/ControlSamsungAC/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/ControlSamsungAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/ControlSamsungAC/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/ControlSamsungAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/DumbIRRepeater/DumbIRRepeater.ino b/lib/IRremoteESP8266-2.7.4/examples/DumbIRRepeater/DumbIRRepeater.ino
similarity index 96%
rename from lib/IRremoteESP8266-2.7.1/examples/DumbIRRepeater/DumbIRRepeater.ino
rename to lib/IRremoteESP8266-2.7.4/examples/DumbIRRepeater/DumbIRRepeater.ino
index 80f5ce64a..d3ddbdb6a 100644
--- a/lib/IRremoteESP8266-2.7.1/examples/DumbIRRepeater/DumbIRRepeater.ino
+++ b/lib/IRremoteESP8266-2.7.4/examples/DumbIRRepeater/DumbIRRepeater.ino
@@ -37,6 +37,8 @@
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP will interfere.
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP will interfere.
+ * * Pin 16/D0: Has no interrupts on the ESP8266, so can't be used for IR
+ * receiving with this library.
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
* for your first time. e.g. ESP-12 etc.
*
@@ -54,6 +56,7 @@
// ==================== start of TUNEABLE PARAMETERS ====================
// The GPIO an IR detector/demodulator is connected to. Recommended: 14 (D5)
+// Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts.
const uint16_t kRecvPin = 14;
// GPIO to use to control the IR LED circuit. Recommended: 4 (D2).
diff --git a/lib/IRremoteESP8266-2.7.1/examples/DumbIRRepeater/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/DumbIRRepeater/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/DumbIRRepeater/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/DumbIRRepeater/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRGCSendDemo/IRGCSendDemo.ino b/lib/IRremoteESP8266-2.7.4/examples/IRGCSendDemo/IRGCSendDemo.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRGCSendDemo/IRGCSendDemo.ino
rename to lib/IRremoteESP8266-2.7.4/examples/IRGCSendDemo/IRGCSendDemo.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRGCSendDemo/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/IRGCSendDemo/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRGCSendDemo/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/IRGCSendDemo/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRGCTCPServer/IRGCTCPServer.ino b/lib/IRremoteESP8266-2.7.4/examples/IRGCTCPServer/IRGCTCPServer.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRGCTCPServer/IRGCTCPServer.ino
rename to lib/IRremoteESP8266-2.7.4/examples/IRGCTCPServer/IRGCTCPServer.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRGCTCPServer/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/IRGCTCPServer/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRGCTCPServer/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/IRGCTCPServer/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRMQTTServer/IRMQTTServer.h b/lib/IRremoteESP8266-2.7.4/examples/IRMQTTServer/IRMQTTServer.h
similarity index 99%
rename from lib/IRremoteESP8266-2.7.1/examples/IRMQTTServer/IRMQTTServer.h
rename to lib/IRremoteESP8266-2.7.4/examples/IRMQTTServer/IRMQTTServer.h
index c9d4898b9..b363d98b9 100644
--- a/lib/IRremoteESP8266-2.7.1/examples/IRMQTTServer/IRMQTTServer.h
+++ b/lib/IRremoteESP8266-2.7.4/examples/IRMQTTServer/IRMQTTServer.h
@@ -47,6 +47,7 @@ const int8_t kDefaultIrLed = 4; // <=- CHANGE_ME (optional)
const bool kInvertTxOutput = false;
// Default GPIO the IR demodulator is connected to/controlled by. GPIO 14 = D5.
+// Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts.
const int8_t kDefaultIrRx = 14; // <=- CHANGE_ME (optional)
// Enable/disable receiving/decoding IR messages entirely.
@@ -238,7 +239,7 @@ const uint16_t kJsonAcStateMaxSize = 1024; // Bytes
// ----------------- End of User Configuration Section -------------------------
// Constants
-#define _MY_VERSION_ "v1.4.5"
+#define _MY_VERSION_ "v1.4.6"
const uint8_t kRebootTime = 15; // Seconds
const uint8_t kQuickDisplayTime = 2; // Seconds
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRMQTTServer/IRMQTTServer.ino b/lib/IRremoteESP8266-2.7.4/examples/IRMQTTServer/IRMQTTServer.ino
similarity index 99%
rename from lib/IRremoteESP8266-2.7.1/examples/IRMQTTServer/IRMQTTServer.ino
rename to lib/IRremoteESP8266-2.7.4/examples/IRMQTTServer/IRMQTTServer.ino
index dfb1aa044..efcf25431 100644
--- a/lib/IRremoteESP8266-2.7.1/examples/IRMQTTServer/IRMQTTServer.ino
+++ b/lib/IRremoteESP8266-2.7.4/examples/IRMQTTServer/IRMQTTServer.ino
@@ -271,7 +271,7 @@
*
* #### Home Assistant MQTT Discovery
* There is an option for this: 'Send MQTT Discovery' under the 'Admin' menu.
- * It will produce a single MQTT Cliamte Discovery message for Home Assistant
+ * It will produce a single MQTT Climate Discovery message for Home Assistant
* provided you have everything configured correctly here and in HA.
* This message has MQTT RETAIN set on it, so it only ever needs to be sent
* once or if the config details change etc.
@@ -2679,7 +2679,7 @@ uint64_t getUInt64fromHex(char const *str) {
// code: Numeric payload of the IR message. Most protocols use this.
// code_str: The unparsed code to be sent. Used by complex protocol encodings.
// bits: Nr. of bits in the protocol. 0 means use the protocol's default.
-// repeat: Nr. of times the message is to be repeated. (Not all protcols.)
+// repeat: Nr. of times the message is to be repeated. (Not all protocols.)
// Returns:
// bool: Successfully sent or not.
bool sendIRCode(IRsend *irsend, decode_type_t const ir_type,
@@ -3071,6 +3071,10 @@ bool sendClimate(const String topic_prefix, const bool retain,
lastClimateIr.reset();
irClimateCounter++;
}
+ // Mark the "next" value as old/previous.
+ if (ac != NULL) {
+ ac->markAsSent();
+ }
return success;
}
@@ -3098,20 +3102,20 @@ bool decodeCommonAc(const decode_results *decode) {
}
#if IGNORE_DECODED_AC_PROTOCOL
if (climate[0]->next.protocol != decode_type_t::UNKNOWN) {
- // Use the previous protcol/model if set.
+ // Use the previous protocol/model if set.
state.protocol = climate[0]->next.protocol;
state.model = climate[0]->next.model;
}
#endif // IGNORE_DECODED_AC_PROTOCOL
-// Continue to use the previously prefered temperature units.
-// i.e. Keep using Celsius or Fahrenheit.
-if (climate[0]->next.celsius != state.celsius) {
- // We've got a mismatch, so we need to convert.
- state.degrees = climate[0]->next.celsius ? fahrenheitToCelsius(state.degrees)
- : celsiusToFahrenheit(state.degrees);
- state.celsius = climate[0]->next.celsius;
-}
-climate[0]->next = state; // Copy over the new climate state.
+ // Continue to use the previously prefered temperature units.
+ // i.e. Keep using Celsius or Fahrenheit.
+ if (climate[0]->next.celsius != state.celsius) {
+ // We've got a mismatch, so we need to convert.
+ state.degrees = climate[0]->next.celsius ?
+ fahrenheitToCelsius(state.degrees) : celsiusToFahrenheit(state.degrees);
+ state.celsius = climate[0]->next.celsius;
+ }
+ climate[0]->next = state; // Copy over the new climate state.
#if MQTT_ENABLE
sendClimate(genStatTopic(0), true, false, REPLAY_DECODED_AC_MESSAGE,
REPLAY_DECODED_AC_MESSAGE, climate[0]);
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRMQTTServer/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/IRMQTTServer/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRMQTTServer/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/IRMQTTServer/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRServer/IRServer.ino b/lib/IRremoteESP8266-2.7.4/examples/IRServer/IRServer.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRServer/IRServer.ino
rename to lib/IRremoteESP8266-2.7.4/examples/IRServer/IRServer.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRServer/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/IRServer/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRServer/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/IRServer/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRrecvDemo/IRrecvDemo.ino b/lib/IRremoteESP8266-2.7.4/examples/IRrecvDemo/IRrecvDemo.ino
similarity index 95%
rename from lib/IRremoteESP8266-2.7.1/examples/IRrecvDemo/IRrecvDemo.ino
rename to lib/IRremoteESP8266-2.7.4/examples/IRrecvDemo/IRrecvDemo.ino
index 5fd03f4b4..945f94055 100644
--- a/lib/IRremoteESP8266-2.7.1/examples/IRrecvDemo/IRrecvDemo.ino
+++ b/lib/IRremoteESP8266-2.7.4/examples/IRrecvDemo/IRrecvDemo.ino
@@ -23,6 +23,7 @@
// An IR detector/demodulator is connected to GPIO pin 14(D5 on a NodeMCU
// board).
+// Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts.
const uint16_t kRecvPin = 14;
IRrecv irrecv(kRecvPin);
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRrecvDemo/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/IRrecvDemo/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRrecvDemo/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/IRrecvDemo/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRrecvDump/IRrecvDump.ino b/lib/IRremoteESP8266-2.7.4/examples/IRrecvDump/IRrecvDump.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRrecvDump/IRrecvDump.ino
rename to lib/IRremoteESP8266-2.7.4/examples/IRrecvDump/IRrecvDump.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRrecvDump/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/IRrecvDump/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRrecvDump/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/IRrecvDump/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRrecvDumpV2/IRrecvDumpV2.ino b/lib/IRremoteESP8266-2.7.4/examples/IRrecvDumpV2/IRrecvDumpV2.ino
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/examples/IRrecvDumpV2/IRrecvDumpV2.ino
rename to lib/IRremoteESP8266-2.7.4/examples/IRrecvDumpV2/IRrecvDumpV2.ino
index fc61f9b84..8ea98b687 100644
--- a/lib/IRremoteESP8266-2.7.1/examples/IRrecvDumpV2/IRrecvDumpV2.ino
+++ b/lib/IRremoteESP8266-2.7.4/examples/IRrecvDumpV2/IRrecvDumpV2.ino
@@ -17,7 +17,7 @@
* Version 0.4 July, 2018
* - Minor improvements and more A/C unit support.
* Version 0.3 November, 2017
- * - Support for A/C decoding for some protcols.
+ * - Support for A/C decoding for some protocols.
* Version 0.2 April, 2017
* - Decode from a copy of the data so we can start capturing faster thus
* reduce the likelihood of miscaptures.
@@ -34,6 +34,7 @@
// ==================== start of TUNEABLE PARAMETERS ====================
// An IR detector/demodulator is connected to GPIO pin 14
// e.g. D5 on a NodeMCU board.
+// Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts.
const uint16_t kRecvPin = 14;
// The Serial connection baud rate.
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRrecvDumpV2/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/IRrecvDumpV2/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRrecvDumpV2/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/IRrecvDumpV2/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRsendDemo/IRsendDemo.ino b/lib/IRremoteESP8266-2.7.4/examples/IRsendDemo/IRsendDemo.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRsendDemo/IRsendDemo.ino
rename to lib/IRremoteESP8266-2.7.4/examples/IRsendDemo/IRsendDemo.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRsendDemo/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/IRsendDemo/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRsendDemo/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/IRsendDemo/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRsendProntoDemo/IRsendProntoDemo.ino b/lib/IRremoteESP8266-2.7.4/examples/IRsendProntoDemo/IRsendProntoDemo.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRsendProntoDemo/IRsendProntoDemo.ino
rename to lib/IRremoteESP8266-2.7.4/examples/IRsendProntoDemo/IRsendProntoDemo.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/IRsendProntoDemo/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/IRsendProntoDemo/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/IRsendProntoDemo/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/IRsendProntoDemo/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino b/lib/IRremoteESP8266-2.7.4/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino
rename to lib/IRremoteESP8266-2.7.4/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/JVCPanasonicSendDemo/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/JVCPanasonicSendDemo/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/JVCPanasonicSendDemo/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/JVCPanasonicSendDemo/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/LGACSend/LGACSend.ino b/lib/IRremoteESP8266-2.7.4/examples/LGACSend/LGACSend.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/LGACSend/LGACSend.ino
rename to lib/IRremoteESP8266-2.7.4/examples/LGACSend/LGACSend.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/LGACSend/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/LGACSend/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/LGACSend/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/LGACSend/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/SmartIRRepeater/SmartIRRepeater.ino b/lib/IRremoteESP8266-2.7.4/examples/SmartIRRepeater/SmartIRRepeater.ino
similarity index 96%
rename from lib/IRremoteESP8266-2.7.1/examples/SmartIRRepeater/SmartIRRepeater.ino
rename to lib/IRremoteESP8266-2.7.4/examples/SmartIRRepeater/SmartIRRepeater.ino
index 8dd202382..576abb516 100644
--- a/lib/IRremoteESP8266-2.7.1/examples/SmartIRRepeater/SmartIRRepeater.ino
+++ b/lib/IRremoteESP8266-2.7.4/examples/SmartIRRepeater/SmartIRRepeater.ino
@@ -40,6 +40,8 @@
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP will interfere.
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP will interfere.
+ * * Pin 16/D0: Has no interrupts on the ESP8266, so can't be used for IR
+ * receiving with this library.
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
* for your first time. e.g. ESP-12 etc.
*
@@ -57,6 +59,7 @@
// ==================== start of TUNEABLE PARAMETERS ====================
// The GPIO an IR detector/demodulator is connected to. Recommended: 14 (D5)
+// Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts.
const uint16_t kRecvPin = 14;
// GPIO to use to control the IR LED circuit. Recommended: 4 (D2).
diff --git a/lib/IRremoteESP8266-2.7.1/examples/SmartIRRepeater/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/SmartIRRepeater/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/SmartIRRepeater/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/SmartIRRepeater/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnArgoAC/TurnOnArgoAC.ino b/lib/IRremoteESP8266-2.7.4/examples/TurnOnArgoAC/TurnOnArgoAC.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnArgoAC/TurnOnArgoAC.ino
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnArgoAC/TurnOnArgoAC.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnArgoAC/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/TurnOnArgoAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnArgoAC/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnArgoAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino b/lib/IRremoteESP8266-2.7.4/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnDaikinAC/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/TurnOnDaikinAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnDaikinAC/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnDaikinAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino b/lib/IRremoteESP8266-2.7.4/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnFujitsuAC/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/TurnOnFujitsuAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnFujitsuAC/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnFujitsuAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino b/lib/IRremoteESP8266-2.7.4/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnKelvinatorAC/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/TurnOnKelvinatorAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnKelvinatorAC/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnKelvinatorAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino b/lib/IRremoteESP8266-2.7.4/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnMitsubishiAC/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/TurnOnMitsubishiAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnMitsubishiAC/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnMitsubishiAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnMitsubishiHeavyAc/TurnOnMitsubishiHeavyAc.ino b/lib/IRremoteESP8266-2.7.4/examples/TurnOnMitsubishiHeavyAc/TurnOnMitsubishiHeavyAc.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnMitsubishiHeavyAc/TurnOnMitsubishiHeavyAc.ino
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnMitsubishiHeavyAc/TurnOnMitsubishiHeavyAc.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnMitsubishiHeavyAc/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/TurnOnMitsubishiHeavyAc/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnMitsubishiHeavyAc/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnMitsubishiHeavyAc/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnPanasonicAC/TurnOnPanasonicAC.ino b/lib/IRremoteESP8266-2.7.4/examples/TurnOnPanasonicAC/TurnOnPanasonicAC.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnPanasonicAC/TurnOnPanasonicAC.ino
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnPanasonicAC/TurnOnPanasonicAC.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnPanasonicAC/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/TurnOnPanasonicAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnPanasonicAC/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnPanasonicAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino b/lib/IRremoteESP8266-2.7.4/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnToshibaAC/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/TurnOnToshibaAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnToshibaAC/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnToshibaAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino b/lib/IRremoteESP8266-2.7.4/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/TurnOnTrotecAC/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/TurnOnTrotecAC/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/TurnOnTrotecAC/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/TurnOnTrotecAC/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/README.md b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/README.md
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/README.md
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/README.md
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/Web-AC-control.ino b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/Web-AC-control.ino
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/Web-AC-control.ino
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/Web-AC-control.ino
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/platformio.ini b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/platformio.ini
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/platformio.ini
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/platformio.ini
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/printscreen.png b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/printscreen.png
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/printscreen.png
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/printscreen.png
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/favicon.ico b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/favicon.ico
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/favicon.ico
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/favicon.ico
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_1_off.svg b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_1_off.svg
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_1_off.svg
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_1_off.svg
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_1_on.svg b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_1_on.svg
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_1_on.svg
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_1_on.svg
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_2_off.svg b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_2_off.svg
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_2_off.svg
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_2_off.svg
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_2_on.svg b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_2_on.svg
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_2_on.svg
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_2_on.svg
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_3_off.svg b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_3_off.svg
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_3_off.svg
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_3_off.svg
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_3_on.svg b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_3_on.svg
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_3_on.svg
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_3_on.svg
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_4_off.svg b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_4_off.svg
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_4_off.svg
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_4_off.svg
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_4_on.svg b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_4_on.svg
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/level_4_on.svg
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/level_4_on.svg
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/ui.html b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/ui.html
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/ui.html
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/ui.html
diff --git a/lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/ui.js b/lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/ui.js
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/examples/Web-AC-control/upload/ui.js
rename to lib/IRremoteESP8266-2.7.4/examples/Web-AC-control/upload/ui.js
diff --git a/lib/IRremoteESP8266-2.7.1/keywords.txt b/lib/IRremoteESP8266-2.7.4/keywords.txt
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/keywords.txt
rename to lib/IRremoteESP8266-2.7.4/keywords.txt
index f027e808b..077c0bc74 100644
--- a/lib/IRremoteESP8266-2.7.1/keywords.txt
+++ b/lib/IRremoteESP8266-2.7.4/keywords.txt
@@ -39,6 +39,7 @@ IRHaierACYRW02 KEYWORD1
IRHitachiAc KEYWORD1
IRHitachiAc424 KEYWORD1
IRKelvinatorAC KEYWORD1
+IRLgAc KEYWORD1
IRMideaAC KEYWORD1
IRMitsubishi112 KEYWORD1
IRMitsubishi136 KEYWORD1
@@ -66,6 +67,7 @@ fanspeed_t KEYWORD1
fujitsu_ac_remote_model_t KEYWORD1
gree_ac_remote_model_t KEYWORD1
irparams_t KEYWORD1
+lg_ac_remote_model_t KEYWORD1
match_result_t KEYWORD1
opmode_t KEYWORD1
panasonic_ac_remote_model_t KEYWORD1
@@ -82,6 +84,7 @@ _delayMicroseconds KEYWORD2
_getTime KEYWORD2
_getTimer KEYWORD2
_matchGeneric KEYWORD2
+_sendSony KEYWORD2
_setMode KEYWORD2
_setTemp KEYWORD2
_setTime KEYWORD2
@@ -130,6 +133,7 @@ convertSwingV KEYWORD2
coolix KEYWORD2
copyIrParams KEYWORD2
countBits KEYWORD2
+crudeNoiseFilter KEYWORD2
daikin KEYWORD2
daikin128 KEYWORD2
daikin152 KEYWORD2
@@ -153,6 +157,7 @@ decodeDaikin2 KEYWORD2
decodeDaikin216 KEYWORD2
decodeDenon KEYWORD2
decodeElectraAC KEYWORD2
+decodeEpson KEYWORD2
decodeFujitsuAC KEYWORD2
decodeGICable KEYWORD2
decodeGoodweather KEYWORD2
@@ -249,6 +254,7 @@ getCorrectedRawLength KEYWORD2
getCurrTime KEYWORD2
getCurrentDay KEYWORD2
getCurrentTime KEYWORD2
+getDisplay KEYWORD2
getEcono KEYWORD2
getEye KEYWORD2
getEyeAuto KEYWORD2
@@ -346,10 +352,13 @@ isSwingVToggle KEYWORD2
isTimeCommand KEYWORD2
isTimerActive KEYWORD2
isTimerEnabled KEYWORD2
+isValidLgAc KEYWORD2
kelvinator KEYWORD2
ledOff KEYWORD2
ledOn KEYWORD2
+lg KEYWORD2
mark KEYWORD2
+markAsSent KEYWORD2
match KEYWORD2
matchAtLeast KEYWORD2
matchBytes KEYWORD2
@@ -401,6 +410,7 @@ sendDaikin216 KEYWORD2
sendData KEYWORD2
sendDenon KEYWORD2
sendElectraAC KEYWORD2
+sendEpson KEYWORD2
sendExtended KEYWORD2
sendFujitsuAC KEYWORD2
sendGC KEYWORD2
@@ -455,6 +465,7 @@ sendSharpAc KEYWORD2
sendSharpRaw KEYWORD2
sendSherwood KEYWORD2
sendSony KEYWORD2
+sendSony38 KEYWORD2
sendTcl112Ac KEYWORD2
sendTeco KEYWORD2
sendToshibaAC KEYWORD2
@@ -478,6 +489,7 @@ setCommand KEYWORD2
setCurrTime KEYWORD2
setCurrentDay KEYWORD2
setCurrentTime KEYWORD2
+setDisplay KEYWORD2
setEcono KEYWORD2
setEye KEYWORD2
setEyeAuto KEYWORD2
@@ -590,6 +602,7 @@ xorBytes KEYWORD2
// LITERAL1
AIWA_RC_T501 LITERAL1
AIWA_RC_T501_BITS LITERAL1
+AKB75215403 LITERAL1
ALLOW_DELAY_CALLS LITERAL1
AMCOR LITERAL1
ARDB1 LITERAL1
@@ -659,6 +672,7 @@ DECODE_DAIKIN216 LITERAL1
DECODE_DENON LITERAL1
DECODE_DISH LITERAL1
DECODE_ELECTRA_AC LITERAL1
+DECODE_EPSON LITERAL1
DECODE_FUJITSU_AC LITERAL1
DECODE_GICABLE LITERAL1
DECODE_GLOBALCACHE LITERAL1
@@ -721,6 +735,8 @@ DG11J191 LITERAL1
DISH LITERAL1
DISH_BITS LITERAL1
ELECTRA_AC LITERAL1
+ENABLE_NOISE_FILTER_OPTION LITERAL1
+EPSON LITERAL1
FUJITSU_AC LITERAL1
FUJITSU_AC_BITS LITERAL1
FUJITSU_AC_CMD_STAY_ON LITERAL1
@@ -748,6 +764,7 @@ FUJITSU_AC_SWING_BOTH LITERAL1
FUJITSU_AC_SWING_HORIZ LITERAL1
FUJITSU_AC_SWING_OFF LITERAL1
FUJITSU_AC_SWING_VERT LITERAL1
+GE6711AR2853M LITERAL1
GICABLE LITERAL1
GICABLE_BITS LITERAL1
GLOBALCACHE LITERAL1
@@ -956,6 +973,7 @@ SEND_DAIKIN216 LITERAL1
SEND_DENON LITERAL1
SEND_DISH LITERAL1
SEND_ELECTRA_AC LITERAL1
+SEND_EPSON LITERAL1
SEND_FUJITSU_AC LITERAL1
SEND_GICABLE LITERAL1
SEND_GLOBALCACHE LITERAL1
@@ -1018,6 +1036,7 @@ SONY LITERAL1
SONY_12_BITS LITERAL1
SONY_15_BITS LITERAL1
SONY_20_BITS LITERAL1
+SONY_38K LITERAL1
TCL112AC LITERAL1
TECO LITERAL1
TIMEOUT_MS LITERAL1
@@ -1063,6 +1082,22 @@ kAiwaRcT501PostBits LITERAL1
kAiwaRcT501PostData LITERAL1
kAiwaRcT501PreBits LITERAL1
kAiwaRcT501PreData LITERAL1
+kAlokaBits LITERAL1
+kAlokaLedBlue LITERAL1
+kAlokaLedGreen LITERAL1
+kAlokaLedLightGreen LITERAL1
+kAlokaLedMidBlue LITERAL1
+kAlokaLedOrange LITERAL1
+kAlokaLedPink LITERAL1
+kAlokaLedPinkRed LITERAL1
+kAlokaLedRainbow LITERAL1
+kAlokaLedRed LITERAL1
+kAlokaLedTreeGrow LITERAL1
+kAlokaLedWhite LITERAL1
+kAlokaLedYellow LITERAL1
+kAlokaNightFade LITERAL1
+kAlokaNightTimer LITERAL1
+kAlokaPower LITERAL1
kAmcorAuto LITERAL1
kAmcorBits LITERAL1
kAmcorChecksumByte LITERAL1
@@ -1609,6 +1644,7 @@ kEconoStr LITERAL1
kElectraAcAuto LITERAL1
kElectraAcBitMark LITERAL1
kElectraAcBits LITERAL1
+kElectraAcCleanOffset LITERAL1
kElectraAcCool LITERAL1
kElectraAcDry LITERAL1
kElectraAcFan LITERAL1
@@ -1621,6 +1657,9 @@ kElectraAcFanSize LITERAL1
kElectraAcHdrMark LITERAL1
kElectraAcHdrSpace LITERAL1
kElectraAcHeat LITERAL1
+kElectraAcLightToggleMask LITERAL1
+kElectraAcLightToggleOff LITERAL1
+kElectraAcLightToggleOn LITERAL1
kElectraAcMaxTemp LITERAL1
kElectraAcMessageGap LITERAL1
kElectraAcMinRepeat LITERAL1
@@ -1637,7 +1676,10 @@ kElectraAcSwingVOffset LITERAL1
kElectraAcTempDelta LITERAL1
kElectraAcTempOffset LITERAL1
kElectraAcTempSize LITERAL1
+kElectraAcTurboOffset LITERAL1
kElectraAcZeroSpace LITERAL1
+kEpsonBits LITERAL1
+kEpsonMinRepeat LITERAL1
kEyeAutoStr LITERAL1
kEyeStr LITERAL1
kFalseStr LITERAL1
@@ -2094,9 +2136,38 @@ kLg32HdrSpace LITERAL1
kLg32HdrSpaceTicks LITERAL1
kLg32RptHdrMark LITERAL1
kLg32RptHdrMarkTicks LITERAL1
+kLgAcAuto LITERAL1
+kLgAcChecksumOffset LITERAL1
+kLgAcChecksumSize LITERAL1
+kLgAcCool LITERAL1
+kLgAcDry LITERAL1
+kLgAcFan LITERAL1
+kLgAcFanAuto LITERAL1
+kLgAcFanHigh LITERAL1
+kLgAcFanLow LITERAL1
+kLgAcFanMedium LITERAL1
+kLgAcFanOffset LITERAL1
+kLgAcFanSize LITERAL1
+kLgAcHeat LITERAL1
+kLgAcMaxTemp LITERAL1
+kLgAcMinTemp LITERAL1
+kLgAcModeOffset LITERAL1
+kLgAcModeSize LITERAL1
+kLgAcOffCommand LITERAL1
+kLgAcPowerOff LITERAL1
+kLgAcPowerOffset LITERAL1
+kLgAcPowerOn LITERAL1
+kLgAcPowerSize LITERAL1
+kLgAcSignature LITERAL1
+kLgAcSignatureOffset LITERAL1
+kLgAcSignatureSize LITERAL1
+kLgAcTempAdjust LITERAL1
+kLgAcTempOffset LITERAL1
+kLgAcTempSize LITERAL1
kLgBitMark LITERAL1
kLgBitMarkTicks LITERAL1
kLgBits LITERAL1
+kLgDefaultRepeat LITERAL1
kLgHdrMark LITERAL1
kLgHdrMarkTicks LITERAL1
kLgHdrSpace LITERAL1
@@ -2555,6 +2626,8 @@ kPanasonicAcFanMed LITERAL1
kPanasonicAcFanMin LITERAL1
kPanasonicAcFanModeTemp LITERAL1
kPanasonicAcHeat LITERAL1
+kPanasonicAcIonFilterByte LITERAL1
+kPanasonicAcIonFilterOffset LITERAL1
kPanasonicAcMaxTemp LITERAL1
kPanasonicAcMessageGap LITERAL1
kPanasonicAcMinTemp LITERAL1
@@ -2707,6 +2780,7 @@ kSamsungAcClean10Offset LITERAL1
kSamsungAcClean11Offset LITERAL1
kSamsungAcCool LITERAL1
kSamsungAcDefaultRepeat LITERAL1
+kSamsungAcDisplayOffset LITERAL1
kSamsungAcDry LITERAL1
kSamsungAcExtendedBits LITERAL1
kSamsungAcExtendedStateLength LITERAL1
@@ -2722,6 +2796,7 @@ kSamsungAcFanTurbo LITERAL1
kSamsungAcHdrMark LITERAL1
kSamsungAcHdrSpace LITERAL1
kSamsungAcHeat LITERAL1
+kSamsungAcIonOffset LITERAL1
kSamsungAcMaxTemp LITERAL1
kSamsungAcMinTemp LITERAL1
kSamsungAcModeOffset LITERAL1
@@ -2845,6 +2920,7 @@ kSlowStr LITERAL1
kSony12Bits LITERAL1
kSony15Bits LITERAL1
kSony20Bits LITERAL1
+kSonyAltFreq LITERAL1
kSonyHdrMark LITERAL1
kSonyHdrMarkTicks LITERAL1
kSonyMinBits LITERAL1
@@ -2857,6 +2933,7 @@ kSonyRptLength LITERAL1
kSonyRptLengthTicks LITERAL1
kSonySpace LITERAL1
kSonySpaceTicks LITERAL1
+kSonyStdFreq LITERAL1
kSonyTick LITERAL1
kSonyZeroMark LITERAL1
kSonyZeroMarkTicks LITERAL1
diff --git a/lib/IRremoteESP8266-2.7.1/library.json b/lib/IRremoteESP8266-2.7.4/library.json
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/library.json
rename to lib/IRremoteESP8266-2.7.4/library.json
index 50464bed1..f135c19e7 100644
--- a/lib/IRremoteESP8266-2.7.1/library.json
+++ b/lib/IRremoteESP8266-2.7.4/library.json
@@ -1,6 +1,6 @@
{
"name": "IRremoteESP8266",
- "version": "2.7.1",
+ "version": "2.7.4",
"keywords": "infrared, ir, remote, esp8266, esp32",
"description": "Send and receive infrared signals with multiple protocols (ESP8266/ESP32)",
"repository":
diff --git a/lib/IRremoteESP8266-2.7.1/library.properties b/lib/IRremoteESP8266-2.7.4/library.properties
similarity index 83%
rename from lib/IRremoteESP8266-2.7.1/library.properties
rename to lib/IRremoteESP8266-2.7.4/library.properties
index 6e7215626..e98cd3f3b 100644
--- a/lib/IRremoteESP8266-2.7.1/library.properties
+++ b/lib/IRremoteESP8266-2.7.4/library.properties
@@ -1,7 +1,7 @@
name=IRremoteESP8266
-version=2.7.1
+version=2.7.4
author=David Conran, Sebastien Warin, Mark Szabo, Ken Shirriff
-maintainer=Mark Szabo, David Conran, Sebastien Warin, Roi Dayan, Massimiliano Pinto
+maintainer=David Conran, Mark Szabo, Sebastien Warin, Roi Dayan, Massimiliano Pinto
sentence=Send and receive infrared signals with multiple protocols (ESP8266/ESP32)
paragraph=This library enables you to send and receive infra-red signals on an ESP8266 or an ESP32.
category=Device Control
diff --git a/lib/IRremoteESP8266-2.7.1/pylintrc b/lib/IRremoteESP8266-2.7.4/pylintrc
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/pylintrc
rename to lib/IRremoteESP8266-2.7.4/pylintrc
diff --git a/lib/IRremoteESP8266-2.7.1/src/CPPLINT.cfg b/lib/IRremoteESP8266-2.7.4/src/CPPLINT.cfg
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/CPPLINT.cfg
rename to lib/IRremoteESP8266-2.7.4/src/CPPLINT.cfg
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRac.cpp b/lib/IRremoteESP8266-2.7.4/src/IRac.cpp
similarity index 90%
rename from lib/IRremoteESP8266-2.7.1/src/IRac.cpp
rename to lib/IRremoteESP8266-2.7.4/src/IRac.cpp
index f8e5ca759..d3be30b80 100644
--- a/lib/IRremoteESP8266-2.7.1/src/IRac.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/IRac.cpp
@@ -25,6 +25,7 @@
#include "ir_Haier.h"
#include "ir_Hitachi.h"
#include "ir_Kelvinator.h"
+#include "ir_LG.h"
#include "ir_Midea.h"
#include "ir_Mitsubishi.h"
#include "ir_MitsubishiHeavy.h"
@@ -44,7 +45,7 @@ IRac::IRac(const uint16_t pin, const bool inverted, const bool use_modulation) {
_inverted = inverted;
_modulation = use_modulation;
initState(&next);
- _prev = next;
+ this->markAsSent();
}
void IRac::initState(stdAc::state_t *state,
@@ -149,6 +150,10 @@ bool IRac::isProtocolSupported(const decode_type_t protocol) {
#if SEND_KELVINATOR
case decode_type_t::KELVINATOR:
#endif
+#if SEND_LG
+ case decode_type_t::LG:
+ case decode_type_t::LG2:
+#endif
#if SEND_MIDEA
case decode_type_t::MIDEA:
#endif
@@ -461,7 +466,8 @@ void IRac::electra(IRElectraAc *ac,
const bool on, const stdAc::opmode_t mode,
const float degrees, const stdAc::fanspeed_t fan,
const stdAc::swingv_t swingv,
- const stdAc::swingh_t swingh) {
+ const stdAc::swingh_t swingh, const bool turbo,
+ const bool lighttoggle, const bool clean) {
ac->begin();
ac->setPower(on);
ac->setMode(ac->convertMode(mode));
@@ -470,11 +476,12 @@ void IRac::electra(IRElectraAc *ac,
ac->setSwingV(swingv != stdAc::swingv_t::kOff);
ac->setSwingH(swingh != stdAc::swingh_t::kOff);
// No Quiet setting available.
- // No Turbo setting available.
+ ac->setTurbo(turbo);
+ ac->setLightToggle(lighttoggle);
// No Light setting available.
// No Econo setting available.
// No Filter setting available.
- // No Clean setting available.
+ ac->setClean(clean);
// No Beep setting available.
// No Sleep setting available.
// No Clock setting available.
@@ -719,6 +726,30 @@ void IRac::kelvinator(IRKelvinatorAC *ac,
}
#endif // SEND_KELVINATOR
+#if SEND_LG
+void IRac::lg(IRLgAc *ac, const lg_ac_remote_model_t model,
+ const bool on, const stdAc::opmode_t mode,
+ const float degrees, const stdAc::fanspeed_t fan) {
+ ac->begin();
+ ac->setModel(model);
+ ac->setPower(on);
+ ac->setMode(ac->convertMode(mode));
+ ac->setTemp(degrees);
+ ac->setFan(ac->convertFan(fan));
+ // No Vertical swing setting available.
+ // No Horizontal swing setting available.
+ // No Quiet setting available.
+ // No Turbo setting available.
+ // No Light setting available.
+ // No Filter setting available.
+ // No Clean setting available.
+ // No Beep setting available.
+ // No Sleep setting available.
+ // No Clock setting available.
+ ac->send();
+}
+#endif // SEND_LG
+
#if SEND_MIDEA
void IRac::midea(IRMideaAC *ac,
const bool on, const stdAc::opmode_t mode, const bool celsius,
@@ -911,7 +942,8 @@ void IRac::panasonic(IRPanasonicAc *ac, const panasonic_ac_remote_model_t model,
const bool on, const stdAc::opmode_t mode,
const float degrees, const stdAc::fanspeed_t fan,
const stdAc::swingv_t swingv, const stdAc::swingh_t swingh,
- const bool quiet, const bool turbo, const int16_t clock) {
+ const bool quiet, const bool turbo, const bool filter,
+ const int16_t clock) {
ac->begin();
ac->setModel(model);
ac->setPower(on);
@@ -922,9 +954,9 @@ void IRac::panasonic(IRPanasonicAc *ac, const panasonic_ac_remote_model_t model,
ac->setSwingHorizontal(ac->convertSwingH(swingh));
ac->setQuiet(quiet);
ac->setPowerful(turbo);
+ ac->setIon(filter);
// No Light setting available.
// No Econo setting available.
- // No Filter setting available.
// No Clean setting available.
// No Beep setting available.
// No Sleep setting available.
@@ -938,7 +970,8 @@ void IRac::samsung(IRSamsungAc *ac,
const bool on, const stdAc::opmode_t mode,
const float degrees,
const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
- const bool quiet, const bool turbo, const bool clean,
+ const bool quiet, const bool turbo, const bool light,
+ const bool filter, const bool clean,
const bool beep, const bool prevpower,
const bool forcepower) {
ac->begin();
@@ -951,9 +984,9 @@ void IRac::samsung(IRSamsungAc *ac,
// No Horizontal swing setting available.
ac->setQuiet(quiet);
ac->setPowerful(turbo);
- // No Light setting available.
+ ac->setDisplay(light);
// No Econo setting available.
- // No Filter setting available.
+ ac->setIon(filter);
ac->setClean(clean);
ac->setBeep(beep);
// No Sleep setting available.
@@ -1144,6 +1177,20 @@ void IRac::whirlpool(IRWhirlpoolAc *ac, const whirlpool_ac_remote_model_t model,
}
#endif // SEND_WHIRLPOOL_AC
+// Create a new state base on the provided state that has been suitably fixed.
+// Args:
+// state: The state_t structure describing the desired a/c state.
+//
+// Returns:
+// A stdAc::state_t with the needed settings.
+stdAc::state_t IRac::cleanState(const stdAc::state_t state) {
+ stdAc::state_t result = state;
+ // A hack for Home Assistant, it appears to need/want an Off opmode.
+ // So enforce the power is off if the mode is also off.
+ if (state.mode == stdAc::opmode_t::kOff) result.power = false;
+ return result;
+}
+
// Create a new state base on desired & previous states but handle
// any state changes for options that need to be toggled.
// Args:
@@ -1175,6 +1222,9 @@ stdAc::state_t IRac::handleToggles(const stdAc::state_t desired,
result.power = desired.power ^ prev->power;
result.light = desired.light ^ prev->light;
break;
+ case decode_type_t::ELECTRA_AC:
+ result.light = desired.light ^ prev->light;
+ break;
case decode_type_t::MIDEA:
case decode_type_t::HITACHI_AC424:
if ((desired.swingv == stdAc::swingv_t::kOff) ^
@@ -1244,23 +1294,18 @@ bool IRac::sendAc(const decode_type_t vendor, const int16_t model,
// Returns:
// boolean: True, if accepted/converted/attempted. False, if unsupported.
bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
- stdAc::state_t send = this->handleToggles(desired, prev);
- // Convert the temperature to Celsius.
- float degC;
- if (desired.celsius)
- degC = send.degrees;
- else
- degC = fahrenheitToCelsius(desired.degrees);
- bool on = desired.power;
- // A hack for Home Assistant, it appears to need/want an Off opmode.
- if (desired.mode == stdAc::opmode_t::kOff) on = false;
+ // Convert the temp from Fahrenheit to Celsius if we are not in Celsius mode.
+ float degC = desired.celsius ? desired.degrees
+ : fahrenheitToCelsius(desired.degrees);
+ // special `state_t` that is required to be sent based on that.
+ stdAc::state_t send = this->handleToggles(this->cleanState(desired), prev);
// Per vendor settings & setup.
switch (send.protocol) {
#if SEND_AMCOR
case AMCOR:
{
IRAmcorAc ac(_pin, _inverted, _modulation);
- amcor(&ac, on, send.mode, degC, send.fanspeed);
+ amcor(&ac, send.power, send.mode, degC, send.fanspeed);
break;
}
#endif // SEND_AMCOR
@@ -1268,8 +1313,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case ARGO:
{
IRArgoAC ac(_pin, _inverted, _modulation);
- argo(&ac, on, send.mode, degC, send.fanspeed, send.swingv, send.turbo,
- send.sleep);
+ argo(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
+ send.turbo, send.sleep);
break;
}
#endif // SEND_ARGO
@@ -1277,8 +1322,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case COOLIX:
{
IRCoolixAC ac(_pin, _inverted, _modulation);
- coolix(&ac, on, send.mode, degC, send.fanspeed, send.swingv, send.swingh,
- send.turbo, send.light, send.clean, send.sleep);
+ coolix(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
+ send.swingh, send.turbo, send.light, send.clean, send.sleep);
break;
}
#endif // SEND_COOLIX
@@ -1286,8 +1331,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case DAIKIN:
{
IRDaikinESP ac(_pin, _inverted, _modulation);
- daikin(&ac, on, send.mode, degC, send.fanspeed, send.swingv, send.swingh,
- send.quiet, send.turbo, send.econo, send.clean);
+ daikin(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
+ send.swingh, send.quiet, send.turbo, send.econo, send.clean);
break;
}
#endif // SEND_DAIKIN
@@ -1295,7 +1340,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case DAIKIN128:
{
IRDaikin128 ac(_pin, _inverted, _modulation);
- daikin128(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
+ daikin128(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.quiet, send.turbo, send.light, send.econo, send.sleep,
send.clock);
break;
@@ -1305,7 +1350,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case DAIKIN152:
{
IRDaikin152 ac(_pin, _inverted, _modulation);
- daikin152(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
+ daikin152(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.quiet, send.turbo, send.econo);
break;
}
@@ -1314,7 +1359,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case DAIKIN160:
{
IRDaikin160 ac(_pin, _inverted, _modulation);
- daikin160(&ac, on, send.mode, degC, send.fanspeed, send.swingv);
+ daikin160(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv);
break;
}
#endif // SEND_DAIKIN160
@@ -1322,7 +1367,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case DAIKIN176:
{
IRDaikin176 ac(_pin, _inverted, _modulation);
- daikin176(&ac, on, send.mode, degC, send.fanspeed, send.swingh);
+ daikin176(&ac, send.power, send.mode, degC, send.fanspeed, send.swingh);
break;
}
#endif // SEND_DAIKIN176
@@ -1330,9 +1375,9 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case DAIKIN2:
{
IRDaikin2 ac(_pin, _inverted, _modulation);
- daikin2(&ac, on, send.mode, degC, send.fanspeed, send.swingv, send.swingh,
- send.quiet, send.turbo, send.light, send.econo, send.filter,
- send.clean, send.beep, send.sleep, send.clock);
+ daikin2(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
+ send.swingh, send.quiet, send.turbo, send.light, send.econo,
+ send.filter, send.clean, send.beep, send.sleep, send.clock);
break;
}
#endif // SEND_DAIKIN2
@@ -1340,7 +1385,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case DAIKIN216:
{
IRDaikin216 ac(_pin, _inverted, _modulation);
- daikin216(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
+ daikin216(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.swingh, send.quiet, send.turbo);
break;
}
@@ -1349,8 +1394,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case ELECTRA_AC:
{
IRElectraAc ac(_pin, _inverted, _modulation);
- electra(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
- send.swingh);
+ electra(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
+ send.swingh, send.turbo, send.light, send.clean);
break;
}
#endif // SEND_ELECTRA_AC
@@ -1359,9 +1404,9 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
{
IRFujitsuAC ac(_pin, (fujitsu_ac_remote_model_t)send.model, _inverted,
_modulation);
- fujitsu(&ac, (fujitsu_ac_remote_model_t)send.model, on, send.mode, degC,
- send.fanspeed, send.swingv, send.swingh, send.quiet, send.turbo,
- send.econo, send.filter, send.clean);
+ fujitsu(&ac, (fujitsu_ac_remote_model_t)send.model, send.power, send.mode,
+ degC, send.fanspeed, send.swingv, send.swingh, send.quiet,
+ send.turbo, send.econo, send.filter, send.clean);
break;
}
#endif // SEND_FUJITSU_AC
@@ -1369,7 +1414,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case GOODWEATHER:
{
IRGoodweatherAc ac(_pin, _inverted, _modulation);
- goodweather(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
+ goodweather(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.turbo, send.light, send.sleep);
break;
}
@@ -1379,7 +1424,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
{
IRGreeAC ac(_pin, (gree_ac_remote_model_t)send.model, _inverted,
_modulation);
- gree(&ac, (gree_ac_remote_model_t)send.model, on, send.mode, degC,
+ gree(&ac, (gree_ac_remote_model_t)send.model, send.power, send.mode, degC,
send.fanspeed, send.swingv, send.turbo, send.light, send.clean,
send.sleep);
break;
@@ -1389,8 +1434,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case HAIER_AC:
{
IRHaierAC ac(_pin, _inverted, _modulation);
- haier(&ac, on, send.mode, degC, send.fanspeed, send.swingv, send.filter,
- send.sleep, send.clock);
+ haier(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
+ send.filter, send.sleep, send.clock);
break;
}
#endif // SEND_HAIER_AC
@@ -1398,7 +1443,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case HAIER_AC_YRW02:
{
IRHaierACYRW02 ac(_pin, _inverted, _modulation);
- haierYrwo2(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
+ haierYrwo2(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.turbo, send.filter, send.sleep);
break;
}
@@ -1407,7 +1452,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case HITACHI_AC:
{
IRHitachiAc ac(_pin, _inverted, _modulation);
- hitachi(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
+ hitachi(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.swingh);
break;
}
@@ -1416,7 +1461,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case HITACHI_AC424:
{
IRHitachiAc424 ac(_pin, _inverted, _modulation);
- hitachi424(&ac, on, send.mode, degC, send.fanspeed, send.swingv);
+ hitachi424(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv);
break;
}
#endif // SEND_HITACHI_AC424
@@ -1424,18 +1469,28 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case KELVINATOR:
{
IRKelvinatorAC ac(_pin, _inverted, _modulation);
- kelvinator(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
+ kelvinator(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.swingh, send.quiet, send.turbo, send.light, send.filter,
send.clean);
break;
}
#endif // SEND_KELVINATOR
+#if SEND_LG
+ case LG:
+ case LG2:
+ {
+ IRLgAc ac(_pin, _inverted, _modulation);
+ lg(&ac, (lg_ac_remote_model_t)send.model, send.power, send.mode,
+ send.degrees, send.fanspeed);
+ break;
+ }
+#endif // SEND_LG
#if SEND_MIDEA
case MIDEA:
{
IRMideaAC ac(_pin, _inverted, _modulation);
- midea(&ac, on, send.mode, send.celsius, send.degrees, send.fanspeed,
- send.swingv, send.sleep);
+ midea(&ac, send.power, send.mode, send.celsius, send.degrees,
+ send.fanspeed, send.swingv, send.sleep);
break;
}
#endif // SEND_MIDEA
@@ -1443,7 +1498,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case MITSUBISHI_AC:
{
IRMitsubishiAC ac(_pin, _inverted, _modulation);
- mitsubishi(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
+ mitsubishi(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.swingh, send.quiet, send.clock);
break;
}
@@ -1452,8 +1507,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case MITSUBISHI112:
{
IRMitsubishi112 ac(_pin, _inverted, _modulation);
- mitsubishi112(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
- send.swingh, send.quiet);
+ mitsubishi112(&ac, send.power, send.mode, degC, send.fanspeed,
+ send.swingv, send.swingh, send.quiet);
break;
}
#endif // SEND_MITSUBISHI112
@@ -1461,8 +1516,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case MITSUBISHI136:
{
IRMitsubishi136 ac(_pin, _inverted, _modulation);
- mitsubishi136(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
- send.quiet);
+ mitsubishi136(&ac, send.power, send.mode, degC, send.fanspeed,
+ send.swingv, send.quiet);
break;
}
#endif // SEND_MITSUBISHI136
@@ -1470,16 +1525,17 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case MITSUBISHI_HEAVY_88:
{
IRMitsubishiHeavy88Ac ac(_pin, _inverted, _modulation);
- mitsubishiHeavy88(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
- send.swingh, send.turbo, send.econo, send.clean);
+ mitsubishiHeavy88(&ac, send.power, send.mode, degC, send.fanspeed,
+ send.swingv, send.swingh, send.turbo, send.econo,
+ send.clean);
break;
}
case MITSUBISHI_HEAVY_152:
{
IRMitsubishiHeavy152Ac ac(_pin, _inverted, _modulation);
- mitsubishiHeavy152(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
- send.swingh, send.quiet, send.turbo, send.econo,
- send.filter, send.clean, send.sleep);
+ mitsubishiHeavy152(&ac, send.power, send.mode, degC, send.fanspeed,
+ send.swingv, send.swingh, send.quiet, send.turbo,
+ send.econo, send.filter, send.clean, send.sleep);
break;
}
#endif // SEND_MITSUBISHIHEAVY
@@ -1487,7 +1543,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case NEOCLIMA:
{
IRNeoclimaAc ac(_pin, _inverted, _modulation);
- neoclima(&ac, on, send.mode, degC, send.fanspeed, send.swingv,
+ neoclima(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.swingh, send.turbo, send.light, send.filter, send.sleep);
break;
}
@@ -1496,9 +1552,9 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case PANASONIC_AC:
{
IRPanasonicAc ac(_pin, _inverted, _modulation);
- panasonic(&ac, (panasonic_ac_remote_model_t)send.model, on, send.mode,
- degC, send.fanspeed, send.swingv, send.swingh, send.quiet,
- send.turbo, send.clock);
+ panasonic(&ac, (panasonic_ac_remote_model_t)send.model, send.power,
+ send.mode, degC, send.fanspeed, send.swingv, send.swingh,
+ send.quiet, send.turbo, send.clock);
break;
}
#endif // SEND_PANASONIC_AC
@@ -1506,8 +1562,9 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case SAMSUNG_AC:
{
IRSamsungAc ac(_pin, _inverted, _modulation);
- samsung(&ac, on, send.mode, degC, send.fanspeed, send.swingv, send.quiet,
- send.turbo, send.clean, send.beep, prev->power);
+ samsung(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
+ send.quiet, send.turbo, send.light, send.filter, send.clean,
+ send.beep, prev->power);
break;
}
#endif // SEND_SAMSUNG_AC
@@ -1515,7 +1572,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case SHARP_AC:
{
IRSharpAc ac(_pin, _inverted, _modulation);
- sharp(&ac, on, send.mode, degC, send.fanspeed);
+ sharp(&ac, send.power, send.mode, degC, send.fanspeed);
break;
}
#endif // SEND_SHARP_AC
@@ -1523,8 +1580,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case TCL112AC:
{
IRTcl112Ac ac(_pin, _inverted, _modulation);
- tcl112(&ac, on, send.mode, degC, send.fanspeed, send.swingv, send.swingh,
- send.turbo, send.light, send.econo, send.filter);
+ tcl112(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
+ send.swingh, send.turbo, send.light, send.econo, send.filter);
break;
}
#endif // SEND_TCL112AC
@@ -1532,8 +1589,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case TECO:
{
IRTecoAc ac(_pin, _inverted, _modulation);
- teco(&ac, on, send.mode, degC, send.fanspeed, send.swingv, send.light,
- send.sleep);
+ teco(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
+ send.light, send.sleep);
break;
}
#endif // SEND_TECO
@@ -1541,7 +1598,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case TOSHIBA_AC:
{
IRToshibaAC ac(_pin, _inverted, _modulation);
- toshiba(&ac, on, send.mode, degC, send.fanspeed);
+ toshiba(&ac, send.power, send.mode, degC, send.fanspeed);
break;
}
#endif // SEND_TOSHIBA_AC
@@ -1549,7 +1606,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case TROTEC:
{
IRTrotecESP ac(_pin, _inverted, _modulation);
- trotec(&ac, on, send.mode, degC, send.fanspeed, send.sleep);
+ trotec(&ac, send.power, send.mode, degC, send.fanspeed, send.sleep);
break;
}
#endif // SEND_TROTEC
@@ -1557,8 +1614,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case VESTEL_AC:
{
IRVestelAc ac(_pin, _inverted, _modulation);
- vestel(&ac, on, send.mode, degC, send.fanspeed, send.swingv, send.turbo,
- send.filter, send.sleep, send.clock);
+ vestel(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
+ send.turbo, send.filter, send.sleep, send.clock);
break;
}
#endif // SEND_VESTEL_AC
@@ -1566,9 +1623,9 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
case WHIRLPOOL_AC:
{
IRWhirlpoolAc ac(_pin, _inverted, _modulation);
- whirlpool(&ac, (whirlpool_ac_remote_model_t)send.model, on, send.mode,
- degC, send.fanspeed, send.swingv, send.turbo, send.light,
- send.sleep, send.clock);
+ whirlpool(&ac, (whirlpool_ac_remote_model_t)send.model, send.power,
+ send.mode, degC, send.fanspeed, send.swingv, send.turbo,
+ send.light, send.sleep, send.clock);
break;
}
#endif // SEND_WHIRLPOOL_AC
@@ -1578,13 +1635,18 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
return true; // Success.
}
+// Update the previous state to the current one.
+void IRac::markAsSent(void) {
+ _prev = next;
+}
+
// Send an A/C message based soley on our internal state.
//
// Returns:
// boolean: True, if accepted/converted/attempted. False, if unsupported.
bool IRac::sendAc(void) {
bool success = this->sendAc(next, &_prev);
- _prev = next;
+ if (success) this->markAsSent();
return success;
}
@@ -1750,7 +1812,8 @@ int16_t IRac::strToModel(const char *str, const int16_t def) {
return panasonic_ac_remote_model_t::kPanasonicLke;
} else if (!strcasecmp(str, "NKE") || !strcasecmp(str, "PANASONICNKE")) {
return panasonic_ac_remote_model_t::kPanasonicNke;
- } else if (!strcasecmp(str, "DKE") || !strcasecmp(str, "PANASONICDKE")) {
+ } else if (!strcasecmp(str, "DKE") || !strcasecmp(str, "PANASONICDKE") ||
+ !strcasecmp(str, "PKR") || !strcasecmp(str, "PANASONICPKR")) {
return panasonic_ac_remote_model_t::kPanasonicDke;
} else if (!strcasecmp(str, "JKE") || !strcasecmp(str, "PANASONICJKE")) {
return panasonic_ac_remote_model_t::kPanasonicJke;
@@ -2129,6 +2192,21 @@ namespace IRAcUtils {
return ac.toString();
}
#endif // DECODE_TCL112AC
+#if DECODE_LG
+ case decode_type_t::LG:
+ case decode_type_t::LG2: {
+ IRLgAc ac(0);
+ ac.setRaw(result->value); // Like Coolix, use value instead of state.
+ switch (result->decode_type) {
+ case decode_type_t::LG2:
+ ac.setModel(lg_ac_remote_model_t::AKB75215403);
+ break;
+ default:
+ ac.setModel(lg_ac_remote_model_t::GE6711AR2853M);
+ }
+ return ac.isValidLgAc() ? ac.toString() : "";
+ }
+#endif // DECODE_LG
default:
return "";
}
@@ -2299,6 +2377,23 @@ namespace IRAcUtils {
break;
}
#endif // DECODE_KELVINATOR
+#if DECODE_LG
+ case decode_type_t::LG:
+ case decode_type_t::LG2: {
+ IRLgAc ac(kGpioUnused);
+ ac.setRaw(decode->value); // Uses value instead of state.
+ if (!ac.isValidLgAc()) return false;
+ switch (decode->decode_type) {
+ case decode_type_t::LG2:
+ ac.setModel(lg_ac_remote_model_t::AKB75215403);
+ break;
+ default:
+ ac.setModel(lg_ac_remote_model_t::GE6711AR2853M);
+ }
+ *result = ac.toCommon();
+ break;
+ }
+#endif // DECODE_LG
#if DECODE_MIDEA
case decode_type_t::MIDEA: {
IRMideaAC ac(kGpioUnused);
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRac.h b/lib/IRremoteESP8266-2.7.4/src/IRac.h
similarity index 93%
rename from lib/IRremoteESP8266-2.7.1/src/IRac.h
rename to lib/IRremoteESP8266-2.7.4/src/IRac.h
index 4e1237d8d..f38865e50 100644
--- a/lib/IRremoteESP8266-2.7.1/src/IRac.h
+++ b/lib/IRremoteESP8266-2.7.4/src/IRac.h
@@ -18,6 +18,7 @@
#include "ir_Haier.h"
#include "ir_Hitachi.h"
#include "ir_Kelvinator.h"
+#include "ir_LG.h"
#include "ir_Midea.h"
#include "ir_Mitsubishi.h"
#include "ir_MitsubishiHeavy.h"
@@ -53,6 +54,7 @@ class IRac {
const bool beep, const int16_t sleep,
const int16_t clock);
static void initState(stdAc::state_t *state);
+ void markAsSent(void);
bool sendAc(void);
bool sendAc(const stdAc::state_t desired, const stdAc::state_t *prev = NULL);
bool sendAc(const decode_type_t vendor, const int16_t model,
@@ -136,16 +138,16 @@ class IRac {
const bool quiet, const bool turbo, const bool econo);
#endif // SEND_DAIKIN152
#if SEND_DAIKIN160
-void daikin160(IRDaikin160 *ac,
- const bool on, const stdAc::opmode_t mode,
- const float degrees, const stdAc::fanspeed_t fan,
- const stdAc::swingv_t swingv);
+ void daikin160(IRDaikin160 *ac,
+ const bool on, const stdAc::opmode_t mode,
+ const float degrees, const stdAc::fanspeed_t fan,
+ const stdAc::swingv_t swingv);
#endif // SEND_DAIKIN160
#if SEND_DAIKIN176
-void daikin176(IRDaikin176 *ac,
- const bool on, const stdAc::opmode_t mode,
- const float degrees, const stdAc::fanspeed_t fan,
- const stdAc::swingh_t swingh);
+ void daikin176(IRDaikin176 *ac,
+ const bool on, const stdAc::opmode_t mode,
+ const float degrees, const stdAc::fanspeed_t fan,
+ const stdAc::swingh_t swingh);
#endif // SEND_DAIKIN176
#if SEND_DAIKIN2
void daikin2(IRDaikin2 *ac,
@@ -169,7 +171,8 @@ void electra(IRElectraAc *ac,
const bool on, const stdAc::opmode_t mode,
const float degrees, const stdAc::fanspeed_t fan,
const stdAc::swingv_t swingv,
- const stdAc::swingh_t swingh);
+ const stdAc::swingh_t swingh, const bool turbo,
+ const bool lighttoggle, const bool clean);
#endif // SEND_ELECTRA_AC
#if SEND_FUJITSU_AC
void fujitsu(IRFujitsuAC *ac, const fujitsu_ac_remote_model_t model,
@@ -230,6 +233,11 @@ void electra(IRElectraAc *ac,
const bool quiet, const bool turbo, const bool light,
const bool filter, const bool clean);
#endif // SEND_KELVINATOR
+#if SEND_LG
+ void lg(IRLgAc *ac, const lg_ac_remote_model_t model,
+ const bool on, const stdAc::opmode_t mode,
+ const float degrees, const stdAc::fanspeed_t fan);
+#endif // SEND_LG
#if SEND_MIDEA
void midea(IRMideaAC *ac,
const bool on, const stdAc::opmode_t mode, const bool celsius,
@@ -286,13 +294,15 @@ void electra(IRElectraAc *ac,
const bool on, const stdAc::opmode_t mode, const float degrees,
const stdAc::fanspeed_t fan,
const stdAc::swingv_t swingv, const stdAc::swingh_t swingh,
- const bool quiet, const bool turbo, const int16_t clock = -1);
+ const bool quiet, const bool turbo, const bool filter,
+ const int16_t clock = -1);
#endif // SEND_PANASONIC_AC
#if SEND_SAMSUNG_AC
void samsung(IRSamsungAc *ac,
const bool on, const stdAc::opmode_t mode, const float degrees,
const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
- const bool quiet, const bool turbo, const bool clean,
+ const bool quiet, const bool turbo, const bool light,
+ const bool filter, const bool clean,
const bool beep, const bool prevpower = true,
const bool forcepower = true);
#endif // SEND_SAMSUNG_AC
@@ -340,6 +350,7 @@ void electra(IRElectraAc *ac,
const bool turbo, const bool light,
const int16_t sleep = -1, const int16_t clock = -1);
#endif // SEND_WHIRLPOOL_AC
+static stdAc::state_t cleanState(const stdAc::state_t state);
static stdAc::state_t handleToggles(const stdAc::state_t desired,
const stdAc::state_t *prev = NULL);
}; // IRac class
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRrecv.cpp b/lib/IRremoteESP8266-2.7.4/src/IRrecv.cpp
similarity index 72%
rename from lib/IRremoteESP8266-2.7.1/src/IRrecv.cpp
rename to lib/IRremoteESP8266-2.7.4/src/IRrecv.cpp
index c2c1b5394..e629fc218 100644
--- a/lib/IRremoteESP8266-2.7.1/src/IRrecv.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/IRrecv.cpp
@@ -307,6 +307,37 @@ void IRrecv::setTolerance(const uint8_t percent) {
// Get the base tolerance percentage for matching incoming IR messages.
uint8_t IRrecv::getTolerance(void) { return _tolerance; }
+#if ENABLE_NOISE_FILTER_OPTION
+// Remove or merge pulses in the capture buffer that are too short.
+// Args:
+// results: Ptr to the decode_results we are going to filter/modify.
+// floor: Only allow values in the buffer large than this. (in micro seconds)
+void IRrecv::crudeNoiseFilter(decode_results *results, const uint16_t floor) {
+ if (floor == 0) return; // Nothing to do.
+ const uint16_t kTickFloor = floor / kRawTick;
+ const uint16_t kBufSize = getBufSize();
+ uint16_t offset = kStartOffset;
+ while (offset < results->rawlen && offset + 2 < kBufSize) {
+ uint16_t curr = results->rawbuf[offset];
+ uint16_t next = results->rawbuf[offset + 1];
+ uint16_t addition = curr + next;
+ if (curr < kTickFloor) { // Is it too short?
+ // Shuffle the buffer down. i.e. Remove the mark & space pair.
+ // Note: `memcpy()` can't be used as rawbuf is `volatile`.
+ for (uint16_t i = offset + 2; i <= results->rawlen && i < kBufSize; i++)
+ results->rawbuf[i - 2] = results->rawbuf[i];
+ if (offset > 1) { // There is a previous pair we can add to.
+ // Merge this pair into into the previous space.
+ results->rawbuf[offset - 1] += addition;
+ }
+ results->rawlen -= 2; // Adjust the length.
+ } else {
+ offset++; // Move along.
+ }
+ }
+}
+#endif // ENABLE_NOISE_FILTER_OPTION
+
// Decodes the received IR message.
// If the interrupt state is saved, we will immediately resume waiting
// for the next IR message to avoid missing messages.
@@ -317,9 +348,41 @@ uint8_t IRrecv::getTolerance(void) { return _tolerance; }
// results: A pointer to where the decoded IR message will be stored.
// save: A pointer to an irparams_t instance in which to save
// the interrupt's memory/state. NULL means don't save it.
+// max_skip: Maximum Nr. of pulses at the begining of a capture we can skip
+// when attempting to find a protocol we can successfully decode.
+// This parameter can dramatically improve detection of protocols
+// when there is light IR interference just before an incoming IR
+// message, however, it comes at a steep performace price.
+// CAUTION: Increasing this value will dramatically (linnearly)
+// increase the cpu time & usage to decode protocols.
+// e.g. 0 -> 1 will be a 2x increase in cpu usage/time.
+// 0 -> 2 will be a 3x increase etc.
+// If you are going to do this, consider disabling
+// protocol decoding for protocols you are not expecting.
+// (Default is 0. No skipping.)
+// noise_floor: Pulses below this size (in usecs) will be removed or merged
+// prior to any decoding. This is to try to remove noise/poor
+// readings & slighly increase the chances of a successful
+// decode but at the cost of data fidelity & integrity.
+// (Defaults to 0 usecs. i.e. Don't filter; which is safe!)
+// DANGER: **Here Be Dragons!**
+// If you set the `filter_floor` value too high, it **WILL**
+// break decoding of some protocols. You have been warned!
+// **Any** non-zero value has the potential to **cook** the
+// captured raw data. i.e. The data is going to lie to you.
+// It may obscure hardware, circuit, & environment issues thus
+// making it impossible to support you accurately or
+// confidently.
+// Values of <= 50 usecs will probably be safe.
+// 51 - 100 usecs **might** be okay.
+// 100 - 150 usecs is "Danger, Will Robinson!".
+// 150 - 200 usecs expect broken protocols.
+// At 200+ usecs, you **have** protocols you can't decode!!
+//
// Returns:
// A boolean indicating if an IR message is ready or not.
-bool IRrecv::decode(decode_results *results, irparams_t *save) {
+bool IRrecv::decode(decode_results *results, irparams_t *save,
+ uint8_t max_skip, uint16_t noise_floor) {
// Proceed only if an IR message been received.
#ifndef UNIT_TEST
if (irparams.rcvstate != kStopState) return false;
@@ -365,320 +428,342 @@ bool IRrecv::decode(decode_results *results, irparams_t *save) {
results->command = 0;
results->repeat = false;
+#if ENABLE_NOISE_FILTER_OPTION
+ crudeNoiseFilter(results, noise_floor);
+#endif // ENABLE_NOISE_FILTER_OPTION
+ // Keep looking for protocols until we've run out of entries to skip or we
+ // find a valid protocol message.
+ for (uint16_t offset = kStartOffset;
+ offset <= (max_skip * 2) + kStartOffset;
+ offset += 2) {
#if DECODE_AIWA_RC_T501
- DPRINTLN("Attempting Aiwa RC T501 decode");
- // Try decodeAiwaRCT501() before decodeSanyoLC7461() & decodeNEC()
- // because the protocols are similar. This protocol is more specific than
- // those ones, so should got before them.
- if (decodeAiwaRCT501(results)) return true;
+ DPRINTLN("Attempting Aiwa RC T501 decode");
+ // Try decodeAiwaRCT501() before decodeSanyoLC7461() & decodeNEC()
+ // because the protocols are similar. This protocol is more specific than
+ // those ones, so should go before them.
+ if (decodeAiwaRCT501(results, offset)) return true;
#endif
#if DECODE_SANYO
- DPRINTLN("Attempting Sanyo LC7461 decode");
- // Try decodeSanyoLC7461() before decodeNEC() because the protocols are
- // similar in timings & structure, but the Sanyo one is much longer than the
- // NEC protocol (42 vs 32 bits) so this one should be tried first to try to
- // reduce false detection as a NEC packet.
- if (decodeSanyoLC7461(results)) return true;
+ DPRINTLN("Attempting Sanyo LC7461 decode");
+ // Try decodeSanyoLC7461() before decodeNEC() because the protocols are
+ // similar in timings & structure, but the Sanyo one is much longer than the
+ // NEC protocol (42 vs 32 bits) so this one should be tried first to try to
+ // reduce false detection as a NEC packet.
+ if (decodeSanyoLC7461(results, offset)) return true;
#endif
#if DECODE_CARRIER_AC
- DPRINTLN("Attempting Carrier AC decode");
- // Try decodeCarrierAC() before decodeNEC() because the protocols are
- // similar in timings & structure, but the Carrier one is much longer than the
- // NEC protocol (3x32 bits vs 1x32 bits) so this one should be tried first to
- // try to reduce false detection as a NEC packet.
- if (decodeCarrierAC(results)) return true;
+ DPRINTLN("Attempting Carrier AC decode");
+ // Try decodeCarrierAC() before decodeNEC() because the protocols are
+ // similar in timings & structure, but the Carrier one is much longer than
+ // the NEC protocol (3x32 bits vs 1x32 bits) so this one should be tried
+ // first to try to reduce false detection as a NEC packet.
+ if (decodeCarrierAC(results, offset)) return true;
#endif
#if DECODE_PIONEER
- DPRINTLN("Attempting Pioneer decode");
- // Try decodePioneer() before decodeNEC() because the protocols are
- // similar in timings & structure, but the Pioneer one is much longer than the
- // NEC protocol (2x32 bits vs 1x32 bits) so this one should be tried first to
- // try to reduce false detection as a NEC packet.
- if (decodePioneer(results)) return true;
+ DPRINTLN("Attempting Pioneer decode");
+ // Try decodePioneer() before decodeNEC() because the protocols are
+ // similar in timings & structure, but the Pioneer one is much longer than
+ // the NEC protocol (2x32 bits vs 1x32 bits) so this one should be tried
+ // first to try to reduce false detection as a NEC packet.
+ if (decodePioneer(results, offset)) return true;
+#endif
+#if DECODE_EPSON
+ DPRINTLN("Attempting Epson decode");
+ // Try decodeEpson() before decodeNEC() because the protocols are
+ // similar in timings & structure, but the Epson one is much longer than the
+ // NEC protocol (3x32 identical bits vs 1x32 bits) so this one should be tried
+ // first to try to reduce false detection as a NEC packet.
+ if (decodeEpson(results, offset)) return true;
#endif
#if DECODE_NEC
- DPRINTLN("Attempting NEC decode");
- if (decodeNEC(results)) return true;
+ DPRINTLN("Attempting NEC decode");
+ if (decodeNEC(results, offset)) return true;
#endif
#if DECODE_SONY
- DPRINTLN("Attempting Sony decode");
- if (decodeSony(results)) return true;
+ DPRINTLN("Attempting Sony decode");
+ if (decodeSony(results, offset)) return true;
#endif
#if DECODE_MITSUBISHI
- DPRINTLN("Attempting Mitsubishi decode");
- if (decodeMitsubishi(results)) return true;
+ DPRINTLN("Attempting Mitsubishi decode");
+ if (decodeMitsubishi(results, offset)) return true;
#endif
#if DECODE_MITSUBISHI_AC
- DPRINTLN("Attempting Mitsubishi AC decode");
- if (decodeMitsubishiAC(results)) return true;
+ DPRINTLN("Attempting Mitsubishi AC decode");
+ if (decodeMitsubishiAC(results, offset)) return true;
#endif
#if DECODE_MITSUBISHI2
- DPRINTLN("Attempting Mitsubishi2 decode");
- if (decodeMitsubishi2(results)) return true;
+ DPRINTLN("Attempting Mitsubishi2 decode");
+ if (decodeMitsubishi2(results, offset)) return true;
#endif
#if DECODE_RC5
- DPRINTLN("Attempting RC5 decode");
- if (decodeRC5(results)) return true;
+ DPRINTLN("Attempting RC5 decode");
+ if (decodeRC5(results, offset)) return true;
#endif
#if DECODE_RC6
- DPRINTLN("Attempting RC6 decode");
- if (decodeRC6(results)) return true;
+ DPRINTLN("Attempting RC6 decode");
+ if (decodeRC6(results, offset)) return true;
#endif
#if DECODE_RCMM
- DPRINTLN("Attempting RC-MM decode");
- if (decodeRCMM(results)) return true;
+ DPRINTLN("Attempting RC-MM decode");
+ if (decodeRCMM(results, offset)) return true;
#endif
#if DECODE_FUJITSU_AC
- // Fujitsu A/C needs to precede Panasonic and Denon as it has a short
- // message which looks exactly the same as a Panasonic/Denon message.
- DPRINTLN("Attempting Fujitsu A/C decode");
- if (decodeFujitsuAC(results)) return true;
+ // Fujitsu A/C needs to precede Panasonic and Denon as it has a short
+ // message which looks exactly the same as a Panasonic/Denon message.
+ DPRINTLN("Attempting Fujitsu A/C decode");
+ if (decodeFujitsuAC(results, offset)) return true;
#endif
#if DECODE_DENON
- // Denon needs to precede Panasonic as it is a special case of Panasonic.
- DPRINTLN("Attempting Denon decode");
- if (decodeDenon(results, kDenon48Bits) || decodeDenon(results, kDenonBits) ||
- decodeDenon(results, kDenonLegacyBits))
- return true;
+ // Denon needs to precede Panasonic as it is a special case of Panasonic.
+ DPRINTLN("Attempting Denon decode");
+ if (decodeDenon(results, offset, kDenon48Bits) ||
+ decodeDenon(results, offset, kDenonBits) ||
+ decodeDenon(results, offset, kDenonLegacyBits))
+ return true;
#endif
#if DECODE_PANASONIC
- DPRINTLN("Attempting Panasonic decode");
- if (decodePanasonic(results)) return true;
+ DPRINTLN("Attempting Panasonic decode");
+ if (decodePanasonic(results, offset)) return true;
#endif
#if DECODE_LG
- DPRINTLN("Attempting LG (28-bit) decode");
- if (decodeLG(results, kLgBits, true)) return true;
- DPRINTLN("Attempting LG (32-bit) decode");
- // LG32 should be tried before Samsung
- if (decodeLG(results, kLg32Bits, true)) return true;
+ DPRINTLN("Attempting LG (28-bit) decode");
+ if (decodeLG(results, offset, kLgBits, true)) return true;
+ DPRINTLN("Attempting LG (32-bit) decode");
+ // LG32 should be tried before Samsung
+ if (decodeLG(results, offset, kLg32Bits, true)) return true;
#endif
#if DECODE_GICABLE
- // Note: Needs to happen before JVC decode, because it looks similar except
- // with a required NEC-like repeat code.
- DPRINTLN("Attempting GICable decode");
- if (decodeGICable(results)) return true;
+ // Note: Needs to happen before JVC decode, because it looks similar except
+ // with a required NEC-like repeat code.
+ DPRINTLN("Attempting GICable decode");
+ if (decodeGICable(results, offset)) return true;
#endif
#if DECODE_JVC
- DPRINTLN("Attempting JVC decode");
- if (decodeJVC(results)) return true;
+ DPRINTLN("Attempting JVC decode");
+ if (decodeJVC(results, offset)) return true;
#endif
#if DECODE_SAMSUNG
- DPRINTLN("Attempting SAMSUNG decode");
- if (decodeSAMSUNG(results)) return true;
+ DPRINTLN("Attempting SAMSUNG decode");
+ if (decodeSAMSUNG(results, offset)) return true;
#endif
#if DECODE_SAMSUNG36
- DPRINTLN("Attempting Samsung36 decode");
- if (decodeSamsung36(results)) return true;
+ DPRINTLN("Attempting Samsung36 decode");
+ if (decodeSamsung36(results, offset)) return true;
#endif
#if DECODE_WHYNTER
- DPRINTLN("Attempting Whynter decode");
- if (decodeWhynter(results)) return true;
+ DPRINTLN("Attempting Whynter decode");
+ if (decodeWhynter(results, offset)) return true;
#endif
#if DECODE_DISH
- DPRINTLN("Attempting DISH decode");
- if (decodeDISH(results)) return true;
+ DPRINTLN("Attempting DISH decode");
+ if (decodeDISH(results, offset)) return true;
#endif
#if DECODE_SHARP
- DPRINTLN("Attempting Sharp decode");
- if (decodeSharp(results)) return true;
+ DPRINTLN("Attempting Sharp decode");
+ if (decodeSharp(results, offset)) return true;
#endif
#if DECODE_COOLIX
- DPRINTLN("Attempting Coolix decode");
- if (decodeCOOLIX(results)) return true;
+ DPRINTLN("Attempting Coolix decode");
+ if (decodeCOOLIX(results, offset)) return true;
#endif
#if DECODE_NIKAI
- DPRINTLN("Attempting Nikai decode");
- if (decodeNikai(results)) return true;
+ DPRINTLN("Attempting Nikai decode");
+ if (decodeNikai(results, offset)) return true;
#endif
#if DECODE_KELVINATOR
- // Kelvinator based-devices use a similar code to Gree ones, to avoid false
- // matches this needs to happen before decodeGree().
- DPRINTLN("Attempting Kelvinator decode");
- if (decodeKelvinator(results)) return true;
+ // Kelvinator based-devices use a similar code to Gree ones, to avoid false
+ // matches this needs to happen before decodeGree().
+ DPRINTLN("Attempting Kelvinator decode");
+ if (decodeKelvinator(results, offset)) return true;
#endif
#if DECODE_DAIKIN
- DPRINTLN("Attempting Daikin decode");
- if (decodeDaikin(results)) return true;
+ DPRINTLN("Attempting Daikin decode");
+ if (decodeDaikin(results, offset)) return true;
#endif
#if DECODE_DAIKIN2
- DPRINTLN("Attempting Daikin2 decode");
- if (decodeDaikin2(results)) return true;
+ DPRINTLN("Attempting Daikin2 decode");
+ if (decodeDaikin2(results, offset)) return true;
#endif
#if DECODE_DAIKIN216
- DPRINTLN("Attempting Daikin216 decode");
- if (decodeDaikin216(results)) return true;
+ DPRINTLN("Attempting Daikin216 decode");
+ if (decodeDaikin216(results, offset)) return true;
#endif
#if DECODE_TOSHIBA_AC
- DPRINTLN("Attempting Toshiba AC decode");
- if (decodeToshibaAC(results)) return true;
+ DPRINTLN("Attempting Toshiba AC decode");
+ if (decodeToshibaAC(results, offset)) return true;
#endif
#if DECODE_MIDEA
- DPRINTLN("Attempting Midea decode");
- if (decodeMidea(results)) return true;
+ DPRINTLN("Attempting Midea decode");
+ if (decodeMidea(results, offset)) return true;
#endif
#if DECODE_MAGIQUEST
- DPRINTLN("Attempting Magiquest decode");
- if (decodeMagiQuest(results)) return true;
+ DPRINTLN("Attempting Magiquest decode");
+ if (decodeMagiQuest(results, offset)) return true;
#endif
-/* NOTE: Disabled due to poor quality.
+ /* NOTE: Disabled due to poor quality.
#if DECODE_SANYO
- // The Sanyo S866500B decoder is very poor quality & depricated.
- // *IF* you are going to enable it, do it near last to avoid false positive
- // matches.
- DPRINTLN("Attempting Sanyo SA8650B decode");
- if (decodeSanyo(results))
- return true;
+ // The Sanyo S866500B decoder is very poor quality & depricated.
+ // *IF* you are going to enable it, do it near last to avoid false positive
+ // matches.
+ DPRINTLN("Attempting Sanyo SA8650B decode");
+ if (decodeSanyo(results, offset))
+ return true;
#endif
-*/
+ */
#if DECODE_NEC
- // Some devices send NEC-like codes that don't follow the true NEC spec.
- // This should detect those. e.g. Apple TV remote etc.
- // This needs to be done after all other codes that use strict and some
- // other protocols that are NEC-like as well, as turning off strict may
- // cause this to match other valid protocols.
- DPRINTLN("Attempting NEC (non-strict) decode");
- if (decodeNEC(results, kNECBits, false)) {
- results->decode_type = NEC_LIKE;
- return true;
- }
+ // Some devices send NEC-like codes that don't follow the true NEC spec.
+ // This should detect those. e.g. Apple TV remote etc.
+ // This needs to be done after all other codes that use strict and some
+ // other protocols that are NEC-like as well, as turning off strict may
+ // cause this to match other valid protocols.
+ DPRINTLN("Attempting NEC (non-strict) decode");
+ if (decodeNEC(results, offset, kNECBits, false)) {
+ results->decode_type = NEC_LIKE;
+ return true;
+ }
#endif
#if DECODE_LASERTAG
- DPRINTLN("Attempting Lasertag decode");
- if (decodeLasertag(results)) return true;
+ DPRINTLN("Attempting Lasertag decode");
+ if (decodeLasertag(results, offset)) return true;
#endif
#if DECODE_GREE
- // Gree based-devices use a similar code to Kelvinator ones, to avoid false
- // matches this needs to happen after decodeKelvinator().
- DPRINTLN("Attempting Gree decode");
- if (decodeGree(results)) return true;
+ // Gree based-devices use a similar code to Kelvinator ones, to avoid false
+ // matches this needs to happen after decodeKelvinator().
+ DPRINTLN("Attempting Gree decode");
+ if (decodeGree(results, offset)) return true;
#endif
#if DECODE_HAIER_AC
- DPRINTLN("Attempting Haier AC decode");
- if (decodeHaierAC(results)) return true;
+ DPRINTLN("Attempting Haier AC decode");
+ if (decodeHaierAC(results, offset)) return true;
#endif
#if DECODE_HAIER_AC_YRW02
- DPRINTLN("Attempting Haier AC YR-W02 decode");
- if (decodeHaierACYRW02(results)) return true;
+ DPRINTLN("Attempting Haier AC YR-W02 decode");
+ if (decodeHaierACYRW02(results, offset)) return true;
#endif
#if DECODE_HITACHI_AC424
- // HitachiAc424 should be checked before HitachiAC & HitachiAC2
- DPRINTLN("Attempting Hitachi AC 424 decode");
- if (decodeHitachiAc424(results, kHitachiAc424Bits)) return true;
+ // HitachiAc424 should be checked before HitachiAC & HitachiAC2
+ DPRINTLN("Attempting Hitachi AC 424 decode");
+ if (decodeHitachiAc424(results, offset, kHitachiAc424Bits)) return true;
#endif // DECODE_HITACHI_AC2
#if DECODE_HITACHI_AC2
- // HitachiAC2 should be checked before HitachiAC
- DPRINTLN("Attempting Hitachi AC2 decode");
- if (decodeHitachiAC(results, kHitachiAc2Bits)) return true;
+ // HitachiAC2 should be checked before HitachiAC
+ DPRINTLN("Attempting Hitachi AC2 decode");
+ if (decodeHitachiAC(results, offset, kHitachiAc2Bits)) return true;
#endif // DECODE_HITACHI_AC2
#if DECODE_HITACHI_AC
- DPRINTLN("Attempting Hitachi AC decode");
- if (decodeHitachiAC(results, kHitachiAcBits)) return true;
+ DPRINTLN("Attempting Hitachi AC decode");
+ if (decodeHitachiAC(results, offset, kHitachiAcBits)) return true;
#endif
#if DECODE_HITACHI_AC1
- DPRINTLN("Attempting Hitachi AC1 decode");
- if (decodeHitachiAC(results, kHitachiAc1Bits)) return true;
+ DPRINTLN("Attempting Hitachi AC1 decode");
+ if (decodeHitachiAC(results, offset, kHitachiAc1Bits)) return true;
#endif
#if DECODE_WHIRLPOOL_AC
- DPRINTLN("Attempting Whirlpool AC decode");
- if (decodeWhirlpoolAC(results)) return true;
+ DPRINTLN("Attempting Whirlpool AC decode");
+ if (decodeWhirlpoolAC(results, offset)) return true;
#endif
#if DECODE_SAMSUNG_AC
- DPRINTLN("Attempting Samsung AC (extended) decode");
- // Check the extended size first, as it should fail fast due to longer length.
- if (decodeSamsungAC(results, kSamsungAcExtendedBits, false)) return true;
- // Now check for the more common length.
- DPRINTLN("Attempting Samsung AC decode");
- if (decodeSamsungAC(results, kSamsungAcBits)) return true;
+ DPRINTLN("Attempting Samsung AC (extended) decode");
+ // Check the extended size first, as it should fail fast due to longer
+ // length.
+ if (decodeSamsungAC(results, offset, kSamsungAcExtendedBits, false))
+ return true;
+ // Now check for the more common length.
+ DPRINTLN("Attempting Samsung AC decode");
+ if (decodeSamsungAC(results, offset, kSamsungAcBits)) return true;
#endif
#if DECODE_ELECTRA_AC
- DPRINTLN("Attempting Electra AC decode");
- if (decodeElectraAC(results)) return true;
+ DPRINTLN("Attempting Electra AC decode");
+ if (decodeElectraAC(results, offset)) return true;
#endif
#if DECODE_PANASONIC_AC
- DPRINTLN("Attempting Panasonic AC decode");
- if (decodePanasonicAC(results)) return true;
- DPRINTLN("Attempting Panasonic AC short decode");
- if (decodePanasonicAC(results, kPanasonicAcShortBits)) return true;
+ DPRINTLN("Attempting Panasonic AC decode");
+ if (decodePanasonicAC(results, offset)) return true;
+ DPRINTLN("Attempting Panasonic AC short decode");
+ if (decodePanasonicAC(results, offset, kPanasonicAcShortBits)) return true;
#endif
#if DECODE_LUTRON
- DPRINTLN("Attempting Lutron decode");
- if (decodeLutron(results)) return true;
+ DPRINTLN("Attempting Lutron decode");
+ if (decodeLutron(results, offset)) return true;
#endif
#if DECODE_MWM
- DPRINTLN("Attempting MWM decode");
- if (decodeMWM(results)) return true;
+ DPRINTLN("Attempting MWM decode");
+ if (decodeMWM(results, offset)) return true;
#endif
#if DECODE_VESTEL_AC
- DPRINTLN("Attempting Vestel AC decode");
- if (decodeVestelAc(results)) return true;
+ DPRINTLN("Attempting Vestel AC decode");
+ if (decodeVestelAc(results, offset)) return true;
#endif
#if DECODE_MITSUBISHI112 || DECODE_TCL112AC
- // Mitsubish112 and Tcl112 share the same decoder.
- DPRINTLN("Attempting Mitsubishi112/TCL112AC decode");
- if (decodeMitsubishi112(results)) return true;
+ // Mitsubish112 and Tcl112 share the same decoder.
+ DPRINTLN("Attempting Mitsubishi112/TCL112AC decode");
+ if (decodeMitsubishi112(results, offset)) return true;
#endif // DECODE_MITSUBISHI112 || DECODE_TCL112AC
#if DECODE_TECO
- DPRINTLN("Attempting Teco decode");
- if (decodeTeco(results)) return true;
+ DPRINTLN("Attempting Teco decode");
+ if (decodeTeco(results, offset)) return true;
#endif
#if DECODE_LEGOPF
- DPRINTLN("Attempting LEGOPF decode");
- if (decodeLegoPf(results)) return true;
+ DPRINTLN("Attempting LEGOPF decode");
+ if (decodeLegoPf(results, offset)) return true;
#endif
#if DECODE_MITSUBISHIHEAVY
- DPRINTLN("Attempting MITSUBISHIHEAVY (152 bit) decode");
- if (decodeMitsubishiHeavy(results, kMitsubishiHeavy152Bits)) return true;
- DPRINTLN("Attempting MITSUBISHIHEAVY (88 bit) decode");
- if (decodeMitsubishiHeavy(results, kMitsubishiHeavy88Bits)) return true;
+ DPRINTLN("Attempting MITSUBISHIHEAVY (152 bit) decode");
+ if (decodeMitsubishiHeavy(results, offset, kMitsubishiHeavy152Bits))
+ return true;
+ DPRINTLN("Attempting MITSUBISHIHEAVY (88 bit) decode");
+ if (decodeMitsubishiHeavy(results, offset, kMitsubishiHeavy88Bits))
+ return true;
#endif
#if DECODE_ARGO
- DPRINTLN("Attempting Argo decode");
- if (decodeArgo(results)) return true;
+ DPRINTLN("Attempting Argo decode");
+ if (decodeArgo(results, offset)) return true;
#endif // DECODE_ARGO
#if DECODE_SHARP_AC
- DPRINTLN("Attempting SHARP_AC decode");
- if (decodeSharpAc(results)) return true;
+ DPRINTLN("Attempting SHARP_AC decode");
+ if (decodeSharpAc(results, offset)) return true;
#endif
#if DECODE_GOODWEATHER
- DPRINTLN("Attempting GOODWEATHER decode");
- if (decodeGoodweather(results)) return true;
+ DPRINTLN("Attempting GOODWEATHER decode");
+ if (decodeGoodweather(results, offset)) return true;
#endif // DECODE_GOODWEATHER
#if DECODE_INAX
- DPRINTLN("Attempting Inax decode");
- if (decodeInax(results)) return true;
+ DPRINTLN("Attempting Inax decode");
+ if (decodeInax(results, offset)) return true;
#endif // DECODE_INAX
#if DECODE_TROTEC
- DPRINTLN("Attempting Trotec decode");
- if (decodeTrotec(results)) return true;
+ DPRINTLN("Attempting Trotec decode");
+ if (decodeTrotec(results, offset)) return true;
#endif // DECODE_TROTEC
#if DECODE_DAIKIN160
- DPRINTLN("Attempting Daikin160 decode");
- if (decodeDaikin160(results)) return true;
+ DPRINTLN("Attempting Daikin160 decode");
+ if (decodeDaikin160(results, offset)) return true;
#endif // DECODE_DAIKIN160
#if DECODE_NEOCLIMA
- DPRINTLN("Attempting Neoclima decode");
- if (decodeNeoclima(results)) return true;
+ DPRINTLN("Attempting Neoclima decode");
+ if (decodeNeoclima(results, offset)) return true;
#endif // DECODE_NEOCLIMA
#if DECODE_DAIKIN176
- DPRINTLN("Attempting Daikin176 decode");
- if (decodeDaikin176(results)) return true;
+ DPRINTLN("Attempting Daikin176 decode");
+ if (decodeDaikin176(results, offset)) return true;
#endif // DECODE_DAIKIN176
#if DECODE_DAIKIN128
- DPRINTLN("Attempting Daikin128 decode");
- if (decodeDaikin128(results)) return true;
+ DPRINTLN("Attempting Daikin128 decode");
+ if (decodeDaikin128(results, offset)) return true;
#endif // DECODE_DAIKIN128
#if DECODE_AMCOR
- DPRINTLN("Attempting Amcor decode");
- if (decodeAmcor(results)) return true;
+ DPRINTLN("Attempting Amcor decode");
+ if (decodeAmcor(results, offset)) return true;
#endif // DECODE_AMCOR
#if DECODE_DAIKIN152
- DPRINTLN("Attempting Daikin152 decode");
- if (decodeDaikin152(results)) return true;
+ DPRINTLN("Attempting Daikin152 decode");
+ if (decodeDaikin152(results, offset)) return true;
#endif // DECODE_DAIKIN152
#if DECODE_MITSUBISHI136
- DPRINTLN("Attempting Mitsubishi136 decode");
- if (decodeMitsubishi136(results)) return true;
+ DPRINTLN("Attempting Mitsubishi136 decode");
+ if (decodeMitsubishi136(results, offset)) return true;
#endif // DECODE_MITSUBISHI136
+ }
// Typically new protocols are added above this line.
#if DECODE_HASH
// decodeHash returns a hash on any input.
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRrecv.h b/lib/IRremoteESP8266-2.7.4/src/IRrecv.h
similarity index 63%
rename from lib/IRremoteESP8266-2.7.1/src/IRrecv.h
rename to lib/IRremoteESP8266-2.7.4/src/IRrecv.h
index 2424f0463..60559981c 100644
--- a/lib/IRremoteESP8266-2.7.1/src/IRrecv.h
+++ b/lib/IRremoteESP8266-2.7.4/src/IRrecv.h
@@ -125,7 +125,8 @@ class IRrecv {
~IRrecv(void); // Destructor
void setTolerance(const uint8_t percent = kTolerance);
uint8_t getTolerance(void);
- bool decode(decode_results *results, irparams_t *save = NULL);
+ bool decode(decode_results *results, irparams_t *save = NULL,
+ uint8_t max_skip = 0, uint16_t noise_floor = 0);
void enableIRIn(const bool pullup = false);
void disableIRIn(void);
void resume(void);
@@ -220,52 +221,64 @@ class IRrecv {
const uint8_t tolerance = kUseDefTol,
const int16_t excess = kMarkExcess,
const bool MSBfirst = true);
+ void crudeNoiseFilter(decode_results *results, const uint16_t floor = 0);
bool decodeHash(decode_results *results);
#if (DECODE_NEC || DECODE_SHERWOOD || DECODE_AIWA_RC_T501 || SEND_SANYO)
- bool decodeNEC(decode_results *results, uint16_t nbits = kNECBits,
- bool strict = true);
+ bool decodeNEC(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kNECBits, const bool strict = true);
#endif
#if DECODE_ARGO
- bool decodeArgo(decode_results *results, const uint16_t nbits = kArgoBits,
- const bool strict = true);
+ bool decodeArgo(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kArgoBits, const bool strict = true);
#endif // DECODE_ARGO
#if DECODE_SONY
- bool decodeSony(decode_results *results, uint16_t nbits = kSonyMinBits,
- bool strict = false);
+ bool decodeSony(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kSonyMinBits,
+ const bool strict = false);
#endif
#if DECODE_SANYO
// DISABLED due to poor quality.
- // bool decodeSanyo(decode_results *results,
+ // bool decodeSanyo(decode_results *results, uint16_t offset = kStartOffset,
// uint16_t nbits = kSanyoSA8650BBits,
// bool strict = false);
bool decodeSanyoLC7461(decode_results *results,
- uint16_t nbits = kSanyoLC7461Bits, bool strict = true);
+ uint16_t offset = kStartOffset,
+ const uint16_t nbits = kSanyoLC7461Bits,
+ bool strict = true);
#endif
#if DECODE_MITSUBISHI
- bool decodeMitsubishi(decode_results *results,
- uint16_t nbits = kMitsubishiBits, bool strict = true);
+ bool decodeMitsubishi(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kMitsubishiBits,
+ const bool strict = true);
#endif
#if DECODE_MITSUBISHI2
bool decodeMitsubishi2(decode_results *results,
- uint16_t nbits = kMitsubishiBits, bool strict = true);
+ uint16_t offset = kStartOffset,
+ const uint16_t nbits = kMitsubishiBits,
+ const bool strict = true);
#endif
#if DECODE_MITSUBISHI_AC
bool decodeMitsubishiAC(decode_results *results,
- uint16_t nbits = kMitsubishiACBits,
- bool strict = false);
+ uint16_t offset = kStartOffset,
+ const uint16_t nbits = kMitsubishiACBits,
+ const bool strict = false);
#endif
#if DECODE_MITSUBISHI136
bool decodeMitsubishi136(decode_results *results,
+ uint16_t offset = kStartOffset,
const uint16_t nbits = kMitsubishi136Bits,
const bool strict = true);
#endif
#if DECODE_MITSUBISHI112
bool decodeMitsubishi112(decode_results *results,
+ uint16_t offset = kStartOffset,
const uint16_t nbits = kMitsubishi112Bits,
const bool strict = true);
#endif
#if DECODE_MITSUBISHIHEAVY
- bool decodeMitsubishiHeavy(decode_results *results, const uint16_t nbits,
+ bool decodeMitsubishiHeavy(decode_results *results,
+ uint16_t offset = kStartOffset,
+ const uint16_t nbits = kMitsubishiHeavy152Bits,
const bool strict = true);
#endif
#if (DECODE_RC5 || DECODE_R6 || DECODE_LASERTAG || DECODE_MWM)
@@ -275,236 +288,276 @@ class IRrecv {
uint8_t maxwidth = 3);
#endif
#if DECODE_RC5
- bool decodeRC5(decode_results *results, uint16_t nbits = kRC5XBits,
- bool strict = true);
+ bool decodeRC5(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kRC5XBits,
+ const bool strict = true);
#endif
#if DECODE_RC6
- bool decodeRC6(decode_results *results, uint16_t nbits = kRC6Mode0Bits,
- bool strict = false);
+ bool decodeRC6(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kRC6Mode0Bits,
+ const bool strict = false);
#endif
#if DECODE_RCMM
- bool decodeRCMM(decode_results *results, uint16_t nbits = kRCMMBits,
- bool strict = false);
+ bool decodeRCMM(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kRCMMBits,
+ const bool strict = false);
#endif
#if (DECODE_PANASONIC || DECODE_DENON)
- bool decodePanasonic(decode_results *results,
+ bool decodePanasonic(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kPanasonicBits,
const bool strict = false,
const uint32_t manufacturer = kPanasonicManufacturer);
#endif
#if DECODE_LG
- bool decodeLG(decode_results *results, uint16_t nbits = kLgBits,
- bool strict = false);
+ bool decodeLG(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kLgBits,
+ const bool strict = false);
#endif
#if DECODE_INAX
- bool decodeInax(decode_results *results, const uint16_t nbits = kInaxBits,
+ bool decodeInax(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kInaxBits,
const bool strict = true);
#endif // DECODE_INAX
#if DECODE_JVC
- bool decodeJVC(decode_results *results, uint16_t nbits = kJvcBits,
- bool strict = true);
+ bool decodeJVC(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kJvcBits,
+ const bool strict = true);
#endif
#if DECODE_SAMSUNG
- bool decodeSAMSUNG(decode_results *results,
+ bool decodeSAMSUNG(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kSamsungBits,
const bool strict = true);
#endif
#if DECODE_SAMSUNG
- bool decodeSamsung36(decode_results *results,
+ bool decodeSamsung36(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kSamsung36Bits,
const bool strict = true);
#endif
#if DECODE_SAMSUNG_AC
- bool decodeSamsungAC(decode_results *results,
+ bool decodeSamsungAC(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kSamsungAcBits,
const bool strict = true);
#endif
#if DECODE_WHYNTER
- bool decodeWhynter(decode_results *results, uint16_t nbits = kWhynterBits,
- bool strict = true);
+ bool decodeWhynter(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kWhynterBits,
+ const bool strict = true);
#endif
#if DECODE_COOLIX
- bool decodeCOOLIX(decode_results *results, uint16_t nbits = kCoolixBits,
- bool strict = true);
+ bool decodeCOOLIX(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kCoolixBits,
+ const bool strict = true);
#endif
#if DECODE_DENON
- bool decodeDenon(decode_results *results, uint16_t nbits = kDenonBits,
- bool strict = true);
+ bool decodeDenon(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kDenonBits,
+ const bool strict = true);
#endif
#if DECODE_DISH
- bool decodeDISH(decode_results *results, uint16_t nbits = kDishBits,
- bool strict = true);
+ bool decodeDISH(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kDishBits,
+ const bool strict = true);
#endif
#if (DECODE_SHARP || DECODE_DENON)
- bool decodeSharp(decode_results *results, const uint16_t nbits = kSharpBits,
+ bool decodeSharp(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kSharpBits,
const bool strict = true, const bool expansion = true);
#endif
#if DECODE_SHARP_AC
- bool decodeSharpAc(decode_results *results,
+ bool decodeSharpAc(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kSharpAcBits,
const bool strict = true);
#endif
#if DECODE_AIWA_RC_T501
- bool decodeAiwaRCT501(decode_results *results,
- uint16_t nbits = kAiwaRcT501Bits, bool strict = true);
+ bool decodeAiwaRCT501(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kAiwaRcT501Bits,
+ const bool strict = true);
#endif
#if DECODE_NIKAI
- bool decodeNikai(decode_results *results, uint16_t nbits = kNikaiBits,
- bool strict = true);
+ bool decodeNikai(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kNikaiBits,
+ const bool strict = true);
#endif
#if DECODE_MAGIQUEST
- bool decodeMagiQuest(decode_results *results, uint16_t nbits = kMagiquestBits,
- bool strict = true);
+ bool decodeMagiQuest(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kMagiquestBits,
+ const bool strict = true);
#endif
#if DECODE_KELVINATOR
- bool decodeKelvinator(decode_results *results,
- uint16_t nbits = kKelvinatorBits, bool strict = true);
+ bool decodeKelvinator(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kKelvinatorBits,
+ const bool strict = true);
#endif
#if DECODE_DAIKIN
- bool decodeDaikin(decode_results *results, const uint16_t nbits = kDaikinBits,
+ bool decodeDaikin(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kDaikinBits,
const bool strict = true);
#endif
#if DECODE_DAIKIN128
- bool decodeDaikin128(decode_results *results,
+ bool decodeDaikin128(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikin128Bits,
const bool strict = true);
#endif // DECODE_DAIKIN128
#if DECODE_DAIKIN152
- bool decodeDaikin152(decode_results *results,
+ bool decodeDaikin152(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikin152Bits,
const bool strict = true);
#endif // DECODE_DAIKIN152
#if DECODE_DAIKIN160
- bool decodeDaikin160(decode_results *results,
+ bool decodeDaikin160(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikin160Bits,
const bool strict = true);
#endif // DECODE_DAIKIN160
#if DECODE_DAIKIN176
- bool decodeDaikin176(decode_results *results,
+ bool decodeDaikin176(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikin176Bits,
const bool strict = true);
#endif // DECODE_DAIKIN176
#if DECODE_DAIKIN2
- bool decodeDaikin2(decode_results *results, uint16_t nbits = kDaikin2Bits,
- bool strict = true);
+ bool decodeDaikin2(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kDaikin2Bits,
+ const bool strict = true);
#endif
#if DECODE_DAIKIN216
- bool decodeDaikin216(decode_results *results,
+ bool decodeDaikin216(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikin216Bits,
const bool strict = true);
#endif
#if DECODE_TOSHIBA_AC
- bool decodeToshibaAC(decode_results *results,
+ bool decodeToshibaAC(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbytes = kToshibaACBits,
const bool strict = true);
#endif
#if DECODE_TROTEC
- bool decodeTrotec(decode_results *results, const uint16_t nbits = kTrotecBits,
+ bool decodeTrotec(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kTrotecBits,
const bool strict = true);
#endif // DECODE_TROTEC
#if DECODE_MIDEA
- bool decodeMidea(decode_results *results, uint16_t nbits = kMideaBits,
- bool strict = true);
+ bool decodeMidea(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kMideaBits,
+ const bool strict = true);
#endif
#if DECODE_FUJITSU_AC
- bool decodeFujitsuAC(decode_results *results, uint16_t nbits = kFujitsuAcBits,
- bool strict = false);
+ bool decodeFujitsuAC(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kFujitsuAcBits,
+ const bool strict = false);
#endif
#if DECODE_LASERTAG
- bool decodeLasertag(decode_results *results, uint16_t nbits = kLasertagBits,
- bool strict = true);
+ bool decodeLasertag(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kLasertagBits,
+ const bool strict = true);
#endif
#if DECODE_CARRIER_AC
- bool decodeCarrierAC(decode_results *results, uint16_t nbits = kCarrierAcBits,
- bool strict = true);
+ bool decodeCarrierAC(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kCarrierAcBits,
+ const bool strict = true);
#endif
#if DECODE_GOODWEATHER
bool decodeGoodweather(decode_results *results,
+ uint16_t offset = kStartOffset,
const uint16_t nbits = kGoodweatherBits,
const bool strict = true);
#endif // DECODE_GOODWEATHER
#if DECODE_GREE
- bool decodeGree(decode_results *results, uint16_t nbits = kGreeBits,
- bool strict = true);
+ bool decodeGree(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kGreeBits,
+ const bool strict = true);
#endif
#if (DECODE_HAIER_AC | DECODE_HAIER_AC_YRW02)
- bool decodeHaierAC(decode_results *results, uint16_t nbits = kHaierACBits,
- bool strict = true);
+ bool decodeHaierAC(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kHaierACBits,
+ const bool strict = true);
#endif
#if DECODE_HAIER_AC_YRW02
bool decodeHaierACYRW02(decode_results *results,
- uint16_t nbits = kHaierACYRW02Bits,
- bool strict = true);
+ uint16_t offset = kStartOffset,
+ const uint16_t nbits = kHaierACYRW02Bits,
+ const bool strict = true);
#endif
#if (DECODE_HITACHI_AC || DECODE_HITACHI_AC2)
- bool decodeHitachiAC(decode_results *results,
+ bool decodeHitachiAC(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kHitachiAcBits,
const bool strict = true);
#endif
#if DECODE_HITACHI_AC1
- bool decodeHitachiAC1(decode_results *results,
+ bool decodeHitachiAC1(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kHitachiAc1Bits,
const bool strict = true);
#endif
#if DECODE_HITACHI_AC424
bool decodeHitachiAc424(decode_results *results,
+ uint16_t offset = kStartOffset,
const uint16_t nbits = kHitachiAc424Bits,
const bool strict = true);
#endif // DECODE_HITACHI_AC424
#if DECODE_GICABLE
- bool decodeGICable(decode_results *results, uint16_t nbits = kGicableBits,
- bool strict = true);
+ bool decodeGICable(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kGicableBits,
+ const bool strict = true);
#endif
#if DECODE_WHIRLPOOL_AC
bool decodeWhirlpoolAC(decode_results *results,
+ uint16_t offset = kStartOffset,
const uint16_t nbits = kWhirlpoolAcBits,
const bool strict = true);
#endif
#if DECODE_LUTRON
- bool decodeLutron(decode_results *results, uint16_t nbits = kLutronBits,
- bool strict = true);
+ bool decodeLutron(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kLutronBits,
+ const bool strict = true);
#endif
#if DECODE_ELECTRA_AC
- bool decodeElectraAC(decode_results *results, uint16_t nbits = kElectraAcBits,
- bool strict = true);
+ bool decodeElectraAC(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kElectraAcBits,
+ const bool strict = true);
#endif
#if DECODE_PANASONIC_AC
bool decodePanasonicAC(decode_results *results,
+ uint16_t offset = kStartOffset,
const uint16_t nbits = kPanasonicAcBits,
const bool strict = true);
#endif
#if DECODE_PIONEER
- bool decodePioneer(decode_results *results,
+ bool decodePioneer(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kPioneerBits,
const bool strict = true);
#endif
#if DECODE_MWM
- bool decodeMWM(decode_results *results, uint16_t nbits = 24,
- bool strict = true);
+ bool decodeMWM(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = 24,
+ const bool strict = true);
#endif
#if DECODE_VESTEL_AC
- bool decodeVestelAc(decode_results *results,
+ bool decodeVestelAc(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kVestelAcBits,
const bool strict = true);
#endif
#if DECODE_TECO
- bool decodeTeco(decode_results *results, const uint16_t nbits = kTecoBits,
+ bool decodeTeco(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kTecoBits,
const bool strict = false);
#endif
#if DECODE_LEGOPF
- bool decodeLegoPf(decode_results *results, const uint16_t nbits = kLegoPfBits,
+ bool decodeLegoPf(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kLegoPfBits,
const bool strict = true);
#endif
#if DECODE_NEOCLIMA
-bool decodeNeoclima(decode_results *results,
- const uint16_t nbits = kNeoclimaBits,
- const bool strict = true);
+ bool decodeNeoclima(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kNeoclimaBits,
+ const bool strict = true);
#endif // DECODE_NEOCLIMA
#if DECODE_AMCOR
-bool decodeAmcor(decode_results *results,
- const uint16_t nbits = kAmcorBits,
- const bool strict = true);
+ bool decodeAmcor(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kAmcorBits,
+ const bool strict = true);
#endif // DECODE_AMCOR
+#if DECODE_EPSON
+ bool decodeEpson(decode_results *results, uint16_t offset = kStartOffset,
+ const uint16_t nbits = kEpsonBits,
+ const bool strict = true);
+#endif // DECODE_EPSON
};
#endif // IRRECV_H_
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRremoteESP8266.h b/lib/IRremoteESP8266-2.7.4/src/IRremoteESP8266.h
similarity index 51%
rename from lib/IRremoteESP8266-2.7.1/src/IRremoteESP8266.h
rename to lib/IRremoteESP8266-2.7.4/src/IRremoteESP8266.h
index 9e4cdbaab..a048e23fc 100644
--- a/lib/IRremoteESP8266-2.7.1/src/IRremoteESP8266.h
+++ b/lib/IRremoteESP8266-2.7.4/src/IRremoteESP8266.h
@@ -1,4 +1,4 @@
-/***************************************************
+ /***************************************************
* IRremote for ESP8266
*
* Based on the IRremote library for Arduino by Ken Shirriff
@@ -52,428 +52,525 @@
#endif // UNIT_TEST
// Library Version
-#define _IRREMOTEESP8266_VERSION_ "2.7.1"
+#define _IRREMOTEESP8266_VERSION_ "2.7.4"
// Set the language & locale for the library. See the `locale` dir for options.
#ifndef _IR_LOCALE_
#define _IR_LOCALE_ en-AU
#endif // _IR_LOCALE_
+// Do we enable all the protocols by default (true), or disable them (false)?
+// This allows users of the library to disable or enable all protocols at
+// compile-time with `-D_IR_ENABLE_DEFAULT_=true` or
+// `-D_IR_ENABLE_DEFAULT_=false` compiler flags respectively.
+// Everything is included by default.
+// e.g. If you only want to enable use of he NEC protocol to save program space,
+// you would use something like:
+// `-D_IR_ENABLE_DEFAULT_=false -DDECODE_NEC=true -DSEND_NEC=true`
+//
+// or alter your 'platform.ini' file accordingly:
+// ```
+// build_flags = -D_IR_ENABLE_DEFAULT_=false
+// -DDECODE_NEC=true
+// -DSEND_NEC=true
+// ```
+// If you want to enable support for every protocol *except* _decoding_ the
+// Kelvinator protocol, you would use:
+// `-DDECODE_KELVINATOR=false`
+#ifndef _IR_ENABLE_DEFAULT_
+#define _IR_ENABLE_DEFAULT_ true // Unless set externally, the default is on.
+#endif // _IR_ENABLE_DEFAULT_
+
// Supported IR protocols
// Each protocol you include costs memory and, during decode, costs time
// Disable (set to false) all the protocols you do not need/want!
// The Air Conditioner protocols are the most expensive memory-wise.
//
-#ifdef USE_IR_REMOTE_FULL // full IR protocols
-#define DECODE_HASH true // Semi-unique code for unknown messages
-
-#define SEND_RAW true
-
-#define DECODE_NEC true
-#define SEND_NEC true
-
-#define DECODE_SHERWOOD true // Doesn't exist. Actually is DECODE_NEC
-#define SEND_SHERWOOD true
-
-#define DECODE_RC5 true
-#define SEND_RC5 true
-
-#define DECODE_RC6 true
-#define SEND_RC6 true
-
-#define DECODE_RCMM true
-#define SEND_RCMM true
-
-#define DECODE_SONY true
-#define SEND_SONY true
-
-#define DECODE_PANASONIC true
-#define SEND_PANASONIC true
-
-#define DECODE_JVC true
-#define SEND_JVC true
-
-#define DECODE_SAMSUNG true
-#define SEND_SAMSUNG true
-
-#define DECODE_SAMSUNG36 true
-#define SEND_SAMSUNG36 true
-
-#define DECODE_SAMSUNG_AC true
-#define SEND_SAMSUNG_AC true
-
-#define DECODE_WHYNTER true
-#define SEND_WHYNTER true
-
-#define DECODE_AIWA_RC_T501 true
-#define SEND_AIWA_RC_T501 true
-
-#define DECODE_LG true
-#define SEND_LG true
-
-#define DECODE_SANYO true
-#define SEND_SANYO true
-
-#define DECODE_MITSUBISHI true
-#define SEND_MITSUBISHI true
-
-#define DECODE_MITSUBISHI2 true
-#define SEND_MITSUBISHI2 true
-
-#define DECODE_DISH true
-#define SEND_DISH true
-
-#define DECODE_SHARP true
-#define SEND_SHARP true
-
-#define DECODE_SHARP_AC true
-#define SEND_SHARP_AC true
-
-#define DECODE_DENON true
-#define SEND_DENON true
-
-#define DECODE_KELVINATOR true
-#define SEND_KELVINATOR true
-
-#define DECODE_MITSUBISHI_AC true // Beta.
-#define SEND_MITSUBISHI_AC true
-
-#define DECODE_MITSUBISHI136 true
-#define SEND_MITSUBISHI136 true
-
-#define DECODE_MITSUBISHI112 true
-#define SEND_MITSUBISHI112 true
-
-#define DECODE_FUJITSU_AC true
-#define SEND_FUJITSU_AC true
-
-#define DECODE_INAX true
-#define SEND_INAX true
-
-#define DECODE_DAIKIN true
-#define SEND_DAIKIN true
-
-#define DECODE_COOLIX true
-#define SEND_COOLIX true
-
-#define DECODE_GLOBALCACHE false // Not written.
-#define SEND_GLOBALCACHE true
-
-#define DECODE_GOODWEATHER true
-#define SEND_GOODWEATHER true
-
-#define DECODE_GREE true
-#define SEND_GREE true
-
-#define DECODE_PRONTO false // Not written.
-#define SEND_PRONTO true
-
-#define DECODE_ARGO true // Experimental
-#define SEND_ARGO true
-
-#define DECODE_TROTEC true
-#define SEND_TROTEC true
-
-#define DECODE_NIKAI true
-#define SEND_NIKAI true
-
-#define DECODE_TOSHIBA_AC true
-#define SEND_TOSHIBA_AC true
-
-#define DECODE_MAGIQUEST true
-#define SEND_MAGIQUEST true
-
-#define DECODE_MIDEA true
-#define SEND_MIDEA true
-
-#define DECODE_LASERTAG true
-#define SEND_LASERTAG true
-
-#define DECODE_CARRIER_AC true
-#define SEND_CARRIER_AC true
-
-#define DECODE_HAIER_AC true
-#define SEND_HAIER_AC true
-
-#define DECODE_HITACHI_AC true
-#define SEND_HITACHI_AC true
-
-#define DECODE_HITACHI_AC1 true
-#define SEND_HITACHI_AC1 true
-
-#define DECODE_HITACHI_AC2 true
-#define SEND_HITACHI_AC2 true
-
-#define DECODE_GICABLE true
-#define SEND_GICABLE true
-
-#define DECODE_HAIER_AC_YRW02 true
-#define SEND_HAIER_AC_YRW02 true
-
-#define DECODE_WHIRLPOOL_AC true
-#define SEND_WHIRLPOOL_AC true
-
-#define DECODE_LUTRON true
-#define SEND_LUTRON true
-
-#define DECODE_ELECTRA_AC true
-#define SEND_ELECTRA_AC true
-
-#define DECODE_PANASONIC_AC true
-#define SEND_PANASONIC_AC true
-
-#define DECODE_MWM true
-#define SEND_MWM true
-
-#define DECODE_PIONEER true
-#define SEND_PIONEER true
-
-#define DECODE_DAIKIN2 true
-#define SEND_DAIKIN2 true
-
-#define DECODE_VESTEL_AC true
-#define SEND_VESTEL_AC true
-
-#define DECODE_TECO true
-#define SEND_TECO true
-
-#define DECODE_TCL112AC true
-#define SEND_TCL112AC true
-
-#define DECODE_LEGOPF true
-#define SEND_LEGOPF true
-
-#define DECODE_MITSUBISHIHEAVY true
-#define SEND_MITSUBISHIHEAVY true
-
-#define DECODE_DAIKIN216 true
-#define SEND_DAIKIN216 true
-
-#define DECODE_DAIKIN160 true
-#define SEND_DAIKIN160 true
-
-#define DECODE_NEOCLIMA true
-#define SEND_NEOCLIMA true
-
-#define DECODE_DAIKIN176 true
-#define SEND_DAIKIN176 true
-
-#define DECODE_DAIKIN128 true
-#define SEND_DAIKIN128 true
-
-#define DECODE_AMCOR true
-#define SEND_AMCOR true
-
-#define DECODE_DAIKIN152 true
-#define SEND_DAIKIN152 true
-
-#define DECODE_HITACHI_AC424 true
-#define SEND_HITACHI_AC424 true
-
-#else // defined(FIRMWARE_IR) || defined(FIRMWARE_IR_CUSTOM) // full IR protocols
-
-// Tasmota supported protocols (less protocols is less code size)
-#define DECODE_HASH true // Semi-unique code for unknown messages
-
-#define SEND_RAW false
-
-#define DECODE_NEC true
-#define SEND_NEC true
-
-#define DECODE_SHERWOOD false // Doesn't exist. Actually is DECODE_NEC
-#define SEND_SHERWOOD false
-
-#define DECODE_RC5 true
-#define SEND_RC5 true
-
-#define DECODE_RC6 true
-#define SEND_RC6 true
-
-#define DECODE_RCMM false
-#define SEND_RCMM false
-
-#define DECODE_SONY false
-#define SEND_SONY false
-
-#define DECODE_PANASONIC false
-#define SEND_PANASONIC false
-
-#define DECODE_JVC false
-#define SEND_JVC false
-
-#define DECODE_SAMSUNG false
-#define SEND_SAMSUNG false
-
-#define DECODE_SAMSUNG36 false
-#define SEND_SAMSUNG36 false
-
-#define DECODE_SAMSUNG_AC false
-#define SEND_SAMSUNG_AC false
-
-#define DECODE_WHYNTER false
-#define SEND_WHYNTER false
-
-#define DECODE_AIWA_RC_T501 false
-#define SEND_AIWA_RC_T501 false
-
-#define DECODE_LG false
-#define SEND_LG false
-
-#define DECODE_SANYO false
-#define SEND_SANYO false
-
-#define DECODE_MITSUBISHI false
-#define SEND_MITSUBISHI false
-
-#define DECODE_MITSUBISHI2 false
-#define SEND_MITSUBISHI2 false
-
-#define DECODE_DISH false
-#define SEND_DISH false
-
-#define DECODE_SHARP false
-#define SEND_SHARP false
-
-#define DECODE_SHARP_AC false
-#define SEND_SHARP_AC false
-
-#define DECODE_DENON false
-#define SEND_DENON false
-
-#define DECODE_KELVINATOR false
-#define SEND_KELVINATOR false
-
-#define DECODE_MITSUBISHI_AC false // Beta.
-#define SEND_MITSUBISHI_AC false
-
-#define DECODE_FUJITSU_AC false
-#define SEND_FUJITSU_AC false
-
-#define DECODE_INAX false
-#define SEND_INAX false
-
-#define DECODE_DAIKIN false
-#define SEND_DAIKIN false
-
-#define DECODE_COOLIX false
-#define SEND_COOLIX false
-
-#define DECODE_GLOBALCACHE false // Not written.
-#define SEND_GLOBALCACHE false
-
-#define DECODE_GOODWEATHER false
-#define SEND_GOODWEATHER false
-
-#define DECODE_GREE false
-#define SEND_GREE false
-
-#define DECODE_PRONTO false // Not written.
-#define SEND_PRONTO false
-
-#define DECODE_ARGO false // Experimental
-#define SEND_ARGO false
-
-#define DECODE_TROTEC false
-#define SEND_TROTEC false
-
-#define DECODE_NIKAI false
-#define SEND_NIKAI false
-
-#define DECODE_TOSHIBA_AC false
-#define SEND_TOSHIBA_AC false
-
-#define DECODE_MAGIQUEST false
-#define SEND_MAGIQUEST false
-
-#define DECODE_MIDEA false
-#define SEND_MIDEA false
-
-#define DECODE_LASERTAG false
-#define SEND_LASERTAG false
-
-#define DECODE_CARRIER_AC false
-#define SEND_CARRIER_AC false
-
-#define DECODE_HAIER_AC false
-#define SEND_HAIER_AC false
-
-#define DECODE_HITACHI_AC false
-#define SEND_HITACHI_AC false
-
-#define DECODE_HITACHI_AC1 false
-#define SEND_HITACHI_AC1 false
-
-#define DECODE_HITACHI_AC2 false
-#define SEND_HITACHI_AC2 false
-
-#define DECODE_GICABLE false
-#define SEND_GICABLE false
-
-#define DECODE_HAIER_AC_YRW02 false
-#define SEND_HAIER_AC_YRW02 false
-
-#define DECODE_WHIRLPOOL_AC false
-#define SEND_WHIRLPOOL_AC false
-
-#define DECODE_LUTRON false
-#define SEND_LUTRON false
-
-#define DECODE_ELECTRA_AC false
-#define SEND_ELECTRA_AC false
-
-#define DECODE_PANASONIC_AC false
-#define SEND_PANASONIC_AC false
-
-#define DECODE_MWM false
-#define SEND_MWM false
-
-#define DECODE_PIONEER false
-#define SEND_PIONEER false
-
-#define DECODE_DAIKIN2 false
-#define SEND_DAIKIN2 false
-
-#define DECODE_VESTEL_AC false
-#define SEND_VESTEL_AC false
-
-#define DECODE_TECO false
-#define SEND_TECO false
-
-#define DECODE_TCL112AC false
-#define SEND_TCL112AC false
-
-#define DECODE_LEGOPF false
-#define SEND_LEGOPF false
-
-#define DECODE_MITSUBISHIHEAVY false
-#define SEND_MITSUBISHIHEAVY false
-
-#define DECODE_DAIKIN216 false
-#define SEND_DAIKIN216 false
-
-#define DECODE_DAIKIN160 false
-#define SEND_DAIKIN160 false
-
-#define DECODE_NEOCLIMA false
-#define SEND_NEOCLIMA false
-
-#define DECODE_DAIKIN176 false
-#define SEND_DAIKIN176 false
-
-#define DECODE_DAIKIN128 false
-#define SEND_DAIKIN128 false
-
-#define DECODE_AMCOR false
-#define SEND_AMCOR false
-
-#define DECODE_DAIKIN152 false
-#define SEND_DAIKIN152 false
-
-#define DECODE_HITACHI_AC424 false
-#define SEND_HITACHI_AC424 false
-
-#endif // defined(FIRMWARE_IR) || defined(FIRMWARE_IR_CUSTOM) // full IR protocols
+// Semi-unique code for unknown messages
+#ifndef DECODE_HASH
+#define DECODE_HASH _IR_ENABLE_DEFAULT_
+#endif // DECODE_HASH
+
+#ifndef SEND_RAW
+#define SEND_RAW _IR_ENABLE_DEFAULT_
+#endif // SEND_RAW
+
+#ifndef DECODE_NEC
+#define DECODE_NEC _IR_ENABLE_DEFAULT_
+#endif // DECODE_NEC
+#ifndef SEND_NEC
+#define SEND_NEC _IR_ENABLE_DEFAULT_
+#endif // SEND_NEC
+
+#ifndef DECODE_SHERWOOD
+#define DECODE_SHERWOOD false // Not applicable. Actually is DECODE_NEC
+#endif // DECODE_SHERWOOD
+#ifndef SEND_SHERWOOD
+#define SEND_SHERWOOD _IR_ENABLE_DEFAULT_
+#endif // SEND_SHERWOOD
+
+#ifndef DECODE_RC5
+#define DECODE_RC5 _IR_ENABLE_DEFAULT_
+#endif // DECODE_RC5
+#ifndef SEND_RC5
+#define SEND_RC5 _IR_ENABLE_DEFAULT_
+#endif // SEND_RC5
+
+#ifndef DECODE_RC6
+#define DECODE_RC6 _IR_ENABLE_DEFAULT_
+#endif // DECODE_RC6
+#ifndef SEND_RC6
+#define SEND_RC6 _IR_ENABLE_DEFAULT_
+#endif // SEND_RC6
+
+#ifndef DECODE_RCMM
+#define DECODE_RCMM _IR_ENABLE_DEFAULT_
+#endif // DECODE_RCMM
+#ifndef SEND_RCMM
+#define SEND_RCMM _IR_ENABLE_DEFAULT_
+#endif // SEND_RCMM
+
+#ifndef DECODE_SONY
+#define DECODE_SONY _IR_ENABLE_DEFAULT_
+#endif // DECODE_SONY
+#ifndef SEND_SONY
+#define SEND_SONY _IR_ENABLE_DEFAULT_
+#endif // SEND_SONY
+
+#ifndef DECODE_PANASONIC
+#define DECODE_PANASONIC _IR_ENABLE_DEFAULT_
+#endif // DECODE_PANASONIC
+#ifndef SEND_PANASONIC
+#define SEND_PANASONIC _IR_ENABLE_DEFAULT_
+#endif // SEND_PANASONIC
+
+#ifndef DECODE_JVC
+#define DECODE_JVC _IR_ENABLE_DEFAULT_
+#endif // DECODE_JVC
+#ifndef SEND_JVC
+#define SEND_JVC _IR_ENABLE_DEFAULT_
+#endif // SEND_JVC
+
+#ifndef DECODE_SAMSUNG
+#define DECODE_SAMSUNG _IR_ENABLE_DEFAULT_
+#endif // DECODE_SAMSUNG
+#ifndef SEND_SAMSUNG
+#define SEND_SAMSUNG _IR_ENABLE_DEFAULT_
+#endif // SEND_SAMSUNG
+
+#ifndef DECODE_SAMSUNG36
+#define DECODE_SAMSUNG36 _IR_ENABLE_DEFAULT_
+#endif // DECODE_SAMSUNG36
+#ifndef SEND_SAMSUNG36
+#define SEND_SAMSUNG36 _IR_ENABLE_DEFAULT_
+#endif // SEND_SAMSUNG36
+
+#ifndef DECODE_SAMSUNG_AC
+#define DECODE_SAMSUNG_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_SAMSUNG_AC
+#ifndef SEND_SAMSUNG_AC
+#define SEND_SAMSUNG_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_SAMSUNG_AC
+
+#ifndef DECODE_WHYNTER
+#define DECODE_WHYNTER _IR_ENABLE_DEFAULT_
+#endif // DECODE_WHYNTER
+#ifndef SEND_WHYNTER
+#define SEND_WHYNTER _IR_ENABLE_DEFAULT_
+#endif // SEND_WHYNTER
+
+#ifndef DECODE_AIWA_RC_T501
+#define DECODE_AIWA_RC_T501 _IR_ENABLE_DEFAULT_
+#endif // DECODE_AIWA_RC_T501
+#ifndef SEND_AIWA_RC_T501
+#define SEND_AIWA_RC_T501 _IR_ENABLE_DEFAULT_
+#endif // SEND_AIWA_RC_T501
+
+#ifndef DECODE_LG
+#define DECODE_LG _IR_ENABLE_DEFAULT_
+#endif // DECODE_LG
+#ifndef SEND_LG
+#define SEND_LG _IR_ENABLE_DEFAULT_
+#endif // SEND_LG
+
+#ifndef DECODE_SANYO
+#define DECODE_SANYO _IR_ENABLE_DEFAULT_
+#endif // DECODE_SANYO
+#ifndef SEND_SANYO
+#define SEND_SANYO _IR_ENABLE_DEFAULT_
+#endif // SEND_SANYO
+
+#ifndef DECODE_MITSUBISHI
+#define DECODE_MITSUBISHI _IR_ENABLE_DEFAULT_
+#endif // DECODE_MITSUBISHI
+#ifndef SEND_MITSUBISHI
+#define SEND_MITSUBISHI _IR_ENABLE_DEFAULT_
+#endif // SEND_MITSUBISHI
+
+#ifndef DECODE_MITSUBISHI2
+#define DECODE_MITSUBISHI2 _IR_ENABLE_DEFAULT_
+#endif // DECODE_MITSUBISHI2
+#ifndef SEND_MITSUBISHI2
+#define SEND_MITSUBISHI2 _IR_ENABLE_DEFAULT_
+#endif // SEND_MITSUBISHI2
+
+#ifndef DECODE_DISH
+#define DECODE_DISH _IR_ENABLE_DEFAULT_
+#endif // DECODE_DISH
+#ifndef SEND_DISH
+#define SEND_DISH _IR_ENABLE_DEFAULT_
+#endif // SEND_DISH
+
+#ifndef DECODE_SHARP
+#define DECODE_SHARP _IR_ENABLE_DEFAULT_
+#endif // DECODE_SHARP
+#ifndef SEND_SHARP
+#define SEND_SHARP _IR_ENABLE_DEFAULT_
+#endif // SEND_SHARP
+
+#ifndef DECODE_SHARP_AC
+#define DECODE_SHARP_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_SHARP_AC
+#ifndef SEND_SHARP_AC
+#define SEND_SHARP_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_SHARP_AC
+
+#ifndef DECODE_DENON
+#define DECODE_DENON _IR_ENABLE_DEFAULT_
+#endif // DECODE_DENON
+#ifndef SEND_DENON
+#define SEND_DENON _IR_ENABLE_DEFAULT_
+#endif // SEND_DENON
+
+#ifndef DECODE_KELVINATOR
+#define DECODE_KELVINATOR _IR_ENABLE_DEFAULT_
+#endif // DECODE_KELVINATOR
+#ifndef SEND_KELVINATOR
+#define SEND_KELVINATOR _IR_ENABLE_DEFAULT_
+#endif // SEND_KELVINATOR
+
+#ifndef DECODE_MITSUBISHI_AC
+#define DECODE_MITSUBISHI_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_MITSUBISHI_AC
+#ifndef SEND_MITSUBISHI_AC
+#define SEND_MITSUBISHI_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_MITSUBISHI_AC
+
+#ifndef DECODE_MITSUBISHI136
+#define DECODE_MITSUBISHI136 _IR_ENABLE_DEFAULT_
+#endif // DECODE_MITSUBISHI136
+#ifndef SEND_MITSUBISHI136
+#define SEND_MITSUBISHI136 _IR_ENABLE_DEFAULT_
+#endif // SEND_MITSUBISHI136
+
+#ifndef DECODE_MITSUBISHI112
+#define DECODE_MITSUBISHI112 _IR_ENABLE_DEFAULT_
+#endif // DECODE_MITSUBISHI112
+#ifndef SEND_MITSUBISHI112
+#define SEND_MITSUBISHI112 _IR_ENABLE_DEFAULT_
+#endif // SEND_MITSUBISHI112
+
+#ifndef DECODE_FUJITSU_AC
+#define DECODE_FUJITSU_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_FUJITSU_AC
+#ifndef SEND_FUJITSU_AC
+#define SEND_FUJITSU_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_FUJITSU_AC
+
+#ifndef DECODE_INAX
+#define DECODE_INAX _IR_ENABLE_DEFAULT_
+#endif // DECODE_INAX
+#ifndef SEND_INAX
+#define SEND_INAX _IR_ENABLE_DEFAULT_
+#endif // SEND_INAX
+
+#ifndef DECODE_DAIKIN
+#define DECODE_DAIKIN _IR_ENABLE_DEFAULT_
+#endif // DECODE_DAIKIN
+#ifndef SEND_DAIKIN
+#define SEND_DAIKIN _IR_ENABLE_DEFAULT_
+#endif // SEND_DAIKIN
+
+#ifndef DECODE_COOLIX
+#define DECODE_COOLIX _IR_ENABLE_DEFAULT_
+#endif // DECODE_COOLIX
+#ifndef SEND_COOLIX
+#define SEND_COOLIX _IR_ENABLE_DEFAULT_
+#endif // SEND_COOLIX
+
+#ifndef DECODE_GLOBALCACHE
+#define DECODE_GLOBALCACHE false // Not applicable.
+#endif // DECODE_GLOBALCACHE
+#ifndef SEND_GLOBALCACHE
+#define SEND_GLOBALCACHE _IR_ENABLE_DEFAULT_
+#endif // SEND_GLOBALCACHE
+
+#ifndef DECODE_GOODWEATHER
+#define DECODE_GOODWEATHER _IR_ENABLE_DEFAULT_
+#endif // DECODE_GOODWEATHER
+#ifndef SEND_GOODWEATHER
+#define SEND_GOODWEATHER _IR_ENABLE_DEFAULT_
+#endif // SEND_GOODWEATHER
+
+#ifndef DECODE_GREE
+#define DECODE_GREE _IR_ENABLE_DEFAULT_
+#endif // DECODE_GREE
+#ifndef SEND_GREE
+#define SEND_GREE _IR_ENABLE_DEFAULT_
+#endif // SEND_GREE
+
+#ifndef DECODE_PRONTO
+#define DECODE_PRONTO false // Not applicable.
+#endif // DECODE_PRONTO
+#ifndef SEND_PRONTO
+#define SEND_PRONTO _IR_ENABLE_DEFAULT_
+#endif // SEND_PRONTO
+
+#ifndef DECODE_ARGO
+#define DECODE_ARGO _IR_ENABLE_DEFAULT_
+#endif // DECODE_ARGO
+#ifndef SEND_ARGO
+#define SEND_ARGO _IR_ENABLE_DEFAULT_
+#endif // SEND_ARGO
+
+#ifndef DECODE_TROTEC
+#define DECODE_TROTEC _IR_ENABLE_DEFAULT_
+#endif // DECODE_TROTEC
+#ifndef SEND_TROTEC
+#define SEND_TROTEC _IR_ENABLE_DEFAULT_
+#endif // SEND_TROTEC
+
+#ifndef DECODE_NIKAI
+#define DECODE_NIKAI _IR_ENABLE_DEFAULT_
+#endif // DECODE_NIKAI
+#ifndef SEND_NIKAI
+#define SEND_NIKAI _IR_ENABLE_DEFAULT_
+#endif // SEND_NIKAI
+
+#ifndef DECODE_TOSHIBA_AC
+#define DECODE_TOSHIBA_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_TOSHIBA_AC
+#ifndef SEND_TOSHIBA_AC
+#define SEND_TOSHIBA_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_TOSHIBA_AC
+
+#ifndef DECODE_MAGIQUEST
+#define DECODE_MAGIQUEST _IR_ENABLE_DEFAULT_
+#endif // DECODE_MAGIQUEST
+#ifndef SEND_MAGIQUEST
+#define SEND_MAGIQUEST _IR_ENABLE_DEFAULT_
+#endif // SEND_MAGIQUEST
+
+#ifndef DECODE_MIDEA
+#define DECODE_MIDEA _IR_ENABLE_DEFAULT_
+#endif // DECODE_MIDEA
+#ifndef SEND_MIDEA
+#define SEND_MIDEA _IR_ENABLE_DEFAULT_
+#endif // SEND_MIDEA
+
+#ifndef DECODE_LASERTAG
+#define DECODE_LASERTAG _IR_ENABLE_DEFAULT_
+#endif // DECODE_LASERTAG
+#ifndef SEND_LASERTAG
+#define SEND_LASERTAG _IR_ENABLE_DEFAULT_
+#endif // SEND_LASERTAG
+
+#ifndef DECODE_CARRIER_AC
+#define DECODE_CARRIER_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_CARRIER_AC
+#ifndef SEND_CARRIER_AC
+#define SEND_CARRIER_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_CARRIER_AC
+
+#ifndef DECODE_HAIER_AC
+#define DECODE_HAIER_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_HAIER_AC
+#ifndef SEND_HAIER_AC
+#define SEND_HAIER_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_HAIER_AC
+
+#ifndef DECODE_HITACHI_AC
+#define DECODE_HITACHI_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_HITACHI_AC
+#ifndef SEND_HITACHI_AC
+#define SEND_HITACHI_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_HITACHI_AC
+
+#ifndef DECODE_HITACHI_AC1
+#define DECODE_HITACHI_AC1 _IR_ENABLE_DEFAULT_
+#endif // DECODE_HITACHI_AC1
+#ifndef SEND_HITACHI_AC1
+#define SEND_HITACHI_AC1 _IR_ENABLE_DEFAULT_
+#endif // SEND_HITACHI_AC1
+
+#ifndef DECODE_HITACHI_AC2
+#define DECODE_HITACHI_AC2 _IR_ENABLE_DEFAULT_
+#endif // DECODE_HITACHI_AC2
+#ifndef SEND_HITACHI_AC2
+#define SEND_HITACHI_AC2 _IR_ENABLE_DEFAULT_
+#endif // SEND_HITACHI_AC2
+
+#ifndef DECODE_GICABLE
+#define DECODE_GICABLE _IR_ENABLE_DEFAULT_
+#endif // DECODE_GICABLE
+#ifndef SEND_GICABLE
+#define SEND_GICABLE _IR_ENABLE_DEFAULT_
+#endif // SEND_GICABLE
+
+#ifndef DECODE_HAIER_AC_YRW02
+#define DECODE_HAIER_AC_YRW02 _IR_ENABLE_DEFAULT_
+#endif // DECODE_HAIER_AC_YRW02
+#ifndef SEND_HAIER_AC_YRW02
+#define SEND_HAIER_AC_YRW02 _IR_ENABLE_DEFAULT_
+#endif // SEND_HAIER_AC_YRW02
+
+#ifndef DECODE_WHIRLPOOL_AC
+#define DECODE_WHIRLPOOL_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_WHIRLPOOL_AC
+#ifndef SEND_WHIRLPOOL_AC
+#define SEND_WHIRLPOOL_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_WHIRLPOOL_AC
+
+#ifndef DECODE_LUTRON
+#define DECODE_LUTRON _IR_ENABLE_DEFAULT_
+#endif // DECODE_LUTRON
+#ifndef SEND_LUTRON
+#define SEND_LUTRON _IR_ENABLE_DEFAULT_
+#endif // SEND_LUTRON
+
+#ifndef DECODE_ELECTRA_AC
+#define DECODE_ELECTRA_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_ELECTRA_AC
+#ifndef SEND_ELECTRA_AC
+#define SEND_ELECTRA_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_ELECTRA_AC
+
+#ifndef DECODE_PANASONIC_AC
+#define DECODE_PANASONIC_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_PANASONIC_AC
+#ifndef SEND_PANASONIC_AC
+#define SEND_PANASONIC_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_PANASONIC_AC
+
+#ifndef DECODE_MWM
+#define DECODE_MWM _IR_ENABLE_DEFAULT_
+#endif // DECODE_MWM
+#ifndef SEND_MWM
+#define SEND_MWM _IR_ENABLE_DEFAULT_
+#endif // SEND_MWM
+
+#ifndef DECODE_PIONEER
+#define DECODE_PIONEER _IR_ENABLE_DEFAULT_
+#endif // DECODE_PIONEER
+#ifndef SEND_PIONEER
+#define SEND_PIONEER _IR_ENABLE_DEFAULT_
+#endif // SEND_PIONEER
+
+#ifndef DECODE_DAIKIN2
+#define DECODE_DAIKIN2 _IR_ENABLE_DEFAULT_
+#endif // DECODE_DAIKIN2
+#ifndef SEND_DAIKIN2
+#define SEND_DAIKIN2 _IR_ENABLE_DEFAULT_
+#endif // SEND_DAIKIN2
+
+#ifndef DECODE_VESTEL_AC
+#define DECODE_VESTEL_AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_VESTEL_AC
+#ifndef SEND_VESTEL_AC
+#define SEND_VESTEL_AC _IR_ENABLE_DEFAULT_
+#endif // SEND_VESTEL_AC
+
+#ifndef DECODE_TECO
+#define DECODE_TECO _IR_ENABLE_DEFAULT_
+#endif // DECODE_TECO
+#ifndef SEND_TECO
+#define SEND_TECO _IR_ENABLE_DEFAULT_
+#endif // SEND_TECO
+
+#ifndef DECODE_TCL112AC
+#define DECODE_TCL112AC _IR_ENABLE_DEFAULT_
+#endif // DECODE_TCL112AC
+#ifndef SEND_TCL112AC
+#define SEND_TCL112AC _IR_ENABLE_DEFAULT_
+#endif // SEND_TCL112AC
+
+#ifndef DECODE_LEGOPF
+#define DECODE_LEGOPF _IR_ENABLE_DEFAULT_
+#endif // DECODE_LEGOPF
+#ifndef SEND_LEGOPF
+#define SEND_LEGOPF _IR_ENABLE_DEFAULT_
+#endif // SEND_LEGOPF
+
+#ifndef DECODE_MITSUBISHIHEAVY
+#define DECODE_MITSUBISHIHEAVY _IR_ENABLE_DEFAULT_
+#endif // DECODE_MITSUBISHIHEAVY
+#ifndef SEND_MITSUBISHIHEAVY
+#define SEND_MITSUBISHIHEAVY _IR_ENABLE_DEFAULT_
+#endif // SEND_MITSUBISHIHEAVY
+
+#ifndef DECODE_DAIKIN216
+#define DECODE_DAIKIN216 _IR_ENABLE_DEFAULT_
+#endif // DECODE_DAIKIN216
+#ifndef SEND_DAIKIN216
+#define SEND_DAIKIN216 _IR_ENABLE_DEFAULT_
+#endif // SEND_DAIKIN216
+
+#ifndef DECODE_DAIKIN160
+#define DECODE_DAIKIN160 _IR_ENABLE_DEFAULT_
+#endif // DECODE_DAIKIN160
+#ifndef SEND_DAIKIN160
+#define SEND_DAIKIN160 _IR_ENABLE_DEFAULT_
+#endif // SEND_DAIKIN160
+
+#ifndef DECODE_NEOCLIMA
+#define DECODE_NEOCLIMA _IR_ENABLE_DEFAULT_
+#endif // DECODE_NEOCLIMA
+#ifndef SEND_NEOCLIMA
+#define SEND_NEOCLIMA _IR_ENABLE_DEFAULT_
+#endif // SEND_NEOCLIMA
+
+#ifndef DECODE_DAIKIN176
+#define DECODE_DAIKIN176 _IR_ENABLE_DEFAULT_
+#endif // DECODE_DAIKIN176
+#ifndef SEND_DAIKIN176
+#define SEND_DAIKIN176 _IR_ENABLE_DEFAULT_
+#endif // SEND_DAIKIN176
+
+#ifndef DECODE_DAIKIN128
+#define DECODE_DAIKIN128 _IR_ENABLE_DEFAULT_
+#endif // DECODE_DAIKIN128
+#ifndef SEND_DAIKIN128
+#define SEND_DAIKIN128 _IR_ENABLE_DEFAULT_
+#endif // SEND_DAIKIN128
+
+#ifndef DECODE_AMCOR
+#define DECODE_AMCOR _IR_ENABLE_DEFAULT_
+#endif // DECODE_AMCOR
+#ifndef SEND_AMCOR
+#define SEND_AMCOR _IR_ENABLE_DEFAULT_
+#endif // SEND_AMCOR
+
+#ifndef DECODE_DAIKIN152
+#define DECODE_DAIKIN152 _IR_ENABLE_DEFAULT_
+#endif // DECODE_DAIKIN152
+#ifndef SEND_DAIKIN152
+#define SEND_DAIKIN152 _IR_ENABLE_DEFAULT_
+#endif // SEND_DAIKIN152
+
+#ifndef DECODE_HITACHI_AC424
+#define DECODE_HITACHI_AC424 _IR_ENABLE_DEFAULT_
+#endif // DECODE_HITACHI_AC424
+#ifndef SEND_HITACHI_AC424
+#define SEND_HITACHI_AC424 _IR_ENABLE_DEFAULT_
+#endif // SEND_HITACHI_AC424
+
+#ifndef DECODE_EPSON
+#define DECODE_EPSON _IR_ENABLE_DEFAULT_
+#endif // DECODE_EPSON
+#ifndef SEND_EPSON
+#define SEND_EPSON _IR_ENABLE_DEFAULT_
+#endif // SEND_EPSON
#if (DECODE_ARGO || DECODE_DAIKIN || DECODE_FUJITSU_AC || DECODE_GREE || \
DECODE_KELVINATOR || DECODE_MITSUBISHI_AC || DECODE_TOSHIBA_AC || \
@@ -495,8 +592,26 @@
// Note: If you plan to send IR messages in the callbacks of the AsyncWebserver
// library, you need to set ALLOW_DELAY_CALLS to false.
// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/430
+#ifndef ALLOW_DELAY_CALLS
#define ALLOW_DELAY_CALLS true
+#endif // ALLOW_DELAY_CALLS
+// Enable a run-time settable high-pass filter on captured data **before**
+// trying any protocol decoding.
+// i.e. Try to remove/merge any really short pulses detected in the raw data.
+// Note: Even when this option is enabled, it is _off_ by default, and requires
+// a user who knows what they are doing to enable it.
+// The option to disable this feature is here if your project is _really_
+// tight on resources. i.e. Saves a small handful of bytes and cpu time.
+// WARNING: If you use this feature at runtime, you can no longer trust the
+// **raw** data captured. It will now have been slightly **cooked**!
+// DANGER: If you set the `noise_floor` value too high, it **WILL** break
+// decoding of some protocols. You have been warned. Here Be Dragons!
+//
+// See: `irrecv::decode()` in IRrecv.cpp for more info.
+#ifndef ENABLE_NOISE_FILTER_OPTION
+#define ENABLE_NOISE_FILTER_OPTION true
+#endif // ENABLE_NOISE_FILTER_OPTION
/*
* Always add to the end of the list and should never remove entries
* or change order. Projects may save the type number for later usage
@@ -578,8 +693,10 @@ enum decode_type_t {
MITSUBISHI136,
MITSUBISHI112,
HITACHI_AC424,
+ SONY_38K,
+ EPSON, // 75
// Add new entries before this one, and update it to point to the last entry.
- kLastDecodeType = HITACHI_AC424,
+ kLastDecodeType = EPSON,
};
// Message lengths & required repeat values
@@ -588,6 +705,7 @@ const uint16_t kSingleRepeat = 1;
const uint16_t kAiwaRcT501Bits = 15;
const uint16_t kAiwaRcT501MinRepeats = kSingleRepeat;
+const uint16_t kAlokaBits = 32;
const uint16_t kAmcorStateLength = 8;
const uint16_t kAmcorBits = kAmcorStateLength * 8;
const uint16_t kAmcorDefaultRepeat = kSingleRepeat;
@@ -626,6 +744,8 @@ const uint16_t kDenon48Bits = 48;
const uint16_t kDenonLegacyBits = 14;
const uint16_t kDishBits = 16;
const uint16_t kDishMinRepeat = 3;
+const uint16_t kEpsonBits = 32;
+const uint16_t kEpsonMinRepeat = 2;
const uint16_t kElectraAcStateLength = 13;
const uint16_t kElectraAcBits = kElectraAcStateLength * 8;
const uint16_t kElectraAcMinRepeat = kNoRepeat;
@@ -668,6 +788,7 @@ const uint16_t kLegoPfBits = 16;
const uint16_t kLegoPfMinRepeat = kNoRepeat;
const uint16_t kLgBits = 28;
const uint16_t kLg32Bits = 32;
+const uint16_t kLgDefaultRepeat = kNoRepeat;
const uint16_t kLutronBits = 35;
const uint16_t kMagiquestBits = 56;
const uint16_t kMideaBits = 48;
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRsend.cpp b/lib/IRremoteESP8266-2.7.4/src/IRsend.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/IRsend.cpp
rename to lib/IRremoteESP8266-2.7.4/src/IRsend.cpp
index 18e2eb559..8bc12949b 100644
--- a/lib/IRremoteESP8266-2.7.1/src/IRsend.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/IRsend.cpp
@@ -477,7 +477,8 @@ void IRsend::sendGeneric(const uint16_t headermark, const uint32_t headerspace,
//
// Ref:
// examples/IRrecvDumpV2/IRrecvDumpV2.ino
-void IRsend::sendRaw(uint16_t buf[], uint16_t len, uint16_t hz) {
+void IRsend::sendRaw(const uint16_t buf[], const uint16_t len,
+ const uint16_t hz) {
// Set IR carrier frequency
enableIROut(hz);
for (uint16_t i = 0; i < len; i++) {
@@ -515,6 +516,10 @@ uint16_t IRsend::minRepeats(const decode_type_t protocol) {
return kDishMinRepeat;
case SONY:
return kSonyMinRepeat;
+ case SONY_38K:
+ return kSonyMinRepeat + 1;
+ case EPSON:
+ return kEpsonMinRepeat;
default:
return kNoRepeat;
}
@@ -545,6 +550,7 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) {
return 16;
case RC6:
case SONY:
+ case SONY_38K:
return 20;
case COOLIX:
case INAX:
@@ -555,6 +561,7 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) {
case LG2:
return 28;
case CARRIER_AC:
+ case EPSON:
case NEC:
case NEC_LIKE:
case SAMSUNG:
@@ -684,6 +691,11 @@ bool IRsend::send(const decode_type_t type, const uint64_t data,
sendDISH(data, nbits, min_repeat);
break;
#endif
+#if SEND_EPSON
+ case EPSON:
+ sendEpson(data, nbits, min_repeat);
+ break;
+#endif
#if SEND_GICABLE
case GICABLE:
sendGICable(data, nbits, min_repeat);
@@ -818,6 +830,9 @@ bool IRsend::send(const decode_type_t type, const uint64_t data,
case SONY:
sendSony(data, nbits, min_repeat);
break;
+ case SONY_38K:
+ sendSony38(data, nbits, min_repeat);
+ break;
#endif
#if SEND_TECO
case TECO:
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRsend.h b/lib/IRremoteESP8266-2.7.4/src/IRsend.h
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/src/IRsend.h
rename to lib/IRremoteESP8266-2.7.4/src/IRsend.h
index b0956e77c..902f22010 100644
--- a/lib/IRremoteESP8266-2.7.1/src/IRsend.h
+++ b/lib/IRremoteESP8266-2.7.4/src/IRsend.h
@@ -130,7 +130,7 @@ enum panasonic_ac_remote_model_t {
kPanasonicUnknown = 0,
kPanasonicLke = 1,
kPanasonicNke = 2,
- kPanasonicDke = 3,
+ kPanasonicDke = 3, // PKR too.
kPanasonicJke = 4,
kPanasonicCkp = 5,
kPanasonicRkr = 6,
@@ -141,6 +141,11 @@ enum whirlpool_ac_remote_model_t {
DG11J191,
};
+enum lg_ac_remote_model_t {
+ GE6711AR2853M = 1, // (1) LG 28-bit Protocol (default)
+ AKB75215403, // (2) LG2 28-bit Protocol
+};
+
// Classes
class IRsend {
@@ -153,7 +158,7 @@ class IRsend {
VIRTUAL uint16_t mark(uint16_t usec);
VIRTUAL void space(uint32_t usec);
int8_t calibrate(uint16_t hz = 38000U);
- void sendRaw(uint16_t buf[], uint16_t len, uint16_t hz);
+ void sendRaw(const uint16_t buf[], const uint16_t len, const uint16_t hz);
void sendData(uint16_t onemark, uint32_t onespace, uint16_t zeromark,
uint32_t zerospace, uint64_t data, uint16_t nbits,
bool MSBfirst = true);
@@ -198,6 +203,8 @@ class IRsend {
// a Sony command that will be accepted be a device.
void sendSony(uint64_t data, uint16_t nbits = kSony20Bits,
uint16_t repeat = kSonyMinRepeat);
+ void sendSony38(uint64_t data, uint16_t nbits = kSony20Bits,
+ uint16_t repeat = kSonyMinRepeat + 1);
uint32_t encodeSony(uint16_t nbits, uint16_t command, uint16_t address,
uint16_t extended = 0);
#endif
@@ -528,7 +535,10 @@ class IRsend {
const uint16_t nbytes = kAmcorStateLength,
const uint16_t repeat = kAmcorDefaultRepeat);
#endif // SEND_AMCOR
-
+#if SEND_EPSON
+ void sendEpson(uint64_t data, uint16_t nbits = kEpsonBits,
+ uint16_t repeat = kEpsonMinRepeat);
+#endif
protected:
#ifdef UNIT_TEST
@@ -556,6 +566,10 @@ class IRsend {
uint8_t _dutycycle;
bool modulation;
uint32_t calcUSecPeriod(uint32_t hz, bool use_offset = true);
+#if SEND_SONY
+ void _sendSony(uint64_t data, uint16_t nbits,
+ uint16_t repeat, uint16_t freq);
+#endif
};
#endif // IRSEND_H_
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRtext.cpp b/lib/IRremoteESP8266-2.7.4/src/IRtext.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/IRtext.cpp
rename to lib/IRremoteESP8266-2.7.4/src/IRtext.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRtext.h b/lib/IRremoteESP8266-2.7.4/src/IRtext.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/IRtext.h
rename to lib/IRremoteESP8266-2.7.4/src/IRtext.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRtimer.cpp b/lib/IRremoteESP8266-2.7.4/src/IRtimer.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/IRtimer.cpp
rename to lib/IRremoteESP8266-2.7.4/src/IRtimer.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRtimer.h b/lib/IRremoteESP8266-2.7.4/src/IRtimer.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/IRtimer.h
rename to lib/IRremoteESP8266-2.7.4/src/IRtimer.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRutils.cpp b/lib/IRremoteESP8266-2.7.4/src/IRutils.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/IRutils.cpp
rename to lib/IRremoteESP8266-2.7.4/src/IRutils.cpp
index 0aa19e821..230b24809 100644
--- a/lib/IRremoteESP8266-2.7.1/src/IRutils.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/IRutils.cpp
@@ -125,6 +125,8 @@ decode_type_t strToDecodeType(const char * const str) {
return decode_type_t::DISH;
else if (!strcasecmp(str, "ELECTRA_AC"))
return decode_type_t::ELECTRA_AC;
+ else if (!strcasecmp(str, "EPSON"))
+ return decode_type_t::EPSON;
else if (!strcasecmp(str, "FUJITSU_AC"))
return decode_type_t::FUJITSU_AC;
else if (!strcasecmp(str, "GICABLE"))
@@ -228,6 +230,8 @@ decode_type_t strToDecodeType(const char * const str) {
return decode_type_t::SHERWOOD;
else if (!strcasecmp(str, "SONY"))
return decode_type_t::SONY;
+ else if (!strcasecmp(str, "SONY_38K"))
+ return decode_type_t::SONY_38K;
else if (!strcasecmp(str, "TCL112AC"))
return decode_type_t::TCL112AC;
else if (!strcasecmp(str, "TECO"))
@@ -308,6 +312,9 @@ String typeToString(const decode_type_t protocol, const bool isRepeat) {
case ELECTRA_AC:
result = F("ELECTRA_AC");
break;
+ case EPSON:
+ result = F("EPSON");
+ break;
case FUJITSU_AC:
result = F("FUJITSU_AC");
break;
@@ -461,6 +468,9 @@ String typeToString(const decode_type_t protocol, const bool isRepeat) {
case SONY:
result = F("SONY");
break;
+ case SONY_38K:
+ result = F("SONY_38K");
+ break;
case TCL112AC:
result = F("TCL112AC");
break;
@@ -824,13 +834,6 @@ namespace irutils {
String modelToStr(const decode_type_t protocol, const int16_t model) {
switch (protocol) {
- case decode_type_t::GREE:
- switch (model) {
- case gree_ac_remote_model_t::YAW1F: return F("YAW1F");
- case gree_ac_remote_model_t::YBOFB: return F("YBOFB");
- default: return kUnknownStr;
- }
- break;
case decode_type_t::FUJITSU_AC:
switch (model) {
case fujitsu_ac_remote_model_t::ARRAH2E: return F("ARRAH2E");
@@ -841,6 +844,21 @@ namespace irutils {
default: return kUnknownStr;
}
break;
+ case decode_type_t::GREE:
+ switch (model) {
+ case gree_ac_remote_model_t::YAW1F: return F("YAW1F");
+ case gree_ac_remote_model_t::YBOFB: return F("YBOFB");
+ default: return kUnknownStr;
+ }
+ break;
+ case decode_type_t::LG:
+ case decode_type_t::LG2:
+ switch (model) {
+ case lg_ac_remote_model_t::GE6711AR2853M: return F("GE6711AR2853M");
+ case lg_ac_remote_model_t::AKB75215403: return F("AKB75215403");
+ default: return kUnknownStr;
+ }
+ break;
case decode_type_t::PANASONIC_AC:
switch (model) {
case panasonic_ac_remote_model_t::kPanasonicLke: return F("LKE");
diff --git a/lib/IRremoteESP8266-2.7.1/src/IRutils.h b/lib/IRremoteESP8266-2.7.4/src/IRutils.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/IRutils.h
rename to lib/IRremoteESP8266-2.7.4/src/IRutils.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/i18n.h b/lib/IRremoteESP8266-2.7.4/src/i18n.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/i18n.h
rename to lib/IRremoteESP8266-2.7.4/src/i18n.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Aiwa.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Aiwa.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Aiwa.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Aiwa.cpp
index 70dbc85b2..95dffe1aa 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Aiwa.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Aiwa.cpp
@@ -53,6 +53,8 @@ void IRsend::sendAiwaRCT501(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kAiwaRcT501Bits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -69,8 +71,8 @@ void IRsend::sendAiwaRCT501(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Ref:
// http://www.sbprojects.com/knowledge/ir/nec.php
-bool IRrecv::decodeAiwaRCT501(decode_results *results, uint16_t nbits,
- bool strict) {
+bool IRrecv::decodeAiwaRCT501(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
// Compliance
if (strict && nbits != kAiwaRcT501Bits)
return false; // Doesn't match our protocol defn.
@@ -82,7 +84,7 @@ bool IRrecv::decodeAiwaRCT501(decode_results *results, uint16_t nbits,
return false; // We can't possibly match something that big.
// Decode it as a much bigger (non-standard) NEC message, so we have to turn
// off strict mode checking for NEC.
- if (!decodeNEC(results, expected_nbits, false))
+ if (!decodeNEC(results, offset, expected_nbits, false))
return false; // The NEC decode had a problem, so we should too.
uint16_t actual_bits = results->bits;
new_data = results->value;
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Amcor.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Amcor.cpp
similarity index 96%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Amcor.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Amcor.cpp
index b36c6d15a..b29933906 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Amcor.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Amcor.cpp
@@ -56,6 +56,8 @@ void IRsend::sendAmcor(const unsigned char data[], const uint16_t nbytes,
// Decode the supplied Amcor HVAC message.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion.
// Typically kAmcorBits.
// strict: Flag to indicate if we strictly adhere to the specification.
@@ -64,15 +66,13 @@ void IRsend::sendAmcor(const unsigned char data[], const uint16_t nbytes,
//
// Status: STABLE / Reported as working.
//
-bool IRrecv::decodeAmcor(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < 2 * nbits + kHeader - 1)
+bool IRrecv::decodeAmcor(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen <= 2 * nbits + kHeader - 1 + offset)
return false; // Can't possibly be a valid Amcor message.
if (strict && nbits != kAmcorBits)
return false; // We expect Amcor to be 64 bits of message.
- uint16_t offset = kStartOffset;
-
uint16_t used;
// Header + Data Block (64 bits) + Footer
used = matchGeneric(results->rawbuf + offset, results->state,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Amcor.h b/lib/IRremoteESP8266-2.7.4/src/ir_Amcor.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Amcor.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Amcor.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Argo.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Argo.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Argo.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Argo.cpp
index f1806ebcd..11e8336e3 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Argo.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Argo.cpp
@@ -378,6 +378,8 @@ String IRArgoAC::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kArgoBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -388,12 +390,11 @@ String IRArgoAC::toString(void) {
// Note:
// This decoder is based soley off sendArgo(). We have no actual captures
// to test this against. If you have one of these units, please let us know.
-bool IRrecv::decodeArgo(decode_results *results, const uint16_t nbits,
+bool IRrecv::decodeArgo(decode_results *results, uint16_t offset,
+ const uint16_t nbits,
const bool strict) {
if (strict && nbits != kArgoBits) return false;
- uint16_t offset = kStartOffset;
-
// Match Header + Data
if (!matchGeneric(results->rawbuf + offset, results->state,
results->rawlen - offset, nbits,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Argo.h b/lib/IRremoteESP8266-2.7.4/src/ir_Argo.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Argo.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Argo.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Carrier.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Carrier.cpp
similarity index 92%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Carrier.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Carrier.cpp
index e31ddd55f..7b2b00d58 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Carrier.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Carrier.cpp
@@ -53,6 +53,8 @@ void IRsend::sendCarrierAC(uint64_t data, uint16_t nbits, uint16_t repeat) {
// i.e. normal + inverted + normal
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion.
// Typically kCarrierAcBits.
// strict: Flag to indicate if we strictly adhere to the specification.
@@ -61,16 +63,15 @@ void IRsend::sendCarrierAC(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Status: ALPHA / Untested.
//
-bool IRrecv::decodeCarrierAC(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < ((2 * nbits + kHeader + kFooter) * 3) - 1)
+bool IRrecv::decodeCarrierAC(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < ((2 * nbits + kHeader + kFooter) * 3) - 1 + offset)
return false; // Can't possibly be a valid Carrier message.
if (strict && nbits != kCarrierAcBits)
return false; // We expect Carrier to be 32 bits of message.
uint64_t data = 0;
uint64_t prev_data = 0;
- uint16_t offset = kStartOffset;
for (uint8_t i = 0; i < 3; i++) {
prev_data = data;
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Coolix.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Coolix.cpp
similarity index 95%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Coolix.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Coolix.cpp
index 0dbd68d63..a8d98301c 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Coolix.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Coolix.cpp
@@ -27,16 +27,16 @@
// Pulse parms are *50-100 for the Mark and *50+100 for the space
// First MARK is the one after the long gap
// pulse parameters in usec
-const uint16_t kCoolixTick = 560; // Approximately 21 cycles at 38kHz
-const uint16_t kCoolixBitMarkTicks = 1;
+const uint16_t kCoolixTick = 276; // Approximately 10.5 cycles at 38kHz
+const uint16_t kCoolixBitMarkTicks = 2;
const uint16_t kCoolixBitMark = kCoolixBitMarkTicks * kCoolixTick;
-const uint16_t kCoolixOneSpaceTicks = 3;
+const uint16_t kCoolixOneSpaceTicks = 6;
const uint16_t kCoolixOneSpace = kCoolixOneSpaceTicks * kCoolixTick;
-const uint16_t kCoolixZeroSpaceTicks = 1;
+const uint16_t kCoolixZeroSpaceTicks = 2;
const uint16_t kCoolixZeroSpace = kCoolixZeroSpaceTicks * kCoolixTick;
-const uint16_t kCoolixHdrMarkTicks = 8;
+const uint16_t kCoolixHdrMarkTicks = 17;
const uint16_t kCoolixHdrMark = kCoolixHdrMarkTicks * kCoolixTick;
-const uint16_t kCoolixHdrSpaceTicks = 8;
+const uint16_t kCoolixHdrSpaceTicks = 16;
const uint16_t kCoolixHdrSpace = kCoolixHdrSpaceTicks * kCoolixTick;
const uint16_t kCoolixMinGapTicks = kCoolixHdrMarkTicks + kCoolixZeroSpaceTicks;
const uint16_t kCoolixMinGap = kCoolixMinGapTicks * kCoolixTick;
@@ -57,11 +57,10 @@ using irutils::setBits;
// nbits: Nr. of bits of data to be sent. Typically kCoolixBits.
// repeat: Nr. of additional times the message is to be sent.
//
-// Status: BETA / Probably works.
+// Status: STABLE / Confirmed Working.
//
// Ref:
// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_COOLIX.cpp
-// TODO(anyone): Verify repeat functionality against a real unit.
void IRsend::sendCOOLIX(uint64_t data, uint16_t nbits, uint16_t repeat) {
if (nbits % 8 != 0) return; // nbits is required to be a multiple of 8.
@@ -131,6 +130,7 @@ void IRCoolixAC::send(const uint16_t repeat) {
uint32_t IRCoolixAC::getRaw() { return remote_state; }
void IRCoolixAC::setRaw(const uint32_t new_code) {
+ powerFlag = true; // Everything that is not the special power off mesg is On.
if (!handleSpecialState(new_code)) {
// it isn`t special so might affect Temp|mode|Fan
if (new_code == kCoolixCmdFan) {
@@ -443,7 +443,11 @@ stdAc::state_t IRCoolixAC::toCommon(const stdAc::state_t *prev) {
} else {
// Set defaults for non-zero values that are not implicitly set for when
// there is no previous state.
+ // e.g. Any setting that toggles should probably go here.
result.swingv = stdAc::swingv_t::kOff;
+ result.turbo = false;
+ result.clean = false;
+ result.light = false;
result.sleep = -1;
}
// Not supported.
@@ -575,17 +579,19 @@ String IRCoolixAC::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kCoolixBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
// Status: BETA / Probably working.
-bool IRrecv::decodeCOOLIX(decode_results *results, uint16_t nbits,
- bool strict) {
+bool IRrecv::decodeCOOLIX(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
// The protocol sends the data normal + inverted, alternating on
// each byte. Hence twice the number of expected data bits.
- if (results->rawlen < 2 * 2 * nbits + kHeader + kFooter - 1)
+ if (results->rawlen <= 2 * 2 * nbits + kHeader + kFooter - 1 + offset)
return false; // Can't possibly be a valid COOLIX message.
if (strict && nbits != kCoolixBits)
return false; // Not strictly a COOLIX message.
@@ -594,7 +600,6 @@ bool IRrecv::decodeCOOLIX(decode_results *results, uint16_t nbits,
uint64_t data = 0;
uint64_t inverted = 0;
- uint16_t offset = kStartOffset;
if (nbits > sizeof(data) * 8)
return false; // We can't possibly capture a Coolix packet that big.
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Coolix.h b/lib/IRremoteESP8266-2.7.4/src/ir_Coolix.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Coolix.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Coolix.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Daikin.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Daikin.cpp
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Daikin.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Daikin.cpp
index 678e43f88..4941fe977 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Daikin.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Daikin.cpp
@@ -513,6 +513,8 @@ String IRDaikinESP::toString(void) {
// Decode the supplied Daikin A/C message.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikinBits)
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -522,17 +524,17 @@ String IRDaikinESP::toString(void) {
//
// Ref:
// https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
-bool IRrecv::decodeDaikin(decode_results *results, const uint16_t nbits,
- const bool strict) {
+bool IRrecv::decodeDaikin(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
// Is there enough data to match successfully?
if (results->rawlen < (2 * (nbits + kDaikinHeaderLength) +
- kDaikinSections * (kHeader + kFooter) + kFooter - 1))
+ kDaikinSections * (kHeader + kFooter) + kFooter - 1) +
+ offset)
return false;
// Compliance
if (strict && nbits != kDaikinBits) return false;
- uint16_t offset = kStartOffset;
match_result_t data_result;
// Header #1 - Doesn't count as data.
@@ -1206,6 +1208,8 @@ String IRDaikin2::toString(void) {
// Decode the supplied Daikin2 A/C message.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin2Bits)
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -1219,15 +1223,14 @@ String IRDaikin2::toString(void) {
//
// Ref:
// https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
-bool IRrecv::decodeDaikin2(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < 2 * (nbits + kHeader + kFooter) + kHeader - 1)
+bool IRrecv::decodeDaikin2(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < 2 * (nbits + kHeader + kFooter) + kHeader - 1 + offset)
return false;
// Compliance
if (strict && nbits != kDaikin2Bits) return false;
- uint16_t offset = kStartOffset;
const uint8_t ksectionSize[kDaikin2Sections] = {kDaikin2Section1Length,
kDaikin2Section2Length};
@@ -1552,6 +1555,8 @@ String IRDaikin216::toString(void) {
// Decode the supplied Daikin 216 bit A/C message.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin216Bits)
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -1565,15 +1570,14 @@ String IRDaikin216::toString(void) {
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/689
// https://github.com/danny-source/Arduino_DY_IRDaikin
-bool IRrecv::decodeDaikin216(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1)
+bool IRrecv::decodeDaikin216(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1 + offset)
return false;
// Compliance
if (strict && nbits != kDaikin216Bits) return false;
- uint16_t offset = kStartOffset;
const uint8_t ksectionSize[kDaikin216Sections] = {kDaikin216Section1Length,
kDaikin216Section2Length};
// Sections
@@ -1905,6 +1909,8 @@ String IRDaikin160::toString(void) {
// Decode the supplied Daikin 160 bit A/C message.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin160Bits)
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -1917,15 +1923,14 @@ String IRDaikin160::toString(void) {
//
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/731
-bool IRrecv::decodeDaikin160(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1)
+bool IRrecv::decodeDaikin160(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1 + offset)
return false;
// Compliance
if (strict && nbits != kDaikin160Bits) return false;
- uint16_t offset = kStartOffset;
const uint8_t ksectionSize[kDaikin160Sections] = {kDaikin160Section1Length,
kDaikin160Section2Length};
@@ -2268,6 +2273,8 @@ String IRDaikin176::toString(void) {
// Decode the supplied Daikin 176 bit A/C message.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin176Bits)
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -2279,15 +2286,15 @@ String IRDaikin176::toString(void) {
// Status: BETA / Probably works.
//
-bool IRrecv::decodeDaikin176(decode_results *results, const uint16_t nbits,
+bool IRrecv::decodeDaikin176(decode_results *results, uint16_t offset,
+ const uint16_t nbits,
const bool strict) {
- if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1)
+ if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1 + offset)
return false;
// Compliance
if (strict && nbits != kDaikin176Bits) return false;
- uint16_t offset = kStartOffset;
const uint8_t ksectionSize[kDaikin176Sections] = {kDaikin176Section1Length,
kDaikin176Section2Length};
@@ -2762,6 +2769,8 @@ stdAc::state_t IRDaikin128::toCommon(const stdAc::state_t *prev) {
// Decode the supplied Daikin 128 bit A/C message.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin128Bits)
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -2773,17 +2782,15 @@ stdAc::state_t IRDaikin128::toCommon(const stdAc::state_t *prev) {
// Status: STABLE / Known Working.
//
// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/827
-bool IRrecv::decodeDaikin128(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < 2 * (nbits + kHeader) + kFooter - 1)
+bool IRrecv::decodeDaikin128(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < 2 * (nbits + kHeader) + kFooter - 1 + offset)
return false;
if (nbits / 8 <= kDaikin128SectionLength) return false;
// Compliance
if (strict && nbits != kDaikin128Bits) return false;
- uint16_t offset = kStartOffset;
-
// Leader
for (uint8_t i = 0; i < 2; i++) {
if (!matchMark(results->rawbuf[offset++], kDaikin128LeaderMark,
@@ -2862,6 +2869,8 @@ void IRsend::sendDaikin152(const unsigned char data[], const uint16_t nbytes,
// Decode the supplied Daikin 152 bit A/C message.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin152Bits)
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -2873,16 +2882,15 @@ void IRsend::sendDaikin152(const unsigned char data[], const uint16_t nbytes,
// Status: STABLE / Known working.
//
// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/873
-bool IRrecv::decodeDaikin152(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < 2 * (5 + nbits + kFooter) + kHeader - 1)
+bool IRrecv::decodeDaikin152(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < 2 * (5 + nbits + kFooter) + kHeader - 1 + offset)
return false;
if (nbits / 8 < kDaikin152StateLength) return false;
// Compliance
if (strict && nbits != kDaikin152Bits) return false;
- uint16_t offset = kStartOffset;
uint16_t used;
// Leader
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Daikin.h b/lib/IRremoteESP8266-2.7.4/src/ir_Daikin.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Daikin.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Daikin.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Denon.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Denon.cpp
similarity index 89%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Denon.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Denon.cpp
index 8a32ae261..bd4940714 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Denon.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Denon.cpp
@@ -64,7 +64,10 @@ void IRsend::sendDenon(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Expected nr. of data bits. (Typically kDenonBits)
+// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
@@ -72,7 +75,8 @@ void IRsend::sendDenon(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Ref:
// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp
-bool IRrecv::decodeDenon(decode_results *results, uint16_t nbits, bool strict) {
+bool IRrecv::decodeDenon(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
// Compliance
if (strict) {
switch (nbits) {
@@ -92,15 +96,14 @@ bool IRrecv::decodeDenon(decode_results *results, uint16_t nbits, bool strict) {
// Ditto for Panasonic, it's the same except for a different
// manufacturer code.
- if (!decodeSharp(results, nbits, true, false) &&
- !decodePanasonic(results, nbits, true, kDenonManufacturer)) {
+ if (!decodeSharp(results, offset, nbits, true, false) &&
+ !decodePanasonic(results, offset, nbits, true, kDenonManufacturer)) {
// We couldn't decode it as expected, so try the old legacy method.
// NOTE: I don't think this following protocol actually exists.
// Looks like a partial version of the Sharp protocol.
if (strict && nbits != kDenonLegacyBits) return false;
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
if (!matchGeneric(results->rawbuf + offset, &data,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Dish.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Dish.cpp
similarity index 93%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Dish.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Dish.cpp
index b217da763..834ceda04 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Dish.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Dish.cpp
@@ -69,6 +69,8 @@ void IRsend::sendDISH(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. Typically kDishBits.
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -84,13 +86,11 @@ void IRsend::sendDISH(uint64_t data, uint16_t nbits, uint16_t repeat) {
// http://www.hifi-remote.com/wiki/index.php?title=Dish
// http://lirc.sourceforge.net/remotes/echostar/301_501_3100_5100_58xx_59xx
// https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Dish.cpp
-bool IRrecv::decodeDISH(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
- return false; // Not enough entries to be valid.
+bool IRrecv::decodeDISH(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (strict && nbits != kDishBits) return false; // Not strictly compliant.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
if (!matchGeneric(results->rawbuf + offset, &data,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Electra.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Electra.cpp
similarity index 88%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Electra.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Electra.cpp
index e423bfa0a..16c753f35 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Electra.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Electra.cpp
@@ -66,7 +66,7 @@ IRElectraAc::IRElectraAc(const uint16_t pin, const bool inverted,
void IRElectraAc::stateReset(void) {
for (uint8_t i = 1; i < kElectraAcStateLength - 2; i++) remote_state[i] = 0;
remote_state[0] = 0xC3;
- remote_state[11] = 0x08;
+ remote_state[11] = kElectraAcLightToggleOff;
// [12] is the checksum.
}
@@ -233,6 +233,30 @@ bool IRElectraAc::getSwingH(void) {
kElectraAcSwingSize);
}
+void IRElectraAc::setLightToggle(const bool on) {
+ remote_state[11] = on ? kElectraAcLightToggleOn : kElectraAcLightToggleOff;
+}
+
+bool IRElectraAc::getLightToggle(void) {
+ return (remote_state[11] & kElectraAcLightToggleMask) ==
+ kElectraAcLightToggleMask;
+}
+
+void IRElectraAc::setClean(const bool on) {
+ setBit(&remote_state[9], kElectraAcCleanOffset, on);
+}
+
+bool IRElectraAc::getClean(void) {
+ return GETBIT8(remote_state[9], kElectraAcCleanOffset);
+}
+
+void IRElectraAc::setTurbo(const bool on) {
+ setBit(&remote_state[5], kElectraAcTurboOffset, on);
+}
+
+bool IRElectraAc::getTurbo(void) {
+ return GETBIT8(remote_state[5], kElectraAcTurboOffset);
+}
// Convert the A/C state to it's common equivalent.
stdAc::state_t IRElectraAc::toCommon(void) {
stdAc::state_t result;
@@ -246,13 +270,13 @@ stdAc::state_t IRElectraAc::toCommon(void) {
: stdAc::swingv_t::kOff;
result.swingh = this->getSwingH() ? stdAc::swingh_t::kAuto
: stdAc::swingh_t::kOff;
+ result.light = this->getLightToggle();
+ result.turbo = this->getTurbo();
+ result.clean = this->getClean();
// Not supported.
result.model = -1; // No models used.
result.quiet = false;
- result.turbo = false;
result.econo = false;
- result.clean = false;
- result.light = false;
result.filter = false;
result.beep = false;
result.sleep = -1;
@@ -263,7 +287,7 @@ stdAc::state_t IRElectraAc::toCommon(void) {
// Convert the internal state into a human readable string.
String IRElectraAc::toString(void) {
String result = "";
- result.reserve(80); // Reserve some heap for the string to reduce fragging.
+ result.reserve(130); // Reserve some heap for the string to reduce fragging.
result += addBoolToString(getPower(), kPowerStr, false);
result += addModeToString(getMode(), kElectraAcAuto, kElectraAcCool,
kElectraAcHeat, kElectraAcDry, kElectraAcFan);
@@ -273,6 +297,9 @@ String IRElectraAc::toString(void) {
kElectraAcFanMed);
result += addBoolToString(getSwingV(), kSwingVStr);
result += addBoolToString(getSwingH(), kSwingHStr);
+ result += addLabeledString(getLightToggle() ? kToggleStr : "-", kLightStr);
+ result += addBoolToString(getClean(), kCleanStr);
+ result += addBoolToString(getTurbo(), kTurboStr);
return result;
}
@@ -281,6 +308,8 @@ String IRElectraAc::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kElectraAcBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -288,14 +317,14 @@ String IRElectraAc::toString(void) {
//
// Status: STABLE / Known working.
//
-bool IRrecv::decodeElectraAC(decode_results *results, uint16_t nbits,
- bool strict) {
+bool IRrecv::decodeElectraAC(decode_results *results, uint16_t offset,
+ const uint16_t nbits,
+ const bool strict) {
if (strict) {
if (nbits != kElectraAcBits)
return false; // Not strictly a ELECTRA_AC message.
}
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
if (!matchGeneric(results->rawbuf + offset, results->state,
results->rawlen - offset, nbits,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Electra.h b/lib/IRremoteESP8266-2.7.4/src/ir_Electra.h
similarity index 79%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Electra.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Electra.h
index ef28b44cf..2d5fe09f5 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Electra.h
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Electra.h
@@ -19,6 +19,8 @@
// Supports:
// Brand: AUX, Model: KFR-35GW/BpNFW=3 A/C
// Brand: AUX, Model: YKR-T/011 remote
+// Brand: Electra, Model: Classic INV 17 / AXW12DCS A/C
+// Brand: Electra, Model: YKR-M/003E remote
// Ref:
// https://github.com/ToniA/arduino-heatpumpir/blob/master/AUXHeatpumpIR.cpp
@@ -48,6 +50,10 @@ const uint8_t kElectraAcFanAuto = 0b101;
const uint8_t kElectraAcFanLow = 0b011;
const uint8_t kElectraAcFanMed = 0b010;
const uint8_t kElectraAcFanHigh = 0b001;
+// state[5]
+// TurboMask = 0b01000000;
+const uint8_t kElectraAcTurboOffset = 6;
+
// state[6]
// Mode 0b11100000
const uint8_t kElectraAcModeOffset = 5;
@@ -57,7 +63,18 @@ const uint8_t kElectraAcDry = 0b010;
const uint8_t kElectraAcHeat = 0b100;
const uint8_t kElectraAcFan = 0b110;
// state[9]
-const uint8_t kElectraAcPowerOffset = 5;
+//
+const uint8_t kElectraAcCleanOffset = 2; // Bit 0b00000100
+const uint8_t kElectraAcPowerOffset = 5; // Bit 0b00100000
+// state[11]
+//
+const uint8_t kElectraAcLightToggleOn = 0x15;
+// Light has known ON values of 0x15 (0b00010101) or 0x19 (0b00011001)
+// Thus common bits ON are: 0b00010001 (0x11)
+// We will use this for the getLightToggle() test.
+const uint8_t kElectraAcLightToggleMask = 0x11;
+// and known OFF values of 0x08 (0b00001000) & 0x05 (0x00000101)
+const uint8_t kElectraAcLightToggleOff = 0x08;
// Classes
@@ -86,6 +103,12 @@ class IRElectraAc {
bool getSwingV(void);
void setSwingH(const bool on);
bool getSwingH(void);
+ void setClean(const bool on);
+ bool getClean(void);
+ void setLightToggle(const bool on);
+ bool getLightToggle(void);
+ void setTurbo(const bool on);
+ bool getTurbo(void);
uint8_t* getRaw(void);
void setRaw(const uint8_t new_code[],
const uint16_t length = kElectraAcStateLength);
diff --git a/lib/IRremoteESP8266-2.7.4/src/ir_Epson.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Epson.cpp
new file mode 100644
index 000000000..40973a947
--- /dev/null
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Epson.cpp
@@ -0,0 +1,114 @@
+// Copyright 2020 David Conran
+
+// Epson is an NEC-like protocol, except it doesn't use the NEC style repeat.
+
+#define __STDC_LIMIT_MACROS
+#include
+#include
+#include "IRrecv.h"
+#include "IRsend.h"
+#include "IRutils.h"
+#include "ir_NEC.h"
+
+#if SEND_EPSON
+// Send an Epson formatted message.
+//
+// Args:
+// data: The message to be sent.
+// nbits: The number of bits of the message to be sent. Typically kEpsonBits.
+// repeat: The number of times the command is to be repeated.
+//
+// Status: Beta / Probably works.
+//
+// Ref:
+// https://github.com/crankyoldgit/IRremoteESP8266/issues/1034
+void IRsend::sendEpson(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ sendGeneric(kNecHdrMark, kNecHdrSpace, kNecBitMark, kNecOneSpace, kNecBitMark,
+ kNecZeroSpace, kNecBitMark, kNecMinGap, kNecMinCommandLength,
+ data, nbits, 38, true, repeat, 33);
+}
+
+#endif // SEND_EPSON
+
+#if DECODE_EPSON
+// Decode the supplied Epson message.
+//
+// Args:
+// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
+// nbits: The number of data bits to expect. Typically kNECBits.
+// strict: Flag indicating if we should perform strict matching.
+// Returns:
+// boolean: True if it can decode it, false if it can't.
+//
+// Status: Beta / Probably works.
+//
+// Notes:
+// Experimental data indicates there are at least three
+// messages (first + 2 repeats). We only require the first + a single repeat
+// to match. This helps us distinguish it from NEC messages which are near
+// identical.
+//
+// Ref:
+// https://github.com/crankyoldgit/IRremoteESP8266/issues/1034
+bool IRrecv::decodeEpson(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ const uint8_t kEpsonMinMesgsForDecode = 2;
+
+ if (results->rawlen < kEpsonMinMesgsForDecode * (2 * nbits + kHeader +
+ kFooter) + offset - 1)
+ return false; // Can't possibly be a valid Epson message.
+ if (strict && nbits != kEpsonBits)
+ return false; // Not strictly an Epson message.
+
+ uint64_t data = 0;
+ uint64_t first_data = 0;
+ bool first = true;
+
+ for (uint8_t i = 0; i < kEpsonMinMesgsForDecode; i++) {
+ // Match Header + Data + Footer
+ uint16_t delta = matchGeneric(results->rawbuf + offset, &data,
+ results->rawlen - offset, nbits,
+ kNecHdrMark, kNecHdrSpace,
+ kNecBitMark, kNecOneSpace,
+ kNecBitMark, kNecZeroSpace,
+ kNecBitMark, kNecMinGap, true);
+ if (!delta) return false;
+ offset += delta;
+ if (first)
+ first_data = data;
+ else if (data != first_data) return false;
+ first = false; // No longer the first message.
+ }
+ // Compliance
+ // Calculate command and optionally enforce integrity checking.
+ uint8_t command = (data & 0xFF00) >> 8;
+ // Command is sent twice, once as plain and then inverted.
+ if ((command ^ 0xFF) != (data & 0xFF)) {
+ if (strict) return false; // Command integrity failed.
+ command = 0; // The command value isn't valid, so default to zero.
+ }
+
+ // Success
+ results->bits = nbits;
+ results->value = data;
+ results->decode_type = EPSON;
+ // Epson command and address are technically in LSB first order so the
+ // final versions have to be reversed.
+ results->command = reverseBits(command, 8);
+ // Normal Epson (NEC) protocol has an 8 bit address sent,
+ // followed by it inverted.
+ uint8_t address = (data & 0xFF000000) >> 24;
+ uint8_t address_inverted = (data & 0x00FF0000) >> 16;
+ if (address == (address_inverted ^ 0xFF))
+ // Inverted, so it is normal Epson (NEC) protocol.
+ results->address = reverseBits(address, 8);
+ else
+ // Not inverted, so must be Extended Epson (NEC) protocol,
+ // thus 16 bit address.
+ results->address = reverseBits((data >> 16) & UINT16_MAX, 16);
+ results->repeat = !first;
+ return true;
+}
+#endif // DECODE_EPSON
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Fujitsu.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Fujitsu.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Fujitsu.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Fujitsu.cpp
index 4b0095b1e..583a441ba 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Fujitsu.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Fujitsu.cpp
@@ -684,22 +684,25 @@ String IRFujitsuAC::toString(void) {
// Places successful decode information in the results pointer.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kFujitsuAcBits.
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
-// Status: ALPHA / Untested.
+// Status: STABLE / Working.
//
// Ref:
//
-bool IRrecv::decodeFujitsuAC(decode_results* results, uint16_t nbits,
- bool strict) {
- uint16_t offset = kStartOffset;
+bool IRrecv::decodeFujitsuAC(decode_results* results, uint16_t offset,
+ const uint16_t nbits,
+ const bool strict) {
uint16_t dataBitsSoFar = 0;
// Have we got enough data to successfully decode?
- if (results->rawlen < (2 * kFujitsuAcMinBits) + kHeader + kFooter - 1)
+ if (results->rawlen < (2 * kFujitsuAcMinBits) + kHeader + kFooter - 1 +
+ offset)
return false; // Can't possibly be a valid message.
// Compliance
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Fujitsu.h b/lib/IRremoteESP8266-2.7.4/src/ir_Fujitsu.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Fujitsu.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Fujitsu.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_GICable.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_GICable.cpp
similarity index 92%
rename from lib/IRremoteESP8266-2.7.1/src/ir_GICable.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_GICable.cpp
index 6b3849b4c..ef68199cb 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_GICable.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_GICable.cpp
@@ -58,19 +58,20 @@ void IRsend::sendGICable(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kGicableBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
// Status: Alpha / Not tested against a real device.
-bool IRrecv::decodeGICable(decode_results *results, uint16_t nbits,
- bool strict) {
+bool IRrecv::decodeGICable(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (strict && nbits != kGicableBits)
return false; // Not strictly an GICABLE message.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
uint16_t used;
used = matchGeneric(results->rawbuf + offset, &data,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_GlobalCache.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_GlobalCache.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_GlobalCache.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_GlobalCache.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Goodweather.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Goodweather.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Goodweather.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Goodweather.cpp
index 4c5aa3513..8b7e0b76e 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Goodweather.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Goodweather.cpp
@@ -370,23 +370,24 @@ String IRGoodweatherAc::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kGoodweatherBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
// Status: ALPHA / Untested.
-bool IRrecv::decodeGoodweather(decode_results* results,
+bool IRrecv::decodeGoodweather(decode_results* results, uint16_t offset,
const uint16_t nbits,
const bool strict) {
- if (results->rawlen < 2 * (2 * nbits) + kHeader + 2 * kFooter - 1)
+ if (results->rawlen < 2 * (2 * nbits) + kHeader + 2 * kFooter - 1 + offset)
return false; // Can't possibly be a valid Goodweather message.
if (strict && nbits != kGoodweatherBits)
return false; // Not strictly a Goodweather message.
uint64_t dataSoFar = 0;
uint16_t dataBitsSoFar = 0;
- uint16_t offset = kStartOffset;
match_result_t data_result;
// Header
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Goodweather.h b/lib/IRremoteESP8266-2.7.4/src/ir_Goodweather.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Goodweather.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Goodweather.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Gree.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Gree.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Gree.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Gree.cpp
index 2dbebe84b..735e3b88c 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Gree.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Gree.cpp
@@ -513,21 +513,22 @@ String IRGreeAC::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kGreeBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
-// Status: ALPHA / Untested.
-bool IRrecv::decodeGree(decode_results* results, uint16_t nbits, bool strict) {
- if (results->rawlen <
- 2 * (nbits + kGreeBlockFooterBits) + (kHeader + kFooter + 1))
+// Status: STABLE / Working.
+bool IRrecv::decodeGree(decode_results* results, uint16_t offset,
+ const uint16_t nbits, bool const strict) {
+ if (results->rawlen <=
+ 2 * (nbits + kGreeBlockFooterBits) + (kHeader + kFooter + 1) - 1 + offset)
return false; // Can't possibly be a valid Gree message.
if (strict && nbits != kGreeBits)
return false; // Not strictly a Gree message.
- uint16_t offset = kStartOffset;
-
// There are two blocks back-to-back in a full Gree IR message
// sequence.
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Gree.h b/lib/IRremoteESP8266-2.7.4/src/ir_Gree.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Gree.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Gree.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Haier.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Haier.cpp
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Haier.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Haier.cpp
index ac8be71ac..cac4320cf 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Haier.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Haier.cpp
@@ -853,6 +853,8 @@ String IRHaierACYRW02::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kHaierACBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -860,18 +862,16 @@ String IRHaierACYRW02::toString(void) {
//
// Status: STABLE / Known to be working.
//
-bool IRrecv::decodeHaierAC(decode_results* results, uint16_t nbits,
- bool strict) {
+bool IRrecv::decodeHaierAC(decode_results* results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (strict) {
if (nbits != kHaierACBits)
return false; // Not strictly a HAIER_AC message.
}
- if (results->rawlen < (2 * nbits + kHeader) + kFooter - 1)
+ if (results->rawlen <= (2 * nbits + kHeader) + kFooter - 1 + offset)
return false; // Can't possibly be a valid HAIER_AC message.
- uint16_t offset = kStartOffset;
-
// Pre-Header
if (!matchMark(results->rawbuf[offset++], kHaierAcHdr)) return false;
if (!matchSpace(results->rawbuf[offset++], kHaierAcHdr)) return false;
@@ -903,6 +903,8 @@ bool IRrecv::decodeHaierAC(decode_results* results, uint16_t nbits,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kHaierACYRW02Bits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -910,15 +912,15 @@ bool IRrecv::decodeHaierAC(decode_results* results, uint16_t nbits,
//
// Status: BETA / Appears to be working.
//
-bool IRrecv::decodeHaierACYRW02(decode_results* results, uint16_t nbits,
- bool strict) {
+bool IRrecv::decodeHaierACYRW02(decode_results* results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (strict) {
if (nbits != kHaierACYRW02Bits)
return false; // Not strictly a HAIER_AC_YRW02 message.
}
// The protocol is almost exactly the same as HAIER_AC
- if (!decodeHaierAC(results, nbits, false)) return false;
+ if (!decodeHaierAC(results, offset, nbits, false)) return false;
// Compliance
if (strict) {
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Haier.h b/lib/IRremoteESP8266-2.7.4/src/ir_Haier.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Haier.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Haier.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Hitachi.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Hitachi.cpp
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Hitachi.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Hitachi.cpp
index fcbcb5fec..02489d010 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Hitachi.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Hitachi.cpp
@@ -359,13 +359,15 @@ String IRHitachiAc::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect.
// Typically kHitachiAcBits, kHitachiAc1Bits, kHitachiAc2Bits
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
-// Status: ALPHA / Untested.
+// Status: BETA / Probably works.
//
// Supported devices:
// Hitachi A/C Series VI (Circa 2007) / Remote: LT0541-HTA
@@ -373,11 +375,10 @@ String IRHitachiAc::toString(void) {
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/417
// https://github.com/crankyoldgit/IRremoteESP8266/issues/453
-bool IRrecv::decodeHitachiAC(decode_results *results, const uint16_t nbits,
- const bool strict) {
+bool IRrecv::decodeHitachiAC(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
const uint8_t k_tolerance = _tolerance + 5;
- if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
- return false; // Can't possibly be a valid HitachiAC message.
+
if (strict) {
switch (nbits) {
case kHitachiAcBits:
@@ -388,7 +389,6 @@ bool IRrecv::decodeHitachiAC(decode_results *results, const uint16_t nbits,
return false; // Not strictly a Hitachi message.
}
}
- uint16_t offset = kStartOffset;
uint16_t hmark;
uint32_t hspace;
if (nbits == kHitachiAc1Bits) {
@@ -475,6 +475,8 @@ void IRsend::sendHitachiAc424(const uint8_t data[], const uint16_t nbytes,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kHitachiAc424Bits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -489,14 +491,14 @@ void IRsend::sendHitachiAc424(const uint8_t data[], const uint16_t nbytes,
//
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/973
-bool IRrecv::decodeHitachiAc424(decode_results *results, const uint16_t nbits,
+bool IRrecv::decodeHitachiAc424(decode_results *results, uint16_t offset,
+ const uint16_t nbits,
const bool strict) {
- if (results->rawlen < 2 * nbits + kHeader + kHeader + kFooter - 1)
+ if (results->rawlen < 2 * nbits + kHeader + kHeader + kFooter - 1 + offset)
return false; // Too short a message to match.
if (strict && nbits != kHitachiAc424Bits)
return false;
- uint16_t offset = kStartOffset;
uint16_t used;
// Leader
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Hitachi.h b/lib/IRremoteESP8266-2.7.4/src/ir_Hitachi.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Hitachi.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Hitachi.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Inax.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Inax.cpp
similarity index 90%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Inax.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Inax.cpp
index 073580fae..9822e750b 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Inax.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Inax.cpp
@@ -49,6 +49,8 @@ void IRsend::sendInax(const uint64_t data, const uint16_t nbits,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion.
// Typically kInaxBits.
// strict: Flag to indicate if we strictly adhere to the specification.
@@ -57,13 +59,12 @@ void IRsend::sendInax(const uint64_t data, const uint16_t nbits,
//
// Status: Stable / Known working.
//
-bool IRrecv::decodeInax(decode_results *results, const uint16_t nbits,
- const bool strict) {
+bool IRrecv::decodeInax(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (strict && nbits != kInaxBits)
return false; // We expect Inax to be a certain sized message.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
if (!matchGeneric(results->rawbuf + offset, &data,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_JVC.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_JVC.cpp
similarity index 93%
rename from lib/IRremoteESP8266-2.7.1/src/ir_JVC.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_JVC.cpp
index 7038e9d3e..128efdf08 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_JVC.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_JVC.cpp
@@ -92,6 +92,8 @@ uint16_t IRsend::encodeJVC(uint8_t address, uint8_t command) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits of data to expect. Typically kJvcBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -103,14 +105,14 @@ uint16_t IRsend::encodeJVC(uint8_t address, uint8_t command) {
// JVC repeat codes don't have a header.
// Ref:
// http://www.sbprojects.com/knowledge/ir/jvc.php
-bool IRrecv::decodeJVC(decode_results *results, uint16_t nbits, bool strict) {
+bool IRrecv::decodeJVC(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (strict && nbits != kJvcBits)
return false; // Must be called with the correct nr. of bits.
- if (results->rawlen < 2 * nbits + kFooter - 1)
+ if (results->rawlen <= 2 * nbits + kFooter - 1 + offset)
return false; // Can't possibly be a valid JVC message.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
bool isRepeat = true;
// Header
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Kelvinator.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Kelvinator.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Kelvinator.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Kelvinator.cpp
index 320458b30..4a4fac276 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Kelvinator.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Kelvinator.cpp
@@ -414,22 +414,23 @@ String IRKelvinatorAC::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kKelvinatorBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
// Status: STABLE / Known working.
-bool IRrecv::decodeKelvinator(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen <
- 2 * (nbits + kKelvinatorCmdFooterBits) + (kHeader + kFooter + 1) * 2 - 1)
+bool IRrecv::decodeKelvinator(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen <=
+ 2 * (nbits + kKelvinatorCmdFooterBits) + (kHeader + kFooter + 1) * 2 - 1 +
+ offset)
return false; // Can't possibly be a valid Kelvinator message.
if (strict && nbits != kKelvinatorBits)
return false; // Not strictly a Kelvinator message.
- uint16_t offset = kStartOffset;
-
// There are two messages back-to-back in a full Kelvinator IR message
// sequence.
int8_t pos = 0;
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Kelvinator.h b/lib/IRremoteESP8266-2.7.4/src/ir_Kelvinator.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Kelvinator.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Kelvinator.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_LG.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_LG.cpp
similarity index 54%
rename from lib/IRremoteESP8266-2.7.1/src/ir_LG.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_LG.cpp
index 124256e9f..b30dba082 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_LG.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_LG.cpp
@@ -8,10 +8,20 @@
#include "ir_LG.h"
#include
+#include "IRac.h"
#include "IRrecv.h"
#include "IRsend.h"
+#include "IRtext.h"
#include "IRutils.h"
+using irutils::addBoolToString;
+using irutils::addModeToString;
+using irutils::addModelToString;
+using irutils::addFanToString;
+using irutils::addTempToString;
+using irutils::setBit;
+using irutils::setBits;
+
// LG decode originally added by Darryl Smith (based on the JVC protocol)
// LG send originally added by https://github.com/chaeplin
@@ -166,13 +176,15 @@ uint32_t IRsend::encodeLG(uint16_t address, uint16_t command) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion.
// Typically kLgBits or kLg32Bits.
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
-// Status: BETA / Should work.
+// Status: STABLE / Working.
//
// Note:
// LG 32bit protocol appears near identical to the Samsung protocol.
@@ -183,19 +195,18 @@ uint32_t IRsend::encodeLG(uint16_t address, uint16_t command) {
// Ref:
// https://funembedded.wordpress.com/2014/11/08/ir-remote-control-for-lg-conditioner-using-stm32f302-mcu-on-mbed-platform/
-bool IRrecv::decodeLG(decode_results *results, uint16_t nbits, bool strict) {
+bool IRrecv::decodeLG(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (nbits >= kLg32Bits) {
- if (results->rawlen < 2 * nbits + 2 * (kHeader + kFooter) - 1)
+ if (results->rawlen <= 2 * nbits + 2 * (kHeader + kFooter) - 1 + offset)
return false; // Can't possibly be a valid LG32 message.
} else {
- if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
+ if (results->rawlen <= 2 * nbits + kHeader - 1 + offset)
return false; // Can't possibly be a valid LG message.
}
if (strict && nbits != kLgBits && nbits != kLg32Bits)
return false; // Doesn't comply with expected LG protocol.
-
uint64_t data = 0;
- uint16_t offset = kStartOffset;
bool isLg2 = false;
// Header
@@ -270,7 +281,6 @@ bool IRrecv::decodeLG(decode_results *results, uint16_t nbits, bool strict) {
if (strict && (data & 0xF) != calcLGChecksum(command))
return false; // The last 4 bits sent are the expected checksum.
-
// Success
if (isLg2)
results->decode_type = LG2;
@@ -283,3 +293,254 @@ bool IRrecv::decodeLG(decode_results *results, uint16_t nbits, bool strict) {
return true;
}
#endif
+
+// LG A/C Class
+// Support for LG-type A/C units.
+// Ref:
+// https://github.com/arendst/Tasmota/blob/54c2eb283a02e4287640a4595e506bc6eadbd7f2/sonoff/xdrv_05_irremote.ino#L327-438
+IRLgAc::IRLgAc(const uint16_t pin, const bool inverted,
+ const bool use_modulation)
+ : _irsend(pin, inverted, use_modulation) { this->stateReset(); }
+
+void IRLgAc::stateReset(void) {
+ setRaw(kLgAcOffCommand);
+ setModel(lg_ac_remote_model_t::GE6711AR2853M);
+}
+
+void IRLgAc::begin(void) { _irsend.begin(); }
+
+#if SEND_LG
+void IRLgAc::send(const uint16_t repeat) {
+ if (this->getPower())
+ _irsend.send(this->_protocol, this->getRaw(), kLgBits, repeat);
+ else
+ // Always send the special Off command if the power is set to off.
+ // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1008#issuecomment-570763580
+ _irsend.send(this->_protocol, kLgAcOffCommand, kLgBits, repeat);
+}
+#endif // SEND_LG
+
+void IRLgAc::setModel(const lg_ac_remote_model_t model) {
+ switch (model) {
+ case lg_ac_remote_model_t::AKB75215403:
+ _protocol = decode_type_t::LG2;
+ break;
+ case lg_ac_remote_model_t::GE6711AR2853M:
+ // FALL THRU
+ default:
+ _protocol = decode_type_t::LG;
+ }
+}
+
+lg_ac_remote_model_t IRLgAc::getModel(void) {
+ switch (_protocol) {
+ case LG2:
+ return lg_ac_remote_model_t::AKB75215403;
+ case LG:
+ // FALL THRU
+ default:
+ return lg_ac_remote_model_t::GE6711AR2853M;
+ }
+}
+
+uint32_t IRLgAc::getRaw(void) {
+ checksum();
+ return remote_state;
+}
+
+void IRLgAc::setRaw(const uint32_t new_code) {
+ remote_state = new_code;
+ _temp = 15; // Ensure there is a "sane" previous temp.
+ _temp = getTemp();
+}
+
+// Calculate the checksum for a given state.
+// Args:
+// state: The value to calculate the checksum of.
+// Returns:
+// A uint8_t of the checksum.
+uint8_t IRLgAc::calcChecksum(const uint32_t state) {
+ return calcLGChecksum(state >> 4);
+}
+
+// Verify the checksum is valid for a given state.
+// Args:
+// state: The value to verify the checksum of.
+// Returns:
+// A boolean.
+bool IRLgAc::validChecksum(const uint32_t state) {
+ return calcChecksum(state) == GETBITS32(state, kLgAcChecksumOffset,
+ kLgAcChecksumSize);
+}
+
+void IRLgAc::checksum(void) {
+ setBits(&remote_state, kLgAcChecksumOffset, kLgAcChecksumSize,
+ calcChecksum(remote_state));
+}
+
+void IRLgAc::on(void) { setPower(true); }
+
+void IRLgAc::off(void) { setPower(false); }
+
+void IRLgAc::setPower(const bool on) {
+ setBits(&remote_state, kLgAcPowerOffset, kLgAcPowerSize,
+ on ? kLgAcPowerOn : kLgAcPowerOff);
+ if (on)
+ setTemp(_temp); // Reset the temp if we are on.
+ else
+ _setTemp(0); // Off clears the temp.
+}
+
+bool IRLgAc::getPower(void) {
+ return GETBITS32(remote_state, kLgAcPowerOffset, kLgAcPowerSize) ==
+ kLgAcPowerOn;
+}
+
+// Set the temp. (Internal use only)
+void IRLgAc::_setTemp(const uint8_t value) {
+ setBits(&remote_state, kLgAcTempOffset, kLgAcTempSize, value);
+}
+
+// Set the temp. in deg C
+void IRLgAc::setTemp(const uint8_t degrees) {
+ uint8_t temp = std::max(kLgAcMinTemp, degrees);
+ temp = std::min(kLgAcMaxTemp, temp);
+ _temp = temp;
+ _setTemp(temp - kLgAcTempAdjust);
+}
+
+// Return the set temp. in deg C
+uint8_t IRLgAc::getTemp(void) {
+ if (getPower())
+ return GETBITS32(remote_state, kLgAcTempOffset, kLgAcTempSize) +
+ kLgAcTempAdjust;
+ else
+ return _temp;
+}
+
+// Set the speed of the fan.
+void IRLgAc::setFan(const uint8_t speed) {
+ switch (speed) {
+ case kLgAcFanAuto:
+ case kLgAcFanLow:
+ case kLgAcFanMedium:
+ case kLgAcFanHigh:
+ setBits(&remote_state, kLgAcFanOffset, kLgAcFanSize, speed);
+ break;
+ default:
+ setFan(kLgAcFanAuto);
+ }
+}
+
+uint8_t IRLgAc::getFan(void) {
+ return GETBITS32(remote_state, kLgAcFanOffset, kLgAcFanSize);
+}
+
+uint8_t IRLgAc::getMode(void) {
+ return GETBITS32(remote_state, kLgAcModeOffset, kLgAcModeSize);
+}
+
+void IRLgAc::setMode(const uint8_t mode) {
+ switch (mode) {
+ case kLgAcAuto:
+ case kLgAcDry:
+ case kLgAcHeat:
+ case kLgAcCool:
+ case kLgAcFan:
+ setBits(&remote_state, kLgAcModeOffset, kLgAcModeSize, mode);
+ break;
+ default: // If we get an unexpected mode, default to AUTO.
+ this->setMode(kLgAcAuto);
+ }
+}
+
+// Convert a standard A/C mode into its native mode.
+uint8_t IRLgAc::convertMode(const stdAc::opmode_t mode) {
+ switch (mode) {
+ case stdAc::opmode_t::kCool: return kLgAcCool;
+ case stdAc::opmode_t::kHeat: return kLgAcHeat;
+ case stdAc::opmode_t::kFan: return kLgAcFan;
+ case stdAc::opmode_t::kDry: return kLgAcDry;
+ default: return kLgAcAuto;
+ }
+}
+
+// Convert a native mode to it's common equivalent.
+stdAc::opmode_t IRLgAc::toCommonMode(const uint8_t mode) {
+ switch (mode) {
+ case kLgAcCool: return stdAc::opmode_t::kCool;
+ case kLgAcHeat: return stdAc::opmode_t::kHeat;
+ case kLgAcDry: return stdAc::opmode_t::kDry;
+ case kLgAcFan: return stdAc::opmode_t::kFan;
+ default: return stdAc::opmode_t::kAuto;
+ }
+}
+
+// Convert a standard A/C Fan speed into its native fan speed.
+uint8_t IRLgAc::convertFan(const stdAc::fanspeed_t speed) {
+ switch (speed) {
+ case stdAc::fanspeed_t::kMin:
+ case stdAc::fanspeed_t::kLow: return kLgAcFanLow;
+ case stdAc::fanspeed_t::kMedium: return kLgAcFanMedium;
+ case stdAc::fanspeed_t::kHigh:
+ case stdAc::fanspeed_t::kMax: return kHitachiAcFanHigh;
+ default: return kHitachiAcFanAuto;
+ }
+}
+
+// Convert a native fan speed to it's common equivalent.
+stdAc::fanspeed_t IRLgAc::toCommonFanSpeed(const uint8_t speed) {
+ switch (speed) {
+ case kLgAcFanHigh: return stdAc::fanspeed_t::kMax;
+ case kLgAcFanMedium: return stdAc::fanspeed_t::kMedium;
+ case kLgAcFanLow: return stdAc::fanspeed_t::kLow;
+ default: return stdAc::fanspeed_t::kAuto;
+ }
+}
+
+// Convert the A/C state to it's common equivalent.
+stdAc::state_t IRLgAc::toCommon(void) {
+ stdAc::state_t result;
+ result.protocol = decode_type_t::LG;
+ result.model = this->getModel();
+ result.power = this->getPower();
+ result.mode = this->toCommonMode(this->getMode());
+ result.celsius = true;
+ result.degrees = this->getTemp();
+ result.fanspeed = this->toCommonFanSpeed(this->getFan());
+ // Not supported.
+ result.swingv = stdAc::swingv_t::kOff;
+ result.swingh = stdAc::swingh_t::kOff;
+ result.quiet = false;
+ result.turbo = false;
+ result.light = false;
+ result.filter = false;
+ result.clean = false;
+ result.econo = false;
+ result.beep = false;
+ result.sleep = -1;
+ result.clock = -1;
+ return result;
+}
+
+// Convert the internal state into a human readable string.
+String IRLgAc::toString(void) {
+ String result = "";
+ result.reserve(80); // Reserve some heap for the string to reduce fragging.
+ result += addModelToString(_protocol, getModel(), false);
+ result += addBoolToString(getPower(), kPowerStr);
+ if (getPower()) { // Only display the rest if is in power on state.
+ result += addModeToString(getMode(), kLgAcAuto, kLgAcCool,
+ kLgAcHeat, kLgAcDry, kLgAcFan);
+ result += addTempToString(getTemp());
+ result += addFanToString(getFan(), kLgAcFanHigh, kLgAcFanLow,
+ kLgAcFanAuto, kLgAcFanAuto, kLgAcFanMedium);
+ }
+ return result;
+}
+
+bool IRLgAc::isValidLgAc(void) {
+ return validChecksum(remote_state) &&
+ (GETBITS32(remote_state, kLgAcSignatureOffset, kLgAcSignatureSize) ==
+ kLgAcSignature);
+}
diff --git a/lib/IRremoteESP8266-2.7.4/src/ir_LG.h b/lib/IRremoteESP8266-2.7.4/src/ir_LG.h
new file mode 100644
index 000000000..1147b30b7
--- /dev/null
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_LG.h
@@ -0,0 +1,108 @@
+// Copyright 2017, 2019 David Conran
+
+// Supports:
+// Brand: LG, Model: 6711A20083V remote
+// Brand: LG, Model: AKB74395308 remote
+// Brand: LG, Model: S4-W12JA3AA A/C (LG2)
+// Brand: LG, Model: AKB75215403 remote (LG2)
+// Brand: General Electric, Model: AG1BH09AW101 Split A/C
+// Brand: General Electric, Model: 6711AR2853M A/C Remote
+
+#ifndef IR_LG_H_
+#define IR_LG_H_
+
+#define __STDC_LIMIT_MACROS
+#include
+#ifndef UNIT_TEST
+#include
+#endif
+#include "IRremoteESP8266.h"
+#include "IRsend.h"
+#include "IRutils.h"
+#ifdef UNIT_TEST
+#include "IRsend_test.h"
+#endif
+
+const uint8_t kLgAcChecksumOffset = 0; // Nr. of bits
+const uint8_t kLgAcChecksumSize = kNibbleSize; // Nr. of bits
+const uint8_t kLgAcFanOffset = 4; // Nr. of bits
+const uint8_t kLgAcFanSize = 3; // Nr. of bits
+const uint8_t kLgAcFanLow = 0; // 0b000
+const uint8_t kLgAcFanMedium = 2; // 0b010
+const uint8_t kLgAcFanHigh = 4; // 0b100
+const uint8_t kLgAcFanAuto = 5; // 0b101
+const uint8_t kLgAcTempOffset = 8; // Nr. of bits
+const uint8_t kLgAcTempSize = 4; // Nr. of bits
+const uint8_t kLgAcTempAdjust = 15;
+const uint8_t kLgAcMinTemp = 16; // Celsius
+const uint8_t kLgAcMaxTemp = 30; // Celsius
+const uint8_t kLgAcModeOffset = 12; // Nr. of bits
+const uint8_t kLgAcModeSize = 3; // Nr. of bits
+const uint8_t kLgAcCool = 0; // 0b000
+const uint8_t kLgAcDry = 1; // 0b001
+const uint8_t kLgAcFan = 2; // 0b010
+const uint8_t kLgAcAuto = 3; // 0b011
+const uint8_t kLgAcHeat = 4; // 0b100
+const uint8_t kLgAcPowerOffset = 18; // Nr. of bits
+const uint8_t kLgAcPowerSize = 2; // Nr. of bits
+const uint8_t kLgAcPowerOff = 3; // 0b11
+const uint8_t kLgAcPowerOn = 0; // 0b00
+const uint8_t kLgAcSignatureOffset = 20; // Nr. of bits
+const uint8_t kLgAcSignatureSize = 8; // Nr. of bits
+const uint8_t kLgAcSignature = 0x88;
+
+const uint32_t kLgAcOffCommand = 0x88C0051;
+
+uint8_t calcLGChecksum(uint16_t data);
+
+// Classes
+class IRLgAc {
+ public:
+ explicit IRLgAc(const uint16_t pin, const bool inverted = false,
+ const bool use_modulation = true);
+
+ void stateReset(void);
+ static uint8_t calcChecksum(const uint32_t state);
+ static bool validChecksum(const uint32_t state);
+ bool isValidLgAc(void);
+#if SEND_LG
+ void send(const uint16_t repeat = kLgDefaultRepeat);
+ uint8_t calibrate(void) { return _irsend.calibrate(); }
+#endif // SEND_LG
+ void begin(void);
+ void on(void);
+ void off(void);
+ void setPower(const bool on);
+ bool getPower(void);
+ void setTemp(const uint8_t degrees);
+ uint8_t getTemp(void);
+ void setFan(const uint8_t speed);
+ uint8_t getFan(void);
+ void setMode(const uint8_t mode);
+ uint8_t getMode(void);
+ uint32_t getRaw(void);
+ void setRaw(const uint32_t new_code);
+ uint8_t convertMode(const stdAc::opmode_t mode);
+ static stdAc::opmode_t toCommonMode(const uint8_t mode);
+ static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
+ static uint8_t convertFan(const stdAc::fanspeed_t speed);
+ stdAc::state_t toCommon(void);
+ String toString(void);
+ void setModel(const lg_ac_remote_model_t model);
+ lg_ac_remote_model_t getModel(void);
+#ifndef UNIT_TEST
+
+ private:
+ IRsend _irsend;
+#else
+ IRsendTest _irsend;
+#endif
+ // The state of the IR remote in IR code form.
+ uint32_t remote_state;
+ uint8_t _temp;
+ decode_type_t _protocol;
+ void checksum(void);
+ void _setTemp(const uint8_t value);
+};
+
+#endif // IR_LG_H_
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Lasertag.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Lasertag.cpp
similarity index 90%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Lasertag.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Lasertag.cpp
index f52b7477a..14a059084 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Lasertag.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Lasertag.cpp
@@ -56,6 +56,8 @@ void IRsend::sendLasertag(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -67,14 +69,13 @@ void IRsend::sendLasertag(uint64_t data, uint16_t nbits, uint16_t repeat) {
// http://www.sbprojects.com/knowledge/ir/rc5.php
// https://en.wikipedia.org/wiki/RC-5
// https://en.wikipedia.org/wiki/Manchester_code
-bool IRrecv::decodeLasertag(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < kLasertagMinSamples) return false;
+bool IRrecv::decodeLasertag(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen <= kLasertagMinSamples + offset) return false;
// Compliance
if (strict && nbits != kLasertagBits) return false;
- uint16_t offset = kStartOffset;
uint16_t used = 0;
uint64_t data = 0;
uint16_t actual_bits = 0;
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Lego.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Lego.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Lego.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Lego.cpp
index 932a568d0..502352218 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Lego.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Lego.cpp
@@ -67,20 +67,20 @@ void IRsend::sendLegoPf(const uint64_t data, const uint16_t nbits,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kLegoPfBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
-// Status: Alpha / Untested.
-bool IRrecv::decodeLegoPf(decode_results* results,
+// Status: BETA / Appears to work.
+bool IRrecv::decodeLegoPf(decode_results* results, uint16_t offset,
const uint16_t nbits, const bool strict) {
// Check if can possibly be a valid LEGO message.
- if (results->rawlen < 2 * nbits + kHeader + kFooter - 1) return false;
if (strict && nbits != kLegoPfBits) return false; // Not what is expected
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
if (!matchGeneric(results->rawbuf + offset, &data,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Lutron.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Lutron.cpp
similarity index 93%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Lutron.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Lutron.cpp
index 7c9835047..094932e5d 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Lutron.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Lutron.cpp
@@ -58,6 +58,8 @@ void IRsend::sendLutron(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kLutronBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -69,8 +71,8 @@ void IRsend::sendLutron(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/515
-bool IRrecv::decodeLutron(decode_results *results, uint16_t nbits,
- bool strict) {
+bool IRrecv::decodeLutron(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
// Technically the smallest number of entries for the smallest message is '1'.
// i.e. All the bits set to 1, would produce a single huge mark signal.
// So no minimum length check is required.
@@ -81,8 +83,7 @@ bool IRrecv::decodeLutron(decode_results *results, uint16_t nbits,
int16_t bitsSoFar = -1;
if (nbits > sizeof(data) * 8) return false; // To large to store the data.
- for (uint16_t offset = kStartOffset;
- bitsSoFar < nbits && offset < results->rawlen; offset++) {
+ for (; bitsSoFar < nbits && offset < results->rawlen; offset++) {
uint16_t entry = results->rawbuf[offset];
// It has to be large enough to qualify as a bit.
if (!matchAtLeast(entry, kLutronTick, 0, kLutronDelta)) {
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_MWM.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_MWM.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/src/ir_MWM.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_MWM.cpp
index b747b224b..eefc4a57e 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_MWM.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_MWM.cpp
@@ -74,6 +74,8 @@ void IRsend::sendMWM(const uint8_t data[], const uint16_t nbytes,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -81,16 +83,16 @@ void IRsend::sendMWM(const uint8_t data[], const uint16_t nbytes,
//
// Status: Implemented.
//
-bool IRrecv::decodeMWM(decode_results *results, uint16_t nbits, bool strict) {
+bool IRrecv::decodeMWM(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
DPRINTLN("DEBUG: decodeMWM");
// Compliance
- if (results->rawlen < kMWMMinSamples) {
+ if (results->rawlen <= kMWMMinSamples + offset) {
DPRINTLN("DEBUG: decodeMWM: too few samples");
return false;
}
- uint16_t offset = kStartOffset;
uint16_t used = 0;
uint64_t data = 0;
uint16_t frame_bits = 0;
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Magiquest.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Magiquest.cpp
similarity index 92%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Magiquest.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Magiquest.cpp
index 863aa0ec3..2c15612f4 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Magiquest.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Magiquest.cpp
@@ -67,6 +67,8 @@ uint64_t IRsend::encodeMagiQuest(uint32_t wand_id, uint16_t magnitude) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion, inc. the 8 bit header.
// Typically kMagiquestBits.
// strict: Flag to indicate if we strictly adhere to the specification.
@@ -77,17 +79,16 @@ uint64_t IRsend::encodeMagiQuest(uint32_t wand_id, uint16_t magnitude) {
//
// Ref:
// https://github.com/kitlaan/Arduino-IRremote/blob/master/ir_Magiquest.cpp
-bool IRrecv::decodeMagiQuest(decode_results *results, uint16_t nbits,
- bool strict) {
+bool IRrecv::decodeMagiQuest(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
uint16_t bits = 0;
uint64_t data = 0;
- uint16_t offset = kStartOffset;
- if (results->rawlen < (2 * kMagiquestBits)) {
+ if (results->rawlen < (2 * kMagiquestBits) + offset - 1) {
DPRINT("Not enough bits to be Magiquest - Rawlen: ");
DPRINT(results->rawlen);
DPRINT(" Expected: ");
- DPRINTLN((2 * kMagiquestBits));
+ DPRINTLN(2 * kMagiquestBits + offset - 1);
return false;
}
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Magiquest.h b/lib/IRremoteESP8266-2.7.4/src/ir_Magiquest.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Magiquest.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Magiquest.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Midea.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Midea.cpp
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Midea.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Midea.cpp
index ce373ebfe..bbf9bedfa 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Midea.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Midea.cpp
@@ -64,7 +64,7 @@ void IRsend::sendMidea(uint64_t data, uint16_t nbits, uint16_t repeat) {
enableIROut(38);
for (uint16_t r = 0; r <= repeat; r++) {
- // The protcol sends the message, then follows up with an entirely
+ // The protocol sends the message, then follows up with an entirely
// inverted payload.
for (size_t inner_loop = 0; inner_loop < 2; inner_loop++) {
// Header
@@ -397,6 +397,8 @@ String IRMideaAC::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kMideaBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -404,7 +406,8 @@ String IRMideaAC::toString(void) {
//
// Status: Alpha / Needs testing against a real device.
//
-bool IRrecv::decodeMidea(decode_results *results, uint16_t nbits, bool strict) {
+bool IRrecv::decodeMidea(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
uint8_t min_nr_of_messages = 1;
if (strict) {
if (nbits != kMideaBits) return false; // Not strictly a MIDEA message.
@@ -414,12 +417,11 @@ bool IRrecv::decodeMidea(decode_results *results, uint16_t nbits, bool strict) {
// The protocol sends the data normal + inverted, alternating on
// each byte. Hence twice the number of expected data bits.
if (results->rawlen <
- min_nr_of_messages * (2 * nbits + kHeader + kFooter) - 1)
+ min_nr_of_messages * (2 * nbits + kHeader + kFooter) - 1 + offset)
return false; // Can't possibly be a valid MIDEA message.
uint64_t data = 0;
uint64_t inverted = 0;
- uint16_t offset = kStartOffset;
if (nbits > sizeof(data) * 8)
return false; // We can't possibly capture a Midea packet that big.
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Midea.h b/lib/IRremoteESP8266-2.7.4/src/ir_Midea.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Midea.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Midea.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Mitsubishi.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Mitsubishi.cpp
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Mitsubishi.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Mitsubishi.cpp
index cf5c573fc..68098f40a 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Mitsubishi.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Mitsubishi.cpp
@@ -127,6 +127,8 @@ void IRsend::sendMitsubishi(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -139,12 +141,11 @@ void IRsend::sendMitsubishi(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Ref:
// GlobalCache's Control Tower's Mitsubishi TV data.
-bool IRrecv::decodeMitsubishi(decode_results *results, uint16_t nbits,
- bool strict) {
+bool IRrecv::decodeMitsubishi(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (strict && nbits != kMitsubishiBits)
return false; // Request is out of spec.
- uint16_t offset = kStartOffset;
uint64_t data = 0;
// Match Data + Footer
@@ -206,6 +207,8 @@ void IRsend::sendMitsubishi2(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -219,14 +222,13 @@ void IRsend::sendMitsubishi2(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/441
-bool IRrecv::decodeMitsubishi2(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < 2 * nbits + kHeader + (kFooter * 2) - 1)
+bool IRrecv::decodeMitsubishi2(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen <= 2 * nbits + kHeader + (kFooter * 2) - 1 + offset)
return false; // Shorter than shortest possibly expected.
if (strict && nbits != kMitsubishiBits)
return false; // Request is out of spec.
- uint16_t offset = kStartOffset;
results->value = 0;
// Header
@@ -287,6 +289,8 @@ void IRsend::sendMitsubishiAC(const unsigned char data[], const uint16_t nbytes,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -296,9 +300,10 @@ void IRsend::sendMitsubishiAC(const unsigned char data[], const uint16_t nbytes,
//
// Ref:
// https://www.analysir.com/blog/2015/01/06/reverse-engineering-mitsubishi-ac-infrared-protocol/
-bool IRrecv::decodeMitsubishiAC(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < ((kMitsubishiACBits * 2) + 2)) {
+bool IRrecv::decodeMitsubishiAC(decode_results *results, uint16_t offset,
+ const uint16_t nbits,
+ const bool strict) {
+ if (results->rawlen <= ((kMitsubishiACBits * 2) + 2) + offset) {
DPRINTLN("Shorter than shortest possibly expected.");
return false; // Shorter than shortest possibly expected.
}
@@ -306,10 +311,7 @@ bool IRrecv::decodeMitsubishiAC(decode_results *results, uint16_t nbits,
DPRINTLN("Request is out of spec.");
return false; // Request is out of spec.
}
- uint16_t offset = kStartOffset;
- for (uint8_t i = 0; i < kMitsubishiACStateLength; i++) {
- results->state[i] = 0;
- }
+ for (uint8_t i = 0; i < kMitsubishiACStateLength; i++) results->state[i] = 0;
bool failure = false;
uint8_t rep = 0;
do {
@@ -825,6 +827,8 @@ void IRsend::sendMitsubishi136(const unsigned char data[],
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -834,16 +838,15 @@ void IRsend::sendMitsubishi136(const unsigned char data[],
//
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/888
-bool IRrecv::decodeMitsubishi136(decode_results *results, const uint16_t nbits,
+bool IRrecv::decodeMitsubishi136(decode_results *results, uint16_t offset,
+ const uint16_t nbits,
const bool strict) {
- // Too short to match?
- if (results->rawlen < (2 * nbits) + kHeader + kFooter - 1) return false;
if (nbits % 8 != 0) return false; // Not a multiple of an 8 bit byte.
if (strict) { // Do checks to see if it matches the spec.
if (nbits != kMitsubishi136Bits) return false;
}
- uint16_t used = matchGeneric(results->rawbuf + kStartOffset, results->state,
- results->rawlen - kStartOffset, nbits,
+ uint16_t used = matchGeneric(results->rawbuf + offset, results->state,
+ results->rawlen - offset, nbits,
kMitsubishi136HdrMark, kMitsubishi136HdrSpace,
kMitsubishi136BitMark, kMitsubishi136OneSpace,
kMitsubishi136BitMark, kMitsubishi136ZeroSpace,
@@ -1174,6 +1177,8 @@ void IRsend::sendMitsubishi112(const unsigned char data[],
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -1191,14 +1196,14 @@ void IRsend::sendMitsubishi112(const unsigned char data[],
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/619
// https://github.com/crankyoldgit/IRremoteESP8266/issues/947
-bool IRrecv::decodeMitsubishi112(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < ((2 * nbits) + kHeader + kFooter - 1)) return false;
+bool IRrecv::decodeMitsubishi112(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < (2 * nbits) + kHeader + kFooter - 1 + offset)
+ return false;
if (nbits % 8 != 0) return false; // Not a multiple of an 8 bit byte.
if (strict) { // Do checks to see if it matches the spec.
if (nbits != kMitsubishi112Bits && nbits != kTcl112AcBits) return false;
}
- uint16_t offset = kStartOffset;
decode_type_t typeguess = decode_type_t::UNKNOWN;
uint16_t hdrspace;
uint16_t bitmark;
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Mitsubishi.h b/lib/IRremoteESP8266-2.7.4/src/ir_Mitsubishi.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Mitsubishi.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Mitsubishi.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_MitsubishiHeavy.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_MitsubishiHeavy.cpp
similarity index 99%
rename from lib/IRremoteESP8266-2.7.1/src/ir_MitsubishiHeavy.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_MitsubishiHeavy.cpp
index cc6d066f3..39bd3d8d6 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_MitsubishiHeavy.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_MitsubishiHeavy.cpp
@@ -959,17 +959,17 @@ String IRMitsubishiHeavy88Ac::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect.
-// Typically kMitsubishiHeavy88Bits or kMitsubishiHeavy152Bits.
+// Typically kMitsubishiHeavy88Bits or kMitsubishiHeavy152Bits (def).
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
// Status: BETA / Appears to be working. Needs testing against a real device.
-bool IRrecv::decodeMitsubishiHeavy(decode_results* results,
+bool IRrecv::decodeMitsubishiHeavy(decode_results* results, uint16_t offset,
const uint16_t nbits, const bool strict) {
- // Check if can possibly be a valid MitsubishiHeavy message.
- if (results->rawlen < 2 * nbits + kHeader + kFooter - 1) return false;
if (strict) {
switch (nbits) {
case kMitsubishiHeavy88Bits:
@@ -980,7 +980,6 @@ bool IRrecv::decodeMitsubishiHeavy(decode_results* results,
}
}
- uint16_t offset = kStartOffset;
uint16_t used;
used = matchGeneric(results->rawbuf + offset, results->state,
results->rawlen - offset, nbits,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_MitsubishiHeavy.h b/lib/IRremoteESP8266-2.7.4/src/ir_MitsubishiHeavy.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_MitsubishiHeavy.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_MitsubishiHeavy.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_NEC.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_NEC.cpp
similarity index 89%
rename from lib/IRremoteESP8266-2.7.1/src/ir_NEC.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_NEC.cpp
index 03f68c1d9..2f870f58c 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_NEC.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_NEC.cpp
@@ -68,6 +68,8 @@ uint32_t IRsend::encodeNEC(uint16_t address, uint16_t command) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kNECBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -85,22 +87,22 @@ uint32_t IRsend::encodeNEC(uint16_t address, uint16_t command) {
//
// Ref:
// http://www.sbprojects.com/knowledge/ir/nec.php
-bool IRrecv::decodeNEC(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < 2 * nbits + kHeader + kFooter - 1 &&
- results->rawlen != kNecRptLength)
+bool IRrecv::decodeNEC(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < kNecRptLength + offset - 1)
return false; // Can't possibly be a valid NEC message.
if (strict && nbits != kNECBits)
return false; // Not strictly an NEC message.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
- // Header
+ // Header - All NEC messages have this Header Mark.
if (!matchMark(results->rawbuf[offset++], kNecHdrMark)) return false;
// Check if it is a repeat code.
- if (results->rawlen == kNecRptLength &&
- matchSpace(results->rawbuf[offset], kNecRptSpace) &&
- matchMark(results->rawbuf[offset + 1], kNecBitMark)) {
+ if (matchSpace(results->rawbuf[offset], kNecRptSpace) &&
+ matchMark(results->rawbuf[offset + 1], kNecBitMark) &&
+ (offset + 2 <= results->rawlen ||
+ matchAtLeast(results->rawbuf[offset + 2], kNecMinGap))) {
results->value = kRepeat;
results->decode_type = NEC;
results->bits = 0;
diff --git a/lib/IRremoteESP8266-2.7.4/src/ir_NEC.h b/lib/IRremoteESP8266-2.7.4/src/ir_NEC.h
new file mode 100644
index 000000000..cf6191100
--- /dev/null
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_NEC.h
@@ -0,0 +1,74 @@
+// Copyright 2009 Ken Shirriff
+// Copyright 2017, 2018 David Conran
+
+// NEC originally added from https://github.com/shirriff/Arduino-IRremote/
+
+#ifndef IR_NEC_H_
+#define IR_NEC_H_
+
+#include
+#include "IRremoteESP8266.h"
+
+// Supports:
+// Brand: Yamaha, Model: RAV561 remote
+// Brand: Yamaha, Model: RXV585B A/V Receiver
+// Brand: Aloka, Model: SleepyLights LED Lamp
+// Brand: Toshiba, Model: 42TL838 LCD TV
+
+// Constants
+// Ref:
+// http://www.sbprojects.com/knowledge/ir/nec.php
+const uint16_t kNecTick = 560;
+const uint16_t kNecHdrMarkTicks = 16;
+const uint16_t kNecHdrMark = kNecHdrMarkTicks * kNecTick;
+const uint16_t kNecHdrSpaceTicks = 8;
+const uint16_t kNecHdrSpace = kNecHdrSpaceTicks * kNecTick;
+const uint16_t kNecBitMarkTicks = 1;
+const uint16_t kNecBitMark = kNecBitMarkTicks * kNecTick;
+const uint16_t kNecOneSpaceTicks = 3;
+const uint16_t kNecOneSpace = kNecOneSpaceTicks * kNecTick;
+const uint16_t kNecZeroSpaceTicks = 1;
+const uint16_t kNecZeroSpace = kNecZeroSpaceTicks * kNecTick;
+const uint16_t kNecRptSpaceTicks = 4;
+const uint16_t kNecRptSpace = kNecRptSpaceTicks * kNecTick;
+const uint16_t kNecRptLength = 4;
+const uint16_t kNecMinCommandLengthTicks = 193;
+const uint32_t kNecMinCommandLength = kNecMinCommandLengthTicks * kNecTick;
+const uint32_t kNecMinGap =
+ kNecMinCommandLength -
+ (kNecHdrMark + kNecHdrSpace + kNECBits * (kNecBitMark + kNecOneSpace) +
+ kNecBitMark);
+const uint16_t kNecMinGapTicks =
+ kNecMinCommandLengthTicks -
+ (kNecHdrMarkTicks + kNecHdrSpaceTicks +
+ kNECBits * (kNecBitMarkTicks + kNecOneSpaceTicks) + kNecBitMarkTicks);
+
+// IR codes and structure for kids ALOKA SleepyLights LED Lamp.
+// https://aloka-designs.com/
+// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1004
+//
+// May be useful for someone wanting to control the lamp.
+//
+// The lamp is toggled On and Off with the same power button.
+// The colour, when selected, is the brightest and there are 4 levels of
+// brightness that decrease on each send of the colour. A fifth send of the
+// colour resets to brightest again.
+//
+// Remote buttons defined left to right, top line to bottom line on the remote.
+const uint32_t kAlokaPower = 0xFF609F;
+const uint32_t kAlokaLedWhite = 0xFF906F;
+const uint32_t kAlokaLedGreen = 0xFF9867;
+const uint32_t kAlokaLedBlue = 0xFFD827;
+const uint32_t kAlokaLedPinkRed = 0xFF8877;
+const uint32_t kAlokaLedRed = 0xFFA857;
+const uint32_t kAlokaLedLightGreen = 0xFFE817;
+const uint32_t kAlokaLedMidBlue = 0xFF48B7;
+const uint32_t kAlokaLedPink = 0xFF6897;
+const uint32_t kAlokaLedOrange = 0xFFB24D;
+const uint32_t kAlokaLedYellow = 0xFF00FF;
+const uint32_t kAlokaNightFade = 0xFF50AF;
+const uint32_t kAlokaNightTimer = 0xFF7887;
+const uint32_t kAlokaLedRainbow = 0xFF708F;
+// Didn't have a better description for it...
+const uint32_t kAlokaLedTreeGrow = 0xFF58A7;
+#endif // IR_NEC_H_
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Neoclima.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Neoclima.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Neoclima.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Neoclima.cpp
index 8b944293e..0e410ca67 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Neoclima.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Neoclima.cpp
@@ -463,6 +463,8 @@ String IRNeoclimaAc::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of data bits to expect. Typically kNeoclimaBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -472,13 +474,12 @@ String IRNeoclimaAc::toString(void) {
//
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/764
-bool IRrecv::decodeNeoclima(decode_results *results, const uint16_t nbits,
- const bool strict) {
+bool IRrecv::decodeNeoclima(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
// Compliance
if (strict && nbits != kNeoclimaBits)
return false; // Incorrect nr. of bits per spec.
- uint16_t offset = kStartOffset;
// Match Main Header + Data + Footer
uint16_t used;
used = matchGeneric(results->rawbuf + offset, results->state,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Neoclima.h b/lib/IRremoteESP8266-2.7.4/src/ir_Neoclima.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Neoclima.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Neoclima.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Nikai.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Nikai.cpp
similarity index 90%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Nikai.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Nikai.cpp
index 12e99c278..5e6f9fbe5 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Nikai.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Nikai.cpp
@@ -48,6 +48,8 @@ void IRsend::sendNikai(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion.
// Typically kNikaiBits.
// strict: Flag to indicate if we strictly adhere to the specification.
@@ -56,12 +58,12 @@ void IRsend::sendNikai(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Status: STABLE / Working.
//
-bool IRrecv::decodeNikai(decode_results *results, uint16_t nbits, bool strict) {
+bool IRrecv::decodeNikai(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (strict && nbits != kNikaiBits)
return false; // We expect Nikai to be a certain sized message.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
if (!matchGeneric(results->rawbuf + offset, &data,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Panasonic.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Panasonic.cpp
similarity index 95%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Panasonic.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Panasonic.cpp
index a25f4cb02..bf472de88 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Panasonic.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Panasonic.cpp
@@ -25,8 +25,8 @@
// Code by crankyoldgit
// Panasonic A/C models supported:
// A/C Series/models:
-// JKE, LKE, DKE, CKP, RKR, & NKE series. (In theory)
-// CS-YW9MKD, CS-Z9RKR (confirmed)
+// JKE, LKE, DKE, CKP, PKR, RKR, & NKE series. (In theory)
+// CS-YW9MKD, CS-Z9RKR, CS-E7PKR (confirmed)
// CS-ME14CKPG / CS-ME12CKPG / CS-ME10CKPG
// A/C Remotes:
// A75C3747 (confirmed)
@@ -142,6 +142,8 @@ uint64_t IRsend::encodePanasonic(const uint16_t manufacturer,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -153,13 +155,13 @@ uint64_t IRsend::encodePanasonic(const uint16_t manufacturer,
// Ref:
// http://www.remotecentral.com/cgi-bin/mboard/rc-pronto/thread.cgi?26152
// http://www.hifi-remote.com/wiki/index.php?title=Panasonic
-bool IRrecv::decodePanasonic(decode_results *results, const uint16_t nbits,
- const bool strict, const uint32_t manufacturer) {
+bool IRrecv::decodePanasonic(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict,
+ const uint32_t manufacturer) {
if (strict && nbits != kPanasonicBits)
return false; // Request is out of spec.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
if (!matchGeneric(results->rawbuf + offset, &data,
@@ -202,8 +204,9 @@ bool IRrecv::decodePanasonic(decode_results *results, const uint16_t nbits,
//:
// Panasonic A/C models supported:
// A/C Series/models:
-// JKE, LKE, DKE, CKP, RKR, & NKE series.
+// JKE, LKE, DKE, CKP, PKR, RKR, & NKE series.
// CS-YW9MKD
+// CS-E7PKR
// A/C Remotes:
// A75C3747
// A75C3704
@@ -310,6 +313,8 @@ void IRPanasonicAc::setModel(const panasonic_ac_remote_model_t model) {
default:
break;
}
+ // Reset the Ion filter.
+ setIon(getIon());
}
panasonic_ac_remote_model_t IRPanasonicAc::getModel(void) {
@@ -588,6 +593,22 @@ bool IRPanasonicAc::isOffTimerEnabled(void) {
return GETBIT8(remote_state[13], kPanasonicAcOffTimerOffset);
}
+bool IRPanasonicAc::getIon(void) {
+ switch (this->getModel()) {
+ case kPanasonicDke:
+ return GETBIT8(remote_state[kPanasonicAcIonFilterByte],
+ kPanasonicAcIonFilterOffset);
+ default:
+ return false;
+ }
+}
+
+void IRPanasonicAc::setIon(const bool on) {
+ if (this->getModel() == kPanasonicDke)
+ setBit(&remote_state[kPanasonicAcIonFilterByte],
+ kPanasonicAcIonFilterOffset, on);
+}
+
// Convert a standard A/C mode into its native mode.
uint8_t IRPanasonicAc::convertMode(const stdAc::opmode_t mode) {
switch (mode) {
@@ -692,10 +713,10 @@ stdAc::state_t IRPanasonicAc::toCommon(void) {
result.swingh = this->toCommonSwingH(this->getSwingHorizontal());
result.quiet = this->getQuiet();
result.turbo = this->getPowerful();
+ result.filter = this->getIon();
// Not supported.
result.econo = false;
result.clean = false;
- result.filter = false;
result.light = false;
result.beep = false;
result.sleep = -1;
@@ -774,6 +795,8 @@ String IRPanasonicAc::toString(void) {
}
result += addBoolToString(getQuiet(), kQuietStr);
result += addBoolToString(getPowerful(), kPowerfulStr);
+ if (getModel() == kPanasonicDke)
+ result += addBoolToString(getIon(), kIonStr);
result += addLabeledString(minsToString(getClock()), kClockStr);
result += addLabeledString(
isOnTimerEnabled() ? minsToString(getOnTimer()) : kOffStr,
@@ -789,6 +812,8 @@ String IRPanasonicAc::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kPanasonicAcBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -798,25 +823,24 @@ String IRPanasonicAc::toString(void) {
//
// Panasonic A/C models supported:
// A/C Series/models:
-// JKE, LKE, DKE, & NKE series.
+// JKE, LKE, DKE, PKR, & NKE series.
// CS-YW9MKD
+// CS-E7PKR
// A/C Remotes:
// A75C3747 (Confirmed)
// A75C3704
-bool IRrecv::decodePanasonicAC(decode_results *results, const uint16_t nbits,
- const bool strict) {
+bool IRrecv::decodePanasonicAC(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
uint8_t min_nr_of_messages = 1;
if (strict) {
if (nbits != kPanasonicAcBits && nbits != kPanasonicAcShortBits)
return false; // Not strictly a PANASONIC_AC message.
}
- if (results->rawlen <
- min_nr_of_messages * (2 * nbits + kHeader + kFooter) - 1)
+ if (results->rawlen <=
+ min_nr_of_messages * (2 * nbits + kHeader + kFooter) - 1 + offset)
return false; // Can't possibly be a valid PANASONIC_AC message.
- uint16_t offset = kStartOffset;
-
// Match Header + Data #1 + Footer
uint16_t used;
used = matchGeneric(results->rawbuf + offset, results->state,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Panasonic.h b/lib/IRremoteESP8266-2.7.4/src/ir_Panasonic.h
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Panasonic.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Panasonic.h
index 89c2e5395..42e771fb3 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Panasonic.h
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Panasonic.h
@@ -4,19 +4,20 @@
// Brand: Panasonic, Model: TV
// Brand: Panasonic, Model: JKE series A/C
// Brand: Panasonic, Model: DKE series A/C
+// Brand: Panasonic, Model: DKW series A/C (DKE)
+// Brand: Panasonic, Model: PKR series A/C (DKE)
// Brand: Panasonic, Model: CKP series A/C
+// Brand: Panasonic, Model: NKE series A/C
+// Brand: Panasonic, Model: RKR series A/C
// Brand: Panasonic, Model: CS-ME10CKPG A/C
// Brand: Panasonic, Model: CS-ME12CKPG A/C
// Brand: Panasonic, Model: CS-ME14CKPG A/C
-// Brand: Panasonic, Model: RKR series A/C
+// Brand: Panasonic, Model: CS-E7PKR A/C (DKE)
// Brand: Panasonic, Model: CS-Z9RKR A/C
-// Brand: Panasonic, Model: NKE series A/C
// Brand: Panasonic, Model: CS-YW9MKD A/C
-// Brand: Panasonic, Model: A75C3747 remote
-// Brand: Panasonic, Model: A75C3704 remote
// Brand: Panasonic, Model: A75C2311 remote (CKP)
-// Brand: Panasonic, Model: A75C3747 remote
-// Brand: Panasonic, Model: A75C3747 remote
+// Brand: Panasonic, Model: A75C2616-1 remote (DKE)
+// Brand: Panasonic, Model: A75C3704 remote
// Brand: Panasonic, Model: A75C3747 remote
#ifndef IR_PANASONIC_H_
@@ -84,6 +85,9 @@ const uint8_t kPanasonicAcTimeOverflowSize = 3; // Bits
const uint16_t kPanasonicAcTimeMax = 23 * 60 + 59; // Mins since midnight.
const uint16_t kPanasonicAcTimeSpecial = 0x600;
+const uint8_t kPanasonicAcIonFilterByte = 22; // Byte
+const uint8_t kPanasonicAcIonFilterOffset = 0; // Bit
+
const uint8_t kPanasonicKnownGoodState[kPanasonicAcStateLength] = {
0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
@@ -121,6 +125,8 @@ class IRPanasonicAc {
bool getQuiet(void);
void setPowerful(const bool on);
bool getPowerful(void);
+ void setIon(const bool on);
+ bool getIon(void);
void setModel(const panasonic_ac_remote_model_t model);
panasonic_ac_remote_model_t getModel(void);
void setSwingVertical(const uint8_t elevation);
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Pioneer.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Pioneer.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Pioneer.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Pioneer.cpp
index 490ea9440..85343a117 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Pioneer.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Pioneer.cpp
@@ -96,6 +96,8 @@ uint64_t IRsend::encodePioneer(const uint16_t address, const uint16_t command) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kPioneerBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -103,15 +105,14 @@ uint64_t IRsend::encodePioneer(const uint16_t address, const uint16_t command) {
//
// Status: BETA / Should be working. (Self decodes & real examples)
//
-bool IRrecv::decodePioneer(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1)
+bool IRrecv::decodePioneer(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1 + offset)
return false; // Can't possibly be a valid Pioneer message.
if (strict && nbits != kPioneerBits)
return false; // Not strictly an Pioneer message.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
results->value = 0;
for (uint16_t section = 0; section < 2; section++) {
// Match Header + Data + Footer
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Pronto.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Pronto.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Pronto.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Pronto.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_RC5_RC6.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_RC5_RC6.cpp
similarity index 95%
rename from lib/IRremoteESP8266-2.7.1/src/ir_RC5_RC6.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_RC5_RC6.cpp
index b79416692..ce69aaa3a 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_RC5_RC6.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_RC5_RC6.cpp
@@ -347,6 +347,8 @@ int16_t IRrecv::getRClevel(decode_results *results, uint16_t *offset,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -363,14 +365,14 @@ int16_t IRrecv::getRClevel(decode_results *results, uint16_t *offset,
// https://en.wikipedia.org/wiki/Manchester_code
// TODO(anyone):
// Serious testing of the RC-5X and strict aspects needs to be done.
-bool IRrecv::decodeRC5(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < kRc5SamplesMin + kHeader - 1) return false;
+bool IRrecv::decodeRC5(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen <= kRc5SamplesMin + kHeader - 1 + offset) return false;
// Compliance
if (strict && nbits != kRC5Bits && nbits != kRC5XBits)
return false; // It's neither RC-5 or RC-5X.
- uint16_t offset = kStartOffset;
uint16_t used = 0;
bool is_rc5x = false;
uint64_t data = 0;
@@ -432,6 +434,8 @@ bool IRrecv::decodeRC5(decode_results *results, uint16_t nbits, bool strict) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -444,8 +448,10 @@ bool IRrecv::decodeRC5(decode_results *results, uint16_t nbits, bool strict) {
// https://en.wikipedia.org/wiki/Manchester_code
// TODO(anyone):
// Testing of the strict compliance aspects.
-bool IRrecv::decodeRC6(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < kHeader + 2 + 4) // Up to the double-wide T bit.
+bool IRrecv::decodeRC6(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen <= kHeader + 2 + 4 + offset)
+ // Up to the double-wide T bit.
return false; // Smaller than absolute smallest possible RC6 message.
if (strict) { // Compliance
@@ -455,7 +461,7 @@ bool IRrecv::decodeRC6(decode_results *results, uint16_t nbits, bool strict) {
// Also due to potential melding with the start bit, we can only count
// the start bit as 1, instead of a more typical 2 value. The header still
// remains as normal.
- if (results->rawlen < nbits + kHeader + 1)
+ if (results->rawlen <= nbits + kHeader + 1 + offset)
return false; // Don't have enough entries/samples to be valid.
switch (nbits) {
case kRC6Mode0Bits:
@@ -466,8 +472,6 @@ bool IRrecv::decodeRC6(decode_results *results, uint16_t nbits, bool strict) {
}
}
- uint16_t offset = kStartOffset;
-
// Header
if (!matchMark(results->rawbuf[offset], kRc6HdrMark)) return false;
// Calculate how long the common tick time is based on the header mark.
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_RCMM.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_RCMM.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/src/ir_RCMM.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_RCMM.cpp
index 4e8f43891..a2542e467 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_RCMM.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_RCMM.cpp
@@ -95,6 +95,8 @@ void IRsend::sendRCMM(uint64_t data, uint16_t nbits, uint16_t repeat) {
// Places successful decode information in the results pointer.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. Typically kRCMMBits.
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -104,11 +106,11 @@ void IRsend::sendRCMM(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Ref:
// http://www.sbprojects.com/knowledge/ir/rcmm.php
-bool IRrecv::decodeRCMM(decode_results *results, uint16_t nbits, bool strict) {
+bool IRrecv::decodeRCMM(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
uint64_t data = 0;
- uint16_t offset = kStartOffset;
- if (results->rawlen <= 4)
+ if (results->rawlen <= 4 + offset - 1)
return false; // Not enough entries to ever be RCMM.
// Calc the maximum size in bits, the message can be, or that we can accept.
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Samsung.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Samsung.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Samsung.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Samsung.cpp
index 1ca7a2b4a..a31e76953 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Samsung.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Samsung.cpp
@@ -109,6 +109,8 @@ uint32_t IRsend::encodeSAMSUNG(const uint8_t customer, const uint8_t command) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. Typically kSamsungBits.
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -121,15 +123,12 @@ uint32_t IRsend::encodeSAMSUNG(const uint8_t customer, const uint8_t command) {
// They differ on their compliance criteria and how they repeat.
// Ref:
// http://elektrolab.wz.cz/katalog/samsung_protocol.pdf
-bool IRrecv::decodeSAMSUNG(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
- return false; // Can't possibly be a valid Samsung message.
+bool IRrecv::decodeSAMSUNG(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (strict && nbits != kSamsungBits)
return false; // We expect Samsung to be 32 bits of message.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
if (!matchGeneric(results->rawbuf + offset, &data,
@@ -201,6 +200,8 @@ void IRsend::sendSamsung36(const uint64_t data, const uint16_t nbits,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion.
// Typically kSamsung36Bits.
// strict: Flag to indicate if we strictly adhere to the specification.
@@ -214,9 +215,9 @@ void IRsend::sendSamsung36(const uint64_t data, const uint16_t nbits,
//
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/621
-bool IRrecv::decodeSamsung36(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < 2 * nbits + kHeader + kFooter * 2 - 1)
+bool IRrecv::decodeSamsung36(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < 2 * nbits + kHeader + kFooter * 2 - 1 + offset)
return false; // Can't possibly be a valid Samsung message.
// We need to be looking for > 16 bits to make sense.
if (nbits <= 16) return false;
@@ -224,7 +225,6 @@ bool IRrecv::decodeSamsung36(decode_results *results, const uint16_t nbits,
return false; // We expect nbits to be 36 bits of message.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
uint16_t used;
@@ -570,6 +570,22 @@ void IRSamsungAc::setPowerful(const bool on) {
}
}
+bool IRSamsungAc::getDisplay(void) {
+ return GETBIT8(remote_state[10], kSamsungAcDisplayOffset);
+}
+
+void IRSamsungAc::setDisplay(const bool on) {
+ setBit(&remote_state[10], kSamsungAcDisplayOffset, on);
+}
+
+bool IRSamsungAc::getIon(void) {
+ return GETBIT8(remote_state[11], kSamsungAcIonOffset);
+}
+
+void IRSamsungAc::setIon(const bool on) {
+ setBit(&remote_state[11], kSamsungAcIonOffset, on);
+}
+
// Convert a standard A/C mode into its native mode.
uint8_t IRSamsungAc::convertMode(const stdAc::opmode_t mode) {
switch (mode) {
@@ -631,11 +647,11 @@ stdAc::state_t IRSamsungAc::toCommon(void) {
result.turbo = this->getPowerful();
result.clean = this->getClean();
result.beep = this->getBeep();
+ result.light = this->getDisplay();
+ result.filter = this->getIon();
// Not supported.
result.swingh = stdAc::swingh_t::kOff;
result.econo = false;
- result.filter = false;
- result.light = false;
result.sleep = -1;
result.clock = -1;
return result;
@@ -644,7 +660,7 @@ stdAc::state_t IRSamsungAc::toCommon(void) {
// Convert the internal state into a human readable string.
String IRSamsungAc::toString(void) {
String result = "";
- result.reserve(100); // Reserve some heap for the string to reduce fragging.
+ result.reserve(115); // Reserve some heap for the string to reduce fragging.
result += addBoolToString(getPower(), kPowerStr, false);
result += addModeToString(getMode(), kSamsungAcAuto, kSamsungAcCool,
kSamsungAcHeat, kSamsungAcDry,
@@ -679,6 +695,8 @@ String IRSamsungAc::toString(void) {
result += addBoolToString(getClean(), kCleanStr);
result += addBoolToString(getQuiet(), kQuietStr);
result += addBoolToString(getPowerful(), kPowerfulStr);
+ result += addBoolToString(getDisplay(), kLightStr);
+ result += addBoolToString(getIon(), kIonStr);
return result;
}
@@ -687,6 +705,8 @@ String IRSamsungAc::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kSamsungAcBits
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -696,14 +716,12 @@ String IRSamsungAc::toString(void) {
//
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/505
-bool IRrecv::decodeSamsungAC(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < 2 * nbits + kHeader * 3 + kFooter * 2 - 1)
+bool IRrecv::decodeSamsungAC(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < 2 * nbits + kHeader * 3 + kFooter * 2 - 1 + offset)
return false; // Can't possibly be a valid Samsung A/C message.
if (nbits != kSamsungAcBits && nbits != kSamsungAcExtendedBits) return false;
- uint16_t offset = kStartOffset;
-
// Message Header
if (!matchMark(results->rawbuf[offset++], kSamsungAcBitMark)) return false;
if (!matchSpace(results->rawbuf[offset++], kSamsungAcHdrSpace)) return false;
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Samsung.h b/lib/IRremoteESP8266-2.7.4/src/ir_Samsung.h
similarity index 93%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Samsung.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Samsung.h
index de2172444..52a781b65 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Samsung.h
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Samsung.h
@@ -18,7 +18,9 @@
// Supports:
// Brand: Samsung, Model: UA55H6300 TV
+// Brand: Samsung, Model: DB63-03556X003 remote
// Brand: Samsung, Model: IEC-R03 remote
+// Brand: Samsung, Model: AR09FSSDAWKNFA A/C
// Brand: Samsung, Model: AR12KSFPEWQNET A/C
// Brand: Samsung, Model: AR12HSSDBWKNEU A/C
@@ -58,6 +60,8 @@ const uint8_t kSamsungAcQuiet5Offset = 5;
const uint8_t kSamsungAcPowerfulMask8 = 0b01010000;
const uint8_t kSamsungAcPowerful10Offset = 1; // Mask 0b00000110
const uint8_t kSamsungAcPowerful10Size = 1; // Mask 0b00000110
+const uint8_t kSamsungAcDisplayOffset = 4; // Mask 0b00010000
+const uint8_t kSamsungAcIonOffset = 0; // Mask 0b00000001
const uint16_t kSamsungACSectionLength = 7;
const uint64_t kSamsungAcPowerSection = 0x1D20F00000000;
@@ -99,6 +103,12 @@ class IRSamsungAc {
bool getQuiet(void);
void setPowerful(const bool on);
bool getPowerful(void);
+
+ void setDisplay(const bool on);
+ bool getDisplay(void);
+ void setIon(const bool on);
+ bool getIon(void);
+
uint8_t* getRaw(void);
void setRaw(const uint8_t new_code[],
const uint16_t length = kSamsungAcStateLength);
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Sanyo.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Sanyo.cpp
similarity index 96%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Sanyo.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Sanyo.cpp
index b05e76766..f797fb678 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Sanyo.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Sanyo.cpp
@@ -96,7 +96,7 @@ uint64_t IRsend::encodeSanyoLC7461(uint16_t address, uint8_t command) {
// https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Sanyo.cpp
// http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf
void IRsend::sendSanyoLC7461(uint64_t data, uint16_t nbits, uint16_t repeat) {
- // This protocol appears to be another 42-bit variant of the NEC protcol.
+ // This protocol appears to be another 42-bit variant of the NEC protocol.
sendNEC(data, nbits, repeat);
}
#endif // SEND_SANYO
@@ -106,6 +106,8 @@ void IRsend::sendSanyoLC7461(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -123,12 +125,12 @@ void IRsend::sendSanyoLC7461(uint64_t data, uint16_t nbits, uint16_t repeat) {
// http://slydiman.narod.ru/scr/kb/sanyo.htm
// https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Sanyo.cpp
// http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf
-bool IRrecv::decodeSanyoLC7461(decode_results *results, uint16_t nbits,
- bool strict) {
+bool IRrecv::decodeSanyoLC7461(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (strict && nbits != kSanyoLC7461Bits)
return false; // Not strictly in spec.
// This protocol is basically a 42-bit variant of the NEC protocol.
- if (!decodeNEC(results, nbits, false))
+ if (!decodeNEC(results, offset, nbits, false))
return false; // Didn't match a NEC format (without strict)
// Bits 30 to 42+.
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Sharp.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Sharp.cpp
similarity index 96%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Sharp.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Sharp.cpp
index abd93ecf6..f28ca0f4d 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Sharp.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Sharp.cpp
@@ -168,6 +168,8 @@ void IRsend::sendSharp(const uint16_t address, uint16_t const command,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of data bits to expect. Typically kSharpBits.
// strict: Flag indicating if we should perform strict matching.
// expansion: Should we expect the expansion bit to be set. Default is true.
@@ -185,9 +187,10 @@ void IRsend::sendSharp(const uint16_t address, uint16_t const command,
// http://www.sbprojects.com/knowledge/ir/sharp.php
// http://www.mwftr.com/ucF08/LEC14%20PIC%20IR.pdf
// http://www.hifi-remote.com/johnsfine/DecodeIR.html#Sharp
-bool IRrecv::decodeSharp(decode_results *results, const uint16_t nbits,
- const bool strict, const bool expansion) {
- if (results->rawlen < 2 * nbits + kFooter - 1)
+bool IRrecv::decodeSharp(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict,
+ const bool expansion) {
+ if (results->rawlen <= 2 * nbits + kFooter - 1 + offset)
return false; // Not enough entries to be a Sharp message.
// Compliance
if (strict) {
@@ -196,12 +199,12 @@ bool IRrecv::decodeSharp(decode_results *results, const uint16_t nbits,
#ifdef UNIT_TEST
// An in spec message has the data sent normally, then inverted. So we
// expect twice as many entries than to just get the results.
- if (results->rawlen < 2 * (2 * nbits + kFooter)) return false;
+ if (results->rawlen <= (2 * (2 * nbits + kFooter)) - 1 + offset)
+ return false;
#endif
}
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Data + Footer
uint16_t used;
@@ -496,6 +499,8 @@ String IRSharpAc::toString(void) {
// Decode the supplied Sharp A/C message.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kSharpAcBits)
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -506,16 +511,11 @@ String IRSharpAc::toString(void) {
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/638
// https://github.com/ToniA/arduino-heatpumpir/blob/master/SharpHeatpumpIR.cpp
-bool IRrecv::decodeSharpAc(decode_results *results, const uint16_t nbits,
- const bool strict) {
- // Is there enough data to match successfully?
- if (results->rawlen < 2 * nbits + kHeader + kFooter - 1)
- return false;
-
+bool IRrecv::decodeSharpAc(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
// Compliance
if (strict && nbits != kSharpAcBits) return false;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
uint16_t used;
used = matchGeneric(results->rawbuf + offset, results->state,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Sharp.h b/lib/IRremoteESP8266-2.7.4/src/ir_Sharp.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Sharp.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Sharp.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Sherwood.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Sherwood.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Sherwood.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Sherwood.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Sony.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Sony.cpp
similarity index 71%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Sony.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Sony.cpp
index 6fc39b7b5..c346eb293 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Sony.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Sony.cpp
@@ -1,9 +1,12 @@
// Copyright 2009 Ken Shirriff
// Copyright 2016 marcosamarinho
-// Copyright 2017 David Conran
+// Copyright 2017,2020 David Conran
// Sony Remote Emulation
+// Supports:
+// Brand: Sony, Model: HT-CT380 Soundbar (Uses 38kHz & 3 repeats)
+
#include
#include "IRrecv.h"
#include "IRsend.h"
@@ -28,9 +31,11 @@ const uint16_t kSonyRptLengthTicks = 225;
const uint16_t kSonyRptLength = kSonyRptLengthTicks * kSonyTick;
const uint16_t kSonyMinGapTicks = 50;
const uint16_t kSonyMinGap = kSonyMinGapTicks * kSonyTick;
+const uint16_t kSonyStdFreq = 40000; // kHz
+const uint16_t kSonyAltFreq = 38000; // kHz
#if SEND_SONY
-// Send a Sony/SIRC(Serial Infra-Red Control) message.
+// Send a standard Sony/SIRC(Serial Infra-Red Control) message. (40kHz)
//
// Args:
// data: message to be sent.
@@ -46,10 +51,50 @@ const uint16_t kSonyMinGap = kSonyMinGapTicks * kSonyTick;
// Ref:
// http://www.sbprojects.com/knowledge/ir/sirc.php
void IRsend::sendSony(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ _sendSony(data, nbits, repeat, kSonyStdFreq);
+}
+
+// Send an alternative 38kHz Sony/SIRC(Serial Infra-Red Control) message.
+//
+// Args:
+// data: message to be sent.
+// nbits: Nr. of bits of the message to be sent.
+// repeat: Nr. of additional times the message is to be sent. (Default: 3)
+//
+// Status: STABLE / Known working.
+//
+// Notes:
+// - `sendSony38()`` should typically be called with repeat=3 as these Sony
+// devices expect the message to be sent at least 4 times.
+// - Messages send via this method will be detected by this library as just
+// `SONY`, not `SONY_38K` as the library has no way to determine the
+// modulation frequency used. Hence, there is no `decodeSony38()`.
+//
+// Ref:
+// http://www.sbprojects.com/knowledge/ir/sirc.php
+// https://github.com/crankyoldgit/IRremoteESP8266/issues/1018
+void IRsend::sendSony38(uint64_t data, uint16_t nbits, uint16_t repeat) {
+ _sendSony(data, nbits, repeat, kSonyAltFreq);
+}
+
+// Internal procedure to generate a Sony/SIRC(Serial Infra-Red Control) message.
+//
+// Args:
+// data: message to be sent.
+// nbits: Nr. of bits of the message to be sent.
+// repeat: Nr. of additional times the message is to be sent.
+// freq: Frequency of the modulation to transmit at. (Hz or kHz)
+//
+// Status: STABLE / Known working.
+//
+// Ref:
+// http://www.sbprojects.com/knowledge/ir/sirc.php
+void IRsend::_sendSony(uint64_t data, uint16_t nbits, uint16_t repeat,
+ uint16_t freq) {
sendGeneric(kSonyHdrMark, kSonySpace, kSonyOneMark, kSonySpace, kSonyZeroMark,
kSonySpace,
0, // No Footer mark.
- kSonyMinGap, kSonyRptLength, data, nbits, 40, true, repeat, 33);
+ kSonyMinGap, kSonyRptLength, data, nbits, freq, true, repeat, 33);
}
// Convert Sony/SIRC command, address, & extended bits into sendSony format.
@@ -89,6 +134,8 @@ uint32_t IRsend::encodeSony(uint16_t nbits, uint16_t command, uint16_t address,
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -100,8 +147,9 @@ uint32_t IRsend::encodeSony(uint16_t nbits, uint16_t command, uint16_t address,
// SONY protocol, SIRC (Serial Infra-Red Control) can be 12,15,20 bits long.
// Ref:
// http://www.sbprojects.com/knowledge/ir/sirc.php
-bool IRrecv::decodeSony(decode_results *results, uint16_t nbits, bool strict) {
- if (results->rawlen < 2 * nbits + kHeader - 1)
+bool IRrecv::decodeSony(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen <= 2 * nbits + kHeader - 1 + offset)
return false; // Message is smaller than we expected.
// Compliance
@@ -117,7 +165,6 @@ bool IRrecv::decodeSony(decode_results *results, uint16_t nbits, bool strict) {
}
uint64_t data = 0;
- uint16_t offset = kStartOffset;
uint16_t actualBits;
// Header
@@ -149,6 +196,7 @@ bool IRrecv::decodeSony(decode_results *results, uint16_t nbits, bool strict) {
// Success
results->bits = actualBits;
results->value = data;
+ // We can't detect SONY_38K messages so always assume it is just `SONY` 40kHz.
results->decode_type = SONY;
// Message comes in LSB first. Convert ot MSB first.
data = reverseBits(data, actualBits);
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Tcl.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Tcl.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Tcl.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Tcl.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Tcl.h b/lib/IRremoteESP8266-2.7.4/src/ir_Tcl.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Tcl.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Tcl.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Teco.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Teco.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Teco.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Teco.cpp
index 200f1954d..8e33e04ec 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Teco.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Teco.cpp
@@ -298,18 +298,19 @@ String IRTecoAc::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kTecoBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
// boolean: True if it can decode it, false if it can't.
//
// Status: STABLE / Tested.
-bool IRrecv::decodeTeco(decode_results* results,
+bool IRrecv::decodeTeco(decode_results* results, uint16_t offset,
const uint16_t nbits, const bool strict) {
if (strict && nbits != kTecoBits) return false; // Not what is expected
uint64_t data = 0;
- uint16_t offset = kStartOffset;
// Match Header + Data + Footer
if (!matchGeneric(results->rawbuf + offset, &data,
results->rawlen - offset, nbits,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Teco.h b/lib/IRremoteESP8266-2.7.4/src/ir_Teco.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Teco.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Teco.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Toshiba.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Toshiba.cpp
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Toshiba.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Toshiba.cpp
index ba1ca5424..3113e1b09 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Toshiba.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Toshiba.cpp
@@ -316,6 +316,8 @@ String IRToshibaAC::toString(void) {
// Places successful decode information in the results pointer.
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kToshibaACBits.
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns:
@@ -325,10 +327,8 @@ String IRToshibaAC::toString(void) {
//
// Ref:
//
-bool IRrecv::decodeToshibaAC(decode_results* results, const uint16_t nbits,
- const bool strict) {
- uint16_t offset = kStartOffset;
-
+bool IRrecv::decodeToshibaAC(decode_results* results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
// Compliance
if (strict && nbits != kToshibaACBits)
return false; // Must be called with the correct nr. of bytes.
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Toshiba.h b/lib/IRremoteESP8266-2.7.4/src/ir_Toshiba.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Toshiba.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Toshiba.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Trotec.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Trotec.cpp
similarity index 96%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Trotec.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Trotec.cpp
index cb923b5fc..563564d36 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Trotec.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Trotec.cpp
@@ -238,6 +238,8 @@ String IRTrotecESP::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kTrotecBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -246,13 +248,12 @@ String IRTrotecESP::toString(void) {
// Status: BETA / Probably works. Untested on real devices.
//
// Ref:
-bool IRrecv::decodeTrotec(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < 2 * nbits + kHeader + 2 * kFooter - 1)
+bool IRrecv::decodeTrotec(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen <= 2 * nbits + kHeader + 2 * kFooter - 1 + offset)
return false; // Can't possibly be a valid Samsung A/C message.
if (strict && nbits != kTrotecBits) return false;
- uint16_t offset = kStartOffset;
uint16_t used;
// Header + Data + Footer #1
used = matchGeneric(results->rawbuf + offset, results->state,
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Trotec.h b/lib/IRremoteESP8266-2.7.4/src/ir_Trotec.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Trotec.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Trotec.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Vestel.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Vestel.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Vestel.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Vestel.cpp
index c2a3a905b..4378497e0 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Vestel.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Vestel.cpp
@@ -512,6 +512,8 @@ String IRVestelAc::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kVestelBits.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -519,8 +521,8 @@ String IRVestelAc::toString(void) {
//
// Status: Alpha / Needs testing against a real device.
//
-bool IRrecv::decodeVestelAc(decode_results* results, const uint16_t nbits,
- const bool strict) {
+bool IRrecv::decodeVestelAc(decode_results* results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
if (nbits % 8 != 0) // nbits has to be a multiple of nr. of bits in a byte.
return false;
@@ -529,7 +531,6 @@ bool IRrecv::decodeVestelAc(decode_results* results, const uint16_t nbits,
return false; // Not strictly a Vestel AC message.
uint64_t data = 0;
- uint16_t offset = kStartOffset;
if (nbits > sizeof(data) * 8)
return false; // We can't possibly capture a Vestel packet that big.
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Vestel.h b/lib/IRremoteESP8266-2.7.4/src/ir_Vestel.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Vestel.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Vestel.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Whirlpool.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Whirlpool.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Whirlpool.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Whirlpool.cpp
index 9dbdf62e5..e1ca2e6db 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Whirlpool.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Whirlpool.cpp
@@ -542,6 +542,8 @@ String IRWhirlpoolAc::toString(void) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kWhirlpoolAcBits
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -552,16 +554,15 @@ String IRWhirlpoolAc::toString(void) {
//
// Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/509
-bool IRrecv::decodeWhirlpoolAC(decode_results *results, const uint16_t nbits,
- const bool strict) {
- if (results->rawlen < 2 * nbits + 4 + kHeader + kFooter - 1)
+bool IRrecv::decodeWhirlpoolAC(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen < 2 * nbits + 4 + kHeader + kFooter - 1 + offset)
return false; // Can't possibly be a valid Whirlpool A/C message.
if (strict) {
if (nbits != kWhirlpoolAcBits) return false;
}
- uint16_t offset = kStartOffset;
- uint8_t sectionSize[kWhirlpoolAcSections] = {6, 8, 7};
+ const uint8_t sectionSize[kWhirlpoolAcSections] = {6, 8, 7};
// Header
if (!matchMark(results->rawbuf[offset++], kWhirlpoolAcHdrMark)) return false;
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Whirlpool.h b/lib/IRremoteESP8266-2.7.4/src/ir_Whirlpool.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Whirlpool.h
rename to lib/IRremoteESP8266-2.7.4/src/ir_Whirlpool.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/ir_Whynter.cpp b/lib/IRremoteESP8266-2.7.4/src/ir_Whynter.cpp
similarity index 91%
rename from lib/IRremoteESP8266-2.7.1/src/ir_Whynter.cpp
rename to lib/IRremoteESP8266-2.7.4/src/ir_Whynter.cpp
index c5634f381..118eb7559 100644
--- a/lib/IRremoteESP8266-2.7.1/src/ir_Whynter.cpp
+++ b/lib/IRremoteESP8266-2.7.4/src/ir_Whynter.cpp
@@ -69,6 +69,8 @@ void IRsend::sendWhynter(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Args:
// results: Ptr to the data to decode and where to store the decode result.
+// offset: The starting index to use when attempting to decode the raw data.
+// Typically/Defaults to kStartOffset.
// nbits: Nr. of data bits to expect.
// strict: Flag indicating if we should perform strict matching.
// Returns:
@@ -78,16 +80,15 @@ void IRsend::sendWhynter(uint64_t data, uint16_t nbits, uint16_t repeat) {
//
// Ref:
// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Whynter.cpp
-bool IRrecv::decodeWhynter(decode_results *results, uint16_t nbits,
- bool strict) {
- if (results->rawlen < 2 * nbits + 2 * kHeader + kFooter - 1)
+bool IRrecv::decodeWhynter(decode_results *results, uint16_t offset,
+ const uint16_t nbits, const bool strict) {
+ if (results->rawlen <= 2 * nbits + 2 * kHeader + kFooter - 1 + offset)
return false; // We don't have enough entries to possibly match.
// Compliance
if (strict && nbits != kWhynterBits)
return false; // Incorrect nr. of bits per spec.
- uint16_t offset = kStartOffset;
uint64_t data = 0;
// Pre-Header
// Sequence begins with a bit mark and a zero space.
diff --git a/lib/IRremoteESP8266-2.7.1/src/locale/README.md b/lib/IRremoteESP8266-2.7.4/src/locale/README.md
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/locale/README.md
rename to lib/IRremoteESP8266-2.7.4/src/locale/README.md
diff --git a/lib/IRremoteESP8266-2.7.1/src/locale/de-CH.h b/lib/IRremoteESP8266-2.7.4/src/locale/de-CH.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/locale/de-CH.h
rename to lib/IRremoteESP8266-2.7.4/src/locale/de-CH.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/locale/de-DE.h b/lib/IRremoteESP8266-2.7.4/src/locale/de-DE.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/locale/de-DE.h
rename to lib/IRremoteESP8266-2.7.4/src/locale/de-DE.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/locale/defaults.h b/lib/IRremoteESP8266-2.7.4/src/locale/defaults.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/locale/defaults.h
rename to lib/IRremoteESP8266-2.7.4/src/locale/defaults.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/locale/en-AU.h b/lib/IRremoteESP8266-2.7.4/src/locale/en-AU.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/locale/en-AU.h
rename to lib/IRremoteESP8266-2.7.4/src/locale/en-AU.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/locale/en-IE.h b/lib/IRremoteESP8266-2.7.4/src/locale/en-IE.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/locale/en-IE.h
rename to lib/IRremoteESP8266-2.7.4/src/locale/en-IE.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/locale/en-UK.h b/lib/IRremoteESP8266-2.7.4/src/locale/en-UK.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/locale/en-UK.h
rename to lib/IRremoteESP8266-2.7.4/src/locale/en-UK.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/locale/en-US.h b/lib/IRremoteESP8266-2.7.4/src/locale/en-US.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/locale/en-US.h
rename to lib/IRremoteESP8266-2.7.4/src/locale/en-US.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/locale/es-ES.h b/lib/IRremoteESP8266-2.7.4/src/locale/es-ES.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/locale/es-ES.h
rename to lib/IRremoteESP8266-2.7.4/src/locale/es-ES.h
diff --git a/lib/IRremoteESP8266-2.7.1/src/locale/fr-FR.h b/lib/IRremoteESP8266-2.7.4/src/locale/fr-FR.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/src/locale/fr-FR.h
rename to lib/IRremoteESP8266-2.7.4/src/locale/fr-FR.h
diff --git a/lib/IRremoteESP8266-2.7.4/src/locale/it-IT.h b/lib/IRremoteESP8266-2.7.4/src/locale/it-IT.h
new file mode 100644
index 000000000..b078a7319
--- /dev/null
+++ b/lib/IRremoteESP8266-2.7.4/src/locale/it-IT.h
@@ -0,0 +1,157 @@
+// Copyright 2020 - Enrico Gueli (@egueli)
+// Locale/language file for Italian.
+// This file will override the default values located in `defaults.h`.
+
+#ifndef LOCALE_IT_IT_H_
+#define LOCALE_IT_IT_H_
+
+#define D_STR_UNKNOWN "SCONOSCIUTO"
+#define D_STR_PROTOCOL "Protocollo"
+#define D_STR_POWER "Accensione"
+#define D_STR_ON "Acceso"
+#define D_STR_OFF "Spento"
+#define D_STR_MODE "Modalità"
+#define D_STR_TOGGLE "Alterna"
+#define D_STR_SLEEP "Sonno"
+#define D_STR_LIGHT "Leggero"
+#define D_STR_POWERFUL "Forte"
+#define D_STR_QUIET "Silenzioso"
+#define D_STR_ECONO "Eco"
+#define D_STR_SWING "Swing"
+#define D_STR_SWINGH D_STR_SWING"(O)" // Set `D_STR_SWING` first!
+#define D_STR_SWINGV D_STR_SWING"(V)" // Set `D_STR_SWING` first!
+#define D_STR_MOULD "Muffa"
+#define D_STR_CLEAN "Pulizia"
+#define D_STR_PURIFY "Purifica"
+#define D_STR_TIMER "Timer"
+#define D_STR_ONTIMER D_STR_ON " " D_STR_TIMER // Set `D_STR_ON` first!
+#define D_STR_OFFTIMER D_STR_OFF " " D_STR_TIMER // Set `D_STR_OFF` first!
+#define D_STR_CLOCK "Orologio"
+#define D_STR_COMMAND "Comando"
+#define D_STR_MODEL "Modello"
+#define D_STR_TEMP "Temp"
+#define D_STR_HUMID "Umido"
+#define D_STR_SAVE "Salva"
+#define D_STR_EYE "Occhio"
+#define D_STR_FOLLOW "Segui"
+#define D_STR_ION "Ioni"
+#define D_STR_FRESH "Fresco"
+#define D_STR_HOLD "Mantieni"
+#define D_STR_8C_HEAT "8C " D_STR_HEAT // Set `D_STR_HEAT` first!
+#define D_STR_BUTTON "Pulsante"
+#define D_STR_NIGHT "Notte"
+#define D_STR_SILENT "Silenzioso"
+#define D_STR_FILTER "Filtro"
+#define D_STR_UP "Su"
+#define D_STR_TEMPUP D_STR_TEMP " " D_STR_UP // Set `D_STR_TEMP` first!
+#define D_STR_DOWN "Giù"
+#define D_STR_TEMPDOWN D_STR_TEMP " " D_STR_DOWN // Set `D_STR_TEMP` first!
+#define D_STR_CHANGE "Cambia"
+#define D_STR_START "Avvia"
+#define D_STR_STOP "Ferma"
+#define D_STR_MOVE "Muovi"
+#define D_STR_SET "Imposta"
+#define D_STR_CANCEL "Annulla"
+#define D_STR_SENSOR "Sensore"
+#define D_STR_WEEKLY "Settimanale"
+#define D_STR_WEEKLYTIMER D_STR_WEEKLY " " D_STR_TIMER // Needs `D_STR_WEEKLY`!
+#define D_STR_LAST "Ultimo"
+#define D_STR_FAST "Veloce"
+#define D_STR_SLOW "Lento"
+#define D_STR_AIRFLOW "Flusso d'aria"
+#define D_STR_STEP "Passo"
+#define D_STR_NA "N/D"
+#define D_STR_OUTSIDE "Esterno"
+#define D_STR_LOUD "Rumoroso"
+#define D_STR_UPPER "Superiore"
+#define D_STR_LOWER "Inferiore"
+#define D_STR_CIRCULATE "Circolare"
+#define D_STR_CEILING "Soffitto"
+#define D_STR_WALL "Muro"
+#define D_STR_ROOM "Camera"
+#define D_STR_FIXED "Fisso"
+
+#define D_STR_AUTO "Auto"
+#define D_STR_AUTOMATIC "Automatico"
+#define D_STR_MANUAL "Manuale"
+#define D_STR_COOL "Fresco"
+#define D_STR_HEAT "Caldo"
+#define D_STR_FAN "Ventola"
+#define D_STR_FANONLY "solo_ventola"
+#define D_STR_DRY "Secco"
+
+#define D_STR_MAX "Max"
+#define D_STR_MAXIMUM "Massimo"
+#define D_STR_MINIMUM "Minimo"
+#define D_STR_MEDIUM "Medio"
+
+#define D_STR_HIGHEST "Molto alto"
+#define D_STR_HIGH "Alto"
+#define D_STR_MID "Med"
+#define D_STR_MIDDLE "Medio"
+#define D_STR_LOW "Basso"
+#define D_STR_LOWEST "Bassissimo"
+#define D_STR_RIGHT "Destra"
+#define D_STR_MAXRIGHT D_STR_MAX " " D_STR_RIGHT // Set `D_STR_MAX` first!
+#define D_STR_RIGHTMAX_NOSPACE D_STR_RIGHT D_STR_MAX // Set `D_STR_MAX` first!
+#define D_STR_LEFT "Sinistra"
+#define D_STR_MAXLEFT D_STR_MAX " " D_STR_LEFT // Set `D_STR_MAX` first!
+#define D_STR_LEFTMAX_NOSPACE D_STR_LEFT D_STR_MAX // Set `D_STR_MAX` first!
+#define D_STR_WIDE "Largo"
+#define D_STR_CENTRE "Centro"
+#define D_STR_TOP "Superiore"
+#define D_STR_BOTTOM "Inferiore"
+// Compound words/phrases/descriptions from pre-defined words.
+// Note: Obviously these need to be defined *after* their component words.
+
+#define D_STR_EYEAUTO D_STR_EYE " " D_STR_AUTO
+#define D_STR_LIGHTTOGGLE D_STR_LIGHT " " D_STR_TOGGLE
+#define D_STR_OUTSIDEQUIET D_STR_OUTSIDE " " D_STR_QUIET
+#define D_STR_POWERTOGGLE D_STR_POWER " " D_STR_TOGGLE
+#define D_STR_SENSORTEMP D_STR_SENSOR " " D_STR_TEMP
+#define D_STR_SLEEP_TIMER D_STR_SLEEP " " D_STR_TIMER
+#define D_STR_SWINGVMODE D_STR_SWINGV " " D_STR_MODE
+#define D_STR_SWINGVTOGGLE D_STR_SWINGV " " D_STR_TOGGLE
+// Separators
+#ifndef D_CHR_TIME_SEP
+#define D_CHR_TIME_SEP '.'
+#endif // D_CHR_TIME_SEP
+
+#define D_STR_SPACELBRACE " ("
+#define D_STR_COMMASPACE ", "
+#define D_STR_COLONSPACE ": "
+
+#define D_STR_DAY "Giorno"
+#define D_STR_DAYS D_STR_DAY "s"
+#define D_STR_HOUR "Ore"
+#define D_STR_HOURS D_STR_HOUR "s"
+#define D_STR_MINUTE "Minuti"
+#define D_STR_MINUTES D_STR_MINUTE "s"
+#define D_STR_SECOND "Secondi"
+#define D_STR_SECONDS D_STR_SECOND "s"
+#define D_STR_NOW "Adesso"
+#define D_STR_THREELETTERDAYS "DomLunMarMerGioVenSab"
+
+#define D_STR_YES "Sì"
+#define D_STR_TRUE "Vero"
+#define D_STR_FALSE "Falso"
+
+#define D_STR_REPEAT "Ripeti"
+#define D_STR_CODE "Codice"
+#define D_STR_BITS "Bit"
+// IRrecvDumpV2
+
+#define D_STR_LIBRARY "Libreria"
+#define D_STR_MESGDESC "Desc. Mess."
+#define D_STR_IRRECVDUMP_STARTUP \
+ "IRrecvDumpV2 è ora attivo e in attesa di segnali IR dal pin %d"
+
+#ifndef D_WARN_BUFFERFULL
+#define D_WARN_BUFFERFULL \
+ "ATTENZIONE: il codice IR è troppo grande per il buffer (>= %d). " \
+ "Non fare affidamento a questi risultati finché questo problema " \
+ "non è risolto." \
+ "Modifica e aumenta `kCaptureBufferSize`."
+#endif // D_WARN_BUFFERFULL
+
+#endif // LOCALE_IT_IT_H_
diff --git a/lib/IRremoteESP8266-2.7.1/test/IRac_test.cpp b/lib/IRremoteESP8266-2.7.4/test/IRac_test.cpp
similarity index 84%
rename from lib/IRremoteESP8266-2.7.1/test/IRac_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/IRac_test.cpp
index 0d8dfdb12..c8c231621 100644
--- a/lib/IRremoteESP8266-2.7.1/test/IRac_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/IRac_test.cpp
@@ -11,6 +11,7 @@
#include "ir_Haier.h"
#include "ir_Hitachi.h"
#include "ir_Kelvinator.h"
+#include "ir_LG.h"
#include "ir_Midea.h"
#include "ir_Mitsubishi.h"
#include "ir_MitsubishiHeavy.h"
@@ -107,29 +108,29 @@ TEST(TestIRac, Coolix) {
"f38000d50" // 38kHz Frequency and 50% duty-cycle.
// Start of message #1 (i.e. Repeat '0')
// Header
- "m4480s4480"
+ "m4692s4416"
// Data
- "m560s1680m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
- "m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s560m560s1680m560s1680m560s560m560s560"
- "m560s1680m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
+ "m552s1656m552s552m552s1656m552s1656m552s552m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s552m552s1656m552s1656m552s552m552s1656"
+ "m552s552m552s552m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s1656m552s1656m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s552m552s1656m552s1656m552s552m552s1656m552s1656m552s552m552s552"
+ "m552s1656m552s552m552s552m552s1656m552s552m552s552m552s1656m552s1656"
// Footer
- "m560s5040"
+ "m552s5244"
// End of message #1 (i.e. Repeat '0')
// Start of message #2 (i.e. Repeat '1')
// Header
- "m4480s4480"
+ "m4692s4416"
// Data
- "m560s1680m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
- "m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s560m560s1680m560s1680m560s560m560s560"
- "m560s1680m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
+ "m552s1656m552s552m552s1656m552s1656m552s552m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s552m552s1656m552s1656m552s552m552s1656"
+ "m552s552m552s552m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s1656m552s1656m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s552m552s1656m552s1656m552s552m552s1656m552s1656m552s552m552s552"
+ "m552s1656m552s552m552s552m552s1656m552s552m552s552m552s1656m552s1656"
// Footer
- "m560s105040",
+ "m552s105244",
// End of message #2 (i.e. Repeat '1')
// Note: the two messages (#1 & #2) are identical.
ac._irsend.outputStr());
@@ -331,21 +332,24 @@ TEST(TestIRac, Daikin216) {
}
TEST(TestIRac, Electra) {
- IRElectraAc ac(0);
- IRac irac(0);
- IRrecv capture(0);
+ IRElectraAc ac(kGpioUnused);
+ IRac irac(kGpioUnused);
+ IRrecv capture(kGpioUnused);
char expected[] =
"Power: On, Mode: 6 (Fan), Temp: 26C, Fan: 1 (High), "
- "Swing(V): On, Swing(H): On";
+ "Swing(V): On, Swing(H): On, Light: Toggle, Clean: On, Turbo: On";
ac.begin();
irac.electra(&ac,
- true, // Power
- stdAc::opmode_t::kFan, // Mode
- 26, // Celsius
- stdAc::fanspeed_t::kHigh, // Fan speed
- stdAc::swingv_t::kAuto, // Veritcal swing
- stdAc::swingh_t::kLeft); // Horizontal swing
+ true, // Power
+ stdAc::opmode_t::kFan, // Mode
+ 26, // Celsius
+ stdAc::fanspeed_t::kHigh, // Fan speed
+ stdAc::swingv_t::kAuto, // Veritcal swing
+ stdAc::swingh_t::kLeft, // Horizontal swing
+ true, // Turbo
+ true, // Light (toggle)
+ true); // Clean
ASSERT_EQ(expected, ac.toString());
ac._irsend.makeDecodeResult();
EXPECT_TRUE(capture.decode(&ac._irsend.capture));
@@ -640,6 +644,30 @@ TEST(TestIRac, Kelvinator) {
ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture));
}
+TEST(TestIRac, LG) {
+ IRLgAc ac(0);
+ IRac irac(0);
+ IRrecv capture(0);
+ char expected[] =
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 1 (Dry), Temp: 27C, Fan: 2 (Medium)";
+
+ ac.begin();
+ irac.lg(&ac,
+ lg_ac_remote_model_t::GE6711AR2853M, // Model
+ true, // Power
+ stdAc::opmode_t::kDry, // Mode
+ 27, // Degrees C
+ stdAc::fanspeed_t::kMedium); // Fan speed
+
+ ASSERT_EQ(expected, ac.toString());
+ ac._irsend.makeDecodeResult();
+ EXPECT_TRUE(capture.decode(&ac._irsend.capture));
+ ASSERT_EQ(LG, ac._irsend.capture.decode_type);
+ ASSERT_EQ(kLgBits, ac._irsend.capture.bits);
+ ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture));
+}
+
TEST(TestIRac, Midea) {
IRMideaAC ac(0);
IRac irac(0);
@@ -826,6 +854,7 @@ TEST(TestIRac, Panasonic) {
stdAc::swingh_t::kLeft, // Horizontal swing
true, // Quiet
false, // Turbo
+ false, // Filter
19 * 60 + 17); // Clock
ASSERT_EQ(expected_nke, ac.toString());
ac._irsend.makeDecodeResult();
@@ -837,7 +866,8 @@ TEST(TestIRac, Panasonic) {
char expected_dke[] =
"Model: 3 (DKE), Power: On, Mode: 3 (Cool), Temp: 18C, Fan: 4 (High), "
"Swing(V): 2 (High), Swing(H): 6 (Middle), "
- "Quiet: Off, Powerful: On, Clock: 19:17, On Timer: Off, Off Timer: Off";
+ "Quiet: Off, Powerful: On, Ion: On, "
+ "Clock: 19:17, On Timer: Off, Off Timer: Off";
ac._irsend.reset();
irac.panasonic(&ac,
kPanasonicDke, // Model
@@ -849,6 +879,7 @@ TEST(TestIRac, Panasonic) {
stdAc::swingh_t::kMiddle, // Horizontal swing
false, // Quiet
true, // Turbo
+ true, // Filter
19 * 60 + 17); // Clock
ASSERT_EQ(expected_dke, ac.toString());
ac._irsend.makeDecodeResult();
@@ -864,7 +895,7 @@ TEST(TestIRac, Samsung) {
IRrecv capture(0);
char expected[] =
"Power: On, Mode: 0 (Auto), Temp: 28C, Fan: 6 (Auto), Swing: On, "
- "Beep: On, Clean: On, Quiet: On, Powerful: Off";
+ "Beep: On, Clean: On, Quiet: On, Powerful: Off, Light: On, Ion: Off";
ac.begin();
irac.samsung(&ac,
@@ -875,6 +906,8 @@ TEST(TestIRac, Samsung) {
stdAc::swingv_t::kAuto, // Veritcal swing
true, // Quiet
false, // Turbo
+ true, // Light (Display)
+ false, // Filter (Ion)
true, // Clean
true, // Beep
true, // Previous power state
@@ -895,6 +928,8 @@ TEST(TestIRac, Samsung) {
stdAc::swingv_t::kAuto, // Veritcal swing
true, // Quiet
false, // Turbo
+ true, // Light (Display)
+ false, // Filter (Ion)
true, // Clean
true, // Beep
true, // Previous power state
@@ -908,7 +943,7 @@ TEST(TestIRac, Samsung) {
// desired state.
char expected_on[] =
"Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 0 (Auto), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off";
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off";
ASSERT_EQ(expected_on, IRAcUtils::resultAcToString(&ac._irsend.capture));
}
@@ -1450,38 +1485,186 @@ TEST(TestIRac, Issue821) {
ASSERT_EQ("Power: On, Light: Toggle",
IRAcUtils::resultAcToString(&ac._irsend.capture));
EXPECT_EQ(
- "f38000d50m"
- "4480s4480"
- "m560s1680m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s560m560s560m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s1680m560s560m560s1680m560s560"
- "m560s5040"
- "m4480s4480"
- "m560s1680m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s560m560s560m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s1680m560s560m560s1680m560s560"
- "m560s105040"
- "m4480s4480"
- "m560s1680m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
- "m560s560m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s560m560s560m560s1680m560s560m560s560m560s560"
- "m560s1680m560s560m560s1680m560s1680m560s560m560s1680m560s1680m560s1680"
- "m560s5040"
- "m4480s4480"
- "m560s1680m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
- "m560s560m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s560m560s560m560s1680m560s560m560s560m560s560"
- "m560s1680m560s560m560s1680m560s1680m560s560m560s1680m560s1680m560s1680"
- "m560s105040",
+ "f38000d50"
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s552m552s552m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s1656m552s552m552s1656m552s552"
+ "m552s5244"
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s552m552s552m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s1656m552s552m552s1656m552s552"
+ "m552s105244"
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s1656m552s552m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s552m552s1656m552s1656m552s552m552s1656"
+ "m552s552m552s552m552s552m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s1656m552s1656m552s1656m552s552m552s552m552s552m552s552m552s552"
+ "m552s552m552s1656m552s552m552s552m552s1656m552s552m552s552m552s552"
+ "m552s1656m552s552m552s1656m552s1656m552s552m552s1656m552s1656m552s1656"
+ "m552s5244"
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s1656m552s552m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s552m552s1656m552s1656m552s552m552s1656"
+ "m552s552m552s552m552s552m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s1656m552s1656m552s1656m552s552m552s552m552s552m552s552m552s552"
+ "m552s552m552s1656m552s552m552s552m552s1656m552s552m552s552m552s552"
+ "m552s1656m552s552m552s1656m552s1656m552s552m552s1656m552s1656m552s1656"
+ "m552s105244",
ac._irsend.outputStr());
}
+
+// Check power toggling in Whirlpool common a/c handling.
+TEST(TestIRac, Issue1001) {
+ stdAc::state_t desired; // New desired state
+ stdAc::state_t prev; // Previously desired state
+ stdAc::state_t result; // State we need to send to get to `desired`
+ prev.protocol = decode_type_t::WHIRLPOOL_AC;
+ prev.model = 1;
+ prev.power = true;
+ prev.mode = stdAc::opmode_t::kAuto;
+ prev.degrees = 24;
+ prev.celsius = true;
+ prev.fanspeed = stdAc::fanspeed_t::kAuto;
+ prev.swingv = stdAc::swingv_t::kOff;
+ prev.swingh = stdAc::swingh_t::kOff;
+ prev.quiet = false;
+ prev.turbo = false;
+ prev.econo = false;
+ prev.light = false;
+ prev.filter = false;
+ prev.clean = false;
+ prev.beep = false;
+ prev.sleep = -1;
+
+ desired = prev;
+ desired.power = false;
+
+ IRac irac(0);
+ IRrecv capture(0);
+ IRWhirlpoolAc ac(0);
+
+ ac.begin();
+ ASSERT_TRUE(prev.power);
+ ASSERT_FALSE(desired.power);
+ result = irac.handleToggles(irac.cleanState(desired), &prev);
+ ASSERT_TRUE(result.power);
+ irac.sendAc(desired, &prev);
+ ASSERT_FALSE(desired.power);
+ irac.whirlpool(&ac,
+ (whirlpool_ac_remote_model_t)result.model, // Model
+ result.power, // Power
+ result.mode, // Mode
+ result.degrees, // Celsius
+ result.fanspeed, // Fan speed
+ result.swingv, // Veritcal swing
+ result.turbo, // Turbo
+ result.light, // Light
+ result.sleep); // Sleep
+ ac._irsend.makeDecodeResult();
+ EXPECT_TRUE(capture.decode(&ac._irsend.capture));
+ ASSERT_EQ(WHIRLPOOL_AC, ac._irsend.capture.decode_type);
+ ASSERT_EQ(kWhirlpoolAcBits, ac._irsend.capture.bits);
+ ASSERT_EQ("Model: 1 (DG11J13A), Power Toggle: On, Mode: 1 (Auto), Temp: 24C, "
+ "Fan: 0 (Auto), Swing: Off, Light: Off, Clock: 00:00, "
+ "On Timer: Off, Off Timer: Off, Sleep: Off, Super: Off, "
+ "Command: 1 (Power)",
+ IRAcUtils::resultAcToString(&ac._irsend.capture));
+
+ // Now check if the mode is set to "Off" instead of just change to power off.
+ // i.e. How Home Assistant expects things to work.
+ ac._irsend.reset();
+ desired.power = true;
+ desired.mode = stdAc::opmode_t::kOff;
+ result = irac.handleToggles(irac.cleanState(desired), &prev);
+ ASSERT_TRUE(result.power);
+ irac.sendAc(desired, &prev);
+ ASSERT_TRUE(desired.power);
+ irac.whirlpool(&ac,
+ (whirlpool_ac_remote_model_t)result.model, // Model
+ result.power, // Power
+ result.mode, // Mode
+ result.degrees, // Celsius
+ result.fanspeed, // Fan speed
+ result.swingv, // Veritcal swing
+ result.turbo, // Turbo
+ result.light, // Light
+ result.sleep); // Sleep
+ ac._irsend.makeDecodeResult();
+ EXPECT_TRUE(capture.decode(&ac._irsend.capture));
+ ASSERT_EQ(WHIRLPOOL_AC, ac._irsend.capture.decode_type);
+ ASSERT_EQ(kWhirlpoolAcBits, ac._irsend.capture.bits);
+ ASSERT_EQ("Model: 1 (DG11J13A), Power Toggle: On, Mode: 1 (Auto), Temp: 24C, "
+ "Fan: 0 (Auto), Swing: Off, Light: Off, Clock: 00:00, "
+ "On Timer: Off, Off Timer: Off, Sleep: Off, Super: Off, "
+ "Command: 1 (Power)",
+ IRAcUtils::resultAcToString(&ac._irsend.capture));
+}
+
+// Check power switching in Daikin2 common a/c handling when from an IR message.
+TEST(TestIRac, Issue1035) {
+ stdAc::state_t prev; // Previously desired state
+ stdAc::state_t result; // State we need to send to get to `desired`
+ prev.protocol = decode_type_t::DAIKIN2;
+ prev.model = -1;
+ prev.power = false;
+ prev.mode = stdAc::opmode_t::kAuto;
+ prev.degrees = 24;
+ prev.celsius = true;
+ prev.fanspeed = stdAc::fanspeed_t::kAuto;
+ prev.swingv = stdAc::swingv_t::kOff;
+ prev.swingh = stdAc::swingh_t::kOff;
+ prev.quiet = false;
+ prev.turbo = false;
+ prev.econo = false;
+ prev.light = false;
+ prev.filter = false;
+ prev.clean = false;
+ prev.beep = false;
+ prev.sleep = -1;
+
+ // https://github.com/crankyoldgit/IRremoteESP8266/issues/1035#issuecomment-580963572
+ const uint8_t on_code[kDaikin2StateLength] = {
+ 0x11, 0xDA, 0x27, 0x00, 0x01, 0x15, 0x43, 0x90, 0x29, 0x0C, 0x80, 0x04,
+ 0xC0, 0x16, 0x24, 0x00, 0x00, 0xBE, 0xC1, 0x2D, 0x11, 0xDA, 0x27, 0x00,
+ 0x00, 0x09, 0x2A, 0x00, 0xB0, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0xC1,
+ 0x90, 0x60, 0x0C};
+ const uint8_t off_code[kDaikin2StateLength] = {
+ 0x11, 0xDA, 0x27, 0x00, 0x01, 0x15, 0xC3, 0x90, 0x29, 0x0C, 0x80, 0x04,
+ 0xC0, 0x16, 0x24, 0x00, 0x00, 0xBE, 0xD1, 0xBD, 0x11, 0xDA, 0x27, 0x00,
+ 0x00, 0x08, 0x2A, 0x00, 0xB0, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0xC1,
+ 0x90, 0x60, 0x0B};
+
+ IRac irac(kGpioUnused);
+ IRrecv capture(kGpioUnused);
+ IRDaikin2 ac(kGpioUnused);
+
+ ac.begin();
+ ac.setRaw(on_code);
+ ac.send();
+ ac._irsend.makeDecodeResult();
+ ASSERT_TRUE(capture.decode(&ac._irsend.capture));
+ ASSERT_EQ(DAIKIN2, ac._irsend.capture.decode_type);
+ ASSERT_FALSE(prev.power);
+ ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &result, &prev));
+ ASSERT_TRUE(result.power);
+
+ prev = result;
+
+ ac._irsend.reset();
+ ac.setRaw(off_code);
+ ac.send();
+ ac._irsend.makeDecodeResult();
+ ASSERT_TRUE(capture.decode(&ac._irsend.capture));
+ ASSERT_EQ(DAIKIN2, ac._irsend.capture.decode_type);
+ ASSERT_TRUE(prev.power);
+ ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &result, &prev));
+ ASSERT_FALSE(result.power);
+}
diff --git a/lib/IRremoteESP8266-2.7.1/test/IRrecv_test.cpp b/lib/IRremoteESP8266-2.7.4/test/IRrecv_test.cpp
similarity index 70%
rename from lib/IRremoteESP8266-2.7.1/test/IRrecv_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/IRrecv_test.cpp
index cda7b747f..fa025a2cb 100644
--- a/lib/IRremoteESP8266-2.7.1/test/IRrecv_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/IRrecv_test.cpp
@@ -168,7 +168,8 @@ TEST(TestDecode, DecodePanasonic) {
irsend.reset();
irsend.sendPanasonic64(0x40040190ED7C);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
@@ -565,8 +566,8 @@ TEST(TestMatchGeneric, NormalWithNoAtleast) {
IRrecv irrecv(1);
irsend.begin();
- uint16_t good_entries_trailing_space = 12;
- uint16_t good_trailing_space_data[good_entries_trailing_space] = {
+ const uint16_t kgood_entries_trailing_space = 12;
+ uint16_t good_trailing_space_data[kgood_entries_trailing_space] = {
8000, // Header mark
4000, // Header space
500, 2000, // Bit #0 (1)
@@ -576,8 +577,8 @@ TEST(TestMatchGeneric, NormalWithNoAtleast) {
3000, // Footer mark
15000}; // Footer space
- uint16_t good_entries_no_trailing_space = 11;
- uint16_t good_no_trailing_space_data[good_entries_no_trailing_space] = {
+ const uint16_t kgood_entries_no_trailing_space = 11;
+ uint16_t good_no_trailing_space_data[kgood_entries_no_trailing_space] = {
8000, // Header mark
4000, // Header space
500, 2000, // Bit #0 (1)
@@ -588,7 +589,7 @@ TEST(TestMatchGeneric, NormalWithNoAtleast) {
uint16_t offset = kStartOffset;
irsend.reset();
- irsend.sendRaw(good_trailing_space_data, good_entries_trailing_space, 38000);
+ irsend.sendRaw(good_trailing_space_data, kgood_entries_trailing_space, 38000);
irsend.makeDecodeResult();
uint64_t result_data = 0;
uint16_t entries_used = 0;
@@ -607,7 +608,7 @@ TEST(TestMatchGeneric, NormalWithNoAtleast) {
ASSERT_NE(0, entries_used);
EXPECT_EQ(0b1010, result_data);
EXPECT_EQ(irsend.capture.rawlen - kStartOffset, entries_used);
- EXPECT_EQ(good_entries_trailing_space, entries_used);
+ EXPECT_EQ(kgood_entries_trailing_space, entries_used);
// Same again but with a footer space mis-match, which should fail.
result_data = 0;
@@ -628,7 +629,7 @@ TEST(TestMatchGeneric, NormalWithNoAtleast) {
// Same again as first part but with no footer space data as the last entry.
irsend.reset();
result_data = 0;
- irsend.sendRaw(good_no_trailing_space_data, good_entries_no_trailing_space,
+ irsend.sendRaw(good_no_trailing_space_data, kgood_entries_no_trailing_space,
38000);
irsend.makeDecodeResult();
entries_used = irrecv.matchGeneric(
@@ -646,7 +647,7 @@ TEST(TestMatchGeneric, NormalWithNoAtleast) {
ASSERT_NE(0, entries_used);
EXPECT_EQ(0b1010, result_data);
EXPECT_EQ(irsend.capture.rawlen - kStartOffset, entries_used);
- EXPECT_EQ(good_entries_no_trailing_space, entries_used);
+ EXPECT_EQ(kgood_entries_no_trailing_space, entries_used);
}
@@ -655,8 +656,8 @@ TEST(TestMatchGeneric, NormalWithAtleast) {
IRrecv irrecv(1);
irsend.begin();
- uint16_t good_entries_trailing_space = 12;
- uint16_t good_trailing_space_data[good_entries_trailing_space] = {
+ const uint16_t kgood_entries_trailing_space = 12;
+ uint16_t good_trailing_space_data[kgood_entries_trailing_space] = {
8000, // Header mark
4000, // Header space
500, 2000, // Bit #0 (1)
@@ -666,8 +667,8 @@ TEST(TestMatchGeneric, NormalWithAtleast) {
3000, // Footer mark
15000}; // Footer space
- uint16_t good_entries_no_trailing_space = 11;
- uint16_t good_no_trailing_space_data[good_entries_no_trailing_space] = {
+ const uint16_t kgood_entries_no_trailing_space = 11;
+ uint16_t good_no_trailing_space_data[kgood_entries_no_trailing_space] = {
8000, // Header mark
4000, // Header space
500, 2000, // Bit #0 (1)
@@ -678,7 +679,7 @@ TEST(TestMatchGeneric, NormalWithAtleast) {
uint16_t offset = kStartOffset;
irsend.reset();
- irsend.sendRaw(good_trailing_space_data, good_entries_trailing_space, 38000);
+ irsend.sendRaw(good_trailing_space_data, kgood_entries_trailing_space, 38000);
irsend.makeDecodeResult();
uint64_t result_data = 0;
uint16_t entries_used = 0;
@@ -697,7 +698,7 @@ TEST(TestMatchGeneric, NormalWithAtleast) {
ASSERT_NE(0, entries_used);
EXPECT_EQ(0b1010, result_data);
EXPECT_EQ(irsend.capture.rawlen - kStartOffset, entries_used);
- EXPECT_EQ(good_entries_trailing_space, entries_used);
+ EXPECT_EQ(kgood_entries_trailing_space, entries_used);
// Same again but with a footer space under-match.
result_data = 0;
@@ -716,7 +717,7 @@ TEST(TestMatchGeneric, NormalWithAtleast) {
ASSERT_NE(0, entries_used);
EXPECT_EQ(0b1010, result_data);
EXPECT_EQ(irsend.capture.rawlen - kStartOffset, entries_used);
- EXPECT_EQ(good_entries_trailing_space, entries_used);
+ EXPECT_EQ(kgood_entries_trailing_space, entries_used);
// Same again but with a footer space under-match using less bits so the
// atleast footer isn't the last entry in the buffer.
@@ -737,7 +738,7 @@ TEST(TestMatchGeneric, NormalWithAtleast) {
EXPECT_EQ(0b101, result_data);
// -2 because we reduced nbits by 1.
EXPECT_EQ(irsend.capture.rawlen - kStartOffset - 2, entries_used);
- EXPECT_EQ(good_entries_trailing_space - 2, entries_used);
+ EXPECT_EQ(kgood_entries_trailing_space - 2, entries_used);
// Same again but with a footer space over-match, which should fail.
result_data = 0;
@@ -758,7 +759,7 @@ TEST(TestMatchGeneric, NormalWithAtleast) {
// Same as first part but with no footer space data as the last entry.
irsend.reset();
result_data = 0;
- irsend.sendRaw(good_no_trailing_space_data, good_entries_no_trailing_space,
+ irsend.sendRaw(good_no_trailing_space_data, kgood_entries_no_trailing_space,
38000);
irsend.makeDecodeResult();
entries_used = irrecv.matchGeneric(
@@ -776,7 +777,7 @@ TEST(TestMatchGeneric, NormalWithAtleast) {
ASSERT_NE(0, entries_used);
EXPECT_EQ(0b1010, result_data);
EXPECT_EQ(irsend.capture.rawlen - kStartOffset, entries_used);
- EXPECT_EQ(good_entries_no_trailing_space, entries_used);
+ EXPECT_EQ(kgood_entries_no_trailing_space, entries_used);
}
TEST(TestMatchGeneric, FailureCases) {
@@ -784,8 +785,8 @@ TEST(TestMatchGeneric, FailureCases) {
IRrecv irrecv(1);
irsend.begin();
- uint16_t entries = 11;
- uint16_t data[entries] = {
+ const uint16_t kentries = 11;
+ uint16_t data[kentries] = {
8000, // Header mark
4000, // Header space
500, 2000, // Bit #0 (1)
@@ -796,7 +797,7 @@ TEST(TestMatchGeneric, FailureCases) {
uint16_t offset = kStartOffset;
irsend.reset();
- irsend.sendRaw(data, entries, 38000);
+ irsend.sendRaw(data, kentries, 38000);
irsend.makeDecodeResult();
uint16_t entries_used = 0;
@@ -942,8 +943,8 @@ TEST(TestMatchGeneric, MissingHeaderFooter) {
IRrecv irrecv(1);
irsend.begin();
- uint16_t entries = 11;
- uint16_t data[entries] = {
+ const uint16_t kentries = 11;
+ uint16_t data[kentries] = {
8000, // Header mark
4000, // Header space
500, 2000, // Bit #0 (1)
@@ -954,7 +955,7 @@ TEST(TestMatchGeneric, MissingHeaderFooter) {
uint16_t offset = kStartOffset;
irsend.reset();
- irsend.sendRaw(data, entries, 38000);
+ irsend.sendRaw(data, kentries, 38000);
irsend.makeDecodeResult();
uint16_t entries_used = 0;
@@ -976,7 +977,7 @@ TEST(TestMatchGeneric, MissingHeaderFooter) {
ASSERT_NE(0, entries_used);
EXPECT_EQ(0b1010, result_data);
EXPECT_EQ(irsend.capture.rawlen - kStartOffset - 1, entries_used);
- EXPECT_EQ(entries - 1, entries_used);
+ EXPECT_EQ(kentries - 1, entries_used);
// No header match (should fail)
entries_used = irrecv.matchGeneric(
@@ -1010,7 +1011,7 @@ TEST(TestMatchGeneric, MissingHeaderFooter) {
ASSERT_NE(0, entries_used);
EXPECT_EQ(0b1010, result_data);
EXPECT_EQ(irsend.capture.rawlen - offset, entries_used);
- EXPECT_EQ(entries - 2, entries_used);
+ EXPECT_EQ(kentries - 2, entries_used);
}
TEST(TestMatchGeneric, BitOrdering) {
@@ -1018,8 +1019,8 @@ TEST(TestMatchGeneric, BitOrdering) {
IRrecv irrecv(1);
irsend.begin();
- uint16_t entries = 11;
- uint16_t data[entries] = {
+ const uint16_t kentries = 11;
+ uint16_t data[kentries] = {
8000, // Header mark
4000, // Header space
500, 2000, // Bit #0 (1)
@@ -1030,7 +1031,7 @@ TEST(TestMatchGeneric, BitOrdering) {
uint16_t offset = kStartOffset;
irsend.reset();
- irsend.sendRaw(data, entries, 38000);
+ irsend.sendRaw(data, kentries, 38000);
irsend.makeDecodeResult();
uint16_t entries_used = 0;
@@ -1052,7 +1053,7 @@ TEST(TestMatchGeneric, BitOrdering) {
ASSERT_NE(0, entries_used);
EXPECT_EQ(0b1010, result_data);
EXPECT_EQ(irsend.capture.rawlen - kStartOffset, entries_used);
- EXPECT_EQ(entries, entries_used);
+ EXPECT_EQ(kentries, entries_used);
// LSB order
entries_used = irrecv.matchGeneric(
@@ -1070,7 +1071,7 @@ TEST(TestMatchGeneric, BitOrdering) {
ASSERT_NE(0, entries_used);
EXPECT_EQ(0b0101, result_data);
EXPECT_EQ(irsend.capture.rawlen - kStartOffset, entries_used);
- EXPECT_EQ(entries, entries_used);
+ EXPECT_EQ(kentries, entries_used);
}
TEST(TestMatchGeneric, UsingBytes) {
@@ -1078,8 +1079,8 @@ TEST(TestMatchGeneric, UsingBytes) {
IRrecv irrecv(1);
irsend.begin();
- uint16_t entries = 32;
- uint16_t data[entries] = {
+ const uint16_t kentries = 32;
+ uint16_t data[kentries] = {
// No header
500, 2000, // Byte #0 Bit #0 (1)
500, 1000, // Byte #0 Bit #1 (0)
@@ -1100,7 +1101,7 @@ TEST(TestMatchGeneric, UsingBytes) {
uint16_t offset = kStartOffset;
irsend.reset();
- irsend.sendRaw(data, entries, 38000);
+ irsend.sendRaw(data, kentries, 38000);
irsend.makeDecodeResult();
uint16_t entries_used = 0;
@@ -1123,7 +1124,7 @@ TEST(TestMatchGeneric, UsingBytes) {
EXPECT_EQ(0b10101010, result_data[0]);
EXPECT_EQ(0b11110000, result_data[1]);
EXPECT_EQ(irsend.capture.rawlen - kStartOffset, entries_used);
- EXPECT_EQ(entries, entries_used);
+ EXPECT_EQ(kentries, entries_used);
// LSB order
entries_used = irrecv.matchGeneric(
@@ -1142,7 +1143,7 @@ TEST(TestMatchGeneric, UsingBytes) {
EXPECT_EQ(0b01010101, result_data[0]);
EXPECT_EQ(0b00001111, result_data[1]);
EXPECT_EQ(irsend.capture.rawlen - kStartOffset, entries_used);
- EXPECT_EQ(entries, entries_used);
+ EXPECT_EQ(kentries, entries_used);
// Asking for too much.
entries_used = irrecv.matchGeneric(
@@ -1244,3 +1245,347 @@ TEST(TestIRrecv, Tolerance) {
result = irrecv.matchData(irsend.capture.rawbuf + 1, 5, 1500, 500, 500, 1500);
ASSERT_FALSE(result.success);
}
+
+TEST(TestDecode, SkippingInDecode) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ // Normal (default) usage.
+ irsend.reset();
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+
+ // Explicitly use the default (no skipping)
+ irsend.reset();
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ // Enable the least amount of actual skipping.
+ // Should still decode normal data.
+ irsend.reset();
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 1));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+
+ // Crank up the amount of actual skipping.
+ // Should still decode normal data.
+ irsend.reset();
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 10));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+
+ // Introduce some noise before the actual message.
+
+ // Should not match as NEC anymore.
+ irsend.reset();
+ irsend.mark(60);
+ irsend.space(60);
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_NE(NEC, irsend.capture.decode_type);
+ // Now with explicit default options set.
+ irsend.reset();
+ irsend.mark(60);
+ irsend.space(60);
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0));
+ EXPECT_NE(NEC, irsend.capture.decode_type);
+
+ // Now with 1 skip, which it should match as NEC as there is only one
+ // mark + space pair of noise.
+ irsend.reset();
+ irsend.mark(60);
+ irsend.space(60);
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 1));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+
+ // Now with more than 1 skip, which it should match as NEC as there is only
+ // one mark + space pair of noise.
+ irsend.reset();
+ irsend.mark(60);
+ irsend.space(60);
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 5));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+
+ // Test multiple noise pairs.
+
+ irsend.reset();
+ irsend.mark(160);
+ irsend.space(60);
+ irsend.mark(60);
+ irsend.space(160);
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ // Default decode parameters should fail to detect as NEC.
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_NE(NEC, irsend.capture.decode_type);
+ // A single skip should fail to detect as NEC, as there are two pairs of noise
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 1));
+ EXPECT_NE(NEC, irsend.capture.decode_type);
+ // However, two skips should match it correctly.
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 2));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ // And so should more than 2 skips.
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 10));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+}
+
+TEST(TestCrudeNoiseFilter, General) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ // Normal (default) usage.
+ irsend.reset();
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ EXPECT_EQ(69, irsend.capture.rawlen);
+
+ // Explicitly no filtering.
+ irsend.reset();
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 0));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ EXPECT_EQ(69, irsend.capture.rawlen);
+
+ // Filter out anything less than 100usecs of which there should be none.
+ irsend.reset();
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 100));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ EXPECT_EQ(69, irsend.capture.rawlen);
+
+ // Add small noise at the start, but don't filter it
+ irsend.reset();
+ irsend.mark(60);
+ irsend.space(60);
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 0));
+ EXPECT_NE(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(69 + 2, irsend.capture.rawlen);
+
+ // Add small noise at the start, but filter it this time
+ irsend.reset();
+ irsend.mark(60);
+ irsend.space(60);
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 100));
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ EXPECT_EQ(69, irsend.capture.rawlen);
+
+ irsend.reset();
+ irsend.mark(60); // Less than the filter floor.
+ irsend.space(560);
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 100));
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ EXPECT_EQ(69, irsend.capture.rawlen);
+
+ irsend.reset();
+ irsend.mark(100); // Higher than the filter floor.
+ irsend.space(200); // Higher than the filter floor.
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 100));
+ EXPECT_NE(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(69 + 2, irsend.capture.rawlen);
+
+ irsend.reset();
+ irsend.mark(160); // Higher than the filter floor.
+ irsend.space(60); // Lower than the filter floor.
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 100));
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ EXPECT_EQ(69, irsend.capture.rawlen);
+
+ // Multiple noise at the start
+ irsend.reset();
+ irsend.mark(60); // Lower than the filter floor.
+ irsend.space(60); // Lower than the filter floor.
+ irsend.mark(60); // Lower than the filter floor.
+ irsend.space(60); // Lower than the filter floor.
+ irsend.mark(60); // Lower than the filter floor.
+ irsend.space(60); // Lower than the filter floor.
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 100));
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ EXPECT_EQ(69, irsend.capture.rawlen);
+
+ // A mix of noise that should be removed.
+ irsend.reset();
+ irsend.mark(60); // Lower than the filter floor.
+ irsend.space(160); // Higher than the filter floor.
+ irsend.mark(160); // Higher than the filter floor.
+ irsend.space(60); // Lower than the filter floor.
+ irsend.mark(160); // Higher than the filter floor.
+ irsend.space(60); // Lower than the filter floor.
+ irsend.sendNEC(0x4BB640BF);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 100));
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ EXPECT_EQ(69, irsend.capture.rawlen);
+
+ // Add noise that should be removed to the end of a message.
+ irsend.reset();
+ irsend.sendNEC(0x4BB640BF);
+ irsend.mark(60); // Lower than the filter floor.
+ irsend.space(160); // Higher than the filter floor.
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 100));
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x4BB640BF, irsend.capture.value);
+ EXPECT_EQ(69, irsend.capture.rawlen);
+}
+
+TEST(TestCrudeNoiseFilter, NoiseMidSample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1042#issuecomment-583895303
+ uint16_t rawData[71] = {
+ 482, 1370, 9082, 1558, 342, 2514, 662, 470, 660, 468, 658, 1588, 662, 466,
+ 662, 466, 662, 466, 662, 466, 662, 466, 662, 1586, 660, 1588, 662, 466,
+ 662, 1588, 662, 1586, 662, 1586, 660, 1588, 662, 1586, 662, 468, 660,
+ 1588, 662, 468, 662, 466, 660, 466, 662, 464, 662, 466, 662, 466, 662,
+ 1588, 660, 466, 662, 1586, 662, 1588, 660, 1586, 662, 1586, 662, 1586,
+ 664, 1594, 662}; // UNKNOWN B0784C9E
+
+ irsend.reset();
+ irsend.sendRaw(rawData, 71, 38);
+ irsend.makeDecodeResult();
+ // Try with no filter first.
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 1, 0));
+ EXPECT_NE(NEC, irsend.capture.decode_type);
+ const uint16_t prev_length = irsend.capture.rawlen;
+ // Now with the filter set to 350, to remove the 342 mark at rawData[4].
+ // Note: a mark of 350us is huge.
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 1, 350));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x20DF40BF, irsend.capture.value);
+ EXPECT_EQ(prev_length - 2, irsend.capture.rawlen);
+ EXPECT_EQ(
+ "uint16_t rawData[69] = {482, 1370, 9082, 4414, 662, 470, 660, 468, "
+ "658, 1588, 662, 466, 662, 466, 662, 466, 662, 466, 662, 466, 662, "
+ "1586, 660, 1588, 662, 466, 662, 1588, 662, 1586, 662, 1586, 660, "
+ "1588, 662, 1586, 662, 468, 660, 1588, 662, 468, 662, 466, 660, "
+ "466, 662, 464, 662, 466, 662, 466, 662, 1588, 660, 466, 662, "
+ "1586, 662, 1588, 660, 1586, 662, 1586, 662, 1586, 664, 1594, "
+ "662}; // NEC 20DF40BF\n"
+ "uint32_t address = 0x4;\n"
+ "uint32_t command = 0x2;\n"
+ "uint64_t data = 0x20DF40BF;\n",
+ resultToSourceCode(&irsend.capture));
+
+ // Data modified as rawData2[3] which was 882 is too far out of spec. for a
+ // NEC bit mark.
+ uint16_t rawData2[7] = {
+ 9066, 2026, 600, 13906, 222, 992, 734}; // UNKNOWN 8FDE36A7
+ irsend.reset();
+ irsend.sendRaw(rawData2, 7, 38);
+ irsend.makeDecodeResult();
+ // Try with no filter first.
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 0));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(0, irsend.capture.bits);
+ EXPECT_TRUE(irsend.capture.repeat);
+ // Now with the filter set to 250, to remove the 222 mark at rawData2[4].
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 350));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(0, irsend.capture.bits);
+ EXPECT_TRUE(irsend.capture.repeat);
+ EXPECT_EQ(
+ "uint16_t rawData[5] = {9066, 2026, 600, 15120, 734}; "
+ "// NEC (Repeat) FFFFFFFFFFFFFFFF\n"
+ "uint64_t data = 0xFFFFFFFFFFFFFFFF;\n",
+ resultToSourceCode(&irsend.capture));
+}
+
+TEST(TestCrudeNoiseFilter, NoiseAtEndOfSample) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(1);
+ irsend.begin();
+
+ // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1042#issuecomment-583895303
+ uint16_t rawData[69] = { // UNKNOWN B52869E1
+ 9078, 4386, 662, 468, 660, 466, 662, 1588, 660, 468, 660, 468, 662, 466,
+ 662, 466, 662, 466, 662, 1588, 660, 1588, 660, 466, 662, 1590, 660, 1586,
+ 662, 1586, 662, 1588, 662, 1584, 662, 1588, 662, 1588, 660, 466, 686, 442,
+ 662, 466, 662, 466, 662, 466, 662, 468, 662, 466, 662, 466, 662, 1586,
+ 662, 1588, 662, 1586, 644, 1600, 662, 1586, 688, 1566, 684, 2638, 146};
+ irsend.reset();
+ irsend.sendRaw(rawData, 69, 38);
+ irsend.makeDecodeResult();
+ // Try with no filter first.
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 0));
+ EXPECT_NE(NEC, irsend.capture.decode_type);
+ const uint16_t prev_length = irsend.capture.rawlen;
+
+ // Now with the filter set to 200, to remove the 146 mark at at the end.
+ EXPECT_TRUE(irrecv.decode(&irsend.capture, NULL, 0, 200));
+ EXPECT_EQ(NEC, irsend.capture.decode_type);
+ EXPECT_EQ(kNECBits, irsend.capture.bits);
+ EXPECT_EQ(0x20DFC03F, irsend.capture.value);
+ EXPECT_EQ(prev_length - 2, irsend.capture.rawlen);
+ EXPECT_EQ(
+ "uint16_t rawData[67] = {9078, 4386, 662, 468, 660, 466, 662, 1588, "
+ "660, 468, 660, 468, 662, 466, 662, 466, 662, 466, 662, 1588, 660, "
+ "1588, 660, 466, 662, 1590, 660, 1586, 662, 1586, 662, 1588, 662, "
+ "1584, 662, 1588, 662, 1588, 660, 466, 686, 442, 662, 466, 662, "
+ "466, 662, 466, 662, 468, 662, 466, 662, 466, 662, 1586, 662, 1588,"
+ " 662, 1586, 644, 1600, 662, 1586, 688, 1566, 684}; "
+ "// NEC 20DFC03F\n"
+ "uint32_t address = 0x4;\n"
+ "uint32_t command = 0x3;\n"
+ "uint64_t data = 0x20DFC03F;\n",
+ resultToSourceCode(&irsend.capture));
+}
diff --git a/lib/IRremoteESP8266-2.7.1/test/IRrecv_test.h b/lib/IRremoteESP8266-2.7.4/test/IRrecv_test.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/IRrecv_test.h
rename to lib/IRremoteESP8266-2.7.4/test/IRrecv_test.h
diff --git a/lib/IRremoteESP8266-2.7.1/test/IRsend_test.cpp b/lib/IRremoteESP8266-2.7.4/test/IRsend_test.cpp
similarity index 99%
rename from lib/IRremoteESP8266-2.7.1/test/IRsend_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/IRsend_test.cpp
index fbf8ba229..f2e280504 100644
--- a/lib/IRremoteESP8266-2.7.1/test/IRsend_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/IRsend_test.cpp
@@ -193,7 +193,7 @@ TEST(TestSendRaw, GeneralUse) {
irsend.reset();
irsend.sendRaw(rawData, 67, 38);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, kNECBits, false));
+ ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, kStartOffset, kNECBits, false));
EXPECT_EQ(NEC, irsend.capture.decode_type);
EXPECT_EQ(32, irsend.capture.bits);
EXPECT_EQ(0xC3E0E0E8, irsend.capture.value);
diff --git a/lib/IRremoteESP8266-2.7.1/test/IRsend_test.h b/lib/IRremoteESP8266-2.7.4/test/IRsend_test.h
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/IRsend_test.h
rename to lib/IRremoteESP8266-2.7.4/test/IRsend_test.h
diff --git a/lib/IRremoteESP8266-2.7.1/test/IRutils_test.cpp b/lib/IRremoteESP8266-2.7.4/test/IRutils_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/IRutils_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/IRutils_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/Makefile b/lib/IRremoteESP8266-2.7.4/test/Makefile
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/test/Makefile
rename to lib/IRremoteESP8266-2.7.4/test/Makefile
index ad75937b8..7b1a4b379 100644
--- a/lib/IRremoteESP8266-2.7.1/test/Makefile
+++ b/lib/IRremoteESP8266-2.7.4/test/Makefile
@@ -39,7 +39,7 @@ TESTS = IRutils_test IRsend_test ir_NEC_test ir_GlobalCache_test \
ir_Whirlpool_test ir_Lutron_test ir_Electra_test ir_Pioneer_test \
ir_MWM_test ir_Vestel_test ir_Teco_test ir_Tcl_test ir_Lego_test IRac_test \
ir_MitsubishiHeavy_test ir_Trotec_test ir_Argo_test ir_Goodweather_test \
- ir_Inax_test ir_Neoclima_test ir_Amcor_test
+ ir_Inax_test ir_Neoclima_test ir_Amcor_test ir_Epson_test
# All Google Test headers. Usually you shouldn't change this
# definition.
@@ -85,7 +85,7 @@ PROTOCOLS = ir_NEC.o ir_Sony.o ir_Samsung.o ir_JVC.o ir_RCMM.o ir_RC5_RC6.o \
ir_Hitachi.o ir_GICable.o ir_Whirlpool.o ir_Lutron.o ir_Electra.o \
ir_Pioneer.o ir_MWM.o ir_Vestel.o ir_Teco.o ir_Tcl.o ir_Lego.o ir_Argo.o \
ir_Trotec.o ir_MitsubishiHeavy.o ir_Goodweather.o ir_Inax.o ir_Neoclima.o \
- ir_Amcor.o
+ ir_Amcor.o ir_Epson.o
# All the IR Protocol header files.
PROTOCOLS_H = $(USER_DIR)/ir_Amcor.h \
@@ -265,7 +265,7 @@ ir_RCMM_test : $(COMMON_OBJ) ir_RCMM_test.o
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
ir_LG.o : $(USER_DIR)/ir_LG.h $(USER_DIR)/ir_LG.cpp $(COMMON_DEPS)
- $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_LG.cpp
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c $(USER_DIR)/ir_LG.cpp
ir_LG_test.o : ir_LG_test.cpp $(USER_DIR)/ir_LG.h $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c ir_LG_test.cpp
@@ -623,3 +623,12 @@ ir_Amcor_test.o : ir_Amcor_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
ir_Amcor_test : $(COMMON_OBJ) ir_Amcor_test.o
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+
+ir_Epson.o : $(USER_DIR)/ir_Epson.cpp $(COMMON_DEPS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c $(USER_DIR)/ir_Epson.cpp
+
+ir_Epson_test.o : ir_Epson_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c ir_Epson_test.cpp
+
+ir_Epson_test : $(COMMON_OBJ) ir_Epson_test.o
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Aiwa_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Aiwa_test.cpp
similarity index 83%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Aiwa_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Aiwa_test.cpp
index 2fa63afe6..f87d5c5e2 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Aiwa_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Aiwa_test.cpp
@@ -130,7 +130,8 @@ TEST(TestDecodeAiwa, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendAiwaRCT501(0x7F);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset,
+ kAiwaRcT501Bits, true));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
EXPECT_EQ(0x7F, irsend.capture.value);
@@ -142,7 +143,8 @@ TEST(TestDecodeAiwa, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendAiwaRCT501(0x0);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset,
+ kAiwaRcT501Bits, true));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -154,7 +156,8 @@ TEST(TestDecodeAiwa, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendAiwaRCT501(0x7FFF);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset,
+ kAiwaRcT501Bits, true));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
EXPECT_EQ(0x7FFF, irsend.capture.value);
@@ -173,7 +176,8 @@ TEST(TestDecodeAiwa, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendAiwaRCT501(0x7F, kAiwaRcT501Bits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset,
+ kAiwaRcT501Bits, true));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
EXPECT_EQ(0x7F, irsend.capture.value);
@@ -193,7 +197,8 @@ TEST(TestDecodeAiwa, DecodeWithNonStrictValues) {
irsend.sendNEC(0x1D8113F00FF, 42, kAiwaRcT501MinRepeats);
irsend.makeDecodeResult();
// MUST pass with strict on.
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset,
+ kAiwaRcT501Bits, true));
ASSERT_EQ(0x7F, irsend.capture.value);
irsend.reset();
@@ -202,10 +207,12 @@ TEST(TestDecodeAiwa, DecodeWithNonStrictValues) {
irsend.sendNEC(0x1234567890A, 42, kAiwaRcT501MinRepeats);
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset,
+ kAiwaRcT501Bits, true));
// Should fail if strict off too.
ASSERT_FALSE(
- irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
+ irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset, kAiwaRcT501Bits,
+ false));
irsend.reset();
// Use sendNEC(data, 42) to make/send an illegal value Aiwa message.
@@ -213,7 +220,8 @@ TEST(TestDecodeAiwa, DecodeWithNonStrictValues) {
irsend.sendNEC(0x1D8113F00FE, 42, kAiwaRcT501MinRepeats);
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset,
+ kAiwaRcT501Bits, true));
// Should fail if strict off too.
ASSERT_FALSE(
irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
@@ -224,10 +232,12 @@ TEST(TestDecodeAiwa, DecodeWithNonStrictValues) {
irsend.sendNEC(0x0D8113F00FF, 42, kAiwaRcT501MinRepeats);
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset,
+ kAiwaRcT501Bits, true));
// Should fail if strict off too.
ASSERT_FALSE(
- irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
+ irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset, kAiwaRcT501Bits,
+ false));
}
// Decode unsupported Aiwa messages.
@@ -240,9 +250,10 @@ TEST(TestDecodeAiwa, DecodeWithNonStrictSizes) {
irsend.sendAiwaRCT501(0x0, 8); // Illegal size Aiwa 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset,
+ kAiwaRcT501Bits, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, 8, false));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset, 8, false));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -251,12 +262,15 @@ TEST(TestDecodeAiwa, DecodeWithNonStrictSizes) {
irsend.sendAiwaRCT501(0x12345678, 32); // Illegal size Aiwa 32-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset,
+ kAiwaRcT501Bits, true));
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset, 32,
+ true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, 32, false));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset, 32,
+ false));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
EXPECT_EQ(32, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
@@ -273,7 +287,8 @@ TEST(TestDecodeAiwa, Decode64BitMessages) {
irsend.sendAiwaRCT501(0x1FFFFFFFFF, 37);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, 37, false));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset, 37,
+ false));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
EXPECT_EQ(37, irsend.capture.bits);
EXPECT_EQ(0x1FFFFFFFFF, irsend.capture.value);
@@ -283,7 +298,8 @@ TEST(TestDecodeAiwa, Decode64BitMessages) {
irsend.sendNEC(0x76044FFFFFFFFFFF, 64, kAiwaRcT501MinRepeats);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, 37, false));
+ ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset, 37,
+ false));
EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
EXPECT_EQ(37, irsend.capture.bits);
EXPECT_EQ(0x1FFFFFFFFF, irsend.capture.value);
@@ -316,7 +332,7 @@ TEST(TestDecodeAiwa, DecodeGlobalCacheExample) {
EXPECT_FALSE(irsend.capture.repeat);
// Confirm what the 42-bit NEC decode is.
- ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, 42, false));
+ ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, kStartOffset, 42, false));
EXPECT_EQ(0x1D8113F00FF, irsend.capture.value);
}
@@ -336,5 +352,6 @@ TEST(TestDecodeAiwa, FailToDecodeNonAiwaExample) {
ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture));
ASSERT_FALSE(
- irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
+ irrecv.decodeAiwaRCT501(&irsend.capture, kStartOffset, kAiwaRcT501Bits,
+ false));
}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Amcor_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Amcor_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Amcor_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Amcor_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Argo_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Argo_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Argo_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Argo_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Carrier_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Carrier_test.cpp
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Carrier_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Carrier_test.cpp
index 053b31dd4..f62a9d0f5 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Carrier_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Carrier_test.cpp
@@ -161,7 +161,8 @@ TEST(TestDecodeCarrierAC, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendCarrierAC(0x0);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeCarrierAC(&irsend.capture, kCarrierAcBits, true));
+ ASSERT_TRUE(irrecv.decodeCarrierAC(&irsend.capture, kStartOffset,
+ kCarrierAcBits, true));
EXPECT_EQ(CARRIER_AC, irsend.capture.decode_type);
EXPECT_EQ(kCarrierAcBits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -172,7 +173,8 @@ TEST(TestDecodeCarrierAC, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendCarrierAC(0xB335ABE2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeCarrierAC(&irsend.capture, kCarrierAcBits, true));
+ ASSERT_TRUE(irrecv.decodeCarrierAC(&irsend.capture, kStartOffset,
+ kCarrierAcBits, true));
EXPECT_EQ(CARRIER_AC, irsend.capture.decode_type);
EXPECT_EQ(kCarrierAcBits, irsend.capture.bits);
EXPECT_EQ(0xB335ABE2, irsend.capture.value);
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Coolix_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Coolix_test.cpp
similarity index 62%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Coolix_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Coolix_test.cpp
index 514e16dba..20a46c7b4 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Coolix_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Coolix_test.cpp
@@ -17,66 +17,66 @@ TEST(TestSendCoolix, SendDataOnly) {
irsend.sendCOOLIX(0x0);
EXPECT_EQ(
"f38000d50"
- "m4480s4480"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s5040"
- "m4480s4480"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s105040",
+ "m4692s4416"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s5244"
+ "m4692s4416"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s105244",
irsend.outputStr());
irsend.reset();
irsend.sendCOOLIX(0xAA55AA);
EXPECT_EQ(
"f38000d50"
- "m4480s4480"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s5040"
- "m4480s4480"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s105040",
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s5244"
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s105244",
irsend.outputStr());
irsend.reset();
irsend.sendCOOLIX(0xFFFFFF);
EXPECT_EQ(
"f38000d50"
- "m4480s4480"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s5040"
- "m4480s4480"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s105040",
+ "m4692s4416"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s5244"
+ "m4692s4416"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s105244",
irsend.outputStr());
}
@@ -89,50 +89,50 @@ TEST(TestSendCoolix, SendWithRepeats) {
irsend.sendCOOLIX(0xAA55AA, kCoolixBits, 1); // 1 repeat.
EXPECT_EQ(
"f38000d50"
- "m4480s4480"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s5040"
- "m4480s4480"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s105040",
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s5244"
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s105244",
irsend.outputStr());
irsend.sendCOOLIX(0xAA55AA, kCoolixBits, 2); // 2 repeats.
EXPECT_EQ(
"f38000d50"
- "m4480s4480"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s5040"
- "m4480s4480"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s5040"
- "m4480s4480"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
- "m560s105040",
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s5244"
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s5244"
+ "m4692s4416"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656"
+ "m552s105244",
irsend.outputStr());
}
@@ -145,56 +145,56 @@ TEST(TestSendCoolix, SendUnusualSize) {
irsend.sendCOOLIX(0x0, 8);
EXPECT_EQ(
"f38000d50"
- "m4480s4480"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s5040"
- "m4480s4480"
- "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
- "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
- "m560s105040",
+ "m4692s4416"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s5244"
+ "m4692s4416"
+ "m552s552m552s552m552s552m552s552m552s552m552s552m552s552m552s552"
+ "m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
+ "m552s105244",
irsend.outputStr());
irsend.reset();
irsend.sendCOOLIX(0x1234567890ABCDEF, 64);
EXPECT_EQ(
"f38000d50"
- "m4480s4480"
- "m560s560m560s560m560s560m560s1680m560s560m560s560m560s1680m560s560"
- "m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560m560s1680"
- "m560s560m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
- "m560s1680m560s1680m560s560m560s560m560s1680m560s560m560s1680m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s560m560s1680"
- "m560s560m560s1680m560s1680m560s1680m560s1680m560s560m560s560m560s560"
- "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s1680m560s1680"
- "m560s1680m560s560m560s560m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s560m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s560"
- "m560s1680m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
- "m560s560m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560"
- "m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s1680m560s560m560s560m560s560m560s560"
- "m560s5040"
- "m4480s4480"
- "m560s560m560s560m560s560m560s1680m560s560m560s560m560s1680m560s560"
- "m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560m560s1680"
- "m560s560m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
- "m560s1680m560s1680m560s560m560s560m560s1680m560s560m560s1680m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s1680m560s560"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s560m560s1680"
- "m560s560m560s1680m560s1680m560s1680m560s1680m560s560m560s560m560s560"
- "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s1680m560s1680"
- "m560s1680m560s560m560s560m560s1680m560s560m560s560m560s560m560s560"
- "m560s560m560s1680m560s1680m560s560m560s1680m560s1680m560s1680m560s1680"
- "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s1680"
- "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s560"
- "m560s1680m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
- "m560s560m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560"
- "m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s1680m560s1680"
- "m560s560m560s560m560s560m560s1680m560s560m560s560m560s560m560s560"
- "m560s105040",
+ "m4692s4416"
+ "m552s552m552s552m552s552m552s1656m552s552m552s552m552s1656m552s552"
+ "m552s1656m552s1656m552s1656m552s552m552s1656m552s1656m552s552m552s1656"
+ "m552s552m552s552m552s1656m552s1656m552s552m552s1656m552s552m552s552"
+ "m552s1656m552s1656m552s552m552s552m552s1656m552s552m552s1656m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s552m552s1656"
+ "m552s552m552s1656m552s1656m552s1656m552s1656m552s552m552s552m552s552"
+ "m552s1656m552s552m552s552m552s552m552s552m552s1656m552s1656m552s1656"
+ "m552s1656m552s552m552s552m552s1656m552s552m552s552m552s552m552s552"
+ "m552s552m552s1656m552s1656m552s552m552s1656m552s1656m552s1656m552s1656"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s552"
+ "m552s1656m552s1656m552s552m552s552m552s1656m552s1656m552s552m552s1656"
+ "m552s552m552s552m552s1656m552s1656m552s552m552s552m552s1656m552s552"
+ "m552s1656m552s1656m552s1656m552s552m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s1656m552s552m552s552m552s552m552s552"
+ "m552s5244"
+ "m4692s4416"
+ "m552s552m552s552m552s552m552s1656m552s552m552s552m552s1656m552s552"
+ "m552s1656m552s1656m552s1656m552s552m552s1656m552s1656m552s552m552s1656"
+ "m552s552m552s552m552s1656m552s1656m552s552m552s1656m552s552m552s552"
+ "m552s1656m552s1656m552s552m552s552m552s1656m552s552m552s1656m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s1656m552s552"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s552m552s1656"
+ "m552s552m552s1656m552s1656m552s1656m552s1656m552s552m552s552m552s552"
+ "m552s1656m552s552m552s552m552s552m552s552m552s1656m552s1656m552s1656"
+ "m552s1656m552s552m552s552m552s1656m552s552m552s552m552s552m552s552"
+ "m552s552m552s1656m552s1656m552s552m552s1656m552s1656m552s1656m552s1656"
+ "m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s1656"
+ "m552s552m552s1656m552s552m552s1656m552s552m552s1656m552s552m552s552"
+ "m552s1656m552s1656m552s552m552s552m552s1656m552s1656m552s552m552s1656"
+ "m552s552m552s552m552s1656m552s1656m552s552m552s552m552s1656m552s552"
+ "m552s1656m552s1656m552s1656m552s552m552s1656m552s1656m552s1656m552s1656"
+ "m552s552m552s552m552s552m552s1656m552s552m552s552m552s552m552s552"
+ "m552s105244",
irsend.outputStr());
// Bit sizes must be a multiple of 8.
@@ -215,7 +215,8 @@ TEST(TestDecodeCoolix, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendCOOLIX(0x123456);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, kCoolixBits,
+ true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x123456, irsend.capture.value);
@@ -227,7 +228,8 @@ TEST(TestDecodeCoolix, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendCOOLIX(0x0);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, kCoolixBits,
+ true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -239,7 +241,8 @@ TEST(TestDecodeCoolix, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendCOOLIX(0xFFFFFF);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, kCoolixBits,
+ true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0xFFFFFF, irsend.capture.value);
@@ -258,20 +261,23 @@ TEST(TestDecodeCoolix, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendCOOLIX(0x123456, kCoolixBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, kCoolixBits,
+ true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x123456, irsend.capture.value);
EXPECT_FALSE(irsend.capture.repeat);
irsend.makeDecodeResult(4 * kCoolixBits + 4);
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, kCoolixBits,
+ true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x123456, irsend.capture.value);
irsend.makeDecodeResult(2 * (4 * kCoolixBits + 4));
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, kCoolixBits,
+ true));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
EXPECT_EQ(kCoolixBits, irsend.capture.bits);
EXPECT_EQ(0x123456, irsend.capture.value);
@@ -287,9 +293,10 @@ TEST(TestDecodeCoolix, DecodeWithNonStrictSizes) {
irsend.sendCOOLIX(0x12, 8); // Illegal value Coolix 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
+ ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, kCoolixBits,
+ true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, 8, false));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, 8, false));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0x12, irsend.capture.value);
@@ -298,13 +305,14 @@ TEST(TestDecodeCoolix, DecodeWithNonStrictSizes) {
irsend.sendCOOLIX(0x12345678, 32); // Illegal value Coolix 32-bit message.
irsend.makeDecodeResult();
// Shouldn't pass with strict when we ask for less bits than we got.
- ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, true));
+ ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, kCoolixBits,
+ true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, 32, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, 32, false));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, 32, false));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
EXPECT_EQ(32, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
@@ -313,7 +321,7 @@ TEST(TestDecodeCoolix, DecodeWithNonStrictSizes) {
irsend.reset();
irsend.sendCOOLIX(0x123456, kCoolixBits, 2);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, 9, false));
+ ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, 9, false));
}
// Decode (non-standard) 64-bit messages.
@@ -327,7 +335,7 @@ TEST(TestDecodeCoolix, Decode64BitMessages) {
irsend.sendCOOLIX(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(COOLIX, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -349,7 +357,8 @@ TEST(TestDecodeCoolix, FailToDecodeNonCoolixExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kCoolixBits, false));
+ ASSERT_FALSE(irrecv.decodeCOOLIX(&irsend.capture, kStartOffset, kCoolixBits,
+ false));
}
// Tests for the IRCoolixAC class.
@@ -719,33 +728,33 @@ TEST(TestCoolixACClass, Issue722) {
// Raw data supplied by @mariusmotea
"f38000d50"
// 4434,4376,
- "m4480s4480"
+ "m4692s4416"
// 566,1614,592,504,566,1618,566,1616,568,528,564,532,564,1616,568,532,
- "m560s1680m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560"
+ "m552s1656m552s552m552s1656m552s1656m552s552m552s552m552s1656m552s552"
// 566,530,566,1620,568,528,566,530,566,1618,564,1618,566,530,564,1624,
- "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
+ "m552s552m552s1656m552s552m552s552m552s1656m552s1656m552s552m552s1656"
// 538,560,566,530,564,1620,566,1618,566,1618,566,1616,566,1616,566,1620,
- "m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
+ "m552s552m552s552m552s1656m552s1656m552s1656m552s1656m552s1656m552s1656"
// 568,1620,566,1616,566,530,566,530,564,530,562,532,564,530,566,530,
- "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
+ "m552s1656m552s1656m552s552m552s552m552s552m552s552m552s552m552s552"
// 566,1622,566,1616,540,1642,566,528,566,530,566,1616,566,530,566,532,
- "m560s1680m560s1680m560s1680m560s560m560s560m560s1680m560s560m560s560"
+ "m552s1656m552s1656m552s1656m552s552m552s552m552s1656m552s552m552s552"
// 564,532,564,530,566,530,566,1614,566,1616,562,532,564,1620,566,1618,
- "m560s560m560s560m560s560m560s1680m560s1680m560s560m560s1680m560s1680"
+ "m552s552m552s552m552s552m552s1656m552s1656m552s552m552s1656m552s1656"
// 538,5254,4432,4364,566,1616,568,530,564,1620,568,1616,564,532,564,530,
- "m560s5040m4480s4480m560s1680m560s560m560s1680m560s1680m560s560m560s560"
+ "m552s5244m4692s4416m552s1656m552s552m552s1656m552s1656m552s552m552s552"
// 566,1616,566,532,564,532,566,1620,568,528,566,530,566,1616,564,1618,
- "m560s1680m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
+ "m552s1656m552s552m552s552m552s1656m552s552m552s552m552s1656m552s1656"
// 566,530,566,1622,566,532,566,528,566,1620,568,1614,566,1618,566,1618,
- "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
+ "m552s552m552s1656m552s552m552s552m552s1656m552s1656m552s1656m552s1656"
// 566,1614,568,1618,566,1622,568,1616,566,530,564,530,566,530,566,528,
- "m560s1680m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
+ "m552s1656m552s1656m552s1656m552s1656m552s552m552s552m552s552m552s552"
// 564,530,566,532,566,1622,564,1616,566,1616,564,532,564,530,564,1616,
- "m560s560m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s1680"
+ "m552s552m552s552m552s1656m552s1656m552s1656m552s552m552s552m552s1656"
// 564,530,564,532,566,530,564,530,566,528,564,1618,564,1618,564,532,
- "m560s560m560s560m560s560m560s560m560s560m560s1680m560s1680m560s560"
+ "m552s552m552s552m552s552m552s552m552s552m552s1656m552s1656m552s552"
// 564,1620,566,1618,562 // Raw data matches what is expected.
- "m560s1680m560s1680m560s105040", ac._irsend.outputStr());
+ "m552s1656m552s1656m552s105244", ac._irsend.outputStr());
}
TEST(TestCoolixACClass, Issue985) {
@@ -800,3 +809,44 @@ TEST(TestCoolixACClass, Issue985) {
EXPECT_EQ(kCoolixOff, ac._irsend.capture.value);
EXPECT_EQ("Power: Off", IRAcUtils::resultAcToString(&ac._irsend.capture));
}
+
+TEST(TestCoolixACClass, PowerStateWithSetRaw) {
+ IRrecv irrecv(kGpioUnused);
+ IRCoolixAC ac(kGpioUnused);
+
+ // Problem reported that power is always off via decodeToState()
+ // Ref:
+ // https://github.com/crankyoldgit/IRremoteESP8266/pull/1040
+ // https://github.com/arendst/Tasmota/issues/7660
+
+ const uint32_t on_code = 0xB2BFCC; // A valid "on" message.
+
+ // Check the off case.
+ ac.setRaw(kCoolixOff);
+ ASSERT_FALSE(ac.getPower());
+ EXPECT_FALSE(ac.toCommon().power);
+
+ // Check the "on" case.
+ ac.setRaw(on_code);
+ ASSERT_TRUE(ac.getPower());
+ EXPECT_TRUE(ac.toCommon().power);
+ // Now check the reported decodeToState() is also fixed.
+ ac._irsend.reset();
+ ac.send();
+ ac._irsend.makeDecodeResult();
+ ASSERT_TRUE(irrecv.decode(&ac._irsend.capture));
+ EXPECT_EQ(COOLIX, ac._irsend.capture.decode_type);
+ EXPECT_EQ(kCoolixBits, ac._irsend.capture.bits);
+ EXPECT_EQ(on_code, ac._irsend.capture.value);
+ EXPECT_EQ(
+ "Power: On, Mode: 3 (Heat), Fan: 5 (Auto), Temp: 25C, Zone Follow: Off, "
+ "Sensor Temp: Off", IRAcUtils::resultAcToString(&ac._irsend.capture));
+ stdAc::state_t result;
+ ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &result));
+ EXPECT_TRUE(result.power);
+
+ // Recheck the off case to ensure it changes.
+ ac.setRaw(kCoolixOff);
+ ASSERT_FALSE(ac.getPower());
+ EXPECT_FALSE(ac.toCommon().power);
+}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Daikin_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Daikin_test.cpp
similarity index 98%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Daikin_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Daikin_test.cpp
index 9fcaabcb0..60d39d9a3 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Daikin_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Daikin_test.cpp
@@ -3364,3 +3364,39 @@ TEST(TestDaikin152Class, BuildKnownState) {
0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x00, 0x00, 0x6F};
EXPECT_STATE_EQ(expectedState, ac.getRaw(), kDaikin152Bits);
}
+
+TEST(TestDaikin2Class, Issue1035) {
+ IRDaikin2 ac(kGpioUnused);
+ // https://github.com/crankyoldgit/IRremoteESP8266/issues/1035#issuecomment-580963572
+ const uint8_t on_code[kDaikin2StateLength] = {
+ 0x11, 0xDA, 0x27, 0x00, 0x01, 0x15, 0x43, 0x90, 0x29, 0x0C, 0x80, 0x04,
+ 0xC0, 0x16, 0x24, 0x00, 0x00, 0xBE, 0xC1, 0x2D, 0x11, 0xDA, 0x27, 0x00,
+ 0x00, 0x09, 0x2A, 0x00, 0xB0, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0xC1,
+ 0x90, 0x60, 0x0C};
+ const uint8_t off_code[kDaikin2StateLength] = {
+ 0x11, 0xDA, 0x27, 0x00, 0x01, 0x15, 0xC3, 0x90, 0x29, 0x0C, 0x80, 0x04,
+ 0xC0, 0x16, 0x24, 0x00, 0x00, 0xBE, 0xD1, 0xBD, 0x11, 0xDA, 0x27, 0x00,
+ 0x00, 0x08, 0x2A, 0x00, 0xB0, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0xC1,
+ 0x90, 0x60, 0x0B};
+
+ ac.setRaw(on_code);
+ EXPECT_EQ(
+ "Power: On, Mode: 0 (Auto), Temp: 21C, Fan: 11 (Quiet), "
+ "Swing(V): 1 (Highest), Swing(H): 190 (Auto), Clock: 13:09, "
+ "On Timer: Off, Off Timer: Off, Sleep Timer: Off, Beep: 2 (Loud), "
+ "Light: 1 (High), Mould: On, Clean: On, Fresh: On, Eye: Off, "
+ "Eye Auto: Off, Quiet: Off, Powerful: Off, Purify: On, Econo: Off",
+ ac.toString());
+ ASSERT_TRUE(ac.toCommon().power);
+ ASSERT_NE(ac.toCommon().mode, stdAc::opmode_t::kOff);
+
+ ac.setRaw(off_code);
+ EXPECT_EQ(
+ "Power: Off, Mode: 0 (Auto), Temp: 21C, Fan: 11 (Quiet), "
+ "Swing(V): 1 (Highest), Swing(H): 190 (Auto), Clock: 13:09, "
+ "On Timer: Off, Off Timer: Off, Sleep Timer: Off, Beep: 2 (Loud), "
+ "Light: 1 (High), Mould: On, Clean: On, Fresh: On, Eye: Off, "
+ "Eye Auto: Off, Quiet: Off, Powerful: Off, Purify: On, Econo: Off",
+ ac.toString());
+ ASSERT_FALSE(ac.toCommon().power);
+}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Denon_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Denon_test.cpp
similarity index 92%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Denon_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Denon_test.cpp
index bfb554bb5..64be43f97 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Denon_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Denon_test.cpp
@@ -185,7 +185,8 @@ TEST(TestDecodeDenon, NormalDecodeWithStrict) {
irsend.sendDenon(0x2278);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kDenonBits, true));
+ ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kStartOffset, kDenonBits,
+ true));
EXPECT_EQ(DENON, irsend.capture.decode_type);
EXPECT_EQ(kDenonBits, irsend.capture.bits);
EXPECT_EQ(0x2278, irsend.capture.value);
@@ -198,7 +199,8 @@ TEST(TestDecodeDenon, NormalDecodeWithStrict) {
irsend.sendDenon(0x1278, kDenonLegacyBits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kDenonLegacyBits, true));
+ ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kStartOffset,
+ kDenonLegacyBits, true));
EXPECT_EQ(DENON, irsend.capture.decode_type);
EXPECT_EQ(kDenonLegacyBits, irsend.capture.bits);
EXPECT_EQ(0x1278, irsend.capture.value);
@@ -210,7 +212,8 @@ TEST(TestDecodeDenon, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendDenon(0x2A4C028D6CE3, kDenon48Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kDenon48Bits, true));
+ ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kStartOffset,
+ kDenon48Bits, true));
EXPECT_EQ(DENON, irsend.capture.decode_type);
EXPECT_EQ(kDenon48Bits, irsend.capture.bits);
EXPECT_EQ(0x2A4C028D6CE3, irsend.capture.value);
@@ -235,7 +238,8 @@ TEST(TestDecodeDenon, DecodeGlobalCacheExample) {
irsend.sendGC(gc_test_power, 67);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kDenonBits, true));
+ ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kStartOffset, kDenonBits,
+ true));
EXPECT_EQ(DENON, irsend.capture.decode_type);
EXPECT_EQ(kDenonBits, irsend.capture.bits);
EXPECT_EQ(0x2278, irsend.capture.value);
@@ -256,7 +260,8 @@ TEST(TestDecodeDenon, DecodeGlobalCacheExample) {
irsend.sendGC(gc_test_eco, 103);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kDenon48Bits, true));
+ ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kStartOffset, kDenon48Bits,
+ true));
EXPECT_EQ(DENON, irsend.capture.decode_type);
EXPECT_EQ(kDenon48Bits, irsend.capture.bits);
EXPECT_EQ(0x2A4C028D6CE3, irsend.capture.value);
@@ -280,7 +285,10 @@ TEST(TestDecodeDenon, FailToDecodeNonDenonExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, kDenonLegacyBits, false));
- ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, kDenonBits, false));
- ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, kDenon48Bits, false));
+ ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, kStartOffset,
+ kDenonLegacyBits, false));
+ ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, kStartOffset, kDenonBits,
+ false));
+ ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, kStartOffset, kDenon48Bits,
+ false));
}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Dish_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Dish_test.cpp
similarity index 92%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Dish_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Dish_test.cpp
index 21286b7ac..d74564811 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Dish_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Dish_test.cpp
@@ -189,7 +189,8 @@ TEST(TestDecodeDish, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendDISH(0x9C00);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
+ ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kStartOffset, kDishBits,
+ true));
EXPECT_EQ(DISH, irsend.capture.decode_type);
EXPECT_EQ(kDishBits, irsend.capture.bits);
EXPECT_EQ(0x9C00, irsend.capture.value);
@@ -208,13 +209,14 @@ TEST(TestDecodeDish, DecodeWithNonStrictSize) {
irsend.sendDISH(0x12, 8); // Illegal size Dish message. (smaller)
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
+ ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kStartOffset, kDishBits,
+ true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, 8, true));
+ ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kStartOffset, 8, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, 8, false));
+ ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kStartOffset, 8, false));
EXPECT_EQ(DISH, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0x12, irsend.capture.value);
@@ -225,13 +227,14 @@ TEST(TestDecodeDish, DecodeWithNonStrictSize) {
irsend.sendDISH(0x12345678, 32); // Illegal size Dish message. (larger)
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
+ ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kStartOffset, kDishBits,
+ true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kStartOffset, 32, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, 32, false));
+ ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kStartOffset, 32, false));
EXPECT_EQ(DISH, irsend.capture.decode_type);
EXPECT_EQ(32, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
@@ -249,9 +252,9 @@ TEST(TestDecodeDish, Decode64BitMessages) {
// Illegal value & size Dish 64-bit message.
irsend.sendDISH(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, 64, true));
+ ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kStartOffset, 64, true));
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(DISH, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -299,7 +302,8 @@ TEST(TestDecodeDish, DecodeGlobalCacheExample) {
irsend.sendGC(gc_test_hopper, 73);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
+ ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kStartOffset, kDishBits,
+ true));
EXPECT_EQ(DISH, irsend.capture.decode_type);
EXPECT_EQ(kDishBits, irsend.capture.bits);
EXPECT_EQ(0x9C00, irsend.capture.value);
@@ -332,5 +336,6 @@ TEST(TestDecodeDish, FailToDecodeNonDishExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kDishBits, false));
+ ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kStartOffset, kDishBits,
+ false));
}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Electra_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Electra_test.cpp
similarity index 69%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Electra_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Electra_test.cpp
index 43ea456c6..b49482433 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Electra_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Electra_test.cpp
@@ -101,7 +101,7 @@ TEST(TestDecodeElectraAC, RealExampleDecode) {
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 3 (Low), "
- "Swing(V): Off, Swing(H): Off",
+ "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: Off",
IRAcUtils::resultAcToString(&irsend.capture));
}
@@ -199,24 +199,25 @@ TEST(TestIRElectraAcClass, toCommon) {
ac.setFan(kElectraAcFanHigh);
ac.setSwingV(true);
ac.setSwingH(true);
+ ac.setClean(true);
+ ac.setLightToggle(true);
// Now test it.
ASSERT_EQ(decode_type_t::ELECTRA_AC, ac.toCommon().protocol);
ASSERT_EQ(-1, ac.toCommon().model);
ASSERT_TRUE(ac.toCommon().power);
ASSERT_TRUE(ac.toCommon().celsius);
ASSERT_EQ(20, ac.toCommon().degrees);
-
ASSERT_EQ(stdAc::opmode_t::kCool, ac.toCommon().mode);
ASSERT_EQ(stdAc::fanspeed_t::kMax, ac.toCommon().fanspeed);
ASSERT_EQ(stdAc::swingv_t::kAuto, ac.toCommon().swingv);
ASSERT_EQ(stdAc::swingh_t::kAuto, ac.toCommon().swingh);
+ ASSERT_TRUE(ac.toCommon().clean);
+ ASSERT_TRUE(ac.toCommon().light);
// Unsupported.
ASSERT_FALSE(ac.toCommon().turbo);
ASSERT_FALSE(ac.toCommon().filter);
- ASSERT_FALSE(ac.toCommon().light);
ASSERT_FALSE(ac.toCommon().quiet);
ASSERT_FALSE(ac.toCommon().econo);
- ASSERT_FALSE(ac.toCommon().clean);
ASSERT_FALSE(ac.toCommon().beep);
ASSERT_EQ(-1, ac.toCommon().sleep);
ASSERT_EQ(-1, ac.toCommon().clock);
@@ -232,19 +233,125 @@ TEST(TestIRElectraAcClass, HumanReadable) {
ac.setRaw(on_cool_32C_auto_voff);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 32C, Fan: 5 (Auto), "
- "Swing(V): Off, Swing(H): Off", ac.toString());
+ "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: Off",
+ ac.toString());
uint8_t on_cool_16C_auto_voff[13] = {
0xC3, 0x47, 0xE0, 0x00, 0xA0, 0x00, 0x20,
0x00, 0x00, 0x20, 0x00, 0x41, 0x0B};
ac.setRaw(on_cool_16C_auto_voff);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 5 (Auto), "
- "Swing(V): Off, Swing(H): Off", ac.toString());
+ "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: Off",
+ ac.toString());
uint8_t on_cool_16C_low_voff[13] = {
0xC3, 0x47, 0xE0, 0x00, 0x60, 0x00, 0x20,
0x00, 0x00, 0x20, 0x00, 0x41, 0xCB};
ac.setRaw(on_cool_16C_low_voff);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 3 (Low), "
- "Swing(V): Off, Swing(H): Off", ac.toString());
+ "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: Off",
+ ac.toString());
+}
+
+TEST(TestIRElectraAcClass, Clean) {
+ IRElectraAc ac(kGpioUnused);
+ ac.begin();
+
+ ac.setClean(true);
+ EXPECT_TRUE(ac.getClean());
+
+ ac.setClean(false);
+ EXPECT_FALSE(ac.getClean());
+
+ ac.setClean(true);
+ EXPECT_TRUE(ac.getClean());
+
+ ac.setClean(false);
+ // ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1033#issuecomment-581133127
+ uint8_t on[13] = {0xC3, 0x87, 0xE0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x24,
+ 0x00, 0x19, 0xE7};
+ ac.setRaw(on);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 3 (Low), "
+ "Swing(V): Off, Swing(H): Off, Light: Toggle, Clean: On, Turbo: Off",
+ ac.toString());
+}
+
+TEST(TestIRElectraAcClass, Turbo) {
+ IRElectraAc ac(kGpioUnused);
+ ac.begin();
+
+ ac.setTurbo(true);
+ EXPECT_TRUE(ac.getTurbo());
+
+ ac.setTurbo(false);
+ EXPECT_FALSE(ac.getTurbo());
+
+ ac.setTurbo(true);
+ EXPECT_TRUE(ac.getTurbo());
+
+ ac.setTurbo(false);
+ // ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1033#issuecomment-583888046
+ const uint8_t on[13] = {
+ 0xC3, 0x87, 0xE0, 0x00, 0x60, 0x40, 0x20, 0x00, 0x00, 0x20, 0x00, 0x08,
+ 0x12};
+
+ ac.setRaw(on);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 3 (Low), "
+ "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: On",
+ ac.toString());
+}
+
+TEST(TestIRElectraAcClass, LightToggle) {
+ IRElectraAc ac(kGpioUnused);
+ ac.begin();
+
+ ac.setLightToggle(true);
+ EXPECT_TRUE(ac.getLightToggle());
+
+ ac.setLightToggle(false);
+ EXPECT_FALSE(ac.getLightToggle());
+
+ ac.setLightToggle(true);
+ EXPECT_TRUE(ac.getLightToggle());
+
+ ac.setLightToggle(false);
+ // ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1033#issuecomment-581133127
+ uint8_t on[13] = {0xC3, 0x87, 0xE0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x24,
+ 0x00, 0x19, 0xE7};
+ ac.setRaw(on);
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 3 (Low), "
+ "Swing(V): Off, Swing(H): Off, Light: Toggle, Clean: On, Turbo: Off",
+ ac.toString());
+}
+
+TEST(TestIRElectraAcClass, ConstructKnownState) {
+ IRElectraAc ac(kGpioUnused);
+ // Data from:
+ // https://github.com/crankyoldgit/IRremoteESP8266/issues/1033#issuecomment-581133127
+ // A/C on - Cooling mode - 24° - Fan speed set to 1 - Light set to toggle
+ // - flaps off - turbo off - clean on
+ const uint8_t on_cool_24C_fan1_swing_off_turbo_off_clean_on[13] = {
+ 0xC3, 0x87, 0xE0, 0x00, 0x60, 0x00, 0x20,
+ // 0x00, 0x00, 0x24, 0x00, 0x19, 0xE7}; // Real captured data
+ // TODO(ShonP40): Explain `state[11]` difference.
+ 0x00, 0x00, 0x24, 0x00, 0x15, 0xE3}; // state[11] hacked to pass test.
+ ac.stateReset();
+ ac.on();
+ ac.setMode(kElectraAcCool);
+ ac.setTemp(24);
+ ac.setSwingH(false);
+ ac.setSwingV(false);
+ ac.setFan(kElectraAcFanLow);
+ ac.setLightToggle(true);
+ ac.setClean(true);
+
+ EXPECT_EQ(
+ "Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 3 (Low), "
+ "Swing(V): Off, Swing(H): Off, Light: Toggle, Clean: On, Turbo: Off",
+ ac.toString());
+ EXPECT_STATE_EQ(on_cool_24C_fan1_swing_off_turbo_off_clean_on,
+ ac.getRaw(), kElectraAcBits);
}
diff --git a/lib/IRremoteESP8266-2.7.4/test/ir_Epson_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Epson_test.cpp
new file mode 100644
index 000000000..d1df3f9ac
--- /dev/null
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Epson_test.cpp
@@ -0,0 +1,159 @@
+// Copyright 2020 David Conran
+
+#include "IRac.h"
+#include "IRrecv.h"
+#include "IRrecv_test.h"
+#include "IRsend.h"
+#include "IRsend_test.h"
+#include "gtest/gtest.h"
+
+// Tests for sendEpson().
+
+// Test sending typical data only.
+TEST(TestSendEpson, SendDataOnly) {
+ IRsendTest irsend(kGpioUnused);
+ irsend.begin();
+ irsend.sendEpson(0xC1AA09F6);
+ EXPECT_EQ(
+ "f38000d33"
+ "m8960s4480"
+ "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s560m560s560m560s560m560s1680m560s560m560s560m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
+ "m560s41440"
+ "m8960s4480"
+ "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s560m560s560m560s560m560s1680m560s560m560s560m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
+ "m560s41440"
+ "m8960s4480"
+ "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s1680"
+ "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
+ "m560s560m560s560m560s560m560s560m560s1680m560s560m560s560m560s1680"
+ "m560s1680m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
+ "m560s41440",
+ irsend.outputStr());
+}
+
+// Tests for decodeEpson().
+
+// Decode normal Epson messages.
+TEST(TestDecodeEpson, SyntheticSelfDecode) {
+ IRsendTest irsend(kGpioUnused);
+ IRrecv irrecv(kGpioUnused);
+ irsend.begin();
+
+ // Real-life Epson code from an actual capture/decode.
+ irsend.reset();
+ irsend.sendEpson(0xC1AA09F6);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(EPSON, irsend.capture.decode_type);
+ EXPECT_EQ(kEpsonBits, irsend.capture.bits);
+ EXPECT_EQ(0xC1AA09F6, irsend.capture.value);
+ EXPECT_EQ(0x5583, irsend.capture.address);
+ EXPECT_EQ(0x90, irsend.capture.command);
+ EXPECT_TRUE(irsend.capture.repeat);
+}
+
+// Decode a real Epson message.
+TEST(TestDecodeEpson, RealMessageDecode) {
+ IRsendTest irsend(kGpioUnused);
+ IRrecv irrecv(kGpioUnused);
+ irsend.begin();
+
+ // Real-life Epson code from an actual capture/decode.
+ irsend.reset();
+ const uint16_t rawData_0[203] = {
+ 8976, 4496, 542, 1690, 542, 1688, 542, 588, 518, 612, 542, 586, 518, 610,
+ 518, 610, 542, 1688, 516, 1714, 542, 614, 516, 1688, 542, 612, 516, 1690,
+ 540, 614, 514, 1690, 520, 638, 516, 584, 518, 612, 542, 586, 540, 588,
+ 542, 1688, 520, 610, 540, 586, 520, 1712, 540, 1692, 542, 1688, 542, 1690,
+ 520, 1710, 518, 610, 518, 1712, 518, 1716, 544, 584, 544, 40870,
+ 8978, 4496, 542, 1690, 542, 1688, 520, 610, 542, 584, 516, 638, 514, 588,
+ 540, 588, 540, 1690, 516, 1716, 516, 614, 542, 1688, 518, 612, 542, 1688,
+ 540, 614, 514, 1692, 542, 588, 538, 590, 542, 586, 542, 612, 516, 612,
+ 514, 1692, 516, 612, 540, 586, 520, 1712, 518, 1714, 542, 1688, 518, 1716,
+ 542, 1688, 516, 614, 542, 1686, 518, 1714, 516, 612, 532, 40882,
+ 8976, 4498, 516, 1716, 542, 1690, 540, 614, 516, 614, 516, 614, 514, 588,
+ 540, 588, 544, 1688, 522, 1710, 518, 638, 516, 1688, 520, 636, 492, 1714,
+ 542, 586, 542, 1690, 542, 588, 542, 584, 542, 612, 516, 612, 514, 614,
+ 516, 1690, 542, 586, 542, 586, 540, 1690, 518, 1712, 518, 1716, 518, 1714,
+ 542, 1690, 542, 586, 540, 1690, 542, 1690, 542, 588, 540};
+ irsend.sendRaw(rawData_0, 203, 38000);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(EPSON, irsend.capture.decode_type);
+ EXPECT_EQ(kEpsonBits, irsend.capture.bits);
+ EXPECT_EQ(0xC1AA09F6, irsend.capture.value);
+ EXPECT_EQ(0x5583, irsend.capture.address);
+ EXPECT_EQ(0x90, irsend.capture.command);
+ EXPECT_TRUE(irsend.capture.repeat);
+}
+
+TEST(TestDecodeEpson, RequiresARepeat) {
+ IRsendTest irsend(kGpioUnused);
+ IRrecv irrecv(kGpioUnused);
+ irsend.begin();
+
+ // Simulate sending only two messages (mesg + repeat)
+ irsend.reset();
+ irsend.sendEpson(0xC1AA09F6, kEpsonBits, 1);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(EPSON, irsend.capture.decode_type);
+ EXPECT_EQ(kEpsonBits, irsend.capture.bits);
+ EXPECT_EQ(0xC1AA09F6, irsend.capture.value);
+ EXPECT_EQ(0x5583, irsend.capture.address);
+ EXPECT_EQ(0x90, irsend.capture.command);
+ EXPECT_TRUE(irsend.capture.repeat);
+
+ // Simulate sending no repeats (just 1 message) which should fail to be
+ // detected as Epson.
+ irsend.reset();
+ irsend.sendEpson(0xC1AA09F6, kEpsonBits, 0);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_NE(EPSON, irsend.capture.decode_type);
+}
+
+TEST(TestDecodeEpson, DecodeOnlyIfRepeatIsTheSame) {
+ IRsendTest irsend(kGpioUnused);
+ IRrecv irrecv(kGpioUnused);
+ irsend.begin();
+
+ // Simulate sending only two identical messages.
+ // This should succeed.
+ irsend.reset();
+ irsend.sendEpson(0xC1AA09F6, kEpsonBits, 0);
+ irsend.sendEpson(0xC1AA09F6, kEpsonBits, 0);
+
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(EPSON, irsend.capture.decode_type);
+ EXPECT_EQ(kEpsonBits, irsend.capture.bits);
+ EXPECT_EQ(0xC1AA09F6, irsend.capture.value);
+ EXPECT_EQ(0x5583, irsend.capture.address);
+ EXPECT_EQ(0x90, irsend.capture.command);
+ EXPECT_TRUE(irsend.capture.repeat);
+
+ // Simulate sending a repeat but with a different code.
+ // This should fail.
+ irsend.reset();
+ irsend.sendEpson(0xC1AA09F6, kEpsonBits, 0); // Valid code.
+ irsend.sendEpson(0x4BB640BF, kEpsonBits, 0); // Valid code but different.
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ ASSERT_NE(EPSON, irsend.capture.decode_type);
+}
+
+TEST(TestUtils, Housekeeping) {
+ ASSERT_EQ("EPSON", typeToString(decode_type_t::EPSON));
+ ASSERT_EQ(decode_type_t::EPSON, strToDecodeType("EPSON"));
+ ASSERT_FALSE(hasACState(decode_type_t::EPSON));
+ ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::EPSON));
+ ASSERT_EQ(kEpsonBits, IRsendTest::defaultBits(decode_type_t::EPSON));
+ ASSERT_EQ(kEpsonMinRepeat, IRsendTest::minRepeats(decode_type_t::EPSON));
+}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Fujitsu_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Fujitsu_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Fujitsu_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Fujitsu_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_GICable_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_GICable_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_GICable_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_GICable_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_GlobalCache_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_GlobalCache_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_GlobalCache_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_GlobalCache_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Goodweather_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Goodweather_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Goodweather_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Goodweather_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Gree_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Gree_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Gree_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Gree_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Haier_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Haier_test.cpp
similarity index 99%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Haier_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Haier_test.cpp
index db824a28e..ee55d2866 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Haier_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Haier_test.cpp
@@ -768,7 +768,8 @@ TEST(TestDecodeHaierAC, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendHaierAC(expectedState);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeHaierAC(&irsend.capture, kHaierACBits, true));
+ ASSERT_TRUE(irrecv.decodeHaierAC(&irsend.capture, kStartOffset, kHaierACBits,
+ true));
EXPECT_EQ(HAIER_AC, irsend.capture.decode_type);
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
EXPECT_FALSE(irsend.capture.repeat);
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Hitachi_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Hitachi_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Hitachi_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Hitachi_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Inax_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Inax_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Inax_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Inax_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_JVC_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_JVC_test.cpp
similarity index 88%
rename from lib/IRremoteESP8266-2.7.1/test/ir_JVC_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_JVC_test.cpp
index 3cd99c3aa..51b16b82c 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_JVC_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_JVC_test.cpp
@@ -110,7 +110,7 @@ TEST(TestDecodeJVC, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendJVC(0xC2B8);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kStartOffset, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
@@ -122,7 +122,7 @@ TEST(TestDecodeJVC, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendJVC(irsend.encodeJVC(0x07, 0x99));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kStartOffset, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xE099, irsend.capture.value);
@@ -134,7 +134,7 @@ TEST(TestDecodeJVC, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendJVC(irsend.encodeJVC(0x1, 0x1));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kStartOffset, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0x8080, irsend.capture.value);
@@ -153,7 +153,7 @@ TEST(TestDecodeJVC, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendJVC(0xC2B8, kJvcBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kStartOffset, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
@@ -162,14 +162,14 @@ TEST(TestDecodeJVC, NormalDecodeWithRepeatAndStrict) {
EXPECT_FALSE(irsend.capture.repeat);
irsend.makeDecodeResult(2 * kJvcBits + 4);
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kStartOffset, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
EXPECT_TRUE(irsend.capture.repeat);
irsend.makeDecodeResult(2 * kJvcBits + 4 + 2 * kJvcBits + 2);
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kStartOffset, kJvcBits, true));
EXPECT_EQ(JVC, irsend.capture.decode_type);
EXPECT_EQ(kJvcBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
@@ -203,9 +203,9 @@ TEST(TestDecodeJVC, DecodeWithNonStrictValues) {
irsend.sendJVC(0x0, 8); // Illegal value JVC 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
+ ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kStartOffset, kJvcBits, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, 8, false));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kStartOffset, 8, false));
EXPECT_EQ(JVC, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -216,13 +216,13 @@ TEST(TestDecodeJVC, DecodeWithNonStrictValues) {
irsend.sendJVC(0x12345678, 32); // Illegal value JVC 32-bit message.
irsend.makeDecodeResult();
// Should not pass with strict when we ask for less bits than we got.
- ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kJvcBits, true));
+ ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kStartOffset, kJvcBits, true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kStartOffset, 32, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, 32, false));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kStartOffset, 32, false));
EXPECT_EQ(JVC, irsend.capture.decode_type);
EXPECT_EQ(32, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
@@ -235,11 +235,12 @@ TEST(TestDecodeJVC, DecodeWithNonStrictValues) {
irsend.makeDecodeResult();
// Shouldn't pass if strict off and the wrong expected bits.
- ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kJvcBits, false));
+ ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kStartOffset, kJvcBits,
+ false));
// Re-decode with correct bit size.
- ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, 36, true));
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, 36, false));
+ ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kStartOffset, 36, true));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kStartOffset, 36, false));
EXPECT_EQ(JVC, irsend.capture.decode_type);
EXPECT_EQ(36, irsend.capture.bits);
EXPECT_EQ(0x40C0, irsend.capture.value);
@@ -258,7 +259,7 @@ TEST(TestDecodeJVC, Decode64BitMessages) {
irsend.sendJVC(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeJVC(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(JVC, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -307,5 +308,6 @@ TEST(TestDecodeJVC, FailToDecodeNonJVCExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kJvcBits, false));
+ ASSERT_FALSE(irrecv.decodeJVC(&irsend.capture, kStartOffset, kJvcBits,
+ false));
}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Kelvinator_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Kelvinator_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Kelvinator_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Kelvinator_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_LG_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_LG_test.cpp
similarity index 51%
rename from lib/IRremoteESP8266-2.7.1/test/ir_LG_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_LG_test.cpp
index d1e1b8659..703ea3c6c 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_LG_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_LG_test.cpp
@@ -1,6 +1,7 @@
-// Copyright 2017 David Conran
+// Copyright 2017, 2019 David Conran
#include "ir_LG.h"
+#include "IRac.h"
#include "IRsend.h"
#include "IRsend_test.h"
#include "gtest/gtest.h"
@@ -18,6 +19,10 @@ TEST(TestCalcLGChecksum, General) {
EXPECT_EQ(0xE, calcLGChecksum(0xABCD));
EXPECT_EQ(0x1, calcLGChecksum(0x4AE5));
EXPECT_EQ(0xC, calcLGChecksum(0xFFFF));
+ EXPECT_EQ(0x1, calcLGChecksum(0xC005));
+ EXPECT_EQ(0x1, IRLgAc::calcChecksum(0x88C0051));
+ EXPECT_EQ(0x4, calcLGChecksum(0xC035));
+ EXPECT_EQ(0x4, IRLgAc::calcChecksum(0x88C0354));
}
// Tests for sendLG().
@@ -146,7 +151,7 @@ TEST(TestDecodeLG, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendLG(0x4B4AE51, kLgBits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(kLgBits, irsend.capture.bits);
EXPECT_EQ(0x4B4AE51, irsend.capture.value);
@@ -158,7 +163,7 @@ TEST(TestDecodeLG, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendLG(0xB4B4AE51, kLg32Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLg32Bits, false));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits, false));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0xB4B4AE51, irsend.capture.value);
@@ -170,7 +175,7 @@ TEST(TestDecodeLG, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendLG(irsend.encodeLG(0x07, 0x99));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(kLgBits, irsend.capture.bits);
EXPECT_EQ(0x700992, irsend.capture.value);
@@ -182,7 +187,7 @@ TEST(TestDecodeLG, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendLG(irsend.encodeLG(0x800, 0x8000), kLg32Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0x80080008, irsend.capture.value);
@@ -201,7 +206,7 @@ TEST(TestDecodeLG, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendLG(irsend.encodeLG(0x07, 0x99), kLgBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(kLgBits, irsend.capture.bits);
EXPECT_EQ(0x700992, irsend.capture.value);
@@ -213,7 +218,7 @@ TEST(TestDecodeLG, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendLG(irsend.encodeLG(0x07, 0x99), kLg32Bits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0x700992, irsend.capture.value);
@@ -233,19 +238,20 @@ TEST(TestDecodeLG, DecodeWithNonStrictValues) {
irsend.reset();
irsend.sendLG(0x1);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, false));
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLgBits, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits,
+ false));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, false));
// Illegal LG 32-bit message value.
irsend.reset();
irsend.sendLG(0x1111111, kLg32Bits);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, true));
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLg32Bits, false));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits, false));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0x1111111, irsend.capture.value);
@@ -256,7 +262,7 @@ TEST(TestDecodeLG, DecodeWithNonStrictValues) {
irsend.reset();
irsend.sendLG(0x1111111, kLg32Bits);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, false));
}
// Decode unsupported LG message sizes.
@@ -271,13 +277,14 @@ TEST(TestDecodeLG, DecodeWithNonStrictSizes) {
irsend.sendLG(irsend.encodeLG(0x07, 0x99), 16);
irsend.makeDecodeResult();
// Should fail when unexpected against different bit sizes.
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, false));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits,
+ false));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, 16, false));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, 16, false));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(16, irsend.capture.bits);
EXPECT_EQ(0x992, irsend.capture.value);
@@ -289,12 +296,13 @@ TEST(TestDecodeLG, DecodeWithNonStrictSizes) {
irsend.sendLG(0x123456789, 36); // Illegal value LG 36-bit message.
irsend.makeDecodeResult();
// Should fail when unexpected against different bit sizes.
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, false));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLg32Bits, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits,
+ false));
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, 36, false));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, 36, false));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(36, irsend.capture.bits);
EXPECT_EQ(0x123456789, irsend.capture.value);
@@ -313,9 +321,9 @@ TEST(TestDecodeLG, Decode64BitMessages) {
// Illegal value & size LG 64-bit message.
irsend.sendLG(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, 64, true));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, 64, true));
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -341,7 +349,7 @@ TEST(TestDecodeLG, DecodeGlobalCacheExample) {
irsend.sendGC(gc_test, 75);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kLg32Bits, true));
+ ASSERT_TRUE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLg32Bits, true));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(kLg32Bits, irsend.capture.bits);
EXPECT_EQ(0xB4B4AE51, irsend.capture.value);
@@ -366,7 +374,7 @@ TEST(TestDecodeLG, FailToDecodeNonLGExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeLG(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kLgBits, false));
+ ASSERT_FALSE(irrecv.decodeLG(&irsend.capture, kStartOffset, kLgBits, false));
}
// Tests for sendLG2().
@@ -446,6 +454,7 @@ TEST(TestDecodeLG, Issue620) {
532, 512, 530, 484, 556, 1536, 532}; // LG 8808721
irsend.sendRaw(rawData, 59, 38000);
irsend.makeDecodeResult();
+
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(LG, irsend.capture.decode_type);
EXPECT_EQ(28, irsend.capture.bits);
@@ -457,6 +466,7 @@ TEST(TestDecodeLG, Issue620) {
// Resend the same code as the report is a sent code doesn't decode
// to the same message code.
+ IRLgAc ac(0);
irsend.sendLG(0x8808721);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
@@ -465,6 +475,11 @@ TEST(TestDecodeLG, Issue620) {
EXPECT_EQ(0x8808721, irsend.capture.value);
EXPECT_EQ(0x88, irsend.capture.address);
EXPECT_EQ(0x872, irsend.capture.command);
+ ac.setRaw(irsend.capture.value);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ("Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 22C, Fan: 2 (Medium)",
+ ac.toString());
// The following seems to match the rawData above.
EXPECT_EQ(
"f38000d50"
@@ -478,3 +493,390 @@ TEST(TestDecodeLG, Issue620) {
"s55550",
irsend.outputStr());
}
+
+TEST(TestIRLgAcClass, SetAndGetPower) {
+ IRLgAc ac(0);
+ ac.on();
+ EXPECT_TRUE(ac.getPower());
+ ac.off();
+ EXPECT_FALSE(ac.getPower());
+ ac.setPower(true);
+ EXPECT_TRUE(ac.getPower());
+ ac.setPower(false);
+ EXPECT_FALSE(ac.getPower());
+}
+
+TEST(TestIRLgAcClass, SetAndGetTemp) {
+ IRLgAc ac(0);
+ ac.setTemp(25);
+ EXPECT_EQ(25, ac.getTemp());
+ ac.setTemp(kLgAcMinTemp);
+ EXPECT_EQ(kLgAcMinTemp, ac.getTemp());
+ ac.setTemp(kLgAcMinTemp - 1);
+ EXPECT_EQ(kLgAcMinTemp, ac.getTemp());
+ ac.setTemp(kLgAcMaxTemp);
+ EXPECT_EQ(kLgAcMaxTemp, ac.getTemp());
+ ac.setTemp(kLgAcMaxTemp + 1);
+ EXPECT_EQ(kLgAcMaxTemp, ac.getTemp());
+}
+
+TEST(TestIRLgAcClass, SetAndGetMode) {
+ IRLgAc ac(0);
+ ac.setMode(kLgAcCool);
+ ac.setFan(kLgAcFanAuto);
+ ac.setTemp(25);
+ EXPECT_EQ(25, ac.getTemp());
+ EXPECT_EQ(kLgAcCool, ac.getMode());
+ EXPECT_EQ(kLgAcFanAuto, ac.getFan());
+ ac.setMode(kLgAcHeat);
+ EXPECT_EQ(kLgAcHeat, ac.getMode());
+ ac.setMode(kLgAcDry);
+ EXPECT_EQ(kLgAcDry, ac.getMode());
+}
+
+TEST(TestIRLgAcClass, SetAndGetFan) {
+ IRLgAc ac(0);
+ ac.setMode(kLgAcCool);
+ ac.setFan(kLgAcFanAuto);
+ EXPECT_EQ(kLgAcFanAuto, ac.getFan());
+ ac.setFan(kLgAcFanLow);
+ EXPECT_EQ(kLgAcFanLow, ac.getFan());
+ ac.setFan(kLgAcFanHigh);
+ EXPECT_EQ(kLgAcFanHigh, ac.getFan());
+ ac.setFan(kLgAcFanAuto + 1);
+ EXPECT_EQ(kLgAcFanAuto, ac.getFan());
+ ac.setFan(kLgAcFanLow - 1);
+ EXPECT_EQ(kLgAcFanAuto, ac.getFan());
+}
+
+TEST(TestIRLgAcClass, toCommon) {
+ IRLgAc ac(0);
+ ac.setPower(true);
+ ac.setMode(kLgAcCool);
+ ac.setTemp(20);
+ ac.setFan(kLgAcFanHigh);
+ // Now test it.
+ ASSERT_EQ(decode_type_t::LG, ac.toCommon().protocol);
+ ASSERT_EQ(lg_ac_remote_model_t::GE6711AR2853M, ac.toCommon().model);
+ ASSERT_TRUE(ac.toCommon().power);
+ ASSERT_TRUE(ac.toCommon().celsius);
+ ASSERT_EQ(20, ac.toCommon().degrees);
+ ASSERT_EQ(stdAc::opmode_t::kCool, ac.toCommon().mode);
+ ASSERT_EQ(stdAc::fanspeed_t::kMax, ac.toCommon().fanspeed);
+ // Unsupported.
+ ASSERT_EQ(stdAc::swingv_t::kOff, ac.toCommon().swingv);
+ ASSERT_EQ(stdAc::swingh_t::kOff, ac.toCommon().swingh);
+ ASSERT_FALSE(ac.toCommon().turbo);
+ ASSERT_FALSE(ac.toCommon().clean);
+ ASSERT_FALSE(ac.toCommon().light);
+ ASSERT_FALSE(ac.toCommon().quiet);
+ ASSERT_FALSE(ac.toCommon().econo);
+ ASSERT_FALSE(ac.toCommon().filter);
+ ASSERT_FALSE(ac.toCommon().beep);
+ ASSERT_EQ(-1, ac.toCommon().sleep);
+ ASSERT_EQ(-1, ac.toCommon().clock);
+
+ // Change models
+ ac.setModel(AKB75215403);
+ ASSERT_EQ(lg_ac_remote_model_t::AKB75215403, ac.toCommon().model);
+}
+
+TEST(TestIRLgAcClass, HumanReadable) {
+ IRLgAc ac(0);
+
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: Off",
+ ac.toString());
+ ac.setMode(kLgAcHeat);
+ ac.setTemp(kLgAcMaxTemp);
+ ac.on();
+ ac.setFan(kLgAcFanHigh);
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 4 (Heat), Temp: 30C, Fan: 4 (High)",
+ ac.toString());
+ ac.setMode(kLgAcCool);
+ ac.setFan(kLgAcFanLow);
+ ac.setTemp(kLgAcMinTemp);
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 16C, Fan: 0 (Low)",
+ ac.toString());
+ ac.setTemp(ac.getTemp() + 1);
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 17C, Fan: 0 (Low)",
+ ac.toString());
+ ac.setTemp(ac.getTemp() - 1);
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 16C, Fan: 0 (Low)",
+ ac.toString());
+ ac.setPower(false);
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: Off",
+ ac.toString());
+}
+
+TEST(TestIRLgAcClass, SetAndGetRaw) {
+ IRLgAc ac(0);
+
+ ac.setRaw(0x8800A4E);
+ ASSERT_EQ(0x8800A4E, ac.getRaw());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 25C, Fan: 4 (High)",
+ ac.toString());
+
+ ac.setRaw(0x88C0051);
+ ASSERT_EQ(0x88C0051, ac.getRaw());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: Off",
+ ac.toString());
+}
+
+TEST(TestIRLgAcClass, MessageConstruction) {
+ IRLgAc ac(0);
+
+ ac.on();
+ ac.setMode(kLgAcCool);
+ ac.setTemp(25);
+ ac.setFan(kLgAcFanHigh);
+ ASSERT_EQ(0x8800A4E, ac.getRaw());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 25C, Fan: 4 (High)",
+ ac.toString());
+}
+
+TEST(TestIRLgAcClass, isValidLgAc) {
+ IRLgAc ac(0);
+
+ ac.setRaw(0x8800A4E);
+ ASSERT_TRUE(ac.isValidLgAc());
+
+ // Make the checksum wrong.
+ ac.setRaw(0x8800A4F);
+ ASSERT_FALSE(ac.isValidLgAc());
+
+ ac.setRaw(0x88C0051);
+ ASSERT_TRUE(ac.isValidLgAc());
+
+ // Use a wrong signature.
+ ac.setRaw(0x8000A4E);
+ ASSERT_FALSE(ac.isValidLgAc());
+}
+
+TEST(TestUtils, Housekeeping) {
+ ASSERT_EQ("LG", typeToString(decode_type_t::LG));
+ ASSERT_EQ(decode_type_t::LG, strToDecodeType("LG"));
+ ASSERT_FALSE(hasACState(decode_type_t::LG));
+ ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::LG));
+
+ ASSERT_EQ("LG2", typeToString(decode_type_t::LG2));
+ ASSERT_EQ(decode_type_t::LG2, strToDecodeType("LG2"));
+ ASSERT_FALSE(hasACState(decode_type_t::LG2));
+ ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::LG2));
+}
+
+TEST(TestIRLgAcClass, KnownExamples) {
+ IRLgAc ac(0);
+ // Ref:
+ // https://github.com/crankyoldgit/IRremoteESP8266/issues/1008#issuecomment-570646648
+
+ // Temp
+ ac.setRaw(0x880C152);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 4 (Heat), Temp: 16C, Fan: 5 (Auto)",
+ ac.toString());
+
+ ac.setRaw(0x880CF50);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 4 (Heat), Temp: 30C, Fan: 5 (Auto)",
+ ac.toString());
+
+ // Modes
+ ac.setRaw(0x880960F);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 1 (Dry), Temp: 21C, Fan: 0 (Low)",
+ ac.toString());
+
+ ac.setRaw(0x880C758);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 4 (Heat), Temp: 22C, Fan: 5 (Auto)",
+ ac.toString());
+
+ ac.setRaw(0x8808855);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 23C, Fan: 5 (Auto)",
+ ac.toString());
+
+ // Fan speeds
+ ac.setRaw(0x880870F);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 22C, Fan: 0 (Low)",
+ ac.toString());
+
+ ac.setRaw(0x8808721);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 22C, Fan: 2 (Medium)",
+ ac.toString());
+
+ ac.setRaw(0x8808743);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 22C, Fan: 4 (High)",
+ ac.toString());
+
+ ac.setRaw(0x8808754);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 22C, Fan: 5 (Auto)",
+ ac.toString());
+
+ ac.setRaw(0x880A745);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 2 (Fan), Temp: 22C, Fan: 4 (High)",
+ ac.toString());
+
+ // https://github.com/crankyoldgit/IRremoteESP8266/issues/1008#issuecomment-570794029
+ ac.setRaw(0x8800347);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 18C, Fan: 4 (High)",
+ ac.toString());
+ ac.setRaw(0x8808440);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 19C, Fan: 4 (High)",
+ ac.toString());
+ ac.setRaw(0x8800459);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 19C, Fan: 5 (Auto)",
+ ac.toString());
+ ac.setRaw(0x8809946);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 1 (Dry), Temp: 24C, Fan: 4 (High)",
+ ac.toString());
+ ac.setRaw(0x880A341);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 2 (Fan), Temp: 18C, Fan: 4 (High)",
+ ac.toString());
+ ac.setRaw(0x8810045);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 15C, Fan: 4 (High)",
+ ac.toString());
+ ac.setRaw(0x8810056);
+ ASSERT_TRUE(ac.isValidLgAc());
+ EXPECT_EQ(
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 15C, Fan: 5 (Auto)",
+ ac.toString());
+}
+
+// Verify decoding of LG2 message.
+TEST(TestDecodeLG2, Issue1008) {
+ IRsendTest irsend(0);
+ IRrecv capture(0);
+ irsend.begin();
+
+ irsend.reset();
+ // From https://github.com/crankyoldgit/IRremoteESP8266/issues/1008#issuecomment-570794029
+ // First entry.
+ uint16_t rawData[59] = {
+ 3272, 9844, 506, 1588, 536, 498, 534, 498, 536, 498, 534, 1540, 534, 506,
+ 534, 498, 534, 500, 532, 500, 534, 498, 534, 498, 534, 506, 534, 500, 534,
+ 498, 534, 498, 534, 498, 534, 500, 534, 498, 534, 1566, 508, 1566, 508,
+ 500, 534, 1540, 534, 506, 534, 500, 534, 500, 534, 1560, 508, 1540, 534,
+ 1558, 508}; // UNKNOWN AFC3034C
+ irsend.sendRaw(rawData, 59, 38000);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(capture.decode(&irsend.capture));
+ ASSERT_EQ(LG2, irsend.capture.decode_type);
+ EXPECT_EQ(kLgBits, irsend.capture.bits);
+ EXPECT_EQ(0x8800347, irsend.capture.value);
+
+ irsend.reset();
+ IRLgAc ac(0);
+ ac.setRaw(0x8800347);
+ ac.setModel(lg_ac_remote_model_t::AKB75215403); // aka. 2
+ ac.send();
+
+ char expected[] =
+ "Model: 2 (AKB75215403), "
+ "Power: On, Mode: 0 (Cool), Temp: 18C, Fan: 4 (High)";
+ ASSERT_EQ(expected, ac.toString());
+ ac._irsend.makeDecodeResult();
+ EXPECT_TRUE(capture.decode(&ac._irsend.capture));
+ ASSERT_EQ(LG2, ac._irsend.capture.decode_type);
+ ASSERT_EQ(kLgBits, ac._irsend.capture.bits);
+ ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture));
+}
+
+TEST(TestIRLgAcClass, DifferentModels) {
+ IRLgAc ac(0);
+ IRrecv capture(0);
+
+ ac.setRaw(0x8800347);
+
+ ac.setModel(lg_ac_remote_model_t::GE6711AR2853M); // aka. 1
+ ac._irsend.reset();
+ ac.send();
+
+ char expected1[] =
+ "Model: 1 (GE6711AR2853M), "
+ "Power: On, Mode: 0 (Cool), Temp: 18C, Fan: 4 (High)";
+ ASSERT_EQ(expected1, ac.toString());
+ ac._irsend.makeDecodeResult();
+ EXPECT_TRUE(capture.decode(&ac._irsend.capture));
+ ASSERT_EQ(LG, ac._irsend.capture.decode_type); // Not "LG2"
+ ASSERT_EQ(kLgBits, ac._irsend.capture.bits);
+ ASSERT_EQ(expected1, IRAcUtils::resultAcToString(&ac._irsend.capture));
+
+
+ ac.setModel(lg_ac_remote_model_t::AKB75215403); // aka. 2
+ ac._irsend.reset();
+ ac.send();
+
+ char expected2[] =
+ "Model: 2 (AKB75215403), "
+ "Power: On, Mode: 0 (Cool), Temp: 18C, Fan: 4 (High)";
+ ASSERT_EQ(expected2, ac.toString());
+ ac._irsend.makeDecodeResult();
+ EXPECT_TRUE(capture.decode(&ac._irsend.capture));
+ ASSERT_EQ(LG2, ac._irsend.capture.decode_type); // Not "LG"
+ ASSERT_EQ(kLgBits, ac._irsend.capture.bits);
+ ASSERT_EQ(expected2, IRAcUtils::resultAcToString(&ac._irsend.capture));
+}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Lasertag_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Lasertag_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Lasertag_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Lasertag_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Lego_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Lego_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Lego_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Lego_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Lutron_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Lutron_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Lutron_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Lutron_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_MWM_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_MWM_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_MWM_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_MWM_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Magiquest_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Magiquest_test.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Magiquest_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Magiquest_test.cpp
index bbc5f3366..1e5faf5c0 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Magiquest_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Magiquest_test.cpp
@@ -93,7 +93,8 @@ TEST(TestDecodeMagiQuest, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendMagiQuest(0x0);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kMagiquestBits, true));
+ ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kStartOffset,
+ kMagiquestBits, true));
EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -104,7 +105,8 @@ TEST(TestDecodeMagiQuest, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendMagiQuest(irsend.encodeMagiQuest(0x1, 0x1));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kMagiquestBits, true));
+ ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kStartOffset,
+ kMagiquestBits, true));
EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
EXPECT_EQ(0x10001, irsend.capture.value);
@@ -115,7 +117,8 @@ TEST(TestDecodeMagiQuest, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendMagiQuest(irsend.encodeMagiQuest(0x12345678, 0xABCD));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kMagiquestBits, true));
+ ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kStartOffset,
+ kMagiquestBits, true));
EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
EXPECT_EQ(0x12345678ABCD, irsend.capture.value);
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Midea_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Midea_test.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Midea_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Midea_test.cpp
index ebe291048..a43076fea 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Midea_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Midea_test.cpp
@@ -478,7 +478,8 @@ TEST(TestDecodeMidea, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendMidea(0x1234567890DF);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kStartOffset, kMideaBits,
+ true));
EXPECT_EQ(MIDEA, irsend.capture.decode_type);
EXPECT_EQ(kMideaBits, irsend.capture.bits);
EXPECT_EQ(0x1234567890DF, irsend.capture.value);
@@ -490,7 +491,8 @@ TEST(TestDecodeMidea, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendMidea(0x0);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kStartOffset, kMideaBits,
+ true));
EXPECT_EQ(MIDEA, irsend.capture.decode_type);
EXPECT_EQ(kMideaBits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -502,7 +504,8 @@ TEST(TestDecodeMidea, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendMidea(0xFFFFFFFFFFA0);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kStartOffset, kMideaBits,
+ true));
EXPECT_EQ(MIDEA, irsend.capture.decode_type);
EXPECT_EQ(kMideaBits, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFA0, irsend.capture.value);
@@ -534,20 +537,23 @@ TEST(TestDecodeMidea, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendMidea(0xA18263FFFF6E, kMideaBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kStartOffset, kMideaBits,
+ true));
EXPECT_EQ(MIDEA, irsend.capture.decode_type);
EXPECT_EQ(kMideaBits, irsend.capture.bits);
EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
EXPECT_FALSE(irsend.capture.repeat);
irsend.makeDecodeResult(2 * (2 * kMideaBits + 4));
- ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kStartOffset, kMideaBits,
+ true));
EXPECT_EQ(MIDEA, irsend.capture.decode_type);
EXPECT_EQ(kMideaBits, irsend.capture.bits);
EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
irsend.makeDecodeResult(4 * (2 * kMideaBits + 4));
- ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kStartOffset, kMideaBits,
+ true));
EXPECT_EQ(MIDEA, irsend.capture.decode_type);
EXPECT_EQ(kMideaBits, irsend.capture.bits);
EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
@@ -563,9 +569,10 @@ TEST(TestDecodeMidea, DecodeWithNonStrictSizes) {
irsend.sendMidea(0x12, 8); // Illegal value Midea 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kStartOffset, kMideaBits,
+ true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, 8, false));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kStartOffset, 8, false));
EXPECT_EQ(MIDEA, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0x12, irsend.capture.value);
@@ -574,13 +581,14 @@ TEST(TestDecodeMidea, DecodeWithNonStrictSizes) {
irsend.sendMidea(0x12345678, 32); // Illegal value Midea 32-bit message.
irsend.makeDecodeResult();
// Shouldn't pass with strict when we ask for less bits than we got.
- ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kStartOffset, kMideaBits,
+ true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kStartOffset, 32, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, 32, false));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kStartOffset, 32, false));
EXPECT_EQ(MIDEA, irsend.capture.decode_type);
EXPECT_EQ(32, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
@@ -589,7 +597,7 @@ TEST(TestDecodeMidea, DecodeWithNonStrictSizes) {
irsend.reset();
irsend.sendMidea(0x123456, kMideaBits, 2);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, 9, false));
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kStartOffset, 9, false));
}
// Decode (non-standard) 64-bit messages.
@@ -603,7 +611,7 @@ TEST(TestDecodeMidea, Decode64BitMessages) {
irsend.sendMidea(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(MIDEA, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -625,7 +633,8 @@ TEST(TestDecodeMidea, FailToDecodeNonMideaExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kMideaBits, false));
+ ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kStartOffset, kMideaBits,
+ false));
}
// Decode against a real capture reported by a user. See issue #354
@@ -768,7 +777,8 @@ TEST(TestDecodeMidea, Issue887) {
irsend.reset();
irsend.sendMidea(hwaddr);
irsend.makeDecodeResult();
- EXPECT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, false));
+ EXPECT_TRUE(irrecv.decodeMidea(&irsend.capture, kStartOffset, kMideaBits,
+ false));
EXPECT_EQ(MIDEA, irsend.capture.decode_type);
EXPECT_EQ(kMideaBits, irsend.capture.bits);
EXPECT_EQ(hwaddr, irsend.capture.value);
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_MitsubishiHeavy_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_MitsubishiHeavy_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_MitsubishiHeavy_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_MitsubishiHeavy_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Mitsubishi_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Mitsubishi_test.cpp
similarity index 96%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Mitsubishi_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Mitsubishi_test.cpp
index 8236777b5..4f759c046 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Mitsubishi_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Mitsubishi_test.cpp
@@ -143,7 +143,8 @@ TEST(TestDecodeMitsubishi, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendMitsubishi(0xC2B8);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset,
+ kMitsubishiBits, true));
EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
@@ -154,7 +155,8 @@ TEST(TestDecodeMitsubishi, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendMitsubishi(0x0);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset,
+ kMitsubishiBits, true));
EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -165,7 +167,8 @@ TEST(TestDecodeMitsubishi, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendMitsubishi(0xFFFF);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset,
+ kMitsubishiBits, true));
EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
EXPECT_EQ(0xFFFF, irsend.capture.value);
@@ -178,17 +181,24 @@ TEST(TestDecodeMitsubishi, NormalDecodeWithStrict) {
// 12 bits.
irsend.sendMitsubishi(0xFFF, 12);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 12, true));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 64, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset,
+ kMitsubishiBits, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset, 12,
+ true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset, 64,
+ true));
// 32 bits.
irsend.sendMitsubishi(0xFFF, 32);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 12, true));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 32, true));
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 64, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset,
+ kMitsubishiBits, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset, 12,
+ true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset, 32,
+ true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset, 64,
+ true));
}
// Decode normal repeated Mitsubishi messages.
@@ -201,7 +211,8 @@ TEST(TestDecodeMitsubishi, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendMitsubishi(0xC2B8, kMitsubishiBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset,
+ kMitsubishiBits, true));
EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
@@ -213,7 +224,8 @@ TEST(TestDecodeMitsubishi, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendMitsubishi(0xC2B8, kMitsubishiBits, 0);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset,
+ kMitsubishiBits, true));
EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
EXPECT_EQ(kMitsubishiBits, irsend.capture.bits);
EXPECT_EQ(0xC2B8, irsend.capture.value);
@@ -232,31 +244,36 @@ TEST(TestDecodeMitsubishi, DecodeWithNonStrictValues) {
irsend.sendMitsubishi(0x0, 8); // Illegal sized Mitsubishi 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset,
+ kMitsubishiBits, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, 8, false));
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset, 8, false));
EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 64, false));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset, 64,
+ false));
irsend.reset();
// Illegal sized Mitsubishi 64-bit message.
irsend.sendMitsubishi(0xFEDCBA9876543210, 64);
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, true));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset,
+ kMitsubishiBits, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset, 64,
+ false));
EXPECT_EQ(MITSUBISHI, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFEDCBA9876543210, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
// Should fail when we are after a shorter message than we got.
- ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, 8, false));
+ ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture, kStartOffset, 8,
+ false));
}
// Decode a 'real' example via GlobalCache
@@ -299,7 +316,8 @@ TEST(TestDecodeMitsubishi, FailToDecodeNonMitsubishiExample) {
ASSERT_FALSE(irrecv.decodeMitsubishi(&irsend.capture));
ASSERT_FALSE(
- irrecv.decodeMitsubishi(&irsend.capture, kMitsubishiBits, false));
+ irrecv.decodeMitsubishi(&irsend.capture, kStartOffset, kMitsubishiBits,
+ false));
}
// Tests for Mitsubishi A/C methods.
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_NEC_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_NEC_test.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/test/ir_NEC_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_NEC_test.cpp
index c881b7b44..f7598c981 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_NEC_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_NEC_test.cpp
@@ -162,7 +162,7 @@ TEST(TestDecodeNEC, NormalNECDecodeWithoutStrict) {
irsend.reset();
irsend.sendNEC(0x0);
irsend.makeDecodeResult();
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, 32, false));
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, kStartOffset, 32, false));
EXPECT_EQ(NEC, irsend.capture.decode_type);
EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0, irsend.capture.value);
@@ -172,7 +172,7 @@ TEST(TestDecodeNEC, NormalNECDecodeWithoutStrict) {
irsend.reset();
irsend.sendNEC(0x12345678);
irsend.makeDecodeResult();
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, 32, false));
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, kStartOffset, 32, false));
EXPECT_EQ(NEC, irsend.capture.decode_type);
EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
@@ -189,7 +189,7 @@ TEST(TestDecodeNEC, ShortNECDecodeWithoutStrict) {
irsend.reset();
irsend.sendNEC(0x0, 16);
irsend.makeDecodeResult();
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, 16, false));
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, kStartOffset, 16, false));
EXPECT_EQ(NEC, irsend.capture.decode_type);
EXPECT_EQ(16, irsend.capture.bits);
EXPECT_EQ(0, irsend.capture.value);
@@ -200,13 +200,13 @@ TEST(TestDecodeNEC, ShortNECDecodeWithoutStrict) {
irsend.reset();
irsend.sendNEC(0x0, 32);
irsend.makeDecodeResult();
- EXPECT_FALSE(irrecv.decodeNEC(&irsend.capture, 16, false));
+ EXPECT_FALSE(irrecv.decodeNEC(&irsend.capture, kStartOffset, 16, false));
// Send 16 bits of data, but fail because we are expecting 17.
irsend.reset();
irsend.sendNEC(0x0, 16);
irsend.makeDecodeResult();
- EXPECT_FALSE(irrecv.decodeNEC(&irsend.capture, 17, false));
+ EXPECT_FALSE(irrecv.decodeNEC(&irsend.capture, kStartOffset, 17, false));
}
// Longer NEC-like messages (without strict naturally)
@@ -218,7 +218,7 @@ TEST(TestDecodeNEC, LongerNECDecodeWithoutStrict) {
irsend.reset();
irsend.sendNEC(0x1234567890ABCDEF, 64);
irsend.makeDecodeResult();
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, 64, false));
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(NEC, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0x1234567890ABCDEF, irsend.capture.value);
@@ -229,7 +229,7 @@ TEST(TestDecodeNEC, LongerNECDecodeWithoutStrict) {
irsend.reset();
irsend.sendNEC(0x0, 63);
irsend.makeDecodeResult();
- EXPECT_FALSE(irrecv.decodeNEC(&irsend.capture, 64, false));
+ EXPECT_FALSE(irrecv.decodeNEC(&irsend.capture, kStartOffset, 64, false));
}
// Incorrect decoding reported in Issue #243
@@ -299,7 +299,7 @@ TEST(TestDecodeNEC, NonStrictNECDecode_Issue264) {
irsend.sendRaw(rawData, 67, 38);
irsend.makeDecodeResult();
EXPECT_FALSE(irrecv.decodeNEC(&irsend.capture)); // Not strictly NEC
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, kNECBits, false));
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, kStartOffset, kNECBits, false));
EXPECT_EQ(0x77E1A040, irsend.capture.value);
// Do it all again, but with a normal decode.
@@ -331,7 +331,7 @@ TEST(TestDecodeNEC, AutoReceiveCalibration) {
irsend.sendRaw(rawData, 67, 38);
irsend.makeDecodeResult();
- EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, kNECBits, false));
+ EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture, kStartOffset, kNECBits, false));
EXPECT_EQ(NEC, irsend.capture.decode_type);
EXPECT_EQ(kNECBits, irsend.capture.bits);
EXPECT_EQ(0x77E1A040, irsend.capture.value);
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Neoclima_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Neoclima_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Neoclima_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Neoclima_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Nikai_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Nikai_test.cpp
similarity index 87%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Nikai_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Nikai_test.cpp
index fff242326..98d6d806d 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Nikai_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Nikai_test.cpp
@@ -77,7 +77,8 @@ TEST(TestDecodeNikai, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendNikai(0x123456);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
+ ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits,
+ true));
EXPECT_EQ(NIKAI, irsend.capture.decode_type);
EXPECT_EQ(kNikaiBits, irsend.capture.bits);
EXPECT_EQ(0x123456, irsend.capture.value);
@@ -85,7 +86,8 @@ TEST(TestDecodeNikai, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendNikai(0x101);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
+ ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits,
+ true));
EXPECT_EQ(NIKAI, irsend.capture.decode_type);
EXPECT_EQ(kNikaiBits, irsend.capture.bits);
EXPECT_EQ(0x101, irsend.capture.value);
@@ -101,7 +103,8 @@ TEST(TestDecodeNikai, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendNikai(0xD5F2A, kNikaiBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
+ ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits,
+ true));
EXPECT_EQ(NIKAI, irsend.capture.decode_type);
EXPECT_EQ(kNikaiBits, irsend.capture.bits);
EXPECT_EQ(0xD5F2A, irsend.capture.value);
@@ -117,18 +120,20 @@ TEST(TestDecodeNikai, NormalDecodeWithNonStrict) {
irsend.sendNikai(0x0, 16);
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits,
+ true));
// And it should fail when we expect more bits.
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, false));
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits,
+ false));
// Should pass if strict off if we ask for correct nr. of bits sent.
- ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, 16, false));
+ ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kStartOffset, 16, false));
EXPECT_EQ(NIKAI, irsend.capture.decode_type);
EXPECT_EQ(16, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
// Should fail as we are expecting less bits than there are.
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, 12, false));
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kStartOffset, 12, false));
}
// Decode (non-standard) 64-bit messages.
@@ -142,9 +147,10 @@ TEST(TestDecodeNikai, Decode64BitMessages) {
// Illegal size Nikai 64-bit message.
irsend.sendNikai(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits,
+ true));
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(NIKAI, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -211,5 +217,6 @@ TEST(TestDecodeNikai, FailToDecodeNonNikaiExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, false));
+ ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits,
+ false));
}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Panasonic_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Panasonic_test.cpp
similarity index 91%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Panasonic_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Panasonic_test.cpp
index 471a324c8..7f022ed17 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Panasonic_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Panasonic_test.cpp
@@ -219,7 +219,8 @@ TEST(TestDecodePanasonic, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendPanasonic64(0x40040190ED7C);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
@@ -231,7 +232,8 @@ TEST(TestDecodePanasonic, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 0x12, 0x34, 0x56));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x400412345670, irsend.capture.value);
@@ -243,7 +245,8 @@ TEST(TestDecodePanasonic, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 0x1, 0x1, 0x1));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x400401010101, irsend.capture.value);
@@ -262,7 +265,8 @@ TEST(TestDecodePanasonic, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendPanasonic64(0x40040190ED7C, kPanasonicBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
@@ -271,13 +275,15 @@ TEST(TestDecodePanasonic, NormalDecodeWithRepeatAndStrict) {
EXPECT_FALSE(irsend.capture.repeat);
irsend.makeDecodeResult(2 * kPanasonicBits + 4);
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
irsend.makeDecodeResult(2 * (2 * kPanasonicBits + 4));
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
@@ -293,9 +299,11 @@ TEST(TestDecodePanasonic, DecodeWithNonStrictValues) {
irsend.sendPanasonic64(0x0); // Illegal value Panasonic 48-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, false));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -307,9 +315,11 @@ TEST(TestDecodePanasonic, DecodeWithNonStrictValues) {
irsend.sendPanasonic64(irsend.encodePanasonic(0, 1, 2, 3));
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, false));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x1020300, irsend.capture.value);
@@ -327,13 +337,14 @@ TEST(TestDecodePanasonic, DecodeWithNonStrictSize) {
irsend.sendPanasonic64(0x12345678, 32); // Illegal size Panasonic message.
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kStartOffset, 32, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 32, false));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset, 32, false));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(32, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
@@ -345,12 +356,14 @@ TEST(TestDecodePanasonic, DecodeWithNonStrictSize) {
irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 1, 2, 3), 56);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
// Shouldn't pass if strict off and wrong bit size.
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, false));
// Re-decode with correct bit size.
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 56, true));
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 56, false));
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kStartOffset, 56, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset, 56, false));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(56, irsend.capture.bits);
EXPECT_EQ(0x400401020300, irsend.capture.value);
@@ -368,9 +381,9 @@ TEST(TestDecodePanasonic, Decode64BitMessages) {
// Illegal value & size Panasonic 64-bit message.
irsend.sendPanasonic64(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 64, true));
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kStartOffset, 64, true));
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -397,7 +410,8 @@ TEST(TestDecodePanasonic, DecodeGlobalCacheExample) {
irsend.sendGC(gc_test, 103);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
+ ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, true));
EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
@@ -430,7 +444,8 @@ TEST(TestDecodePanasonic, FailToDecodeNonPanasonicExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture));
- ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
+ ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kStartOffset,
+ kPanasonicBits, false));
}
// Failing to decode Panasonic in Issue #245
@@ -736,6 +751,26 @@ TEST(TestIRPanasonicAcClass, QuietAndPowerful) {
EXPECT_FALSE(pana.getPowerful());
}
+TEST(TestIRPanasonicAcClass, SetAndGetIon) {
+ IRPanasonicAc ac(0);
+ // Ion Filter only works for DKE.
+ ac.setModel(kPanasonicDke);
+ ac.setIon(true);
+ EXPECT_TRUE(ac.getIon());
+ ac.setIon(false);
+ EXPECT_FALSE(ac.getIon());
+ ac.setIon(true);
+ EXPECT_TRUE(ac.getIon());
+
+ // Now try a different (a guess at unsupported) model.
+ ac.setModel(kPanasonicRkr);
+ EXPECT_FALSE(ac.getIon());
+ ac.setIon(true);
+ EXPECT_FALSE(ac.getIon());
+ ac.setIon(false);
+ EXPECT_FALSE(ac.getIon());
+}
+
TEST(TestIRPanasonicAcClass, HumanReadable) {
IRPanasonicAc pana(0);
EXPECT_EQ(
@@ -767,7 +802,7 @@ TEST(TestIRPanasonicAcClass, HumanReadable) {
EXPECT_EQ(
"Model: 3 (DKE), Power: Off, Mode: 4 (Heat), Temp: 30C, "
"Fan: 4 (High), Swing(V): 15 (Auto), "
- "Swing(H): 11 (Right), Quiet: On, Powerful: Off, "
+ "Swing(H): 11 (Right), Quiet: On, Powerful: Off, Ion: Off, "
"Clock: 00:00, On Timer: Off, Off Timer: Off",
pana.toString());
}
@@ -1180,3 +1215,38 @@ TEST(TestIRPanasonicAcClass, toCommon) {
ASSERT_EQ(kPanasonicAcSwingVMiddle,
IRPanasonicAc::convertSwingV(stdAc::swingv_t::kMiddle));
}
+
+//
+// Test for DKE/DKW model / see issue #1024
+TEST(TestDecodePanasonicAC, DkeIonRealMessages) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // Data from Issue #1024
+ // 0x0220E004000000060220E004004F3280AF0D000660000001000630
+ uint8_t dkeIonOff[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x4F, 0x32, 0x80, 0xAF, 0x0D,
+ 0x00, 0x06, 0x60, 0x00, 0x00, 0x01, 0x00, 0x06, 0x30};
+
+ // 0x0220E004000000060220E004004F3280AF0D000660000101000631
+ uint8_t dkeIonOn[kPanasonicAcStateLength] = {
+ 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
+ 0x20, 0xE0, 0x04, 0x00, 0x4F, 0x32, 0x80, 0xAF, 0x0D,
+ 0x00, 0x06, 0x60, 0x00, 0x01, 0x01, 0x00, 0x06, 0x31};
+
+ IRPanasonicAc ac(0);
+ ac.setRaw(dkeIonOff);
+ EXPECT_EQ(
+ "Model: 3 (DKE), Power: On, Mode: 4 (Heat), Temp: 25C, Fan: 7 (Auto), "
+ "Swing(V): 15 (Auto), Swing(H): 13 (Auto), Quiet: Off, Powerful: Off, "
+ "Ion: Off, Clock: 00:00, On Timer: 00:00, Off Timer: 00:00",
+ ac.toString());
+ ac.setRaw(dkeIonOn);
+ EXPECT_EQ(
+ "Model: 3 (DKE), Power: On, Mode: 4 (Heat), Temp: 25C, Fan: 7 (Auto), "
+ "Swing(V): 15 (Auto), Swing(H): 13 (Auto), Quiet: Off, Powerful: Off, "
+ "Ion: On, Clock: 00:00, On Timer: 00:00, Off Timer: 00:00",
+ ac.toString());
+}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Pioneer_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Pioneer_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Pioneer_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Pioneer_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Pronto_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Pronto_test.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Pronto_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Pronto_test.cpp
index 513f985da..b5020987f 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Pronto_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Pronto_test.cpp
@@ -366,3 +366,28 @@ TEST(TestSendPronto, NormalPlusRepeatSequence) {
"m8892s2210m546s95212",
irsend.outputStr());
}
+
+// Tests for #1034
+TEST(TestSendPronto, Issue1034) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ // JVC code allegedly.
+ uint16_t pronto_test[40] = {
+ 0x0000, 0x006c, 0x0001, 0x0011, 0x0140, 0x00a0, 0x0014, 0x003c, 0x0014,
+ 0x003c, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x003c,
+ 0x0014, 0x0014, 0x0014, 0x003c, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014,
+ 0x0014, 0x0014, 0x0014, 0x0014, 0x003c, 0x0014, 0x0014, 0x0014, 0x0014,
+ 0x0014, 0x0014, 0x0014, 0x0384};
+
+ irsend.reset();
+ irsend.sendPronto(pronto_test, 40, 1);
+ irsend.makeDecodeResult();
+ EXPECT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(JVC, irsend.capture.decode_type);
+ EXPECT_EQ(kJvcBits, irsend.capture.bits);
+ EXPECT_EQ(0xc508, irsend.capture.value);
+ EXPECT_EQ(0xa3, irsend.capture.address);
+ EXPECT_EQ(0x10, irsend.capture.command);
+}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_RC5_RC6_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_RC5_RC6_test.cpp
similarity index 88%
rename from lib/IRremoteESP8266-2.7.1/test/ir_RC5_RC6_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_RC5_RC6_test.cpp
index da9fa027c..0b46bad7f 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_RC5_RC6_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_RC5_RC6_test.cpp
@@ -202,7 +202,7 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRC5(0x175);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5Bits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
@@ -214,7 +214,7 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRC5(0x175);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5XBits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
@@ -227,7 +227,7 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRC5(0x175, kRC5XBits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5XBits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
@@ -239,7 +239,7 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRC5(irsend.encodeRC5(0x00, 0x0B, true));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5Bits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x80B, irsend.capture.value);
@@ -251,7 +251,7 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), kRC5XBits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5XBits, true));
EXPECT_EQ(RC5X, irsend.capture.decode_type);
EXPECT_EQ(kRC5XBits, irsend.capture.bits);
EXPECT_EQ(0x1881, irsend.capture.value);
@@ -264,7 +264,7 @@ TEST(TestDecodeRC5, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), kRC5XBits);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5Bits, true));
}
// Decode normal repeated RC5 messages.
@@ -277,7 +277,7 @@ TEST(TestDecodeRC5, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendRC5(0x174, kRC5Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5Bits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x174, irsend.capture.value);
@@ -288,7 +288,7 @@ TEST(TestDecodeRC5, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendRC5(0x175, kRC5Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5Bits, true));
EXPECT_EQ(RC5, irsend.capture.decode_type);
EXPECT_EQ(kRC5Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
@@ -299,7 +299,7 @@ TEST(TestDecodeRC5, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendRC5(irsend.encodeRC5X(0x02, 0x41, true), kRC5XBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5XBits, true));
EXPECT_EQ(RC5X, irsend.capture.decode_type);
EXPECT_EQ(kRC5XBits, irsend.capture.bits);
EXPECT_EQ(0x1881, irsend.capture.value);
@@ -317,10 +317,11 @@ TEST(TestDecodeRC5, DecodeWithNonStrictValues) {
irsend.sendRC5(0xFA, 8); // Illegal value RC5 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5XBits,
+ true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, 8, false));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, 8, false));
EXPECT_EQ(RC5, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0xFA, irsend.capture.value);
@@ -331,14 +332,15 @@ TEST(TestDecodeRC5, DecodeWithNonStrictValues) {
irsend.sendRC5(0x12345678, 32); // Illegal size RC5 32-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5XBits,
+ true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kStartOffset, 32, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, 32, false));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, 32, false));
EXPECT_EQ(RC5, irsend.capture.decode_type);
EXPECT_EQ(31, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
@@ -347,14 +349,15 @@ TEST(TestDecodeRC5, DecodeWithNonStrictValues) {
irsend.sendRC5(0x87654321, 32); // Illegal size RC5 32-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, true));
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5XBits, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5Bits, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5XBits,
+ true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kStartOffset, 32, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, 32, false));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, 32, false));
EXPECT_EQ(RC5X, irsend.capture.decode_type);
EXPECT_EQ(32, irsend.capture.bits);
EXPECT_EQ(0x87654321, irsend.capture.value);
@@ -371,7 +374,7 @@ TEST(TestDecodeRC5, Decode64BitMessages) {
irsend.sendRC5(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeRC5(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(RC5X, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -392,7 +395,8 @@ TEST(TestDecodeRC5, FailToDecodeNonRC5Example) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kRC5Bits, false));
+ ASSERT_FALSE(irrecv.decodeRC5(&irsend.capture, kStartOffset, kRC5Bits,
+ false));
}
// RRRRRR CCCCC 666
@@ -688,7 +692,8 @@ TEST(TestDecodeRC6, NormalMode0DecodeWithStrict) {
irsend.reset();
irsend.sendRC6(0x175);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6Mode0Bits,
+ true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
@@ -700,7 +705,8 @@ TEST(TestDecodeRC6, NormalMode0DecodeWithStrict) {
irsend.reset();
irsend.sendRC6(irsend.encodeRC6(0x1234567, 0x89, kRC6Mode0Bits));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6Mode0Bits,
+ true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x56789, irsend.capture.value);
@@ -712,7 +718,8 @@ TEST(TestDecodeRC6, NormalMode0DecodeWithStrict) {
irsend.reset();
irsend.sendRC6(0x123456789, kRC6Mode0Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6Mode0Bits,
+ true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x56789, irsend.capture.value);
@@ -731,7 +738,8 @@ TEST(TestDecodeRC6, Normal36BitDecodeWithStrict) {
irsend.reset();
irsend.sendRC6(0x175, kRC6_36Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6_36Bits,
+ true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
@@ -743,7 +751,8 @@ TEST(TestDecodeRC6, Normal36BitDecodeWithStrict) {
irsend.reset();
irsend.sendRC6(irsend.encodeRC6(0x1234567, 0x89, kRC6_36Bits), kRC6_36Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6_36Bits,
+ true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0x123456789, irsend.capture.value);
@@ -762,7 +771,8 @@ TEST(TestDecodeRC6, NormalMode0DecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendRC6(0x174, kRC6Mode0Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6Mode0Bits,
+ true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x174, irsend.capture.value);
@@ -773,7 +783,8 @@ TEST(TestDecodeRC6, NormalMode0DecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendRC6(0x175, kRC6Mode0Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6Mode0Bits,
+ true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
EXPECT_EQ(kRC6Mode0Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
@@ -791,7 +802,8 @@ TEST(TestDecodeRC6, Normal36BitDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendRC6(0x175, kRC6_36Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6_36Bits,
+ true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0x175, irsend.capture.value);
@@ -802,7 +814,8 @@ TEST(TestDecodeRC6, Normal36BitDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendRC6(0x174, kRC6_36Bits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6_36Bits,
+ true));
EXPECT_EQ(RC6, irsend.capture.decode_type);
EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0x174, irsend.capture.value);
@@ -881,7 +894,7 @@ TEST(TestDecodeRC6, Decode36BitGlobalCacheExample) {
irsend.sendGC(gc_test, 65);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits));
+ ASSERT_TRUE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6_36Bits));
EXPECT_EQ(RC6, irsend.capture.decode_type);
EXPECT_EQ(kRC6_36Bits, irsend.capture.bits);
EXPECT_EQ(0xC800F742A, irsend.capture.value);
@@ -905,18 +918,26 @@ TEST(TestDecodeRC5, FailToDecodeNonRC6Example) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, false));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, false));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6Mode0Bits,
+ true));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6Mode0Bits,
+ false));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6_36Bits,
+ true));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, kStartOffset,
+ false));
irsend.reset();
irsend.sendRC5(0x0);
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, true));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6Mode0Bits, false));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, true));
- ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, false));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6Mode0Bits,
+ true));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6Mode0Bits,
+ false));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kStartOffset, kRC6_36Bits,
+ true));
+ ASSERT_FALSE(irrecv.decodeRC6(&irsend.capture, kRC6_36Bits, kStartOffset,
+ false));
}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_RCMM_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_RCMM_test.cpp
similarity index 86%
rename from lib/IRremoteESP8266-2.7.1/test/ir_RCMM_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_RCMM_test.cpp
index 22306a59b..ef37d87a6 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_RCMM_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_RCMM_test.cpp
@@ -91,7 +91,8 @@ TEST(TestDecodeRCMM, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRCMM(0xe0a600);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kRCMMBits, true));
+ ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, kRCMMBits,
+ true));
EXPECT_EQ(RCMM, irsend.capture.decode_type);
EXPECT_EQ(kRCMMBits, irsend.capture.bits);
EXPECT_EQ(0xe0a600, irsend.capture.value);
@@ -103,7 +104,7 @@ TEST(TestDecodeRCMM, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRCMM(0x600, 12);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, 12, true));
+ ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 12, true));
EXPECT_EQ(RCMM, irsend.capture.decode_type);
EXPECT_EQ(12, irsend.capture.bits);
EXPECT_EQ(0x600, irsend.capture.value);
@@ -115,7 +116,7 @@ TEST(TestDecodeRCMM, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendRCMM(0x28e0a600, 32);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, 32, true));
+ ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 32, true));
EXPECT_EQ(RCMM, irsend.capture.decode_type);
EXPECT_EQ(32, irsend.capture.bits);
EXPECT_EQ(0x28e0a600, irsend.capture.value);
@@ -134,15 +135,15 @@ TEST(TestDecodeRCMM, IllegalDecodeWithStrict) {
irsend.reset();
irsend.sendRCMM(0x0, 8);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, 8, true));
- ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, 12, true));
+ ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 8, true));
+ ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 12, true));
// Illegal RCMM 36-bit message.
irsend.reset();
irsend.sendRCMM(0x0, 36);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, 12, true));
- ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, 36, true));
+ ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 12, true));
+ ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 36, true));
}
// Decodes without strict mode.
@@ -155,13 +156,13 @@ TEST(TestDecodeRCMM, DecodeWithoutStrict) {
irsend.reset();
irsend.sendRCMM(0x55, 8);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, 8, false));
+ ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 8, false));
EXPECT_EQ(RCMM, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0x55, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
- ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, 12, false));
+ ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 12, false));
EXPECT_EQ(RCMM, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0x55, irsend.capture.value);
@@ -172,18 +173,18 @@ TEST(TestDecodeRCMM, DecodeWithoutStrict) {
irsend.reset();
irsend.sendRCMM(0x123456789, 36);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, 12, false));
+ ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 12, false));
EXPECT_EQ(RCMM, irsend.capture.decode_type);
EXPECT_EQ(36, irsend.capture.bits);
EXPECT_EQ(0x123456789, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
- ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, 24, false));
+ ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 24, false));
EXPECT_EQ(36, irsend.capture.bits);
EXPECT_EQ(0x123456789, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
- ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, 36, false));
+ ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 36, false));
EXPECT_EQ(RCMM, irsend.capture.decode_type);
EXPECT_EQ(36, irsend.capture.bits);
EXPECT_EQ(0x123456789, irsend.capture.value);
@@ -202,7 +203,7 @@ TEST(TestDecodeRCMM, Decode64BitMessages) {
irsend.sendRCMM(0xFEDCBA9876543210, 64);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(RCMM, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFEDCBA9876543210, irsend.capture.value);
@@ -226,7 +227,8 @@ TEST(TestDecodeRCMM, FailToDecodeNonRCMMExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, kRCMMBits, false));
+ ASSERT_FALSE(irrecv.decodeRCMM(&irsend.capture, kStartOffset, kRCMMBits,
+ false));
}
// Issue 281 Debugging
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Samsung_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Samsung_test.cpp
similarity index 93%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Samsung_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Samsung_test.cpp
index 9a572c631..c44572934 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Samsung_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Samsung_test.cpp
@@ -107,7 +107,8 @@ TEST(TestDecodeSamsung, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSAMSUNG(0xE0E09966);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ true));
EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
EXPECT_EQ(kSamsungBits, irsend.capture.bits);
EXPECT_EQ(0xE0E09966, irsend.capture.value);
@@ -118,7 +119,8 @@ TEST(TestDecodeSamsung, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x07, 0x99));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ true));
EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
EXPECT_EQ(kSamsungBits, irsend.capture.bits);
EXPECT_EQ(0xE0E09966, irsend.capture.value);
@@ -129,7 +131,8 @@ TEST(TestDecodeSamsung, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x1, 0x1));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ true));
EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
EXPECT_EQ(kSamsungBits, irsend.capture.bits);
EXPECT_EQ(0x8080807F, irsend.capture.value);
@@ -147,7 +150,8 @@ TEST(TestDecodeSamsung, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendSAMSUNG(0xE0E09966, kSamsungBits, 2);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ true));
EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
EXPECT_EQ(kSamsungBits, irsend.capture.bits);
EXPECT_EQ(0xE0E09966, irsend.capture.value);
@@ -165,9 +169,11 @@ TEST(TestDecodeSamsung, DecodeWithNonStrictValues) {
irsend.sendSAMSUNG(0x0); // Illegal value Samsung 32-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ false));
EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
EXPECT_EQ(kSamsungBits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -178,9 +184,11 @@ TEST(TestDecodeSamsung, DecodeWithNonStrictValues) {
irsend.sendSAMSUNG(0x12345678); // Illegal value Samsung 32-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ false));
EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
EXPECT_EQ(kSamsungBits, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
@@ -192,12 +200,14 @@ TEST(TestDecodeSamsung, DecodeWithNonStrictValues) {
irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0, 0), 36);
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ true));
// Shouldn't pass if strict off and wrong expected bit size.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ false));
// Re-decode with correct bit size.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, 36, true));
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 36, false));
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, 36, true));
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, 36, false));
EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
EXPECT_EQ(36, irsend.capture.bits);
EXPECT_EQ(0xFF, irsend.capture.value); // We told it to expect 8 bits less.
@@ -214,7 +224,7 @@ TEST(TestDecodeSamsung, DecodeWithNonStrictValues) {
ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
// Should pass if strict off if we ask for correct nr. of bits sent.
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 16, false));
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, 16, false));
EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
EXPECT_EQ(16, irsend.capture.bits);
EXPECT_EQ(0xFF, irsend.capture.value); // We told it to expect 4 bits less.
@@ -222,7 +232,7 @@ TEST(TestDecodeSamsung, DecodeWithNonStrictValues) {
EXPECT_EQ(0x00, irsend.capture.command);
// Should fail as we are expecting less bits than there are.
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, 12, false));
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, 12, false));
}
// Decode (non-standard) 64-bit messages.
@@ -236,9 +246,10 @@ TEST(TestDecodeSamsung, Decode64BitMessages) {
// Illegal value & size Samsung 64-bit message.
irsend.sendSAMSUNG(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ true));
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -289,7 +300,8 @@ TEST(TestDecodeSamsung, FailToDecodeNonSamsungExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
+ ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kStartOffset, kSamsungBits,
+ false));
}
// General housekeeping
@@ -451,6 +463,26 @@ TEST(TestIRSamsungAcClass, SetAndGetBeep) {
EXPECT_TRUE(samsung.getBeep());
}
+TEST(TestIRSamsungAcClass, SetAndGetDisplay) {
+ IRSamsungAc ac(0);
+ ac.setDisplay(true);
+ EXPECT_TRUE(ac.getDisplay());
+ ac.setDisplay(false);
+ EXPECT_FALSE(ac.getDisplay());
+ ac.setDisplay(true);
+ EXPECT_TRUE(ac.getDisplay());
+}
+
+TEST(TestIRSamsungAcClass, SetAndGetIon) {
+ IRSamsungAc ac(0);
+ ac.setIon(true);
+ EXPECT_TRUE(ac.getIon());
+ ac.setIon(false);
+ EXPECT_FALSE(ac.getIon());
+ ac.setIon(true);
+ EXPECT_TRUE(ac.getIon());
+}
+
TEST(TestIRSamsungAcClass, SetAndGetTemp) {
IRSamsungAc samsung(0);
samsung.setTemp(25);
@@ -549,7 +581,8 @@ TEST(TestIRSamsungAcClass, SetAndGetPowerful) {
EXPECT_EQ(kSamsungAcFanTurbo, ac.getFan());
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 7 (Turbo), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: On", ac.toString());
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: On, Light: On, Ion: Off",
+ ac.toString());
uint8_t off[kSamsungAcStateLength] = {
0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
@@ -559,7 +592,8 @@ TEST(TestIRSamsungAcClass, SetAndGetPowerful) {
EXPECT_NE(kSamsungAcFanTurbo, ac.getFan());
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 0 (Auto), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off", ac.toString());
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
+ ac.toString());
}
TEST(TestIRSamsungAcClass, QuietAndPowerfulAreMutuallyExclusive) {
@@ -624,7 +658,7 @@ TEST(TestIRSamsungAcClass, HumanReadable) {
IRSamsungAc samsung(0);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 2 (Low), Swing: On, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
samsung.toString());
samsung.setTemp(kSamsungAcMaxTemp);
samsung.setMode(kSamsungAcHeat);
@@ -635,18 +669,24 @@ TEST(TestIRSamsungAcClass, HumanReadable) {
samsung.setClean(true);
EXPECT_EQ(
"Power: Off, Mode: 4 (Heat), Temp: 30C, Fan: 5 (High), Swing: Off, "
- "Beep: On, Clean: On, Quiet: Off, Powerful: Off",
+ "Beep: On, Clean: On, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
samsung.toString());
samsung.setQuiet(true);
EXPECT_EQ(
"Power: Off, Mode: 4 (Heat), Temp: 30C, Fan: 0 (Auto), Swing: Off, "
- "Beep: On, Clean: On, Quiet: On, Powerful: Off",
+ "Beep: On, Clean: On, Quiet: On, Powerful: Off, Light: On, Ion: Off",
samsung.toString());
samsung.setQuiet(false);
samsung.setPowerful(true);
EXPECT_EQ(
"Power: Off, Mode: 4 (Heat), Temp: 30C, Fan: 7 (Turbo), Swing: Off, "
- "Beep: On, Clean: On, Quiet: Off, Powerful: On",
+ "Beep: On, Clean: On, Quiet: Off, Powerful: On, Light: On, Ion: Off",
+ samsung.toString());
+ samsung.setIon(true);
+ samsung.setDisplay(false);
+ EXPECT_EQ(
+ "Power: Off, Mode: 4 (Heat), Temp: 30C, Fan: 7 (Turbo), Swing: Off, "
+ "Beep: On, Clean: On, Quiet: Off, Powerful: On, Light: Off, Ion: On",
samsung.toString());
}
@@ -750,7 +790,7 @@ TEST(TestDecodeSamsungAC, DecodeRealExample) {
samsung.setRaw(irsend.capture.state);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 2 (Low), Swing: On, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
samsung.toString());
}
@@ -799,7 +839,7 @@ TEST(TestDecodeSamsungAC, DecodeRealExample2) {
samsung.setRaw(irsend.capture.state);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 0 (Auto), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
samsung.toString());
}
@@ -858,7 +898,7 @@ TEST(TestDecodeSamsungAC, DecodePowerOnSample) {
samsung.setRaw(irsend.capture.state, kSamsungAcExtendedStateLength);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 0 (Auto), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
samsung.toString());
}
@@ -918,7 +958,7 @@ TEST(TestDecodeSamsungAC, DecodePowerOffSample) {
samsung.setRaw(irsend.capture.state, kSamsungAcExtendedStateLength);
EXPECT_EQ(
"Power: Off, Mode: 1 (Cool), Temp: 24C, Fan: 0 (Auto), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
samsung.toString());
}
@@ -965,7 +1005,7 @@ TEST(TestDecodeSamsungAC, DecodeHeatSample) {
samsung.setRaw(irsend.capture.state);
EXPECT_EQ(
"Power: On, Mode: 4 (Heat), Temp: 17C, Fan: 0 (Auto), Swing: On, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
samsung.toString());
}
@@ -1012,7 +1052,7 @@ TEST(TestDecodeSamsungAC, DecodeCoolSample) {
samsung.setRaw(irsend.capture.state);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 20C, Fan: 0 (Auto), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
samsung.toString());
}
@@ -1070,7 +1110,7 @@ TEST(TestDecodeSamsungAC, Issue604DecodeExtended) {
samsung.setRaw(irsend.capture.state, irsend.capture.bits / 8);
EXPECT_EQ(
"Power: Off, Mode: 4 (Heat), Temp: 30C, Fan: 0 (Auto), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
samsung.toString());
}
@@ -1267,7 +1307,7 @@ TEST(TestIRSamsungAcClass, Issue604SendPowerHack) {
"m586s100000";
std::string text = "Power: On, Mode: 1 (Cool), Temp: 23C, Fan: 4 (Med), "
"Swing: On, Beep: Off, Clean: Off, Quiet: Off, "
- "Powerful: Off";
+ "Powerful: Off, Light: On, Ion: Off";
// Don't do a setPower()/on()/off() as that will trigger the special message.
// So it should only be the normal "settings" message.
ac.setTemp(23);
@@ -1328,6 +1368,8 @@ TEST(TestIRSamsungAcClass, toCommon) {
ac.setBeep(true);
ac.setClean(true);
ac.setQuiet(true);
+ ac.setDisplay(true);
+ ac.setIon(true);
// Now test it.
ASSERT_EQ(decode_type_t::SAMSUNG_AC, ac.toCommon().protocol);
ASSERT_EQ(-1, ac.toCommon().model);
@@ -1339,13 +1381,13 @@ TEST(TestIRSamsungAcClass, toCommon) {
ASSERT_EQ(stdAc::swingv_t::kAuto, ac.toCommon().swingv);
ASSERT_FALSE(ac.toCommon().turbo);
ASSERT_TRUE(ac.toCommon().quiet);
+ ASSERT_TRUE(ac.toCommon().light);
+ ASSERT_TRUE(ac.toCommon().filter);
ASSERT_TRUE(ac.toCommon().clean);
ASSERT_TRUE(ac.toCommon().beep);
// Unsupported.
ASSERT_EQ(stdAc::swingh_t::kOff, ac.toCommon().swingh);
ASSERT_FALSE(ac.toCommon().econo);
- ASSERT_FALSE(ac.toCommon().light);
- ASSERT_FALSE(ac.toCommon().filter);
ASSERT_EQ(-1, ac.toCommon().sleep);
ASSERT_EQ(-1, ac.toCommon().clock);
}
@@ -1392,7 +1434,7 @@ TEST(TestDecodeSamsungAC, Issue734QuietSetting) {
ac.setRaw(irsend.capture.state, irsend.capture.bits / 8);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 0 (Auto), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: On, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: On, Powerful: Off, Light: On, Ion: Off",
ac.toString());
// Make sure the ac class state is in something wildly different first.
@@ -1414,7 +1456,7 @@ TEST(TestDecodeSamsungAC, Issue734QuietSetting) {
ac.setQuiet(true);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 0 (Auto), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: On, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: On, Powerful: Off, Light: On, Ion: Off",
ac.toString());
// Check it matches the known good/expected state.
EXPECT_STATE_EQ(expectedState, ac.getRaw(), kSamsungAcBits);
@@ -1464,6 +1506,6 @@ TEST(TestDecodeSamsungAC, Issue734PowerfulOff) {
ac.setRaw(irsend.capture.state, irsend.capture.bits / 8);
EXPECT_EQ(
"Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 0 (Auto), Swing: Off, "
- "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off",
+ "Beep: Off, Clean: Off, Quiet: Off, Powerful: Off, Light: On, Ion: Off",
ac.toString());
}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Sanyo_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Sanyo_test.cpp
similarity index 81%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Sanyo_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Sanyo_test.cpp
index 165e29f17..c59113cda 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Sanyo_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Sanyo_test.cpp
@@ -71,7 +71,8 @@ TEST(TestDecodeSanyoLC7461, NormalDecodeWithStrict) {
irsend.sendSanyoLC7461(0x1D8113F00FF);
irsend.makeDecodeResult();
ASSERT_TRUE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ true));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x1D8113F00FF, irsend.capture.value);
@@ -84,7 +85,8 @@ TEST(TestDecodeSanyoLC7461, NormalDecodeWithStrict) {
irsend.sendSanyoLC7461(irsend.encodeSanyoLC7461(0x1234, 0x56));
irsend.makeDecodeResult();
ASSERT_TRUE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ true));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x2468DCB56A9, irsend.capture.value);
@@ -97,7 +99,8 @@ TEST(TestDecodeSanyoLC7461, NormalDecodeWithStrict) {
irsend.sendSanyoLC7461(irsend.encodeSanyoLC7461(0x1, 0x1));
irsend.makeDecodeResult();
ASSERT_TRUE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ true));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x3FFE01FE, irsend.capture.value);
@@ -117,7 +120,8 @@ TEST(TestDecodeSanyoLC7461, NormalDecodeWithRepeatAndStrict) {
irsend.sendSanyoLC7461(0x3FFE01FE, kSanyoLC7461Bits, 1);
irsend.makeDecodeResult();
ASSERT_TRUE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ true));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x3FFE01FE, irsend.capture.value);
@@ -137,10 +141,12 @@ TEST(TestDecodeSanyoLC7461, DecodeWithNonStrictValues) {
irsend.makeDecodeResult();
// Should fail with strict on.
ASSERT_FALSE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ true));
// Should pass if strict off.
ASSERT_TRUE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, false));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ false));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -152,17 +158,22 @@ TEST(TestDecodeSanyoLC7461, DecodeWithNonStrictValues) {
irsend.sendSanyoLC7461(0x1234567890A);
irsend.makeDecodeResult();
ASSERT_FALSE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ true));
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, 32, true));
- ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, 64, true));
+ ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, 32,
+ true));
+ ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, 64,
+ true));
// And should fail for a bad value.
ASSERT_FALSE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ true));
// Should pass if strict off.
ASSERT_TRUE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, false));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ false));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x1234567890A, irsend.capture.value);
@@ -170,7 +181,8 @@ TEST(TestDecodeSanyoLC7461, DecodeWithNonStrictValues) {
EXPECT_EQ(0x89, irsend.capture.command);
// Shouldn't pass if strict off and looking for a smaller size.
- ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, 34, false));
+ ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, 34,
+ false));
}
// Decode (non-standard) 64-bit messages.
@@ -184,7 +196,8 @@ TEST(TestDecodeSanyoLC7461, Decode64BitMessages) {
irsend.sendSanyoLC7461(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeSanyoLC7461(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, 64,
+ false));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -210,7 +223,8 @@ TEST(TestDecodeSanyoLC7461, DecodeGlobalCacheExample) {
irsend.makeDecodeResult();
ASSERT_TRUE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, true));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ true));
EXPECT_EQ(SANYO_LC7461, irsend.capture.decode_type);
EXPECT_EQ(kSanyoLC7461Bits, irsend.capture.bits);
EXPECT_EQ(0x1D8113F00FF, irsend.capture.value);
@@ -219,7 +233,7 @@ TEST(TestDecodeSanyoLC7461, DecodeGlobalCacheExample) {
EXPECT_FALSE(irsend.capture.repeat);
// Confirm what the 42-bit NEC decode is.
- ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, 42, false));
+ ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, kStartOffset, 42, false));
EXPECT_EQ(0x1D8113F00FF, irsend.capture.value);
}
@@ -240,5 +254,6 @@ TEST(TestDecodeSanyoLC7461, FailToDecodeNonSanyoLC7461Example) {
ASSERT_FALSE(irrecv.decodeSanyoLC7461(&irsend.capture));
ASSERT_FALSE(
- irrecv.decodeSanyoLC7461(&irsend.capture, kSanyoLC7461Bits, false));
+ irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits,
+ false));
}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Sharp_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Sharp_test.cpp
similarity index 94%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Sharp_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Sharp_test.cpp
index 571e59859..e605e0d05 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Sharp_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Sharp_test.cpp
@@ -196,7 +196,8 @@ TEST(TestDecodeSharp, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSharpRaw(0x454A);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
+ EXPECT_TRUE(irrecv.decodeSharp(&irsend.capture, kStartOffset, kSharpBits,
+ true));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x454A, irsend.capture.value);
@@ -208,7 +209,8 @@ TEST(TestDecodeSharp, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSharpRaw(irsend.encodeSharp(0x07, 0x99));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kStartOffset, kSharpBits,
+ true));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x7266, irsend.capture.value);
@@ -220,7 +222,8 @@ TEST(TestDecodeSharp, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendSharpRaw(irsend.encodeSharp(0x1, 0x1));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kStartOffset, kSharpBits,
+ true));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x4202, irsend.capture.value);
@@ -239,7 +242,8 @@ TEST(TestDecodeSharp, NormalDecodeWithRepeatAndStrict) {
irsend.reset();
irsend.sendSharpRaw(0x7266, kSharpBits, 1);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kStartOffset, kSharpBits,
+ true));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x7266, irsend.capture.value);
@@ -247,7 +251,8 @@ TEST(TestDecodeSharp, NormalDecodeWithRepeatAndStrict) {
EXPECT_EQ(0x99, irsend.capture.command);
irsend.makeDecodeResult(2 * (2 * kSharpBits + kFooter));
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kStartOffset, kSharpBits,
+ true));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
EXPECT_EQ(kSharpBits, irsend.capture.bits);
EXPECT_EQ(0x7266, irsend.capture.value);
@@ -263,9 +268,10 @@ TEST(TestDecodeSharp, DecodeWithNonStrict) {
irsend.sendSharpRaw(0x0, 8); // Illegal length Sharp 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
+ ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kStartOffset, kSharpBits,
+ true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, 8, false));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kStartOffset, 8, false));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
@@ -276,12 +282,13 @@ TEST(TestDecodeSharp, DecodeWithNonStrict) {
irsend.sendSharpRaw(0x12345678, 32); // Illegal length Sharp 32-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
+ ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kStartOffset, kSharpBits,
+ true));
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, 32, true));
+ ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kStartOffset, 32, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, 32, false));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kStartOffset, 32, false));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
EXPECT_EQ(32, irsend.capture.bits);
EXPECT_EQ(0x12345678, irsend.capture.value);
@@ -300,7 +307,7 @@ TEST(TestDecodeSharp, Decode64BitMessages) {
irsend.sendSharpRaw(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(SHARP, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -350,7 +357,8 @@ TEST(TestDecodeSharp, FailToDecodeNonSharpExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, false));
+ ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kStartOffset, kSharpBits,
+ false));
// Test only half of a good message, as it is sent (sort of) twice.
uint16_t gc_half[35] = {38000, 1, 1, 10, 70, 10, 30, 10, 30, 10, 30, 10,
@@ -361,7 +369,8 @@ TEST(TestDecodeSharp, FailToDecodeNonSharpExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, false));
+ ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kStartOffset, kSharpBits,
+ false));
}
// https://github.com/crankyoldgit/IRremoteESP8266/issues/638#issue-421064165
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Sherwood_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Sherwood_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Sherwood_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Sherwood_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Sony_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Sony_test.cpp
similarity index 51%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Sony_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Sony_test.cpp
index 51bacbd6d..c69d40e67 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Sony_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Sony_test.cpp
@@ -193,7 +193,7 @@ TEST(TestDecodeSony, SonyDecodeWithUnexpectedLegalSize) {
irsend.reset();
irsend.sendSony(irsend.encodeSony(kSony20Bits, 0x1, 0x1, 0x1));
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kSonyMinBits));
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSonyMinBits));
EXPECT_EQ(SONY, irsend.capture.decode_type);
EXPECT_EQ(kSony20Bits, irsend.capture.bits);
EXPECT_EQ(0x81080, irsend.capture.value);
@@ -204,7 +204,7 @@ TEST(TestDecodeSony, SonyDecodeWithUnexpectedLegalSize) {
irsend.reset();
irsend.sendSony(irsend.encodeSony(kSony12Bits, 21, 1), kSony12Bits);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kSony20Bits));
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony20Bits));
EXPECT_EQ(SONY, irsend.capture.decode_type);
EXPECT_EQ(kSony12Bits, irsend.capture.bits);
EXPECT_EQ(0xA90, irsend.capture.value);
@@ -215,22 +215,28 @@ TEST(TestDecodeSony, SonyDecodeWithUnexpectedLegalSize) {
irsend.reset();
irsend.sendSony(irsend.encodeSony(kSony12Bits, 21, 1), kSony12Bits);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony20Bits,
+ true));
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony15Bits,
+ true));
// 15-bit message should be regected when using strict and a different size.
irsend.reset();
irsend.sendSony(irsend.encodeSony(kSony15Bits, 21, 1), kSony15Bits);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony12Bits,
+ true));
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony20Bits,
+ true));
// 20-bit message should be regected when using strict and a different size.
irsend.reset();
irsend.sendSony(irsend.encodeSony(kSony20Bits, 1, 1, 1), kSony20Bits);
irsend.makeDecodeResult();
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
- ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony12Bits,
+ true));
+ ASSERT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony15Bits,
+ true));
}
// Decode unsupported Sony messages. i.e non-standard sizes.
@@ -243,10 +249,14 @@ TEST(TestDecodeSony, SonyDecodeWithIllegalSize) {
irsend.sendSony(0xFF, 8); // Illegal 8-bit Sony-like message.
irsend.makeDecodeResult();
// Should fail with strict on.
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSonyMinBits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSonyMinBits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony12Bits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony15Bits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony20Bits,
+ true));
// Should work with a 'normal' match (not strict)
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SONY, irsend.capture.decode_type);
@@ -259,10 +269,14 @@ TEST(TestDecodeSony, SonyDecodeWithIllegalSize) {
irsend.sendSony(0x1FFF, 13); // Illegal 13-bit Sony-like message.
irsend.makeDecodeResult();
// Should fail with strict on.
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSonyMinBits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSonyMinBits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony12Bits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony15Bits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony20Bits,
+ true));
// Should work with a 'normal' match (not strict)
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SONY, irsend.capture.decode_type);
@@ -275,10 +289,14 @@ TEST(TestDecodeSony, SonyDecodeWithIllegalSize) {
irsend.sendSony(0x1FFFF, 17); // Illegal 17-bit Sony-like message.
irsend.makeDecodeResult();
// Should fail with strict on.
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSonyMinBits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSonyMinBits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony12Bits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony15Bits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony20Bits,
+ true));
// Should work with a 'normal' match (not strict)
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SONY, irsend.capture.decode_type);
@@ -291,10 +309,14 @@ TEST(TestDecodeSony, SonyDecodeWithIllegalSize) {
irsend.sendSony(0x1FFFFF, 21); // Illegal 21-bit Sony-like message.
irsend.makeDecodeResult();
// Should fail with strict on.
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSonyMinBits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony15Bits, true));
- EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kSony20Bits, true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSonyMinBits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony12Bits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony15Bits,
+ true));
+ EXPECT_FALSE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony20Bits,
+ true));
// Should work with a 'normal' match (not strict)
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(SONY, irsend.capture.decode_type);
@@ -336,7 +358,8 @@ TEST(TestDecodeSony, DecodeGlobalCacheExample) {
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x2E, irsend.capture.command);
// With strict and correct size.
- ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kSony12Bits, true));
+ ASSERT_TRUE(irrecv.decodeSony(&irsend.capture, kStartOffset, kSony12Bits,
+ true));
}
// Encoding & Decode 20 bit Sony messages. Issue #476
@@ -360,3 +383,228 @@ TEST(TestEncodeSony, Issue476) {
EXPECT_EQ(0xE2, (0x7156 >> 7) & 0xFF); // extended (top 8 of 15 bits)
EXPECT_EQ(0x6AB47, irsend.encodeSony(20, 0x56, 0x1A, 0xE2));
}
+
+// Encoding & Decode 15 bit Sony messages. Issue #1018
+TEST(TestEncodeSony, Issue1018) {
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSony(0x240C, 15);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(15, irsend.capture.bits);
+ EXPECT_EQ(0x240C, irsend.capture.value); // 15 bits
+ EXPECT_EQ(0x30, irsend.capture.address);
+ EXPECT_EQ(0x12, irsend.capture.command);
+ EXPECT_EQ(
+ "f40000d33"
+ "m2400s600" // Message
+ "m600s600m1200s600m600s600m600s600m1200s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ "m600s22200"
+ "m2400s600" // Repeat #1
+ "m600s600m1200s600m600s600m600s600m1200s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ "m600s22200"
+ "m2400s600" // Repeat #2
+ "m600s600m1200s600m600s600m600s600m1200s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ "m600s22200",
+ irsend.outputStr());
+
+ irsend.reset();
+ uint16_t rawData[127] = {
+ 2448, 550,
+ 648, 544, 1250, 546, 648, 548, 648, 550, 1272, 524, 648, 550, 644, 550,
+ 674, 524, 648, 550, 648, 544, 674, 524, 1270, 524, 1246, 550, 674, 524,
+ 648, 22404,
+ 2474, 524,
+ 674, 520, 1250, 548, 648, 544, 674, 524, 1270, 524, 648, 550, 648, 546,
+ 674, 524, 648, 546, 652, 546, 674, 524, 1270, 524, 1272, 522, 674, 520,
+ 648, 22404,
+ 2452, 544,
+ 674, 524, 1270, 524, 674, 518, 674, 522, 1246, 550, 674, 524, 648, 544,
+ 674, 524, 648, 546, 674, 524, 674, 518, 1276, 518, 1276, 524, 648, 546,
+ 674, 22380,
+ 2474, 520,
+ 674, 524, 1250, 544, 674, 524, 674, 518, 1276, 520, 674, 522, 674, 524,
+ 674, 520, 674, 524, 674, 524, 674, 518, 1276, 518, 1276, 524, 672, 524,
+ 648}; // SONY 240C
+
+ irsend.sendRaw(rawData, 127, 40);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(15, irsend.capture.bits);
+ EXPECT_EQ(0x240C, irsend.capture.value); // 15 bits
+ EXPECT_EQ(0x30, irsend.capture.address);
+ EXPECT_EQ(0x12, irsend.capture.command);
+ EXPECT_EQ(
+ "f40000d50"
+ "m2448s550" // Message
+ "m648s544m1250s546m648s548m648s550m1272s524m648s550m644s550"
+ "m674s524m648s550m648s544m674s524m1270s524m1246s550m674s524"
+ "m648s22404"
+ "m2474s524" // Repeat #1
+ "m674s520m1250s548m648s544m674s524m1270s524m648s550m648s546"
+ "m674s524m648s546m652s546m674s524m1270s524m1272s522m674s520"
+ "m648s22404"
+ "m2452s544" // Repeat #2
+ "m674s524m1270s524m674s518m674s522m1246s550m674s524m648s544"
+ "m674s524m648s546m674s524m674s518m1276s518m1276s524m648s546"
+ "m674s22380"
+ "m2474s520" // Repeat #3
+ "m674s524m1250s544m674s524m674s518m1276s520m674s522m674s524"
+ "m674s520m674s524m674s524m674s518m1276s518m1276s524m672s524"
+ "m648",
+ irsend.outputStr());
+
+ // Now see if we can reproduce it with `sendSony`
+ irsend.reset();
+ irsend.sendSony(0x240C, 15, 3);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(15, irsend.capture.bits);
+ EXPECT_EQ(0x240C, irsend.capture.value); // 15 bits
+ EXPECT_EQ(0x30, irsend.capture.address);
+ EXPECT_EQ(0x12, irsend.capture.command);
+
+ // Compare expected result with real `rawData` result.
+ // Comparison notes:
+ // * Seems visually the same. i.e. '1' where '1's should be etc.
+ // * Timings are *roughly* the same. They should be within device
+ // tollerance.
+ // TL;DR: Looks fine/the same/as expected.
+ EXPECT_EQ(
+ "f40000d33"
+ "m2400s600" // Message
+ // "m2448s550" (Commented out data is from `rawData` sample above.)
+ "m600s600m1200s600m600s600m600s600m1200s600m600s600m600s600"
+ // "m648s544m1250s546m648s548m648s550m1272s524m648s550m644s550"
+ "m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ // "m674s524m648s550m648s544m674s524m1270s524m1246s550m674s524"
+ "m600s22200"
+ // "m648s22404"
+ "m2400s600" // Repeat #1
+ // "m2474s524"
+ "m600s600m1200s600m600s600m600s600m1200s600m600s600m600s600"
+ // "m674s520m1250s548m648s544m674s524m1270s524m648s550m648s546"
+ "m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ // "m674s524m648s546m652s546m674s524m1270s524m1272s522m674s520"
+ "m600s22200"
+ // "m648s22404"
+ "m2400s600" // Repeat #2
+ // "m2452s544"
+ "m600s600m1200s600m600s600m600s600m1200s600m600s600m600s600"
+ // "m674s524m1270s524m674s518m674s522m1246s550m674s524m648s544"
+ "m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ // "m674s524m648s546m674s524m674s518m1276s518m1276s524m648s546"
+ "m600s22200"
+ // "m674s22380"
+ "m2400s600" // Repeat #3
+ // "m2474s520"
+ "m600s600m1200s600m600s600m600s600m1200s600m600s600m600s600"
+ // "m674s524m1250s544m674s524m674s518m1276s520m674s522m674s524"
+ "m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ // "m674s520m674s524m674s524m674s518m1276s518m1276s524m672s524"
+ "m600s22200",
+ // "m648" // (Trailing space is ignored in real captures.)
+ irsend.outputStr());
+
+ // Now see if we can reproduce it with `sendSony38`
+ irsend.reset();
+ irsend.sendSony38(0x240C, 15);
+ irsend.makeDecodeResult();
+
+ ASSERT_TRUE(irrecv.decode(&irsend.capture));
+ EXPECT_EQ(SONY, irsend.capture.decode_type);
+ EXPECT_EQ(15, irsend.capture.bits);
+ EXPECT_EQ(0x240C, irsend.capture.value); // 15 bits
+ EXPECT_EQ(0x30, irsend.capture.address);
+ EXPECT_EQ(0x12, irsend.capture.command);
+}
+
+// Test sending typical data only.
+TEST(TestSendSony38, SendDataOnly) {
+ IRsendTest irsend(0);
+ irsend.begin();
+
+ irsend.reset();
+ irsend.sendSony38(0);
+ // We expect three 20-bit commands to be sent.
+ EXPECT_EQ(
+ "f38000d33"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s18600"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s18600"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s18600"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s18600",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendSony38(0x240C, kSony20Bits);
+ // We expect three 20-bit commands to be sent.
+ EXPECT_EQ(
+ "f38000d33"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200"
+ "m2400s600m600s600m600s600m600s600m600s600m600s600m600s600m1200s600"
+ "m600s600m600s600m1200s600m600s600m600s600m600s600m600s600m600s600"
+ "m600s600m1200s600m1200s600m600s600m600s16200",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendSony38(0x240C, kSony15Bits);
+ // We expect three 15-bit commands to be sent.
+ EXPECT_EQ(
+ "f38000d33"
+ "m2400s600m600s600m1200s600m600s600m600s600m1200s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ "m600s22200"
+ "m2400s600m600s600m1200s600m600s600m600s600m1200s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ "m600s22200"
+ "m2400s600m600s600m1200s600m600s600m600s600m1200s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ "m600s22200"
+ "m2400s600m600s600m1200s600m600s600m600s600m1200s600m600s600"
+ "m600s600m600s600m600s600m600s600m600s600m1200s600m1200s600m600s600"
+ "m600s22200",
+ irsend.outputStr());
+
+ irsend.reset();
+ irsend.sendSony38(0xA90, kSony12Bits);
+ // We expect three 15-bit commands to be sent.
+ EXPECT_EQ(
+ "f38000d33"
+ "m2400s600m1200s600m600s600m1200s600m600s600m1200s600m600s600"
+ "m600s600m1200s600m600s600m600s600m600s600m600s25800"
+ "m2400s600m1200s600m600s600m1200s600m600s600m1200s600m600s600"
+ "m600s600m1200s600m600s600m600s600m600s600m600s25800"
+ "m2400s600m1200s600m600s600m1200s600m600s600m1200s600m600s600"
+ "m600s600m1200s600m600s600m600s600m600s600m600s25800"
+ "m2400s600m1200s600m600s600m1200s600m600s600m1200s600m600s600"
+ "m600s600m1200s600m600s600m600s600m600s600m600s25800",
+ irsend.outputStr());
+}
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Tcl_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Tcl_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Tcl_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Tcl_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Teco_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Teco_test.cpp
similarity index 99%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Teco_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Teco_test.cpp
index cb6c8bcd9..635e93a44 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Teco_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Teco_test.cpp
@@ -353,7 +353,8 @@ TEST(TestDecodeTeco, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendTeco(expectedState);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeTeco(&irsend.capture, kTecoBits, true));
+ ASSERT_TRUE(irrecv.decodeTeco(&irsend.capture, kStartOffset, kTecoBits,
+ true));
EXPECT_EQ(TECO, irsend.capture.decode_type);
EXPECT_EQ(kTecoBits, irsend.capture.bits);
EXPECT_FALSE(irsend.capture.repeat);
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Toshiba_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Toshiba_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Toshiba_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Toshiba_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Trotec_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Trotec_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Trotec_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Trotec_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Vestel_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Vestel_test.cpp
similarity index 99%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Vestel_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Vestel_test.cpp
index 4164386f7..d20a882a6 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Vestel_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Vestel_test.cpp
@@ -407,7 +407,8 @@ TEST(TestDecodeVestelAc, NormalDecodeWithStrict) {
irsend.reset();
irsend.sendVestelAc(expectedState);
irsend.makeDecodeResult();
- ASSERT_TRUE(irrecv.decodeVestelAc(&irsend.capture, kVestelAcBits, true));
+ ASSERT_TRUE(irrecv.decodeVestelAc(&irsend.capture, kStartOffset,
+ kVestelAcBits, true));
EXPECT_EQ(VESTEL_AC, irsend.capture.decode_type);
EXPECT_EQ(kVestelAcBits, irsend.capture.bits);
EXPECT_FALSE(irsend.capture.repeat);
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Whirlpool_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Whirlpool_test.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Whirlpool_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Whirlpool_test.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/test/ir_Whynter_test.cpp b/lib/IRremoteESP8266-2.7.4/test/ir_Whynter_test.cpp
similarity index 92%
rename from lib/IRremoteESP8266-2.7.1/test/ir_Whynter_test.cpp
rename to lib/IRremoteESP8266-2.7.4/test/ir_Whynter_test.cpp
index 0c45f2654..eaccf0ea1 100644
--- a/lib/IRremoteESP8266-2.7.1/test/ir_Whynter_test.cpp
+++ b/lib/IRremoteESP8266-2.7.4/test/ir_Whynter_test.cpp
@@ -199,10 +199,11 @@ TEST(TestDecodeWhynter, DecodeWithNonStrictSizes) {
irsend.sendWhynter(0x12, 8); // Illegal sized Whynter 8-bit message.
irsend.makeDecodeResult();
// Should fail with strict on.
- ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
- ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, 8, true));
+ ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kStartOffset, kWhynterBits,
+ true));
+ ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kStartOffset, 8, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, 8, false));
+ ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kStartOffset, 8, false));
EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
EXPECT_EQ(8, irsend.capture.bits);
EXPECT_EQ(0x12, irsend.capture.value);
@@ -213,13 +214,14 @@ TEST(TestDecodeWhynter, DecodeWithNonStrictSizes) {
irsend.sendWhynter(0x1234567890, 40); // Illegal size Whynter 40-bit message.
irsend.makeDecodeResult();
// Shouldn't pass with strict when we ask for less bits than we got.
- ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
+ ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kStartOffset, kWhynterBits,
+ true));
irsend.makeDecodeResult();
// Should fail with strict when we ask for the wrong bit size.
- ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, 40, true));
+ ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kStartOffset, 40, true));
// Should pass if strict off.
- ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, 40, false));
+ ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kStartOffset, 40, false));
EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
EXPECT_EQ(40, irsend.capture.bits);
EXPECT_EQ(0x1234567890, irsend.capture.value);
@@ -238,7 +240,7 @@ TEST(TestDecodeWhynter, Decode64BitMessages) {
irsend.sendWhynter(0xFFFFFFFFFFFFFFFF, 64);
irsend.makeDecodeResult();
// Should work with a 'normal' match (not strict)
- ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, 64, false));
+ ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kStartOffset, 64, false));
EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
EXPECT_EQ(64, irsend.capture.bits);
EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
@@ -262,5 +264,6 @@ TEST(TestDecodeWhynter, FailToDecodeNonWhynterExample) {
irsend.makeDecodeResult();
ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture));
- ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, false));
+ ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kStartOffset, kWhynterBits,
+ false));
}
diff --git a/lib/IRremoteESP8266-2.7.1/tools/Makefile b/lib/IRremoteESP8266-2.7.4/tools/Makefile
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/tools/Makefile
rename to lib/IRremoteESP8266-2.7.4/tools/Makefile
index bf23fbce6..0ee8cc563 100644
--- a/lib/IRremoteESP8266-2.7.1/tools/Makefile
+++ b/lib/IRremoteESP8266-2.7.4/tools/Makefile
@@ -51,7 +51,7 @@ PROTOCOLS = ir_NEC.o ir_Sony.o ir_Samsung.o ir_JVC.o ir_RCMM.o ir_RC5_RC6.o \
ir_GICable.o ir_Whirlpool.o ir_Lutron.o ir_Electra.o ir_Pioneer.o \
ir_MWM.o ir_Vestel.o ir_Teco.o ir_Tcl.o ir_Lego.o \
ir_MitsubishiHeavy.o ir_Goodweather.o ir_Inax.o ir_Argo.o \
- ir_Trotec.o ir_Neoclima.o ir_Amcor.o
+ ir_Trotec.o ir_Neoclima.o ir_Amcor.o ir_Epson.o
# Common object files
COMMON_OBJ = IRutils.o IRtimer.o IRsend.o IRrecv.o IRtext.o IRac.o $(PROTOCOLS)
@@ -118,7 +118,7 @@ ir_RCMM.o : $(USER_DIR)/ir_RCMM.cpp $(COMMON_DEPS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_RCMM.cpp
ir_LG.o : $(USER_DIR)/ir_LG.h $(USER_DIR)/ir_LG.cpp $(COMMON_DEPS)
- $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/ir_LG.cpp
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c $(USER_DIR)/ir_LG.cpp
ir_Mitsubishi.o : $(USER_DIR)/ir_Mitsubishi.h $(USER_DIR)/ir_Mitsubishi.cpp $(COMMON_DEPS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c $(USER_DIR)/ir_Mitsubishi.cpp
@@ -234,5 +234,8 @@ ir_Neoclima.o : $(USER_DIR)/ir_Neoclima.cpp $(USER_DIR)/ir_Neoclima.h $(COMMON_D
ir_Amcor.o : $(USER_DIR)/ir_Amcor.cpp $(USER_DIR)/ir_Amcor.h $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c $(USER_DIR)/ir_Amcor.cpp
+ir_Epson.o : $(USER_DIR)/ir_Epson.cpp $(GTEST_HEADERS)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c $(USER_DIR)/ir_Epson.cpp
+
IRac.o : $(USER_DIR)/IRac.cpp $(USER_DIR)/IRac.h $(COMMON_DEPS) $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c $(USER_DIR)/IRac.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/tools/RawToGlobalCache.sh b/lib/IRremoteESP8266-2.7.4/tools/RawToGlobalCache.sh
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/tools/RawToGlobalCache.sh
rename to lib/IRremoteESP8266-2.7.4/tools/RawToGlobalCache.sh
diff --git a/lib/IRremoteESP8266-2.7.1/tools/auto_analyse_raw_data.py b/lib/IRremoteESP8266-2.7.4/tools/auto_analyse_raw_data.py
similarity index 97%
rename from lib/IRremoteESP8266-2.7.1/tools/auto_analyse_raw_data.py
rename to lib/IRremoteESP8266-2.7.4/tools/auto_analyse_raw_data.py
index d673d52d4..5bea3926a 100644
--- a/lib/IRremoteESP8266-2.7.1/tools/auto_analyse_raw_data.py
+++ b/lib/IRremoteESP8266-2.7.4/tools/auto_analyse_raw_data.py
@@ -65,6 +65,8 @@ class RawIRMessage():
def _usec_compare(self, seen, expected):
"""Compare two usec values and see if they match within a
subtractive margin."""
+ if expected is None:
+ return False
return expected - self.margin < seen <= expected
def _usec_compares(self, usecs, expecteds):
@@ -214,19 +216,25 @@ class RawIRMessage():
if len(self.marks) > 2: # Possible leader mark?
self.ldr_mark = self.marks[0]
self.hdr_mark = self.marks[1]
- else:
+ elif len(self.marks) > 1: # At least two marks
# Largest mark is likely the kHdrMark
self.hdr_mark = self.marks[0]
+ else:
+ # Probably no header mark.
+ self.hdr_mark = 0
- if self.is_space_encoded() and len(self.spaces) >= 3:
+ if self.is_space_encoded() and len(self.spaces) >= 2:
if self.verbose and len(self.marks) > 2:
self.output.write("DANGER: Unusual number of mark timings!")
# We should have 3 space candidates at least.
# They should be: zero_space (smallest), one_space, & hdr_space (largest)
spaces = list(self.spaces)
- self.zero_space = spaces.pop()
- self.one_space = spaces.pop()
- self.hdr_space = spaces.pop()
+ if spaces:
+ self.zero_space = spaces.pop()
+ if spaces:
+ self.one_space = spaces.pop()
+ if spaces:
+ self.hdr_space = spaces.pop()
# Rest are probably message gaps
self.gaps = spaces
@@ -302,11 +310,15 @@ def convert_rawdata(data_str):
def dump_constants(message, defines, name="", output=sys.stdout):
"""Dump the key constants and generate the C++ #defines."""
ldr_mark = None
+ hdr_mark = 0
+ hdr_space = 0
if message.ldr_mark is not None:
ldr_mark = avg_list(message.mark_buckets[message.ldr_mark])
- hdr_mark = avg_list(message.mark_buckets[message.hdr_mark])
+ if message.hdr_mark != 0:
+ hdr_mark = avg_list(message.mark_buckets[message.hdr_mark])
bit_mark = avg_list(message.mark_buckets[message.bit_mark])
- hdr_space = avg_list(message.space_buckets[message.hdr_space])
+ if message.hdr_space is not None:
+ hdr_space = avg_list(message.space_buckets[message.hdr_space])
one_space = avg_list(message.space_buckets[message.one_space])
zero_space = avg_list(message.space_buckets[message.zero_space])
diff --git a/lib/IRremoteESP8266-2.7.1/tools/auto_analyse_raw_data_test.py b/lib/IRremoteESP8266-2.7.4/tools/auto_analyse_raw_data_test.py
similarity index 84%
rename from lib/IRremoteESP8266-2.7.1/tools/auto_analyse_raw_data_test.py
rename to lib/IRremoteESP8266-2.7.4/tools/auto_analyse_raw_data_test.py
index c2fd7ba64..fa3a87933 100644
--- a/lib/IRremoteESP8266-2.7.1/tools/auto_analyse_raw_data_test.py
+++ b/lib/IRremoteESP8266-2.7.4/tools/auto_analyse_raw_data_test.py
@@ -1165,6 +1165,224 @@ class TestAutoAnalyseRawData(unittest.TestCase):
'}\n'
'#endif // DECODE_FOO\n')
+ def test_no_headers(self):
+ """Tests for no space or mark headers in parse_and_report() function."""
+
+ # Tests for mark or space headers. (Issue #1014)
+ output = StringIO()
+ input_str = """
+ uint16_t rawData[257] = {472, 1016, 490, 536, 446, 1038, 464, 544, 490,
+ 516, 492, 1008, 418, 592, 462, 1042, 476, 532, 444, 1062, 474, 532, 470,
+ 1014, 492, 1010, 446, 562, 460, 1046, 474, 532, 472, 534, 416, 590, 458,
+ 548, 486, 520, 490, 516, 490, 534, 470, 534, 470, 534, 470, 536, 416,
+ 590, 460, 546, 488, 518, 490, 536, 468, 536, 470, 534, 470, 536, 442,
+ 564, 414, 1092, 470, 536, 468, 536, 416, 590, 414, 592, 486, 520, 490,
+ 536, 470, 534, 470, 534, 468, 536, 416, 590, 432, 574, 486, 520, 490,
+ 536, 470, 534, 468, 536, 468, 536, 468, 538, 420, 590, 454, 546, 488,
+ 518, 488, 536, 468, 536, 468, 536, 468, 536, 440, 566, 414, 592, 462,
+ 546, 490, 536, 468, 536, 468, 538, 468, 536, 468, 538, 414, 592, 460,
+ 546, 488, 518, 490, 536, 468, 536, 470, 536, 468, 536, 442, 564, 414,
+ 592, 462, 546, 490, 518, 488, 536, 470, 534, 470, 536, 470, 536, 416,
+ 590, 460, 548, 488, 518, 490, 536, 470, 534, 470, 534, 470, 536, 468,
+ 536, 414, 592, 462, 546, 490, 518, 488, 534, 470, 536, 468, 536, 468,
+ 536, 414, 590, 462, 546, 488, 518, 466, 560, 444, 560, 446, 560, 446,
+ 560, 444, 562, 416, 592, 462, 546, 464, 542, 464, 560, 444, 560, 446,
+ 560, 446, 560, 416, 590, 460, 546, 464, 544, 464, 562, 444, 560, 446,
+ 560, 446, 560, 444, 560, 416, 592, 462, 1042, 446, 560, 444, 560, 416,
+ 592, 462, 544, 488, 520, 466, 558, 446, 560, 446};"""
+ analyse.parse_and_report(input_str, 200, True, "", output)
+ self.assertEqual(
+ output.getvalue(), 'Found 257 timing entries.\n'
+ 'Potential Mark Candidates:\n'
+ '[492]\n'
+ 'Potential Space Candidates:\n'
+ '[1092, 592]\n'
+ '\n'
+ 'Guessing encoding type:\n'
+ 'Looks like it uses space encoding. Yay!\n'
+ '\n'
+ 'Guessing key value:\n'
+ 'kHdrMark = 0\n'
+ 'kHdrSpace = 0\n'
+ 'kBitMark = 460\n'
+ 'kOneSpace = 1037\n'
+ 'kZeroSpace = 547\n'
+ '\n'
+ 'Decoding protocol based on analysis so far:\n'
+ '\n'
+ 'kBitMark(UNEXPECTED)10100101010110100000000000000000010000000000000000'
+ '0000000000000000000000000000000000000000000000000000000000000000000000'
+ '10000000\n'
+ ' Bits: 128\n'
+ ' Hex: 0xA55A0000400000000000000000000080 (MSB first)\n'
+ ' 0x01000000000000000000000200005AA5 (LSB first)\n'
+ ' Dec: 219789926041586294144261994014272651392 (MSB first)\n'
+ ' 1329227995784915872903807068870302373 (LSB first)\n'
+ ' Bin: 0b101001010101101000000000000000000100000000000000000000000000'
+ '00000000000000000000000000000000000000000000000000000000000010000000'
+ ' (MSB first)\n'
+ ' 0b000000010000000000000000000000000000000000000000000000000000'
+ '00000000000000000000000000000000001000000000000000000101101010100101'
+ ' (LSB first)\n'
+ '\n'
+ 'Total Nr. of suspected bits: 128\n'
+ '\n'
+ 'Generating a VERY rough code outline:\n'
+ '\n'
+ '// Copyright 2019 David Conran (crankyoldgit)\n'
+ '// Support for TBD protocol\n'
+ '\n'
+ '#include "IRrecv.h"\n'
+ '#include "IRsend.h"\n'
+ '#include "IRutils.h"\n'
+ '\n'
+ "// WARNING: This probably isn't directly usable. It's a guide only.\n"
+ '\n'
+ '// See https://github.com/crankyoldgit/IRremoteESP8266/wiki/'
+ 'Adding-support-for-a-new-IR-protocol\n'
+ '// for details of how to include this in the library.\n'
+ 'const uint16_t kHdrMark = 0;\n'
+ 'const uint16_t kBitMark = 460;\n'
+ 'const uint16_t kHdrSpace = 0;\n'
+ 'const uint16_t kOneSpace = 1037;\n'
+ 'const uint16_t kZeroSpace = 547;\n'
+ 'const uint16_t kFreq = 38000; // Hz. (Guessing the most common'
+ ' frequency.)\n'
+ 'const uint16_t kBits = 128; // Move to IRremoteESP8266.h\n'
+ 'const uint16_t kStateLength = 16; // Move to IRremoteESP8266.h\n'
+ 'const uint16_t kOverhead = 1;\n'
+ "// DANGER: More than 64 bits detected. A uint64_t for 'data' won't"
+ ' work!\n'
+ '#if SEND_TBD\n'
+ '// Function should be safe up to 64 bits.\n'
+ 'void IRsend::sendTBD(const uint64_t data, const uint16_t nbits, const'
+ ' uint16_t repeat) {\n'
+ ' enableIROut(kFreq);\n'
+ ' for (uint16_t r = 0; r <= repeat; r++) {\n'
+ ' uint64_t send_data = data;\n'
+ ' // Data Section #1\n'
+ ' // e.g. data = 0xA55A0000400000000000000000000080, nbits = 128\n'
+ ' sendData(kBitMark, kOneSpace, kBitMark, kZeroSpace, send_data,'
+ ' 128, true);\n'
+ ' send_data >>= 128;\n'
+ ' // Footer\n'
+ ' mark(kBitMark);\n'
+ ' space(kDefaultMessageGap); // A 100% made up guess of the gap'
+ ' between messages.\n'
+ ' }\n'
+ '}\n'
+ '#endif // SEND_TBD\n'
+ '\n'
+ '#if SEND_TBD\n'
+ '// Alternative >64bit function to send TBD messages\n'
+ '// Where data is:\n'
+ '// uint8_t data[kStateLength] = {0xA5, 0x5A, 0x00, 0x00, 0x40, 0x00,'
+ ' 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};\n'
+ '//\n'
+ '// Args:\n'
+ '// data: An array of bytes containing the IR command.\n'
+ '// It is assumed to be in MSB order for this code.\n'
+ '// nbytes: Nr. of bytes of data in the array. (>=kStateLength)\n'
+ '// repeat: Nr. of times the message is to be repeated.\n'
+ '//\n'
+ '// Status: ALPHA / Untested.\n'
+ 'void IRsend::sendTBD(const uint8_t data[], const uint16_t nbytes,'
+ ' const uint16_t repeat) {\n'
+ ' for (uint16_t r = 0; r <= repeat; r++) {\n'
+ ' uint16_t pos = 0;\n'
+ ' // Data Section #1\n'
+ ' // e.g.\n'
+ ' // bits = 128; bytes = 16;\n'
+ ' // *(data + pos) = {0xA5, 0x5A, 0x00, 0x00, 0x40, 0x00, 0x00,'
+ ' 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};\n'
+ ' sendGeneric(0, 0,\n'
+ ' kBitMark, kOneSpace,\n'
+ ' kBitMark, kZeroSpace,\n'
+ ' kBitMark, kDefaultMessageGap,\n'
+ ' data + pos, 16, // Bytes\n'
+ ' kFreq, true, kNoRepeat, kDutyDefault);\n'
+ ' pos += 16; // Adjust by how many bytes of data we sent\n'
+ ' }\n'
+ '}\n'
+ '#endif // SEND_TBD\n'
+ '\n'
+ "// DANGER: More than 64 bits detected. A uint64_t for 'data' won't"
+ ' work!\n'
+ '#if DECODE_TBD\n'
+ '// Function should be safe up to 64 bits.\n'
+ 'bool IRrecv::decodeTBD(decode_results *results, const uint16_t nbits,'
+ ' const bool strict) {\n'
+ ' if (results->rawlen < 2 * nbits + kOverhead)\n'
+ ' return false; // Too short a message to match.\n'
+ ' if (strict && nbits != kBits)\n'
+ ' return false;\n'
+ '\n'
+ ' uint16_t offset = kStartOffset;\n'
+ ' uint64_t data = 0;\n'
+ ' match_result_t data_result;\n'
+ '\n'
+ ' // Data Section #1\n'
+ ' // e.g. data_result.data = 0xA55A0000400000000000000000000080, nbits'
+ ' = 128\n'
+ ' data_result = matchData(&(results->rawbuf[offset]), 128,\n'
+ ' kBitMark, kOneSpace,\n'
+ ' kBitMark, kZeroSpace);\n'
+ ' offset += data_result.used;\n'
+ ' if (data_result.success == false) return false; // Fail\n'
+ ' data <<= 128; // Make room for the new bits of data.\n'
+ ' data |= data_result.data;\n'
+ '\n'
+ ' // Footer\n'
+ ' if (!matchMark(results->rawbuf[offset++], kBitMark))\n'
+ ' return false;\n'
+ '\n'
+ ' // Success\n'
+ ' results->decode_type = decode_type_t::TBD;\n'
+ ' results->bits = nbits;\n'
+ ' results->value = data;\n'
+ ' results->command = 0;\n'
+ ' results->address = 0;\n'
+ ' return true;\n'
+ '}\n'
+ '#endif // DECODE_TBD\n'
+ '\n'
+ '// Note: This should be 64+ bit safe.\n'
+ '#if DECODE_TBD\n'
+ '// Function should be safe over 64 bits.\n'
+ 'bool IRrecv::decodeTBD(decode_results *results, const uint16_t nbits,'
+ ' const bool strict) {\n'
+ ' if (results->rawlen < 2 * nbits + kOverhead)\n'
+ ' return false; // Too short a message to match.\n'
+ ' if (strict && nbits != kBits)\n'
+ ' return false;\n'
+ '\n'
+ ' uint16_t offset = kStartOffset;\n'
+ ' uint16_t pos = 0;\n'
+ ' uint16_t used = 0;\n'
+ '\n'
+ ' // Data Section #1\n'
+ ' // e.g.\n'
+ ' // bits = 128; bytes = 16;\n'
+ ' // *(results->state + pos) = {0xA5, 0x5A, 0x00, 0x00, 0x40, 0x00,'
+ ' 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};\n'
+ ' used = matchGeneric(results->rawbuf + offset, results->state + pos,'
+ '\n'
+ ' results->rawlen - offset, 128,\n'
+ ' 0, 0,\n'
+ ' kBitMark, kOneSpace,\n'
+ ' kBitMark, kZeroSpace,\n'
+ ' kBitMark, kDefaultMessageGap, true);\n'
+ ' if (used == 0) return false; // We failed to find any data.\n'
+ ' offset += used; // Adjust for how much of the message we read.\n'
+ ' pos += 16; // Adjust by how many bytes of data we read\n'
+ '\n'
+ ' // Success\n'
+ ' results->decode_type = decode_type_t::TBD;\n'
+ ' results->bits = nbits;\n'
+ ' return true;\n'
+ '}\n'
+ '#endif // DECODE_TBD\n')
+
if __name__ == '__main__':
unittest.main(verbosity=2)
diff --git a/lib/IRremoteESP8266-2.7.1/tools/gc_decode.cpp b/lib/IRremoteESP8266-2.7.4/tools/gc_decode.cpp
similarity index 84%
rename from lib/IRremoteESP8266-2.7.1/tools/gc_decode.cpp
rename to lib/IRremoteESP8266-2.7.4/tools/gc_decode.cpp
index a1d828d1c..f1c374bbe 100644
--- a/lib/IRremoteESP8266-2.7.1/tools/gc_decode.cpp
+++ b/lib/IRremoteESP8266-2.7.4/tools/gc_decode.cpp
@@ -27,18 +27,20 @@ void str_to_uint16(char *str, uint16_t *res, uint8_t base) {
void usage_error(char *name) {
std::cerr << "Usage: " << name << " [-gc] [-rawdump] "
<< std::endl
- << "Usage: " << name << " -prontohex [-rawdump] "
+ << "Usage: " << name
+ << " -prontohex [-rawdump] [-repeats num] "
<< std::endl
<< "Usage: " << name << " -raw [-rawdump] " << std::endl;
}
int main(int argc, char *argv[]) {
int argv_offset = 1;
+ int repeats = 0;
bool dumpraw = false;
enum decode_type_t input_type = GLOBALCACHE;
const uint16_t raw_freq = 38;
// Check the invocation/calling usage.
- if (argc < 2 || argc > 4) {
+ if (argc < 2 || argc > 6) {
usage_error(argv[0]);
return 1;
}
@@ -52,11 +54,24 @@ int main(int argc, char *argv[]) {
argv_offset++;
}
- if (strncmp("-rawdump", argv[argv_offset], 7) == 0) {
+ if (strncmp("-rawdump", argv[argv_offset], 8) == 0) {
dumpraw = true;
argv_offset++;
}
+ if (input_type == PRONTO && strncmp("-repeats", argv[argv_offset], 8) == 0) {
+ argv_offset++;
+ if (argc - argv_offset <= 1) {
+ usage_error(argv[0]);
+ return 1;
+ }
+ repeats = atoi(argv[argv_offset++]);
+ if (repeats < 0) {
+ usage_error(argv[0]);
+ return 1;
+ }
+ }
+
if (argc - argv_offset != 1) {
usage_error(argv[0]);
return 1;
@@ -80,8 +95,8 @@ int main(int argc, char *argv[]) {
index++;
}
- IRsendTest irsend(4);
- IRrecv irrecv(4);
+ IRsendTest irsend(0);
+ IRrecv irrecv(0);
irsend.begin();
irsend.reset();
@@ -90,7 +105,7 @@ int main(int argc, char *argv[]) {
irsend.sendGC(gc_test, index);
break;
case PRONTO:
- irsend.sendPronto(gc_test, index);
+ irsend.sendPronto(gc_test, index, repeats);
break;
case RAW:
irsend.sendRaw(gc_test, index, raw_freq);
diff --git a/lib/IRremoteESP8266-2.7.1/tools/generate_irtext_h.sh b/lib/IRremoteESP8266-2.7.4/tools/generate_irtext_h.sh
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/tools/generate_irtext_h.sh
rename to lib/IRremoteESP8266-2.7.4/tools/generate_irtext_h.sh
diff --git a/lib/IRremoteESP8266-2.7.1/tools/mkkeywords b/lib/IRremoteESP8266-2.7.4/tools/mkkeywords
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/tools/mkkeywords
rename to lib/IRremoteESP8266-2.7.4/tools/mkkeywords
diff --git a/lib/IRremoteESP8266-2.7.1/tools/mode2_decode.cpp b/lib/IRremoteESP8266-2.7.4/tools/mode2_decode.cpp
similarity index 100%
rename from lib/IRremoteESP8266-2.7.1/tools/mode2_decode.cpp
rename to lib/IRremoteESP8266-2.7.4/tools/mode2_decode.cpp
diff --git a/lib/IRremoteESP8266-2.7.1/tools/scrape_supported_devices.py b/lib/IRremoteESP8266-2.7.4/tools/scrape_supported_devices.py
similarity index 73%
rename from lib/IRremoteESP8266-2.7.1/tools/scrape_supported_devices.py
rename to lib/IRremoteESP8266-2.7.4/tools/scrape_supported_devices.py
index 574eac351..c859bbf06 100644
--- a/lib/IRremoteESP8266-2.7.1/tools/scrape_supported_devices.py
+++ b/lib/IRremoteESP8266-2.7.4/tools/scrape_supported_devices.py
@@ -9,14 +9,17 @@ import time
CODE_URL = "https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_"
BRAND_MODEL = re.compile(r"Brand: *(?P.+), *Model: *(?P.+)")
-ENUMS = re.compile(r"enum \w+ {(.+?)};", re.DOTALL)
+ENUMS = re.compile(r"enum (\w+) {(.+?)};", re.DOTALL)
ENUM_ENTRY = re.compile(r"^\s+(\w+)", re.MULTILINE)
-DECODED_PROTOCOLS = re.compile(r".*results->decode_type *=.*?(\w+);")
-AC_FN = re.compile(r"ir_(.+).h")
+DECODED_PROTOCOLS = re.compile(r".*(?:results->decode_type *=.*?|"
+ r"typeguess\s*=\s*decode_type_t::)(\w+);")
+AC_FN = re.compile(r"ir_(.+)\.h")
+AC_MODEL_ENUM_RE = re.compile(r"(.+)_ac_remote_model_t")
+IRSEND_FN_RE = re.compile(r"IRsend\.h")
+ALL_FN = re.compile(r"ir_(.+)\.(h|cpp)")
-ALL_FN = re.compile(r"ir_(.+).(h|cpp)")
-
-EXCLUDED_PROTOCOLS = ["UNKNOWN", "UNUSED", "kLastDecodeType"]
+EXCLUDED_PROTOCOLS = ["UNKNOWN", "UNUSED", "kLastDecodeType", "typeguess"]
+EXCLUDED_ACS = ["Magiquest", "NEC"]
MARKDOWN_HEADER = """
+
=== ===
+
+
+
+
+ '' ''
+
+Parameters:
+
+
+
+ * '' '':
+
+
+
+
+
+Returns:
+
+*
+
+
+Warning:
+
+
+
+
<pre>
</pre>
+
+
+
+
+
+
+
diff --git a/lib/TasmotaModbus-1.2.0/src/TasmotaModbus.cpp b/lib/TasmotaModbus-1.2.0/src/TasmotaModbus.cpp
index dde74fd7c..057001779 100644
--- a/lib/TasmotaModbus-1.2.0/src/TasmotaModbus.cpp
+++ b/lib/TasmotaModbus-1.2.0/src/TasmotaModbus.cpp
@@ -1,7 +1,7 @@
/*
TasmotaModbus.cpp - Basic modbus wrapper for TasmotaSerial for Tasmota
- Copyright (C) 2018 Theo Arends
+ Copyright (C) 2020 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
diff --git a/lib/TasmotaModbus-1.2.0/src/TasmotaModbus.h b/lib/TasmotaModbus-1.2.0/src/TasmotaModbus.h
index 2138e0c9d..4a5fbc7a8 100644
--- a/lib/TasmotaModbus-1.2.0/src/TasmotaModbus.h
+++ b/lib/TasmotaModbus-1.2.0/src/TasmotaModbus.h
@@ -1,7 +1,7 @@
/*
TasmotaModbus.h - Basic modbus wrapper for TasmotaSerial for Tasmota
- Copyright (C) 2018 Theo Arends
+ Copyright (C) 2020 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
diff --git a/lib/TasmotaSerial-2.4.1/src/TasmotaSerial.cpp b/lib/TasmotaSerial-2.4.1/src/TasmotaSerial.cpp
index 45a1d47af..1fad7c0f5 100644
--- a/lib/TasmotaSerial-2.4.1/src/TasmotaSerial.cpp
+++ b/lib/TasmotaSerial-2.4.1/src/TasmotaSerial.cpp
@@ -1,7 +1,7 @@
/*
TasmotaSerial.cpp - Minimal implementation of software serial for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
diff --git a/lib/TasmotaSerial-2.4.1/src/TasmotaSerial.h b/lib/TasmotaSerial-2.4.1/src/TasmotaSerial.h
index 81545f522..3ef4ee43b 100644
--- a/lib/TasmotaSerial-2.4.1/src/TasmotaSerial.h
+++ b/lib/TasmotaSerial-2.4.1/src/TasmotaSerial.h
@@ -1,7 +1,7 @@
/*
TasmotaSerial.h - Minimal implementation of software serial for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
diff --git a/lib/bearssl-esp8266/src/t_bearssl_ec.h b/lib/bearssl-esp8266/src/t_bearssl_ec.h
index 660bd5186..fbe69cc02 100644
--- a/lib/bearssl-esp8266/src/t_bearssl_ec.h
+++ b/lib/bearssl-esp8266/src/t_bearssl_ec.h
@@ -108,7 +108,7 @@ extern "C" {
*
* - The multipliers (integers) MUST be lower than the subgroup order.
* If this property is not met, then the result is indeterminate,
- * but an error value is not ncessearily returned.
+ * but an error value is not necessarily returned.
*
*
* ## ECDSA
diff --git a/lib/bearssl-esp8266/src/t_bearssl_ssl.h b/lib/bearssl-esp8266/src/t_bearssl_ssl.h
index 8cd42d9f4..df0d44f08 100644
--- a/lib/bearssl-esp8266/src/t_bearssl_ssl.h
+++ b/lib/bearssl-esp8266/src/t_bearssl_ssl.h
@@ -2114,7 +2114,7 @@ void br_ssl_engine_sendapp_ack(br_ssl_engine_context *cc, size_t len);
/**
* \brief Get buffer for received application data.
*
- * If the engine has received application data from the peer, hen this
+ * If the engine has received application data from the peer, then this
* call returns a pointer to the buffer from where such data shall be
* read, and its length is written in `*len`. Otherwise, `*len` is set
* to 0 and `NULL` is returned.
diff --git a/lib/cc1101/README.md b/lib/cc1101/README.md
new file mode 100644
index 000000000..249930ed1
--- /dev/null
+++ b/lib/cc1101/README.md
@@ -0,0 +1 @@
+Port of panStamp's CC1101 Library to ESP8266.
diff --git a/lib/cc1101/cc1101.cpp b/lib/cc1101/cc1101.cpp
new file mode 100644
index 000000000..6a828e7d8
--- /dev/null
+++ b/lib/cc1101/cc1101.cpp
@@ -0,0 +1,548 @@
+#include
+
+/**
+ * Copyright (c) 2011 panStamp
+ *
+ * This file is part of the panStamp project.
+ *
+ * panStamp is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * any later version.
+ *
+ * panStamp 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with panStamp; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ *
+ * Author: Daniel Berenguer
+ * Creation date: 03/03/2011
+ */
+
+extern "C" {
+#include "cc1101.h"
+}
+
+#define PORT_GDO0 5
+#define byte uint8_t
+
+/**
+ * Macros
+ */
+// Select (SPI) CC1101
+#define cc1101_Select() spi.begin()
+// Deselect (SPI) CC1101
+#define cc1101_Deselect() spi.end()
+// Wait until SPI MISO line goes low
+#define wait_Miso() delay(10)
+//while(digitalRead(PORT_SPI_MISO))
+// Get GDO0 pin state
+#define getGDO0state() digitalRead(PORT_GDO0)
+// Wait until GDO0 line goes high
+#define wait_GDO0_high() while(!getGDO0state()) {delay(1);}
+// Wait until GDO0 line goes low
+#define wait_GDO0_low() while(getGDO0state()) {delay(1);}
+
+ /**
+ * PATABLE
+ */
+const byte paTable[8] = {0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+/**
+ * CC1101
+ *
+ * Class constructor
+ */
+CC1101::CC1101(void)
+{
+ carrierFreq = CFREQ_868;
+ channel = CC1101_DEFVAL_CHANNR;
+ syncWord[0] = CC1101_DEFVAL_SYNC1;
+ syncWord[1] = CC1101_DEFVAL_SYNC0;
+ devAddress = CC1101_DEFVAL_ADDR;
+ paTableByte = PA_LowPower; // Priority = Low power
+}
+
+/**
+ * wakeUp
+ *
+ * Wake up CC1101 from Power Down state
+ */
+void CC1101::wakeUp(void)
+{
+ cc1101_Select(); // Select CC1101
+ wait_Miso(); // Wait until MISO goes low
+ cc1101_Deselect(); // Deselect CC1101
+}
+
+/**
+ * writeReg
+ *
+ * Write single register into the CC1101 IC via SPI
+ *
+ * 'regAddr' Register address
+ * 'value' Value to be writen
+ */
+void CC1101::writeReg(byte regAddr, byte value)
+{
+ cc1101_Select(); // Select CC1101
+ wait_Miso(); // Wait until MISO goes low
+ spi.transfer(regAddr); // Send register address
+ spi.transfer(value); // Send value
+ cc1101_Deselect(); // Deselect CC1101
+}
+
+/**
+ * writeBurstReg
+ *
+ * Write multiple registers into the CC1101 IC via SPI
+ *
+ * 'regAddr' Register address
+ * 'buffer' Data to be writen
+ * 'len' Data length
+ */
+void CC1101::writeBurstReg(byte regAddr, byte* buffer, byte len)
+{
+ byte addr, i;
+
+ addr = regAddr | WRITE_BURST; // Enable burst transfer
+ cc1101_Select(); // Select CC1101
+ wait_Miso(); // Wait until MISO goes low
+ spi.transfer(addr); // Send register address
+
+ for(i=0 ; i 0)
+ {
+ // Set data length at the first position of the TX FIFO
+ writeReg(CC1101_TXFIFO, packet.length);
+ // Write data into the TX FIFO
+ writeBurstReg(CC1101_TXFIFO, packet.data, packet.length);
+
+ // CCA enabled: will enter TX state only if the channel is clear
+ setTxState();
+ }
+
+ // Check that TX state is being entered (state = RXTX_SETTLING)
+ marcState = readStatusReg(CC1101_MARCSTATE) & 0x1F;
+ if((marcState != 0x13) && (marcState != 0x14) && (marcState != 0x15))
+ {
+ setIdleState(); // Enter IDLE state
+ flushTxFifo(); // Flush Tx FIFO
+ setRxState(); // Back to RX state
+
+ // Declare to be in Rx state
+ rfState = RFSTATE_RX;
+ return false;
+ }
+
+ // Wait for the sync word to be transmitted
+ wait_GDO0_high();
+
+ // Wait until the end of the packet transmission
+ wait_GDO0_low();
+
+ // Check that the TX FIFO is empty
+ if((readStatusReg(CC1101_TXBYTES) & 0x7F) == 0)
+ res = true;
+
+ setIdleState(); // Enter IDLE state
+ flushTxFifo(); // Flush Tx FIFO
+
+ // Enter back into RX state
+ setRxState();
+
+ // Declare to be in Rx state
+ rfState = RFSTATE_RX;
+
+ return res;
+}
+
+/**
+ * receiveData
+ *
+ * Read data packet from RX FIFO
+ *
+ * 'packet' Container for the packet received
+ *
+ * Return:
+ * Amount of bytes received
+ */
+byte CC1101::receiveData(CCPACKET * packet)
+{
+ byte val;
+ byte rxBytes = readStatusReg(CC1101_RXBYTES);
+
+ // Any byte waiting to be read and no overflow?
+ if (rxBytes & 0x7F)
+ {
+ // Read data length
+ packet->length = readConfigReg(CC1101_RXFIFO);
+ // If packet is too long
+ if (packet->length > CCPACKET_DATA_LEN)
+ packet->length = 0; // Discard packet
+ else
+ {
+ // Read data packet
+ readBurstReg(packet->data, CC1101_RXFIFO, packet->length);
+ // Read RSSI
+ packet->rssi = readConfigReg(CC1101_RXFIFO);
+ // Read LQI and CRC_OK
+ val = readConfigReg(CC1101_RXFIFO);
+ packet->lqi = val & 0x7F;
+ packet->crc_ok = bitRead(val, 7);
+ }
+ }
+ else
+ packet->length = 0;
+
+ setIdleState(); // Enter IDLE state
+ flushRxFifo(); // Flush Rx FIFO
+ //cmdStrobe(CC1101_SCAL);
+
+ // Back to RX state
+ setRxState();
+
+ return packet->length;
+}
+
+/**
+ * setRxState
+ *
+ * Enter Rx state
+ */
+void CC1101::setRxState(void)
+{
+ cmdStrobe(CC1101_SRX);
+ rfState = RFSTATE_RX;
+}
+
+/**
+ * setTxState
+ *
+ * Enter Tx state
+ */
+void CC1101::setTxState(void)
+{
+ cmdStrobe(CC1101_STX);
+ rfState = RFSTATE_TX;
+}
diff --git a/lib/cc1101/cc1101.h b/lib/cc1101/cc1101.h
new file mode 100644
index 000000000..8636d8678
--- /dev/null
+++ b/lib/cc1101/cc1101.h
@@ -0,0 +1,548 @@
+#include
+
+/**
+ * Copyright (c) 2011 panStamp
+ *
+ * This file is part of the panStamp project.
+ *
+ * panStamp is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * any later version.
+ *
+ * panStamp 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with panStamp; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ *
+ * Author: Daniel Berenguer
+ * Creation date: 03/03/2011
+ */
+
+#ifndef _CC1101_H
+#define _CC1101_H
+
+//#include "simplespi.h"
+extern "C" {
+#include
+#include "ccpacket.h"
+}
+
+/**
+ * Carrier frequencies
+ */
+enum CFREQ
+{
+ CFREQ_868 = 0,
+ CFREQ_915,
+ CFREQ_433,
+ CFREQ_918,
+ CFREQ_LAST
+};
+
+/**
+ * RF STATES
+ */
+enum RFSTATE
+{
+ RFSTATE_IDLE = 0,
+ RFSTATE_RX,
+ RFSTATE_TX
+};
+
+
+/**
+ * Frequency channels
+ */
+#define NUMBER_OF_FCHANNELS 10
+
+/**
+ * Type of transfers
+ */
+#define WRITE_BURST 0x40
+#define READ_SINGLE 0x80
+#define READ_BURST 0xC0
+
+/**
+ * Type of register
+ */
+#define CC1101_CONFIG_REGISTER READ_SINGLE
+#define CC1101_STATUS_REGISTER READ_BURST
+
+/**
+ * PATABLE & FIFO's
+ */
+#define CC1101_PATABLE 0x3E // PATABLE address
+#define CC1101_TXFIFO 0x3F // TX FIFO address
+#define CC1101_RXFIFO 0x3F // RX FIFO address
+
+/**
+ * Command strobes
+ */
+#define CC1101_SRES 0x30 // Reset CC1101 chip
+#define CC1101_SFSTXON 0x31 // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1). If in RX (with CCA):
+ // Go to a wait state where only the synthesizer is running (for quick RX / TX turnaround).
+#define CC1101_SXOFF 0x32 // Turn off crystal oscillator
+#define CC1101_SCAL 0x33 // Calibrate frequency synthesizer and turn it off. SCAL can be strobed from IDLE mode without
+ // setting manual calibration mode (MCSM0.FS_AUTOCAL=0)
+#define CC1101_SRX 0x34 // Enable RX. Perform calibration first if coming from IDLE and MCSM0.FS_AUTOCAL=1
+#define CC1101_STX 0x35 // In IDLE state: Enable TX. Perform calibration first if MCSM0.FS_AUTOCAL=1.
+ // If in RX state and CCA is enabled: Only go to TX if channel is clear
+#define CC1101_SIDLE 0x36 // Exit RX / TX, turn off frequency synthesizer and exit Wake-On-Radio mode if applicable
+#define CC1101_SWOR 0x38 // Start automatic RX polling sequence (Wake-on-Radio) as described in Section 19.5 if
+ // WORCTRL.RC_PD=0
+#define CC1101_SPWD 0x39 // Enter power down mode when CSn goes high
+#define CC1101_SFRX 0x3A // Flush the RX FIFO buffer. Only issue SFRX in IDLE or RXFIFO_OVERFLOW states
+#define CC1101_SFTX 0x3B // Flush the TX FIFO buffer. Only issue SFTX in IDLE or TXFIFO_UNDERFLOW states
+#define CC1101_SWORRST 0x3C // Reset real time clock to Event1 value
+#define CC1101_SNOP 0x3D // No operation. May be used to get access to the chip status byte
+
+/**
+ * CC1101 configuration registers
+ */
+#define CC1101_IOCFG2 0x00 // GDO2 Output Pin Configuration
+#define CC1101_IOCFG1 0x01 // GDO1 Output Pin Configuration
+#define CC1101_IOCFG0 0x02 // GDO0 Output Pin Configuration
+#define CC1101_FIFOTHR 0x03 // RX FIFO and TX FIFO Thresholds
+#define CC1101_SYNC1 0x04 // Sync Word, High Byte
+#define CC1101_SYNC0 0x05 // Sync Word, Low Byte
+#define CC1101_PKTLEN 0x06 // Packet Length
+#define CC1101_PKTCTRL1 0x07 // Packet Automation Control
+#define CC1101_PKTCTRL0 0x08 // Packet Automation Control
+#define CC1101_ADDR 0x09 // Device Address
+#define CC1101_CHANNR 0x0A // Channel Number
+#define CC1101_FSCTRL1 0x0B // Frequency Synthesizer Control
+#define CC1101_FSCTRL0 0x0C // Frequency Synthesizer Control
+#define CC1101_FREQ2 0x0D // Frequency Control Word, High Byte
+#define CC1101_FREQ1 0x0E // Frequency Control Word, Middle Byte
+#define CC1101_FREQ0 0x0F // Frequency Control Word, Low Byte
+#define CC1101_MDMCFG4 0x10 // Modem Configuration
+#define CC1101_MDMCFG3 0x11 // Modem Configuration
+#define CC1101_MDMCFG2 0x12 // Modem Configuration
+#define CC1101_MDMCFG1 0x13 // Modem Configuration
+#define CC1101_MDMCFG0 0x14 // Modem Configuration
+#define CC1101_DEVIATN 0x15 // Modem Deviation Setting
+#define CC1101_MCSM2 0x16 // Main Radio Control State Machine Configuration
+#define CC1101_MCSM1 0x17 // Main Radio Control State Machine Configuration
+#define CC1101_MCSM0 0x18 // Main Radio Control State Machine Configuration
+#define CC1101_FOCCFG 0x19 // Frequency Offset Compensation Configuration
+#define CC1101_BSCFG 0x1A // Bit Synchronization Configuration
+#define CC1101_AGCCTRL2 0x1B // AGC Control
+#define CC1101_AGCCTRL1 0x1C // AGC Control
+#define CC1101_AGCCTRL0 0x1D // AGC Control
+#define CC1101_WOREVT1 0x1E // High Byte Event0 Timeout
+#define CC1101_WOREVT0 0x1F // Low Byte Event0 Timeout
+#define CC1101_WORCTRL 0x20 // Wake On Radio Control
+#define CC1101_FREND1 0x21 // Front End RX Configuration
+#define CC1101_FREND0 0x22 // Front End TX Configuration
+#define CC1101_FSCAL3 0x23 // Frequency Synthesizer Calibration
+#define CC1101_FSCAL2 0x24 // Frequency Synthesizer Calibration
+#define CC1101_FSCAL1 0x25 // Frequency Synthesizer Calibration
+#define CC1101_FSCAL0 0x26 // Frequency Synthesizer Calibration
+#define CC1101_RCCTRL1 0x27 // RC Oscillator Configuration
+#define CC1101_RCCTRL0 0x28 // RC Oscillator Configuration
+#define CC1101_FSTEST 0x29 // Frequency Synthesizer Calibration Control
+#define CC1101_PTEST 0x2A // Production Test
+#define CC1101_AGCTEST 0x2B // AGC Test
+#define CC1101_TEST2 0x2C // Various Test Settings
+#define CC1101_TEST1 0x2D // Various Test Settings
+#define CC1101_TEST0 0x2E // Various Test Settings
+
+/**
+ * Status registers
+ */
+#define CC1101_PARTNUM 0x30 // Chip ID
+#define CC1101_VERSION 0x31 // Chip ID
+#define CC1101_FREQEST 0x32 // Frequency Offset Estimate from Demodulator
+#define CC1101_LQI 0x33 // Demodulator Estimate for Link Quality
+#define CC1101_RSSI 0x34 // Received Signal Strength Indication
+#define CC1101_MARCSTATE 0x35 // Main Radio Control State Machine State
+#define CC1101_WORTIME1 0x36 // High Byte of WOR Time
+#define CC1101_WORTIME0 0x37 // Low Byte of WOR Time
+#define CC1101_PKTSTATUS 0x38 // Current GDOx Status and Packet Status
+#define CC1101_VCO_VC_DAC 0x39 // Current Setting from PLL Calibration Module
+#define CC1101_TXBYTES 0x3A // Underflow and Number of Bytes
+#define CC1101_RXBYTES 0x3B // Overflow and Number of Bytes
+#define CC1101_RCCTRL1_STATUS 0x3C // Last RC Oscillator Calibration Result
+#define CC1101_RCCTRL0_STATUS 0x3D // Last RC Oscillator Calibration Result
+
+/**
+ * CC1101 configuration registers - Default values extracted from SmartRF Studio
+ *
+ * Configuration:
+ *
+ * Deviation = 20.629883
+ * Base frequency = 867.999939
+ * Carrier frequency = 867.999939
+ * Channel number = 0
+ * Carrier frequency = 867.999939
+ * Modulated = true
+ * Modulation format = GFSK
+ * Manchester enable = false
+ * Data whitening = off
+ * Sync word qualifier mode = 30/32 sync word bits detected
+ * Preamble count = 4
+ * Channel spacing = 199.951172
+ * Carrier frequency = 867.999939
+ * Data rate = 38.3835 Kbps
+ * RX filter BW = 101.562500
+ * Data format = Normal mode
+ * Length config = Variable packet length mode. Packet length configured by the first byte after sync word
+ * CRC enable = true
+ * Packet length = 255
+ * Device address = 1
+ * Address config = Enable address check
+ * Append status = Append two status bytes to the payload of the packet. The status bytes contain RSSI and
+ * LQI values, as well as CRC OK
+ * CRC autoflush = false
+ * PA ramping = false
+ * TX power = 12
+ * GDO0 mode = Asserts when sync word has been sent / received, and de-asserts at the end of the packet.
+ * In RX, the pin will also de-assert when a packet is discarded due to address or maximum length filtering
+ * or when the radio enters RXFIFO_OVERFLOW state. In TX the pin will de-assert if the TX FIFO underflows
+ * Settings optimized for low current consumption
+ */
+
+#define CC1101_DEFVAL_IOCFG2 0x0D // GDO2 Output Pin Configuration
+#define CC1101_DEFVAL_IOCFG1 0x2E // GDO1 Output Pin Configuration
+#define CC1101_DEFVAL_IOCFG0 0x2D // GDO0 Output Pin Configuration
+#define CC1101_DEFVAL_FIFOTHR 0x07 // RX FIFO and TX FIFO Thresholds
+#define CC1101_DEFVAL_SYNC1 0xD3 // Synchronization word, high byte
+#define CC1101_DEFVAL_SYNC0 0x91 // Synchronization word, low byte
+#define CC1101_DEFVAL_PKTLEN 0x3D // Packet Length
+#define CC1101_DEFVAL_PKTCTRL1 0x04 // Packet Automation Control
+#define CC1101_DEFVAL_PKTCTRL0 0x32 // Packet Automation Control
+#define CC1101_DEFVAL_ADDR 0xFF // Device Address
+#define CC1101_DEFVAL_CHANNR 0x00 // Channel Number
+#define CC1101_DEFVAL_FSCTRL1 0x06 // Frequency Synthesizer Control
+#define CC1101_DEFVAL_FSCTRL0 0x00 // Frequency Synthesizer Control
+// Carrier frequency = 868 MHz
+#define CC1101_DEFVAL_FREQ2_868 0x21 // Frequency Control Word, High Byte
+#define CC1101_DEFVAL_FREQ1_868 0x62 // Frequency Control Word, Middle Byte
+#define CC1101_DEFVAL_FREQ0_868 0x76 // Frequency Control Word, Low Byte
+// Carrier frequency = 902 MHz
+#define CC1101_DEFVAL_FREQ2_915 0x22 // Frequency Control Word, High Byte
+#define CC1101_DEFVAL_FREQ1_915 0xB1 // Frequency Control Word, Middle Byte
+#define CC1101_DEFVAL_FREQ0_915 0x3B // Frequency Control Word, Low Byte
+// Carrier frequency = 918 MHz
+#define CC1101_DEFVAL_FREQ2_918 0x23 // Frequency Control Word, High Byte
+#define CC1101_DEFVAL_FREQ1_918 0x4E // Frequency Control Word, Middle Byte
+#define CC1101_DEFVAL_FREQ0_918 0xC4 // Frequency Control Word, Low Byte
+
+// Carrier frequency = 433 MHz
+#define CC1101_DEFVAL_FREQ2_433 0x10 // Frequency Control Word, High Byte
+#define CC1101_DEFVAL_FREQ1_433 0xB0 // Frequency Control Word, Middle Byte
+#define CC1101_DEFVAL_FREQ0_433 0xBD // Frequency Control Word, Low Byte
+
+#define CC1101_DEFVAL_MDMCFG4 0x56 // Modem Configuration
+#define CC1101_DEFVAL_MDMCFG3 0x83 // Modem Configuration
+#define CC1101_DEFVAL_MDMCFG2 0x30 // Modem Configuration
+#define CC1101_DEFVAL_MDMCFG1 0x22 // Modem Configuration
+#define CC1101_DEFVAL_MDMCFG0 0xF8 // Modem Configuration
+#define CC1101_DEFVAL_DEVIATN 0x00 // Modem Deviation Setting
+#define CC1101_DEFVAL_MCSM2 0x07 // Main Radio Control State Machine Configuration
+#define CC1101_DEFVAL_MCSM1 0x00 // Main Radio Control State Machine Configuration
+#define CC1101_DEFVAL_MCSM0 0x18 // Main Radio Control State Machine Configuration
+#define CC1101_DEFVAL_FOCCFG 0x14 // Frequency Offset Compensation Configuration
+#define CC1101_DEFVAL_BSCFG 0x6C // Bit Synchronization Configuration
+#define CC1101_DEFVAL_AGCCTRL2 0x07 // AGC Control
+#define CC1101_DEFVAL_AGCCTRL1 0x00 // AGC Control
+#define CC1101_DEFVAL_AGCCTRL0 0x91 // AGC Control
+#define CC1101_DEFVAL_WOREVT1 0x87 // High Byte Event0 Timeout
+#define CC1101_DEFVAL_WOREVT0 0x6B // Low Byte Event0 Timeout
+#define CC1101_DEFVAL_WORCTRL 0xF8 // Wake On Radio Control
+#define CC1101_DEFVAL_FREND1 0x56 // Front End RX Configuration
+#define CC1101_DEFVAL_FREND0 0x11 // Front End TX Configuration
+#define CC1101_DEFVAL_FSCAL3 0xE9 // Frequency Synthesizer Calibration
+#define CC1101_DEFVAL_FSCAL2 0x2A // Frequency Synthesizer Calibration
+#define CC1101_DEFVAL_FSCAL1 0x00 // Frequency Synthesizer Calibration
+#define CC1101_DEFVAL_FSCAL0 0x1F // Frequency Synthesizer Calibration
+#define CC1101_DEFVAL_RCCTRL1 0x41 // RC Oscillator Configuration
+#define CC1101_DEFVAL_RCCTRL0 0x00 // RC Oscillator Configuration
+#define CC1101_DEFVAL_FSTEST 0x59 // Frequency Synthesizer Calibration Control
+#define CC1101_DEFVAL_PTEST 0x7F // Production Test
+#define CC1101_DEFVAL_AGCTEST 0x3F // AGC Test
+#define CC1101_DEFVAL_TEST2 0x88 // Various Test Settings
+#define CC1101_DEFVAL_TEST1 0x31 // Various Test Settings
+#define CC1101_DEFVAL_TEST0 0x09 // Various Test Settings
+
+/**
+ * Alias for some default values
+ */
+#define CCDEF_CHANNR CC1101_DEFVAL_CHANNR
+#define CCDEF_SYNC0 CC1101_DEFVAL_SYNC0
+#define CCDEF_SYNC1 CC1101_DEFVAL_SYNC1
+#define CCDEF_ADDR CC1101_DEFVAL_ADDR
+
+/**
+ * Macros
+ */
+// Read CC1101 Config register
+#define readConfigReg(regAddr) readReg(regAddr, CC1101_CONFIG_REGISTER)
+// Read CC1101 Status register
+#define readStatusReg(regAddr) readReg(regAddr, CC1101_STATUS_REGISTER)
+// Enter Rx state
+//#define setRxState() cmdStrobe(CC1101_SRX)
+// Enter Tx state
+//#define setTxState() cmdStrobe(CC1101_STX)
+// Enter IDLE state
+#define setIdleState() cmdStrobe(CC1101_SIDLE)
+// Flush Rx FIFO
+#define flushRxFifo() cmdStrobe(CC1101_SFRX)
+// Flush Tx FIFO
+#define flushTxFifo() cmdStrobe(CC1101_SFTX)
+// Disable address check
+#define disableAddressCheck() writeReg(CC1101_PKTCTRL1, 0x04)
+// Enable address check
+#define enableAddressCheck() writeReg(CC1101_PKTCTRL1, 0x06)
+// Disable CCA
+#define disableCCA() writeReg(CC1101_MCSM1, 0)
+// Enable CCA
+#define enableCCA() writeReg(CC1101_MCSM1, CC1101_DEFVAL_MCSM1)
+// Set PATABLE single byte
+#define setTxPowerAmp(setting) paTableByte = setting
+// PATABLE values
+#define PA_LowPower 0x60
+#define PA_LongDistance 0xC0
+
+/**
+ * Class: CC1101
+ *
+ * Description:
+ * CC1101 interface
+ */
+class CC1101
+{
+ private:
+ /**
+ * Atmega's SPI interface
+ */
+ SPIClass spi;
+
+ /**
+ * writeBurstReg
+ *
+ * Write multiple registers into the CC1101 IC via SPI
+ *
+ * 'regAddr' Register address
+ * 'buffer' Data to be writen
+ * 'len' Data length
+ */
+ void writeBurstReg(uint8_t regAddr, uint8_t* buffer, uint8_t len);
+
+ /**
+ * readBurstReg
+ *
+ * Read burst data from CC1101 via SPI
+ *
+ * 'buffer' Buffer where to copy the result to
+ * 'regAddr' Register address
+ * 'len' Data length
+ */
+ void readBurstReg(uint8_t * buffer, uint8_t regAddr, uint8_t len);
+
+ /**
+ * setRegsFromEeprom
+ *
+ * Set registers from EEPROM
+ */
+ void setRegsFromEeprom(void);
+
+ public:
+ /*
+ * RF state
+ */
+ uint8_t rfState;
+
+ /**
+ * Tx Power byte (single PATABLE config)
+ */
+ uint8_t paTableByte;
+
+ /**
+ * Carrier frequency
+ */
+ uint8_t carrierFreq;
+
+ /**
+ * Frequency channel
+ */
+ uint8_t channel;
+
+ /**
+ * Synchronization word
+ */
+ uint8_t syncWord[2];
+
+ /**
+ * Device address
+ */
+ uint8_t devAddress;
+
+ /**
+ * CC1101
+ *
+ * Class constructor
+ */
+ CC1101(void);
+
+ /**
+ * cmdStrobe
+ *
+ * Send command strobe to the CC1101 IC via SPI
+ *
+ * 'cmd' Command strobe
+ */
+ void cmdStrobe(uint8_t cmd);
+
+ /**
+ * wakeUp
+ *
+ * Wake up CC1101 from Power Down state
+ */
+ void wakeUp(void);
+
+ /**
+ * readReg
+ *
+ * Read CC1101 register via SPI
+ *
+ * 'regAddr' Register address
+ * 'regType' Type of register: CC1101_CONFIG_REGISTER or CC1101_STATUS_REGISTER
+ *
+ * Return:
+ * Data byte returned by the CC1101 IC
+ */
+ uint8_t readReg(uint8_t regAddr, uint8_t regType);
+
+ /**
+ * writeReg
+ *
+ * Write single register into the CC1101 IC via SPI
+ *
+ * 'regAddr' Register address
+ * 'value' Value to be writen
+ */
+ void writeReg(uint8_t regAddr, uint8_t value);
+
+ /**
+ * setCCregs
+ *
+ * Configure CC1101 registers
+ */
+ void setCCregs(void);
+
+ /**
+ * reset
+ *
+ * Reset CC1101
+ */
+ void reset(void);
+
+ /**
+ * init
+ *
+ * Initialize CC1101 radio
+ *
+ * @param freq Carrier frequency
+ */
+ void init(uint8_t freq=CFREQ_868);
+
+ /**
+ * setSyncWord
+ *
+ * Set synchronization word
+ *
+ * 'syncH' Synchronization word - High byte
+ * 'syncL' Synchronization word - Low byte
+ */
+ void setSyncWord(uint8_t syncH, uint8_t syncL);
+
+ /**
+ * setSyncWord (overriding method)
+ *
+ * Set synchronization word
+ *
+ * 'syncH' Synchronization word - pointer to 2-byte array
+ */
+ void setSyncWord(uint8_t *sync);
+
+ /**
+ * setDevAddress
+ *
+ * Set device address
+ *
+ * 'addr' Device address
+ */
+ void setDevAddress(uint8_t addr);
+
+ /**
+ * setCarrierFreq
+ *
+ * Set carrier frequency
+ *
+ * 'freq' New carrier frequency
+ */
+ void setCarrierFreq(uint8_t freq);
+
+ /**
+ * setChannel
+ *
+ * Set frequency channel
+ *
+ * 'chnl' Frequency channel
+ */
+ void setChannel(uint8_t chnl);
+
+ /**
+ * setPowerDownState
+ *
+ * Put CC1101 into power-down state
+ */
+ void setPowerDownState();
+
+ /**
+ * sendData
+ *
+ * Send data packet via RF
+ *
+ * 'packet' Packet to be transmitted. First byte is the destination address
+ *
+ * Return:
+ * True if the transmission succeeds
+ * False otherwise
+ */
+ bool sendData(CCPACKET packet);
+
+ /**
+ * receiveData
+ *
+ * Read data packet from RX FIFO
+ *
+ * Return:
+ * Amount of bytes received
+ */
+ uint8_t receiveData(CCPACKET *packet);
+
+ /**
+ * setRxState
+ *
+ * Enter Rx state
+ */
+ void setRxState(void);
+
+ /**
+ * setTxState
+ *
+ * Enter Tx state
+ */
+ void setTxState(void);
+};
+
+#endif
+
diff --git a/lib/cc1101/cc1101.h.txt b/lib/cc1101/cc1101.h.txt
new file mode 100644
index 000000000..6f48d992f
--- /dev/null
+++ b/lib/cc1101/cc1101.h.txt
@@ -0,0 +1,549 @@
+#include
+
+/**
+ * Copyright (c) 2011 panStamp
+ *
+ * This file is part of the panStamp project.
+ *
+ * panStamp is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * any later version.
+ *
+ * panStamp 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with panStamp; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ *
+ * Author: Daniel Berenguer
+ * Creation date: 03/03/2011
+ */
+
+#ifndef _CC1101_H
+#define _CC1101_H
+
+//#include "simplespi.h"
+extern "C" {
+#include
+#include "ccpacket.h"
+}
+
+/**
+ * Carrier frequencies
+ */
+enum CFREQ
+{
+ CFREQ_868 = 0,
+ CFREQ_915,
+ CFREQ_433,
+ CFREQ_918,
+ CFREQ_LAST
+};
+
+/**
+ * RF STATES
+ */
+enum RFSTATE
+{
+ RFSTATE_IDLE = 0,
+ RFSTATE_RX,
+ RFSTATE_TX
+};
+
+
+/**
+ * Frequency channels
+ */
+#define NUMBER_OF_FCHANNELS 10
+
+/**
+ * Type of transfers
+ */
+#define WRITE_BURST 0x40
+#define READ_SINGLE 0x80
+#define READ_BURST 0xC0
+
+/**
+ * Type of register
+ */
+#define CC1101_CONFIG_REGISTER READ_SINGLE
+#define CC1101_STATUS_REGISTER READ_BURST
+
+/**
+ * PATABLE & FIFO's
+ */
+#define CC1101_PATABLE 0x3E // PATABLE address
+#define CC1101_TXFIFO 0x3F // TX FIFO address
+#define CC1101_RXFIFO 0x3F // RX FIFO address
+
+/**
+ * Command strobes
+ */
+#define CC1101_SRES 0x30 // Reset CC1101 chip
+#define CC1101_SFSTXON 0x31 // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1). If in RX (with CCA):
+ // Go to a wait state where only the synthesizer is running (for quick RX / TX turnaround).
+#define CC1101_SXOFF 0x32 // Turn off crystal oscillator
+#define CC1101_SCAL 0x33 // Calibrate frequency synthesizer and turn it off. SCAL can be strobed from IDLE mode without
+ // setting manual calibration mode (MCSM0.FS_AUTOCAL=0)
+#define CC1101_SRX 0x34 // Enable RX. Perform calibration first if coming from IDLE and MCSM0.FS_AUTOCAL=1
+#define CC1101_STX 0x35 // In IDLE state: Enable TX. Perform calibration first if MCSM0.FS_AUTOCAL=1.
+ // If in RX state and CCA is enabled: Only go to TX if channel is clear
+#define CC1101_SIDLE 0x36 // Exit RX / TX, turn off frequency synthesizer and exit Wake-On-Radio mode if applicable
+#define CC1101_SWOR 0x38 // Start automatic RX polling sequence (Wake-on-Radio) as described in Section 19.5 if
+ // WORCTRL.RC_PD=0
+#define CC1101_SPWD 0x39 // Enter power down mode when CSn goes high
+#define CC1101_SFRX 0x3A // Flush the RX FIFO buffer. Only issue SFRX in IDLE or RXFIFO_OVERFLOW states
+#define CC1101_SFTX 0x3B // Flush the TX FIFO buffer. Only issue SFTX in IDLE or TXFIFO_UNDERFLOW states
+#define CC1101_SWORRST 0x3C // Reset real time clock to Event1 value
+#define CC1101_SNOP 0x3D // No operation. May be used to get access to the chip status byte
+
+/**
+ * CC1101 configuration registers
+ */
+#define CC1101_IOCFG2 0x00 // GDO2 Output Pin Configuration
+#define CC1101_IOCFG1 0x01 // GDO1 Output Pin Configuration
+#define CC1101_IOCFG0 0x02 // GDO0 Output Pin Configuration
+#define CC1101_FIFOTHR 0x03 // RX FIFO and TX FIFO Thresholds
+#define CC1101_SYNC1 0x04 // Sync Word, High Byte
+#define CC1101_SYNC0 0x05 // Sync Word, Low Byte
+#define CC1101_PKTLEN 0x06 // Packet Length
+#define CC1101_PKTCTRL1 0x07 // Packet Automation Control
+#define CC1101_PKTCTRL0 0x08 // Packet Automation Control
+#define CC1101_ADDR 0x09 // Device Address
+#define CC1101_CHANNR 0x0A // Channel Number
+#define CC1101_FSCTRL1 0x0B // Frequency Synthesizer Control
+#define CC1101_FSCTRL0 0x0C // Frequency Synthesizer Control
+#define CC1101_FREQ2 0x0D // Frequency Control Word, High Byte
+#define CC1101_FREQ1 0x0E // Frequency Control Word, Middle Byte
+#define CC1101_FREQ0 0x0F // Frequency Control Word, Low Byte
+#define CC1101_MDMCFG4 0x10 // Modem Configuration
+#define CC1101_MDMCFG3 0x11 // Modem Configuration
+#define CC1101_MDMCFG2 0x12 // Modem Configuration
+#define CC1101_MDMCFG1 0x13 // Modem Configuration
+#define CC1101_MDMCFG0 0x14 // Modem Configuration
+#define CC1101_DEVIATN 0x15 // Modem Deviation Setting
+#define CC1101_MCSM2 0x16 // Main Radio Control State Machine Configuration
+#define CC1101_MCSM1 0x17 // Main Radio Control State Machine Configuration
+#define CC1101_MCSM0 0x18 // Main Radio Control State Machine Configuration
+#define CC1101_FOCCFG 0x19 // Frequency Offset Compensation Configuration
+#define CC1101_BSCFG 0x1A // Bit Synchronization Configuration
+#define CC1101_AGCCTRL2 0x1B // AGC Control
+#define CC1101_AGCCTRL1 0x1C // AGC Control
+#define CC1101_AGCCTRL0 0x1D // AGC Control
+#define CC1101_WOREVT1 0x1E // High Byte Event0 Timeout
+#define CC1101_WOREVT0 0x1F // Low Byte Event0 Timeout
+#define CC1101_WORCTRL 0x20 // Wake On Radio Control
+#define CC1101_FREND1 0x21 // Front End RX Configuration
+#define CC1101_FREND0 0x22 // Front End TX Configuration
+#define CC1101_FSCAL3 0x23 // Frequency Synthesizer Calibration
+#define CC1101_FSCAL2 0x24 // Frequency Synthesizer Calibration
+#define CC1101_FSCAL1 0x25 // Frequency Synthesizer Calibration
+#define CC1101_FSCAL0 0x26 // Frequency Synthesizer Calibration
+#define CC1101_RCCTRL1 0x27 // RC Oscillator Configuration
+#define CC1101_RCCTRL0 0x28 // RC Oscillator Configuration
+#define CC1101_FSTEST 0x29 // Frequency Synthesizer Calibration Control
+#define CC1101_PTEST 0x2A // Production Test
+#define CC1101_AGCTEST 0x2B // AGC Test
+#define CC1101_TEST2 0x2C // Various Test Settings
+#define CC1101_TEST1 0x2D // Various Test Settings
+#define CC1101_TEST0 0x2E // Various Test Settings
+
+/**
+ * Status registers
+ */
+#define CC1101_PARTNUM 0x30 // Chip ID
+#define CC1101_VERSION 0x31 // Chip ID
+#define CC1101_FREQEST 0x32 // Frequency Offset Estimate from Demodulator
+#define CC1101_LQI 0x33 // Demodulator Estimate for Link Quality
+#define CC1101_RSSI 0x34 // Received Signal Strength Indication
+#define CC1101_MARCSTATE 0x35 // Main Radio Control State Machine State
+#define CC1101_WORTIME1 0x36 // High Byte of WOR Time
+#define CC1101_WORTIME0 0x37 // Low Byte of WOR Time
+#define CC1101_PKTSTATUS 0x38 // Current GDOx Status and Packet Status
+#define CC1101_VCO_VC_DAC 0x39 // Current Setting from PLL Calibration Module
+#define CC1101_TXBYTES 0x3A // Underflow and Number of Bytes
+#define CC1101_RXBYTES 0x3B // Overflow and Number of Bytes
+#define CC1101_RCCTRL1_STATUS 0x3C // Last RC Oscillator Calibration Result
+#define CC1101_RCCTRL0_STATUS 0x3D // Last RC Oscillator Calibration Result
+
+/**
+ * CC1101 configuration registers - Default values extracted from SmartRF Studio
+ *
+ * Configuration:
+ *
+ * Deviation = 20.629883
+ * Base frequency = 867.999939
+ * Carrier frequency = 867.999939
+ * Channel number = 0
+ * Carrier frequency = 867.999939
+ * Modulated = true
+ * Modulation format = GFSK
+ * Manchester enable = false
+ * Data whitening = off
+ * Sync word qualifier mode = 30/32 sync word bits detected
+ * Preamble count = 4
+ * Channel spacing = 199.951172
+ * Carrier frequency = 867.999939
+ * Data rate = 38.3835 Kbps
+ * RX filter BW = 101.562500
+ * Data format = Normal mode
+ * Length config = Variable packet length mode. Packet length configured by the first byte after sync word
+ * CRC enable = true
+ * Packet length = 255
+ * Device address = 1
+ * Address config = Enable address check
+ * Append status = Append two status bytes to the payload of the packet. The status bytes contain RSSI and
+ * LQI values, as well as CRC OK
+ * CRC autoflush = false
+ * PA ramping = false
+ * TX power = 12
+ * GDO0 mode = Asserts when sync word has been sent / received, and de-asserts at the end of the packet.
+ * In RX, the pin will also de-assert when a packet is discarded due to address or maximum length filtering
+ * or when the radio enters RXFIFO_OVERFLOW state. In TX the pin will de-assert if the TX FIFO underflows
+ * Settings optimized for low current consumption
+ */
+//#define CC1101_DEFVAL_IOCFG2 0x29 // GDO2 Output Pin Configuration
+#define CC1101_DEFVAL_IOCFG2 0x0D // GDO2 Output Pin Configuration
+#define CC1101_DEFVAL_IOCFG1 0x2E // GDO1 Output Pin Configuration
+#define CC1101_DEFVAL_IOCFG0 0x2D // GDO0 Output Pin Configuration
+#define CC1101_DEFVAL_FIFOTHR 0x07 // RX FIFO and TX FIFO Thresholds
+#define CC1101_DEFVAL_SYNC1 0xD3 // Synchronization word, high byte
+#define CC1101_DEFVAL_SYNC0 0x91 // Synchronization word, low byte
+#define CC1101_DEFVAL_PKTLEN 0x3D // Packet Length
+#define CC1101_DEFVAL_PKTCTRL1 0x04 // Packet Automation Control
+#define CC1101_DEFVAL_PKTCTRL0 0x32 // Packet Automation Control
+#define CC1101_DEFVAL_ADDR 0xFF // Device Address
+#define CC1101_DEFVAL_CHANNR 0x00 // Channel Number
+#define CC1101_DEFVAL_FSCTRL1 0x06 // Frequency Synthesizer Control
+#define CC1101_DEFVAL_FSCTRL0 0x00 // Frequency Synthesizer Control
+// Carrier frequency = 868 MHz
+#define CC1101_DEFVAL_FREQ2_868 0x21 // Frequency Control Word, High Byte
+#define CC1101_DEFVAL_FREQ1_868 0x62 // Frequency Control Word, Middle Byte
+#define CC1101_DEFVAL_FREQ0_868 0x76 // Frequency Control Word, Low Byte
+// Carrier frequency = 902 MHz
+#define CC1101_DEFVAL_FREQ2_915 0x22 // Frequency Control Word, High Byte
+#define CC1101_DEFVAL_FREQ1_915 0xB1 // Frequency Control Word, Middle Byte
+#define CC1101_DEFVAL_FREQ0_915 0x3B // Frequency Control Word, Low Byte
+// Carrier frequency = 918 MHz
+#define CC1101_DEFVAL_FREQ2_918 0x23 // Frequency Control Word, High Byte
+#define CC1101_DEFVAL_FREQ1_918 0x4E // Frequency Control Word, Middle Byte
+#define CC1101_DEFVAL_FREQ0_918 0xC4 // Frequency Control Word, Low Byte
+
+// Carrier frequency = 433 MHz
+#define CC1101_DEFVAL_FREQ2_433 0x10 // Frequency Control Word, High Byte
+#define CC1101_DEFVAL_FREQ1_433 0xB0 // Frequency Control Word, Middle Byte
+#define CC1101_DEFVAL_FREQ0_433 0xB0 // Frequency Control Word, Low Byte
+
+#define CC1101_DEFVAL_MDMCFG4 0xA9 // Modem Configuration
+#define CC1101_DEFVAL_MDMCFG3 0xE4 // Modem Configuration
+#define CC1101_DEFVAL_MDMCFG2 0x30 // Modem Configuration
+#define CC1101_DEFVAL_MDMCFG1 0x22 // Modem Configuration
+#define CC1101_DEFVAL_MDMCFG0 0xF8 // Modem Configuration
+#define CC1101_DEFVAL_DEVIATN 0x00 // Modem Deviation Setting
+#define CC1101_DEFVAL_MCSM2 0x07 // Main Radio Control State Machine Configuration
+//#define CC1101_DEFVAL_MCSM1 0x30 // Main Radio Control State Machine Configuration
+#define CC1101_DEFVAL_MCSM1 0x30 // Main Radio Control State Machine Configuration
+#define CC1101_DEFVAL_MCSM0 0x18 // Main Radio Control State Machine Configuration
+#define CC1101_DEFVAL_FOCCFG 0x14 // Frequency Offset Compensation Configuration
+#define CC1101_DEFVAL_BSCFG 0x6C // Bit Synchronization Configuration
+#define CC1101_DEFVAL_AGCCTRL2 0x04 // AGC Control
+#define CC1101_DEFVAL_AGCCTRL1 0x00 // AGC Control
+#define CC1101_DEFVAL_AGCCTRL0 0x92 // AGC Control
+#define CC1101_DEFVAL_WOREVT1 0x87 // High Byte Event0 Timeout
+#define CC1101_DEFVAL_WOREVT0 0x6B // Low Byte Event0 Timeout
+#define CC1101_DEFVAL_WORCTRL 0xF8 // Wake On Radio Control
+#define CC1101_DEFVAL_FREND1 0xB6 // Front End RX Configuration
+#define CC1101_DEFVAL_FREND0 0x11 // Front End TX Configuration
+#define CC1101_DEFVAL_FSCAL3 0xE9 // Frequency Synthesizer Calibration
+#define CC1101_DEFVAL_FSCAL2 0x2A // Frequency Synthesizer Calibration
+#define CC1101_DEFVAL_FSCAL1 0x00 // Frequency Synthesizer Calibration
+#define CC1101_DEFVAL_FSCAL0 0x1F // Frequency Synthesizer Calibration
+#define CC1101_DEFVAL_RCCTRL1 0x41 // RC Oscillator Configuration
+#define CC1101_DEFVAL_RCCTRL0 0x00 // RC Oscillator Configuration
+#define CC1101_DEFVAL_FSTEST 0x59 // Frequency Synthesizer Calibration Control
+#define CC1101_DEFVAL_PTEST 0x7F // Production Test
+#define CC1101_DEFVAL_AGCTEST 0x3F // AGC Test
+#define CC1101_DEFVAL_TEST2 0x81 // Various Test Settings
+#define CC1101_DEFVAL_TEST1 0x35 // Various Test Settings
+#define CC1101_DEFVAL_TEST0 0x09 // Various Test Settings
+
+/**
+ * Alias for some default values
+ */
+#define CCDEF_CHANNR CC1101_DEFVAL_CHANNR
+#define CCDEF_SYNC0 CC1101_DEFVAL_SYNC0
+#define CCDEF_SYNC1 CC1101_DEFVAL_SYNC1
+#define CCDEF_ADDR CC1101_DEFVAL_ADDR
+
+/**
+ * Macros
+ */
+// Read CC1101 Config register
+#define readConfigReg(regAddr) readReg(regAddr, CC1101_CONFIG_REGISTER)
+// Read CC1101 Status register
+#define readStatusReg(regAddr) readReg(regAddr, CC1101_STATUS_REGISTER)
+// Enter Rx state
+//#define setRxState() cmdStrobe(CC1101_SRX)
+// Enter Tx state
+//#define setTxState() cmdStrobe(CC1101_STX)
+// Enter IDLE state
+#define setIdleState() cmdStrobe(CC1101_SIDLE)
+// Flush Rx FIFO
+#define flushRxFifo() cmdStrobe(CC1101_SFRX)
+// Flush Tx FIFO
+#define flushTxFifo() cmdStrobe(CC1101_SFTX)
+// Disable address check
+#define disableAddressCheck() writeReg(CC1101_PKTCTRL1, 0x04)
+// Enable address check
+#define enableAddressCheck() writeReg(CC1101_PKTCTRL1, 0x06)
+// Disable CCA
+#define disableCCA() writeReg(CC1101_MCSM1, 0)
+// Enable CCA
+#define enableCCA() writeReg(CC1101_MCSM1, CC1101_DEFVAL_MCSM1)
+// Set PATABLE single byte
+#define setTxPowerAmp(setting) paTableByte = setting
+// PATABLE values
+#define PA_LowPower 0x60
+#define PA_LongDistance 0xC0
+
+/**
+ * Class: CC1101
+ *
+ * Description:
+ * CC1101 interface
+ */
+class CC1101
+{
+ private:
+ /**
+ * Atmega's SPI interface
+ */
+ SPIClass spi;
+
+ /**
+ * writeBurstReg
+ *
+ * Write multiple registers into the CC1101 IC via SPI
+ *
+ * 'regAddr' Register address
+ * 'buffer' Data to be writen
+ * 'len' Data length
+ */
+ void writeBurstReg(uint8_t regAddr, uint8_t* buffer, uint8_t len);
+
+ /**
+ * readBurstReg
+ *
+ * Read burst data from CC1101 via SPI
+ *
+ * 'buffer' Buffer where to copy the result to
+ * 'regAddr' Register address
+ * 'len' Data length
+ */
+ void readBurstReg(uint8_t * buffer, uint8_t regAddr, uint8_t len);
+
+ /**
+ * setRegsFromEeprom
+ *
+ * Set registers from EEPROM
+ */
+ void setRegsFromEeprom(void);
+
+ public:
+ /*
+ * RF state
+ */
+ uint8_t rfState;
+
+ /**
+ * Tx Power byte (single PATABLE config)
+ */
+ uint8_t paTableByte;
+
+ /**
+ * Carrier frequency
+ */
+ uint8_t carrierFreq;
+
+ /**
+ * Frequency channel
+ */
+ uint8_t channel;
+
+ /**
+ * Synchronization word
+ */
+ uint8_t syncWord[2];
+
+ /**
+ * Device address
+ */
+ uint8_t devAddress;
+
+ /**
+ * CC1101
+ *
+ * Class constructor
+ */
+ CC1101(void);
+
+ /**
+ * cmdStrobe
+ *
+ * Send command strobe to the CC1101 IC via SPI
+ *
+ * 'cmd' Command strobe
+ */
+ void cmdStrobe(uint8_t cmd);
+
+ /**
+ * wakeUp
+ *
+ * Wake up CC1101 from Power Down state
+ */
+ void wakeUp(void);
+
+ /**
+ * readReg
+ *
+ * Read CC1101 register via SPI
+ *
+ * 'regAddr' Register address
+ * 'regType' Type of register: CC1101_CONFIG_REGISTER or CC1101_STATUS_REGISTER
+ *
+ * Return:
+ * Data byte returned by the CC1101 IC
+ */
+ uint8_t readReg(uint8_t regAddr, uint8_t regType);
+
+ /**
+ * writeReg
+ *
+ * Write single register into the CC1101 IC via SPI
+ *
+ * 'regAddr' Register address
+ * 'value' Value to be writen
+ */
+ void writeReg(uint8_t regAddr, uint8_t value);
+
+ /**
+ * setCCregs
+ *
+ * Configure CC1101 registers
+ */
+ void setCCregs(void);
+
+ /**
+ * reset
+ *
+ * Reset CC1101
+ */
+ void reset(void);
+
+ /**
+ * init
+ *
+ * Initialize CC1101 radio
+ *
+ * @param freq Carrier frequency
+ */
+ void init(uint8_t freq=CFREQ_868);
+
+ /**
+ * setSyncWord
+ *
+ * Set synchronization word
+ *
+ * 'syncH' Synchronization word - High byte
+ * 'syncL' Synchronization word - Low byte
+ */
+ void setSyncWord(uint8_t syncH, uint8_t syncL);
+
+ /**
+ * setSyncWord (overriding method)
+ *
+ * Set synchronization word
+ *
+ * 'syncH' Synchronization word - pointer to 2-byte array
+ */
+ void setSyncWord(uint8_t *sync);
+
+ /**
+ * setDevAddress
+ *
+ * Set device address
+ *
+ * 'addr' Device address
+ */
+ void setDevAddress(uint8_t addr);
+
+ /**
+ * setCarrierFreq
+ *
+ * Set carrier frequency
+ *
+ * 'freq' New carrier frequency
+ */
+ void setCarrierFreq(uint8_t freq);
+
+ /**
+ * setChannel
+ *
+ * Set frequency channel
+ *
+ * 'chnl' Frequency channel
+ */
+ void setChannel(uint8_t chnl);
+
+ /**
+ * setPowerDownState
+ *
+ * Put CC1101 into power-down state
+ */
+ void setPowerDownState();
+
+ /**
+ * sendData
+ *
+ * Send data packet via RF
+ *
+ * 'packet' Packet to be transmitted. First byte is the destination address
+ *
+ * Return:
+ * True if the transmission succeeds
+ * False otherwise
+ */
+ bool sendData(CCPACKET packet);
+
+ /**
+ * receiveData
+ *
+ * Read data packet from RX FIFO
+ *
+ * Return:
+ * Amount of bytes received
+ */
+ uint8_t receiveData(CCPACKET *packet);
+
+ /**
+ * setRxState
+ *
+ * Enter Rx state
+ */
+ void setRxState(void);
+
+ /**
+ * setTxState
+ *
+ * Enter Tx state
+ */
+ void setTxState(void);
+};
+
+#endif
+
diff --git a/lib/cc1101/ccpacket.h b/lib/cc1101/ccpacket.h
new file mode 100644
index 000000000..02f131e94
--- /dev/null
+++ b/lib/cc1101/ccpacket.h
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2011 panStamp
+ *
+ * This file is part of the panStamp project.
+ *
+ * panStamp is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * any later version.
+ *
+ * panStamp 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with panStamp; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ *
+ * Author: Daniel Berenguer
+ * Creation date: 06/03/2013
+ */
+
+#ifndef _CCPACKET_H
+#define _CCPACKET_H
+
+/**
+ * Buffer and data lengths
+ */
+#define CCPACKET_BUFFER_LEN 64
+#define CCPACKET_DATA_LEN CCPACKET_BUFFER_LEN - 3
+
+/**
+ * Class: CCPACKET
+ *
+ * Description:
+ * CC1101 data packet class
+ */
+struct CCPACKET
+{
+ public:
+ /**
+ * Data length
+ */
+ unsigned char length;
+
+ /**
+ * Data buffer
+ */
+ unsigned char data[CCPACKET_DATA_LEN];
+
+ /**
+ * CRC OK flag
+ */
+ bool crc_ok;
+
+ /**
+ * Received Strength Signal Indication
+ */
+ unsigned char rssi;
+
+ /**
+ * Link Quality Index
+ */
+ unsigned char lqi;
+};
+
+#endif
+
diff --git a/lib/rc-switch-2.6.2.13/RCSwitch.cpp b/lib/rc-switch-2.6.2.13/RCSwitch.cpp
index 1a6736e24..76ad3a133 100644
--- a/lib/rc-switch-2.6.2.13/RCSwitch.cpp
+++ b/lib/rc-switch-2.6.2.13/RCSwitch.cpp
@@ -78,8 +78,10 @@ static const RCSwitch::Protocol PROGMEM proto[] = {
{ 100, { 30, 71 }, { 4, 11 }, { 9, 6 }, false }, // protocol 3
{ 380, { 1, 6 }, { 1, 3 }, { 3, 1 }, false }, // protocol 4
{ 500, { 6, 14 }, { 1, 2 }, { 2, 1 }, false }, // protocol 5
- { 450, { 23, 1 }, { 1, 2 }, { 2, 1 }, true }, // protocol 6 (HT6P20B)
- { 150, { 2, 62 }, { 1, 6 }, { 6, 1 }, false } // protocol 7 (HS2303-PT, i. e. used in AUKEY Remote)
+ { 450, { 23, 1 }, { 1, 2 }, { 2, 1 }, true }, // protocol 6 (HT6P20B)
+ { 150, { 2, 62 }, { 1, 6 }, { 6, 1 }, false }, // protocol 7 (HS2303-PT, i. e. used in AUKEY Remote)
+ { 200, { 3, 130}, { 7, 16 }, { 3, 16}, false}, // protocol 8 Conrad RS-200 RX
+ { 200, { 130, 7 }, { 16, 7 }, { 16, 3 }, true} // protocol 9 Conrad RS-200 TX
};
enum {
@@ -669,7 +671,7 @@ void RECEIVE_ATTR RCSwitch::handleInterrupt() {
if (duration > RCSwitch::nSeparationLimit) {
// A long stretch without signal level change occurred. This could
// be the gap between two transmission.
- if (diff(duration, RCSwitch::timings[0]) < 200) {
+ if ((repeatCount==0) || (diff(duration, RCSwitch::timings[0]) < 200)) {
// This long signal is close in length to the long signal which
// started the previously recorded timings; this suggests that
// it may indeed by a a gap between two transmissions (we assume
diff --git a/pio/espupload.py b/pio/espupload.py
old mode 100644
new mode 100755
diff --git a/pio/gzip-firmware.py b/pio/gzip-firmware.py
new file mode 100644
index 000000000..e8fae2c92
--- /dev/null
+++ b/pio/gzip-firmware.py
@@ -0,0 +1,23 @@
+Import('env')
+import os
+import shutil
+import gzip
+
+OUTPUT_DIR = "build_output{}".format(os.path.sep)
+
+def bin_gzip(source, target, env):
+ variant = str(target[0]).split(os.path.sep)[1]
+
+ # create string with location and file names based on variant
+ bin_file = "{}firmware{}{}.bin".format(OUTPUT_DIR, os.path.sep, variant)
+ gzip_file = "{}firmware{}{}.bin.gz".format(OUTPUT_DIR, os.path.sep, variant)
+
+ # check if new target files exist and remove if necessary
+ if os.path.isfile(gzip_file): os.remove(gzip_file)
+
+ # write gzip firmware file
+ with open(bin_file,"rb") as fp:
+ with gzip.open(gzip_file, "wb") as f:
+ shutil.copyfileobj(fp, f)
+
+env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_gzip])
diff --git a/pio/http-uploader.py b/pio/http-uploader.py
index dd563177f..88d5a23ce 100644
--- a/pio/http-uploader.py
+++ b/pio/http-uploader.py
@@ -1,4 +1,5 @@
Import("env")
+import os
# pio < 4.0.0
# from base64 import b64decode
@@ -7,11 +8,6 @@ Import("env")
# env.Replace(UPLOADCMD="$UPLOADER -u " + b64decode(ARGUMENTS.get("UPLOAD_PORT")) + " -f $SOURCES")
# pio >= 4.0.0
-env.Replace(UPLOADER="pio\espupload.py")
+env.Replace(UPLOADER=os.path.join("pio", "espupload.py"))
env.Replace(UPLOADERFLAGS="")
env.Replace(UPLOADCMD="$UPLOADER -u $UPLOAD_PORT -f $SOURCES")
-
-'''
-env.Replace(UPLOADCMD="pio\espupload.py -f $SOURCES") # Windows
-env.Replace(UPLOADCMD="pio/espupload.py -f $SOURCES") # Linux
-'''
\ No newline at end of file
diff --git a/platformio.ini b/platformio.ini
index 723412128..6b9459388 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -40,6 +40,7 @@ default_envs =
; tasmota-NL
; tasmota-PL
; tasmota-PT
+; tasmota-RO
; tasmota-RU
; tasmota-SE
; tasmota-SK
@@ -89,18 +90,26 @@ extra_scripts = pio/strip-floats.py
build_flags = -D NDEBUG
-mtarget-align
-Wl,-Map,firmware.map
+; new mechanism to set the IRremoteESP8266 supported protocols: none except HASH, NEC, RC5, RC6
+ -D_IR_ENABLE_DEFAULT_=false
+ -DDECODE_HASH=true -DDECODE_NEC=true -DSEND_NEC=true
+ -DDECODE_RC5=true -DSEND_RC5=true -DDECODE_RC6=true -DSEND_RC6=true
+
+[irremoteesp8266_full]
+build_flags = -DUSE_IR_REMOTE_FULL
+ -U_IR_ENABLE_DEFAULT_
+ -DDECODE_PRONTO=false -DSEND_PRONTO=false
[core_active]
-platform = ${core_2_6_1.platform}
-platform_packages = ${core_2_6_1.platform_packages}
-build_flags = ${core_2_6_1.build_flags}
+platform = ${tasmota_core_stage.platform}
+platform_packages = ${tasmota_core_stage.platform_packages}
+build_flags = ${tasmota_core_stage.build_flags}
-[core_2_6_1]
-; *** Esp8266 core for Arduino version 2.6.1
-platform = espressif8266@2.3.0
-platform_packages =
+[tasmota_core_stage]
+; *** Esp8266 core for Arduino version stable beta
+platform = espressif8266@2.3.3
+platform_packages = framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git#372a3ec297dfe8501bed1ec4552244695b5e8ced
build_flags = ${esp82xx_defaults.build_flags}
- -Wl,-Teagle.flash.1m.ld
-DBEARSSL_SSL_BASIC
; NONOSDK22x_190703 = 2.2.2-dev(38a443e)
-DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703
diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini
index 75b089893..fd5c86fdc 100644
--- a/platformio_override_sample.ini
+++ b/platformio_override_sample.ini
@@ -54,8 +54,8 @@ build_flags = ${core_active.build_flags}
upload_port = COM5
extra_scripts = ${scripts_defaults.extra_scripts}
-; pio/gzip-firmware.py
-; pio/obj-dump.py
+ pio/gzip-firmware.py
+ pio/obj-dump.py
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
@@ -180,7 +180,7 @@ build_flags = ${esp82xx_defaults.build_flags}
[tasmota_core_stage]
; *** Esp8266 core for Arduino version stable beta
platform = espressif8266@2.3.3
-platform_packages = framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git#abdd2bdbb6a5caf31807d82ebd7b447947a9c360
+platform_packages = framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git#372a3ec297dfe8501bed1ec4552244695b5e8ced
build_flags = ${esp82xx_defaults.build_flags}
-DBEARSSL_SSL_BASIC
; NONOSDK221
diff --git a/platformio_tasmota_env.ini b/platformio_tasmota_env.ini
index d22dfcfed..a09f01ecd 100644
--- a/platformio_tasmota_env.ini
+++ b/platformio_tasmota_env.ini
@@ -32,10 +32,10 @@ build_flags = ${common.build_flags} -DFIRMWARE_SENSORS
build_flags = ${common.build_flags} -DFIRMWARE_DISPLAYS
[env:tasmota-ir]
-build_flags = ${common.build_flags} -DUSE_IR_REMOTE_FULL -DFIRMWARE_IR
+build_flags = ${common.build_flags} ${irremoteesp8266_full.build_flags} -DFIRMWARE_IR
[env:tasmota-ircustom]
-build_flags = ${common.build_flags} -DUSE_IR_REMOTE_FULL
+build_flags = ${common.build_flags} ${irremoteesp8266_full.build_flags}
[env:tasmota-BG]
build_flags = ${common.build_flags} -DMY_LANGUAGE=bg-BG
@@ -82,6 +82,9 @@ build_flags = ${common.build_flags} -DMY_LANGUAGE=pl-PL
[env:tasmota-PT]
build_flags = ${common.build_flags} -DMY_LANGUAGE=pt-PT
+[env:tasmota-RO]
+build_flags = ${common.build_flags} -DMY_LANGUAGE=ro-RO
+
[env:tasmota-RU]
build_flags = ${common.build_flags} -DMY_LANGUAGE=ru-RU
@@ -98,4 +101,4 @@ build_flags = ${common.build_flags} -DMY_LANGUAGE=tr-TR
build_flags = ${common.build_flags} -DMY_LANGUAGE=zh-TW
[env:tasmota-UK]
-build_flags = ${common.build_flags} -DMY_LANGUAGE=uk-UK
+build_flags = ${common.build_flags} -DMY_LANGUAGE=uk-UA
diff --git a/tasmota/CHANGELOG.md b/tasmota/CHANGELOG.md
index 92d7a0240..02c344b58 100644
--- a/tasmota/CHANGELOG.md
+++ b/tasmota/CHANGELOG.md
@@ -2,6 +2,129 @@
## Released
+### 8.2.0 20200321
+
+- Release
+
+### 8.1.0.11 20200313
+
+- Change Zigbee simplification of devices probing, saving Flash and memory
+- Add HAss Discovery support for Button and Switch triggers by Federico Leoni (#7901)
+- Add support for HDC1080 Temperature and Humidity sensor by Luis Teixeira (#7888)
+- Add commands ``SwitchMode 13`` PushOn and ``SwitchMode 14`` PushOnInverted (#7912)
+- Add command ``HumOffset -10.0 .. 10.0`` to set global humidity sensor offset (#7934)
+- Add Zigbee support for Hue emulation by Stefan Hadinger
+- Add Dew Point to Temperature and Humidity sensors
+- Add support for ElectriQ iQ-wifiMOODL RGBW light by Ian King (#7947)
+
+### 8.1.0.10 20200227
+
+- Change default my_user_config.h driver and sensor support removing most sensors and adding most drivers
+- Change IRremoteESP8266 library updated to v2.7.4
+- Revert switchmode 6 according to issue 7778 (#7831)
+- Add support for Jarolift rollers by Keeloq algorithm
+- Add Zigbee features and improvements and remove support for Zigbee commands starting with ``Zigbee...``
+- Add support for MaxBotix HRXL-MaxSonar ultrasonic range finders by Jon Little (#7814)
+- Add support for Romanian language translations by Augustin Marti
+- Add support for La Crosse TX23 Anemometer by Norbert Richter (#3146, #7765)
+- Add command ``SetOption89 0/1`` for Zigbee distinct MQTT topics per device for SENSOR, allowing retained messages (#7835)
+- Change Hue emulation code optimization
+
+### 8.1.0.9 20200220
+
+- Revert most wifi connectivity changes introduced in 8.1.0.5 (#7746, #7602, #7621)
+- Fix Zigbee auto-increment transaction number (#7757)
+- Add initial support for Sensors AHT10 and AHT15 by Martin Wagner (#7596)
+- Add support for Wemos Motor Shield V1 by Denis Sborets (#7764)
+- Add Zigbee enhanced commands decoding, added ``ZbPing``
+- Add commands ``SetOption85 0/1`` and ``DevGroupShare`` supporting UDP Group command using ``GroupTopic`` without MQTT by Paul Diem (#7790)
+- Add support for Martin Jerry/acenx/Tessan/NTONPOWER SD0x PWM dimmer switches by Paul Diem (#7791)
+- Add command ``SetOption86 0/1`` for PWM dimmer to turn brightness LED's off 5 seconds after last change
+- Add command ``SetOption87 0/1`` for PWM dimmer to turn red LED on when powered off
+- Add command ``SetOption88 0/1`` for PWM dimmer to let buttons control remote devices
+
+### 8.1.0.8 20200212
+
+- Change MQTT message size with additional 200 characters
+- Change some wifi code to attempt faster connection (#7621)
+- Change display of some date and time messages from "Wed Feb 19 10:45:12 2020" to "2020-02-19T10:45:12"
+- Fix relation between RSSI and signal strength
+- Add another new DHT driver based on ESPEasy. The old driver can still be used using define USE_DHT_OLD. The previous new driver can be used with define USE_DHT_V2 (#7717)
+
+### 8.1.0.7 20200210
+
+- Add new DHT driver. The old driver can still be used using define USE_DHT_OLD (#7468)
+- Fix wrong encoding of Zigbee persistent data
+
+### 8.1.0.6 20200205
+
+- Fix Hass sensor discovery part 1/4 by Federico Leoni (#7582, #7548)
+- Fix MaxPower functionality (#7647)
+- Add support for sensors DS18x20 and DHT family on Shelly 1 and Shelly 1PM using Shelly Add-On adapter (#7469)
+- Add commands ``SwitchMode 11`` PushHoldMulti and ``SwitchMode 12`` PushHoldInverted (#7603)
+- Add command ``Buzzer -1`` for infinite mode and command ``Buzzer -2`` for following led mode (#7623)
+- Add support for MI-BLE sensors using HM-10 Bluetooth 4.0 module by Christian Staars (#7683)
+- Add BootCount Reset Time as BCResetTime to ``Status 1``
+- Add ``ZbZNPReceived``and ``ZbZCLReceived`` being published to MQTT when ``SetOption66 1``
+- Add optional Wifi AccessPoint passphrase define WIFI_AP_PASSPHRASE in my_user_config.h (#7690)
+- Add support for FiF LE-01MR energy meter by saper-2 (#7584)
+
+### 8.1.0.5 20200126
+
+- Change wifi connectivity stability (#7602)
+- Change IRremoteESP8266 library updated to v2.7.3
+- Fix PWM flickering at low levels (#7415)
+- Add ``SetOption84 0/1`` sends AWS IoT device shadow updates (alternative to retained)
+- Add ``ZbBind`` (experimental) and bug fixes
+
+### 8.1.0.4 20200116
+
+- Change Zigbee command prefix from ``Zigbee*`` to ``Zb*``
+- Fix ``PowerDelta`` zero power detection (#7515)
+- Fix OTA minimal gzipped detection regression from 8.1.0.3
+- Fix ``RGBWWTable`` ignored (#7572)
+- Add web page sliders when ``SetOption37 128`` is active allowing control of white(s)
+- Add Zigbee persistence and friendly names
+- Add most SetOptions as defines to my_user_config.h
+- Add SoftwareSerial to CSE7766 driver allowing different GPIOs (#7563)
+- Add optional parameter ```` to command ``Scheme , `` to control initial start color
+- Add rule trigger on one level deeper using syntax with two ``#`` like ``on zigbeereceived#vibration_sensor#aqaracubeside=0 do ...``
+
+### 8.1.0.3 20200106
+
+- Change commands ``Prefix``, ``Ssid``, ``StateText``, ``NTPServer``, and ``FriendlyName`` displaying all items
+- Change IRremoteESP8266 library updated to v2.7.2
+- Fix ``WakeUp `` ignores provided value (#7473)
+- Fix exception 9 restart on log message in Ticker interrupt service routines NTP, Wemos and Hue emulation (#7496)
+- Add support for gzipped binaries
+- Add ``SwitchMode 8`` ToggleMulti, ``SwitchMode 9`` FollowMulti and ``SwitchMode 10`` FollowMultiInverted (#7522)
+
+### 8.1.0.2 20191230
+
+- Fix LCD line and column positioning (#7387)
+- Fix Display handling of hexadecimal escape characters (#7387)
+- Fix Improved fade linearity with gamma correction
+- Fix wrong gamma correction for Module 48 lights (PWM5 for CT)
+- Add support for ``AdcParam`` parameters to control ADC0 Current Transformer Apparent Power formula by Jodi Dillon (#7100)
+- Add optional support for Prometheus using file xsns_91_prometheus.ino (#7216)
+- Add command ``ShutterButton `` to control shutter(s) by to-scho (#7403)
+- Add command ``SetOption82 0/1`` to limit the CT range for Alexa to 200..380
+- Add experimental support for NRF24L01 as BLE-bridge for Mijia Bluetooth sensors by Christian Baars (#7394)
+- Add support to BMP driver to enter reset state (sleep enable) when deep sleep is used in Tasmota
+
+### 8.1.0.1 20191225
+
+- Change Lights: simplified gamma correction and 10 bits internal computation
+- Fix Sonoff Bridge, Sc, L1, iFan03 and CSE7766 serial interface to forced speed, config and disable logging
+- Fix Serial initialization regression from previous fix
+- Fix commands ``Display`` and ``Counter`` from overruling command processing (#7322)
+- Fix ``White`` added to light status (#7142)
+- Add command ``SetOption79 0/1`` to enable reset of counters at teleperiod time by Andre Thomas (#7355)
+- Add SerialConfig to ``Status 1``
+- Add WifiPower to ``Status 5``
+- Add support for DS1624, DS1621 Temperature sensor by Leonid Myravjev
+- Add Zigbee attribute decoder for Xiaomi Aqara Cube
+
### 8.1.0 20191225
- Release
diff --git a/tasmota/core_esp8266_waveform.cpp b/tasmota/core_esp8266_waveform.cpp
new file mode 100644
index 000000000..0e4beeef2
--- /dev/null
+++ b/tasmota/core_esp8266_waveform.cpp
@@ -0,0 +1,330 @@
+/*
+ esp8266_waveform - General purpose waveform generation and control,
+ supporting outputs on all pins in parallel.
+
+ Copyright (c) 2018 Earle F. Philhower, III. All rights reserved.
+
+ The core idea is to have a programmable waveform generator with a unique
+ high and low period (defined in microseconds). TIMER1 is set to 1-shot
+ mode and is always loaded with the time until the next edge of any live
+ waveforms.
+
+ Up to one waveform generator per pin supported.
+
+ Each waveform generator is synchronized to the ESP cycle counter, not the
+ timer. This allows for removing interrupt jitter and delay as the counter
+ always increments once per 80MHz clock. Changes to a waveform are
+ contiguous and only take effect on the next waveform transition,
+ allowing for smooth transitions.
+
+ This replaces older tone(), analogWrite(), and the Servo classes.
+
+ Everywhere in the code where "cycles" is used, it means ESP.getCycleTime()
+ cycles, not TIMER1 cycles (which may be 2 CPU clocks @ 160MHz).
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include
+#if defined(ARDUINO_ESP8266_RELEASE_2_6_1) || defined(ARDUINO_ESP8266_RELEASE_2_6_2) || defined(ARDUINO_ESP8266_RELEASE_2_6_3) || !defined(ARDUINO_ESP8266_RELEASE)
+#warning **** Tasmota is using a patched PWM Arduino version as planned ****
+
+
+#include
+#include "ets_sys.h"
+#include "core_esp8266_waveform.h"
+
+extern "C" {
+
+// Maximum delay between IRQs
+#define MAXIRQUS (10000)
+
+// Set/clear GPIO 0-15 by bitmask
+#define SetGPIO(a) do { GPOS = a; } while (0)
+#define ClearGPIO(a) do { GPOC = a; } while (0)
+
+// Waveform generator can create tones, PWM, and servos
+typedef struct {
+ uint32_t nextServiceCycle; // ESP cycle timer when a transition required
+ uint32_t expiryCycle; // For time-limited waveform, the cycle when this waveform must stop
+ uint32_t nextTimeHighCycles; // Copy over low->high to keep smooth waveform
+ uint32_t nextTimeLowCycles; // Copy over high->low to keep smooth waveform
+} Waveform;
+
+static Waveform waveform[17]; // State of all possible pins
+static volatile uint32_t waveformState = 0; // Is the pin high or low, updated in NMI so no access outside the NMI code
+static volatile uint32_t waveformEnabled = 0; // Is it actively running, updated in NMI so no access outside the NMI code
+
+// Enable lock-free by only allowing updates to waveformState and waveformEnabled from IRQ service routine
+static volatile uint32_t waveformToEnable = 0; // Message to the NMI handler to start a waveform on a inactive pin
+static volatile uint32_t waveformToDisable = 0; // Message to the NMI handler to disable a pin from waveform generation
+
+static uint32_t (*timer1CB)() = NULL;
+
+
+// Non-speed critical bits
+#pragma GCC optimize ("Os")
+
+static inline ICACHE_RAM_ATTR uint32_t GetCycleCount() {
+ uint32_t ccount;
+ __asm__ __volatile__("esync; rsr %0,ccount":"=a"(ccount));
+ return ccount;
+}
+
+// Interrupt on/off control
+static ICACHE_RAM_ATTR void timer1Interrupt();
+static bool timerRunning = false;
+
+static void initTimer() {
+ timer1_disable();
+ ETS_FRC_TIMER1_INTR_ATTACH(NULL, NULL);
+ ETS_FRC_TIMER1_NMI_INTR_ATTACH(timer1Interrupt);
+ timer1_enable(TIM_DIV1, TIM_EDGE, TIM_SINGLE);
+ timerRunning = true;
+}
+
+static void ICACHE_RAM_ATTR deinitTimer() {
+ ETS_FRC_TIMER1_NMI_INTR_ATTACH(NULL);
+ timer1_disable();
+ timer1_isr_init();
+ timerRunning = false;
+}
+
+// Set a callback. Pass in NULL to stop it
+void setTimer1Callback(uint32_t (*fn)()) {
+ timer1CB = fn;
+ if (!timerRunning && fn) {
+ initTimer();
+ timer1_write(microsecondsToClockCycles(1)); // Cause an interrupt post-haste
+ } else if (timerRunning && !fn && !waveformEnabled) {
+ deinitTimer();
+ }
+}
+
+// Start up a waveform on a pin, or change the current one. Will change to the new
+// waveform smoothly on next low->high transition. For immediate change, stopWaveform()
+// first, then it will immediately begin.
+int startWaveform(uint8_t pin, uint32_t timeHighUS, uint32_t timeLowUS, uint32_t runTimeUS) {
+ if ((pin > 16) || isFlashInterfacePin(pin)) {
+ return false;
+ }
+ Waveform *wave = &waveform[pin];
+ // Adjust to shave off some of the IRQ time, approximately
+ wave->nextTimeHighCycles = microsecondsToClockCycles(timeHighUS);
+ wave->nextTimeLowCycles = microsecondsToClockCycles(timeLowUS);
+ wave->expiryCycle = runTimeUS ? GetCycleCount() + microsecondsToClockCycles(runTimeUS) : 0;
+ if (runTimeUS && !wave->expiryCycle) {
+ wave->expiryCycle = 1; // expiryCycle==0 means no timeout, so avoid setting it
+ }
+
+ uint32_t mask = 1<nextServiceCycle = GetCycleCount() + microsecondsToClockCycles(1);
+ waveformToEnable |= mask;
+ if (!timerRunning) {
+ initTimer();
+ timer1_write(microsecondsToClockCycles(10));
+ } else {
+ // Ensure timely service....
+ if (T1L > microsecondsToClockCycles(10)) {
+ timer1_write(microsecondsToClockCycles(10));
+ }
+ }
+ while (waveformToEnable) {
+ delay(0); // Wait for waveform to update
+ }
+ }
+
+ return true;
+}
+
+// Speed critical bits
+#pragma GCC optimize ("O2")
+// Normally would not want two copies like this, but due to different
+// optimization levels the inline attribute gets lost if we try the
+// other version.
+
+static inline ICACHE_RAM_ATTR uint32_t GetCycleCountIRQ() {
+ uint32_t ccount;
+ __asm__ __volatile__("rsr %0,ccount":"=a"(ccount));
+ return ccount;
+}
+
+static inline ICACHE_RAM_ATTR uint32_t min_u32(uint32_t a, uint32_t b) {
+ if (a < b) {
+ return a;
+ }
+ return b;
+}
+
+static inline ICACHE_RAM_ATTR int32_t max_32(int32_t a, int32_t b) {
+ if (a < b) {
+ return b;
+ }
+ return a;
+}
+
+// Stops a waveform on a pin
+int ICACHE_RAM_ATTR stopWaveform(uint8_t pin) {
+ // Can't possibly need to stop anything if there is no timer active
+ if (!timerRunning) {
+ return false;
+ }
+ // If user sends in a pin >16 but <32, this will always point to a 0 bit
+ // If they send >=32, then the shift will result in 0 and it will also return false
+ uint32_t mask = 1< microsecondsToClockCycles(10)) {
+ timer1_write(microsecondsToClockCycles(10));
+ }
+ while (waveformToDisable) {
+ /* no-op */ // Can't delay() since stopWaveform may be called from an IRQ
+ }
+ if (!waveformEnabled && !timer1CB) {
+ deinitTimer();
+ }
+ return true;
+}
+
+// The SDK and hardware take some time to actually get to our NMI code, so
+// decrement the next IRQ's timer value by a bit so we can actually catch the
+// real CPU cycle counter we want for the waveforms.
+#if F_CPU == 80000000
+ #define DELTAIRQ (microsecondsToClockCycles(3))
+#else
+ #define DELTAIRQ (microsecondsToClockCycles(2))
+#endif
+
+
+static ICACHE_RAM_ATTR void timer1Interrupt() {
+ // Optimize the NMI inner loop by keeping track of the min and max GPIO that we
+ // are generating. In the common case (1 PWM) these may be the same pin and
+ // we can avoid looking at the other pins.
+ static int startPin = 0;
+ static int endPin = 0;
+
+ uint32_t nextEventCycles = microsecondsToClockCycles(MAXIRQUS);
+ uint32_t timeoutCycle = GetCycleCountIRQ() + microsecondsToClockCycles(14);
+
+ if (waveformToEnable || waveformToDisable) {
+ // Handle enable/disable requests from main app.
+ waveformEnabled = (waveformEnabled & ~waveformToDisable) | waveformToEnable; // Set the requested waveforms on/off
+ waveformState &= ~waveformToEnable; // And clear the state of any just started
+ waveformToEnable = 0;
+ waveformToDisable = 0;
+ // Find the first GPIO being generated by checking GCC's find-first-set (returns 1 + the bit of the first 1 in an int32_t)
+ startPin = __builtin_ffs(waveformEnabled) - 1;
+ // Find the last bit by subtracting off GCC's count-leading-zeros (no offset in this one)
+ endPin = 32 - __builtin_clz(waveformEnabled);
+ }
+
+ bool done = false;
+ if (waveformEnabled) {
+ do {
+ nextEventCycles = microsecondsToClockCycles(MAXIRQUS);
+ for (int i = startPin; i <= endPin; i++) {
+ uint32_t mask = 1<expiryCycle) {
+ int32_t expiryToGo = wave->expiryCycle - now;
+ if (expiryToGo < 0) {
+ // Done, remove!
+ waveformEnabled &= ~mask;
+ if (i == 16) {
+ GP16O &= ~1;
+ } else {
+ ClearGPIO(mask);
+ }
+ continue;
+ }
+ }
+
+ // Check for toggles
+ int32_t cyclesToGo = wave->nextServiceCycle - now;
+ if (cyclesToGo < 0) {
+ // See #7057
+ // The following is a no-op unless we have overshot by an entire waveform cycle.
+ // As modulus is an expensive operation, this code is removed for now:
+ // cyclesToGo = -((-cyclesToGo) % (wave->nextTimeHighCycles + wave->nextTimeLowCycles));
+ //
+ // Alternative version with lower CPU impact:
+ // while (-cyclesToGo > wave->nextTimeHighCycles + wave->nextTimeLowCycles) { cyclesToGo += wave->nextTimeHighCycles + wave->nextTimeLowCycles)};
+ waveformState ^= mask;
+ if (waveformState & mask) {
+ if (i == 16) {
+ GP16O |= 1; // GPIO16 write slow as it's RMW
+ } else {
+ SetGPIO(mask);
+ }
+ wave->nextServiceCycle += wave->nextTimeHighCycles;
+ nextEventCycles = min_u32(nextEventCycles, max_32(wave->nextTimeHighCycles + cyclesToGo, microsecondsToClockCycles(1)));
+ } else {
+ if (i == 16) {
+ GP16O &= ~1; // GPIO16 write slow as it's RMW
+ } else {
+ ClearGPIO(mask);
+ }
+ wave->nextServiceCycle += wave->nextTimeLowCycles;
+ nextEventCycles = min_u32(nextEventCycles, max_32(wave->nextTimeLowCycles + cyclesToGo, microsecondsToClockCycles(1)));
+ }
+ } else {
+ uint32_t deltaCycles = wave->nextServiceCycle - now;
+ nextEventCycles = min_u32(nextEventCycles, deltaCycles);
+ }
+ }
+
+ // Exit the loop if we've hit the fixed runtime limit or the next event is known to be after that timeout would occur
+ uint32_t now = GetCycleCountIRQ();
+ int32_t cycleDeltaNextEvent = timeoutCycle - (now + nextEventCycles);
+ int32_t cyclesLeftTimeout = timeoutCycle - now;
+ done = (cycleDeltaNextEvent < 0) || (cyclesLeftTimeout < 0);
+ } while (!done);
+ } // if (waveformEnabled)
+
+ if (timer1CB) {
+ nextEventCycles = min_u32(nextEventCycles, timer1CB());
+ }
+
+ if (nextEventCycles < microsecondsToClockCycles(10)) {
+ nextEventCycles = microsecondsToClockCycles(10);
+ }
+ nextEventCycles -= DELTAIRQ;
+
+ // Do it here instead of global function to save time and because we know it's edge-IRQ
+#if F_CPU == 160000000
+ T1L = nextEventCycles >> 1; // Already know we're in range by MAXIRQUS
+#else
+ T1L = nextEventCycles; // Already know we're in range by MAXIRQUS
+#endif
+ TEIE |= TEIE1; // Edge int enable
+}
+
+};
+
+#endif // ARDUINO_ESP8266_RELEASE
\ No newline at end of file
diff --git a/tasmota/i18n.h b/tasmota/i18n.h
index e726fdf5d..12f3164c6 100644
--- a/tasmota/i18n.h
+++ b/tasmota/i18n.h
@@ -1,7 +1,7 @@
/*
i18n.h - internationalization for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -52,6 +52,7 @@
#define D_JSON_CURRENT "Current" // As in Voltage and Current
#define D_JSON_DARKNESS "Darkness"
#define D_JSON_DATA "Data"
+#define D_JSON_DEWPOINT "DewPoint"
#define D_JSON_DISTANCE "Distance"
#define D_JSON_DNSSERVER "DNSServer"
#define D_JSON_DONE "Done"
@@ -59,6 +60,7 @@
#define D_JSON_ECO2 "eCO2"
#define D_JSON_EMPTY "Empty"
#define D_JSON_ENDDST "EndDST" // End Daylight Savings Time
+#define D_JSON_ENERGY "Energy"
#define D_JSON_ERASE "Erase"
#define D_JSON_ERROR "Error"
#define D_JSON_EVERY "Every"
@@ -113,6 +115,7 @@
#define D_JSON_ACTIVE_POWERUSAGE "ActivePower"
#define D_JSON_APPARENT_POWERUSAGE "ApparentPower"
#define D_JSON_REACTIVE_POWERUSAGE "ReactivePower"
+#define D_JSON_RANGE "Range"
#define D_JSON_PRESSURE "Pressure"
#define D_JSON_PRESSUREATSEALEVEL "SeaPressure"
#define D_JSON_PRESSURE_UNIT "PressureUnit"
@@ -137,6 +140,8 @@
#define D_JSON_SERIALRECEIVED "SerialReceived"
#define D_JSON_SET "Set"
#define D_JSON_SIGNAL "Signal"
+#define D_JSON_SPEED "Speed"
+#define D_JSON_SPEED_UNIT "SpeedUnit"
#define D_JSON_SSID "SSId"
#define D_JSON_STARTDST "StartDST" // Start Daylight Savings Time
#define D_JSON_STARTED "Started"
@@ -182,6 +187,7 @@
#define D_JSON_SOLAR_POWER "SolarPower"
#define D_JSON_USAGE "Usage"
#define D_JSON_EXPORT "Export"
+#define D_JSON_TOTAL_ACTIVE "TotalActive"
#define D_RSLT_ENERGY "ENERGY"
#define D_RSLT_HASS_STATE "HASS_STATE"
@@ -284,8 +290,10 @@
#define D_CMND_LEDSTATE "LedState"
#define D_CMND_LEDMASK "LedMask"
#define D_CMND_WIFIPOWER "WifiPower"
+#define D_CMND_SPEEDUNIT "SpeedUnit"
#define D_CMND_I2CSCAN "I2CScan"
#define D_CMND_I2CDRIVER "I2CDriver"
+#define D_CMND_DEVGROUP_SHARE "DevGroupShare"
#define D_CMND_SERIALSEND "SerialSend"
#define D_CMND_SERIALDELIMITER "SerialDelimiter"
#define D_CMND_BAUDRATE "Baudrate"
@@ -296,6 +304,7 @@
#define D_JSON_FLAG "FLAG"
#define D_JSON_BASE "BASE"
#define D_CMND_TEMPOFFSET "TempOffset"
+#define D_CMND_HUMOFFSET "HumOffset"
// Commands xdrv_01_mqtt.ino
#define D_CMND_MQTTLOG "MqttLog"
@@ -465,26 +474,46 @@
#define D_JSON_TUYA_MCU_RECEIVED "TuyaReceived"
// Commands xdrv_23_zigbee.ino
+#define D_PRFX_ZB "Zb"
#define D_ZIGBEE_NOT_STARTED "Zigbee not started (yet)"
-#define D_CMND_ZIGBEE_PERMITJOIN "ZigbeePermitJoin"
-#define D_CMND_ZIGBEE_STATUS "ZigbeeStatus"
-#define D_CMND_ZIGBEE_RESET "ZigbeeReset"
+#define D_CMND_ZIGBEE_PERMITJOIN "PermitJoin"
+#define D_CMND_ZIGBEE_STATUS "Status"
+#define D_CMND_ZIGBEE_RESET "Reset"
#define D_JSON_ZIGBEE_CC2530 "CC2530"
-#define D_CMND_ZIGBEEZNPRECEIVE "ZigbeeZNPReceive" // only for debug
-#define D_CMND_ZIGBEEZNPSEND "ZigbeeZNPSend"
- #define D_JSON_ZIGBEE_STATE "ZigbeeState"
- #define D_JSON_ZIGBEEZNPRECEIVED "ZigbeeZNPReceived"
- #define D_JSON_ZIGBEEZNPSENT "ZigbeeZNPSent"
- #define D_JSON_ZIGBEEZCL_RECEIVED "ZigbeeZCLReceived"
- #define D_JSON_ZIGBEEZCL_RAW_RECEIVED "ZigbeeZCLRawReceived"
+#define D_CMND_ZIGBEEZNPRECEIVE "ZNPReceive" // only for debug
+#define D_CMND_ZIGBEEZNPSEND "ZNPSend"
+ #define D_JSON_ZIGBEE_STATE "ZbState"
+ #define D_JSON_ZIGBEEZNPRECEIVED "ZbZNPReceived"
+ #define D_JSON_ZIGBEEZNPSENT "ZbZNPSent"
+ #define D_JSON_ZIGBEEZCL_RECEIVED "ZbZCLReceived"
+ #define D_JSON_ZIGBEEZCL_RAW_RECEIVED "ZbZCLRawReceived"
#define D_JSON_ZIGBEE_DEVICE "Device"
#define D_JSON_ZIGBEE_NAME "Name"
-#define D_CMND_ZIGBEE_PROBE "ZigbeeProbe"
-#define D_CMND_ZIGBEE_RECEIVED "ZigbeeReceived"
+ #define D_JSON_ZIGBEE_CONFIRM "ZbConfirm"
+#define D_CMND_ZIGBEE_NAME "Name"
+#define D_CMND_ZIGBEE_MODELID "ModelId"
+ #define D_JSON_ZIGBEE_MODELID "ModelId"
+#define D_CMND_ZIGBEE_PROBE "Probe"
+#define D_CMND_ZIGBEE_FORGET "Forget"
+#define D_CMND_ZIGBEE_SAVE "Save"
#define D_CMND_ZIGBEE_LINKQUALITY "LinkQuality"
-#define D_CMND_ZIGBEE_READ "ZigbeeRead"
-#define D_CMND_ZIGBEE_SEND "ZigbeeSend"
- #define D_JSON_ZIGBEE_ZCL_SENT "ZigbeeZCLSent"
+ #define D_CMND_ZIGBEE_ENDPOINT "Endpoint"
+ #define D_CMND_ZIGBEE_GROUP "Group"
+#define D_CMND_ZIGBEE_READ "Read"
+#define D_CMND_ZIGBEE_SEND "Send"
+ #define D_JSON_ZIGBEE_ZCL_SENT "ZbZCLSent"
+#define D_JSON_ZIGBEE_RECEIVED "ZbReceived"
+#define D_CMND_ZIGBEE_BIND "Bind"
+ #define D_JSON_ZIGBEE_BIND "ZbBind"
+#define D_CMND_ZIGBEE_PING "Ping"
+ #define D_JSON_ZIGBEE_PING "ZbPing"
+ #define D_JSON_ZIGBEE_IEEE "IEEEAddr"
+#define D_JSON_ZIGBEE_RESPONSE "ZbResponse"
+ #define D_JSON_ZIGBEE_CMD "Command"
+ #define D_JSON_ZIGBEE_STATUS "Status"
+ #define D_JSON_ZIGBEE_STATUS_MSG "StatusMessage"
+#define D_CMND_ZIGBEE_LIGHT "Light"
+ #define D_JSON_ZIGBEE_LIGHT "Light"
// Commands xdrv_25_A4988_Stepper.ino
#define D_CMND_MOTOR "MOTOR"
@@ -499,6 +528,10 @@
#define D_PRFX_SHUTTER "Shutter"
#define D_CMND_SHUTTER_OPEN "Open"
#define D_CMND_SHUTTER_CLOSE "Close"
+#define D_CMND_SHUTTER_UP "Up"
+#define D_CMND_SHUTTER_DOWN "Down"
+#define D_CMND_SHUTTER_TOGGLEUP "ToggleUp"
+#define D_CMND_SHUTTER_TOGGLEDOWN "ToggleDown"
#define D_CMND_SHUTTER_STOP "Stop"
#define D_CMND_SHUTTER_POSITION "Position"
#define D_CMND_SHUTTER_OPENTIME "OpenDuration"
@@ -510,6 +543,18 @@
#define D_CMND_SHUTTER_CLIBRATION "Calibration"
#define D_CMND_SHUTTER_MOTORDELAY "MotorDelay"
#define D_CMND_SHUTTER_FREQUENCY "Frequency"
+#define D_CMND_SHUTTER_BUTTON "Button"
+#define D_CMND_SHUTTER_LOCK "Lock"
+#define D_CMND_SHUTTER_ENABLEENDSTOPTIME "EnableEndStopTime"
+#define D_CMND_SHUTTER_INVERTWEBBUTTONS "InvertWebButtons"
+
+// Commands xdrv_32_hotplug.ino
+#define D_CMND_HOTPLUG "HotPlug"
+
+// Commands xdrv_34_pwm_dimmer.ino
+#ifdef USE_PWM_DIMMER
+#define D_CMND_BRI_PRESET "BriPreset"
+#endif
// Commands xsns_02_analog.ino
#define D_CMND_ADCPARAM "AdcParam"
@@ -587,10 +632,10 @@ const char S_JSON_DRIVER_INDEX_NVALUE[] PROGMEM = "{\"" D_CMND_DRIVE
const char S_JSON_DRIVER_INDEX_SVALUE[] PROGMEM = "{\"" D_CMND_DRIVER "%d\":\"%s\"}";
const char JSON_SNS_TEMP[] PROGMEM = ",\"%s\":{\"" D_JSON_TEMPERATURE "\":%s}";
-const char JSON_SNS_TEMPHUM[] PROGMEM = ",\"%s\":{\"" D_JSON_TEMPERATURE "\":%s,\"" D_JSON_HUMIDITY "\":%s}";
const char JSON_SNS_ILLUMINANCE[] PROGMEM = ",\"%s\":{\"" D_JSON_ILLUMINANCE "\":%d}";
const char JSON_SNS_MOISTURE[] PROGMEM = ",\"%s\":{\"" D_JSON_MOISTURE "\":%d}";
+const char JSON_SNS_RANGE[] PROGMEM = ",\"%s\":{\"" D_JSON_RANGE "\":%d}";
const char JSON_SNS_GNGPM[] PROGMEM = ",\"%s\":{\"" D_JSON_TOTAL_USAGE "\":%s,\"" D_JSON_FLOWRATE "\":%s}";
@@ -608,20 +653,37 @@ const char S_OFFLINE[] PROGMEM = D_OFFLINE;
// support.ino
static const char kMonthNames[] = D_MONTH3LIST;
+const char kSpeedUnit[] PROGMEM = "|m/s|km/h|kn|mph|ft/s|yd/s";
+const float kSpeedConversionFactor[] = {1, // none
+ 1, // m/s
+ 3.6, // km/h
+ 1.943844492, // kn
+ 2.236936292, // mph
+ 3.280839895, // ft/s
+ 1.093613298 // yd/s
+ };
+
// xdrv_02_webserver.ino
#ifdef USE_WEBSERVER
-const char HTTP_SNS_TEMP[] PROGMEM = "{s}%s " D_TEMPERATURE "{m}%s°%c{e}"; // {s} = , {m} = , {e} =
-const char HTTP_SNS_HUM[] PROGMEM = "{s}%s " D_HUMIDITY "{m}%s%%{e}"; // {s} = , {m} = , {e} =
-const char HTTP_SNS_PRESSURE[] PROGMEM = "{s}%s " D_PRESSURE "{m}%s %s{e}"; // {s} = , {m} = , {e} =
-const char HTTP_SNS_SEAPRESSURE[] PROGMEM = "{s}%s " D_PRESSUREATSEALEVEL "{m}%s %s{e}"; // {s} = , {m} = , {e} =
-const char HTTP_SNS_ANALOG[] PROGMEM = "{s}%s " D_ANALOG_INPUT "%d{m}%d{e}"; // {s} = , {m} = , {e} =
-const char HTTP_SNS_ILLUMINANCE[] PROGMEM = "{s}%s " D_ILLUMINANCE "{m}%d " D_UNIT_LUX "{e}"; // {s} = , {m} = , {e} =
-const char HTTP_SNS_CO2[] PROGMEM = "{s}%s " D_CO2 "{m}%d " D_UNIT_PARTS_PER_MILLION "{e}"; // {s} = , {m} = , {e} =
-const char HTTP_SNS_CO2EAVG[] PROGMEM = "{s}%s " D_ECO2 "{m}%d " D_UNIT_PARTS_PER_MILLION "{e}"; // {s} = , {m} = , {e} =
-const char HTTP_SNS_GALLONS[] PROGMEM = "{s}%s " D_TOTAL_USAGE "{m}%s " D_UNIT_GALLONS " {e}"; // {s} = , {m} = , {e} =
-const char HTTP_SNS_GPM[] PROGMEM = "{s}%s " D_FLOW_RATE "{m}%s " D_UNIT_GALLONS_PER_MIN" {e}"; // {s} = , {m} = , {e} =
-const char HTTP_SNS_MOISTURE[] PROGMEM = "{s}%s " D_MOISTURE "{m}%d %%{e}"; // {s} = , {m} = , {e} =
+// {s} = , {m} = , {e} =
+const char HTTP_SNS_TEMP[] PROGMEM = "{s}%s " D_TEMPERATURE "{m}%s°%c{e}";
+const char HTTP_SNS_HUM[] PROGMEM = "{s}%s " D_HUMIDITY "{m}%s%%{e}";
+const char HTTP_SNS_DEW[] PROGMEM = "{s}%s " D_DEWPOINT "{m}%s°%c{e}";
+const char HTTP_SNS_PRESSURE[] PROGMEM = "{s}%s " D_PRESSURE "{m}%s %s{e}";
+const char HTTP_SNS_SEAPRESSURE[] PROGMEM = "{s}%s " D_PRESSUREATSEALEVEL "{m}%s %s{e}";
+const char HTTP_SNS_ANALOG[] PROGMEM = "{s}%s " D_ANALOG_INPUT "%d{m}%d{e}";
+const char HTTP_SNS_ILLUMINANCE[] PROGMEM = "{s}%s " D_ILLUMINANCE "{m}%d " D_UNIT_LUX "{e}";
+const char HTTP_SNS_CO2[] PROGMEM = "{s}%s " D_CO2 "{m}%d " D_UNIT_PARTS_PER_MILLION "{e}";
+const char HTTP_SNS_CO2EAVG[] PROGMEM = "{s}%s " D_ECO2 "{m}%d " D_UNIT_PARTS_PER_MILLION "{e}";
+const char HTTP_SNS_GALLONS[] PROGMEM = "{s}%s " D_TOTAL_USAGE "{m}%s " D_UNIT_GALLONS " {e}";
+const char HTTP_SNS_GPM[] PROGMEM = "{s}%s " D_FLOW_RATE "{m}%s " D_UNIT_GALLONS_PER_MIN" {e}";
+const char HTTP_SNS_MOISTURE[] PROGMEM = "{s}%s " D_MOISTURE "{m}%d %%{e}";
+const char HTTP_SNS_RANGE[] PROGMEM = "{s}%s " D_RANGE "{m}%d{e}";
+const char HTTP_SNS_VOLTAGE[] PROGMEM = "{s}" D_VOLTAGE "{m}%s " D_UNIT_VOLT "{e}";
+const char HTTP_SNS_CURRENT[] PROGMEM = "{s}" D_CURRENT "{m}%s " D_UNIT_AMPERE "{e}";
+const char HTTP_SNS_POWER[] PROGMEM = "{s}" D_POWERUSAGE "{m}%s " D_UNIT_WATT "{e}";
+const char HTTP_SNS_ENERGY_TOTAL[] PROGMEM = "{s}" D_ENERGY_TOTAL "{m}%s " D_UNIT_KILOWATTHOUR "{e}";
const char S_MAIN_MENU[] PROGMEM = D_MAIN_MENU;
const char S_CONFIGURATION[] PROGMEM = D_CONFIGURATION;
diff --git a/tasmota/language/bg-BG.h b/tasmota/language/bg-BG.h
index f2ac56402..f7760f302 100644
--- a/tasmota/language/bg-BG.h
+++ b/tasmota/language/bg-BG.h
@@ -1,7 +1,7 @@
/*
bg-BG.h - localization for Bulgaria - Bulgarian for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -74,10 +74,12 @@
#define D_CORS_DOMAIN "CORS домейн"
#define D_COUNT "Брой"
#define D_COUNTER "Брояч"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Ток" // As in Voltage and Current
#define D_DATA "Данни"
#define D_DARKLIGHT "Тъмна"
#define D_DEBUG "Дебъгване"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Забранен"
#define D_DISTANCE "Разстояние"
#define D_DNS_SERVER "DNS Сървър"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Размер на програмата"
#define D_PROJECT "Проект"
#define D_RAIN "Дъжд"
+#define D_RANGE "Range"
#define D_RECEIVED "Получено"
#define D_RESTART "Рестарт"
#define D_RESTARTING "Рестартиране"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Посока на вятъра"
#define D_TX20_WIND_SPEED "Скорост на вятъра"
-#define D_TX20_WIND_SPEED_AVG "Средна скорост на вятъра"
+#define D_TX20_WIND_SPEED_MIN "Мини. скорост на вятъра"
#define D_TX20_WIND_SPEED_MAX "Макс. скорост на вятъра"
#define D_TX20_NORTH "С"
#define D_TX20_EAST "И"
#define D_TX20_SOUTH "Ю"
#define D_TX20_WEST "З"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "Потребит."
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Фазов ъгъл"
#define D_IMPORT_ACTIVE "Входна активна мощност"
#define D_EXPORT_ACTIVE "Изходна активна мощност"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Общо реактивна мощност"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "°"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "Напрежение на PV1"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Грешка - вентилатор"
#define D_SOLAX_ERROR_8 "Грешка - друго оборудване"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_BG_BG_H_
diff --git a/tasmota/language/cs-CZ.h b/tasmota/language/cs-CZ.h
index 272e2c5ca..72bb6c275 100644
--- a/tasmota/language/cs-CZ.h
+++ b/tasmota/language/cs-CZ.h
@@ -1,7 +1,7 @@
/*
cs-CZ.h - localization for Czech with diacritics - Czech for Tasmota
- Copyright (C) 2019 Vladimír Synek
+ Copyright (C) 2020 Vladimír Synek
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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Počítej"
#define D_COUNTER "Počítadlo"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Proud" // As in Voltage and Current
#define D_DATA "Data"
#define D_DARKLIGHT "Tmavý"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Zablokováno"
#define D_DISTANCE "Distance"
#define D_DNS_SERVER "Server DNS"
#define D_DONE "Provedeno"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulace"
#define D_ENABLED "Otevřený"
#define D_ERASE "Smaž"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Velikost programu"
#define D_PROJECT "Projekt"
#define D_RAIN "Rain"
+#define D_RANGE "Range"
#define D_RECEIVED "Přijatý"
#define D_RESTART "Restart"
#define D_RESTARTING "Restartování"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Směr větru"
#define D_TX20_WIND_SPEED "Rychlost větru"
-#define D_TX20_WIND_SPEED_AVG "Průměrná rychlost větru"
+#define D_TX20_WIND_SPEED_MIN "Minimální rychlost větru"
#define D_TX20_WIND_SPEED_MAX "Maximální rychlost větru"
#define D_TX20_NORTH "S"
#define D_TX20_EAST "V"
#define D_TX20_SOUTH "J"
#define D_TX20_WEST "Z"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -644,7 +675,7 @@
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Total Reactive"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_CS_CZ_H_
diff --git a/tasmota/language/de-DE.h b/tasmota/language/de-DE.h
index 89d36103d..12cb30769 100644
--- a/tasmota/language/de-DE.h
+++ b/tasmota/language/de-DE.h
@@ -1,7 +1,7 @@
/*
de-DE.h - localization for German - Germany for Tasmota
- Copyright (C) 2019 VinceMasuka
+ Copyright (C) 2020 VinceMasuka
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
@@ -28,7 +28,7 @@
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
* Use online command Prefix to translate cmnd, stat and tele.
*
- * Updated until v8.0.0
+ * Updated until v8.1.0.1
\*********************************************************************/
//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
@@ -66,7 +66,7 @@
#define D_BYTES "Bytes"
#define D_CELSIUS "Celsius"
#define D_CHANNEL "Kanal"
-#define D_CO2 "CO²"
+#define D_CO2 "CO₂"
#define D_CODE "code" // Button code
#define D_COLDLIGHT "kalt"
#define D_COMMAND "Befehl"
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "zählen"
#define D_COUNTER "Zähler"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Strom" // As in Voltage and Current
#define D_DATA "Daten"
#define D_DARKLIGHT "dunkel"
#define D_DEBUG "debug"
+#define D_DEWPOINT "Taupunkt"
#define D_DISABLED "deaktiviert"
#define D_DISTANCE "Abstand"
#define D_DNS_SERVER "DNS-Server"
#define D_DONE "erledigt"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulation"
#define D_ENABLED "aktiviert"
#define D_ERASE "löschen"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Ben. Flash Speicher"
#define D_PROJECT "Projekt"
#define D_RAIN "Regen"
+#define D_RANGE "Range"
#define D_RECEIVED "erhalten"
#define D_RESTART "Neustart"
#define D_RESTARTING "starte neu"
@@ -501,15 +504,35 @@
#define D_CALIBRATION "Kalibrierung"
//xsns_35_tx20.ino
-#define D_TX20_WIND_DIRECTION "Wind Richtung"
+#define D_TX20_WIND_DIRECTION "Windrichtung"
#define D_TX20_WIND_SPEED "Windgeschwindigkeit"
-#define D_TX20_WIND_SPEED_AVG "Ø Windgeschwindigkeit"
-#define D_TX20_WIND_SPEED_MAX "max Windgeschwindigkeit"
+#define D_TX20_WIND_SPEED_MIN "Windgeschwindigkeit Min"
+#define D_TX20_WIND_SPEED_MAX "Windgeschwindigkeit Max"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "O"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "W"
+// xsns_53_sml.ino
+#define D_TPWRIN "Verbrauch"
+#define D_TPWROUT "Einspeisung"
+#define D_TPWRCURR "Aktueller Verbrauch"
+#define D_TPWRCURR1 "Verbrauch P1"
+#define D_TPWRCURR2 "Verbrauch P2"
+#define D_TPWRCURR3 "Verbrauch P3"
+#define D_Strom_L1 "Strom L1"
+#define D_Strom_L2 "Strom L2"
+#define D_Strom_L3 "Strom L3"
+#define D_Spannung_L1 "Spannung L1"
+#define D_Spannung_L2 "Spannung L2"
+#define D_Spannung_L3 "Spannung L3"
+#define D_METERNR "Zähler Nr"
+#define D_METERSID "Service ID"
+#define D_GasIN "Zählerstand" // Gas-Verbrauch
+#define D_H2oIN "Zählerstand" // H2o-Verbrauch
+#define D_StL1L2L3 "Ströme L1+L2+L3"
+#define D_SpL1L2L3 "Spannung L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -647,7 +678,7 @@
#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m3"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
#define D_UNIT_MICROMETER "µm"
#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Phasenwinkel"
#define D_IMPORT_ACTIVE "Importiere Wirk"
#define D_EXPORT_ACTIVE "Exportiere Wirk"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Total Blind"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Grad"
+#define D_TOTAL_ACTIVE "Total Wirk"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Spannung"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Lüfterfehler"
#define D_SOLAX_ERROR_8 "sonstiger Fehler"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Skript konfigurieren"
+#define D_SCRIPT "Skript bearbeiten"
+#define D_SDCARD_UPLOAD "Datei speichern"
+#define D_SDCARD_DIR "SD Card Verzeichnis"
+#define D_UPL_DONE "Fertig"
+#define D_SCRIPT_CHARS_LEFT "Zeichen übrig"
+#define D_SCRIPT_CHARS_NO_MORE "kein Speicher mehr"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "Skript aktivieren"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload Dateien"
+
#endif // _LANGUAGE_DE_DE_H_
diff --git a/tasmota/language/el-GR.h b/tasmota/language/el-GR.h
index 2b1e4748c..8a8160956 100644
--- a/tasmota/language/el-GR.h
+++ b/tasmota/language/el-GR.h
@@ -1,7 +1,7 @@
/*
el-GR.h - localization for Greek - Greece for Tasmota
- Copyright (C) 2019 Theo Arends, translated by Nick Galfas
+ Copyright (C) 2020 Theo Arends, translated by Nick Galfas
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
@@ -74,16 +74,18 @@
#define D_COUNT "Μέτρηση"
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNTER "Μετρητής"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Ένταση" // As in Voltage and Current
#define D_DATA "Δεδομένα"
#define D_DARKLIGHT "Σκοτεινό"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Ανενεργό"
#define D_DISTANCE "Απόσταση"
#define D_DNS_SERVER "Διακομιστής DNS"
#define D_DONE "Ολοκληρώθηκε"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Εξομoίωση"
#define D_ENABLED "Ενεργό"
#define D_ERASE "Διαγραφή"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Μέγεθος προγράμματος"
#define D_PROJECT "Έργο"
#define D_RAIN "Rain"
+#define D_RANGE "Range"
#define D_RECEIVED "Ελήφθη"
#define D_RESTART "Επανεκκίνηση"
#define D_RESTARTING "Επανεκκινεί"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Κατεύθυνση ανέμου"
#define D_TX20_WIND_SPEED "Ταχύτητα ανέμου"
-#define D_TX20_WIND_SPEED_AVG "Μέση ταχύτητα ανέμου"
+#define D_TX20_WIND_SPEED_MIN "Ελάχιστη ταχύτητα ανέμου"
#define D_TX20_WIND_SPEED_MAX "Μέγιστη ταχύτητα ανέμου"
#define D_TX20_NORTH "Β"
#define D_TX20_EAST "Α"
#define D_TX20_SOUTH "Ν"
#define D_TX20_WEST "Δ"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,23 +656,31 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HERTZ "Hz"
-#define D_UNIT_HOUR "Hr"
+#define D_UNIT_HOUR "h"
#define D_UNIT_GALLONS "gal"
#define D_UNIT_GALLONS_PER_MIN "g/m"
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Total Reactive"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_EL_GR_H_
diff --git a/tasmota/language/en-GB.h b/tasmota/language/en-GB.h
index ab7f90cf8..09b43c1be 100644
--- a/tasmota/language/en-GB.h
+++ b/tasmota/language/en-GB.h
@@ -1,7 +1,7 @@
/*
en-GB.h - localization for English - United Kingdom for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Count"
#define D_COUNTER "Counter"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Current" // As in Voltage and Current
#define D_DATA "Data"
#define D_DARKLIGHT "Dark"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Disabled"
#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS Server"
#define D_DONE "Done"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulation"
#define D_ENABLED "Enabled"
#define D_ERASE "Erase"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Program Size"
#define D_PROJECT "Project"
#define D_RAIN "Rain"
+#define D_RANGE "Range"
#define D_RECEIVED "Received"
#define D_RESTART "Restart"
#define D_RESTARTING "Restarting"
@@ -477,7 +480,7 @@
// xsns_18_pms5003.ino
#define D_STANDARD_CONCENTRATION "CF-1 PM" // Standard Particle CF-1 Particle Matter
#define D_ENVIRONMENTAL_CONCENTRATION "PM" // Environmetal Particle Matter
-#define D_PARTICALS_BEYOND "Particals"
+#define D_PARTICALS_BEYOND "Particles"
// xsns_32_mpu6050.ino
#define D_AX_AXIS "Accel. X-Axis"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Wind Direction"
#define D_TX20_WIND_SPEED "Wind Speed"
-#define D_TX20_WIND_SPEED_AVG "Wind Speed Avg"
+#define D_TX20_WIND_SPEED_MIN "Wind Speed Min"
#define D_TX20_WIND_SPEED_MAX "Wind Speed Max"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "W"
+// xsns_53_sml.ino
+#define D_TPWRIN "Total-In"
+#define D_TPWROUT "Total-Out"
+#define D_TPWRCURR "Current-In/Out"
+#define D_TPWRCURR1 "Current-In p1"
+#define D_TPWRCURR2 "Current-In p2"
+#define D_TPWRCURR3 "Current-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter" // Gas-Verbrauch
+#define D_H2oIN "Counter" // H2o-Verbrauch
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,23 +656,31 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HERTZ "Hz"
-#define D_UNIT_HOUR "Hr"
+#define D_UNIT_HOUR "h"
#define D_UNIT_GALLONS "gal"
#define D_UNIT_GALLONS_PER_MIN "g/m"
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Total Reactive"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_EN_GB_H_
diff --git a/tasmota/language/es-ES.h b/tasmota/language/es-ES.h
index e41b4cb32..f70940a38 100644
--- a/tasmota/language/es-ES.h
+++ b/tasmota/language/es-ES.h
@@ -1,7 +1,7 @@
/*
es-ES.h - localization for Spanish - Spain for Tasmota
- Copyright (C) 2019 Adrian Scillato
+ Copyright (C) 2020 Adrian Scillato
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
@@ -28,7 +28,7 @@
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
* Use online command Prefix to translate cmnd, stat and tele.
*
- * Updated until v7.0.0.5
+ * Updated until v8.1.0.1
\*********************************************************************/
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
@@ -71,19 +71,21 @@
#define D_COLDLIGHT "Fría"
#define D_COMMAND "Comando"
#define D_CONNECTED "Conectado"
-#define D_CORS_DOMAIN "CORS Domain"
+#define D_CORS_DOMAIN "Sitio WEB para CORS"
#define D_COUNT "Conteo"
#define D_COUNTER "Contador"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Corriente" // As in Voltage and Current
#define D_DATA "Datos"
#define D_DARKLIGHT "Oscuro"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Deshabilitado"
#define D_DISTANCE "Distancia"
-#define D_DNS_SERVER "DNS Server"
+#define D_DNS_SERVER "Servidor DNS"
#define D_DONE "Listo"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulación"
#define D_ENABLED "Habilitado"
#define D_ERASE "Borrar"
@@ -113,7 +115,7 @@
#define D_LIGHT "Luz"
#define D_LWT "LWT"
#define D_MODULE "Módulo"
-#define D_MOISTURE "Moisture"
+#define D_MOISTURE "Humedad del Suelo"
#define D_MQTT "MQTT"
#define D_MULTI_PRESS "multi-press"
#define D_NOISE "Ruido"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Tamaño Programa"
#define D_PROJECT "Proyecto"
#define D_RAIN "Lluvia"
+#define D_RANGE "Range"
#define D_RECEIVED "Recibido"
#define D_RESTART "Reiniciar"
#define D_RESTARTING "Reiniciando"
@@ -503,16 +506,36 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Dirección del Viento"
#define D_TX20_WIND_SPEED "Vel. del Viento"
-#define D_TX20_WIND_SPEED_AVG "Vel. Prom. del Viento"
+#define D_TX20_WIND_SPEED_MIN "Vel. Min. del Viento"
#define D_TX20_WIND_SPEED_MAX "Vel. Max. del Viento"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "O"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energía Total-Entrada"
+#define D_TPWROUT "Energía Total-Salida"
+#define D_TPWRCURR "Potencia-En/Sal"
+#define D_TPWRCURR1 "Potencia-Entr p1"
+#define D_TPWRCURR2 "Potencia-Entr p2"
+#define D_TPWRCURR3 "Potencia-Entr p3"
+#define D_Strom_L1 "Corriente L1"
+#define D_Strom_L2 "Corriente L2"
+#define D_Strom_L3 "Corriente L3"
+#define D_Spannung_L1 "Voltaje L1"
+#define D_Spannung_L2 "Voltaje L2"
+#define D_Spannung_L3 "Voltaje L3"
+#define D_METERNR "Número de Medidor"
+#define D_METERSID "ID de Servicio"
+#define D_GasIN "Contador"
+#define D_H2oIN "Contador"
+#define D_StL1L2L3 "Corriente L1+L2+L3"
+#define D_SpL1L2L3 "Voltaje L1+L2+L3/3"
+
// tasmota_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_USER "User"
+#define D_SENSOR_USER "Por Usuario"
#define D_SENSOR_DHT11 "DHT11"
#define D_SENSOR_AM2301 "AM2301"
#define D_SENSOR_SI7021 "SI7021"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,23 +656,31 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HERTZ "Hz"
-#define D_UNIT_HOUR "Hr"
+#define D_UNIT_HOUR "h"
#define D_UNIT_GALLONS "gal"
#define D_UNIT_GALLONS_PER_MIN "g/m"
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Ángulo de Fase"
#define D_IMPORT_ACTIVE "P. Activa Entrante"
#define D_EXPORT_ACTIVE "P. Activa Saliente"
@@ -677,12 +708,13 @@
#define D_TOTAL_REACTIVE "P. Reactiva Total"
#define D_UNIT_KWARH "kVArH"
#define D_UNIT_ANGLE "Grados"
+#define D_TOTAL_ACTIVE "P. Total Activa"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltaje"
#define D_PV1_CURRENT "PV1 Corriente"
#define D_PV1_POWER "PV1 Potencia"
-#define D_PV2_VOLTAGE "PV2 Voltaee"
+#define D_PV2_VOLTAGE "PV2 Voltaje"
#define D_PV2_CURRENT "PV2 Corriente"
#define D_PV2_POWER "PV2 Potencia"
#define D_SOLAR_POWER "Potencia Solar"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Falla de Ventilador"
#define D_SOLAX_ERROR_8 "Falla del Dispositivo"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Editar Script"
+#define D_SCRIPT "Editar Script"
+#define D_SDCARD_UPLOAD "Subir Archivo"
+#define D_SDCARD_DIR "Directorio en Tarjeta SD"
+#define D_UPL_DONE "Listo"
+#define D_SCRIPT_CHARS_LEFT "Caracteres disponibles"
+#define D_SCRIPT_CHARS_NO_MORE "No hay mas espacio"
+#define D_SCRIPT_DOWNLOAD "Descargar"
+#define D_SCRIPT_ENABLE "Habilitar Script"
+#define D_SCRIPT_UPLOAD "Cargar"
+#define D_SCRIPT_UPLOAD_FILES "Cargar Archivos"
+
#endif // _LANGUAGE_ES_ES_H_
diff --git a/tasmota/language/fr-FR.h b/tasmota/language/fr-FR.h
index 840421ff3..488386aea 100644
--- a/tasmota/language/fr-FR.h
+++ b/tasmota/language/fr-FR.h
@@ -1,7 +1,7 @@
/*
fr-FR.h - localization for French - France for Tasmota
- Copyright (C) 2019 Olivier Francais
+ Copyright (C) 2020 Olivier Francais
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
@@ -28,7 +28,7 @@
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
* Use online command Prefix to translate cmnd, stat and tele.
*
- * Updated until v7.1.2.4
+ * Updated until v8.1.0.1
\*********************************************************************/
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "Domaine CORS"
#define D_COUNT "Compte"
#define D_COUNTER "Compteur"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Courant" // As in Voltage and Current
#define D_DATA "Donnée"
#define D_DARKLIGHT "Sombre"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Désactivé"
#define D_DISTANCE "Distance"
#define D_DNS_SERVER "Serveur DNS"
#define D_DONE "Fait"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Émulation"
#define D_ENABLED "Activé"
#define D_ERASE "Effacer"
@@ -113,7 +115,7 @@
#define D_LIGHT "Lumière"
#define D_LWT "LWT"
#define D_MODULE "Module"
-#define D_MOISTURE "Moisture"
+#define D_MOISTURE "Humidité"
#define D_MQTT "MQTT"
#define D_MULTI_PRESS "multi-pression"
#define D_NOISE "Bruit"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Taille programme"
#define D_PROJECT "Projet"
#define D_RAIN "Pluie"
+#define D_RANGE "Range"
#define D_RECEIVED "Reçu"
#define D_RESTART "Redémarrage"
#define D_RESTARTING "Redémarre"
@@ -354,7 +357,7 @@
#define D_UPLOAD_ERR_11 "Erreur d'effacement du chip RF"
#define D_UPLOAD_ERR_12 "Erreur d'accès en écriture au chip RF"
#define D_UPLOAD_ERR_13 "Erreur de décodage du firmware RF"
-#define D_UPLOAD_ERR_14 "Not compatible"
+#define D_UPLOAD_ERR_14 "Incompatible"
#define D_UPLOAD_ERROR_CODE "Code d'erreur téléchargement"
#define D_ENTER_COMMAND "Saisir une commande"
@@ -500,16 +503,36 @@
#define D_CALIBRATE "Étalonner"
#define D_CALIBRATION "Étalonnage"
-//xsns_35_tx20.ino
+//xsns_35_TX20.ino
#define D_TX20_WIND_DIRECTION "Direction du vent"
#define D_TX20_WIND_SPEED "Vitesse du vent"
-#define D_TX20_WIND_SPEED_AVG "Vitesse Moy."
+#define D_TX20_WIND_SPEED_MIN "Vitesse Min"
#define D_TX20_WIND_SPEED_MAX "Vitesse Max"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "O"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "Utilisateur"
@@ -521,7 +544,7 @@
#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_IRSEND "IR TX"
#define D_SENSOR_SWITCH "Inter." // Suffix "1"
#define D_SENSOR_BUTTON "Bouton" // Suffix "1"
#define D_SENSOR_RELAY "Relais" // Suffix "1i"
@@ -529,15 +552,15 @@
#define D_SENSOR_LED_LINK "LedLink" // Suffix "i"
#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_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_SPI_MISO "SPI MISO"
@@ -545,28 +568,28 @@
#define D_SENSOR_SPI_CLK "SPI CLK"
#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_HPMA_RX "HPMA Rx"
-#define D_SENSOR_HPMA_TX "HPMA Tx"
-#define D_SENSOR_SBR_RX "SerBr Rx"
-#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SDS0X1_RX "SDS0X1 RX"
+#define D_SENSOR_SDS0X1_TX "SDS0X1 TX"
+#define D_SENSOR_HPMA_RX "HPMA RX"
+#define D_SENSOR_HPMA_TX "HPMA TX"
+#define D_SENSOR_SBR_RX "SerBr RX"
+#define D_SENSOR_SBR_TX "SerBr TX"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
-#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_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_TX2X_TX "TX2x"
+#define D_SENSOR_RFSEND "RF TX"
+#define D_SENSOR_RFRECV "RF RX"
+#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"
@@ -575,8 +598,8 @@
#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_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"
@@ -584,13 +607,13 @@
#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_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_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"
@@ -598,18 +621,18 @@
#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI"
#define D_SENSOR_ARIRFRCV "ALux IrRcv"
#define D_SENSOR_ARIRFSEL "ALux IrSel"
-#define D_SENSOR_TXD "Serial Tx"
-#define D_SENSOR_RXD "Serial Rx"
+#define D_SENSOR_TXD "Série TX"
+#define D_SENSOR_RXD "Série RX"
#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
#define D_SENSOR_HRE_CLOCK "HRE Clock"
#define D_SENSOR_HRE_DATA "HRE Data"
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
#define D_SENSOR_BUZZER "Buzzer"
#define D_SENSOR_OLED_RESET "OLED Reset"
-#define D_SENSOR_ZIGBEE_TXD "Zigbee Tx"
-#define D_SENSOR_ZIGBEE_RXD "Zigbee Rx"
-#define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx"
-#define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx"
+#define D_SENSOR_ZIGBEE_TXD "Zigbee TX"
+#define D_SENSOR_ZIGBEE_RXD "Zigbee RX"
+#define D_SENSOR_SOLAXX1_TX "SolaxX1 TX"
+#define D_SENSOR_SOLAXX1_RX "SolaxX1 RX"
#define D_SENSOR_IBEACON_TX "iBeacon TX"
#define D_SENSOR_IBEACON_RX "iBeacon RX"
#define D_SENSOR_RDM6300_RX "RDM6300 RX"
@@ -620,19 +643,27 @@
#define D_SENSOR_A4988_MS1 "A4988 MS1"
#define D_SENSOR_A4988_MS2 "A4988 MS2"
#define D_SENSOR_A4988_MS3 "A4988 MS3"
-#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
-#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
-#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
-#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
+#define D_SENSOR_DDS2382_TX "DDS238-2 TX"
+#define D_SENSOR_DDS2382_RX "DDS238-2 RX"
+#define D_SENSOR_DDSU666_TX "DDSU666 TX"
+#define D_SENSOR_DDSU666_RX "DDSU666 RX"
#define D_SENSOR_SM2135_CLK "SM2135 Clk"
#define D_SENSOR_SM2135_DAT "SM2135 Dat"
-#define D_SENSOR_DEEPSLEEP "DeepSleep"
+#define D_SENSOR_DEEPSLEEP "Hibernation"
#define D_SENSOR_EXS_ENABLE "EXS Enable"
-#define D_SENSOR_SLAVE_TX "Slave TX"
-#define D_SENSOR_SLAVE_RX "Slave RX"
-#define D_SENSOR_SLAVE_RESET "Slave RST"
-#define D_SENSOR_GPS_RX "GPS RX"
+#define D_SENSOR_SLAVE_TX "Esclave TX"
+#define D_SENSOR_SLAVE_RX "Esclave RX"
+#define D_SENSOR_SLAVE_RESET "Esclave Rst"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_GPS_RX "GPS RX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -647,7 +678,7 @@
#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m3"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
#define D_UNIT_MICROMETER "µm"
#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Angle de phase"
#define D_IMPORT_ACTIVE "Énergie act conso"
#define D_EXPORT_ACTIVE "Énergie act fournie"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Énergie réa totale"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "°"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "Tension PV1"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Défaut Ventilateur"
#define D_SOLAX_ERROR_8 "Défaut Autre équipement"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_FR_FR_H_
diff --git a/tasmota/language/he-HE.h b/tasmota/language/he-HE.h
index 9e26a6c5e..70d474e8f 100644
--- a/tasmota/language/he-HE.h
+++ b/tasmota/language/he-HE.h
@@ -1,7 +1,7 @@
/*
he-HE.h - localization for Hebrew - Israel for Tasmota
- Copyright (C) 2019 Yuval Mejahez
+ Copyright (C) 2020 Yuval Mejahez
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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "סופר"
#define D_COUNTER "מונה"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "נוכחי" // As in Voltage and Current
#define D_DATA "נתונים"
#define D_DARKLIGHT "חושך"
#define D_DEBUG "באגים"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "מבוטל"
#define D_DISTANCE "מרחק"
#define D_DNS_SERVER "DNS שרת"
#define D_DONE "סיים"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "הדמיה"
#define D_ENABLED "מאופשר"
#define D_ERASE "מחיקה"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "גודל תוכנית"
#define D_PROJECT "פרויקט"
#define D_RAIN "גשם"
+#define D_RANGE "Range"
#define D_RECEIVED "התקבל"
#define D_RESTART "איתחול"
#define D_RESTARTING "הפעלה מחדש"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "כיוון הרוח"
#define D_TX20_WIND_SPEED "מהירות הרוח"
-#define D_TX20_WIND_SPEED_AVG "מהירות הרוח ממוצעת"
+#define D_TX20_WIND_SPEED_MIN "מהירות הרוח היא מינימלית"
#define D_TX20_WIND_SPEED_MAX "מהירות הרוח מקסימלית"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "W"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "משתמש"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,23 +656,31 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HERTZ "Hz"
-#define D_UNIT_HOUR "Hr"
+#define D_UNIT_HOUR "h"
#define D_UNIT_GALLONS "gal"
#define D_UNIT_GALLONS_PER_MIN "g/m"
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Total Reactive"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_HE_HE_H_
diff --git a/tasmota/language/hu-HU.h b/tasmota/language/hu-HU.h
index b7f33a549..cc47f6a5d 100644
--- a/tasmota/language/hu-HU.h
+++ b/tasmota/language/hu-HU.h
@@ -1,7 +1,7 @@
/*
hu-HU.h - localization for Hungarian in Hungary for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Szám"
#define D_COUNTER "Számláló"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Áramerősség" // As in Voltage and Current
#define D_DATA "Adat"
#define D_DARKLIGHT "Min. fényerő"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Letiltva"
#define D_DISTANCE "Távolság"
#define D_DNS_SERVER "DNS szerver"
#define D_DONE "Kész"
#define D_DST_TIME "nyári idő"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emuláció"
#define D_ENABLED "Engedélyezve"
#define D_ERASE "Törlés"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Program méret"
#define D_PROJECT "Projekt"
#define D_RAIN "Eső"
+#define D_RANGE "Range"
#define D_RECEIVED "Érkezett"
#define D_RESTART "Újraindítás"
#define D_RESTARTING "Újraindítás"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Szélirány"
#define D_TX20_WIND_SPEED "Szélsebesség"
-#define D_TX20_WIND_SPEED_AVG "Átlag szélsebesség"
+#define D_TX20_WIND_SPEED_MIN "Min. szélsebesség"
#define D_TX20_WIND_SPEED_MAX "Max. szélsebesség"
#define D_TX20_NORTH "É"
#define D_TX20_EAST "K"
#define D_TX20_SOUTH "D"
#define D_TX20_WEST "NY"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -644,11 +675,11 @@
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Fázisszög"
#define D_IMPORT_ACTIVE "Bejövő aktív"
#define D_EXPORT_ACTIVE "Kimenő aktív"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Összes reaktív"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "fok"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_HU_HU_H_
diff --git a/tasmota/language/it-IT.h b/tasmota/language/it-IT.h
index d3c55579a..d9a4b9a6b 100644
--- a/tasmota/language/it-IT.h
+++ b/tasmota/language/it-IT.h
@@ -1,7 +1,7 @@
/*
it-IT.h - localization for Italian - Italy for Tasmota
- Copyright (C) 2019 Gennaro Tortone - some mods by Antonio Fragola
+ Copyright (C) 2020 Gennaro Tortone - some mods by Antonio Fragola
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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Conteggio"
#define D_COUNTER "Contatore"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Corrente" // As in Voltage and Current
#define D_DATA "Dati"
#define D_DARKLIGHT "Scuro"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Disabilitato"
#define D_DISTANCE "Distanza"
#define D_DNS_SERVER "DNS Server"
#define D_DONE "Fatto"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulazione"
#define D_ENABLED "Abilitato"
#define D_ERASE "Cancellare"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Dimensione Programma"
#define D_PROJECT "Progetto"
#define D_RAIN "Rain"
+#define D_RANGE "Range"
#define D_RECEIVED "Ricevuto"
#define D_RESTART "Riavvio"
#define D_RESTARTING "Riavviando"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Direzione Vento"
#define D_TX20_WIND_SPEED "Velocità Vento"
-#define D_TX20_WIND_SPEED_AVG "Velocità Media Vento"
+#define D_TX20_WIND_SPEED_MIN "Velocità Minima Vento"
#define D_TX20_WIND_SPEED_MAX "Velocità Massima Vento"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "O"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,23 +656,31 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HERTZ "Hz"
-#define D_UNIT_HOUR "Hr"
+#define D_UNIT_HOUR "h"
#define D_UNIT_GALLONS "gal"
#define D_UNIT_GALLONS_PER_MIN "g/m"
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Angolo Fase"
#define D_IMPORT_ACTIVE "Potenza Attiva Importata"
#define D_EXPORT_ACTIVE "Potenza Attiva Esportata"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Potenza Reattiva Totale"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "°"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltaggio"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Errore Ventilatore"
#define D_SOLAX_ERROR_8 "Altro Errore del Dispositivo"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_IT_IT_H_
diff --git a/tasmota/language/ko-KO.h b/tasmota/language/ko-KO.h
index a6c2088a1..1767366db 100644
--- a/tasmota/language/ko-KO.h
+++ b/tasmota/language/ko-KO.h
@@ -1,7 +1,7 @@
/*
ko-KO.h - localization for Korean - Korean for Tasmota
- Copyright (C) 2019 Theo Arends (translated by NyaamZ)
+ Copyright (C) 2020 Theo Arends (translated by NyaamZ)
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
@@ -74,16 +74,18 @@
#define D_COUNT "횟수"
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNTER "Counter"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "전류" // As in Voltage and Current
#define D_DATA "Data"
#define D_DARKLIGHT "어둡게"
#define D_DEBUG "디버그"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "사용안함"
#define D_DISTANCE "거리"
#define D_DNS_SERVER "DNS 서버"
#define D_DONE "완료"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "에뮬레이션"
#define D_ENABLED "사용"
#define D_ERASE "삭제"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "프로그램 용량"
#define D_PROJECT "프로젝트"
#define D_RAIN "비"
+#define D_RANGE "Range"
#define D_RECEIVED "받음"
#define D_RESTART "재시작"
#define D_RESTARTING "재시작 중.."
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "풍향"
#define D_TX20_WIND_SPEED "풍속"
-#define D_TX20_WIND_SPEED_AVG "평균 풍속"
-#define D_TX20_WIND_SPEED_MAX "최대 풍속"
+#define D_TX20_WIND_SPEED_MIN "풍속 최소"
+#define D_TX20_WIND_SPEED_MAX "풍속 최대"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "W"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -644,10 +675,10 @@
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
#define D_UNIT_MICROMETER "마이크로미터"
#define D_UNIT_MICROSECOND "마이크로초"
#define D_UNIT_MILLIAMPERE "mA"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Total Reactive"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_KO_KO_H_
diff --git a/tasmota/language/nl-NL.h b/tasmota/language/nl-NL.h
index 8fb492399..246066035 100644
--- a/tasmota/language/nl-NL.h
+++ b/tasmota/language/nl-NL.h
@@ -1,7 +1,7 @@
/*
nl-NL.h - localization for Dutch - Nederland for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -74,16 +74,18 @@
#define D_COUNT "Aantal"
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNTER "Teller"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Stroom" // As in Voltage and Current
#define D_DATA "Data"
#define D_DARKLIGHT "Donker"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dauwpunt"
#define D_DISABLED "Uitgeschakeld"
#define D_DISTANCE "Afstand"
#define D_DNS_SERVER "DNS Server"
#define D_DONE "Klaar"
#define D_DST_TIME "ZT"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulatie"
#define D_ENABLED "Geactiveerd"
#define D_ERASE "Wissen"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Programma Grootte"
#define D_PROJECT "Project"
#define D_RAIN "Regen"
+#define D_RANGE "Range"
#define D_RECEIVED "Ontvangen"
#define D_RESTART "Herstart"
#define D_RESTARTING "Herstarten"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Windrichting"
#define D_TX20_WIND_SPEED "Windsnelheid"
-#define D_TX20_WIND_SPEED_AVG "Windsnelheid gemiddeld"
+#define D_TX20_WIND_SPEED_MIN "Windsnelhied minimum"
#define D_TX20_WIND_SPEED_MAX "Windsnelhied maximaal"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "W"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "Gebruiker"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -647,7 +678,7 @@
#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m3"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
#define D_UNIT_MICROMETER "µm"
#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Fase hoek"
#define D_IMPORT_ACTIVE "Import werkelijk"
#define D_EXPORT_ACTIVE "Export werkelijk"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Totaal blind"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 spanning"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Ventilator"
#define D_SOLAX_ERROR_8 "Overige"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_NL_NL_H_
diff --git a/tasmota/language/pl-PL.h b/tasmota/language/pl-PL.h
index 58168516d..6f945183a 100644
--- a/tasmota/language/pl-PL.h
+++ b/tasmota/language/pl-PL.h
@@ -1,7 +1,7 @@
/*
pl-PL-d.h - localization for Polish with diacritics - Poland for Tasmota
- Copyright (C) 2019 Theo Arends (translated by roblad - Robert L., upgraded by R. Turala)
+ Copyright (C) 2020 Theo Arends (translated by roblad - Robert L., upgraded by R. Turala)
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
@@ -62,7 +62,7 @@
#define D_BRIGHTLIGHT "Jasny"
#define D_BSSID "BSSId"
#define D_BUTTON "Przycisk"
-#define D_BY "by" // Written by me
+#define D_BY "przez" // Written by me
#define D_BYTES "Bajtów"
#define D_CELSIUS "Celsiusz"
#define D_CHANNEL "Kanał"
@@ -71,19 +71,21 @@
#define D_COLDLIGHT "Zimny"
#define D_COMMAND "Komenda"
#define D_CONNECTED "Połączony"
-#define D_CORS_DOMAIN "CORS Domain"
+#define D_CORS_DOMAIN "Domena CORS"
#define D_COUNT "Licz"
#define D_COUNTER "Licznik"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Prąd" // As in Voltage and Current
#define D_DATA "Data"
#define D_DARKLIGHT "Ciemny"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Wyłączony"
#define D_DISTANCE "Odległość"
#define D_DNS_SERVER "Serwer DNS"
#define D_DONE "Wykonane"
#define D_DST_TIME "Czas DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulacja"
#define D_ENABLED "Załączony"
#define D_ERASE "Wyczyść"
@@ -113,7 +115,7 @@
#define D_LIGHT "Światło"
#define D_LWT "LWT"
#define D_MODULE "Moduł"
-#define D_MOISTURE "Moisture"
+#define D_MOISTURE "Wilgotność"
#define D_MQTT "MQTT"
#define D_MULTI_PRESS "Wielokrotne naciśnięcie"
#define D_NOISE "Szum"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Rozmiar programu"
#define D_PROJECT "Projekt"
#define D_RAIN "Deszcz"
+#define D_RANGE "Range"
#define D_RECEIVED "Otrzymany"
#define D_RESTART "Restart"
#define D_RESTARTING "Restartowanie"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Kierunek"
#define D_TX20_WIND_SPEED "Prędkość"
-#define D_TX20_WIND_SPEED_AVG "Średnia prędkość"
+#define D_TX20_WIND_SPEED_MIN "Minimalna prędkość"
#define D_TX20_WIND_SPEED_MAX "Maksymalna prędkość"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "W"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "Użytkownik"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -644,12 +675,12 @@
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Przesunięcie faz"
#define D_IMPORT_ACTIVE "Czynna pobrana"
#define D_EXPORT_ACTIVE "Czynna oddana"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Bierna całkowita"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Całkowita czynna"
//SOLAXX1
#define D_PV1_VOLTAGE "Napięcie PV1"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Błąd - wentylator"
#define D_SOLAX_ERROR_8 "Błąd - inne urządzenie"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_PL_PL_D_H_
diff --git a/tasmota/language/pt-BR.h b/tasmota/language/pt-BR.h
index 0c9891323..236652de2 100644
--- a/tasmota/language/pt-BR.h
+++ b/tasmota/language/pt-BR.h
@@ -1,7 +1,7 @@
/*
pt-BR.h - localization for Portuguese - Brazil for Tasmota
- Copyright (C) 2019 Fabiano Bovo
+ Copyright (C) 2020 Fabiano Bovo
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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Contagem"
#define D_COUNTER "Contador"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Corrente" // As in Voltage and Current
#define D_DATA "Dados"
#define D_DARKLIGHT "Luz escura"
#define D_DEBUG "Depurar"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Desabilitado"
#define D_DISTANCE "Distância"
#define D_DNS_SERVER "Servidor DNS"
#define D_DONE "Concluído"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulação"
#define D_ENABLED "Habilitado"
#define D_ERASE "Apagar"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Tamanho do programa"
#define D_PROJECT "Projeto"
#define D_RAIN "Rain"
+#define D_RANGE "Range"
#define D_RECEIVED "Recebido"
#define D_RESTART "Reiniciar"
#define D_RESTARTING "Reiniciando"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Direção do vento"
#define D_TX20_WIND_SPEED "Velocidade do vento"
-#define D_TX20_WIND_SPEED_AVG "Velocidade média do vento"
+#define D_TX20_WIND_SPEED_MIN "Velocidade do vento Mínima"
#define D_TX20_WIND_SPEED_MAX "Velocidade do vento Máxima"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "L"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "O"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -644,12 +675,12 @@
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "W/h"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Ângulo de Fase"
#define D_IMPORT_ACTIVE "Importar Ativo"
#define D_EXPORT_ACTIVE "Exportar Ativo"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Reativo total"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltagem"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Falha no Ventilador"
#define D_SOLAX_ERROR_8 "Outra falha do dispositivo"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_PT_BR_H_
diff --git a/tasmota/language/pt-PT.h b/tasmota/language/pt-PT.h
index 210ef8e29..507e7fe8b 100644
--- a/tasmota/language/pt-PT.h
+++ b/tasmota/language/pt-PT.h
@@ -1,7 +1,7 @@
/*
pt-PT.h - localization for Portuguese - Portugal for Tasmota
- Copyright (C) 2019 Paulo Paiva
+ Copyright (C) 2020 Paulo Paiva
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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Contagem"
#define D_COUNTER "Contador"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Corrente" // As in Voltage and Current
#define D_DATA "Dados"
#define D_DARKLIGHT "Luz Escura"
#define D_DEBUG "Depurar"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Disabilitado"
#define D_DISTANCE "Distância"
#define D_DNS_SERVER "Servidor DNS"
#define D_DONE "Concluído"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulação"
#define D_ENABLED "Habilitado"
#define D_ERASE "Apagar"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Tamanho do Programa"
#define D_PROJECT "Projeto"
#define D_RAIN "Chuva"
+#define D_RANGE "Range"
#define D_RECEIVED "Recebido"
#define D_RESTART "Reiniciar"
#define D_RESTARTING "A reiniciar"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Direção do vento"
#define D_TX20_WIND_SPEED "Velocidade do vento"
-#define D_TX20_WIND_SPEED_AVG "Velocidade média do vento"
+#define D_TX20_WIND_SPEED_MIN "Velocidade mínima do vento"
#define D_TX20_WIND_SPEED_MAX "Velocidade máxima do vento"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "O"
+//xsns_53_sml.ino
+#define D_TPWRIN "Energia-Consumo"
+#define D_TPWROUT "Energia-Geração"
+#define D_TPWRCURR "Potência Ativa-Consumo/Geração"
+#define D_TPWRCURR1 "Potência Ativa-Consumo F1"
+#define D_TPWRCURR2 "Potência Ativa-Consumo F2"
+#define D_TPWRCURR3 "Potência Ativa-Consumo F3"
+#define D_Strom_L1 "Corrente F1"
+#define D_Strom_L2 "Corrente F2"
+#define D_Strom_L3 "Corrente F3"
+#define D_Spannung_L1 "Tensão F1"
+#define D_Spannung_L2 "Tensão F2"
+#define D_Spannung_L3 "Tensão F3"
+#define D_METERNR "Número_Contador"
+#define D_METERSID "ID Serviço"
+#define D_GasIN "Contagem"
+#define D_H2oIN "Contagem"
+#define D_StL1L2L3 "Corrente F1+F2+F3"
+#define D_SpL1L2L3 "Tensão F1+F2+F3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,23 +656,31 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HERTZ "Hz"
-#define D_UNIT_HOUR "Hr"
+#define D_UNIT_HOUR "h"
#define D_UNIT_GALLONS "gal"
#define D_UNIT_GALLONS_PER_MIN "g/m"
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Ângulo de fase"
#define D_IMPORT_ACTIVE "Ativo importado"
#define D_EXPORT_ACTIVE "Ativo exportado"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Reactivo total"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "Voltagem PV1"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Falha no ventilador"
#define D_SOLAX_ERROR_8 "Outra falha no dispositivo"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_PT_PT_H_
diff --git a/tasmota/language/ro-RO.h b/tasmota/language/ro-RO.h
new file mode 100644
index 000000000..c3efc5758
--- /dev/null
+++ b/tasmota/language/ro-RO.h
@@ -0,0 +1,750 @@
+/*
+ ro-RO.h - localization for Romanian - Romania and Moldova for Tasmota
+
+ Copyright (C) 2020 Augustin Marti
+
+ 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 .
+*/
+
+#ifndef _LANGUAGE_RO_RO_H_
+#define _LANGUAGE_RO_RO_H_
+
+/*************************** ATTENTION *******************************\
+ *
+ * Due to memory constraints only UTF-8 is supported.
+ * To save code space keep text as short as possible.
+ * Time and Date provided by SDK can not be localized (yet).
+ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
+ * Use online command Prefix to translate cmnd, stat and tele.
+ *
+ * Updated until v8.1.0.10
+\*********************************************************************/
+
+//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
+// https://www.science.co.il/language/Locale-codes.php
+#define LANGUAGE_LCID 2072
+// HTML (ISO 639-1) Language Code
+#define D_HTML_LANGUAGE "ro"
+
+// "2017-03-07T11:08:02" - ISO8601:2004
+#define D_YEAR_MONTH_SEPARATOR "-"
+#define D_MONTH_DAY_SEPARATOR "-"
+#define D_DATE_TIME_SEPARATOR "T"
+#define D_HOUR_MINUTE_SEPARATOR ":"
+#define D_MINUTE_SECOND_SEPARATOR ":"
+
+#define D_DAY3LIST "DumLunMarMieJoiVinSâm"
+#define D_MONTH3LIST "IanFebMarAprMaiIunIulAugSepOctNoeDec"
+
+// Non JSON decimal separator
+#define D_DECIMAL_SEPARATOR "."
+
+// Common
+#define D_ADMIN "Admin"
+#define D_AIR_QUALITY "Calitatea aerului"
+#define D_AP "AP" // Access Point
+#define D_AS "as"
+#define D_AUTO "AUTO"
+#define D_BLINK "Blink"
+#define D_BLINKOFF "BlinkOff"
+#define D_BOOT_COUNT "Boot Count"
+#define D_BRIGHTLIGHT "Strălucire"
+#define D_BSSID "BSSId"
+#define D_BUTTON "Buton"
+#define D_BY "de" // Written by me
+#define D_BYTES "Bytes"
+#define D_CELSIUS "Celsius"
+#define D_CHANNEL "Canal"
+#define D_CO2 "Dioxid de carbon"
+#define D_CODE "cod" // Button code
+#define D_COLDLIGHT "Rece"
+#define D_COMMAND "Comandă"
+#define D_CONNECTED "Conectat"
+#define D_CORS_DOMAIN "Domeniu CORS"
+#define D_COUNT "Numărătoare"
+#define D_COUNTER "Contor"
+#define D_CT_POWER "Putere Transformată"
+#define D_CURRENT "Curent" // As in Voltage and Current
+#define D_DATA "Date"
+#define D_DARKLIGHT "Întunecat"
+#define D_DEBUG "Depanare"
+#define D_DEWPOINT "Punct de rouă"
+#define D_DISABLED "Dezactivat"
+#define D_DISTANCE "Distanță"
+#define D_DNS_SERVER "Server DNS"
+#define D_DONE "Terminat"
+#define D_DST_TIME "DST"
+#define D_ECO2 "eCO₂"
+#define D_EMULATION "Emulație"
+#define D_ENABLED "Activat"
+#define D_ERASE "Șterge"
+#define D_ERROR "Eroare"
+#define D_FAHRENHEIT "Fahrenheit"
+#define D_FAILED "Eșuat"
+#define D_FALLBACK "Rezervă"
+#define D_FALLBACK_TOPIC "Listă de rezervă"
+#define D_FALSE "Fals"
+#define D_FILE "Fișier"
+#define D_FLOW_RATE "Debit"
+#define D_FREE_MEMORY "Memorie Liberă"
+#define D_FREQUENCY "Frecvență"
+#define D_GAS "Gaz"
+#define D_GATEWAY "Gateway"
+#define D_GROUP "Grup"
+#define D_HOST "Gazdă"
+#define D_HOSTNAME "Hostname"
+#define D_HUMIDITY "Umiditate"
+#define D_ILLUMINANCE "Iluminare"
+#define D_IMMEDIATE "imediat" // Button immediate
+#define D_INDEX "Index"
+#define D_INFO "Info"
+#define D_INFRARED "Infraroșu"
+#define D_INITIALIZED "Inițializat"
+#define D_IP_ADDRESS "Adresă IP"
+#define D_LIGHT "Lumină"
+#define D_LWT "LWT"
+#define D_MODULE "Modul"
+#define D_MOISTURE "Umezeală"
+#define D_MQTT "MQTT"
+#define D_MULTI_PRESS "selectare multiplă"
+#define D_NOISE "Zgomot"
+#define D_NONE "Lipsă"
+#define D_OFF "Închis"
+#define D_OFFLINE "Offline"
+#define D_OK "Ok"
+#define D_ON "Aprins"
+#define D_ONLINE "Online"
+#define D_PASSWORD "Parolă"
+#define D_PORT "Port"
+#define D_POWER_FACTOR "Factor de Putere"
+#define D_POWERUSAGE "Putere"
+#define D_POWERUSAGE_ACTIVE "Putere Activă"
+#define D_POWERUSAGE_APPARENT "Putere Aparentă"
+#define D_POWERUSAGE_REACTIVE "Putere Reactivă"
+#define D_PRESSURE "Presiune"
+#define D_PRESSUREATSEALEVEL "Presiune atmosferică"
+#define D_PROGRAM_FLASH_SIZE "Mărimea Programului Flash"
+#define D_PROGRAM_SIZE "Mărimea Programului"
+#define D_PROJECT "Proiect"
+#define D_RAIN "Ploaie"
+#define D_RANGE "Distanță"
+#define D_RECEIVED "Primit"
+#define D_RESTART "Restart"
+#define D_RESTARTING "Restartare"
+#define D_RESTART_REASON "Motiv Restartare"
+#define D_RESTORE "Restaurare"
+#define D_RETAINED "Păstrare"
+#define D_RULE "Regulă"
+#define D_SAVE "Salvare"
+#define D_SENSOR "Senzor"
+#define D_SSID "SSId"
+#define D_START "Start"
+#define D_STD_TIME "STD"
+#define D_STOP "Stop"
+#define D_SUBNET_MASK "Subnet Mask"
+#define D_SUBSCRIBE_TO "Înscriere la"
+#define D_UNSUBSCRIBE_FROM "Renunțare de la"
+#define D_SUCCESSFUL "Succes"
+#define D_SUNRISE "Răsărit"
+#define D_SUNSET "Apus"
+#define D_TEMPERATURE "Temperatură"
+#define D_TO "la"
+#define D_TOGGLE "Comută"
+#define D_TOPIC "Topic"
+#define D_TOTAL_USAGE "Folosință totală"
+#define D_TRANSMIT "Transmitere"
+#define D_TRUE "Adevărat"
+#define D_TVOC "TVOC"
+#define D_UPGRADE "actualizare"
+#define D_UPLOAD "Încărcăre"
+#define D_UPTIME "Folosință"
+#define D_USER "Utilizator"
+#define D_UTC_TIME "UTC"
+#define D_UV_INDEX "Index UV"
+#define D_UV_INDEX_1 "Mic"
+#define D_UV_INDEX_2 "Mediu"
+#define D_UV_INDEX_3 "Mare"
+#define D_UV_INDEX_4 "Pericol"
+#define D_UV_INDEX_5 "ArdereL1/2"
+#define D_UV_INDEX_6 "ArdereL3"
+#define D_UV_INDEX_7 "În afara intervalului" // Out of Range
+#define D_UV_LEVEL "Nivel UV"
+#define D_UV_POWER "Putere UV"
+#define D_VERSION "Versiune"
+#define D_VOLTAGE "Voltaj"
+#define D_WEIGHT "Greutate"
+#define D_WARMLIGHT "Cald"
+#define D_WEB_SERVER "Server Web"
+
+// tasmota.ino
+#define D_WARNING_MINIMAL_VERSION "ATENȚIE Această versiune nu suportă setări permanente"
+#define D_LEVEL_10 "nivel 1-0"
+#define D_LEVEL_01 "nivel 0-1"
+#define D_SERIAL_LOGGING_DISABLED "Logare serială dezactivată"
+#define D_SYSLOG_LOGGING_REENABLED "Logare Syslog activată"
+
+#define D_SET_BAUDRATE_TO "Setare Baudrate la"
+#define D_RECEIVED_TOPIC "Listă Primită"
+#define D_DATA_SIZE "Mărime Date"
+#define D_ANALOG_INPUT "Analog"
+
+// support.ino
+#define D_OSWATCH "osWatch"
+#define D_BLOCKED_LOOP "Circuit blocat"
+#define D_WPS_FAILED_WITH_STATUS "status WPSconfig EȘUAT"
+#define D_ACTIVE_FOR_3_MINUTES "activ pentru 3 minute"
+#define D_FAILED_TO_START "start eșuat"
+#define D_PATCH_ISSUE_2186 "emitere patch 2186"
+#define D_CONNECTING_TO_AP "Conectare la AP"
+#define D_IN_MODE "in mode"
+#define D_CONNECT_FAILED_NO_IP_ADDRESS "Conexiune eșuată, lipsă primire adresă IP"
+#define D_CONNECT_FAILED_AP_NOT_REACHED "Conexiune eșuată, nu s-a găsit AP"
+#define D_CONNECT_FAILED_WRONG_PASSWORD "Conexiune eșuată, parolă greșită AP"
+#define D_CONNECT_FAILED_AP_TIMEOUT "Conexiune eșuată, expirare timp AP"
+#define D_ATTEMPTING_CONNECTION "Conectare in curs ..."
+#define D_CHECKING_CONNECTION "Verificare conexiune..."
+#define D_QUERY_DONE "Căutare terminată. Servicii MQTT găsite"
+#define D_MQTT_SERVICE_FOUND "Servicii MQTT găsite"
+#define D_FOUND_AT "Găsite la"
+#define D_SYSLOG_HOST_NOT_FOUND "Lipsă gazdă Syslog"
+
+// settings.ino
+#define D_SAVED_TO_FLASH_AT "Salvat pe flash la"
+#define D_LOADED_FROM_FLASH_AT "Încărcat din flash la"
+#define D_USE_DEFAULTS "Folosește setari fabrică"
+#define D_ERASED_SECTOR "Sector șters"
+
+// xdrv_02_webserver.ino
+#define D_NOSCRIPT "Pentru a folosi Tasmota, vă rugăm activați JavaScript"
+#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "firmware MINIMAL vă rugăm actualizați"
+#define D_WEBSERVER_ACTIVE_ON "Server Web activ"
+#define D_WITH_IP_ADDRESS "cu adresa IP "
+#define D_WEBSERVER_STOPPED "Server Web oprit"
+#define D_FILE_NOT_FOUND "Lipsă fișier"
+#define D_REDIRECTED "Redirecționat la captive portal"
+#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifimanager set AccessPoint cu păstrare Stație"
+#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifimanager set AccessPoint"
+#define D_TRYING_TO_CONNECT "Încercare conectare la rețea"
+
+#define D_RESTART_IN "Restart în"
+#define D_SECONDS "secunde"
+#define D_DEVICE_WILL_RESTART "echipamentul va reporni în cateva secunde"
+#define D_BUTTON_TOGGLE "Comutare"
+#define D_CONFIGURATION "Configurație"
+#define D_INFORMATION "Informație"
+#define D_FIRMWARE_UPGRADE "Actualizare Firmware"
+#define D_CONSOLE "Consolă"
+#define D_CONFIRM_RESTART "Confirmare Restart"
+
+#define D_CONFIGURE_MODULE "Configurare Modul"
+#define D_CONFIGURE_WIFI "Configurare WiFi"
+#define D_CONFIGURE_MQTT "Configurare MQTT"
+#define D_CONFIGURE_DOMOTICZ "Configurare Domoticz"
+#define D_CONFIGURE_LOGGING "Configurare Logging"
+#define D_CONFIGURE_OTHER "Alte configurări"
+#define D_CONFIRM_RESET_CONFIGURATION "Confirmă Reset Configurare"
+#define D_RESET_CONFIGURATION "Resetează Configurare"
+#define D_BACKUP_CONFIGURATION "Backup Configurare"
+#define D_RESTORE_CONFIGURATION "Restaurează Configurație"
+#define D_MAIN_MENU "Meniu Principal"
+
+#define D_MODULE_PARAMETERS "Parametri modul"
+#define D_MODULE_TYPE "Tip modul"
+#define D_PULLUP_ENABLE "Fără Buton/Întrerupător"
+#define D_ADC "ADC"
+#define D_GPIO "GPIO"
+#define D_SERIAL_IN "Intrare Serială"
+#define D_SERIAL_OUT "Ieșire Serială"
+
+#define D_WIFI_PARAMETERS "Parameteri Wifi"
+#define D_SCAN_FOR_WIFI_NETWORKS "Scanare rețele wifi"
+#define D_SCAN_DONE "Scanare terminată"
+#define D_NO_NETWORKS_FOUND "Lipsă rețele găsite"
+#define D_REFRESH_TO_SCAN_AGAIN "Refresh pentru o nouă scanare"
+#define D_DUPLICATE_ACCESSPOINT "Clonează AccessPoint"
+#define D_SKIPPING_LOW_QUALITY "Omite,joasă calitate"
+#define D_RSSI "RSSI"
+#define D_WEP "WEP"
+#define D_WPA_PSK "WPA PSK"
+#define D_WPA2_PSK "WPA2 PSK"
+#define D_AP1_SSID "AP1 SSId"
+#define D_AP1_PASSWORD "Parolă AP1"
+#define D_AP2_SSID "AP2 SSId"
+#define D_AP2_PASSWORD "Parolă AP2"
+
+#define D_MQTT_PARAMETERS "parametri MQTT"
+#define D_CLIENT "Client"
+#define D_FULL_TOPIC "Full Topic"
+
+#define D_LOGGING_PARAMETERS "parametri Logging"
+#define D_SERIAL_LOG_LEVEL "Nivel Serial log"
+#define D_MQTT_LOG_LEVEL "Nivel Mqtt log"
+#define D_WEB_LOG_LEVEL "Nivel Web log"
+#define D_SYS_LOG_LEVEL "Nivel Syslog"
+#define D_MORE_DEBUG "Depanare detailată"
+#define D_SYSLOG_HOST "Syslog Gazdă "
+#define D_SYSLOG_PORT "Syslog port"
+#define D_TELEMETRY_PERIOD "Perioadă Telemetrie"
+
+#define D_OTHER_PARAMETERS "Alți paramatri"
+#define D_TEMPLATE "Template"
+#define D_ACTIVATE "Activare"
+#define D_WEB_ADMIN_PASSWORD "Parolă Web Admin"
+#define D_MQTT_ENABLE "Activare MQTT"
+#define D_FRIENDLY_NAME "Friendly Name"
+#define D_BELKIN_WEMO "Belkin WeMo"
+#define D_HUE_BRIDGE "Hue Bridge"
+#define D_SINGLE_DEVICE "echipament unic"
+#define D_MULTI_DEVICE "echipament multiplu"
+
+#define D_CONFIGURE_TEMPLATE "Configurare Template"
+#define D_TEMPLATE_PARAMETERS "Parametri Template"
+#define D_TEMPLATE_NAME "Nume"
+#define D_BASE_TYPE "Bazat pe"
+#define D_TEMPLATE_FLAGS "Opțiuni"
+
+#define D_SAVE_CONFIGURATION "Salvează configurația"
+#define D_CONFIGURATION_SAVED "Configurația salvată"
+#define D_CONFIGURATION_RESET "Configurația resetată"
+
+#define D_PROGRAM_VERSION "Versiune Program"
+#define D_BUILD_DATE_AND_TIME "Data & Timp creare"
+#define D_CORE_AND_SDK_VERSION "Versiune Core/SDK"
+#define D_FLASH_WRITE_COUNT "Spațiu Flash scris"
+#define D_MAC_ADDRESS "Adresă MAC"
+#define D_MQTT_HOST "Gazdă MQTT"
+#define D_MQTT_PORT "Port MQTT"
+#define D_MQTT_CLIENT "Client MQTT"
+#define D_MQTT_USER "Uilizator MQTT"
+#define D_MQTT_TOPIC "Subiect MQTT"
+#define D_MQTT_GROUP_TOPIC "Subiect Grup MQTT"
+#define D_MQTT_FULL_TOPIC "Subiect Întreg MQTT"
+#define D_MDNS_DISCOVERY "Descoperă mDNS"
+#define D_MDNS_ADVERTISE "Publică mDNS"
+#define D_ESP_CHIP_ID "ESP Chip Id"
+#define D_FLASH_CHIP_ID "Flash Chip Id"
+#define D_FLASH_CHIP_SIZE "Mărime Flash"
+#define D_FREE_PROGRAM_SPACE "Spațiu Disponibil Program"
+
+#define D_UPGRADE_BY_WEBSERVER "Actualizare prin server web"
+#define D_OTA_URL "OTA Url"
+#define D_START_UPGRADE "Porneste actualizare"
+#define D_UPGRADE_BY_FILE_UPLOAD "Actualizare prin încărcare fișier"
+#define D_UPLOAD_STARTED "Încărcare începută"
+#define D_UPGRADE_STARTED "Actualizare începută"
+#define D_UPLOAD_DONE "Încărcare terminată"
+#define D_UPLOAD_ERR_1 "Nici un fișier selectat"
+#define D_UPLOAD_ERR_2 "Spațiu insuficient"
+#define D_UPLOAD_ERR_3 "Magic byte nu este 0xE9"
+#define D_UPLOAD_ERR_4 "Dimensiunea programului este mai mare decât mărimea memoriei"
+#define D_UPLOAD_ERR_5 "Încărcare buffer necomparabil"
+#define D_UPLOAD_ERR_6 "Încărcare eșuată. Activează logging 3"
+#define D_UPLOAD_ERR_7 "Încărcare anulată"
+#define D_UPLOAD_ERR_8 "Fișier invalid"
+#define D_UPLOAD_ERR_9 "Fișier prea mare"
+#define D_UPLOAD_ERR_10 "Inițiere chip RF eșuată"
+#define D_UPLOAD_ERR_11 "Ștergere chip RF eșuată"
+#define D_UPLOAD_ERR_12 "Scriere chip RF eșuată"
+#define D_UPLOAD_ERR_13 "Decodare RF firmware eșuată"
+#define D_UPLOAD_ERR_14 "Incompatibil"
+#define D_UPLOAD_ERROR_CODE "Încărcare cod eroare"
+
+#define D_ENTER_COMMAND "Introdu comandă"
+#define D_ENABLE_WEBLOG_FOR_RESPONSE "Activează weblog 2 dacă există răspunsul așteptat"
+#define D_NEED_USER_AND_PASSWORD "Necesită utilizator=&parolă="
+
+// xdrv_01_mqtt.ino
+#define D_FINGERPRINT "Verificare amprentă TLS..."
+#define D_TLS_CONNECT_FAILED_TO "Conexiune TLS eșuată"
+#define D_RETRY_IN "Reîncearcă în"
+#define D_VERIFIED "Verificat folosind amprenta"
+#define D_INSECURE "Conexiune nesigură din cauza amprentei eșuate"
+#define D_CONNECT_FAILED_TO "Eșuare conectare la"
+
+// xplg_wemohue.ino
+#define D_MULTICAST_DISABLED "Multicast dezactivat"
+#define D_MULTICAST_REJOINED "Multicast (re)conectat"
+#define D_MULTICAST_JOIN_FAILED "Multicast conectare eșuată"
+#define D_FAILED_TO_SEND_RESPONSE "Trimitere răspuns eșuată"
+
+#define D_WEMO "WeMo"
+#define D_WEMO_BASIC_EVENT "WeMo eveniment basic"
+#define D_WEMO_EVENT_SERVICE "WeMo service eveniment"
+#define D_WEMO_META_SERVICE "WeMo meta service"
+#define D_WEMO_SETUP "Configurare WeMo"
+#define D_RESPONSE_SENT "Răspuns trimis"
+
+#define D_HUE "Hue"
+#define D_HUE_BRIDGE_SETUP "Configurare Hue"
+#define D_HUE_API_NOT_IMPLEMENTED "Hue API neimplementat"
+#define D_HUE_API "Hue API"
+#define D_HUE_POST_ARGS "Hue POST args"
+#define D_3_RESPONSE_PACKETS_SENT "3 pachete de răspuns trimise"
+
+// xdrv_07_domoticz.ino
+#define D_DOMOTICZ_PARAMETERS "Parametri Domoticz"
+#define D_DOMOTICZ_IDX "Idx"
+#define D_DOMOTICZ_KEY_IDX "Key idx"
+#define D_DOMOTICZ_SWITCH_IDX "Întrerupator idx"
+#define D_DOMOTICZ_SENSOR_IDX "Senzor idx"
+ #define D_DOMOTICZ_TEMP "Temp"
+ #define D_DOMOTICZ_TEMP_HUM "Temp,U!mid"
+ #define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Umid,Baro"
+ #define D_DOMOTICZ_POWER_ENERGY "Putere,Energie"
+ #define D_DOMOTICZ_ILLUMINANCE "Iluminare"
+ #define D_DOMOTICZ_COUNT "Contor/PM1"
+ #define D_DOMOTICZ_VOLTAGE "Voltaj/PM2.5"
+ #define D_DOMOTICZ_CURRENT "Curent/PM10"
+ #define D_DOMOTICZ_AIRQUALITY "Calitatea Aerului"
+ #define D_DOMOTICZ_P1_SMART_METER "P1SmartMeter"
+#define D_DOMOTICZ_UPDATE_TIMER "Actualizare Temporizare"
+
+// xdrv_09_timers.ino
+#define D_CONFIGURE_TIMER "Configurare Temporizare"
+#define D_TIMER_PARAMETERS "Parameteri Temporizare"
+#define D_TIMER_ENABLE "Activează Temporizare"
+#define D_TIMER_ARM "Arm"
+#define D_TIMER_TIME "Timp"
+#define D_TIMER_DAYS "Zile"
+#define D_TIMER_REPEAT "Repetă"
+#define D_TIMER_OUTPUT "Ieșire"
+#define D_TIMER_ACTION "Acțiune"
+
+// xdrv_10_knx.ino
+#define D_CONFIGURE_KNX "Configurare KNX"
+#define D_KNX_PARAMETERS "Parameteri KNX"
+#define D_KNX_GENERAL_CONFIG "General"
+#define D_KNX_PHYSICAL_ADDRESS "Adresă fizică"
+#define D_KNX_PHYSICAL_ADDRESS_NOTE "(Trebuie să fie unică în rețeaua KNX)"
+#define D_KNX_ENABLE "Activează KNX"
+#define D_KNX_GROUP_ADDRESS_TO_WRITE "Data de trimis la adresele grupului"
+#define D_ADD "Adaugă"
+#define D_DELETE "Șterge"
+#define D_REPLY "Răspunde"
+#define D_KNX_GROUP_ADDRESS_TO_READ "Datele primite pentru adresele grupului"
+#define D_RECEIVED_FROM "Primit de la"
+#define D_KNX_COMMAND_WRITE "Scrie"
+#define D_KNX_COMMAND_READ "Citește"
+#define D_KNX_COMMAND_OTHER "Altele"
+#define D_SENT_TO "trimite la"
+#define D_KNX_WARNING "Adresa grupului ( 0 / 0 / 0 ) este rezervată și nu se poate folosi."
+#define D_KNX_ENHANCEMENT "Îmbunătățire Communicație"
+#define D_KNX_TX_SLOT "KNX TX"
+#define D_KNX_RX_SLOT "KNX RX"
+
+// xdrv_03_energy.ino
+#define D_ENERGY_TODAY "Energia de Azi"
+#define D_ENERGY_YESTERDAY "Energia de Ieri"
+#define D_ENERGY_TOTAL "Energia Totală"
+
+// xdrv_27_shutter.ino
+#define D_OPEN "Deschide"
+#define D_CLOSE "Inchide"
+#define D_DOMOTICZ_SHUTTER "Shutter"
+
+// xdrv_28_pcf8574.ino
+#define D_CONFIGURE_PCF8574 "Configurează PCF8574"
+#define D_PCF8574_PARAMETERS "Parameteri PCF8574"
+#define D_INVERT_PORTS "Inversează Porturile"
+#define D_DEVICE "echipament"
+#define D_DEVICE_INPUT "Intrare"
+#define D_DEVICE_OUTPUT "Ieșire"
+
+// xsns_05_ds18b20.ino
+#define D_SENSOR_BUSY "Senzor ocupat"
+#define D_SENSOR_CRC_ERROR "Eroare senzor CRC"
+#define D_SENSORS_FOUND "Descoperit senzor"
+
+// xsns_06_dht.ino
+#define D_TIMEOUT_WAITING_FOR "Timp expirat așteptare pentru"
+#define D_START_SIGNAL_LOW "Semnal inițiere mic"
+#define D_START_SIGNAL_HIGH "Semnal inițiere mare"
+#define D_PULSE "puls"
+#define D_CHECKSUM_FAILURE "Eroare Checksum"
+
+// xsns_07_sht1x.ino
+#define D_SENSOR_DID_NOT_ACK_COMMAND "Senzorul nu a primit comanda ACK"
+#define D_SHT1X_FOUND "Descoperit SHT1X"
+
+// xsns_18_pms5003.ino
+#define D_STANDARD_CONCENTRATION "CF-1 PM" // Standard Particle CF-1 Particle Matter
+#define D_ENVIRONMENTAL_CONCENTRATION "PM" // Environmetal Particle Matter
+#define D_PARTICALS_BEYOND "Particule"
+
+// xsns_32_mpu6050.ino
+#define D_AX_AXIS "Accel.Axa-X"
+#define D_AY_AXIS "Accel.Axa-Y"
+#define D_AZ_AXIS "Accel.Axa-Z"
+#define D_GX_AXIS "Gyro Axa-X"
+#define D_GY_AXIS "Gyro Axa-Y"
+#define D_GZ_AXIS "Gyro Axa-Z"
+
+// xsns_34_hx711.ino
+#define D_HX_CAL_REMOVE "Elimină greutatea"
+#define D_HX_CAL_REFERENCE "Așează greutatea de referință"
+#define D_HX_CAL_DONE "Calibrat"
+#define D_HX_CAL_FAIL "Eroare Calibrare"
+#define D_RESET_HX711 "Reset Balanța"
+#define D_CONFIGURE_HX711 "Configurare Balanța"
+#define D_HX711_PARAMETERS "Parametri Balanța"
+#define D_ITEM_WEIGHT "Greutatea obiectului"
+#define D_REFERENCE_WEIGHT "Greutatea de referință"
+#define D_CALIBRATE "Calibrează"
+#define D_CALIBRATION "Execută Calibrarea"
+
+//xsns_35_tx20.ino
+#define D_TX20_WIND_DIRECTION "Direcția vântului"
+#define D_TX20_WIND_SPEED "Viteza vântului"
+#define D_TX20_WIND_SPEED_MIN "Viteza vântului Min"
+#define D_TX20_WIND_SPEED_MAX "Viteza vântului Max"
+#define D_TX20_NORTH "N"
+#define D_TX20_EAST "E"
+#define D_TX20_SOUTH "S"
+#define D_TX20_WEST "V"
+
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
+// tasmota_template.h - keep them as short as possible to be able to fit them in GUI drop down box
+#define D_SENSOR_NONE "Fără"
+#define D_SENSOR_USER "Utilizator"
+#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 "Întrerupator" // Suffix "1"
+#define D_SENSOR_BUTTON "Buton" // Suffix "1"
+#define D_SENSOR_RELAY "Releu" // Suffix "1i"
+#define D_SENSOR_LED "Led" // Suffix "1i"
+#define D_SENSOR_LED_LINK "LedLink" // Suffix "i"
+#define D_SENSOR_PWM "PWM" // Suffix "1"
+#define D_SENSOR_COUNTER "Contor" // 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_SPI_MISO "SPI MISO"
+#define D_SENSOR_SPI_MOSI "SPI MOSI"
+#define D_SENSOR_SPI_CLK "SPI CLK"
+#define D_SENSOR_BACKLIGHT "Backlight"
+#define D_SENSOR_PMS5003 "PMS5003"
+#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
+#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
+#define D_SENSOR_HPMA_RX "HPMA Rx"
+#define D_SENSOR_HPMA_TX "HPMA Tx"
+#define D_SENSOR_SBR_RX "SerBr Rx"
+#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
+#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#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_TX2X_TX "TX2x"
+#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_ARIRFSEL "ALux IrSel"
+#define D_SENSOR_TXD "Serial Tx"
+#define D_SENSOR_RXD "Serial Rx"
+#define D_SENSOR_ROTARY "Rotary" // Suffix "1A"
+#define D_SENSOR_HRE_CLOCK "HRE Clock"
+#define D_SENSOR_HRE_DATA "HRE Data"
+#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
+#define D_SENSOR_BUZZER "Buzzer"
+#define D_SENSOR_OLED_RESET "OLED Reset"
+#define D_SENSOR_ZIGBEE_TXD "Zigbee Tx"
+#define D_SENSOR_ZIGBEE_RXD "Zigbee Rx"
+#define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx"
+#define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx"
+#define D_SENSOR_IBEACON_TX "iBeacon TX"
+#define D_SENSOR_IBEACON_RX "iBeacon RX"
+#define D_SENSOR_RDM6300_RX "RDM6300 RX"
+#define D_SENSOR_CC1101_CS "CC1101 CS"
+#define D_SENSOR_A4988_DIR "A4988 DIR"
+#define D_SENSOR_A4988_STP "A4988 STP"
+#define D_SENSOR_A4988_ENA "A4988 ENA"
+#define D_SENSOR_A4988_MS1 "A4988 MS1"
+#define D_SENSOR_A4988_MS2 "A4988 MS2"
+#define D_SENSOR_A4988_MS3 "A4988 MS3"
+#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
+#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
+#define D_SENSOR_SM2135_CLK "SM2135 Clk"
+#define D_SENSOR_SM2135_DAT "SM2135 Dat"
+#define D_SENSOR_DEEPSLEEP "DeepSleep"
+#define D_SENSOR_EXS_ENABLE "EXS Enable"
+#define D_SENSOR_SLAVE_TX "Slave TX"
+#define D_SENSOR_SLAVE_RX "Slave RX"
+#define D_SENSOR_SLAVE_RESET "Slave RST"
+#define D_SENSOR_GPS_RX "GPS RX"
+#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
+
+// Units
+#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
+#define D_UNIT_HERTZ "Hz"
+#define D_UNIT_HOUR "h"
+#define D_UNIT_GALLONS "gal"
+#define D_UNIT_GALLONS_PER_MIN "g/m"
+#define D_UNIT_INCREMENTS "inc"
+#define D_UNIT_KILOGRAM "kg"
+#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
+#define D_UNIT_KILOOHM "kΩ"
+#define D_UNIT_KILOWATTHOUR "kWh"
+#define D_UNIT_LUX "lx"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
+#define D_UNIT_MILLIAMPERE "mA"
+#define D_UNIT_MILLIMETER "mm"
+#define D_UNIT_MILLIMETER_MERCURY "mmHg"
+#define D_UNIT_MILLISECOND "ms"
+#define D_UNIT_MINUTE "Min"
+#define D_UNIT_PARTS_PER_BILLION "ppb"
+#define D_UNIT_PARTS_PER_DECILITER "ppd"
+#define D_UNIT_PARTS_PER_MILLION "ppm"
+#define D_UNIT_PRESSURE "hPa"
+#define D_UNIT_SECOND "sec"
+#define D_UNIT_SECTORS "sectors"
+#define D_UNIT_VA "VA"
+#define D_UNIT_VAR "VAr"
+#define D_UNIT_VOLT "V"
+#define D_UNIT_WATT "W"
+#define D_UNIT_WATTHOUR "Wh"
+#define D_UNIT_WATT_METER_QUADRAT "W/m²"
+
+//SDM220, SDM120, LE01MR
+#define D_PHASE_ANGLE "Unghi de fază"
+#define D_IMPORT_ACTIVE "Import Activ"
+#define D_EXPORT_ACTIVE "Export Activ"
+#define D_IMPORT_REACTIVE "Import Reactiv"
+#define D_EXPORT_REACTIVE "Export Reactiv"
+#define D_TOTAL_REACTIVE "Total Reactiv"
+#define D_UNIT_KWARH "kVArh"
+#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Activ"
+
+//SOLAXX1
+#define D_PV1_VOLTAGE "PV1 Voltaj"
+#define D_PV1_CURRENT "PV1 Curent"
+#define D_PV1_POWER "PV1 Putere"
+#define D_PV2_VOLTAGE "PV2 Voltaj"
+#define D_PV2_CURRENT "PV2 Curent"
+#define D_PV2_POWER "PV2 Putere"
+#define D_SOLAR_POWER "Putere Solară"
+#define D_INVERTER_POWER "Invertor Putere"
+#define D_STATUS "Status"
+#define D_WAITING "Așteptare"
+#define D_CHECKING "Verificare"
+#define D_WORKING "Lucrează"
+#define D_FAILURE "Eroare"
+#define D_SOLAX_ERROR_0 "Fără cod de eroare"
+#define D_SOLAX_ERROR_1 "Eroare zona"
+#define D_SOLAX_ERROR_2 "Eroare zona voltaj"
+#define D_SOLAX_ERROR_3 "Eroare zona frecvență"
+#define D_SOLAX_ERROR_4 "Pv Eroare Voltaj"
+#define D_SOLAX_ERROR_5 "Eroare Isolație"
+#define D_SOLAX_ERROR_6 "Eroare temperatură ridicată"
+#define D_SOLAX_ERROR_7 "Eroare ventilator"
+#define D_SOLAX_ERROR_8 "Eroare alt echipament"
+
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Configurare script"
+#define D_SCRIPT "editează script"
+#define D_SDCARD_UPLOAD "Încarcă fișier"
+#define D_SDCARD_DIR "director sd card"
+#define D_UPL_DONE "Terminat"
+#define D_SCRIPT_CHARS_LEFT "caractere rămase"
+#define D_SCRIPT_CHARS_NO_MORE "caractere terminate"
+#define D_SCRIPT_DOWNLOAD "Descarcă"
+#define D_SCRIPT_ENABLE "activează script"
+#define D_SCRIPT_UPLOAD "Încarcă"
+#define D_SCRIPT_UPLOAD_FILES "Încarcă fișiere"
+
+#endif // _LANGUAGE_RO_RO_H_
diff --git a/tasmota/language/ru-RU.h b/tasmota/language/ru-RU.h
index 6696e0e48..a104dca55 100644
--- a/tasmota/language/ru-RU.h
+++ b/tasmota/language/ru-RU.h
@@ -1,7 +1,7 @@
/*
ru-RU.h - localization for Russian - Rissia for Tasmota
- Copyright (C) 2019 Theo Arends / roman-vn
+ Copyright (C) 2020 Theo Arends / roman-vn
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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Подсчет"
#define D_COUNTER "Счетчик"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Ток" // As in Voltage and Current
#define D_DATA "Данные"
#define D_DARKLIGHT "Темный"
#define D_DEBUG "Отладка"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Блокирован"
#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS Сервер"
#define D_DONE "Выполнено"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Эмуляция"
#define D_ENABLED "Активно"
#define D_ERASE "Стирать"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Размер программы "
#define D_PROJECT "Проект"
#define D_RAIN "Rain"
+#define D_RANGE "Range"
#define D_RECEIVED "Получено"
#define D_RESTART "Перезапуск"
#define D_RESTARTING "Перезапуск"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Wind Direction"
#define D_TX20_WIND_SPEED "Wind Speed"
-#define D_TX20_WIND_SPEED_AVG "Wind Speed Avg"
+#define D_TX20_WIND_SPEED_MIN "Wind Speed Min"
#define D_TX20_WIND_SPEED_MAX "Wind Speed Max"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "W"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "А"
@@ -647,7 +678,7 @@
#define D_UNIT_KILOOHM "кОм"
#define D_UNIT_KILOWATTHOUR "кВт"
#define D_UNIT_LUX "лк"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "мкг/м3"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "мкг/м³"
#define D_UNIT_MICROMETER "мкм"
#define D_UNIT_MICROSECOND "мкс"
#define D_UNIT_MILLIAMPERE "мА"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "ВтЧ"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Угол фазы"
#define D_IMPORT_ACTIVE "Импорт активной мощности"
#define D_EXPORT_ACTIVE "Экспорт активной мощности"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Итого реактивная мощность"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Град"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_RU_RU_H_
diff --git a/tasmota/language/sk-SK.h b/tasmota/language/sk-SK.h
index 21120179a..706432e5b 100644
--- a/tasmota/language/sk-SK.h
+++ b/tasmota/language/sk-SK.h
@@ -1,7 +1,7 @@
/*
sk-SK.h - localization for Slovak with diacritics - Slovak for Tasmota
- Copyright (C) 2019 Vladimír Jendroľ
+ Copyright (C) 2020 Vladimír Jendroľ
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
@@ -74,17 +74,19 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Počítaj"
#define D_COUNTER "Počítadlo"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Prúd" // As in Voltage and Current
#define D_DATA "Dáta"
#define D_FLOW_RATE "Flow rate"
#define D_DARKLIGHT "Tmavý"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Zablokované"
#define D_DISTANCE "Vzdialenosť"
#define D_DNS_SERVER "Server DNS"
#define D_DONE "Hotovo"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulácia"
#define D_ENABLED "Otvorený"
#define D_ERASE "Zmaž"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Veľkosť programu"
#define D_PROJECT "Projekt"
#define D_RAIN "Dážď"
+#define D_RANGE "Range"
#define D_RECEIVED "Prijatý"
#define D_RESTART "Reštart"
#define D_RESTARTING "Reštartuje sa"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Smer vetra"
#define D_TX20_WIND_SPEED "Rýchlosť vetra"
-#define D_TX20_WIND_SPEED_AVG "Priemerná rýchlosť vetra"
+#define D_TX20_WIND_SPEED_MIN "Minimálna rýchlosť vetra"
#define D_TX20_WIND_SPEED_MAX "Maximálna rýchlosť vetra"
#define D_TX20_NORTH "S"
#define D_TX20_EAST "V"
#define D_TX20_SOUTH "J"
#define D_TX20_WEST "Z"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -644,12 +675,12 @@
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Total Reactive"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_SK_SK_H_
diff --git a/tasmota/language/sv-SE.h b/tasmota/language/sv-SE.h
index 117fb40ed..df64cf2e3 100644
--- a/tasmota/language/sv-SE.h
+++ b/tasmota/language/sv-SE.h
@@ -1,7 +1,7 @@
/*
sv-SE.h - localization for Swedish - Svenska for Tasmota
- Copyright (C) 2019 Gunnar Norin
+ Copyright (C) 2020 Gunnar Norin
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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Räkna"
#define D_COUNTER "Räknare"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Ström" // As in Voltage and Current
#define D_DATA "Data"
#define D_DARKLIGHT "Mörkt"
#define D_DEBUG "Debug"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Inaktiverad"
#define D_DISTANCE "Distans"
#define D_DNS_SERVER "DNS-server"
#define D_DONE "Gjort"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulation"
#define D_ENABLED "Aktiverad"
#define D_ERASE "Ta bort"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Programstorlek"
#define D_PROJECT "Projekt"
#define D_RAIN "Regn"
+#define D_RANGE "Range"
#define D_RECEIVED "Mottagen"
#define D_RESTART "Omstart"
#define D_RESTARTING "Startar om"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Vindriktning"
#define D_TX20_WIND_SPEED "Vindstyrka"
-#define D_TX20_WIND_SPEED_AVG "Vindstyrka medel"
+#define D_TX20_WIND_SPEED_MIN "Vindstyrka min"
#define D_TX20_WIND_SPEED_MAX "Vindstyrka max"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "Ö"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "V"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
@@ -644,12 +675,12 @@
#define D_UNIT_INCREMENTS "ink"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Fasvinkel"
#define D_IMPORT_ACTIVE "Import aktiv"
#define D_EXPORT_ACTIVE "Export aktiv"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Total reaktiv"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total aktiv"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_SV_SE_H_
diff --git a/tasmota/language/tr-TR.h b/tasmota/language/tr-TR.h
index 9874688da..1366b9996 100644
--- a/tasmota/language/tr-TR.h
+++ b/tasmota/language/tr-TR.h
@@ -1,7 +1,7 @@
/*
tr-TR.h - localization for Turkish - Turkey for Tasmota
- Copyright (C) 2019 Ali Sait Teke and Theo Arends
+ Copyright (C) 2020 Ali Sait Teke 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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Sayı"
#define D_COUNTER "Sayaç"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Current" // As in Voltage and Current
#define D_DATA "Data"
#define D_DARKLIGHT "Karanlık"
#define D_DEBUG "Hata Ayıklama"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "Etkin Değil"
#define D_DISTANCE "Mesage"
#define D_DNS_SERVER "DNS Sunucu"
#define D_DONE "Tamam"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Emülasyon"
#define D_ENABLED "Etkin"
#define D_ERASE "Temizle"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "Yazılım Boyutu"
#define D_PROJECT "Proje"
#define D_RAIN "Rain"
+#define D_RANGE "Range"
#define D_RECEIVED "Alınan"
#define D_RESTART "Yeniden Başlat"
#define D_RESTARTING "Yeniden Başlatılıyor"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Wind Direction"
#define D_TX20_WIND_SPEED "Wind Speed"
-#define D_TX20_WIND_SPEED_AVG "Wind Speed Avg"
+#define D_TX20_WIND_SPEED_MIN "Wind Speed Min"
#define D_TX20_WIND_SPEED_MAX "Wind Speed Max"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "W"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,23 +656,31 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HERTZ "Hz"
-#define D_UNIT_HOUR "Hr"
+#define D_UNIT_HOUR "h"
#define D_UNIT_GALLONS "gal"
#define D_UNIT_GALLONS_PER_MIN "g/m"
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
-#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
-#define D_UNIT_MICROMETER "um"
-#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
+#define D_UNIT_MICROMETER "µm"
+#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Total Reactive"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_TR_TR_H_
diff --git a/tasmota/language/uk-UK.h b/tasmota/language/uk-UA.h
similarity index 78%
rename from tasmota/language/uk-UK.h
rename to tasmota/language/uk-UA.h
index dbf58fe35..2e3c4c077 100644
--- a/tasmota/language/uk-UK.h
+++ b/tasmota/language/uk-UA.h
@@ -1,7 +1,7 @@
/*
- uk-UK.h - localization for Ukrainian - Ukraine for Tasmota
+ uk-UA.h - localization for Ukrainian - Ukraine for Tasmota
- Copyright (C) 2019 Theo Arends / vadym-adik
+ Copyright (C) 2020 Theo Arends / vadym-adik
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
@@ -17,8 +17,8 @@
along with this program. If not, see .
*/
-#ifndef _LANGUAGE_UK_UK_H_
-#define _LANGUAGE_UK_UK_H_
+#ifndef _LANGUAGE_UK_UA_H_
+#define _LANGUAGE_UK_UA_H_
/*************************** ATTENTION *******************************\
*
@@ -51,7 +51,7 @@
#define D_DECIMAL_SEPARATOR ","
// Common
-#define D_ADMIN "Admin"
+#define D_ADMIN "Адміністратор"
#define D_AIR_QUALITY "Якість повітря"
#define D_AP "Точка доступу" // Access Point
#define D_AS "як"
@@ -63,7 +63,7 @@
#define D_BSSID "BSSId"
#define D_BUTTON "Кнопка"
#define D_BY " " // Written by me
-#define D_BYTES "Байт"
+#define D_BYTES "Байтів"
#define D_CELSIUS "Цельсія"
#define D_CHANNEL "Канал"
#define D_CO2 "Вуглек. газ"
@@ -71,27 +71,29 @@
#define D_COLDLIGHT "Холодний"
#define D_COMMAND "Команда"
#define D_CONNECTED "Під'єднано"
-#define D_CORS_DOMAIN "CORS Domain"
-#define D_COUNT "Розмір"
+#define D_CORS_DOMAIN "Домен CORS"
+#define D_COUNT "разів"
#define D_COUNTER "Лічильник"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "Струм" // As in Voltage and Current
#define D_DATA "Дані"
#define D_DARKLIGHT "Темний"
#define D_DEBUG "Налагодження"
-#define D_DISABLED "Заблоковано"
+#define D_DEWPOINT "Dew point"
+#define D_DISABLED "Вимкнено"
#define D_DISTANCE "Відстань"
#define D_DNS_SERVER "Сервер DNS"
#define D_DONE "Виконано"
#define D_DST_TIME "Літній час"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "Емуляція"
-#define D_ENABLED "Активно"
+#define D_ENABLED "Увімкнено"
#define D_ERASE "Стирати"
#define D_ERROR "Помилка"
#define D_FAHRENHEIT "Фаренгейт"
#define D_FAILED "Невдало"
-#define D_FALLBACK "Зворотній зв'язок"
-#define D_FALLBACK_TOPIC "Топік зворотнього зв'язку"
+#define D_FALLBACK "Запасний"
+#define D_FALLBACK_TOPIC "Запасний топік"
#define D_FALSE "Ні"
#define D_FILE "Файл"
#define D_FLOW_RATE "Потік"
@@ -106,36 +108,37 @@
#define D_ILLUMINANCE "Освітленність"
#define D_IMMEDIATE "Негайно" // Button immediate
#define D_INDEX "Індекс"
-#define D_INFO "Інфо"
+#define D_INFO "Інформація"
#define D_INFRARED "Інфрачервоний"
#define D_INITIALIZED "Ініціалізовано"
#define D_IP_ADDRESS "IP адреса"
#define D_LIGHT "Світло"
#define D_LWT "LWT"
#define D_MODULE "Модуль"
-#define D_MOISTURE "Moisture"
+#define D_MOISTURE "Волога"
#define D_MQTT "MQTT"
#define D_MULTI_PRESS "Багаторазове натискання"
#define D_NOISE "Шум"
#define D_NONE "Нічого"
-#define D_OFF "Вимк."
-#define D_OFFLINE "Офф-лайн"
+#define D_OFF "Вимкнено"
+#define D_OFFLINE "Неактивний"
#define D_OK "Ок"
-#define D_ON "Увімк."
-#define D_ONLINE "Он-лайн"
+#define D_ON "Увімкнено"
+#define D_ONLINE "Активний"
#define D_PASSWORD "Гасло"
#define D_PORT "Порт"
#define D_POWER_FACTOR "Коефіцієнт потужності"
#define D_POWERUSAGE "Потужність"
#define D_POWERUSAGE_ACTIVE "Активна потужність"
-#define D_POWERUSAGE_APPARENT "Дійсна потужність"
+#define D_POWERUSAGE_APPARENT "Загальна потужність"
#define D_POWERUSAGE_REACTIVE "Реактивна потужність"
#define D_PRESSURE "Тиск"
#define D_PRESSUREATSEALEVEL "Тиск на рівні моря"
#define D_PROGRAM_FLASH_SIZE "Розмір Flash для програм"
-#define D_PROGRAM_SIZE "Розмір програм"
+#define D_PROGRAM_SIZE "Розмір програми"
#define D_PROJECT "Проект"
#define D_RAIN "Дощ"
+#define D_RANGE "Range"
#define D_RECEIVED "Отримано"
#define D_RESTART "Перезавантаження"
#define D_RESTARTING "Перезавантаження"
@@ -194,7 +197,7 @@
#define D_SET_BAUDRATE_TO "Встановити швидкість передачі (Baudrate)"
#define D_RECEIVED_TOPIC "Отриманий Топік"
#define D_DATA_SIZE "Розмір даних"
-#define D_ANALOG_INPUT "Напруга"
+#define D_ANALOG_INPUT "Аналоговий вхід"
// support.ino
#define D_OSWATCH "osWatch"
@@ -203,7 +206,7 @@
#define D_ACTIVE_FOR_3_MINUTES "активний протягом 3 хвилин"
#define D_FAILED_TO_START "не вдалось запустити"
#define D_PATCH_ISSUE_2186 "Проблема з виправленням 2186"
-#define D_CONNECTING_TO_AP "Підключення до AP"
+#define D_CONNECTING_TO_AP "Підключення до Точки Доступу"
#define D_IN_MODE "в режимі"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Помилка підключення, IP-адреса не отримана"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Помилка з'єднання, AP не знайдено"
@@ -213,12 +216,12 @@
#define D_CHECKING_CONNECTION "Перевірка з'єднання..."
#define D_QUERY_DONE "Запит виконаний. Виявлено сервер MQTT"
#define D_MQTT_SERVICE_FOUND "MQTT сервер знайдено"
-#define D_FOUND_AT "знайдено в"
+#define D_FOUND_AT "знайдено за адресою"
#define D_SYSLOG_HOST_NOT_FOUND "Сервер журналу не знайдено"
// settings.ino
-#define D_SAVED_TO_FLASH_AT "Збережено в флэш-пам'ять"
-#define D_LOADED_FROM_FLASH_AT "Завантажено з флэш-пам'яті"
+#define D_SAVED_TO_FLASH_AT "Збережено в Flash-пам'ять"
+#define D_LOADED_FROM_FLASH_AT "Завантажено з Flash-пам'яті"
#define D_USE_DEFAULTS "Використовувати значення за замовчуванням"
#define D_ERASED_SECTOR "Стерто сектор"
@@ -230,7 +233,7 @@
#define D_WEBSERVER_STOPPED "Веб-сервер зупинений"
#define D_FILE_NOT_FOUND "Файл не знайдений"
#define D_REDIRECTED "Перенаправлено на адаптивний портал"
-#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifi менеджер встановлює Точку Доступу і зберігає параметри"
+#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifi менеджер встановлює Точку Доступу і станцію"
#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifi менеджер встановив Точку Доступу"
#define D_TRYING_TO_CONNECT "Спроба підключення пристрою до мережі"
@@ -286,24 +289,24 @@
#define D_LOGGING_PARAMETERS "Параметри журналу"
#define D_SERIAL_LOG_LEVEL "Serial рівень"
-#define D_MQTT_LOG_LEVEL "Mqtt log level"
+#define D_MQTT_LOG_LEVEL "Mqtt рівень"
#define D_WEB_LOG_LEVEL "Web рівень"
-#define D_SYS_LOG_LEVEL "System рівень"
+#define D_SYS_LOG_LEVEL "Syslog рівень"
#define D_MORE_DEBUG "Додаткова інформація для налагодження"
-#define D_SYSLOG_HOST "System хост"
-#define D_SYSLOG_PORT "System порт"
+#define D_SYSLOG_HOST "Syslog хост"
+#define D_SYSLOG_PORT "Syslog порт"
#define D_TELEMETRY_PERIOD "Період телеметрії"
#define D_OTHER_PARAMETERS "Параметри Інше"
#define D_TEMPLATE "Шаблони"
-#define D_ACTIVATE "Activate"
-#define D_WEB_ADMIN_PASSWORD "Гасло Web адміністратора"
+#define D_ACTIVATE "Активований"
+#define D_WEB_ADMIN_PASSWORD "Гасло адміністратора Web"
#define D_MQTT_ENABLE "MQTT активний"
-#define D_FRIENDLY_NAME "Дружнє Ім'я"
+#define D_FRIENDLY_NAME "Дружня назва"
#define D_BELKIN_WEMO "Belkin WeMo"
-#define D_HUE_BRIDGE "Hue Bridge"
-#define D_SINGLE_DEVICE "одиночне"
-#define D_MULTI_DEVICE "мульти"
+#define D_HUE_BRIDGE "Міст Hue"
+#define D_SINGLE_DEVICE "один пристрій"
+#define D_MULTI_DEVICE "декілька пристроїв"
#define D_CONFIGURE_TEMPLATE "Конфігурація шаблона"
#define D_TEMPLATE_PARAMETERS "Параметри шаблона"
@@ -328,14 +331,14 @@
#define D_MQTT_GROUP_TOPIC "MQTT Топік групи"
#define D_MQTT_FULL_TOPIC "MQTT Топік повний"
#define D_MDNS_DISCOVERY "mDNS Виявлення"
-#define D_MDNS_ADVERTISE "mDNS Транcляція"
+#define D_MDNS_ADVERTISE "mDNS Анонс"
#define D_ESP_CHIP_ID "ID чипу ESP"
#define D_FLASH_CHIP_ID "ID чипу Flash пам'яті"
#define D_FLASH_CHIP_SIZE "Розмір Flash пам'яті"
#define D_FREE_PROGRAM_SPACE "Вільний простір для програм"
#define D_UPGRADE_BY_WEBSERVER "Оновлення через Веб-сервер"
-#define D_OTA_URL "OTA Url"
+#define D_OTA_URL "OTA URL"
#define D_START_UPGRADE "Почати оновлення"
#define D_UPGRADE_BY_FILE_UPLOAD "Оновлення шляхом завантаження файлів"
#define D_UPLOAD_STARTED "Завантаження почалось"
@@ -350,11 +353,11 @@
#define D_UPLOAD_ERR_7 "Завантаження перервано"
#define D_UPLOAD_ERR_8 "Файл невірний"
#define D_UPLOAD_ERR_9 "Занадто великий файл"
-#define D_UPLOAD_ERR_10 "Помилка ініціалізаціції чипу FR"
+#define D_UPLOAD_ERR_10 "Помилка ініціалізаціції чипу RF"
#define D_UPLOAD_ERR_11 "Помилка стирання чипу RF"
#define D_UPLOAD_ERR_12 "Помилка запису чипу RF"
#define D_UPLOAD_ERR_13 "Помилка розкодування прошивки RF"
-#define D_UPLOAD_ERR_14 "Not compatible"
+#define D_UPLOAD_ERR_14 "Не сумісно"
#define D_UPLOAD_ERROR_CODE "Код помилки завантаження"
#define D_ENTER_COMMAND "Уведіть команду"
@@ -363,7 +366,7 @@
// xdrv_01_mqtt.ino
#define D_FINGERPRINT "Перевірка відбитка TLS..."
-#define D_TLS_CONNECT_FAILED_TO "Збій підключення TLS до"
+#define D_TLS_CONNECT_FAILED_TO "Збій TLS підключення до"
#define D_RETRY_IN "Повторити"
#define D_VERIFIED "Перевірено відбиток"
#define D_INSECURE "Небезпечне з'єднання, недійсний відбиток"
@@ -414,7 +417,7 @@
#define D_TIMER_ARM "Увімкнений"
#define D_TIMER_TIME "Час"
#define D_TIMER_DAYS "Дні"
-#define D_TIMER_REPEAT "Повтор"
+#define D_TIMER_REPEAT "Повторення"
#define D_TIMER_OUTPUT "Вихід"
#define D_TIMER_ACTION "Дія"
@@ -459,9 +462,9 @@
#define D_DEVICE_OUTPUT "Output"
// xsns_05_ds18b20.ino
-#define D_SENSOR_BUSY "Датчик DS18x20 зайнятий"
-#define D_SENSOR_CRC_ERROR "Датчик DS18x20 - помилка CRC"
-#define D_SENSORS_FOUND "Датчик DS18x20 знайдено"
+#define D_SENSOR_BUSY "Давач DS18x20 зайнятий"
+#define D_SENSOR_CRC_ERROR "Давач DS18x20 - помилка CRC"
+#define D_SENSORS_FOUND "Давач DS18x20 знайдено"
// xsns_06_dht.ino
#define D_TIMEOUT_WAITING_FOR "Тайм-аут, в очікуванні"
@@ -471,7 +474,7 @@
#define D_CHECKSUM_FAILURE "Помилка контрольної суми"
// xsns_07_sht1x.ino
-#define D_SENSOR_DID_NOT_ACK_COMMAND "Датчик не підтвердив отримання команди"
+#define D_SENSOR_DID_NOT_ACK_COMMAND "Давач не підтвердив отримання команди"
#define D_SHT1X_FOUND "SHT1X знайдено"
// xsns_18_pms5003.ino
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Напрям вітру"
#define D_TX20_WIND_SPEED "Швидкість вітру"
-#define D_TX20_WIND_SPEED_AVG "Середня швидкість вітру"
+#define D_TX20_WIND_SPEED_MIN "Мінімальна швидкість вітру"
#define D_TX20_WIND_SPEED_MAX "Максимальна швидкість вітру"
#define D_TX20_NORTH "Пн"
#define D_TX20_EAST "Сх"
#define D_TX20_SOUTH "Пд"
#define D_TX20_WEST "Зх"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "Користувач"
@@ -543,7 +566,7 @@
#define D_SENSOR_SPI_MISO "SPI MISO"
#define D_SENSOR_SPI_MOSI "SPI MOSI"
#define D_SENSOR_SPI_CLK "SPI CLK"
-#define D_SENSOR_BACKLIGHT "Backlight"
+#define D_SENSOR_BACKLIGHT "OLED Light"
#define D_SENSOR_PMS5003 "PMS5003"
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
@@ -562,9 +585,9 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
-#define D_SENSOR_RFRECV "RFrecv"
+#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"
@@ -628,47 +651,55 @@
#define D_SENSOR_SM2135_DAT "SM2135 Dat"
#define D_SENSOR_DEEPSLEEP "DeepSleep"
#define D_SENSOR_EXS_ENABLE "EXS Enable"
-#define D_SENSOR_SLAVE_TX "Slave TX"
-#define D_SENSOR_SLAVE_RX "Slave RX"
-#define D_SENSOR_SLAVE_RESET "Slave RST"
+#define D_SENSOR_SLAVE_TX "Slave TX"
+#define D_SENSOR_SLAVE_RX "Slave RX"
+#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
-#define D_UNIT_AMPERE "А"
-#define D_UNIT_CENTIMETER "cм"
-#define D_UNIT_HERTZ "Гц"
-#define D_UNIT_HOUR "Г"
-#define D_UNIT_GALLONS "гал"
-#define D_UNIT_GALLONS_PER_MIN "g/m"
-#define D_UNIT_INCREMENTS "inc"
-#define D_UNIT_KILOGRAM "кг"
-#define D_UNIT_KILOMETER_PER_HOUR "км/г" // or "km/h"
-#define D_UNIT_KILOOHM "кОм"
-#define D_UNIT_KILOWATTHOUR "кВт"
-#define D_UNIT_LUX "лк"
-#define D_UNIT_MICROGRAM_PER_CUBIC_METER "мкг/м3"
-#define D_UNIT_MICROMETER "мкм"
-#define D_UNIT_MICROSECOND "мкс"
-#define D_UNIT_MILLIAMPERE "мА"
-#define D_UNIT_MILLIMETER "мм"
-#define D_UNIT_MILLIMETER_MERCURY "ммHg"
-#define D_UNIT_MILLISECOND "мс"
-#define D_UNIT_MINUTE "хв"
-#define D_UNIT_PARTS_PER_BILLION "ppb"
-#define D_UNIT_PARTS_PER_DECILITER "ppd"
-#define D_UNIT_PARTS_PER_MILLION "ppm"
-#define D_UNIT_PRESSURE "гПа"
-#define D_UNIT_SECOND "сек"
-#define D_UNIT_SECTORS "секторів"
-#define D_UNIT_VA "ВА"
-#define D_UNIT_VAR "ВАр"
-#define D_UNIT_VOLT "В"
-#define D_UNIT_WATT "Вт"
-#define D_UNIT_WATTHOUR "Вт/Год"
-#define D_UNIT_WATT_METER_QUADRAT "Вт/m²"
+#define D_UNIT_AMPERE "А"
+#define D_UNIT_CENTIMETER "cм"
+#define D_UNIT_HERTZ "Гц"
+#define D_UNIT_HOUR "г"
+#define D_UNIT_GALLONS "гал"
+#define D_UNIT_GALLONS_PER_MIN "гал/хв"
+#define D_UNIT_INCREMENTS "інк"
+#define D_UNIT_KILOGRAM "кг"
+#define D_UNIT_KILOMETER_PER_HOUR "км/г" // or "km/h"
+#define D_UNIT_KILOOHM "㏀"
+#define D_UNIT_KILOWATTHOUR "кВт/г"
+#define D_UNIT_LUX "лк"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µг/м³"
+#define D_UNIT_MICROMETER "µм"
+#define D_UNIT_MICROSECOND "µС"
+#define D_UNIT_MILLIAMPERE "мА"
+#define D_UNIT_MILLIMETER "мм"
+#define D_UNIT_MILLIMETER_MERCURY "ммHg"
+#define D_UNIT_MILLISECOND "мС"
+#define D_UNIT_MINUTE "хв"
+#define D_UNIT_PARTS_PER_BILLION "млрд⁻¹"
+#define D_UNIT_PARTS_PER_DECILITER "децилітр⁻¹"
+#define D_UNIT_PARTS_PER_MILLION "млн⁻¹"
+#define D_UNIT_PRESSURE "гПа"
+#define D_UNIT_SECOND "сек"
+#define D_UNIT_SECTORS "секторів"
+#define D_UNIT_VA "ВА"
+#define D_UNIT_VAR "ВАр"
+#define D_UNIT_VOLT "В"
+#define D_UNIT_WATT "Вт"
+#define D_UNIT_WATTHOUR "Вт/г"
+#define D_UNIT_WATT_METER_QUADRAT "Вт/м²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Кут фази"
#define D_IMPORT_ACTIVE "Активна вхід"
#define D_EXPORT_ACTIVE "Активна вихід"
@@ -677,29 +708,43 @@
#define D_TOTAL_REACTIVE "Всього реактивна"
#define D_UNIT_KWARH "кВАр/г"
#define D_UNIT_ANGLE "Град"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
-#define D_PV1_VOLTAGE "PV1 Voltage"
-#define D_PV1_CURRENT "PV1 Current"
-#define D_PV1_POWER "PV1 Power"
-#define D_PV2_VOLTAGE "PV2 Voltage"
-#define D_PV2_CURRENT "PV2 Current"
-#define D_PV2_POWER "PV2 Power"
-#define D_SOLAR_POWER "Solar Power"
-#define D_INVERTER_POWER "Inverter Power"
-#define D_STATUS "Status"
-#define D_WAITING "Waiting"
-#define D_CHECKING "Checking"
-#define D_WORKING "Working"
-#define D_FAILURE "Failure"
-#define D_SOLAX_ERROR_0 "No Error Code"
-#define D_SOLAX_ERROR_1 "Grid Lost Fault"
-#define D_SOLAX_ERROR_2 "Grid Voltage Fault"
-#define D_SOLAX_ERROR_3 "Grid Frequency Fault"
-#define D_SOLAX_ERROR_4 "Pv Voltage Fault"
-#define D_SOLAX_ERROR_5 "Isolation Fault"
-#define D_SOLAX_ERROR_6 "Over Temperature Fault"
-#define D_SOLAX_ERROR_7 "Fan Fault"
-#define D_SOLAX_ERROR_8 "Other Device Fault"
+#define D_PV1_VOLTAGE "PV1 Напруга"
+#define D_PV1_CURRENT "PV1 Струм"
+#define D_PV1_POWER "PV1 Потужність"
+#define D_PV2_VOLTAGE "PV2 Напруга"
+#define D_PV2_CURRENT "PV2 Струм"
+#define D_PV2_POWER "PV2 Потужність"
+#define D_SOLAR_POWER "Solar Потужність"
+#define D_INVERTER_POWER "Inverter Потужність"
+#define D_STATUS "Стан"
+#define D_WAITING "Очікування"
+#define D_CHECKING "Перевірка"
+#define D_WORKING "Працює"
+#define D_FAILURE "Помилка"
+#define D_SOLAX_ERROR_0 "Немає помилки"
+#define D_SOLAX_ERROR_1 "Втрата мережі"
+#define D_SOLAX_ERROR_2 "Напруга мережі"
+#define D_SOLAX_ERROR_3 "Частота мережі"
+#define D_SOLAX_ERROR_4 "Напруга Pv"
+#define D_SOLAX_ERROR_5 "Ізоляція"
+#define D_SOLAX_ERROR_6 "Перегрів"
+#define D_SOLAX_ERROR_7 "Вентилятор"
+#define D_SOLAX_ERROR_8 "Інший пристрій"
-#endif // _LANGUAGE_UK_UK_H_
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Конфігурація сценарія"
+#define D_SCRIPT "Редагування сценарія"
+#define D_SDCARD_UPLOAD "завантажити файл на карту SD"
+#define D_SDCARD_DIR "завантажити файл в каталог на карту SD"
+#define D_UPL_DONE "Готово"
+#define D_SCRIPT_CHARS_LEFT "символів ще вільно"
+#define D_SCRIPT_CHARS_NO_MORE "більше немає місця"
+#define D_SCRIPT_DOWNLOAD "Звантажити"
+#define D_SCRIPT_ENABLE "Сценарій увімкнено"
+#define D_SCRIPT_UPLOAD "Завантажити"
+#define D_SCRIPT_UPLOAD_FILES "Завантажити файли"
+
+#endif // _LANGUAGE_UK_UA_H_
diff --git a/tasmota/language/zh-CN.h b/tasmota/language/zh-CN.h
index 7700e7e78..c59cb7a57 100644
--- a/tasmota/language/zh-CN.h
+++ b/tasmota/language/zh-CN.h
@@ -1,7 +1,7 @@
/*
zh-CN.h - localization for Chinese (Simplified) - China for Tasmota
- Copyright (C) 2019 Theo Arends (translated by killadm)
+ Copyright (C) 2020 Theo Arends (translated by killadm)
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
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "数量:"
#define D_COUNTER "计数器"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "电流" // As in Voltage and Current
#define D_DATA "数据:"
#define D_DARKLIGHT "暗"
#define D_DEBUG "调试"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "禁用"
#define D_DISTANCE "距离"
#define D_DNS_SERVER "DNS服务器"
#define D_DONE "完成"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "设备模拟"
#define D_ENABLED "启用"
#define D_ERASE "擦除"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "固件大小"
#define D_PROJECT "项目:"
#define D_RAIN "降水量"
+#define D_RANGE "Range"
#define D_RECEIVED "已接收"
#define D_RESTART "重启"
#define D_RESTARTING "正在重启"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "风向"
#define D_TX20_WIND_SPEED "风速"
-#define D_TX20_WIND_SPEED_AVG "平均风速"
+#define D_TX20_WIND_SPEED_MIN "最低风速"
#define D_TX20_WIND_SPEED_MAX "最高风速"
#define D_TX20_NORTH "北"
#define D_TX20_EAST "东"
#define D_TX20_SOUTH "南"
#define D_TX20_WEST "西"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "安"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "瓦时"
#define D_UNIT_WATT_METER_QUADRAT "瓦/平米"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "相位角"
#define D_IMPORT_ACTIVE "有功输入"
#define D_EXPORT_ACTIVE "有功输出"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "总无功功率"
#define D_UNIT_KWARH "千乏时"
#define D_UNIT_ANGLE "度"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_ZH_CN_H_
diff --git a/tasmota/language/zh-TW.h b/tasmota/language/zh-TW.h
index 34bb68e3d..6ef104bec 100644
--- a/tasmota/language/zh-TW.h
+++ b/tasmota/language/zh-TW.h
@@ -1,7 +1,7 @@
/*
zh-TW.h - localization for Chinese (Traditional) - Taiwan for Tasmota
- Copyright (C) 2019 Theo Arends (translated by dannydu)
+ Copyright (C) 2020 Theo Arends (translated by dannydu)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -74,16 +74,18 @@
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "數量:"
#define D_COUNTER "Counter"
+#define D_CT_POWER "CT Power"
#define D_CURRENT "電流" // As in Voltage and Current
#define D_DATA "數據:"
#define D_DARKLIGHT "Dark"
#define D_DEBUG "除錯"
+#define D_DEWPOINT "Dew point"
#define D_DISABLED "停用"
#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS伺服器"
#define D_DONE "完成"
#define D_DST_TIME "DST"
-#define D_ECO2 "eCO2"
+#define D_ECO2 "eCO₂"
#define D_EMULATION "設備模擬"
#define D_ENABLED "啟用"
#define D_ERASE "刪除"
@@ -136,6 +138,7 @@
#define D_PROGRAM_SIZE "韌體大小"
#define D_PROJECT "項目:"
#define D_RAIN "Rain"
+#define D_RANGE "Range"
#define D_RECEIVED "已接收"
#define D_RESTART "重啟"
#define D_RESTARTING "正在重啟"
@@ -503,13 +506,33 @@
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Wind Direction"
#define D_TX20_WIND_SPEED "Wind Speed"
-#define D_TX20_WIND_SPEED_AVG "Wind Speed Avg"
+#define D_TX20_WIND_SPEED_MIN "Wind Speed Min"
#define D_TX20_WIND_SPEED_MAX "Wind Speed Max"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "E"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "W"
+// xsns_53_sml.ino
+#define D_TPWRIN "Energy Total-In"
+#define D_TPWROUT "Energy Total-Out"
+#define D_TPWRCURR "Active Power-In/Out"
+#define D_TPWRCURR1 "Active Power-In p1"
+#define D_TPWRCURR2 "Active Power-In p2"
+#define D_TPWRCURR3 "Active Power-In p3"
+#define D_Strom_L1 "Current L1"
+#define D_Strom_L2 "Current L2"
+#define D_Strom_L3 "Current L3"
+#define D_Spannung_L1 "Voltage L1"
+#define D_Spannung_L2 "Voltage L2"
+#define D_Spannung_L3 "Voltage L3"
+#define D_METERNR "Meter_number"
+#define D_METERSID "Service ID"
+#define D_GasIN "Counter"
+#define D_H2oIN "Counter"
+#define D_StL1L2L3 "Current L1+L2+L3"
+#define D_SpL1L2L3 "Voltage L1+L2+L3/3"
+
// tasmota_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_USER "User"
@@ -562,7 +585,7 @@
#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_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFSend"
#define D_SENSOR_RFRECV "RFrecv"
#define D_SENSOR_TUYA_TX "Tuya Tx"
@@ -633,6 +656,14 @@
#define D_SENSOR_SLAVE_RESET "Slave RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
+#define D_SENSOR_HM10_RX "HM10 RX"
+#define D_SENSOR_HM10_TX "HM10 TX"
+#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
+#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
+#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
+#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
+#define D_SENSOR_HRXL_RX "HRXL Rx"
+#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
// Units
#define D_UNIT_AMPERE "安"
@@ -668,7 +699,7 @@
#define D_UNIT_WATTHOUR "瓦時"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220
+//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
@@ -677,6 +708,7 @@
#define D_TOTAL_REACTIVE "Total Reactive"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
+#define D_TOTAL_ACTIVE "Total Active"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Voltage"
@@ -702,4 +734,17 @@
#define D_SOLAX_ERROR_7 "Fan Fault"
#define D_SOLAX_ERROR_8 "Other Device Fault"
+//xdrv_10_scripter.ino
+#define D_CONFIGURE_SCRIPT "Edit script"
+#define D_SCRIPT "edit script"
+#define D_SDCARD_UPLOAD "file upload"
+#define D_SDCARD_DIR "sd card directory"
+#define D_UPL_DONE "Done"
+#define D_SCRIPT_CHARS_LEFT "chars left"
+#define D_SCRIPT_CHARS_NO_MORE "no more chars"
+#define D_SCRIPT_DOWNLOAD "Download"
+#define D_SCRIPT_ENABLE "script enable"
+#define D_SCRIPT_UPLOAD "Upload"
+#define D_SCRIPT_UPLOAD_FILES "Upload files"
+
#endif // _LANGUAGE_ZH_TW_H_
diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h
index 13e7c6c64..ab80c4cf6 100644
--- a/tasmota/my_user_config.h
+++ b/tasmota/my_user_config.h
@@ -1,7 +1,7 @@
/*
my_user_config.h - user specific configuration for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -53,7 +53,7 @@
//#define MODULE SONOFF_BASIC // [Module] Select default model from tasmota_template.h
#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 SAVE_STATE true // [SetOption0] Save changed power state to Flash (false = disable, true = enable)
#define BOOT_LOOP_OFFSET 1 // [SetOption36] Number of boot loops before starting restoring defaults (0 = disable, 1..200 = boot loops offset)
// -- Wifi ----------------------------------------
@@ -66,9 +66,12 @@
#define STA_PASS1 "" // [Password1] Wifi password
#define STA_SSID2 "" // [Ssid2] Optional alternate AP Wifi SSID
#define STA_PASS2 "" // [Password2] Optional alternate AP Wifi password
+#define WIFI_AP_PASSPHRASE "" // AccessPoint passphrase. For WPA2 min 8 char, for open use "" (max 63 char).
#define WIFI_CONFIG_TOOL WIFI_RETRY // [WifiConfig] Default tool if wifi fails to connect (default option: 4 - WIFI_RETRY)
// (WIFI_RESTART, WIFI_MANAGER, WIFI_RETRY, WIFI_WAIT, WIFI_SERIAL, WIFI_MANAGER_RESET_ONLY)
// The configuration can be changed after first setup using WifiConfig 0, 2, 4, 5, 6 and 7.
+#define WIFI_SCAN_AT_RESTART false // [SetOption56] Scan wifi network at restart for configured AP's
+#define WIFI_SCAN_REGULARLY false // [SetOption57] Scan wifi network every 44 minutes for configured AP's
// -- Syslog --------------------------------------
#define SYS_LOG_HOST "" // [LogHost] (Linux) syslog host
@@ -80,9 +83,10 @@
// -- Ota -----------------------------------------
#define OTA_URL "http://thehackbox.org/tasmota/release/tasmota.bin" // [OtaUrl]
+#define OTA_COMPATIBILITY false // [SetOption78] Disable OTA compatibility check
// -- MQTT ----------------------------------------
-#define MQTT_USE 1 // [SetOption3] Select default MQTT use (0 = Off, 1 = On)
+#define MQTT_USE true // [SetOption3] Select default MQTT use (false = Off, true = On)
#define MQTT_HOST "" // [MqttHost]
#define MQTT_FINGERPRINT1 "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" // [MqttFingerprint1]
@@ -91,10 +95,12 @@
#define MQTT_USER "DVES_USER" // [MqttUser] MQTT user
#define MQTT_PASS "DVES_PASS" // [MqttPassword] MQTT password
-#define MQTT_BUTTON_RETAIN 0 // [ButtonRetain] Button may send retain flag (0 = off, 1 = on)
-#define MQTT_POWER_RETAIN 0 // [PowerRetain] Power status message may send retain flag (0 = off, 1 = on)
-#define MQTT_SWITCH_RETAIN 0 // [SwitchRetain] Switch may send retain flag (0 = off, 1 = on)
-#define MQTT_BUTTON_SWITCH_FORCE_LOCAL 0 // [SetOption61] Force local operation when button/switch topic is set (0 = off, 1 = on)
+#define MQTT_BUTTON_RETAIN false // [ButtonRetain] Button may send retain flag (false = off, true = on)
+#define MQTT_POWER_RETAIN false // [PowerRetain] Power status message may send retain flag (false = off, true = on)
+#define MQTT_SWITCH_RETAIN false // [SwitchRetain] Switch may send retain flag (false = off, true = on)
+#define MQTT_SENSOR_RETAIN false // [SensorRetain] Sensor may send retain flag (false = off, true = on)
+#define MQTT_NO_HOLD_RETAIN false // [SetOption62] Disable retain flag on HOLD messages
+//#define MQTT_NO_RETAIN // Disable all retain flags (including LWT!) if unsupported by broker (eg Losant)
#define MQTT_STATUS_OFF "OFF" // [StateText1] Command or Status result when turned off (needs to be a string like "0" or "Off")
#define MQTT_STATUS_ON "ON" // [StateText2] Command or Status result when turned on (needs to be a string like "1" or "On")
@@ -111,21 +117,32 @@
#define PUB_PREFIX2 "tele" // [Prefix3] Tasmota devices publish telemetry data to %prefix%/%topic% being PUB_PREFIX2/MQTT_TOPIC/UPTIME, POWER and TIME
// May be named the same as PUB_PREFIX
// %topic% token options (also ButtonTopic and SwitchTopic)
-#define MQTT_TOPIC PROJECT // [Topic] (unique) MQTT device topic, set to 'PROJECT "_%06X"' for unique topic including device MAC address
+#define MQTT_TOPIC PROJECT "_%06X" // [Topic] unique MQTT device topic including device MAC address
#define MQTT_GRPTOPIC "tasmotas" // [GroupTopic] MQTT Group topic
+#define MQTT_GROUPTOPIC_FORMAT false // [SetOption75] GroupTopic replaces %topic% (false) or fixed topic cmnd/grouptopic (true)
#define MQTT_BUTTON_TOPIC "0" // [ButtonTopic] MQTT button topic, "0" = same as MQTT_TOPIC, set to 'PROJECT "_BTN_%06X"' for unique topic including device MAC address
#define MQTT_SWITCH_TOPIC "0" // [SwitchTopic] MQTT button topic, "0" = same as MQTT_TOPIC, set to 'PROJECT "_SW_%06X"' for unique topic including device MAC address
#define MQTT_CLIENT_ID "DVES_%06X" // [MqttClient] Also fall back topic using Chip Id = last 6 characters of MAC address
// -- MQTT - Telemetry ----------------------------
#define TELE_PERIOD 300 // [TelePeriod] Telemetry (0 = disable, 10 - 3600 seconds)
-#define TELE_ON_POWER 0 // [SetOption59] send tele/STATE together with stat/RESULT (0 = Disable, 1 = Enable)
+#define TELE_ON_POWER false // [SetOption59] send tele/STATE together with stat/RESULT (false = Disable, true = Enable)
// -- MQTT - Domoticz -----------------------------
#define DOMOTICZ_UPDATE_TIMER 0 // [DomoticzUpdateTimer] Send relay status (0 = disable, 1 - 3600 seconds)
// -- MQTT - Home Assistant Discovery -------------
-#define HOME_ASSISTANT_DISCOVERY_ENABLE 0 // [SetOption19] Home Assistant Discovery (0 = Disable, 1 = Enable)
+#define HOME_ASSISTANT_DISCOVERY_ENABLE false // [SetOption19] Home Assistant Discovery (false = Disable, true = Enable)
+#define HASS_AS_LIGHT false // [SetOption30] Enforce HAss autodiscovery as light
+
+// -- MQTT - Options ------------------------------
+#define MQTT_RESULT_COMMAND false // [SetOption4] Switch between MQTT RESULT or COMMAND
+#define MQTT_LWT_MESSAGE false // [SetOption10] Switch between MQTT LWT OFFLINE or empty message
+#define MQTT_POWER_FORMAT false // [SetOption26] Switch between POWER or POWER1 for single power devices
+#define MQTT_APPEND_TIMEZONE false // [SetOption52] Append timezone to JSON time
+#define MQTT_BUTTON_SWITCH_FORCE_LOCAL false // [SetOption61] Force local operation when button/switch topic is set (false = off, true = on)
+#define MQTT_INDEX_SEPARATOR false // [SetOption64] Enable "_" instead of "-" as sensor index separator
+#define MQTT_TUYA_RECEIVED false // [SetOption66] Enable TuyaMcuReceived messages over Mqtt
// -- HTTP ----------------------------------------
#define WEB_SERVER 2 // [WebServer] Web server (0 = Off, 1 = Start as User, 2 = Start as Admin)
@@ -134,6 +151,9 @@
#define EMULATION EMUL_NONE // [Emulation] Select Belkin WeMo (single relay/light) or Hue Bridge emulation (multi relay/light) (EMUL_NONE, EMUL_WEMO or EMUL_HUE)
#define CORS_DOMAIN "" // [Cors] CORS Domain for preflight requests
+// -- HTTP Options --------------------------------
+#define GUI_SHOW_HOSTNAME false // [SetOption53] Show hostname and IP address in GUI main menu
+
// -- HTTP GUI Colors -----------------------------
// HTML hex color codes. Only 3 and 6 digit hex string values are supported!! See https://www.w3schools.com/colors/colors_hex.asp
// Light theme - pre v7
@@ -181,8 +201,12 @@
#define COLOR_TIMER_TAB_BACKGROUND "#999" // [WebColor18] Config timer tab background color - Dark gray
#define COLOR_TITLE_TEXT "#eaeaea" // [WebColor19] Title text color - Very light gray
+// -- KNX -----------------------------------------
+#define KNX_ENABLED false // [Knx_Enabled] Enable KNX protocol
+#define KNX_ENHANCED false // [Knx_Enhanced] Enable KNX Enhanced Mode
+
// -- mDNS ----------------------------------------
-#define MDNS_ENABLED 0 // [SetOption55] Use mDNS (0 = Disable, 1 = Enable)
+#define MDNS_ENABLED false // [SetOption55] Use mDNS (false = Disable, true = Enable)
// -- Time - Up to three NTP servers in your region
#define NTP_SERVER1 "pool.ntp.org" // [NtpServer1] Select first NTP server by name or IP address (129.250.35.250)
@@ -214,28 +238,69 @@
#define APP_LEDSTATE LED_POWER // [LedState] Function of led
// (LED_OFF, LED_POWER, LED_MQTTSUB, LED_POWER_MQTTSUB, LED_MQTTPUB, LED_POWER_MQTTPUB, LED_MQTT, LED_POWER_MQTT)
#define APP_LEDMASK 0xFFFF // [LedMask] Assign Relay to Power led (0xFFFF is default)
+#define APP_ENABLE_LEDLINK false // [SetOption31] Enable link led blinking
+
#define APP_PULSETIME 0 // [PulseTime] Time in 0.1 Sec to turn off power for relay 1 (0 = disabled)
#define APP_POWERON_STATE POWER_ALL_SAVED // [PowerOnState] Power On Relay state
// (POWER_ALL_OFF, POWER_ALL_ON, POWER_ALL_SAVED_TOGGLE, POWER_ALL_SAVED, POWER_ALL_ALWAYS_ON, POWER_ALL_OFF_PULSETIME_ON)
#define APP_BLINKTIME 10 // [BlinkTime] Time in 0.1 Sec to blink/toggle power for relay 1
#define APP_BLINKCOUNT 10 // [BlinkCount] Number of blinks (0 = 32000)
+
+#define APP_NORMAL_SLEEP false // [SetOption60] Enable normal sleep instead of dynamic sleep
#define APP_SLEEP 0 // [Sleep] Sleep time to lower energy consumption (0 = Off, 1 - 250 mSec),
#define PWM_MAX_SLEEP 10 // Sleep will be lowered to this value when light is on, to avoid flickering
#define KEY_DEBOUNCE_TIME 50 // [ButtonDebounce] Number of mSeconds button press debounce time
#define KEY_HOLD_TIME 40 // [SetOption32] Number of 0.1 seconds to hold Button or external Pushbutton before sending HOLD message
-#define SWITCH_DEBOUNCE_TIME 50 // [SwitchDebounce] Number of mSeconds switch press debounce time
-#define SWITCH_MODE TOGGLE // [SwitchMode] TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE (the wall switch state)
-#define WS2812_LEDS 30 // [Pixels] Number of WS2812 LEDs to start with (max is 512)
+#define KEY_DISABLE_MULTIPRESS false // [SetOption1] Disable button multipress
+#define KEY_SWAP_DOUBLE_PRESS false // [SetOption11] Swap button single and double press functionality
+#define KEY_ONLY_SINGLE_PRESS false // [SetOption13] Enable only single press to speed up button press recognition
-#define TEMP_CONVERSION 0 // [SetOption8] Return temperature in (0 = Celsius or 1 = Fahrenheit)
-#define PRESSURE_CONVERSION 0 // [SetOption24] Return pressure in (0 = hPa or 1 = mmHg)
+#define SWITCH_DEBOUNCE_TIME 50 // [SwitchDebounce] Number of mSeconds switch press debounce time
+#define SWITCH_MODE TOGGLE // [SwitchMode] TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE, TOGGLEMULTI, FOLLOWMULTI, FOLLOWMULTI_INV (the wall switch state)
+
+#define TEMP_CONVERSION false // [SetOption8] Return temperature in (false = Celsius or true = Fahrenheit)
+#define PRESSURE_CONVERSION false // [SetOption24] Return pressure in (false = hPa or true = mmHg)
#define TEMP_RESOLUTION 1 // [TempRes] Maximum number of decimals (0 - 3) showing sensor Temperature
#define HUMIDITY_RESOLUTION 1 // [HumRes] Maximum number of decimals (0 - 3) showing sensor Humidity
#define PRESSURE_RESOLUTION 1 // [PressRes] Maximum number of decimals (0 - 3) showing sensor Pressure
#define ENERGY_RESOLUTION 3 // [EnergyRes] Maximum number of decimals (0 - 5) showing energy usage in kWh
#define CALC_RESOLUTION 3 // [CalcRes] Maximum number of decimals (0 - 7) used in commands ADD, SUB, MULT and SCALE
+#define APP_FLASH_CYCLE false // [SetOption12] Switch between dynamic or fixed slot flash save location
+#define APP_NO_RELAY_SCAN false // [SetOption63] Don't scan relay power state at restart
+#define APP_DISABLE_POWERCYCLE false // [SetOption65] Disable fast power cycle detection for device reset
+#define DEEPSLEEP_BOOTCOUNT false // [SetOption76] Enable incrementing bootcount when deepsleep is enabled
+
+// -- Lights --------------------------------------
+#define WS2812_LEDS 30 // [Pixels] Number of WS2812 LEDs to start with (max is 512)
+#define LIGHT_MODE true // [SetOption15] Switch between commands PWM or COLOR/DIMMER/CT/CHANNEL
+#define LIGHT_CLOCK_DIRECTION false // [SetOption16] Switch WS2812 clock between clockwise or counter-clockwise
+#define LIGHT_COLOR_RADIX false // [SetOption17] Switch between decimal or hexadecimal color output (false = hexadecimal, true = decimal)
+#define LIGHT_PAIRS_CO2 false // [SetOption18] Enable Pair light signal with CO2 sensor
+#define LIGHT_POWER_CONTROL false // [SetOption20] Enable power control in relation to Dimmer/Color/Ct changes
+#define LIGHT_CHANNEL_MODE false // [SetOption68] Enable multi-channels PWM instead of Color PWM
+#define LIGHT_SLIDER_POWER false // [SetOption77] Do not power off if slider moved to far left
+#define LIGHT_ALEXA_CT_RANGE false // [SetOption82] Reduced CT range for Alexa
+
+// -- Energy --------------------------------------
+#define ENERGY_VOLTAGE_ALWAYS false // [SetOption21] Enable show voltage even if powered off
+#define ENERGY_DDS2382_MODE false // [SetOption71] Enable DDS2382 different Modbus registers for Active Energy (#6531)
+#define ENERGY_HARDWARE_TOTALS false // [SetOption72] Enable hardware energy total counter as reference (#6561)
+
+// -- Other Options -------------------------------
+#define TIMERS_ENABLED false // [Timers] Enable Timers
+#define RF_DATA_RADIX false // [SetOption28] RF receive data format (false = hexadecimal, true = decimal)
+#define IR_DATA_RADIX false // [SetOption29] IR receive data format (false = hexadecimal, true = decimal)
+#define TUYA_SETOPTION_20 false // [SetOption54] Apply SetOption20 settings to Tuya device
+#define IR_ADD_RAW_DATA false // [SetOption58] Add IR Raw data to JSON message
+#define BUZZER_ENABLE false // [SetOption67] Enable buzzer when available
+#define DS18X20_PULL_UP false // [SetOption74] Enable internal pullup for single DS18x20 sensor
+#define COUNTER_RESET false // [SetOption79] Enable resetting of counters after telemetry was sent
+#define SHUTTER_SUPPORT false // [SetOption80] Enable shutter support
+#define PCF8574_INVERT_PORTS false // [SetOption81] Invert all ports on PCF8574 devices
+#define ZIGBEE_FRIENDLY_NAMES false // [SetOption83] Enable Zigbee FriendlyNames instead of ShortAddresses when possible
+
/*********************************************************************************************\
* END OF SECTION 1
*
@@ -261,11 +326,12 @@
//#define MY_LANGUAGE pl-PL // Polish in Poland
//#define MY_LANGUAGE pt-BR // Portuguese in Brazil
//#define MY_LANGUAGE pt-PT // Portuguese in Portugal
+//#define MY_LANGUAGE ro-RO // Romanian in Romania
//#define MY_LANGUAGE ru-RU // Russian in Russia
//#define MY_LANGUAGE sk-SK // Slovak in Slovakia
//#define MY_LANGUAGE sv-SE // Swedish in Sweden
//#define MY_LANGUAGE tr-TR // Turkish in Turkey
-//#define MY_LANGUAGE uk-UK // Ukrainian in Ukraine
+//#define MY_LANGUAGE uk-UA // Ukrainian in Ukraine
//#define MY_LANGUAGE zh-CN // Chinese (Simplified) in China
//#define MY_LANGUAGE zh-TW // Chinese (Traditional) in Taiwan
@@ -345,10 +411,16 @@
#define USE_SONOFF_IFAN // Add support for Sonoff iFan02 and iFan03 (+2k code)
#define USE_BUZZER // Add support for a buzzer (+0k6 code)
#define USE_ARILUX_RF // Add support for Arilux RF remote controller (+0k8 code, 252 iram (non 2.3.0))
-//#define USE_SHUTTER // Add Shutter support for up to 4 shutter with different motortypes (+6k code)
+#define USE_SHUTTER // Add Shutter support for up to 4 shutter with different motortypes (+11k code)
#define USE_DEEPSLEEP // Add support for deepsleep (+1k code)
-//#define USE_EXS_DIMMER // Add support for ES-Store WiFi Dimmer (+1k5 code)
-// #define EXS_MCU_CMNDS // Add command to send MCU commands (+0k8 code)
+#define USE_EXS_DIMMER // Add support for ES-Store WiFi Dimmer (+1k5 code)
+// #define EXS_MCU_CMNDS // Add command to send MCU commands (+0k8 code)
+//#define USE_HOTPLUG // Add support for sensor HotPlug
+#define USE_DEVICE_GROUPS // Add support for device groups (+5k6 code)
+#define USE_PWM_DIMMER // Add support for MJ-SD01/acenx/NTONPOWER PWM dimmers (+2k5 code)
+ #define USE_PWM_DIMMER_REMOTE // Add support for remote switches to PWM Dimmer, also adds device groups support (+1k1 code plus device groups size)
+//#define USE_KEELOQ // Add support for Jarolift rollers by Keeloq algorithm (+4k5 code)
+#define USE_SONOFF_D1 // Add support for Sonoff D1 Dimmer (+0k7 code)
// -- Optional light modules ----------------------
#define USE_WS2812 // WS2812 Led string using library NeoPixelBus (+5k code, +1k mem, 232 iram) - Disable by //
@@ -359,6 +431,7 @@
#define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code)
#define USE_SM2135 // Add support for SM2135 RGBCW led control as used in Action LSC (+0k6 code)
#define USE_SONOFF_L1 // Add support for Sonoff L1 led control
+#define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller (+0k3 code)
// -- Counter input -------------------------------
#define USE_COUNTER // Enable inputs as counter (+0k8 code)
@@ -374,25 +447,25 @@
#define USE_I2C // I2C using library wire (+10k code, 0k2 mem, 124 iram)
#ifdef USE_I2C
- #define USE_SHT // [I2cDriver8] Enable SHT1X sensor (+1k4 code)
- #define USE_HTU // [I2cDriver9] Enable HTU21/SI7013/SI7020/SI7021 sensor (I2C address 0x40) (+1k5 code)
- #define USE_BMP // [I2cDriver10] Enable BMP085/BMP180/BMP280/BME280 sensors (I2C addresses 0x76 and 0x77) (+4k4 code)
+// #define USE_SHT // [I2cDriver8] Enable SHT1X sensor (+1k4 code)
+// #define USE_HTU // [I2cDriver9] Enable HTU21/SI7013/SI7020/SI7021 sensor (I2C address 0x40) (+1k5 code)
+// #define USE_BMP // [I2cDriver10] Enable BMP085/BMP180/BMP280/BME280 sensors (I2C addresses 0x76 and 0x77) (+4k4 code)
// #define USE_BME680 // Enable support for BME680 sensor using Bosch BME680 library (+4k code)
- #define USE_BH1750 // [I2cDriver11] Enable BH1750 sensor (I2C address 0x23 or 0x5C) (+0k5 code)
+// #define USE_BH1750 // [I2cDriver11] Enable BH1750 sensor (I2C address 0x23 or 0x5C) (+0k5 code)
// #define USE_VEML6070 // [I2cDriver12] Enable VEML6070 sensor (I2C addresses 0x38 and 0x39) (+1k5 code)
#define USE_VEML6070_RSET 270000 // VEML6070, Rset in Ohm used on PCB board, default 270K = 270000ohm, range for this sensor: 220K ... 1Meg
#define USE_VEML6070_SHOW_RAW // VEML6070, shows the raw value of UV-A
// #define USE_ADS1115 // [I2cDriver13] Enable ADS1115 16 bit A/D converter (I2C address 0x48, 0x49, 0x4A or 0x4B) based on Adafruit ADS1x15 library (no library needed) (+0k7 code)
// #define USE_INA219 // [I2cDriver14] Enable INA219 (I2C address 0x40, 0x41 0x44 or 0x45) Low voltage and current sensor (+1k code)
// #define USE_INA226 // [I2cDriver35] Enable INA226 (I2C address 0x40, 0x41 0x44 or 0x45) Low voltage and current sensor (+2k3 code)
- #define USE_SHT3X // [I2cDriver15] Enable SHT3x (I2C address 0x44 or 0x45) or SHTC3 (I2C address 0x70) sensor (+0k7 code)
+// #define USE_SHT3X // [I2cDriver15] Enable SHT3x (I2C address 0x44 or 0x45) or SHTC3 (I2C address 0x70) sensor (+0k7 code)
// #define USE_TSL2561 // [I2cDriver16] Enable TSL2561 sensor (I2C address 0x29, 0x39 or 0x49) using library Joba_Tsl2561 (+2k3 code)
// #define USE_TSL2591 // [I2cDriver40] Enable TSL2591 sensor (I2C address 0x29) using library Adafruit_TSL2591 (+1k6 code)
// #define USE_MGS // [I2cDriver17] Enable Xadow and Grove Mutichannel Gas sensor using library Multichannel_Gas_Sensor (+10k code)
#define MGS_SENSOR_ADDR 0x04 // Default Mutichannel Gas sensor i2c address
// #define USE_SGP30 // [I2cDriver18] Enable SGP30 sensor (I2C address 0x58) (+1k1 code)
// #define USE_SI1145 // [I2cDriver19] Enable SI1145/46/47 sensor (I2C address 0x60) (+1k code)
- #define USE_LM75AD // [I2cDriver20] Enable LM75AD sensor (I2C addresses 0x48 - 0x4F) (+0k5 code)
+// #define USE_LM75AD // [I2cDriver20] Enable LM75AD sensor (I2C addresses 0x48 - 0x4F) (+0k5 code)
// #define USE_APDS9960 // [I2cDriver21] Enable APDS9960 Proximity Sensor (I2C address 0x39). Disables SHT and VEML6070 (+4k7 code)
// #define USE_MCP230xx // [I2cDriver22] Enable MCP23008/MCP23017 - Must define I2C Address in #define USE_MCP230xx_ADDR below - range 0x20 - 0x27 (+4k7 code)
// #define USE_MCP230xx_ADDR 0x20 // Enable MCP23008/MCP23017 I2C Address to use (Must be within range 0x20 through 0x26 - set according to your wired setup)
@@ -419,6 +492,12 @@
// #define USE_PCF8574 // [I2cDriver2] Enable PCF8574 I/O Expander (I2C addresses 0x20 - 0x26 and 0x39 - 0x3F) (+1k9 code)
// #define USE_HIH6 // [I2cDriver36] Enable Honeywell HIH Humidity and Temperature sensor (I2C address 0x27) (+0k6)
// #define USE_DHT12 // [I2cDriver41] Enable DHT12 humidity and temperature sensor (I2C address 0x5C) (+0k7 code)
+// #define USE_DS1624 // [I2cDriver42] Enable DS1624, DS1621 temperature sensor (I2C addresses 0x48 - 0x4F) (+1k2 code)
+// #define USE_AHT1x // [I2cDriver43] Enable AHT10/15 humidity and temperature sensor (I2C address 0x38) (+0k8 code)
+// #define USE_WEMOS_MOTOR_V1 // [I2cDriver44] Enable Wemos motor driver V1 (I2C addresses 0x2D - 0x30) (+0k7 code)
+// #define WEMOS_MOTOR_V1_ADDR 0x30 // Default I2C address 0x30
+// #define WEMOS_MOTOR_V1_FREQ 1000 // Default frequency
+// #define USE_HDC1080 // [I2cDriver45] Enable HDC1080 temperature/humidity sensor (I2C address 0x40) (+1k5 code)
// #define USE_DISPLAY // Add I2C Display Support (+2k code)
#define USE_DISPLAY_MODES1TO5 // Enable display mode 1 to 5 in addition to mode 0
@@ -438,27 +517,31 @@
// -- SPI sensors ---------------------------------
//#define USE_SPI // Hardware SPI using GPIO12(MISO), GPIO13(MOSI) and GPIO14(CLK) in addition to two user selectable GPIOs(CS and DC)
-
#ifdef USE_SPI
- #ifndef USE_DISPLAY
- #define USE_DISPLAY // Add SPI Display support for 320x240 and 480x320 TFT
- #endif
- #define USE_DISPLAY_ILI9341 // [DisplayModel 4] Enable ILI9341 Tft 480x320 display (+19k code)
-// #define USE_DISPLAY_EPAPER_29 // [DisplayModel 5] Enable e-paper 2.9 inch display (+19k code)
-// #define USE_DISPLAY_EPAPER_42 // [DisplayModel 6] Enable e-paper 4.2 inch display
-// #define USE_DISPLAY_ILI9488 // [DisplayModel 8] [I2cDriver38] (Touch)
-// #define USE_DISPLAY_SSD1351 // [DisplayModel 9]
-// #define USE_DISPLAY_RA8876 // [DisplayModel 10] [I2cDriver39] (Touch)
+// #define USE_NRF24 // Add SPI support for NRF24L01(+) (+2k6 code)
+ #ifdef USE_NRF24
+ #define USE_MIBLE // BLE-bridge for some Mijia-BLE-sensors (+4k7 code)
+ #else
+ #ifndef USE_DISPLAY
+ #define USE_DISPLAY // Add SPI Display support for 320x240 and 480x320 TFT
+ #endif
+ #define USE_DISPLAY_ILI9341 // [DisplayModel 4] Enable ILI9341 Tft 480x320 display (+19k code)
+// #define USE_DISPLAY_EPAPER_29 // [DisplayModel 5] Enable e-paper 2.9 inch display (+19k code)
+// #define USE_DISPLAY_EPAPER_42 // [DisplayModel 6] Enable e-paper 4.2 inch display
+// #define USE_DISPLAY_ILI9488 // [DisplayModel 8] [I2cDriver38] (Touch)
+// #define USE_DISPLAY_SSD1351 // [DisplayModel 9]
+// #define USE_DISPLAY_RA8876 // [DisplayModel 10] [I2cDriver39] (Touch)
+ #endif // USE_NRF24
#endif // USE_SPI
// -- Serial sensors ------------------------------
-#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)
+//#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)
#define CO2_LOW 800 // Below this CO2 value show green light (needs PWM or WS2812 RG(B) led and enable with SetOption18 1)
#define CO2_HIGH 1200 // Above this CO2 value show red light (needs PWM or WS2812 RG(B) led and enable with SetOption18 1)
-#define USE_PMS5003 // Add support for PMS5003 and PMS7003 particle concentration sensor (+1k3 code)
+//#define USE_PMS5003 // Add support for PMS5003 and PMS7003 particle concentration sensor (+1k3 code)
//#define PMS_MODEL_PMS3003 // Enable support of PMS3003 instead of PMS5003/PMS7003 (needs the USE_PMS5003 above)
-#define USE_NOVA_SDS // Add support for SDS011 and SDS021 particle concentration sensor (+1k5 code)
+//#define USE_NOVA_SDS // Add support for SDS011 and SDS021 particle concentration sensor (+1k5 code)
#define STARTING_OFFSET 30 // Turn on NovaSDS XX-seconds before tele_period is reached
//#define USE_HPMA // Add support for Honeywell HPMA115S0 particle concentration sensor (+1k4)
#define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code)
@@ -471,8 +554,10 @@
// #define USE_PN532_DATA_RAW // Allow DATA block to be used by non-alpha-numberic data (+ 80 bytes code, 48 bytes ram)
//#define USE_RDM6300 // Add support for RDM6300 125kHz RFID Reader (+0k8)
//#define USE_IBEACON // Add support for bluetooth LE passive scan of ibeacon devices (uses HM17 module)
-//#define USE_GPS // Add support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM)
-// #define USE_FLOG // Add support for GPS logging in OTA's Flash (Experimental) (+ 2.9kb flash, +8 bytes RAM)
+//#define USE_GPS // Add support for GPS and NTP Server for becoming Stratus 1 Time Source (+3k1 code, +132 bytes RAM)
+// #define USE_FLOG // Add support for GPS logging in OTA's Flash (Experimental) (+2k9 code, +8 bytes RAM)
+//#define USE_HM10 // Add support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code)
+//#define USE_HRXL // Add support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7)
// -- Power monitoring sensors --------------------
#define USE_ENERGY_MARGIN_DETECTION // Add support for Energy Margin detection (+1k6 code)
@@ -492,6 +577,9 @@
//#define USE_SOLAX_X1 // Add support for Solax X1 series Modbus log info (+3k1 code)
#define SOLAXX1_SPEED 9600 // Solax X1 Modbus RS485 serial speed (default: 9600 baud)
#define SOLAXX1_PV2 // Solax X1 using second PV
+//#define USE_LE01MR // Add support for F&F LE-01MR Modbus energy monitor (+1k code)
+ #define LE01MR_SPEED 9600 // LE-01MR modbus baudrate (default: 9600)
+ #define LE01MR_ADDR 1 // LE-01MR modbus address (default: 0x01)
// -- Low level interface devices -----------------
#define USE_DHT // Add support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor (1k6 code)
@@ -525,7 +613,7 @@
#define IR_RCV_MIN_UNKNOWN_SIZE 6 // Set the smallest sized "UNKNOWN" message packets we actually care about (default 6, max 255)
// -- Zigbee interface ----------------------------
-//#define USE_ZIGBEE // Enable serial communication with Zigbee CC2530 flashed with ZNP
+//#define USE_ZIGBEE // Enable serial communication with Zigbee CC2530 flashed with ZNP (+49k code, +3k mem)
#define USE_ZIGBEE_PANID 0x1A63 // arbitrary PAN ID for Zigbee network, must be unique in the home
#define USE_ZIGBEE_EXTPANID 0xCCCCCCCCCCCCCCCCL // arbitrary extended PAN ID
#define USE_ZIGBEE_CHANNEL 11 // Zigbee Channel (11-26)
@@ -536,13 +624,15 @@
// -- Other sensors/drivers -----------------------
-#define USE_SR04 // Add support for HC-SR04 ultrasonic devices (+1k code)
+//#define USE_SR04 // Add support for HC-SR04 ultrasonic devices (+1k code)
//#define USE_TM1638 // Add support for TM1638 switches copying Switch1 .. Switch8 (+1k code)
-#define USE_HX711 // Add support for HX711 load cell (+1k5 code)
+//#define USE_HX711 // Add support for HX711 load cell (+1k5 code)
// #define USE_HX711_GUI // Add optional web GUI to HX711 as scale (+1k8 code)
-//#define USE_TX20_WIND_SENSOR // Add support for La Crosse TX20 anemometer (+2k code)
+// Select none or only one of the below defines
+//#define USE_TX20_WIND_SENSOR // Add support for La Crosse TX20 anemometer (+2k6/0k8 code)
+//#define USE_TX23_WIND_SENSOR // Add support for La Crosse TX23 anemometer (+2k7/1k code)
//#define USE_RC_SWITCH // Add support for RF transceiver using library RcSwitch (+2k7 code, 460 iram)
diff --git a/tasmota/settings.h b/tasmota/settings.h
index eddc4f04b..737ce8a82 100644
--- a/tasmota/settings.h
+++ b/tasmota/settings.h
@@ -1,7 +1,7 @@
/*
settings.h - setting variables for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -92,7 +92,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t bootcount_update : 1; // bit 26 (v7.0.0.4) - SetOption76 - Enable incrementing bootcount when deepsleep is enabled
uint32_t slider_dimmer_stay_on : 1; // bit 27 (v7.0.0.6) - SetOption77 - Do not power off if slider moved to far left
uint32_t compatibility_check : 1; // bit 28 (v7.1.2.6) - SetOption78 - Disable OTA compatibility check
- uint32_t spare29 : 1;
+ uint32_t counter_reset_on_tele : 1; // bit 29 (v8.1.0.1) - SetOption79 - Enable resetting of counters after telemetry was sent
uint32_t shutter_mode : 1; // bit 30 (v6.6.0.14) - SetOption80 - Enable shutter support
uint32_t pcf8574_ports_inverted : 1; // bit 31 (v6.6.0.14) - SetOption81 - Invert all ports on PCF8574 devices
};
@@ -101,14 +101,14 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
typedef union { // Restricted by MISRA-C Rule 18.4 but so useful...
uint32_t data; // Allow bit manipulation using SetOption
struct { // SetOption82 .. SetOption113
- uint32_t spare00 : 1;
- uint32_t spare01 : 1;
- uint32_t spare02 : 1;
- uint32_t spare03 : 1;
- uint32_t spare04 : 1;
- uint32_t spare05 : 1;
- uint32_t spare06 : 1;
- uint32_t spare07 : 1;
+ uint32_t alexa_ct_range : 1; // bit 0 (v8.1.0.2) - SetOption82 - Reduced CT range for Alexa
+ uint32_t zigbee_use_names : 1; // bit 1 (v8.1.0.4) - SetOption83 - Use FriendlyNames instead of ShortAddresses when possible
+ uint32_t awsiot_shadow : 1; // bit 2 (v8.1.0.5) - SetOption84 - (AWS IoT) publish MQTT state to a device shadow
+ uint32_t device_groups_enabled : 1; // bit 3 (v8.1.0.9) - SetOption85 - Enable Device Groups
+ uint32_t led_timeout : 1; // bit 4 (v8.1.0.9) - SetOption86 - PWM Dimmer Turn brightness LED's off 5 seconds after last change
+ uint32_t powered_off_led : 1; // bit 5 (v8.1.0.9) - SetOption87 - PWM Dimmer Turn red LED on when powered off
+ uint32_t remote_device_mode : 1; // bit 6 (v8.1.0.9) - SetOption88 - PWM Dimmer Buttons control remote devices
+ uint32_t zigbee_distinct_topics : 1; // bit 7 (v8.1.0.10) - SetOption89 - Distinct MQTT topics per device for Zigbee (#7835)
uint32_t spare08 : 1;
uint32_t spare09 : 1;
uint32_t spare10 : 1;
@@ -132,7 +132,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t spare28 : 1;
uint32_t spare29 : 1;
uint32_t spare30 : 1;
- uint32_t spare31 : 1;
+ uint32_t spare31 : 1; // bit 31
};
} SysBitfield4;
@@ -140,10 +140,8 @@ typedef union {
uint32_t data; // Allow bit manipulation
struct {
uint32_t spare00 : 1;
- uint32_t spare01 : 1;
- uint32_t spare02 : 1;
- uint32_t spare03 : 1;
- uint32_t time_format : 2; // (v6.6.0.9) - CMND_TIME
+ uint32_t speed_conversion : 3; // (v8.1.0.10) - Tx2x sensor
+ uint32_t time_format : 2; // (v6.6.0.9) - CMND_TIME
uint32_t calc_resolution : 3;
uint32_t weight_resolution : 2;
uint32_t frequency_resolution : 2;
@@ -432,7 +430,7 @@ struct SYSCFG {
uint16_t shutter_opentime[MAX_SHUTTERS]; // E40
uint16_t shutter_closetime[MAX_SHUTTERS]; // E48
int16_t shuttercoeff[5][MAX_SHUTTERS]; // E50
- uint8_t shutter_invert[MAX_SHUTTERS]; // E78
+ uint8_t shutter_options[MAX_SHUTTERS]; // E78
uint8_t shutter_set50percent[MAX_SHUTTERS]; // E7C
uint8_t shutter_position[MAX_SHUTTERS]; // E80
uint8_t shutter_startrelay[MAX_SHUTTERS]; // E84
@@ -464,9 +462,24 @@ struct SYSCFG {
uint8_t shutter_accuracy; // F00
uint8_t mqttlog_level; // F01
uint8_t sps30_inuse_hours; // F02
+ uint8_t hotplug_scan; // F03
+ uint8_t bri_power_on; // F04
+ uint8_t bri_min; // F05
+ uint8_t bri_preset_low; // F06
+ uint8_t bri_preset_high; // F07
+ int8_t hum_comp; // F08
- uint8_t free_f03[233]; // F03
+ uint8_t free_f09[179]; // F09
+ uint32_t keeloq_master_msb; // FBC
+ uint32_t keeloq_master_lsb; // FC0
+ uint32_t keeloq_serial; // FC4
+ uint32_t keeloq_count; // FC8
+ uint32_t device_group_share_in; // FCC - Bitmask of device group items imported
+ uint32_t device_group_share_out; // FD0 - Bitmask of device group items exported
+ uint32_t bootcount_reset_time; // FD4
+ int adc_param4; // FD8
+ uint32_t shutter_button[MAX_KEYS]; // FDC
uint32_t i2c_drivers[3]; // FEC I2cDriver
uint32_t cfg_timestamp; // FF8
uint32_t cfg_crc32; // FFC
diff --git a/tasmota/settings.ino b/tasmota/settings.ino
index 6412d3fc9..5ebf970d4 100644
--- a/tasmota/settings.ino
+++ b/tasmota/settings.ino
@@ -1,7 +1,7 @@
/*
settings.ino - user settings for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -277,6 +277,23 @@ bool RtcRebootValid(void)
/*********************************************************************************************\
* Config - Flash
+ *
+ * Tasmota 1M flash usage
+ * 0x00000000 - Unzipped binary bootloader
+ * 0x00001000 - Unzipped binary code start
+ * ::::
+ * 0x000xxxxx - Unzipped binary code end
+ * 0x000x1000 - First page used by Core OTA
+ * ::::
+ * 0x000F3000 - Tasmota Quick Power Cycle counter (SETTINGS_LOCATION - CFG_ROTATES) - First four bytes only
+ * 0x000F4000 - First Tasmota rotating settings page
+ * ::::
+ * 0x000FA000 - Last Tasmota rotating settings page = Last page used by Core OTA
+ * 0x000FB000 - Core SPIFFS end = Core EEPROM = Tasmota settings page during OTA and when no flash rotation is active (SETTINGS_LOCATION)
+ * 0x000FC000 - SDK - Uses first 128 bytes for phy init data mirrored by Core in RAM. See core_esp8266_phy.cpp phy_init_data[128] = Core user_rf_cal_sector
+ * 0x000FD000 - SDK - Uses scattered bytes from 0x340 (iTead use as settings storage from 0x000FD000)
+ * 0x000FE000 - SDK - Uses scattered bytes from 0x340 (iTead use as mirrored settings storage from 0x000FE000)
+ * 0x000FF000 - SDK - Uses at least first 32 bytes of this page - Tasmota Zigbee persistence from 0x000FF800 to 0x000FFFFF
\*********************************************************************************************/
extern "C" {
@@ -343,10 +360,10 @@ void SetFlashModeDout(void)
delete[] _buffer;
}
-uint32_t OtaVersion(void)
+bool VersionCompatible(void)
{
if (Settings.flag3.compatibility_check) {
- return 0xFFFFFFFF;
+ return true;
}
eboot_command ebcmd;
@@ -359,13 +376,18 @@ uint32_t OtaVersion(void)
bool found = false;
for (uint32_t address = start_address; address < end_address; address = address + FLASH_SECTOR_SIZE) {
ESP.flashRead(address, (uint32_t*)buffer, FLASH_SECTOR_SIZE);
- for (uint32_t i = 0; i < (FLASH_SECTOR_SIZE / 4); i++) {
- version[0] = version[1];
- version[1] = version[2];
- version[2] = buffer[i];
- if ((version[0] == MARKER_START) && (version[2] == MARKER_END)) {
- found = true;
- break;
+ if ((address == start_address) && (0x1F == (buffer[0] & 0xFF))) {
+ version[1] = 0xFFFFFFFF; // Ota file is gzipped and can not be checked for compatibility
+ found = true;
+ } else {
+ for (uint32_t i = 0; i < (FLASH_SECTOR_SIZE / 4); i++) {
+ version[0] = version[1];
+ version[1] = version[2];
+ version[2] = buffer[i];
+ if ((MARKER_START == version[0]) && (MARKER_END == version[2])) {
+ found = true;
+ break;
+ }
}
}
if (found) { break; }
@@ -376,13 +398,13 @@ uint32_t OtaVersion(void)
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("OTA: Version 0x%08X, Compatible 0x%08X"), version[1], VERSION_COMPATIBLE);
- return version[1];
-}
+ if (version[1] < VERSION_COMPATIBLE) {
+ uint32_t eboot_magic = 0; // Abandon OTA result
+ ESP.rtcUserMemoryWrite(0, (uint32_t*)&eboot_magic, sizeof(eboot_magic));
+ return false;
+ }
-void AbandonOta(void)
-{
- uint32_t eboot_magic = 0;
- ESP.rtcUserMemoryWrite(0, (uint32_t*)&eboot_magic, sizeof(eboot_magic));
+ return true;
}
void SettingsBufferFree(void)
@@ -695,7 +717,11 @@ void EspErase(uint32_t start_sector, uint32_t end_sector)
// bool result = EsptoolEraseSector(sector); // Esptool - erases flash completely (slow)
if (serial_output) {
+#ifdef ARDUINO_ESP8266_RELEASE_2_3_0
+ Serial.printf(D_LOG_APPLICATION D_ERASED_SECTOR " %d %s\n", sector, (result) ? D_OK : D_ERROR);
+#else
Serial.printf_P(PSTR(D_LOG_APPLICATION D_ERASED_SECTOR " %d %s\n"), sector, (result) ? D_OK : D_ERROR);
+#endif
delay(10);
} else {
yield();
@@ -719,6 +745,7 @@ void SettingsErase(uint8_t type)
1 = Erase 16k SDK parameter area near end of flash as seen by SDK (0x0xFCxxx - 0x0xFFFFF) solving possible wifi errors
2 = Erase Tasmota parameter area (0x0xF3xxx - 0x0xFBFFF)
3 = Erase Tasmota and SDK parameter area (0x0F3xxx - 0x0FFFFF)
+ 4 = Erase SDK parameter area used for wifi calibration (0x0FCxxx - 0x0FCFFF)
*/
#ifndef FIRMWARE_MINIMAL
@@ -736,8 +763,22 @@ void SettingsErase(uint8_t type)
_sectorStart = SETTINGS_LOCATION - CFG_ROTATES; // Tasmota and SDK parameter area (0x0F3xxx - 0x0FFFFF)
_sectorEnd = ESP.getFlashChipSize() / SPI_FLASH_SEC_SIZE; // Flash size as seen by SDK
}
+ else if (4 == type) {
+// _sectorStart = (ESP.getFlashChipSize() / SPI_FLASH_SEC_SIZE) - 4; // SDK phy area and Core calibration sector (0x0FC000)
+ _sectorStart = SETTINGS_LOCATION +1; // SDK phy area and Core calibration sector (0x0FC000)
+ _sectorEnd = _sectorStart +1; // SDK end of phy area and Core calibration sector (0x0FCFFF)
+ }
+/*
+ else if (5 == type) {
+ _sectorStart = (ESP.getFlashChipRealSize() / SPI_FLASH_SEC_SIZE) -4; // SDK phy area and Core calibration sector (0xxFC000)
+ _sectorEnd = _sectorStart +1; // SDK end of phy area and Core calibration sector (0xxFCFFF)
+ }
+*/
+ else {
+ return;
+ }
- AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_ERASE " %d " D_UNIT_SECTORS), _sectorEnd - _sectorStart);
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_ERASE " from 0x%08X to 0x%08X"), _sectorStart * SPI_FLASH_SEC_SIZE, (_sectorEnd * SPI_FLASH_SEC_SIZE) -1);
// EspErase(_sectorStart, _sectorEnd); // Arduino core and SDK - erases flash as seen by SDK
EsptoolErase(_sectorStart, _sectorEnd); // Esptool - erases flash completely
@@ -746,7 +787,7 @@ void SettingsErase(uint8_t type)
void SettingsSdkErase(void)
{
- WiFi.disconnect(true); // Delete SDK wifi config
+ WiFi.disconnect(false); // Delete SDK wifi config
SettingsErase(1);
delay(1000);
}
@@ -777,8 +818,13 @@ void SettingsDefaultSet2(void)
{
memset((char*)&Settings +16, 0x00, sizeof(SYSCFG) -16);
-// Settings.flag.value_units = 0;
-// Settings.flag.stop_flash_rotate = 0;
+ Settings.flag.stop_flash_rotate = APP_FLASH_CYCLE;
+ Settings.flag.global_state = APP_ENABLE_LEDLINK;
+ Settings.flag3.sleep_normal = APP_NORMAL_SLEEP;
+ Settings.flag3.no_power_feedback = APP_NO_RELAY_SCAN;
+ Settings.flag3.fast_power_cycle_disable = APP_DISABLE_POWERCYCLE;
+ Settings.flag3.bootcount_update = DEEPSLEEP_BOOTCOUNT;
+ Settings.flag3.compatibility_check = OTA_COMPATIBILITY;
Settings.save_data = SAVE_DATA;
Settings.param[P_BACKLOG_DELAY] = MIN_BACKLOG_DELAY;
Settings.param[P_BOOT_LOOP_OFFSET] = BOOT_LOOP_OFFSET; // SetOption36
@@ -819,6 +865,8 @@ void SettingsDefaultSet2(void)
Settings.seriallog_level = SERIAL_LOG_LEVEL;
// Wifi
+ Settings.flag3.use_wifi_scan = WIFI_SCAN_AT_RESTART;
+ Settings.flag3.use_wifi_rescan = WIFI_SCAN_REGULARLY;
Settings.wifi_output_power = 170;
ParseIp(&Settings.ip_address[0], WIFI_IP_ADDRESS);
ParseIp(&Settings.ip_address[1], WIFI_GATEWAY);
@@ -839,16 +887,17 @@ void SettingsDefaultSet2(void)
// Webserver
Settings.flag2.emulation = EMULATION;
+ Settings.flag3.gui_hostname_ip = GUI_SHOW_HOSTNAME;
+ Settings.flag3.mdns_enabled = MDNS_ENABLED;
Settings.webserver = WEB_SERVER;
Settings.weblog_level = WEB_LOG_LEVEL;
SettingsUpdateText(SET_WEBPWD, WEB_PASSWORD);
- Settings.flag3.mdns_enabled = MDNS_ENABLED;
SettingsUpdateText(SET_CORS, CORS_DOMAIN);
// Button
-// Settings.flag.button_restrict = 0;
-// Settings.flag.button_swap = 0;
-// Settings.flag.button_single = 0;
+ Settings.flag.button_restrict = KEY_DISABLE_MULTIPRESS;
+ Settings.flag.button_swap = KEY_SWAP_DOUBLE_PRESS;
+ Settings.flag.button_single = KEY_ONLY_SINGLE_PRESS;
Settings.param[P_HOLD_TIME] = KEY_HOLD_TIME; // Default 4 seconds hold time
// Switch
@@ -856,16 +905,19 @@ void SettingsDefaultSet2(void)
// MQTT
Settings.flag.mqtt_enabled = MQTT_USE;
-// Settings.flag.mqtt_response = 0;
+ Settings.flag.mqtt_response = MQTT_RESULT_COMMAND;
+ Settings.flag.mqtt_offline = MQTT_LWT_MESSAGE;
Settings.flag.mqtt_power_retain = MQTT_POWER_RETAIN;
Settings.flag.mqtt_button_retain = MQTT_BUTTON_RETAIN;
Settings.flag.mqtt_switch_retain = MQTT_SWITCH_RETAIN;
- Settings.flag3.button_switch_force_local = MQTT_BUTTON_SWITCH_FORCE_LOCAL;
- Settings.flag3.hass_tele_on_power = TELE_ON_POWER;
-// Settings.flag.mqtt_sensor_retain = 0;
-// Settings.flag.mqtt_offline = 0;
+ Settings.flag.mqtt_sensor_retain = MQTT_SENSOR_RETAIN;
// Settings.flag.mqtt_serial = 0;
-// Settings.flag.device_index_enable = 0;
+ Settings.flag.device_index_enable = MQTT_POWER_FORMAT;
+ Settings.flag3.time_append_timezone = MQTT_APPEND_TIMEZONE;
+ Settings.flag3.button_switch_force_local = MQTT_BUTTON_SWITCH_FORCE_LOCAL;
+ Settings.flag3.no_hold_retain = MQTT_NO_HOLD_RETAIN;
+ Settings.flag3.use_underscore = MQTT_INDEX_SEPARATOR;
+ Settings.flag3.grouptopic_mode = MQTT_GROUPTOPIC_FORMAT;
SettingsUpdateText(SET_MQTT_HOST, MQTT_HOST);
Settings.mqtt_port = MQTT_PORT;
SettingsUpdateText(SET_MQTT_CLIENT, MQTT_CLIENT_ID);
@@ -899,10 +951,13 @@ void SettingsDefaultSet2(void)
Settings.mqttlog_level = MQTT_LOG_LEVEL;
// Energy
+ Settings.flag.no_power_on_check = ENERGY_VOLTAGE_ALWAYS;
Settings.flag2.current_resolution = 3;
// Settings.flag2.voltage_resolution = 0;
// Settings.flag2.wattage_resolution = 0;
Settings.flag2.energy_resolution = ENERGY_RESOLUTION;
+ Settings.flag3.dds2382_model = ENERGY_DDS2382_MODE;
+ Settings.flag3.hardware_energy_total = ENERGY_HARDWARE_TOTALS;
Settings.param[P_MAX_POWER_RETRY] = MAX_POWER_RETRY;
// Settings.energy_power_delta = 0;
Settings.energy_power_calibration = HLW_PREF_PULSE;
@@ -932,9 +987,12 @@ void SettingsDefaultSet2(void)
Settings.param[P_OVER_TEMP] = ENERGY_OVERTEMP;
// IRRemote
+ Settings.flag.ir_receive_decimal = IR_DATA_RADIX;
+ Settings.flag3.receive_raw = IR_ADD_RAW_DATA;
Settings.param[P_IR_UNKNOW_THRESHOLD] = IR_RCV_MIN_UNKNOWN_SIZE;
// RF Bridge
+ Settings.flag.rf_receive_decimal = RF_DATA_RADIX;
// for (uint32_t i = 0; i < 17; i++) { Settings.rf_code[i][0] = 0; }
memcpy_P(Settings.rf_code[0], kDefaultRfCode, 9);
@@ -955,6 +1013,8 @@ void SettingsDefaultSet2(void)
Settings.flag2.pressure_resolution = PRESSURE_RESOLUTION;
Settings.flag2.humidity_resolution = HUMIDITY_RESOLUTION;
Settings.flag2.temperature_resolution = TEMP_RESOLUTION;
+ Settings.flag3.ds18x20_internal_pullup = DS18X20_PULL_UP;
+ Settings.flag3.counter_reset_on_tele = COUNTER_RESET;
// Settings.altitude = 0;
// Rules
@@ -963,19 +1023,28 @@ void SettingsDefaultSet2(void)
// for (uint32_t i = 1; i < MAX_RULE_SETS; i++) { Settings.rules[i][0] = '\0'; }
Settings.flag2.calc_resolution = CALC_RESOLUTION;
+ // Timer
+ Settings.flag3.timers_enable = TIMERS_ENABLED;
+
// Home Assistant
+ Settings.flag.hass_light = HASS_AS_LIGHT;
Settings.flag.hass_discovery = HOME_ASSISTANT_DISCOVERY_ENABLE;
+ Settings.flag3.hass_tele_on_power = TELE_ON_POWER;
// Knx
-// Settings.flag.knx_enabled = 0;
-// Settings.flag.knx_enable_enhancement = 0;
+ Settings.flag.knx_enabled = KNX_ENABLED;
+ Settings.flag.knx_enable_enhancement = KNX_ENHANCED;
// Light
- Settings.flag.pwm_control = 1;
- //Settings.flag.ws_clock_reverse = 0;
- //Settings.flag.light_signal = 0;
- //Settings.flag.not_power_linked = 0;
- //Settings.flag.decimal_text = 0;
+ Settings.flag.pwm_control = LIGHT_MODE;
+ Settings.flag.ws_clock_reverse = LIGHT_CLOCK_DIRECTION;
+ Settings.flag.light_signal = LIGHT_PAIRS_CO2;
+ Settings.flag.not_power_linked = LIGHT_POWER_CONTROL;
+ Settings.flag.decimal_text = LIGHT_COLOR_RADIX;
+ Settings.flag3.pwm_multi_channels = LIGHT_CHANNEL_MODE;
+ Settings.flag3.slider_dimmer_stay_on = LIGHT_SLIDER_POWER;
+ Settings.flag4.alexa_ct_range = LIGHT_ALEXA_CT_RANGE;
+
Settings.pwm_frequency = PWM_FREQ;
Settings.pwm_range = PWM_RANGE;
for (uint32_t i = 0; i < MAX_PWMS; i++) {
@@ -1038,7 +1107,7 @@ void SettingsDefaultSet2(void)
SettingsUpdateText(SET_NTPSERVER1, NTP_SERVER1);
SettingsUpdateText(SET_NTPSERVER2, NTP_SERVER2);
SettingsUpdateText(SET_NTPSERVER3, NTP_SERVER3);
- for (uint32_t i = 0; i < 3; i++) {
+ for (uint32_t i = 0; i < MAX_NTP_SERVERS; i++) {
SettingsUpdateText(SET_NTPSERVER1 +i, ReplaceCommaWithDot(SettingsText(SET_NTPSERVER1 +i)));
}
Settings.latitude = (int)((double)LATITUDE * 1000000);
@@ -1059,6 +1128,15 @@ void SettingsDefaultSet2(void)
memset(&Settings.monitors, 0xFF, 20); // Enable all possible monitors, displays and sensors
SettingsEnableAllI2cDrivers();
+
+ // Tuya
+ Settings.flag3.tuya_apply_o20 = TUYA_SETOPTION_20;
+ Settings.flag3.tuya_serial_mqtt_publish = MQTT_TUYA_RECEIVED;
+
+ Settings.flag3.buzzer_enable = BUZZER_ENABLE;
+ Settings.flag3.shutter_mode = SHUTTER_SUPPORT;
+ Settings.flag3.pcf8574_ports_inverted = PCF8574_INVERT_PORTS;
+ Settings.flag4.zigbee_use_names = ZIGBEE_FRIENDLY_NAMES;
}
/********************************************************************************************/
diff --git a/tasmota/support.ino b/tasmota/support.ino
index 4b2bc49fb..490918276 100644
--- a/tasmota/support.ino
+++ b/tasmota/support.ino
@@ -1,7 +1,7 @@
/*
support.ino - support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -51,14 +51,20 @@ void OsWatchTicker(void)
uint32_t last_run = abs(t - oswatch_last_loop_time);
#ifdef DEBUG_THEO
- AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_OSWATCH " FreeRam %d, rssi %d %% (%d dBm), last_run %d"), ESP.getFreeHeap(), WifiGetRssiAsQuality(WiFi.RSSI()), WiFi.RSSI(), last_run);
+ int32_t rssi = WiFi.RSSI();
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_OSWATCH " FreeRam %d, rssi %d %% (%d dBm), last_run %d"), ESP.getFreeHeap(), WifiGetRssiAsQuality(rssi), rssi, last_run);
#endif // DEBUG_THEO
if (last_run >= (OSWATCH_RESET_TIME * 1000)) {
// AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_OSWATCH " " D_BLOCKED_LOOP ". " D_RESTARTING)); // Save iram space
RtcSettings.oswatch_blocked_loop = 1;
RtcSettingsSave();
+
// ESP.restart(); // normal reboot
- ESP.reset(); // hard reset
+// ESP.reset(); // hard reset
+
+ // Force an exception to get a stackdump
+ volatile uint32_t dummy;
+ dummy = *((uint32_t*) 0x00000000);
}
}
@@ -488,23 +494,30 @@ bool ParseIp(uint32_t* addr, const char* str)
return (3 == i);
}
+uint32_t ParseParameters(uint32_t count, uint32_t *params)
+{
+ char *p;
+ uint32_t i = 0;
+ for (char *str = strtok_r(XdrvMailbox.data, ", ", &p); str && i < count; str = strtok_r(nullptr, ", ", &p), i++) {
+ params[i] = strtoul(str, nullptr, 0);
+ }
+ return i;
+}
+
// Function to parse & check if version_str is newer than our currently installed version.
bool NewerVersion(char* version_str)
{
uint32_t version = 0;
uint32_t i = 0;
char *str_ptr;
- char* version_dup = strdup(version_str); // Duplicate the version_str as strtok_r will modify it.
- if (!version_dup) {
- return false; // Bail if we can't duplicate. Assume bad.
- }
+ char version_dup[strlen(version_str) +1];
+ strncpy(version_dup, version_str, sizeof(version_dup)); // Duplicate the version_str as strtok_r will modify it.
// Loop through the version string, splitting on '.' seperators.
for (char *str = strtok_r(version_dup, ".", &str_ptr); str && i < sizeof(VERSION); str = strtok_r(nullptr, ".", &str_ptr), i++) {
int field = atoi(str);
// The fields in a version string can only range from 0-255.
if ((field < 0) || (field > 255)) {
- free(version_dup);
return false;
}
// Shuffle the accumulated bytes across, and add the new byte.
@@ -516,7 +529,6 @@ bool NewerVersion(char* version_str)
i++;
}
}
- free(version_dup); // We no longer need this.
// A version string should have 2-4 fields. e.g. 1.2, 1.2.3, or 1.2.3a (= 1.2.3.1).
// If not, then don't consider it a valid version string.
if ((i < 2) || (i > sizeof(VERSION))) {
@@ -605,10 +617,31 @@ char TempUnit(void)
float ConvertHumidity(float h)
{
+ float result = h;
+
global_update = uptime;
global_humidity = h;
- return h;
+ result = result + (0.1 * Settings.hum_comp);
+
+ return result;
+}
+
+float CalcTempHumToDew(float t, float h)
+{
+ if (isnan(h) || isnan(t)) { return 0.0; }
+
+ if (Settings.flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit
+ t = (t - 32) / 1.8; // Celsius
+ }
+
+ float gamma = TaylorLog(h / 100) + 17.62 * t / (243.5 + t);
+ float result = (243.5 * gamma / (17.62 - gamma));
+
+ if (Settings.flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit
+ result = result * 1.8 + 32; // Fahrenheit
+ }
+ return result;
}
float ConvertPressure(float p)
@@ -629,6 +662,18 @@ String PressureUnit(void)
return (Settings.flag.pressure_conversion) ? String(D_UNIT_MILLIMETER_MERCURY) : String(D_UNIT_PRESSURE);
}
+float ConvertSpeed(float s)
+{
+ // Entry in m/s
+ return s * kSpeedConversionFactor[Settings.flag2.speed_conversion];
+}
+
+String SpeedUnit(void)
+{
+ char speed[8];
+ return String(GetTextIndexed(speed, sizeof(speed), Settings.flag2.speed_conversion, kSpeedUnit));
+}
+
void ResetGlobalValues(void)
{
if ((uptime - global_update) > GLOBAL_VALUES_VALID) { // Reset after 5 minutes
@@ -731,6 +776,13 @@ bool DecodeCommand(const char* haystack, void (* const MyCommand[])(void))
{
GetTextIndexed(XdrvMailbox.command, CMDSZ, 0, haystack); // Get prefix if available
int prefix_length = strlen(XdrvMailbox.command);
+ if (prefix_length) {
+ char prefix[prefix_length +1];
+ snprintf_P(prefix, sizeof(prefix), XdrvMailbox.topic); // Copy prefix part only
+ if (strcasecmp(prefix, XdrvMailbox.command)) {
+ return false; // Prefix not in command
+ }
+ }
int command_code = GetCommandCode(XdrvMailbox.command + prefix_length, CMDSZ, XdrvMailbox.topic + prefix_length, haystack);
if (command_code > 0) { // Skip prefix
XdrvMailbox.command_code = command_code -1;
@@ -781,33 +833,40 @@ String GetSerialConfig(void)
return String(config);
}
-void SetSerialBegin(uint32_t baudrate)
+void SetSerialBegin()
{
- if (seriallog_level) {
- AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION "Set Serial to %s %d bit/s"), GetSerialConfig().c_str(), baudrate);
- delay(100);
- }
+ uint32_t baudrate = Settings.baudrate * 300;
+ AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_SERIAL "Set to %s %d bit/s"), GetSerialConfig().c_str(), baudrate);
Serial.flush();
Serial.begin(baudrate, (SerialConfig)pgm_read_byte(kTasmotaSerialConfig + Settings.serial_config));
- delay(10);
- Serial.println();
}
void SetSerialConfig(uint32_t serial_config)
{
- if (serial_config == Settings.serial_config) { return; }
- if (serial_config > TS_SERIAL_8O2) { return; }
-
- Settings.serial_config = serial_config;
- SetSerialBegin(Serial.baudRate());
+ if (serial_config > TS_SERIAL_8O2) {
+ serial_config = TS_SERIAL_8N1;
+ }
+ if (serial_config != Settings.serial_config) {
+ Settings.serial_config = serial_config;
+ SetSerialBegin();
+ }
}
-void SetSerialBaudrate(int baudrate)
+void SetSerialBaudrate(uint32_t baudrate)
{
Settings.baudrate = baudrate / 300;
- if (Serial.baudRate() == baudrate) { return; }
+ if (Serial.baudRate() != baudrate) {
+ SetSerialBegin();
+ }
+}
- SetSerialBegin(baudrate);
+void SetSerial(uint32_t baudrate, uint32_t serial_config)
+{
+ Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
+ Settings.serial_config = serial_config;
+ Settings.baudrate = baudrate / 300;
+ SetSeriallog(LOG_LEVEL_NONE);
+ SetSerialBegin();
}
void ClaimSerial(void)
@@ -815,8 +874,7 @@ void ClaimSerial(void)
serial_local = true;
AddLog_P(LOG_LEVEL_INFO, PSTR("SNS: Hardware Serial"));
SetSeriallog(LOG_LEVEL_NONE);
- baudrate = Serial.baudRate();
- Settings.baudrate = baudrate / 300;
+ Settings.baudrate = Serial.baudRate() / 300;
}
void SerialSendRaw(char *codes)
@@ -981,6 +1039,18 @@ int ResponseAppendTime(void)
return ResponseAppendTimeFormat(Settings.flag2.time_format);
}
+int ResponseAppendTHD(float f_temperature, float f_humidity)
+{
+ char temperature[FLOATSZ];
+ dtostrfd(f_temperature, Settings.flag2.temperature_resolution, temperature);
+ char humidity[FLOATSZ];
+ dtostrfd(f_humidity, Settings.flag2.humidity_resolution, humidity);
+ char dewpoint[FLOATSZ];
+ dtostrfd(CalcTempHumToDew(f_temperature, f_humidity), Settings.flag2.temperature_resolution, dewpoint);
+
+ return ResponseAppend_P(PSTR("\"" D_JSON_TEMPERATURE "\":%s,\"" D_JSON_HUMIDITY "\":%s,\"" D_JSON_DEWPOINT "\":%s"), temperature, humidity, dewpoint);
+}
+
int ResponseJsonEnd(void)
{
return ResponseAppend_P(PSTR("}"));
@@ -1230,45 +1300,19 @@ void TemplateJson(void)
* Sleep aware time scheduler functions borrowed from ESPEasy
\*********************************************************************************************/
-long TimeDifference(unsigned long prev, unsigned long next)
+inline int32_t TimeDifference(uint32_t prev, uint32_t next)
{
- // Return the time difference as a signed value, taking into account the timers may overflow.
- // Returned timediff is between -24.9 days and +24.9 days.
- // Returned value is positive when "next" is after "prev"
- long signed_diff = 0;
- // To cast a value to a signed long, the difference may not exceed half 0xffffffffUL (= 4294967294)
- const unsigned long half_max_unsigned_long = 2147483647u; // = 2^31 -1
- if (next >= prev) {
- const unsigned long diff = next - prev;
- if (diff <= half_max_unsigned_long) { // Normal situation, just return the difference.
- signed_diff = static_cast(diff); // Difference is a positive value.
- } else {
- // prev has overflow, return a negative difference value
- signed_diff = static_cast((0xffffffffUL - next) + prev + 1u);
- signed_diff = -1 * signed_diff;
- }
- } else {
- // next < prev
- const unsigned long diff = prev - next;
- if (diff <= half_max_unsigned_long) { // Normal situation, return a negative difference value
- signed_diff = static_cast(diff);
- signed_diff = -1 * signed_diff;
- } else {
- // next has overflow, return a positive difference value
- signed_diff = static_cast((0xffffffffUL - prev) + next + 1u);
- }
- }
- return signed_diff;
+ return ((int32_t) (next - prev));
}
-long TimePassedSince(unsigned long timestamp)
+int32_t TimePassedSince(uint32_t timestamp)
{
// Compute the number of milliSeconds passed since timestamp given.
// Note: value can be negative if the timestamp has not yet been reached.
return TimeDifference(timestamp, millis());
}
-bool TimeReached(unsigned long timer)
+bool TimeReached(uint32_t timer)
{
// Check if a certain timeout has been reached.
const long passed = TimePassedSince(timer);
@@ -1289,6 +1333,18 @@ void SetNextTimeInterval(unsigned long& timer, const unsigned long step)
timer = millis() + (step - passed);
}
+int32_t TimePassedSinceUsec(uint32_t timestamp)
+{
+ return TimeDifference(timestamp, micros());
+}
+
+bool TimeReachedUsec(uint32_t timer)
+{
+ // Check if a certain timeout has been reached.
+ const long passed = TimePassedSinceUsec(timer);
+ return (passed >= 0);
+}
+
/*********************************************************************************************\
* Basic I2C routines
\*********************************************************************************************/
@@ -1534,11 +1590,7 @@ bool I2cSetDevice(uint32_t addr)
return false; // If already active report as not present;
}
Wire.beginTransmission((uint8_t)addr);
- bool result = (0 == Wire.endTransmission());
- if (result) {
- I2cSetActive(addr, 1);
- }
- return result;
+ return (0 == Wire.endTransmission());
}
#endif // USE_I2C
@@ -1644,8 +1696,14 @@ void AddLog(uint32_t loglevel)
if (!web_log_index) web_log_index++; // Index 0 is not allowed as it is the end of char string
}
#endif // USE_WEBSERVER
- if (!global_state.mqtt_down && (loglevel <= Settings.mqttlog_level)) { MqttPublishLogging(mxtime); }
- if (!global_state.wifi_down && (loglevel <= syslog_level)) { Syslog(); }
+ if (Settings.flag.mqtt_enabled && // SetOption3 - Enable MQTT
+ !global_state.mqtt_down &&
+ (loglevel <= Settings.mqttlog_level)) { MqttPublishLogging(mxtime); }
+
+ if (!global_state.wifi_down &&
+ (loglevel <= syslog_level)) { Syslog(); }
+
+ prepped_loglevel = 0;
}
void AddLog_P(uint32_t loglevel, const char *formatP)
@@ -1664,6 +1722,16 @@ void AddLog_P(uint32_t loglevel, const char *formatP, const char *formatP2)
AddLog(loglevel);
}
+void PrepLog_P2(uint32_t loglevel, PGM_P formatP, ...)
+{
+ va_list arg;
+ va_start(arg, formatP);
+ vsnprintf_P(log_data, sizeof(log_data), formatP, arg);
+ va_end(arg);
+
+ prepped_loglevel = loglevel;
+}
+
void AddLog_P2(uint32_t loglevel, PGM_P formatP, ...)
{
va_list arg;
diff --git a/tasmota/support_button.ino b/tasmota/support_button.ino
index d1367eca7..f30f3a287 100644
--- a/tasmota/support_button.ino
+++ b/tasmota/support_button.ino
@@ -1,7 +1,7 @@
/*
support_button.ino - button support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino
index f6413dd57..e1cc9e812 100644
--- a/tasmota/support_command.ino
+++ b/tasmota/support_command.ino
@@ -1,7 +1,7 @@
/*
support_command.ino - command support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -26,10 +26,14 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix
D_CMND_BUTTONDEBOUNCE "|" D_CMND_SWITCHDEBOUNCE "|" D_CMND_SYSLOG "|" D_CMND_LOGHOST "|" D_CMND_LOGPORT "|" D_CMND_SERIALSEND "|" D_CMND_BAUDRATE "|" D_CMND_SERIALCONFIG "|"
D_CMND_SERIALDELIMITER "|" 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_TELEPERIOD "|" D_CMND_RESET "|" D_CMND_TIME "|" D_CMND_TIMEZONE "|" D_CMND_TIMESTD "|"
- D_CMND_TIMEDST "|" D_CMND_ALTITUDE "|" D_CMND_LEDPOWER "|" D_CMND_LEDSTATE "|" D_CMND_LEDMASK "|" D_CMND_WIFIPOWER "|" D_CMND_TEMPOFFSET "|"
+ D_CMND_TIMEDST "|" D_CMND_ALTITUDE "|" D_CMND_LEDPOWER "|" D_CMND_LEDSTATE "|" D_CMND_LEDMASK "|" D_CMND_WIFIPOWER "|" D_CMND_TEMPOFFSET "|" D_CMND_HUMOFFSET "|"
+ D_CMND_SPEEDUNIT "|"
#ifdef USE_I2C
D_CMND_I2CSCAN "|" D_CMND_I2CDRIVER "|"
#endif
+#ifdef USE_DEVICE_GROUPS
+ D_CMND_DEVGROUP_SHARE "|"
+#endif // USE_DEVICE_GROUPS
D_CMND_SENSOR "|" D_CMND_DRIVER;
void (* const TasmotaCommand[])(void) PROGMEM = {
@@ -41,10 +45,14 @@ void (* const TasmotaCommand[])(void) PROGMEM = {
&CmndButtonDebounce, &CmndSwitchDebounce, &CmndSyslog, &CmndLoghost, &CmndLogport, &CmndSerialSend, &CmndBaudrate, &CmndSerialConfig,
&CmndSerialDelimiter, &CmndIpAddress, &CmndNtpServer, &CmndAp, &CmndSsid, &CmndPassword, &CmndHostname, &CmndWifiConfig,
&CmndFriendlyname, &CmndSwitchMode, &CmndInterlock, &CmndTeleperiod, &CmndReset, &CmndTime, &CmndTimezone, &CmndTimeStd,
- &CmndTimeDst, &CmndAltitude, &CmndLedPower, &CmndLedState, &CmndLedMask, &CmndWifiPower, &CmndTempOffset,
+ &CmndTimeDst, &CmndAltitude, &CmndLedPower, &CmndLedState, &CmndLedMask, &CmndWifiPower, &CmndTempOffset, &CmndHumOffset,
+ &CmndSpeedUnit,
#ifdef USE_I2C
&CmndI2cScan, CmndI2cDriver,
#endif
+#ifdef USE_DEVICE_GROUPS
+ &CmndDevGroupShare,
+#endif // USE_DEVICE_GROUPS
&CmndSensor, &CmndDriver };
const char kWifiConfig[] PROGMEM =
@@ -69,6 +77,14 @@ void ResponseCmndIdxNumber(int value)
Response_P(S_JSON_COMMAND_INDEX_NVALUE, XdrvMailbox.command, XdrvMailbox.index, value);
}
+void ResponseCmndChar_P(const char* value)
+{
+ size_t buf_size = strlen_P(value);
+ char buf[buf_size + 1];
+ strcpy_P(buf, value);
+ Response_P(S_JSON_COMMAND_SVALUE, XdrvMailbox.command, buf);
+}
+
void ResponseCmndChar(const char* value)
{
Response_P(S_JSON_COMMAND_SVALUE, XdrvMailbox.command, value);
@@ -89,6 +105,15 @@ void ResponseCmndIdxChar(const char* value)
Response_P(S_JSON_COMMAND_INDEX_SVALUE, XdrvMailbox.command, XdrvMailbox.index, value);
}
+void ResponseCmndAll(uint32_t text_index, uint32_t count)
+{
+ mqtt_data[0] = '\0';
+ for (uint32_t i = 0; i < count; i++) {
+ ResponseAppend_P(PSTR("%c\"%s%d\":\"%s\""), (i) ? ',' : '{', XdrvMailbox.command, i +1, SettingsText(text_index +i));
+ }
+ ResponseJsonEnd();
+}
+
/********************************************************************************************/
void ExecuteCommand(const char *cmnd, uint32_t source)
@@ -132,8 +157,8 @@ void ExecuteCommand(const char *cmnd, uint32_t source)
/********************************************************************************************/
// topicBuf: /power1 dataBuf: toggle = Console command
-// topicBuf: cmnd/tasmota/power1 dataBuf: toggle = Mqtt command using topic
-// topicBuf: cmnd/tasmotas/power1 dataBuf: toggle = Mqtt command using a group topic
+// topicBuf: cmnd/tasmota/power1 dataBuf: toggle = Mqtt command using topic
+// topicBuf: cmnd/tasmotas/power1 dataBuf: toggle = Mqtt command using a group topic
// topicBuf: cmnd/DVES_83BB10_fb/power1 dataBuf: toggle = Mqtt command using fallback topic
void CommandHandler(char* topicBuf, char* dataBuf, uint32_t data_len)
@@ -193,7 +218,7 @@ void CommandHandler(char* topicBuf, char* dataBuf, uint32_t data_len)
// backlog_delay = millis() + (100 * MIN_BACKLOG_DELAY);
backlog_delay = millis() + Settings.param[P_BACKLOG_DELAY];
- char command[CMDSZ];
+ char command[CMDSZ] = { 0 };
XdrvMailbox.command = command;
XdrvMailbox.index = index;
XdrvMailbox.data_len = data_len;
@@ -228,9 +253,9 @@ void CommandHandler(char* topicBuf, char* dataBuf, uint32_t data_len)
if (type == nullptr) {
blinks = 201;
- snprintf_P(topicBuf, sizeof(topicBuf), PSTR(D_JSON_COMMAND));
+ snprintf_P(stemp1, sizeof(stemp1), PSTR(D_JSON_COMMAND));
Response_P(PSTR("{\"" D_JSON_COMMAND "\":\"" D_JSON_UNKNOWN "\"}"));
- type = (char*)topicBuf;
+ type = (char*)stemp1;
}
if (mqtt_data[0] != '\0') {
@@ -329,13 +354,12 @@ void CmndStatus(void)
char stemp2[TOPSZ];
// Workaround MQTT - TCP/IP stack queueing when SUB_PREFIX = PUB_PREFIX
- if (!strcmp(SettingsText(SET_MQTTPREFIX1), SettingsText(SET_MQTTPREFIX2)) && (!payload)) { option++; } // TELE
+ // Commented on 20200118 as it seems to be no longer needed
+// if (!strcmp(SettingsText(SET_MQTTPREFIX1), SettingsText(SET_MQTTPREFIX2)) && (!payload)) { option++; } // TELE
if ((!Settings.flag.mqtt_enabled) && (6 == payload)) { payload = 99; } // SetOption3 - Enable MQTT
if (!energy_flg && (9 == payload)) { payload = 99; }
-
- bool exception_flg = (ResetReason() == REASON_EXCEPTION_RST);
- if (!exception_flg && (12 == payload)) { payload = 99; }
+ if (!CrashFlag() && (12 == payload)) { payload = 99; }
if ((0 == payload) || (99 == payload)) {
uint32_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : (!devices_present) ? 1 : devices_present;
@@ -368,12 +392,12 @@ void CmndStatus(void)
}
if ((0 == payload) || (1 == payload)) {
- Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS1_PARAMETER "\":{\"" D_JSON_BAUDRATE "\":%d,\"" D_CMND_GROUPTOPIC "\":\"%s\",\"" D_CMND_OTAURL "\":\"%s\",\""
+ Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS1_PARAMETER "\":{\"" D_JSON_BAUDRATE "\":%d,\"" D_CMND_SERIALCONFIG "\":\"%s\",\"" D_CMND_GROUPTOPIC "\":\"%s\",\"" D_CMND_OTAURL "\":\"%s\",\""
D_JSON_RESTARTREASON "\":\"%s\",\"" D_JSON_UPTIME "\":\"%s\",\"" D_JSON_STARTUPUTC "\":\"%s\",\"" D_CMND_SLEEP "\":%d,\""
- D_JSON_CONFIG_HOLDER "\":%d,\"" D_JSON_BOOTCOUNT "\":%d,\"" D_JSON_SAVECOUNT "\":%d,\"" D_JSON_SAVEADDRESS "\":\"%X\"}}"),
- baudrate, SettingsText(SET_MQTT_GRP_TOPIC), SettingsText(SET_OTAURL),
+ D_JSON_CONFIG_HOLDER "\":%d,\"" D_JSON_BOOTCOUNT "\":%d,\"BCResetTime\":\"%s\",\"" D_JSON_SAVECOUNT "\":%d,\"" D_JSON_SAVEADDRESS "\":\"%X\"}}"),
+ Settings.baudrate * 300, GetSerialConfig().c_str(), SettingsText(SET_MQTT_GRP_TOPIC), SettingsText(SET_OTAURL),
GetResetReason().c_str(), GetUptime().c_str(), GetDateAndTime(DT_RESTART).c_str(), Settings.sleep,
- Settings.cfg_holder, Settings.bootcount, Settings.save_flag, GetSettingsAddress());
+ Settings.cfg_holder, Settings.bootcount, GetDateAndTime(DT_BOOTCOUNT).c_str(), Settings.save_flag, GetSettingsAddress());
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "1"));
}
@@ -403,10 +427,10 @@ void CmndStatus(void)
if ((0 == payload) || (4 == payload)) {
Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS4_MEMORY "\":{\"" D_JSON_PROGRAMSIZE "\":%d,\"" D_JSON_FREEMEMORY "\":%d,\"" D_JSON_HEAPSIZE "\":%d,\""
D_JSON_PROGRAMFLASHSIZE "\":%d,\"" D_JSON_FLASHSIZE "\":%d,\"" D_JSON_FLASHCHIPID "\":\"%06X\",\"" D_JSON_FLASHMODE "\":%d,\""
- D_JSON_FEATURES "\":[\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\"]"),
+ D_JSON_FEATURES "\":[\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\"]"),
ESP.getSketchSize()/1024, ESP.getFreeSketchSpace()/1024, ESP.getFreeHeap()/1024,
ESP.getFlashChipSize()/1024, ESP.getFlashChipRealSize()/1024, ESP.getFlashChipId(), ESP.getFlashChipMode(),
- LANGUAGE_LCID, feature_drv1, feature_drv2, feature_sns1, feature_sns2, feature5);
+ LANGUAGE_LCID, feature_drv1, feature_drv2, feature_sns1, feature_sns2, feature5, feature6);
XsnsDriverState();
ResponseAppend_P(PSTR(",\"Sensors\":"));
XsnsSensorState();
@@ -417,10 +441,10 @@ void CmndStatus(void)
if ((0 == payload) || (5 == payload)) {
Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS5_NETWORK "\":{\"" D_CMND_HOSTNAME "\":\"%s\",\"" D_CMND_IPADDRESS "\":\"%s\",\"" D_JSON_GATEWAY "\":\"%s\",\""
D_JSON_SUBNETMASK "\":\"%s\",\"" D_JSON_DNSSERVER "\":\"%s\",\"" D_JSON_MAC "\":\"%s\",\""
- D_CMND_WEBSERVER "\":%d,\"" D_CMND_WIFICONFIG "\":%d}}"),
+ D_CMND_WEBSERVER "\":%d,\"" D_CMND_WIFICONFIG "\":%d,\"" D_CMND_WIFIPOWER "\":%s}}"),
my_hostname, WiFi.localIP().toString().c_str(), IPAddress(Settings.ip_address[1]).toString().c_str(),
IPAddress(Settings.ip_address[2]).toString().c_str(), IPAddress(Settings.ip_address[3]).toString().c_str(), WiFi.macAddress().c_str(),
- Settings.webserver, Settings.sta_config);
+ Settings.webserver, Settings.sta_config, WifiGetOutputPower().c_str());
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "5"));
}
@@ -441,13 +465,13 @@ void CmndStatus(void)
#if defined(USE_TIMERS) && defined(USE_SUNRISE)
Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS7_TIME "\":{\"" D_JSON_UTC_TIME "\":\"%s\",\"" D_JSON_LOCAL_TIME "\":\"%s\",\"" D_JSON_STARTDST "\":\"%s\",\""
D_JSON_ENDDST "\":\"%s\",\"" D_CMND_TIMEZONE "\":%s,\"" D_JSON_SUNRISE "\":\"%s\",\"" D_JSON_SUNSET "\":\"%s\"}}"),
- GetTime(0).c_str(), GetTime(1).c_str(), GetTime(2).c_str(),
- GetTime(3).c_str(), stemp, GetSun(0).c_str(), GetSun(1).c_str());
+ GetDateAndTime(DT_UTC).c_str(), GetDateAndTime(DT_LOCALNOTZ).c_str(), GetDateAndTime(DT_DST).c_str(),
+ GetDateAndTime(DT_STD).c_str(), stemp, GetSun(0).c_str(), GetSun(1).c_str());
#else
Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS7_TIME "\":{\"" D_JSON_UTC_TIME "\":\"%s\",\"" D_JSON_LOCAL_TIME "\":\"%s\",\"" D_JSON_STARTDST "\":\"%s\",\""
D_JSON_ENDDST "\":\"%s\",\"" D_CMND_TIMEZONE "\":%s}}"),
- GetTime(0).c_str(), GetTime(1).c_str(), GetTime(2).c_str(),
- GetTime(3).c_str(), stemp);
+ GetDateAndTime(DT_UTC).c_str(), GetDateAndTime(DT_LOCALNOTZ).c_str(), GetDateAndTime(DT_DST).c_str(),
+ GetDateAndTime(DT_STD).c_str(), stemp);
#endif // USE_TIMERS and USE_SUNRISE
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "7"));
}
@@ -482,7 +506,7 @@ void CmndStatus(void)
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "11"));
}
- if (exception_flg) {
+ if (CrashFlag()) {
if ((0 == payload) || (12 == payload)) {
Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS12_STATUS "\":"));
CrashDump();
@@ -522,6 +546,17 @@ void CmndTempOffset(void)
ResponseCmndFloat((float)(Settings.temp_comp) / 10, 1);
}
+void CmndHumOffset(void)
+{
+ if (XdrvMailbox.data_len > 0) {
+ int value = (int)(CharToFloat(XdrvMailbox.data) * 10);
+ if ((value > -101) && (value < 101)) {
+ Settings.hum_comp = value;
+ }
+ }
+ ResponseCmndFloat((float)(Settings.hum_comp) / 10, 1);
+}
+
void CmndSleep(void)
{
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 251)) {
@@ -575,12 +610,18 @@ void CmndRestart(void)
case -1:
CmndCrash(); // force a crash
break;
+ case -2:
+ CmndWDT();
+ break;
+ case -3:
+ CmndBlockedLoop();
+ break;
case 99:
AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_RESTARTING));
EspRestart();
break;
default:
- ResponseCmndChar(D_JSON_ONE_TO_RESTART);
+ ResponseCmndChar_P(PSTR(D_JSON_ONE_TO_RESTART));
}
}
@@ -761,6 +802,11 @@ void CmndSetoption(void)
}
else if (4 == ptype) { // SetOption82 .. 113
bitWrite(Settings.flag4.data, pindex, XdrvMailbox.payload);
+ switch (pindex) {
+ case 6: // SetOption88 - PWM Dimmer Buttons control remote devices
+ restart_flag = 2;
+ break;
+ }
}
} else {
ptype = 99; // Command Error
@@ -857,6 +903,14 @@ void CmndWeightResolution(void)
ResponseCmndNumber(Settings.flag2.weight_resolution);
}
+void CmndSpeedUnit(void)
+{
+ if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 6)) {
+ Settings.flag2.speed_conversion = XdrvMailbox.payload;
+ }
+ ResponseCmndNumber(Settings.flag2.speed_conversion);
+}
+
void CmndModule(void)
{
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= MAXMODULE)) {
@@ -1024,7 +1078,7 @@ void CmndTemplate(void)
if (JsonTemplate(XdrvMailbox.data)) { // Free 336 bytes StaticJsonBuffer stack space by moving code to function
if (USER_MODULE == Settings.module) { restart_flag = 2; }
} else {
- ResponseCmndChar(D_JSON_INVALID_JSON);
+ ResponseCmndChar_P(PSTR(D_JSON_INVALID_JSON));
error = true;
}
}
@@ -1087,7 +1141,7 @@ void CmndBaudrate(void)
{
if (XdrvMailbox.payload >= 300) {
XdrvMailbox.payload /= 300; // Make it a valid baudrate
- baudrate = (XdrvMailbox.payload & 0xFFFF) * 300;
+ uint32_t baudrate = (XdrvMailbox.payload & 0xFFFF) * 300;
SetSerialBaudrate(baudrate);
}
ResponseCmndNumber(Settings.baudrate * 300);
@@ -1216,16 +1270,20 @@ void CmndIpAddress(void)
void CmndNtpServer(void)
{
- if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 3)) {
- uint32_t ntp_server = SET_NTPSERVER1 + XdrvMailbox.index -1;
- if (XdrvMailbox.data_len > 0) {
- SettingsUpdateText(ntp_server,
- (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? (1 == XdrvMailbox.index) ? NTP_SERVER1 : (2 == XdrvMailbox.index) ? NTP_SERVER2 : NTP_SERVER3 : XdrvMailbox.data);
- SettingsUpdateText(ntp_server, ReplaceCommaWithDot(SettingsText(ntp_server)));
-// restart_flag = 2; // Issue #3890
- ntp_force_sync = true;
+ if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_NTP_SERVERS)) {
+ if (!XdrvMailbox.usridx) {
+ ResponseCmndAll(SET_NTPSERVER1, MAX_NTP_SERVERS);
+ } else {
+ uint32_t ntp_server = SET_NTPSERVER1 + XdrvMailbox.index -1;
+ if (XdrvMailbox.data_len > 0) {
+ SettingsUpdateText(ntp_server,
+ (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? (1 == XdrvMailbox.index) ? NTP_SERVER1 : (2 == XdrvMailbox.index) ? NTP_SERVER2 : NTP_SERVER3 : XdrvMailbox.data);
+ SettingsUpdateText(ntp_server, ReplaceCommaWithDot(SettingsText(ntp_server)));
+ // restart_flag = 2; // Issue #3890
+ ntp_force_sync = true;
+ }
+ ResponseCmndIdxChar(SettingsText(ntp_server));
}
- ResponseCmndIdxChar(SettingsText(ntp_server));
}
}
@@ -1247,14 +1305,18 @@ void CmndAp(void)
void CmndSsid(void)
{
- if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 2)) {
- if (XdrvMailbox.data_len > 0) {
- SettingsUpdateText(SET_STASSID1 + XdrvMailbox.index -1,
- (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? (1 == XdrvMailbox.index) ? STA_SSID1 : STA_SSID2 : XdrvMailbox.data);
- Settings.sta_active = XdrvMailbox.index -1;
- restart_flag = 2;
+ if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_SSIDS)) {
+ if (!XdrvMailbox.usridx) {
+ ResponseCmndAll(SET_STASSID1, MAX_SSIDS);
+ } else {
+ if (XdrvMailbox.data_len > 0) {
+ SettingsUpdateText(SET_STASSID1 + XdrvMailbox.index -1,
+ (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? (1 == XdrvMailbox.index) ? STA_SSID1 : STA_SSID2 : XdrvMailbox.data);
+ Settings.sta_active = XdrvMailbox.index -1;
+ restart_flag = 2;
+ }
+ ResponseCmndIdxChar(SettingsText(SET_STASSID1 + XdrvMailbox.index -1));
}
- ResponseCmndIdxChar(SettingsText(SET_STASSID1 + XdrvMailbox.index -1));
}
}
@@ -1304,16 +1366,20 @@ void CmndWifiConfig(void)
void CmndFriendlyname(void)
{
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_FRIENDLYNAMES)) {
- if (XdrvMailbox.data_len > 0) {
- char stemp1[TOPSZ];
- if (1 == XdrvMailbox.index) {
- snprintf_P(stemp1, sizeof(stemp1), PSTR(FRIENDLY_NAME));
- } else {
- snprintf_P(stemp1, sizeof(stemp1), PSTR(FRIENDLY_NAME "%d"), XdrvMailbox.index);
+ if (!XdrvMailbox.usridx && !XdrvMailbox.data_len) {
+ ResponseCmndAll(SET_FRIENDLYNAME1, MAX_FRIENDLYNAMES);
+ } else {
+ if (XdrvMailbox.data_len > 0) {
+ char stemp1[TOPSZ];
+ if (1 == XdrvMailbox.index) {
+ snprintf_P(stemp1, sizeof(stemp1), PSTR(FRIENDLY_NAME));
+ } else {
+ snprintf_P(stemp1, sizeof(stemp1), PSTR(FRIENDLY_NAME "%d"), XdrvMailbox.index);
+ }
+ SettingsUpdateText(SET_FRIENDLYNAME1 + XdrvMailbox.index -1, ('"' == XdrvMailbox.data[0]) ? "" : (SC_DEFAULT == Shortcut()) ? stemp1 : XdrvMailbox.data);
}
- SettingsUpdateText(SET_FRIENDLYNAME1 + XdrvMailbox.index -1, ('"' == XdrvMailbox.data[0]) ? "" : (SC_DEFAULT == Shortcut()) ? stemp1 : XdrvMailbox.data);
+ ResponseCmndIdxChar(SettingsText(SET_FRIENDLYNAME1 + XdrvMailbox.index -1));
}
- ResponseCmndIdxChar(SettingsText(SET_FRIENDLYNAME1 + XdrvMailbox.index -1));
}
}
@@ -1369,6 +1435,11 @@ void CmndInterlock(void)
SetDevicePower(power, SRC_IGNORE); // Remove multiple relays if set
}
}
+#ifdef USE_SHUTTER
+ if (Settings.flag3.shutter_mode) { // SetOption80 - Enable shutter support
+ ShutterInit(); // to update shutter mode
+ }
+#endif // USE_SHUTTER
}
Response_P(PSTR("{\"" D_CMND_INTERLOCK "\":\"%s\",\"" D_JSON_GROUPS "\":\""), GetStateText(Settings.flag.interlock));
uint32_t anygroup = 0;
@@ -1422,6 +1493,7 @@ void CmndReset(void)
break;
case 99:
Settings.bootcount = 0;
+ Settings.bootcount_reset_time = 0;
ResponseCmndDone();
break;
default:
@@ -1607,7 +1679,7 @@ void CmndWifiPower(void)
}
WifiSetOutputPower();
}
- ResponseCmndFloat((float)(Settings.wifi_output_power) / 10, 1);
+ ResponseCmndChar(WifiGetOutputPower().c_str());
}
#ifdef USE_I2C
@@ -1632,6 +1704,17 @@ void CmndI2cDriver(void)
}
#endif // USE_I2C
+#ifdef USE_DEVICE_GROUPS
+void CmndDevGroupShare(void)
+{
+ uint32_t parm[2] = { Settings.device_group_share_in, Settings.device_group_share_out };
+ ParseParameters(2, parm);
+ Settings.device_group_share_in = parm[0];
+ Settings.device_group_share_out = parm[1];
+ Response_P(PSTR("{\"" D_CMND_DEVGROUP_SHARE "\":{\"In\":\"%X\",\"Out\":\"%X\"}}"), Settings.device_group_share_in, Settings.device_group_share_out);
+}
+#endif // USE_DEVICE_GROUPS
+
void CmndSensor(void)
{
XsnsCall(FUNC_COMMAND_SENSOR);
diff --git a/tasmota/support_crash_recorder.ino b/tasmota/support_crash_recorder.ino
index 87009bbc5..cc9721cb4 100644
--- a/tasmota/support_crash_recorder.ino
+++ b/tasmota/support_crash_recorder.ino
@@ -1,7 +1,7 @@
/*
support_crash_recorder.ino - record the call stack in RTC in case of crash
- Copyright (C) 2019 Stephan Hadinger, Theo Arends,
+ Copyright (C) 2020 Stephan Hadinger, 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
@@ -50,6 +50,23 @@ void CmndCrash(void)
dummy = *((uint32_t*) 0x00000000);
}
+// Do an infinite loop to trigger WDT watchdog
+void CmndWDT(void)
+{
+ volatile uint32_t dummy = 0;
+ while (1) {
+ dummy++;
+ }
+}
+
+// This will trigger the os watch after OSWATCH_RESET_TIME (=120) seconds
+void CmndBlockedLoop(void)
+{
+ while (1) {
+ delay(1000);
+ }
+}
+
// Clear the RTC dump counter when we do a normal reboot, this avoids garbage data to stay in RTC
void CrashDumpClear(void)
{
@@ -61,6 +78,11 @@ void CrashDumpClear(void)
* CmndCrashDump - dump the crash history - called by `Status 12`
\*********************************************************************************************/
+bool CrashFlag(void)
+{
+ return ((ResetReason() == REASON_EXCEPTION_RST) || (ResetReason() == REASON_SOFT_WDT_RST) || oswatch_blocked_loop);
+}
+
void CrashDump(void)
{
ResponseAppend_P(PSTR("{\"Exception\":%d,\"Reason\":\"%s\",\"EPC\":[\"%08x\",\"%08x\",\"%08x\"],\"EXCVADDR\":\"%08x\",\"DEPC\":\"%08x\""),
diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino
new file mode 100644
index 000000000..f88bc5c93
--- /dev/null
+++ b/tasmota/support_device_groups.ino
@@ -0,0 +1,774 @@
+/*
+ support_device_groups.ino - device groups support for Tasmota
+
+ Copyright (C) 2020 Paul C Diem
+
+ Device group allow multiple devices to be in a group with power, light
+ brightness, fade and speed settings and other module-specific settings
+ kept in sync across all devices in the group.
+
+ 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 .
+*/
+#ifdef USE_DEVICE_GROUPS
+
+//#define DEVICE_GROUPS_DEBUG
+#define DGR_MEMBER_TIMEOUT 45000
+#define DGR_ANNOUNCEMENT_INTERVAL 60000
+
+extern bool udp_connected;
+
+struct device_group_member {
+ struct device_group_member * flink;
+ IPAddress ip_address;
+ uint16_t received_sequence;
+ uint16_t acked_sequence;
+};
+
+struct device_group {
+ uint32_t next_announcement_time;
+ uint32_t next_ack_check_time;
+ uint32_t member_timeout_time;
+ uint16_t last_full_status_sequence;
+ uint16_t message_length;
+ uint16_t ack_check_interval;
+ uint8_t message_header_length;
+ uint8_t initial_status_requests_remaining;
+ bool local;
+ char group_name[TOPSZ];
+ char message[128];
+ uint8_t group_member_count;
+ struct device_group_member * device_group_members;
+};
+
+struct device_group * device_groups;
+uint32_t next_check_time = 0;
+uint16_t outgoing_sequence = 0;
+bool device_groups_initialized = false;
+bool device_groups_initialization_failed = false;
+bool building_status_message = false;
+bool processing_remote_device_message = false;
+bool udp_was_connected = false;
+
+void DeviceGroupsInit(void)
+{
+ // Initialize the device information for each device group. The group name is the MQTT group topic.
+ device_groups = (struct device_group *)calloc(device_group_count, sizeof(struct device_group));
+ if (device_groups == nullptr) {
+ AddLog_P2(LOG_LEVEL_ERROR, PSTR("DGR: error allocating %u-element device group array"), device_group_count);
+ device_groups_initialization_failed = true;
+ return;
+ }
+
+ for (uint32_t device_group_index = 0; device_group_index < device_group_count; device_group_index++) {
+ struct device_group * device_group = &device_groups[device_group_index];
+ strcpy(device_group->group_name, SettingsText((device_group_index == 0 ? SET_MQTT_GRP_TOPIC : SET_MQTT_GRP_TOPIC2 + device_group_index - 1)));
+ device_group->message_header_length = sprintf_P(device_group->message, PSTR("%s%s HTTP/1.1\n\n"), kDeviceGroupMessage, device_group->group_name);
+ device_group->last_full_status_sequence = -1;
+ }
+
+ device_groups[0].local = true;
+
+ // If both in and out shared items masks are 0, assume they're unitialized and initialize them.
+ if (!Settings.device_group_share_in && !Settings.device_group_share_out) {
+ Settings.device_group_share_in = Settings.device_group_share_out = 0xffffffff;
+ }
+
+ device_groups_initialized = true;
+}
+
+char * IPAddressToString(const IPAddress& ip_address)
+{
+ static char buffer[16];
+ sprintf_P(buffer, PSTR("%u.%u.%u.%u"), ip_address[0], ip_address[1], ip_address[2], ip_address[3]);
+ return buffer;
+}
+
+char * BeginDeviceGroupMessage(struct device_group * device_group, uint16_t flags, bool hold_sequence = false)
+{
+ char * message_ptr = &device_group->message[device_group->message_header_length];
+ if (!hold_sequence && !++outgoing_sequence) outgoing_sequence = 1;
+ *message_ptr++ = outgoing_sequence & 0xff;
+ *message_ptr++ = outgoing_sequence >> 8;
+ *message_ptr++ = flags & 0xff;
+ *message_ptr++ = flags >> 8;
+ return message_ptr;
+}
+
+// Return true if we're configured to share the specified item.
+bool DeviceGroupItemShared(bool incoming, uint8_t item)
+{
+ uint8_t mask = 0;
+ switch (item) {
+ case DGR_ITEM_LIGHT_BRI:
+ case DGR_ITEM_BRI_POWER_ON:
+ mask = DGR_SHARE_LIGHT_BRI;
+ break;
+ case DGR_ITEM_POWER:
+ mask = DGR_SHARE_POWER;
+ break;
+ case DGR_ITEM_LIGHT_SCHEME:
+ mask = DGR_SHARE_LIGHT_SCHEME;
+ break;
+ case DGR_ITEM_LIGHT_FIXED_COLOR:
+ case DGR_ITEM_LIGHT_CHANNELS:
+ mask = DGR_SHARE_LIGHT_COLOR;
+ break;
+ case DGR_ITEM_LIGHT_FADE:
+ case DGR_ITEM_LIGHT_SPEED:
+ mask = DGR_SHARE_LIGHT_FADE;
+ break;
+ case DGR_ITEM_BRI_PRESET_LOW:
+ case DGR_ITEM_BRI_PRESET_HIGH:
+ mask = DGR_SHARE_DIMMER_SETTINGS;
+ break;
+ }
+ return (!mask || ((incoming ? Settings.device_group_share_in : Settings.device_group_share_out) & mask));
+}
+
+void SendDeviceGroupPacket(IPAddress ip, char * packet, int len, const char * label)
+{
+ if (!ip) ip = IPAddress(239,255,255,250);
+ for (int attempt = 1; attempt <= 5; attempt++) {
+ if (PortUdp.beginPacket(ip, 1900)) {
+ PortUdp.write(packet, len);
+ if (PortUdp.endPacket()) return;
+ }
+ delay(10);
+ }
+ AddLog_P2(LOG_LEVEL_ERROR, PSTR("DGR: error sending %s packet"), label);
+}
+
+void _SendDeviceGroupMessage(uint8_t device_group_index, DeviceGroupMessageType message_type, ...)
+{
+ // If device groups are not enabled, ignore this request.
+ if (!Settings.flag4.device_groups_enabled) return;
+
+ // If UDP is not set up, ignore this request.
+ if (!udp_connected) return;
+
+ // If we're currently processing a remote device message, ignore this request.
+ if (processing_remote_device_message) return;
+
+ // Get a pointer to the device information for this device.
+ device_group * device_group = &device_groups[device_group_index];
+
+ // If we're still sending initial status requests, ignore this request.
+ if (device_group->initial_status_requests_remaining) return;
+
+ // A full status request is a request from a remote device for the status of every item we
+ // control. As long as we're building it, we may as well multicast the status update to all
+ // device group members.
+ char * message_ptr = &device_group->message[device_group->message_header_length];
+ if (message_type == DGR_MSGTYP_FULL_STATUS) {
+
+ // Set the flag indicating we're currently building a status message. SendDeviceGroupMessage
+ // will build but not send messages while this flag is set.
+ building_status_message = true;
+
+ // Call the drivers to build the status update.
+ if (!++outgoing_sequence) outgoing_sequence = 1;
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("Building device group %s full status packet"), device_group->group_name);
+#endif // DEVICE_GROUPS_DEBUG
+ device_group->message_length = 0;
+ SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_POWER, power);
+ XdrvMailbox.command_code = DGR_ITEM_STATUS;
+ XdrvCall(FUNC_DEVICE_GROUP_ITEM);
+ building_status_message = false;
+
+ // If we have nothing to share with the other members, restore the message sequence and return.
+ if (!device_group->message_length) {
+ if (!--outgoing_sequence) outgoing_sequence = -1;
+ return;
+ }
+ device_group->last_full_status_sequence = outgoing_sequence;
+
+ // Set the status update flag in the outgoing message.
+ *(message_ptr + 2) |= DGR_FLAG_FULL_STATUS;
+ }
+
+ else {
+ bool shared;
+ uint8_t item;
+ uint32_t value;
+ uint8_t * value_ptr;
+ va_list ap;
+
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("Building device group %s packet"), device_group->group_name);
+#endif // DEVICE_GROUPS_DEBUG
+
+ value = 0;
+ if (message_type == DGR_MSGTYP_UPDATE_MORE_TO_COME)
+ value |= DGR_FLAG_MORE_TO_COME;
+ else if (message_type == DGR_MSGTYP_UPDATE_DIRECT)
+ value |= DGR_FLAG_DIRECT;
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR(">sequence=%u, flags=%u"), outgoing_sequence, value);
+#endif // DEVICE_GROUPS_DEBUG
+ message_ptr = BeginDeviceGroupMessage(device_group, value, building_status_message || message_type == DGR_MSGTYP_PARTIAL_UPDATE);
+
+ // If we're still building this update or all group members haven't acknowledged the previous
+ // update yet, update the message to include these new updates. First we need to rebuild the
+ // previous update message to remove any items and their values that are included in this new
+ // update.
+ if (device_group->message_length) {
+ uint8_t item_array[32];
+ int item_index = 0;
+ int kept_item_count = 0;
+
+ // Build an array of all the items in this new update.
+ va_start(ap, message_type);
+ while ((item = va_arg(ap, int))) {
+ item_array[item_index++] = item;
+ if (item <= DGR_ITEM_MAX_32BIT)
+ va_arg(ap, int);
+ else if (item <= DGR_ITEM_MAX_STRING)
+ va_arg(ap, char *);
+ else {
+ switch (item) {
+ case DGR_ITEM_LIGHT_CHANNELS:
+ va_arg(ap, uint8_t *) ;
+ break;
+ }
+ }
+ }
+ va_end(ap);
+ item_array[item_index] = 0;
+
+ // Rebuild the previous update message, removing any items their values that are included in
+ // this new update.
+ char * previous_message_ptr = message_ptr;
+ while (item = *previous_message_ptr++) {
+
+ // Search for this item in the new update.
+ for (item_index = 0; item_array[item_index]; item_index++) {
+ if (item_array[item_index] == item) break;
+ }
+
+ // If this item was found in the new update skip over it and it's value.
+ if (item_array[item_index]) {
+ if (item <= DGR_ITEM_MAX_32BIT) {
+ previous_message_ptr++;
+ if (item > DGR_ITEM_MAX_8BIT) {
+ previous_message_ptr++;
+ if (item > DGR_ITEM_MAX_16BIT) {
+ previous_message_ptr++;
+ previous_message_ptr++;
+ }
+ }
+ }
+ else if (item <= DGR_ITEM_MAX_STRING)
+ previous_message_ptr += *previous_message_ptr++;
+ else {
+ switch (item) {
+ case DGR_ITEM_LIGHT_CHANNELS:
+ previous_message_ptr += 5;
+ break;
+ }
+ }
+ }
+
+ // If this item was not found in the new udpate, copy it to the new update message.
+ else {
+ *message_ptr++ = item;
+ if (item <= DGR_ITEM_MAX_32BIT) {
+ *message_ptr++ = *previous_message_ptr++;
+ if (item > DGR_ITEM_MAX_8BIT) {
+ *message_ptr++ = *previous_message_ptr++;
+ if (item > DGR_ITEM_MAX_16BIT) {
+ *message_ptr++ = *previous_message_ptr++;
+ *message_ptr++ = *previous_message_ptr++;
+ }
+ }
+ }
+ else if (item <= DGR_ITEM_MAX_STRING) {
+ *message_ptr++ = value = *previous_message_ptr++;
+ memmove(message_ptr, previous_message_ptr, value);
+ previous_message_ptr += value;
+ message_ptr += value;
+ }
+ else {
+ switch (item) {
+ case DGR_ITEM_LIGHT_CHANNELS:
+ memmove(message_ptr, previous_message_ptr, 5);
+ previous_message_ptr += 5;
+ message_ptr += 5;
+ break;
+ }
+ }
+ kept_item_count++;
+ }
+ }
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("%u items carried over from previous update"), kept_item_count);
+#endif // DEVICE_GROUPS_DEBUG
+ }
+
+ // Itertate through the passed items adding them and their values to the message.
+ va_start(ap, message_type);
+ while ((item = va_arg(ap, int))) {
+ shared = DeviceGroupItemShared(false, item);
+ if (shared) *message_ptr++ = item;
+ if (item <= DGR_ITEM_MAX_32BIT) {
+ value = va_arg(ap, int);
+ if (shared) {
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR(">item=%u, value=%u"), item, value);
+#endif // DEVICE_GROUPS_DEBUG
+ *message_ptr++ = value & 0xff;
+ if (item > DGR_ITEM_MAX_8BIT) {
+ value >>= 8;
+ *message_ptr++ = value & 0xff;
+ }
+ if (item > DGR_ITEM_MAX_16BIT) {
+ value >>= 8;
+ *message_ptr++ = value & 0xff;
+ *message_ptr++ = (item == DGR_ITEM_POWER ? devices_present : value >> 8);
+ }
+ }
+ }
+ else if (item <= DGR_ITEM_MAX_STRING) {
+ value_ptr = va_arg(ap, uint8_t *);
+ if (shared) {
+ value = strlen((const char *)value_ptr);
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR(">item=%u, value=%s"), item, value_ptr);
+#endif // DEVICE_GROUPS_DEBUG
+ *message_ptr++ = value;
+ memcpy(message_ptr, value_ptr, value);
+ message_ptr += value;
+ }
+ }
+ else {
+ switch (item) {
+ case DGR_ITEM_LIGHT_CHANNELS:
+ value_ptr = va_arg(ap, uint8_t *);
+ if (shared) {
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR(">item=%u, value=%u,%u,%u,%u,%u"), item, *value_ptr, *(value_ptr + 1), *(value_ptr + 2), *(value_ptr + 3), *(value_ptr + 4));
+#endif // DEVICE_GROUPS_DEBUG
+ memmove(message_ptr, value_ptr, 5);
+ message_ptr += 5;
+ }
+ break;
+ }
+ }
+ }
+ va_end(ap);
+
+ // Add the EOL item code and calculate the message length.
+ *message_ptr++ = 0;
+ device_group->message_length = message_ptr - device_group->message;
+
+ // If there's going to be more items added to this message, return.
+ if (building_status_message || message_type == DGR_MSGTYP_PARTIAL_UPDATE) return;
+ }
+
+ // Multicast the packet.
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: sending %u-byte device group %s packet via multicast, sequence=%u"), device_group->message_length, device_group->group_name, device_group->message[device_group->message_header_length] | device_group->message[device_group->message_header_length + 1] << 8);
+#endif // DEVICE_GROUPS_DEBUG
+ SendDeviceGroupPacket(0, device_group->message, device_group->message_length, PSTR("Multicast"));
+
+ uint32_t now = millis();
+ if (message_type == DGR_MSGTYP_UPDATE_MORE_TO_COME) {
+ device_group->next_ack_check_time = 0;
+// for (struct device_group_member * device_group_member = device_group->device_group_members; device_group_member != nullptr; device_group_member = device_group_member->flink) {
+// device_group_member->acked_sequence = outgoing_sequence;
+// }
+ }
+ else {
+ device_group->ack_check_interval = 100;
+ device_group->next_ack_check_time = now + device_group->ack_check_interval;
+ if (device_group->next_ack_check_time < next_check_time) next_check_time = device_group->next_ack_check_time;
+ device_group->member_timeout_time = now + DGR_MEMBER_TIMEOUT;
+ }
+
+ device_group->next_announcement_time = now + DGR_ANNOUNCEMENT_INTERVAL;
+ if (device_group->next_announcement_time < next_check_time) next_check_time = device_group->next_announcement_time;
+}
+
+void ProcessDeviceGroupMessage(char * packet, int packet_length)
+{
+ // Make the group name a null-terminated string.
+ char * message_group_name = packet + sizeof(DEVICE_GROUP_MESSAGE) - 1;
+ char * message_ptr = strchr(message_group_name, ' ');
+ if (message_ptr == nullptr) return;
+ *message_ptr = 0;
+
+ // Search for a device group with the target group name. If one isn't found, return.
+ struct device_group * device_group;
+ uint32_t device_group_index = 0;
+ for (;;) {
+ device_group = &device_groups[device_group_index];
+ if (!strcmp(message_group_name, device_group->group_name)) break;
+ if (++device_group_index >= device_group_count) return;
+ }
+ *message_ptr++ = ' ';
+
+ // Find the group member. If this is a new group member, add it.
+ IPAddress remote_ip = PortUdp.remoteIP();
+ struct device_group_member * * flink = &device_group->device_group_members;
+ struct device_group_member * device_group_member;
+ for (;;) {
+ device_group_member = *flink;
+ if (!device_group_member) {
+ device_group_member = (struct device_group_member *)calloc(1, sizeof(struct device_group_member));
+ if (device_group_member == nullptr) {
+ AddLog_P2(LOG_LEVEL_ERROR, PSTR("DGR: error allocating device group member block"));
+ return;
+ }
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: adding member %s (%p)"), IPAddressToString(remote_ip), device_group_member);
+#endif // DEVICE_GROUPS_DEBUG
+ device_group_member->ip_address = remote_ip;
+ *flink = device_group_member;
+ break;
+ }
+ else if (device_group_member->ip_address == remote_ip) {
+ break;
+ }
+ flink = &device_group_member->flink;
+ }
+
+ // Find the start of the actual message (after the http header).
+ message_ptr = strstr_P(message_ptr, PSTR("\n\n"));
+ if (message_ptr == nullptr) return;
+ message_ptr += 2;
+
+ bool light_fade;
+ uint16_t flags;
+ uint16_t item;
+ uint16_t message_sequence;
+ int32_t value;
+
+ // Get the message sequence and flags.
+ if (packet_length - (message_ptr - packet) < 4) goto badmsg; // Malformed message - must be at least 16-bit sequence, 16-bit flags left
+ message_sequence = *message_ptr++;
+ message_sequence |= *message_ptr++ << 8;
+ flags = *message_ptr++;
+ flags |= *message_ptr++ << 8;
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("Received device group %s packet from %s: sequence=%u, flags=%u"), device_group->group_name, IPAddressToString(remote_ip), message_sequence, flags);
+#endif // DEVICE_GROUPS_DEBUG
+
+ // If this is an announcement, simply return.
+ if (flags == DGR_FLAG_ANNOUNCEMENT) return;
+
+ // If this is an ack message, save the message sequence if it's newwer than the last ack we
+ // received from this member.
+ if (flags == DGR_FLAG_ACK) {
+ if (message_sequence > device_group_member->acked_sequence || device_group_member->acked_sequence - message_sequence < 64536) {
+ device_group_member->acked_sequence = message_sequence;
+ }
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("acked_sequence != device_group->last_full_status_sequence) {
+ _SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_FULL_STATUS);
+ }
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("received_sequence) {
+ if (message_sequence == device_group_member->received_sequence || device_group_member->received_sequence - message_sequence > 64536) {
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("received_sequence = message_sequence;
+
+ // Set the flag indicating we're currently processing a remote device message.
+ // SendDeviceGroupMessage will not send messages while this flag is set.
+ processing_remote_device_message = true;
+
+ /*
+ XdrvMailbox
+ bool grpflg
+ bool usridx
+ uint16_t command_code Item code
+ uint32_t index 0:15 Flags, 16:23 Device group index
+ uint32_t data_len String item value length
+ int32_t payload Integer item value
+ char *topic
+ char *data Pointer to non-integer item value
+ char *command nullptr
+ */
+ XdrvMailbox.command = nullptr; // Indicates the source is a device group update
+ XdrvMailbox.index = flags | device_group_index << 16;
+ if (flags & (DGR_FLAG_MORE_TO_COME | DGR_FLAG_DIRECT)) skip_light_fade = true;
+
+ for (;;) {
+ if (packet_length - (message_ptr - packet) < 1) goto badmsg; // Malformed message
+ item = *message_ptr++;
+ if (!item) break; // Done
+
+#ifdef DEVICE_GROUPS_DEBUG
+ switch (item) {
+ case DGR_ITEM_LIGHT_FADE:
+ case DGR_ITEM_LIGHT_SPEED:
+ case DGR_ITEM_LIGHT_BRI:
+ case DGR_ITEM_LIGHT_SCHEME:
+ case DGR_ITEM_LIGHT_FIXED_COLOR:
+ case DGR_ITEM_BRI_PRESET_LOW:
+ case DGR_ITEM_BRI_PRESET_HIGH:
+ case DGR_ITEM_BRI_POWER_ON:
+ case DGR_ITEM_POWER:
+ case DGR_ITEM_LIGHT_CHANNELS:
+ break;
+ default:
+ AddLog_P2(LOG_LEVEL_ERROR, PSTR("DGR: ********** invalid item=%u received from device group %s member %s"), item, device_group->group_name, IPAddressToString(remote_ip));
+ }
+#endif // DEVICE_GROUPS_DEBUG
+
+ XdrvMailbox.command_code = item;
+ if (item <= DGR_ITEM_LAST_32BIT) {
+ value = *message_ptr++;
+ if (item > DGR_ITEM_MAX_8BIT) {
+ value |= *message_ptr++ << 8;
+ if (item > DGR_ITEM_MAX_16BIT) {
+ value |= *message_ptr++ << 16;
+ value |= *message_ptr++ << 24;
+ }
+ }
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("- = packet_length - (message_ptr - packet)) goto badmsg; // Malformed message
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("
- local) {
+ uint8_t mask_devices = value >> 24;
+ if (mask_devices > devices_present) mask_devices = devices_present;
+ for (uint32_t i = 0; i < devices_present; i++) {
+ uint32_t mask = 1 << i;
+ bool on = (value & mask);
+ if (on != (power & mask)) ExecuteCommandPower(i + 1, (on ? POWER_ON : POWER_OFF), SRC_REMOTE);
+ }
+ }
+ }
+ else {
+ XdrvCall(FUNC_DEVICE_GROUP_ITEM);
+ }
+ }
+ }
+
+ XdrvMailbox.command_code = DGR_ITEM_EOL;
+ XdrvCall(FUNC_DEVICE_GROUP_ITEM);
+ skip_light_fade = false;
+
+ processing_remote_device_message = false;
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("
message_length = BeginDeviceGroupMessage(device_group, DGR_FLAG_RESET | DGR_FLAG_STATUS_REQUEST) - device_group->message;
+ device_group->initial_status_requests_remaining = 5;
+ device_group->next_ack_check_time = next_check_time;
+ }
+
+ }
+
+ if (device_groups_initialization_failed) return;
+
+ // If it's time to check on things, iterate through the device groups.
+ if (next_check_time <= now) {
+#ifdef DEVICE_GROUPS_DEBUG
+AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: Ckecking next_check_time=%u, now=%u"), next_check_time, now);
+#endif // DEVICE_GROUPS_DEBUG
+ next_check_time = now + DGR_ANNOUNCEMENT_INTERVAL * 2;
+
+ for (uint32_t device_group_index = 0; device_group_index < device_group_count; device_group_index++) {
+ device_group * device_group = &device_groups[device_group_index];
+
+ // If we're still waiting for acks to the last update from this device group, ...
+ if (device_group->next_ack_check_time) {
+
+ // If it's time to check for acks, ...
+ if (device_group->next_ack_check_time <= now) {
+
+ // If we're still sending the initial status request message, send it.
+ if (device_group->initial_status_requests_remaining) {
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: sending initial status request for group %s"), device_group->group_name);
+#endif // DEVICE_GROUPS_DEBUG
+ if (--device_group->initial_status_requests_remaining) {
+ SendDeviceGroupPacket(0, device_group->message, device_group->message_length, PSTR("Initial"));
+ device_group->message[device_group->message_header_length + 2] = DGR_FLAG_STATUS_REQUEST; // The reset flag is on only for the first packet - turn it off now
+ device_group->next_ack_check_time = now + 200;
+ }
+
+ // If we've sent the initial status request message 5 times, send our status to all
+ // the members.
+ else {
+ device_group->next_ack_check_time = 0;
+ _SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_FULL_STATUS);
+ }
+ }
+
+ // If we're done initializing, iterate through the group memebers, ...
+ else {
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: checking for ack's"));
+#endif // DEVICE_GROUPS_DEBUG
+ bool acked = true;
+ struct device_group_member ** flink = &device_group->device_group_members;
+ struct device_group_member * device_group_member;
+ while ((device_group_member = *flink)) {
+
+ // If we have not received an ack to our last message from this member, ...
+ if (device_group_member->acked_sequence != outgoing_sequence) {
+
+ // If we haven't receive an ack from this member in DGR_MEMBER_TIMEOUT ms, assume
+ // they're offline and remove them from the group.
+ if (device_group->member_timeout_time < now) {
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: removing member %s (%p)"), IPAddressToString(device_group_member->ip_address), device_group_member);
+#endif // DEVICE_GROUPS_DEBUG
+ *flink = device_group_member->flink;
+ free(device_group_member);
+ }
+
+ // Otherwise, unicast the last message directly to this member.
+ else {
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: sending %u-byte device group %s packet via unicast to %s, sequence %u, last message acked=%u"), device_group->message_length, device_group->group_name, IPAddressToString(device_group_member->ip_address), outgoing_sequence, device_group_member->acked_sequence);
+#endif // DEVICE_GROUPS_DEBUG
+ SendDeviceGroupPacket(device_group_member->ip_address, device_group->message, device_group->message_length, PSTR("Unicast"));
+ acked = false;
+ flink = &device_group_member->flink;
+ }
+ }
+ else {
+ flink = &device_group_member->flink;
+ }
+ }
+
+ // If we've received an ack to the last message from all members, clear the ack check
+ // time and zero-out the message length.
+ if (acked) {
+ device_group->next_ack_check_time = 0;
+ device_group->message_length = 0; // Let _SendDeviceGroupMessage know we're done with this update
+ }
+
+ // If there are still members we haven't received an ack from, set the next ack check
+ // time. We start at 200ms and double the interval each pass with a maximum interval of
+ // 5 seconds.
+ else {
+ device_group->ack_check_interval *= 2;
+ if (device_group->ack_check_interval > 5000) device_group->ack_check_interval = 5000;
+ device_group->next_ack_check_time = now + device_group->ack_check_interval;
+ }
+ }
+ }
+
+ if (device_group->next_ack_check_time < next_check_time) next_check_time = device_group->next_ack_check_time;
+ }
+
+ // If it's time to send multicast announcement for this group, send it. This is to
+ // announcement ourself to any members that have somehow not heard about us. We send it at
+ // the announcement interval plus a random number of milliseconds so that even if all the
+ // devices booted at the same time, they don't all multicast their announcements at the same
+ // time.
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: next_announcement_time=%u, now=%u"), device_group->next_announcement_time, now);
+#endif // DEVICE_GROUPS_DEBUG
+ if (device_group->next_announcement_time <= now) {
+ device_group->message_length = BeginDeviceGroupMessage(device_group, DGR_FLAG_ANNOUNCEMENT) - device_group->message;
+#ifdef DEVICE_GROUPS_DEBUG
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DGR: sending %u-byte device group %s announcement"), device_group->message_length, device_group->group_name);
+#endif // DEVICE_GROUPS_DEBUG
+ SendDeviceGroupPacket(0, device_group->message, device_group->message_length, PSTR("Announcement"));
+ device_group->next_announcement_time = now + DGR_ANNOUNCEMENT_INTERVAL + random(10000);
+ }
+ if (device_group->next_announcement_time < next_check_time) next_check_time = device_group->next_announcement_time;
+ }
+ }
+ }
+ else {
+ udp_was_connected = false;
+ }
+}
+
+#endif // USE_DEVICE_GROUPS
diff --git a/tasmota/support_esptool.ino b/tasmota/support_esptool.ino
index bf62a8da1..5bb82f999 100644
--- a/tasmota/support_esptool.ino
+++ b/tasmota/support_esptool.ino
@@ -1,7 +1,7 @@
/*
support_esptool.ino - esptool support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino
index dcc24de0b..201711e48 100644
--- a/tasmota/support_features.ino
+++ b/tasmota/support_features.ino
@@ -1,7 +1,7 @@
/*
support_features.ino - feature support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -367,7 +367,7 @@ void GetFeatures(void)
#ifdef USE_PZEM_DC
feature_sns2 |= 0x00001000; // xnrg_06_pzem_dc.ino
#endif
-#ifdef USE_TX20_WIND_SENSOR
+#if defined(USE_TX20_WIND_SENSOR) || defined(USE_TX23_WIND_SENSOR)
feature_sns2 |= 0x00002000; // xsns_35_tx20.ino
#endif
#ifdef USE_MGC3130
@@ -484,28 +484,98 @@ void GetFeatures(void)
feature5 |= 0x00020000; // xsns_55_hih_series.ino
#endif
#ifdef USE_HPMA
- feature5 |= 0x00040000;
+ feature5 |= 0x00040000; // xsns_56_hpma.ino
#endif
#ifdef USE_TSL2591
- feature5 |= 0x00080000;
+ feature5 |= 0x00080000; // xsns_57_tsl2591.ino
#endif
#ifdef USE_DHT12
- feature5 |= 0x00100000;
+ feature5 |= 0x00100000; // xsns_58_dht12.ino
+#endif
+#ifdef USE_DS1624
+ feature5 |= 0x00200000; // xsns_59_ds1624.ino
#endif
-// feature5 |= 0x00200000;
#ifdef USE_GPS
- feature5 |= 0x00400000;
+ feature5 |= 0x00400000; // xsns_60_GPS.ino
+#endif
+#ifdef USE_HOTPLUG
+ feature5 |= 0x00800000; // xdrv_32_hotplug.ino
+#endif
+#ifdef USE_NRF24
+ feature5 |= 0x01000000; // xsns_33_nrf24l01.ino
+#endif
+#ifdef USE_MIBLE
+ feature5 |= 0x02000000; // xsns_61_MI_BLE.ino
+#endif
+#ifdef USE_HM10
+ feature5 |= 0x04000000; // xsns_62_MI_HM10.ino
+#endif
+#ifdef USE_LE01MR
+ feature5 |= 0x08000000; // xnrg_13_fif_le01mr.ino
+#endif
+#ifdef USE_AHT1x
+ feature5 |= 0x10000000; // xsns_63_aht1x.ino
+#endif
+#ifdef USE_WEMOS_MOTOR_V1
+ feature5 |= 0x20000000; // xdrv_34_wemos_motor_v1.ino
+#endif
+#ifdef USE_DEVICE_GROUPS
+ feature5 |= 0x40000000; // support_device_groups.ino
+#endif
+#ifdef USE_PWM_DIMMER
+ feature5 |= 0x80000000; // xdrv_35_pwm_dimmer
#endif
-// feature5 |= 0x00800000;
-// feature5 |= 0x01000000;
-// feature5 |= 0x02000000;
-// feature5 |= 0x04000000;
-// feature5 |= 0x08000000;
+/*********************************************************************************************/
-// feature5 |= 0x10000000;
-// feature5 |= 0x20000000;
-// feature5 |= 0x40000000;
-// feature5 |= 0x80000000;
+ feature6 = 0x00000000;
+
+#ifdef USE_KEELOQ
+ feature6 |= 0x00000001; // xdrv_36_keeloq.ino
+#endif
+#ifdef USE_HRXL
+ feature6 |= 0x00000002; // xsns_64_hrxl.ino
+#endif
+#ifdef USE_SONOFF_D1
+ feature6 |= 0x00000004; // xdrv_37_sonoff_d1.ino
+#endif
+#ifdef USE_HDC1080
+ feature6 |= 0x00000008; // xsns_65_hdc1080.ino
+#endif
+
+// feature6 |= 0x00000010;
+// feature6 |= 0x00000020;
+// feature6 |= 0x00000040;
+// feature6 |= 0x00000080;
+
+// feature6 |= 0x00000100;
+// feature6 |= 0x00000200;
+// feature6 |= 0x00000400;
+// feature6 |= 0x00000800;
+
+// feature6 |= 0x00001000;
+// feature6 |= 0x00002000;
+// feature6 |= 0x00004000;
+// feature6 |= 0x00008000;
+
+// feature6 |= 0x00010000;
+// feature6 |= 0x00020000;
+// feature6 |= 0x00040000;
+// feature6 |= 0x00080000;
+
+// feature6 |= 0x00100000;
+// feature6 |= 0x00200000;
+// feature6 |= 0x00400000;
+// feature6 |= 0x00800000;
+
+// feature6 |= 0x01000000;
+// feature6 |= 0x02000000;
+// feature6 |= 0x04000000;
+// feature6 |= 0x08000000;
+
+// feature6 |= 0x10000000;
+// feature6 |= 0x20000000;
+// feature6 |= 0x40000000;
+// feature6 |= 0x80000000;
}
diff --git a/tasmota/support_flash_log.ino b/tasmota/support_flash_log.ino
index 8d02ec2e8..162ea1f0b 100644
--- a/tasmota/support_flash_log.ino
+++ b/tasmota/support_flash_log.ino
@@ -1,7 +1,7 @@
/*
support_flash_log.ino - log to flash support for Sonoff-Tasmota
- Copyright (C) 2019 Theo Arends & Christian Baars
+ Copyright (C) 2020 Theo Arends & Christian Baars
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
@@ -30,8 +30,8 @@
/********************************************************************************************\
| * Generic helper class to log arbitrary data to the OTA-partition
-| * Working principle: Add preferrable small chunks of data to the sector buffer, which will
-| * be written to FLASH when full automatically. The next sector will be
+| * Working principle: Add preferrable small chunks of data to the sector buffer, which will
+| * be written to FLASH when full automatically. The next sector will be
| * erased and is the anchor point for downloading and state configuration
| * after reboot.
\*********************************************************************************************/
@@ -93,7 +93,7 @@ public:
void startRecording(bool append);
void stopRecording(void);
- typedef void (*CallbackNoArgs) (); // simple typedef for a callback
+ typedef void (*CallbackNoArgs) (); // simple typedef for a callback
typedef void (*CallbackWithArgs) (uint8_t *_record); // typedef for a callback with one argument
void startDownload(size_t size, CallbackNoArgs sendHeader, CallbackWithArgs sendRecord, CallbackNoArgs sendFooter);
@@ -129,41 +129,41 @@ ready = true;
}
/********************************************************************************************\
-| *
+| *
| * private helper functions
-| *
+| *
\*********************************************************************************************/
/**
* @brief Read a sector into the global buffer
- *
+ *
* @param one_sector as an uint8_t
*/
void FLOG::_readSector(uint8_t one_sector){
- DEBUG_SENSOR_LOG(PSTR("FLOG: read sector number: %u" ), one_sector);
+ DEBUG_SENSOR_LOG(PSTR("FLOG: read sector number: %u" ), one_sector);
ESP.flashRead(start+(one_sector * FLASH_SECTOR_SIZE),(uint32_t *)§or.dword_buffer, FLASH_SECTOR_SIZE);
}
/**
* @brief Erase the given sector og the OTA-partition
- *
+ *
* @param one_sector as an uint8_t
*/
void FLOG::_eraseSector(uint8_t one_sector){ // Erase sector of FLOG/OTA
- DEBUG_SENSOR_LOG(PSTR("FLOG: erasing sector number: %u" ), one_sector);
+ DEBUG_SENSOR_LOG(PSTR("FLOG: erasing sector number: %u" ), one_sector);
ESP.flashEraseSector((start/FLASH_SECTOR_SIZE)+one_sector);
}
/**
* @brief Write the global buffer to the given sector
- *
+ *
* @param one_sector as an uint8_t
*/
void FLOG::_writeSector(uint8_t one_sector){ // Write sector of FLOG/OTA
- DEBUG_SENSOR_LOG(PSTR("FLOG: write buffer to sector number: %u" ), one_sector);
+ DEBUG_SENSOR_LOG(PSTR("FLOG: write buffer to sector number: %u" ), one_sector);
ESP.flashWrite(start+(one_sector * FLASH_SECTOR_SIZE),(uint32_t *)§or.dword_buffer, FLASH_SECTOR_SIZE);
}
/**
* @brief Clear the global buffer, but leave the header intact
- *
+ *
*/
void FLOG::_clearBuffer(){ //not the header
for (uint32_t i = sizeof(sector.header)/4; i<(sizeof(sector.dword_buffer)/4); i++){
@@ -174,7 +174,7 @@ void FLOG::_clearBuffer(){ //not the header
}
/**
* @brief Write global buffer to FLASH and set the current sector to the next valid position, maybe to 0
- *
+ *
*/
void FLOG::_saveBufferToSector(){ // save buffer to already erased(!) sector, erase next sector, clear buffer, increment number
DEBUG_SENSOR_LOG(PSTR("FLOG: write buffer to current sector: %u" ),current_sector);
@@ -193,7 +193,7 @@ void FLOG::_saveBufferToSector(){ // save buffer to already erased(!) sector, er
/**
* @brief Typically after restart find the first erased sector as a starting point for further operations
- *
+ *
*/
void FLOG::_findFirstErasedSector(){
for (uint32_t i = 0; i3){
break;
@@ -294,7 +294,7 @@ void FLOG::_showBuffer(void){
/**
* @brief pass a data entry/record as uint8_t array with its size
- *
+ *
* @param src uint8_t array
* @param size uint32_t size of the array
*/
@@ -327,7 +327,7 @@ void FLOG::addToBuffer(uint8_t src[], uint32_t size){
/**
* @brief shows that it is ready to accept recording
- *
+ *
* @param append - if true append to current log, else start a new log
*/
void FLOG::startRecording(bool append){
@@ -339,14 +339,14 @@ void FLOG::startRecording(bool append){
DEBUG_SENSOR_LOG(PSTR("FLOG: start recording"));
_initBuffer();
if(!found_saved_data) {
- append = false; // nothing to append to, we silently start a new log
+ append = false; // nothing to append to, we silently start a new log
}
if(append){
sector.header.number = _saved_header.number+1; // continue with the next number
sector.header.physical_start_sector = _saved_header.physical_start_sector; // keep the old start sector
}
else{ //new log, old data is lost
- sector.header.physical_start_sector = (uint16_t)first_erased_sector;
+ sector.header.physical_start_sector = (uint16_t)first_erased_sector;
found_saved_data = false;
sectors_left = 0;
}
@@ -354,7 +354,7 @@ void FLOG::startRecording(bool append){
/**
* @brief stop recording including saving current buffer to FLASH
- *
+ *
*/
void FLOG::stopRecording(void){
_saveBufferToSector();
@@ -367,16 +367,16 @@ void FLOG::stopRecording(void){
/**
* @brief Will start a downloads, needs the correct implementation of 3 callback functions
- *
+ *
* @param size: size of the data entry/record in bytes, i.e. sizeof(myStruct)
* @param sendHeader: should implement at least something like:
* @example WebServer->setContentLength(CONTENT_LENGTH_UNKNOWN); // This is very likely unknown!!
* WebServer->sendHeader(F("Content-Disposition"), F("attachment; filename=myfile.txt"));
* @param sendRecord: will receive the memory address as "uint8_t* addr" and should consume the current entry/record
- * @example myStruct_t *entry = (myStruct_t*)addr;
+ * @example myStruct_t *entry = (myStruct_t*)addr;
* Then make useful Strings and send it, i.e.: WebServer->sendContent_P(myString);
- * @param sendFooter: finish the download, should implement at least:
- * @example WebServer->sendContent("");
+ * @param sendFooter: finish the download, should implement at least:
+ * @example WebServer->sendContent("");
*/
void FLOG::startDownload(size_t size, CallbackNoArgs sendHeader, CallbackWithArgs sendRecord, CallbackNoArgs sendFooter){
@@ -409,7 +409,7 @@ void FLOG::stopRecording(void){
else{
bytes_left = 0;
DEBUG_SENSOR_LOG(PSTR("FLOG: Flog->bytes_left not dividable by 8 ??????"));
- }
+ }
}
next_sector++;
if(next_sector>num_sectors){
@@ -420,7 +420,7 @@ void FLOG::stopRecording(void){
bytes_left = sector.header.buf_pointer - sizeof(sector.header);
OsWatchLoop();
delay(sleep);
- }
+ }
running_download = false;
// Callback 3: create a footer or simply finish the download with an empty payload
sendFooter();
diff --git a/tasmota/support_float.ino b/tasmota/support_float.ino
index d08fc13f9..29613453a 100644
--- a/tasmota/support_float.ino
+++ b/tasmota/support_float.ino
@@ -1,7 +1,7 @@
/*
support_float.ino - Small floating point support for Tasmota
- Copyright (C) 2019 Theo Arends and Stephan Hadinger
+ Copyright (C) 2020 Theo Arends and Stephan Hadinger
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
diff --git a/tasmota/support_legacy_cores.ino b/tasmota/support_legacy_cores.ino
index a4c26e8c9..f8c5b3060 100644
--- a/tasmota/support_legacy_cores.ino
+++ b/tasmota/support_legacy_cores.ino
@@ -1,7 +1,7 @@
/*
support_legacy_cores.ino - Legacy arduino core support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
diff --git a/tasmota/support_rotary.ino b/tasmota/support_rotary.ino
index 1adf2423d..071b15b92 100644
--- a/tasmota/support_rotary.ino
+++ b/tasmota/support_rotary.ino
@@ -1,7 +1,7 @@
/*
support_rotary.ino - rotary switch support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -36,41 +36,34 @@ struct ROTARY {
/********************************************************************************************/
-void update_position(void)
-{
- uint8_t s;
-
- /*
- * https://github.com/PaulStoffregen/Encoder/blob/master/Encoder.h
- */
-
- s = Rotary.state & 3;
- 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;
- case 1: case 7: case 8: case 14:
- Rotary.position++; break;
- case 2: case 4: case 11: case 13:
- Rotary.position--; break;
- case 3: case 12:
- Rotary.position = Rotary.position + 2; break;
- default:
- Rotary.position = Rotary.position - 2; break;
- }
- Rotary.state = (s >> 2);
-}
-
#ifndef ARDUINO_ESP8266_RELEASE_2_3_0 // Fix core 2.5.x ISR not in IRAM Exception
void update_rotary(void) ICACHE_RAM_ATTR;
#endif // ARDUINO_ESP8266_RELEASE_2_3_0
void update_rotary(void)
{
- if (MI_DESK_LAMP == my_module_type){
- if (LightPower()) {
- update_position();
+ if (MI_DESK_LAMP == my_module_type) {
+ if (LightPowerIRAM()) {
+ /*
+ * https://github.com/PaulStoffregen/Encoder/blob/master/Encoder.h
+ */
+
+ uint8_t s = Rotary.state & 3;
+ 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;
+ case 1: case 7: case 8: case 14:
+ Rotary.position++; break;
+ case 2: case 4: case 11: case 13:
+ Rotary.position--; break;
+ case 3: case 12:
+ Rotary.position = Rotary.position + 2; break;
+ default:
+ Rotary.position = Rotary.position - 2; break;
+ }
+ Rotary.state = (s >> 2);
}
}
}
diff --git a/tasmota/support_rtc.ino b/tasmota/support_rtc.ino
index 823d0d650..3b7da8e37 100644
--- a/tasmota/support_rtc.ino
+++ b/tasmota/support_rtc.ino
@@ -1,7 +1,7 @@
/*
support_rtc.ino - Real Time Clock support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -47,7 +47,6 @@ struct RTC {
uint32_t ntp_time = 0;
uint32_t midnight = 0;
uint32_t restart_time = 0;
- int32_t drift_time = 0;
int32_t time_timezone = 0;
uint8_t ntp_sync_minute = 0;
bool midnight_now = false;
@@ -64,11 +63,6 @@ uint32_t LocalTime(void)
return Rtc.local_time;
}
-int32_t DriftTime(void)
-{
- return Rtc.drift_time;
-}
-
uint32_t Midnight(void)
{
return Rtc.midnight;
@@ -170,8 +164,8 @@ String GetDT(uint32_t time)
/*
* timestamps in https://en.wikipedia.org/wiki/ISO_8601 format
*
- * DT_UTC - current data and time in Greenwich, England (aka GMT)
- * DT_LOCAL - current date and time taking timezone into account
+ * DT_UTC - current data and time in Greenwich, England (aka GMT)
+ * DT_LOCAL - current date and time taking timezone into account
* DT_RESTART - the date and time this device last started, in local timezone
*
* Format:
@@ -184,18 +178,30 @@ String GetDateAndTime(uint8_t time_type)
uint32_t time = Rtc.local_time;
switch (time_type) {
- case DT_ENERGY:
- time = Settings.energy_kWhtotal_time;
- break;
case DT_UTC:
time = Rtc.utc_time;
break;
+// case DT_LOCALNOTZ: // Is default anyway but allows for not appendig timezone
+// time = Rtc.local_time;
+// break;
+ case DT_DST:
+ time = Rtc.daylight_saving_time;
+ break;
+ case DT_STD:
+ time = Rtc.standard_time;
+ break;
case DT_RESTART:
if (Rtc.restart_time == 0) {
return "";
}
time = Rtc.restart_time;
break;
+ case DT_ENERGY:
+ time = Settings.energy_kWhtotal_time;
+ break;
+ case DT_BOOTCOUNT:
+ time = Settings.bootcount_reset_time;
+ break;
}
String dt = GetDT(time); // 2017-03-07T11:08:02
if (Settings.flag3.time_append_timezone && (DT_LOCAL == time_type)) { // SetOption52 - Append timezone to JSON time
@@ -204,23 +210,6 @@ String GetDateAndTime(uint8_t time_type)
return dt; // 2017-03-07T11:08:02-07:00
}
-String GetTime(int type)
-{
- /* type 1 - Local time
- * type 2 - Daylight Savings time
- * type 3 - Standard time
- */
- char stime[25]; // Skip newline
-
- uint32_t time = Rtc.utc_time;
- if (1 == type) time = Rtc.local_time;
- if (2 == type) time = Rtc.daylight_saving_time;
- if (3 == type) time = Rtc.standard_time;
- snprintf_P(stime, sizeof(stime), sntp_get_real_time(time));
-
- return String(stime); // Thu Nov 01 11:41:02 2018
-}
-
uint32_t UpTime(void)
{
if (Rtc.restart_time) {
@@ -385,7 +374,6 @@ void RtcSecond(void)
Rtc.ntp_time = sntp_get_current_timestamp();
if (Rtc.ntp_time > START_VALID_TIME) { // Fix NTP bug in core 2.4.1/SDK 2.2.1 (returns Thu Jan 01 08:00:10 1970 after power on)
ntp_force_sync = false;
- if (Rtc.utc_time > START_VALID_TIME) { Rtc.drift_time = Rtc.ntp_time - Rtc.utc_time; }
Rtc.utc_time = Rtc.ntp_time;
Rtc.ntp_sync_minute = 60; // Sync so block further requests
if (Rtc.restart_time == 0) {
@@ -396,9 +384,9 @@ void RtcSecond(void)
Rtc.daylight_saving_time = RuleToTime(Settings.tflag[1], RtcTime.year);
Rtc.standard_time = RuleToTime(Settings.tflag[0], RtcTime.year);
- // Do not use AddLog here if syslog is enabled. UDP will force exception 9
- // AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION "(" D_UTC_TIME ") %s, (" D_DST_TIME ") %s, (" D_STD_TIME ") %s"), GetTime(0).c_str(), GetTime(2).c_str(), GetTime(3).c_str());
- ntp_synced_message = true;
+ // Do not use AddLog_P2 here (interrupt routine) if syslog or mqttlog is enabled. UDP/TCP will force exception 9
+ PrepLog_P2(LOG_LEVEL_DEBUG, PSTR("NTP: " D_UTC_TIME " %s, " D_DST_TIME " %s, " D_STD_TIME " %s"),
+ GetDateAndTime(DT_UTC).c_str(), GetDateAndTime(DT_DST).c_str(), GetDateAndTime(DT_STD).c_str());
if (Rtc.local_time < START_VALID_TIME) { // 2016-01-01
rules_flag.time_init = 1;
@@ -438,7 +426,12 @@ void RtcSecond(void)
}
Rtc.local_time += Rtc.time_timezone;
Rtc.time_timezone /= 60;
- if (!Settings.energy_kWhtotal_time) { Settings.energy_kWhtotal_time = Rtc.local_time; }
+ if (!Settings.energy_kWhtotal_time) {
+ Settings.energy_kWhtotal_time = Rtc.local_time;
+ }
+ if (Settings.bootcount_reset_time < START_VALID_TIME) {
+ Settings.bootcount_reset_time = Rtc.local_time;
+ }
}
BreakTime(Rtc.local_time, RtcTime);
diff --git a/tasmota/support_static_buffer.ino b/tasmota/support_static_buffer.ino
index b19ed931f..bec831cc9 100644
--- a/tasmota/support_static_buffer.ino
+++ b/tasmota/support_static_buffer.ino
@@ -1,7 +1,7 @@
/*
support_buffer.ino - Static binary buffer for Zigbee on Tasmota
- Copyright (C) 2019 Theo Arends and Stephan Hadinger
+ Copyright (C) 2020 Theo Arends and Stephan Hadinger
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
@@ -80,7 +80,7 @@ public:
return _buf->len;
}
size_t add32(const uint32_t data) { // append 32 bits value
- if (_buf->len < _buf->size - 3) { // do we have room for 2 bytes
+ if (_buf->len < _buf->size - 3) { // do we have room for 4 bytes
_buf->buf[_buf->len++] = data;
_buf->buf[_buf->len++] = data >> 8;
_buf->buf[_buf->len++] = data >> 16;
@@ -88,6 +88,19 @@ public:
}
return _buf->len;
}
+ size_t add64(const uint64_t data) { // append 64 bits value
+ if (_buf->len < _buf->size - 7) { // do we have room for 8 bytes
+ _buf->buf[_buf->len++] = data;
+ _buf->buf[_buf->len++] = data >> 8;
+ _buf->buf[_buf->len++] = data >> 16;
+ _buf->buf[_buf->len++] = data >> 24;
+ _buf->buf[_buf->len++] = data >> 32;
+ _buf->buf[_buf->len++] = data >> 40;
+ _buf->buf[_buf->len++] = data >> 48;
+ _buf->buf[_buf->len++] = data >> 56;
+ }
+ return _buf->len;
+ }
size_t addBuffer(const SBuffer &buf2) {
if (len() + buf2.len() <= size()) {
@@ -152,6 +165,20 @@ public:
return 0;
}
+ // if no NULL is found, returns length until the end of the buffer
+ inline size_t strlen(const size_t offset) const {
+ return strnlen((const char*) &_buf->buf[offset], len() - offset);
+ }
+
+ size_t strlen_s(const size_t offset) const {
+ size_t slen = this->strlen(offset);
+ if (slen == len() - offset) {
+ return 0; // we didn't find a NULL char
+ } else {
+ return slen;
+ }
+ }
+
SBuffer subBuffer(const size_t start, size_t len) const {
if (start >= _buf->len) {
len = 0;
diff --git a/tasmota/support_statistics.ino b/tasmota/support_statistics.ino
index 1907b1edc..59318e575 100644
--- a/tasmota/support_statistics.ino
+++ b/tasmota/support_statistics.ino
@@ -1,7 +1,7 @@
/*
support_statistics.ino - gather statistics for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
diff --git a/tasmota/support_switch.ino b/tasmota/support_switch.ino
index af085468a..f1d5c7ea2 100644
--- a/tasmota/support_switch.ino
+++ b/tasmota/support_switch.ino
@@ -1,7 +1,7 @@
/*
support_switch.ino - switch support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -17,8 +17,8 @@
along with this program. If not, see .
*/
-#define SWITCH_V2
-#ifdef SWITCH_V2
+#define SWITCH_V3
+#ifdef SWITCH_V3
/*********************************************************************************************\
* Switch support with input filter
*
@@ -48,21 +48,33 @@ void SwitchPullupFlag(uint16 switch_bit)
bitSet(Switch.no_pullup_mask, switch_bit);
}
-uint8_t SwitchLastState(uint8_t index)
-{
- return Switch.last_state[index];
-}
-
-void SwitchSetVirtual(uint8_t index, uint8_t state)
+void SwitchSetVirtual(uint32_t index, uint8_t state)
{
Switch.virtual_state[index] = state;
}
-uint8_t SwitchGetVirtual(uint8_t index)
+uint8_t SwitchGetVirtual(uint32_t index)
{
return Switch.virtual_state[index];
}
+uint8_t SwitchLastState(uint32_t index)
+{
+ return Switch.last_state[index];
+}
+
+bool SwitchState(uint32_t index)
+{
+ uint32_t switchmode = Settings.switchmode[index];
+ return ((FOLLOW_INV == switchmode) ||
+ (PUSHBUTTON_INV == switchmode) ||
+ (PUSHBUTTONHOLD_INV == switchmode) ||
+ (FOLLOWMULTI_INV == switchmode) ||
+ (PUSHHOLDMULTI_INV == switchmode) ||
+ (PUSHON_INV == switchmode)
+ ) ^ Switch.last_state[index];
+}
+
/*********************************************************************************************/
void SwitchProbe(void)
@@ -137,22 +149,50 @@ void SwitchHandler(uint8_t mode)
for (uint32_t i = 0; i < MAX_SWITCHES; i++) {
if ((pin[GPIO_SWT1 +i] < 99) || (mode)) {
+ uint8_t button = Switch.virtual_state[i];
+ uint8_t switchflag = POWER_TOGGLE +1;
if (Switch.hold_timer[i]) {
Switch.hold_timer[i]--;
if (0 == Switch.hold_timer[i]) {
- SendKey(KEY_SWITCH, i +1, POWER_HOLD); // Execute command via MQTT
+
+ switch (Settings.switchmode[i]) {
+ case TOGGLEMULTI:
+ switchflag = POWER_TOGGLE; // Toggle after hold
+ break;
+ case FOLLOWMULTI:
+ switchflag = button &1; // Follow wall switch state after hold
+ break;
+ case FOLLOWMULTI_INV:
+ switchflag = ~button &1; // Follow inverted wall switch state after hold
+ break;
+ case PUSHHOLDMULTI:
+ if (NOT_PRESSED == button) {
+ Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 25;
+ SendKey(KEY_SWITCH, i +1, POWER_INCREMENT); // Execute command via MQTT
+ } else {
+ SendKey(KEY_SWITCH, i +1, POWER_CLEAR); // Execute command via MQTT
+ }
+ break;
+ case PUSHHOLDMULTI_INV:
+ if (PRESSED == button) {
+ Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 25;
+ SendKey(KEY_SWITCH, i +1, POWER_INCREMENT); // Execute command via MQTT
+ } else {
+ SendKey(KEY_SWITCH, i +1, POWER_CLEAR); // Execute command via MQTT
+ }
+ break;
+ default:
+ SendKey(KEY_SWITCH, i +1, POWER_HOLD); // Execute command via MQTT
+ break;
+ }
}
}
- uint8_t button = Switch.virtual_state[i];
-
-// enum SwitchModeOptions {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE, MAX_SWITCH_OPTION};
-
- if (button != Switch.last_state[i]) {
- uint8_t switchflag = POWER_TOGGLE +1;
+ if (button != Switch.last_state[i]) { // This implies if ((PRESSED == button) then (NOT_PRESSED == Switch.last_state[i]))
switch (Settings.switchmode[i]) {
case TOGGLE:
+ case PUSHBUTTON_TOGGLE:
switchflag = POWER_TOGGLE; // Toggle
break;
case FOLLOW:
@@ -162,48 +202,111 @@ void SwitchHandler(uint8_t mode)
switchflag = ~button &1; // Follow inverted wall switch state
break;
case PUSHBUTTON:
- if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) {
+// if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) {
+ if (PRESSED == button) {
switchflag = POWER_TOGGLE; // Toggle with pushbutton to Gnd
}
break;
case PUSHBUTTON_INV:
- if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) {
+// if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) {
+ if (NOT_PRESSED == button) {
switchflag = POWER_TOGGLE; // Toggle with releasing pushbutton from Gnd
}
break;
- case PUSHBUTTON_TOGGLE:
- if (button != Switch.last_state[i]) {
- switchflag = POWER_TOGGLE; // Toggle with any pushbutton change
- }
- break;
case PUSHBUTTONHOLD:
- if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) {
- Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10;
+// if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) {
+ if (PRESSED == button) {
+ Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; // Start timer on button press
}
- if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i]) && (Switch.hold_timer[i])) {
- Switch.hold_timer[i] = 0;
- switchflag = POWER_TOGGLE; // Toggle with pushbutton to Gnd
+// if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i]) && (Switch.hold_timer[i])) {
+ if ((NOT_PRESSED == button) && (Switch.hold_timer[i])) {
+ Switch.hold_timer[i] = 0; // Button released and hold timer not expired : stop timer...
+ switchflag = POWER_TOGGLE; // ...and Toggle
}
break;
case PUSHBUTTONHOLD_INV:
+// if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) {
+ if (NOT_PRESSED == button) {
+ Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; // Start timer on button press...
+ }
+// if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i]) && (Switch.hold_timer[i])) {
+ if ((PRESSED == button) && (Switch.hold_timer[i])) {
+ Switch.hold_timer[i] = 0; // Button released and hold timer not expired : stop timer.
+ switchflag = POWER_TOGGLE; // ...and Toggle
+ }
+ break;
+/*
+ // Reverted Fix switchmode 6 according to issue 7778 (#7831)
+ case PUSHBUTTONHOLD_INV:
+ if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) {
+ Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; // Start timer on button press...
+ switchflag = POWER_TOGGLE; // ...and Toggle
+ }
if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) {
+ Switch.hold_timer[i] = 0; // Button released : stop timer.
+ }
+ break;
+*/
+ case TOGGLEMULTI:
+ case FOLLOWMULTI:
+ case FOLLOWMULTI_INV:
+ if (Switch.hold_timer[i]) {
+ Switch.hold_timer[i] = 0;
+ SendKey(KEY_SWITCH, i +1, POWER_HOLD); // Execute command via MQTT
+ } else {
+ Switch.hold_timer[i] = loops_per_second / 2; // 0.5 second multi press window
+ }
+ break;
+ case PUSHHOLDMULTI:
+// if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) {
+ if (NOT_PRESSED == button) {
+ if (Switch.hold_timer[i] != 0) {
+ SendKey(KEY_SWITCH, i +1, POWER_INV); // Execute command via MQTT
+ }
Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10;
}
- if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i]) && (Switch.hold_timer[i])) {
- Switch.hold_timer[i] = 0;
- switchflag = POWER_TOGGLE; // Toggle with pushbutton to Gnd
+// if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) {
+ if (PRESSED == button) {
+ if (Switch.hold_timer[i] > loops_per_second * Settings.param[P_HOLD_TIME] / 25) {
+ switchflag = POWER_TOGGLE; // Toggle with pushbutton
+ }
+ Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10;
+ }
+ break;
+ case PUSHHOLDMULTI_INV:
+// if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) {
+ if (PRESSED == button) {
+ if (Switch.hold_timer[i] != 0) {
+ SendKey(KEY_SWITCH, i +1, POWER_INV); // Execute command via MQTT
+ }
+ Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10;
+ }
+// if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) {
+ if (NOT_PRESSED == button) {
+ if (Switch.hold_timer[i] > loops_per_second * Settings.param[P_HOLD_TIME] / 25) {
+ switchflag = POWER_TOGGLE; // Toggle with pushbutton
+ }
+ Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10;
+ }
+ break;
+ case PUSHON:
+ if (PRESSED == button) {
+ switchflag = POWER_ON; // Power ON with pushbutton to Gnd
+ }
+ break;
+ case PUSHON_INV:
+ if (NOT_PRESSED == button) {
+ switchflag = POWER_ON; // Power ON with releasing pushbutton from Gnd
}
break;
}
-
- if (switchflag <= POWER_TOGGLE) {
- if (!SendKey(KEY_SWITCH, i +1, switchflag)) { // Execute command via MQTT
- ExecuteCommandPower(i +1, switchflag, SRC_SWITCH); // Execute command internally (if i < devices_present)
- }
- }
-
Switch.last_state[i] = button;
}
+ if (switchflag <= POWER_TOGGLE) {
+ if (!SendKey(KEY_SWITCH, i +1, switchflag)) { // Execute command via MQTT
+ ExecuteCommandPower(i +1, switchflag, SRC_SWITCH); // Execute command internally (if i < devices_present)
+ }
+ }
}
}
}
@@ -218,4 +321,4 @@ void SwitchLoop(void)
}
}
-#endif // SWITCH_V2
+#endif // SWITCH_V3
diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino
index c649d9379..d8ca2668c 100644
--- a/tasmota/support_tasmota.ino
+++ b/tasmota/support_tasmota.ino
@@ -1,7 +1,7 @@
/*
support_tasmota.ino - Core support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -107,7 +107,7 @@ char* GetTopic_P(char *stopic, uint32_t prefix, char *topic, const char* subtopi
fulltopic += F("/");
fulltopic += FPSTR(MQTT_TOKEN_PREFIX); // Need prefix for commands to handle mqtt topic loops
}
- for (uint32_t i = 0; i < 3; i++) {
+ for (uint32_t i = 0; i < MAX_MQTT_PREFIXES; i++) {
if (!strlen(SettingsText(SET_MQTTPREFIX1 + i))) {
char temp[TOPSZ];
SettingsUpdateText(SET_MQTTPREFIX1 + i, GetTextIndexed(temp, sizeof(temp), i, kPrefixes));
@@ -144,7 +144,7 @@ char* GetFallbackTopic_P(char *stopic, const char* subtopic)
char* GetStateText(uint32_t state)
{
- if (state > 3) {
+ if (state >= MAX_STATE_TEXT) {
state = 1;
}
return SettingsText(SET_STATE_TXT1 + state);
@@ -235,7 +235,8 @@ void SetDevicePower(power_t rpower, uint32_t source)
void RestorePower(bool publish_power, uint32_t source)
{
if (power != last_power) {
- SetDevicePower(last_power, source);
+ power = last_power;
+ SetDevicePower(power, source);
if (publish_power) {
MqttPublishAllPowerState();
}
@@ -276,6 +277,60 @@ void SetAllPower(uint32_t state, uint32_t source)
}
}
+void SetPowerOnState(void)
+{
+ 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 {
+ if ((ResetReason() == REASON_DEFAULT_RST) || (ResetReason() == REASON_EXT_SYS_RST)) {
+ switch (Settings.poweronstate) {
+ case POWER_ALL_OFF:
+ case POWER_ALL_OFF_PULSETIME_ON:
+ power = 0;
+ SetDevicePower(power, SRC_RESTART);
+ break;
+ case POWER_ALL_ON: // All on
+ power = (1 << devices_present) -1;
+ SetDevicePower(power, SRC_RESTART);
+ break;
+ case POWER_ALL_SAVED_TOGGLE:
+ power = (Settings.power & ((1 << devices_present) -1)) ^ POWER_MASK;
+ if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart
+ SetDevicePower(power, SRC_RESTART);
+ }
+ break;
+ case POWER_ALL_SAVED:
+ power = Settings.power & ((1 << devices_present) -1);
+ if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart
+ SetDevicePower(power, SRC_RESTART);
+ }
+ break;
+ }
+ } else {
+ power = Settings.power & ((1 << devices_present) -1);
+ if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart
+ SetDevicePower(power, SRC_RESTART);
+ }
+ }
+ }
+
+ // Issue #526 and #909
+ for (uint32_t i = 0; i < devices_present; i++) {
+ if (!Settings.flag3.no_power_feedback) { // SetOption63 - Don't scan relay power state at restart - #5594 and #5663
+ if ((i < MAX_RELAYS) && (pin[GPIO_REL1 +i] < 99)) {
+ bitWrite(power, i, digitalRead(pin[GPIO_REL1 +i]) ^ bitRead(rel_inverted, i));
+ }
+ }
+ if ((i < MAX_PULSETIMERS) && (bitRead(power, i) || (POWER_ALL_OFF_PULSETIME_ON == Settings.poweronstate))) {
+ SetPulseTimer(i, Settings.pulse_timer[i]);
+ }
+ }
+ blink_powersave = power;
+}
+
void SetLedPowerIdx(uint32_t led, uint32_t state)
{
if ((99 == pin[GPIO_LEDLNK]) && (0 == led)) { // Legacy - LED1 is link led only if LED2 is present
@@ -293,6 +348,11 @@ void SetLedPowerIdx(uint32_t led, uint32_t state)
}
DigitalWrite(GPIO_LED1 + led, bitRead(led_inverted, led) ? !state : state);
}
+#ifdef USE_BUZZER
+ if (led == 0) {
+ BuzzerSetStateToLed(state);
+ }
+#endif // USE_BUZZER
}
void SetLedPower(uint32_t state)
@@ -328,6 +388,9 @@ void SetLedLink(uint32_t state)
if (state) { state = 1; }
digitalWrite(led_pin, (led_inv) ? !state : state);
}
+#ifdef USE_BUZZER
+ BuzzerSetStateToLed(state);
+#endif // USE_BUZZER
}
void SetPulseTimer(uint32_t index, uint32_t time)
@@ -361,6 +424,7 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state)
char scommand[CMDSZ];
char key_topic[TOPSZ];
bool result = false;
+ uint32_t device_save = device;
char *tmp = (key) ? SettingsText(SET_MQTT_SWITCH_TOPIC) : SettingsText(SET_MQTT_BUTTON_TOPIC);
Format(key_topic, tmp, sizeof(key_topic));
@@ -384,9 +448,9 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state)
#ifdef USE_DOMOTICZ
if (!(DomoticzSendKey(key, device, state, strlen(mqtt_data)))) {
#endif // USE_DOMOTICZ
- MqttPublishDirect(stopic, ((key) ? Settings.flag.mqtt_switch_retain // CMND_SWITCHRETAIN
- : Settings.flag.mqtt_button_retain) && // CMND_BUTTONRETAIN
- (state != POWER_HOLD || !Settings.flag3.no_hold_retain)); // SetOption62 - Don't use retain flag on HOLD messages
+ MqttPublish(stopic, ((key) ? Settings.flag.mqtt_switch_retain // CMND_SWITCHRETAIN
+ : Settings.flag.mqtt_button_retain) && // CMND_BUTTONRETAIN
+ (state != POWER_HOLD || !Settings.flag3.no_hold_retain)); // SetOption62 - Don't use retain flag on HOLD messages
#ifdef USE_DOMOTICZ
}
#endif // USE_DOMOTICZ
@@ -396,7 +460,7 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state)
result = XdrvRulesProcess();
}
int32_t payload_save = XdrvMailbox.payload;
- XdrvMailbox.payload = key << 16 | state << 8 | device;
+ XdrvMailbox.payload = device_save << 24 | key << 16 | state << 8 | device;
XdrvCall(FUNC_ANY_KEY);
XdrvMailbox.payload = payload_save;
return result;
@@ -478,6 +542,9 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t source)
case POWER_TOGGLE:
power ^= mask;
}
+#ifdef USE_DEVICE_GROUPS
+ if (SRC_REMOTE != source && SRC_RETRY != source) SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, power);
+#endif // USE_DEVICE_GROUPS
SetDevicePower(power, source);
#ifdef USE_DOMOTICZ
DomoticzUpdatePowerState(device);
@@ -584,9 +651,10 @@ void MqttShowState(void)
MqttShowPWMState();
}
+ int32_t rssi = WiFi.RSSI();
ResponseAppend_P(PSTR(",\"" D_JSON_WIFI "\":{\"" D_JSON_AP "\":%d,\"" D_JSON_SSID "\":\"%s\",\"" D_JSON_BSSID "\":\"%s\",\"" D_JSON_CHANNEL "\":%d,\"" D_JSON_RSSI "\":%d,\"" D_JSON_SIGNAL "\":%d,\"" D_JSON_LINK_COUNT "\":%d,\"" D_JSON_DOWNTIME "\":\"%s\"}}"),
Settings.sta_active +1, SettingsText(SET_STASSID1 + Settings.sta_active), WiFi.BSSIDstr().c_str(), WiFi.channel(),
- WifiGetRssiAsQuality(WiFi.RSSI()), WiFi.RSSI(), WifiLinkCount(), WifiDowntime().c_str());
+ WifiGetRssiAsQuality(rssi), rssi, WifiLinkCount(), WifiDowntime().c_str());
}
void MqttPublishTeleState(void)
@@ -599,6 +667,30 @@ void MqttPublishTeleState(void)
#endif // USE_SCRIPT
}
+void TempHumDewShow(bool json, bool pass_on, const char *types, float f_temperature, float f_humidity)
+{
+ if (json) {
+ ResponseAppend_P(PSTR(",\"%s\":{"), types);
+ ResponseAppendTHD(f_temperature, f_humidity);
+ ResponseJsonEnd();
+#ifdef USE_DOMOTICZ
+ if (pass_on) {
+ DomoticzTempHumPressureSensor(f_temperature, f_humidity);
+ }
+#endif // USE_DOMOTICZ
+#ifdef USE_KNX
+ if (pass_on) {
+ KnxSensor(KNX_TEMPERATURE, f_temperature);
+ KnxSensor(KNX_HUMIDITY, f_humidity);
+ }
+#endif // USE_KNX
+#ifdef USE_WEBSERVER
+ } else {
+ WSContentSend_THD(types, f_temperature, f_humidity);
+#endif // USE_WEBSERVER
+ }
+}
+
bool MqttShowSensor(void)
{
ResponseAppendTime();
@@ -610,8 +702,7 @@ bool MqttShowSensor(void)
#else
if (pin[GPIO_SWT1 +i] < 99) {
#endif // USE_TM1638
- bool swm = ((FOLLOW_INV == Settings.switchmode[i]) || (PUSHBUTTON_INV == Settings.switchmode[i]) || (PUSHBUTTONHOLD_INV == Settings.switchmode[i]));
- ResponseAppend_P(PSTR(",\"" D_JSON_SWITCH "%d\":\"%s\""), i +1, GetStateText(swm ^ SwitchLastState(i)));
+ ResponseAppend_P(PSTR(",\"" D_JSON_SWITCH "%d\":\"%s\""), i +1, GetStateText(SwitchState(i)));
}
}
XsnsCall(FUNC_JSON_APPEND);
@@ -624,6 +715,9 @@ bool MqttShowSensor(void)
if (strstr_P(mqtt_data, PSTR(D_JSON_TEMPERATURE)) != nullptr) {
ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), TempUnit());
}
+ if ((strstr_P(mqtt_data, PSTR(D_JSON_SPEED)) != nullptr) && Settings.flag2.speed_conversion) {
+ ResponseAppend_P(PSTR(",\"" D_JSON_SPEED_UNIT "\":\"%s\""), SpeedUnit().c_str());
+ }
ResponseJsonEnd();
if (json_data_available) { XdrvCall(FUNC_SHOW_SENSOR); }
@@ -638,19 +732,17 @@ void MqttPublishSensor(void)
}
}
-/********************************************************************************************/
+/*********************************************************************************************\
+ * State loops
+\*********************************************************************************************/
+/*-------------------------------------------------------------------------------------------*\
+ * Every second
+\*-------------------------------------------------------------------------------------------*/
void PerformEverySecond(void)
{
uptime++;
- if (ntp_synced_message) {
- // Moved here to fix syslog UDP exception 9 during RtcSecond
- AddLog_P2(LOG_LEVEL_DEBUG, PSTR("NTP: Drift %d, (" D_UTC_TIME ") %s, (" D_DST_TIME ") %s, (" D_STD_TIME ") %s"),
- DriftTime(), GetTime(0).c_str(), GetTime(2).c_str(), GetTime(3).c_str());
- ntp_synced_message = false;
- }
-
if (POWER_CYCLE_TIME == uptime) {
UpdateQuickPowerCycle(false);
}
@@ -668,6 +760,13 @@ void PerformEverySecond(void)
#endif
}
+ if (mqtt_cmnd_blocked_reset) {
+ mqtt_cmnd_blocked_reset--;
+ if (!mqtt_cmnd_blocked_reset) {
+ mqtt_cmnd_blocked = 0; // Clean up MQTT cmnd loop block
+ }
+ }
+
if (seriallog_timer) {
seriallog_timer--;
if (!seriallog_timer) {
@@ -710,15 +809,13 @@ void PerformEverySecond(void)
#endif // USE_RULES
}
+ XsnsCall(FUNC_AFTER_TELEPERIOD);
XdrvCall(FUNC_AFTER_TELEPERIOD);
}
}
}
}
-/*********************************************************************************************\
- * State loops
-\*********************************************************************************************/
/*-------------------------------------------------------------------------------------------*\
* Every 0.1 second
\*-------------------------------------------------------------------------------------------*/
@@ -728,6 +825,10 @@ void Every100mSeconds(void)
// As the max amount of sleep = 250 mSec this loop will shift in time...
power_t power_now;
+ if (prepped_loglevel) {
+ AddLog(prepped_loglevel);
+ }
+
if (latching_relay_pulse) {
latching_relay_pulse--;
if (!latching_relay_pulse) SetLatchingRelay(0, 0);
@@ -770,8 +871,6 @@ void Every250mSeconds(void)
state_250mS++;
state_250mS &= 0x3;
- if (mqtt_cmnd_publish) mqtt_cmnd_publish--; // Clean up
-
if (!Settings.flag.global_state) { // Problem blinkyblinky enabled - SetOption31 - Control link led blinking
if (global_state.data) { // Any problem
if (global_state.mqtt_down) { blinkinterval = 7; } // MQTT problem so blink every 2 seconds (slowest)
@@ -833,15 +932,45 @@ void Every250mSeconds(void)
strlcpy(mqtt_data, GetOtaUrl(log_data, sizeof(log_data)), sizeof(mqtt_data));
#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 != nullptr) ? bch : mqtt_data, '-'); // Change from filename-DE.bin into filename-minimal.bin
- char *ech = strrchr((bch != nullptr) ? bch : mqtt_data, '.'); // Change from filename.bin into filename-minimal.bin
- if (!pch) { pch = ech; }
- if (pch) {
- mqtt_data[pch - mqtt_data] = '\0';
- char *ech = strrchr(SettingsText(SET_OTAURL), '.'); // Change from filename.bin into filename-minimal.bin
- snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s-" D_JSON_MINIMAL "%s"), mqtt_data, ech); // Minimal filename must be filename-minimal
+ // OTA File too large so try OTA minimal version
+ // Replace tasmota with tasmota-minimal
+ // Replace tasmota-DE with tasmota-minimal
+ // Replace tasmota.bin with tasmota-minimal.bin
+ // Replace tasmota.xyz with tasmota-minimal.xyz
+ // Replace tasmota.bin.gz with tasmota-minimal.bin.gz
+ // Replace tasmota.xyz.gz with tasmota-minimal.xyz.gz
+ // Replace tasmota.ino.bin with tasmota-minimal.ino.bin
+ // Replace tasmota.ino.bin.gz with tasmota-minimal.ino.bin.gz
+ // Replace http://domus1:80/api/arduino/tasmota.bin with http://domus1:80/api/arduino/tasmota-minimal.bin
+ // Replace http://domus1:80/api/arduino/tasmota.bin.gz with http://domus1:80/api/arduino/tasmota-minimal.bin.gz
+ // Replace http://domus1:80/api/arduino/tasmota-DE.bin.gz with http://domus1:80/api/arduino/tasmota-minimal.bin.gz
+ // Replace http://domus1:80/api/ard-uino/tasmota-DE.bin.gz with http://domus1:80/api/ard-uino/tasmota-minimal.bin.gz
+ // Replace http://192.168.2.17:80/api/arduino/tasmota.bin with http://192.168.2.17:80/api/arduino/tasmota-minimal.bin
+ // Replace http://192.168.2.17/api/arduino/tasmota.bin.gz with http://192.168.2.17/api/arduino/tasmota-minimal.bin.gz
+
+ char *bch = strrchr(mqtt_data, '/'); // Only consider filename after last backslash prevent change of urls having "-" in it
+ if (bch == nullptr) { bch = mqtt_data; } // No path found so use filename only
+/*
+ char *ech = strrchr(bch, '.'); // Find file type in filename (none, .bin or .gz)
+ if ((ech != nullptr) && (0 == strncasecmp_P(ech, PSTR(".GZ"), 3))) {
+ char *fch = ech;
+ *fch = '\0';
+ ech = strrchr(bch, '.'); // Find file type .bin.gz
+ *fch = '.';
}
+*/
+ char *ech = strchr(bch, '.'); // Find file type in filename (none, .ino.bin, .ino.bin.gz, .bin, .bin.gz or .gz)
+ if (ech == nullptr) { ech = mqtt_data + strlen(mqtt_data); } // Point to '/0' at end of mqtt_data becoming an empty string
+
+//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("OTA: File type [%s]"), ech);
+
+ char ota_url_type[strlen(ech) +1];
+ strncpy(ota_url_type, ech, sizeof(ota_url_type)); // Either empty, .ino.bin, .ino.bin.gz, .bin, .bin.gz or .gz
+
+ char *pch = strrchr(bch, '-'); // Find last dash (-) and ignore remainder - handles tasmota-DE
+ if (pch == nullptr) { pch = ech; } // No dash so ignore filetype
+ *pch = '\0'; // mqtt_data = http://domus1:80/api/arduino/tasmota
+ snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s-" D_JSON_MINIMAL "%s"), mqtt_data, ota_url_type); // Minimal filename must be filename-minimal
}
#endif // FIRMWARE_MINIMAL
AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPLOAD "%s"), mqtt_data);
@@ -869,8 +998,7 @@ void Every250mSeconds(void)
Response_P(PSTR("{\"" D_CMND_UPGRADE "\":\""));
if (ota_result) {
// SetFlashModeDout(); // Force DOUT for both ESP8266 and ESP8285
- if (OtaVersion() < VERSION_COMPATIBLE) {
- AbandonOta();
+ if (!VersionCompatible()) {
ResponseAppend_P(PSTR(D_JSON_FAILED " " D_UPLOAD_ERR_14));
} else {
ResponseAppend_P(PSTR(D_JSON_SUCCESSFUL ". " D_JSON_RESTARTING));
@@ -1000,7 +1128,9 @@ void ArduinoOTAInit(void)
{
ArduinoOTA.setPort(8266);
ArduinoOTA.setHostname(my_hostname);
- if (strlen(SettingsText(SET_WEBPWD))) { ArduinoOTA.setPassword(SettingsText(SET_WEBPWD)); }
+ if (strlen(SettingsText(SET_WEBPWD))) {
+ ArduinoOTA.setPassword(SettingsText(SET_WEBPWD));
+ }
ArduinoOTA.onStart([]()
{
@@ -1059,6 +1189,14 @@ void ArduinoOTAInit(void)
ArduinoOTA.begin();
AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_UPLOAD "Arduino OTA " D_ENABLED " " D_PORT " 8266"));
}
+
+void ArduinoOtaLoop(void)
+{
+ MDNS.update();
+ ArduinoOTA.handle();
+ // Once OTA is triggered, only handle that and dont do other stuff. (otherwise it fails)
+ while (arduino_ota_triggered) { ArduinoOTA.handle(); }
+}
#endif // USE_ARDUINO_OTA
/********************************************************************************************/
@@ -1146,8 +1284,11 @@ void SerialInput(void)
if (Settings.flag.mqtt_serial && serial_in_byte_counter && (millis() > (serial_polling_window + SERIAL_POLLING))) { // CMND_SERIALSEND and CMND_SERIALLOG
serial_in_buffer[serial_in_byte_counter] = 0; // Serial data completed
char hex_char[(serial_in_byte_counter * 2) + 2];
- Response_P(PSTR("{\"" D_JSON_SERIALRECEIVED "\":\"%s\"}"),
- (Settings.flag.mqtt_serial_raw) ? ToHex_P((unsigned char*)serial_in_buffer, serial_in_byte_counter, hex_char, sizeof(hex_char)) : serial_in_buffer);
+ bool assume_json = (!Settings.flag.mqtt_serial_raw && (serial_in_buffer[0] == '{'));
+ Response_P(PSTR("{\"" D_JSON_SERIALRECEIVED "\":%s%s%s}"),
+ (assume_json) ? "" : """",
+ (Settings.flag.mqtt_serial_raw) ? ToHex_P((unsigned char*)serial_in_buffer, serial_in_byte_counter, hex_char, sizeof(hex_char)) : serial_in_buffer,
+ (assume_json) ? "" : """");
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SERIALRECEIVED));
XdrvRulesProcess();
serial_in_byte_counter = 0;
@@ -1169,7 +1310,8 @@ void GpioInit(void)
SetModuleType();
if (Settings.module != Settings.last_module) {
- baudrate = APP_BAUDRATE;
+ Settings.baudrate = APP_BAUDRATE / 300;
+ Settings.serial_config = TS_SERIAL_8N1;
}
for (uint32_t i = 0; i < sizeof(Settings.user_template.gp); i++) {
@@ -1296,20 +1438,16 @@ void GpioInit(void)
// devices_present = 1;
}
else if (SONOFF_DUAL == my_module_type) {
- Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
devices_present = 2;
- baudrate = 19200;
+ SetSerial(19200, TS_SERIAL_8N1);
}
else if (CH4 == my_module_type) {
- Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
devices_present = 4;
- baudrate = 19200;
+ SetSerial(19200, TS_SERIAL_8N1);
}
#ifdef USE_SONOFF_SC
else if (SONOFF_SC == my_module_type) {
- Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
- devices_present = 0;
- baudrate = 19200;
+ SetSerial(19200, TS_SERIAL_8N1);
}
#endif // USE_SONOFF_SC
@@ -1358,6 +1496,10 @@ void GpioInit(void)
digitalWrite(pin[GPIO_LEDLNK], ledlnk_inverted);
}
+#ifdef USE_PWM_DIMMER
+ if (PWM_DIMMER == my_module_type && pin[GPIO_REL1] < 99) devices_present--;
+#endif // USE_PWM_DIMMER
+
ButtonInit();
SwitchInit();
#ifdef ROTARY_V1
diff --git a/tasmota/support_udp.ino b/tasmota/support_udp.ino
index 9a33bcfed..701abee66 100644
--- a/tasmota/support_udp.ino
+++ b/tasmota/support_udp.ino
@@ -1,7 +1,7 @@
/*
support_udp.ino - Udp support for Tasmota
- Copyright (C) 2019 Heiko Krupp and Theo Arends
+ Copyright (C) 2020 Heiko Krupp 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
@@ -58,7 +58,7 @@ bool UdpDisconnect(void)
bool UdpConnect(void)
{
- if (!udp_connected) {
+ if (!udp_connected && !restart_flag) {
// Simple Service Discovery Protocol (SSDP)
if (PortUdp.beginMulticast(WiFi.localIP(), IPAddress(239,255,255,250), 1900)) {
AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_UPNP D_MULTICAST_REJOINED));
@@ -85,54 +85,62 @@ void PollUdp(void)
// AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("\n%s"), packet_buffer);
// Simple Service Discovery Protocol (SSDP)
-#ifdef USE_SCRIPT_HUE
- if (!udp_response_mutex && (strstr_P(packet_buffer, PSTR("M-SEARCH")) != nullptr)) {
+ if (Settings.flag2.emulation) {
+#if defined(USE_SCRIPT_HUE) || defined(USE_ZIGBEE)
+ if (!udp_response_mutex && (strstr_P(packet_buffer, PSTR("M-SEARCH")) != nullptr)) {
#else
- if (devices_present && !udp_response_mutex && (strstr_P(packet_buffer, PSTR("M-SEARCH")) != nullptr)) {
+ if (devices_present && !udp_response_mutex && (strstr_P(packet_buffer, PSTR("M-SEARCH")) != nullptr)) {
#endif
- udp_response_mutex = true;
+ udp_response_mutex = true;
- udp_remote_ip = PortUdp.remoteIP();
- udp_remote_port = PortUdp.remotePort();
+ udp_remote_ip = PortUdp.remoteIP();
+ udp_remote_port = PortUdp.remotePort();
// AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("UDP: M-SEARCH Packet from %s:%d\n%s"),
// udp_remote_ip.toString().c_str(), udp_remote_port, packet_buffer);
- uint32_t response_delay = UDP_MSEARCH_SEND_DELAY + ((millis() &0x7) * 100); // 1500 - 2200 msec
+ uint32_t response_delay = UDP_MSEARCH_SEND_DELAY + ((millis() &0x7) * 100); // 1500 - 2200 msec
- LowerCase(packet_buffer, packet_buffer);
- RemoveSpace(packet_buffer);
+ LowerCase(packet_buffer, packet_buffer);
+ RemoveSpace(packet_buffer);
#ifdef USE_EMULATION_WEMO
- if (EMUL_WEMO == Settings.flag2.emulation) {
- if (strstr_P(packet_buffer, URN_BELKIN_DEVICE) != nullptr) { // type1 echo dot 2g, echo 1g's
- TickerMSearch.attach_ms(response_delay, WemoRespondToMSearch, 1);
- return;
+ if (EMUL_WEMO == Settings.flag2.emulation) {
+ if (strstr_P(packet_buffer, URN_BELKIN_DEVICE) != nullptr) { // type1 echo dot 2g, echo 1g's
+ TickerMSearch.attach_ms(response_delay, WemoRespondToMSearch, 1);
+ return;
+ }
+ else if ((strstr_P(packet_buffer, UPNP_ROOTDEVICE) != nullptr) || // type2 Echo 2g (echo & echo plus)
+ (strstr_P(packet_buffer, SSDPSEARCH_ALL) != nullptr) ||
+ (strstr_P(packet_buffer, SSDP_ALL) != nullptr)) {
+ TickerMSearch.attach_ms(response_delay, WemoRespondToMSearch, 2);
+ return;
+ }
}
- else if ((strstr_P(packet_buffer, UPNP_ROOTDEVICE) != nullptr) || // type2 Echo 2g (echo & echo plus)
- (strstr_P(packet_buffer, SSDPSEARCH_ALL) != nullptr) ||
- (strstr_P(packet_buffer, SSDP_ALL) != nullptr)) {
- TickerMSearch.attach_ms(response_delay, WemoRespondToMSearch, 2);
- return;
- }
- }
#endif // USE_EMULATION_WEMO
#ifdef USE_EMULATION_HUE
- if (EMUL_HUE == Settings.flag2.emulation) {
- if ((strstr_P(packet_buffer, PSTR(":device:basic:1")) != nullptr) ||
- (strstr_P(packet_buffer, UPNP_ROOTDEVICE) != nullptr) ||
- (strstr_P(packet_buffer, SSDPSEARCH_ALL) != nullptr) ||
- (strstr_P(packet_buffer, SSDP_ALL) != nullptr)) {
- TickerMSearch.attach_ms(response_delay, HueRespondToMSearch);
- return;
+ if (EMUL_HUE == Settings.flag2.emulation) {
+ if ((strstr_P(packet_buffer, PSTR(":device:basic:1")) != nullptr) ||
+ (strstr_P(packet_buffer, UPNP_ROOTDEVICE) != nullptr) ||
+ (strstr_P(packet_buffer, SSDPSEARCH_ALL) != nullptr) ||
+ (strstr_P(packet_buffer, SSDP_ALL) != nullptr)) {
+ TickerMSearch.attach_ms(response_delay, HueRespondToMSearch);
+ return;
+ }
}
- }
#endif // USE_EMULATION_HUE
- udp_response_mutex = false;
+ udp_response_mutex = false;
+ continue;
+ }
}
+#ifdef USE_DEVICE_GROUPS
+ if (Settings.flag4.device_groups_enabled && !strncmp_P(packet_buffer, kDeviceGroupMessage, sizeof(DEVICE_GROUP_MESSAGE) - 1)) {
+ ProcessDeviceGroupMessage(packet_buffer, len);
+ }
+#endif // USE_DEVICE_GROUPS
}
optimistic_yield(100);
}
diff --git a/tasmota/support_wifi.ino b/tasmota/support_wifi.ino
index c283f1bb5..f4e88a49d 100644
--- a/tasmota/support_wifi.ino
+++ b/tasmota/support_wifi.ino
@@ -1,7 +1,7 @@
/*
support_wifi.ino - wifi support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -21,6 +21,11 @@
* Wifi
\*********************************************************************************************/
+// Enable one of three below options for wifi re-connection debugging
+//#define WIFI_FORCE_RF_CAL_ERASE // Erase rf calibration sector on restart only
+//#define WIFI_RF_MODE_RF_CAL // Set RF_MODE to RF_CAL for restart and deepsleep during user_rf_pre_init
+//#define WIFI_RF_PRE_INIT // Set RF_MODE to RF_CAL for restart, deepsleep and power on during user_rf_pre_init
+
#ifndef WIFI_RSSI_THRESHOLD
#define WIFI_RSSI_THRESHOLD 10 // Difference in dB between current network and scanned network
#endif
@@ -30,7 +35,7 @@
const uint8_t WIFI_CONFIG_SEC = 180; // seconds before restart
const uint8_t WIFI_CHECK_SEC = 20; // seconds
-const uint8_t WIFI_RETRY_OFFSET_SEC = 20; // seconds
+const uint8_t WIFI_RETRY_OFFSET_SEC = 12; // seconds
#include // Wifi, MQTT, Ota, WifiManager
#if LWIP_IPV6
@@ -50,6 +55,7 @@ struct WIFI {
uint8_t mdns_begun = 0; // mDNS active
uint8_t scan_state;
uint8_t bssid[6];
+ int8_t best_network_db;
} Wifi;
int WifiGetRssiAsQuality(int rssi)
@@ -198,13 +204,18 @@ void WifiBegin(uint8_t flag, uint8_t channel)
WiFi.config(Settings.ip_address[0], Settings.ip_address[1], Settings.ip_address[2], Settings.ip_address[3]); // Set static IP
}
WiFi.hostname(my_hostname);
+
+ char stemp[40] = { 0 };
if (channel) {
WiFi.begin(SettingsText(SET_STASSID1 + Settings.sta_active), SettingsText(SET_STAPWD1 + Settings.sta_active), channel, Wifi.bssid);
+ // Add connected BSSID and channel for multi-AP installations
+ char hex_char[18];
+ snprintf_P(stemp, sizeof(stemp), PSTR(" Channel %d BSSId %s"), channel, ToHex_P((unsigned char*)Wifi.bssid, 6, hex_char, sizeof(hex_char), ':'));
} else {
WiFi.begin(SettingsText(SET_STASSID1 + Settings.sta_active), SettingsText(SET_STAPWD1 + Settings.sta_active));
}
- AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CONNECTING_TO_AP "%d %s " D_IN_MODE " 11%c " D_AS " %s..."),
- Settings.sta_active +1, SettingsText(SET_STASSID1 + Settings.sta_active), kWifiPhyMode[WiFi.getPhyMode() & 0x3], my_hostname);
+ AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CONNECTING_TO_AP "%d %s%s " D_IN_MODE " 11%c " D_AS " %s..."),
+ Settings.sta_active +1, SettingsText(SET_STASSID1 + Settings.sta_active), stemp, kWifiPhyMode[WiFi.getPhyMode() & 0x3], my_hostname);
#if LWIP_IPV6
for (bool configured = false; !configured;) {
@@ -223,22 +234,22 @@ void WifiBegin(uint8_t flag, uint8_t channel)
void WifiBeginAfterScan(void)
{
- static int8_t best_network_db;
-
// Not active
if (0 == Wifi.scan_state) { return; }
// Init scan when not connected
if (1 == Wifi.scan_state) {
memset((void*) &Wifi.bssid, 0, sizeof(Wifi.bssid));
- best_network_db = -127;
+ Wifi.best_network_db = -127;
Wifi.scan_state = 3;
}
// Init scan when connected
if (2 == Wifi.scan_state) {
uint8_t* bssid = WiFi.BSSID(); // Get current bssid
memcpy((void*) &Wifi.bssid, (void*) bssid, sizeof(Wifi.bssid));
- best_network_db = WiFi.RSSI(); // Get current rssi and add threshold
- if (best_network_db < -WIFI_RSSI_THRESHOLD) { best_network_db += WIFI_RSSI_THRESHOLD; }
+ Wifi.best_network_db = WiFi.RSSI(); // Get current rssi and add threshold
+ if (Wifi.best_network_db < -WIFI_RSSI_THRESHOLD) {
+ Wifi.best_network_db += WIFI_RSSI_THRESHOLD;
+ }
Wifi.scan_state = 3;
}
// Init scan
@@ -279,12 +290,12 @@ void WifiBeginAfterScan(void)
bool known = false;
uint32_t j;
- for (j = 0; j < 2; j++) {
+ for (j = 0; j < MAX_SSIDS; j++) {
if (ssid_scan == SettingsText(SET_STASSID1 + j)) { // SSID match
known = true;
- if (rssi_scan > best_network_db) { // Best network
+ if (rssi_scan > Wifi.best_network_db) { // Best network
if (sec_scan == ENC_TYPE_NONE || SettingsText(SET_STAPWD1 + j)) { // Check for passphrase if not open wlan
- best_network_db = (int8_t)rssi_scan;
+ Wifi.best_network_db = (int8_t)rssi_scan;
channel = chan_scan;
ap = j; // AP1 or AP2
memcpy((void*) &Wifi.bssid, (void*) bssid_scan, sizeof(Wifi.bssid));
@@ -384,8 +395,8 @@ void WifiCheckIp(void)
WifiSetState(1);
Wifi.counter = WIFI_CHECK_SEC;
Wifi.retry = Wifi.retry_init;
- AddLog_P((Wifi.status != WL_CONNECTED) ? LOG_LEVEL_INFO : LOG_LEVEL_DEBUG_MORE, S_LOG_WIFI, PSTR(D_CONNECTED));
if (Wifi.status != WL_CONNECTED) {
+ AddLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECTED));
// AddLog_P(LOG_LEVEL_INFO, PSTR("Wifi: Set IP addresses"));
Settings.ip_address[1] = (uint32_t)WiFi.gatewayIP();
Settings.ip_address[2] = (uint32_t)WiFi.subnetMask();
@@ -553,7 +564,11 @@ void WifiCheck(uint8_t param)
StopWebserver();
}
#ifdef USE_EMULATION
- if (Settings.flag2.emulation) { UdpConnect(); }
+#ifdef USE_DEVICE_GROUPS
+ if (Settings.flag2.emulation || Settings.flag4.device_groups_enabled) { UdpConnect(); }
+#else // USE_DEVICE_GROUPS
+ if (Settings.flag2.emulation) { UdpConnect(); }
+#endif // USE_DEVICE_GROUPS
#endif // USE_EMULATION
#endif // USE_WEBSERVER
@@ -587,46 +602,99 @@ int WifiState(void)
return state;
}
+String WifiGetOutputPower(void)
+{
+ char stemp1[TOPSZ];
+ dtostrfd((float)(Settings.wifi_output_power) / 10, 1, stemp1);
+ return String(stemp1);
+}
+
void WifiSetOutputPower(void)
{
WiFi.setOutputPower((float)(Settings.wifi_output_power) / 10);
}
+/*
+ See Esp.h, core_esp8266_phy.cpp and test_overrides.ino
+ RF_DEFAULT = 0, // RF_CAL or not after deep-sleep wake up, depends on init data byte 108.
+ RF_CAL = 1, // RF_CAL after deep-sleep wake up, there will be large current.
+ RF_NO_CAL = 2, // no RF_CAL after deep-sleep wake up, there will only be small current.
+ RF_DISABLED = 4 // disable RF after deep-sleep wake up, just like modem sleep, there will be the smallest current.
+*/
+#ifdef WIFI_RF_MODE_RF_CAL
+#ifndef USE_DEEPSLEEP
+RF_MODE(RF_CAL);
+#endif // USE_DEEPSLEEP
+#endif // WIFI_RF_MODE_RF_CAL
+
+#ifdef WIFI_RF_PRE_INIT
+bool rf_pre_init_flag = false;
+RF_PRE_INIT()
+{
+#ifndef USE_DEEPSLEEP
+ system_deep_sleep_set_option(1); // The option is 1 by default.
+ system_phy_set_rfoption(RF_CAL);
+#endif // USE_DEEPSLEEP
+ system_phy_set_powerup_option(3); // 3: RF initialization will do the whole RF calibration which will take about 200ms; this increases the current consumption.
+ rf_pre_init_flag = true;
+}
+#endif // WIFI_RF_PRE_INIT
+
void WifiConnect(void)
{
WifiSetState(0);
WifiSetOutputPower();
WiFi.persistent(false); // Solve possible wifi init errors
Wifi.status = 0;
- Wifi.retry_init = WIFI_RETRY_OFFSET_SEC + ((ESP.getChipId() & 0xF) * 2);
+ Wifi.retry_init = WIFI_RETRY_OFFSET_SEC + (ESP.getChipId() & 0xF); // Add extra delay to stop overrun by simultanous re-connects
Wifi.retry = Wifi.retry_init;
Wifi.counter = 1;
+
+#ifdef WIFI_RF_PRE_INIT
+ if (rf_pre_init_flag) {
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI "Pre-init done"));
+ }
+#endif // WIFI_RF_PRE_INIT
}
-// Enable from 6.0.0a until 6.1.0a - disabled due to possible cause of bad wifi connect on core 2.3.0
-// Re-enabled from 6.3.0.7 with ESP.restart replaced by ESP.reset
-void WifiDisconnect(void)
-{
- // Courtesy of EspEasy
- WiFi.persistent(true); // use SDK storage of SSID/WPA parameters
- ETS_UART_INTR_DISABLE();
- wifi_station_disconnect(); // this will store empty ssid/wpa into sdk storage
- ETS_UART_INTR_ENABLE();
- WiFi.persistent(false); // Do not use SDK storage of SSID/WPA parameters
-}
-
-void WifiShutdown(void)
+void WifiShutdown(bool option = false)
{
+ // option = false - Legacy disconnect also used by DeepSleep
+ // option = true - Disconnect with SDK wifi calibrate sector erase when WIFI_FORCE_RF_CAL_ERASE enabled
delay(100); // Allow time for message xfer - disabled v6.1.0b
+
+#ifdef USE_EMULATION
+ UdpDisconnect();
+ delay(100); // Flush anything in the network buffers.
+#endif // USE_EMULATION
+
if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
MqttDisconnect();
+ delay(100); // Flush anything in the network buffers.
}
- WifiDisconnect();
+
+#ifdef WIFI_FORCE_RF_CAL_ERASE
+ if (option) {
+ WiFi.disconnect(false); // Disconnect wifi
+ SettingsErase(4); // Delete SDK wifi config and calibrate data
+ } else
+#endif // WIFI_FORCE_RF_CAL_ERASE
+ {
+ // Enable from 6.0.0a until 6.1.0a - disabled due to possible cause of bad wifi connect on core 2.3.0
+ // Re-enabled from 6.3.0.7 with ESP.restart replaced by ESP.reset
+ // Courtesy of EspEasy
+ // WiFi.persistent(true); // use SDK storage of SSID/WPA parameters
+ ETS_UART_INTR_DISABLE();
+ wifi_station_disconnect(); // this will store empty ssid/wpa into sdk storage
+ ETS_UART_INTR_ENABLE();
+ // WiFi.persistent(false); // Do not use SDK storage of SSID/WPA parameters
+ }
+ delay(100); // Flush anything in the network buffers.
}
void EspRestart(void)
{
- WifiShutdown();
+ WifiShutdown(true);
CrashDumpClear(); // Clear the stack dump in RTC
// ESP.restart(); // This results in exception 3 on restarts on core 2.3.0
ESP.reset();
diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h
index c0231d3c9..a1c7d1082 100644
--- a/tasmota/tasmota.h
+++ b/tasmota/tasmota.h
@@ -1,7 +1,7 @@
/*
tasmota.h - Master header file for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -31,6 +31,7 @@
\*********************************************************************************************/
#define CODE_IMAGE 0
+#define CODE_IMAGE_STR "tasmota"
#define USE_LIGHT // Enable light control
#define USE_ENERGY_SENSOR // Use energy sensors (+14k code)
@@ -73,6 +74,10 @@ const uint8_t MAX_RULE_SETS = 3; // Max number of rule sets of size 5
const uint16_t MAX_RULE_SIZE = 512; // Max number of characters in rules
// Changes to the following MAX_ defines need to be in line with enum SettingsTextIndex
+const uint8_t MAX_MQTT_PREFIXES = 3; // Max number of MQTT prefixes (cmnd, stat, tele)
+const uint8_t MAX_SSIDS = 2; // Max number of SSIDs
+const uint8_t MAX_STATE_TEXT = 4; // Max number of State names (OFF, ON, TOGGLE, HOLD)
+const uint8_t MAX_NTP_SERVERS = 3; // Max number of NTP servers
const uint8_t MAX_RULE_MEMS = 16; // Max number of saved vars
const uint8_t MAX_FRIENDLYNAMES = 8; // Max number of Friendly names
const uint8_t MAX_BUTTON_TEXT = 16; // Max number of GUI button labels
@@ -123,7 +128,7 @@ const uint16_t FLOATSZ = 16; // Max number of characters in float
const uint16_t CMDSZ = 24; // Max number of characters in command
const uint16_t TOPSZ = 151; // Max number of characters in topic string
const uint16_t LOGSZ = 700; // Max number of characters in log
-const uint16_t MIN_MESSZ = 893; // Min number of characters in MQTT message
+const uint16_t MIN_MESSZ = 1040; // Min number of characters in MQTT message (1000 - TOPSZ - 9 header bytes)
const uint8_t SENSOR_MAX_MISS = 5; // Max number of missed sensor reads before deciding it's offline
@@ -221,13 +226,14 @@ enum WeekInMonthOptions {Last, First, Second, Third, Fourth};
enum DayOfTheWeekOptions {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat};
enum MonthNamesOptions {Jan=1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
enum HemisphereOptions {North, South};
-enum GetDateAndTimeOptions { DT_LOCAL, DT_UTC, DT_RESTART, DT_ENERGY };
+enum GetDateAndTimeOptions { DT_LOCAL, DT_UTC, DT_LOCALNOTZ, DT_DST, DT_STD, DT_RESTART, DT_ENERGY, DT_BOOTCOUNT };
enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE};
enum WifiConfigOptions {WIFI_RESTART, EX_WIFI_SMARTCONFIG, WIFI_MANAGER, EX_WIFI_WPSCONFIG, WIFI_RETRY, WIFI_WAIT, WIFI_SERIAL, WIFI_MANAGER_RESET_ONLY, MAX_WIFI_OPTION};
-enum SwitchModeOptions {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE, MAX_SWITCH_OPTION};
+enum SwitchModeOptions {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE, TOGGLEMULTI,
+ FOLLOWMULTI, FOLLOWMULTI_INV, PUSHHOLDMULTI, PUSHHOLDMULTI_INV, PUSHON, PUSHON_INV, MAX_SWITCH_OPTION};
enum LedStateOptions {LED_OFF, LED_POWER, LED_MQTTSUB, LED_POWER_MQTTSUB, LED_MQTTPUB, LED_POWER_MQTTPUB, LED_MQTT, LED_POWER_MQTT, MAX_LED_OPTION};
@@ -238,7 +244,7 @@ enum TopicOptions { CMND, STAT, TELE, nu1, RESULT_OR_CMND, RESULT_OR_STAT, RESUL
enum ExecuteCommandPowerOptions { POWER_OFF, POWER_ON, POWER_TOGGLE, POWER_BLINK, POWER_BLINK_STOP,
POWER_OFF_NO_STATE = 8, POWER_ON_NO_STATE, POWER_TOGGLE_NO_STATE,
POWER_SHOW_STATE = 16 };
-enum SendKeyPowerOptions { POWER_HOLD = 3, CLEAR_RETAIN = 9 };
+enum SendKeyPowerOptions { POWER_HOLD = 3, POWER_INCREMENT = 4, POWER_INV = 5, POWER_CLEAR = 6, CLEAR_RETAIN = 9 };
enum SendKeyOptions { KEY_BUTTON, KEY_SWITCH };
enum PowerOnStateOptions { POWER_ALL_OFF, POWER_ALL_ON, POWER_ALL_SAVED_TOGGLE, POWER_ALL_SAVED, POWER_ALL_ALWAYS_ON, POWER_ALL_OFF_PULSETIME_ON };
@@ -259,7 +265,7 @@ enum DomoticzSensors {DZ_TEMP, DZ_TEMP_HUM, DZ_TEMP_HUM_BARO, DZ_POWER_ENERGY, D
enum Ws2812ClockIndex { WS_SECOND, WS_MINUTE, WS_HOUR, WS_MARKER };
enum Ws2812Color { WS_RED, WS_GREEN, WS_BLUE };
-enum LightSubtypes { LST_NONE, LST_SINGLE, LST_COLDWARM, LST_RGB, LST_RGBW, LST_RGBWC, LST_MAX=5 }; // Do not insert new fields
+enum LightSubtypes { LST_NONE, LST_SINGLE, LST_COLDWARM, LST_RGB, LST_RGBW, LST_RGBCW, LST_MAX=5 }; // Do not insert new fields
enum LightTypes { LT_BASIC, LT_PWM1, LT_PWM2, LT_PWM3, LT_PWM4, LT_PWM5, LT_PWM6, LT_PWM7,
LT_NU8, LT_SERIAL1, LT_SERIAL2, LT_RGB, LT_RGBW, LT_RGBWC, LT_NU14, LT_NU15 }; // Do not insert new fields
@@ -271,7 +277,8 @@ enum XsnsFunctions {FUNC_SETTINGS_OVERRIDE, FUNC_PIN_STATE, FUNC_MODULE_INIT, FU
FUNC_SET_POWER, FUNC_SET_DEVICE_POWER, FUNC_SHOW_SENSOR, FUNC_ANY_KEY,
FUNC_ENERGY_EVERY_SECOND, FUNC_ENERGY_RESET,
FUNC_RULES_PROCESS, FUNC_SERIAL, FUNC_FREE_MEM, FUNC_BUTTON_PRESSED,
- FUNC_WEB_ADD_BUTTON, FUNC_WEB_ADD_MAIN_BUTTON, FUNC_WEB_ADD_HANDLER, FUNC_SET_CHANNELS, FUNC_SET_SCHEME};
+ FUNC_WEB_ADD_BUTTON, FUNC_WEB_ADD_MAIN_BUTTON, FUNC_WEB_ADD_HANDLER, FUNC_SET_CHANNELS, FUNC_SET_SCHEME, FUNC_HOTPLUG_SCAN,
+ FUNC_DEVICE_GROUP_ITEM };
enum AddressConfigSteps { ADDR_IDLE, ADDR_RECEIVE, ADDR_SEND };
@@ -293,8 +300,31 @@ enum SettingsTextIndex { SET_OTAURL,
SET_FRIENDLYNAME5, SET_FRIENDLYNAME6, SET_FRIENDLYNAME7, SET_FRIENDLYNAME8,
SET_BUTTON1, SET_BUTTON2, SET_BUTTON3, SET_BUTTON4, SET_BUTTON5, SET_BUTTON6, SET_BUTTON7, SET_BUTTON8,
SET_BUTTON9, SET_BUTTON10, SET_BUTTON11, SET_BUTTON12, SET_BUTTON13, SET_BUTTON14, SET_BUTTON15, SET_BUTTON16,
+ SET_MQTT_GRP_TOPIC2, SET_MQTT_GRP_TOPIC3, SET_MQTT_GRP_TOPIC4,
SET_MAX };
+enum DeviceGroupMessageType { DGR_MSGTYP_FULL_STATUS, DGR_MSGTYP_PARTIAL_UPDATE, DGR_MSGTYP_UPDATE, DGR_MSGTYP_UPDATE_MORE_TO_COME, DGR_MSGTYP_UPDATE_DIRECT, DGR_MSGTYP_REUPDATE };
+
+enum DeviceGroupMessageFlag { DGR_FLAG_RESET = 1, DGR_FLAG_STATUS_REQUEST = 2, DGR_FLAG_FULL_STATUS = 4, DGR_FLAG_ACK = 8, DGR_FLAG_MORE_TO_COME = 16, DGR_FLAG_DIRECT = 32, DGR_FLAG_ANNOUNCEMENT = 64 };
+
+enum DeviceGroupItem { DGR_ITEM_EOL, DGR_ITEM_STATUS,
+ DGR_ITEM_LIGHT_FADE, DGR_ITEM_LIGHT_SPEED, DGR_ITEM_LIGHT_BRI, DGR_ITEM_LIGHT_SCHEME, DGR_ITEM_LIGHT_FIXED_COLOR,
+ DGR_ITEM_BRI_PRESET_LOW, DGR_ITEM_BRI_PRESET_HIGH, DGR_ITEM_BRI_POWER_ON,
+ // Add new 8-bit items before this line
+ DGR_ITEM_LAST_8BIT, DGR_ITEM_MAX_8BIT = 63,
+ DGR_ITEM_ANALOG1, DGR_ITEM_ANALOG2, DGR_ITEM_ANALOG3, DGR_ITEM_ANALOG4, DGR_ITEM_ANALOG5,
+ // Add new 16-bit items before this line
+ DGR_ITEM_LAST_16BIT, DGR_ITEM_MAX_16BIT = 127,
+ DGR_ITEM_POWER, DGR_ITEM_DIMMER_RANGE,
+ // Add new 32-bit items before this line
+ DGR_ITEM_LAST_32BIT, DGR_ITEM_MAX_32BIT = 191,
+ // Add new string items before this line
+ DGR_ITEM_LAST_STRING, DGR_ITEM_MAX_STRING = 223,
+ DGR_ITEM_LIGHT_CHANNELS };
+
+enum DeviceGroupShareItem { DGR_SHARE_POWER = 1, DGR_SHARE_LIGHT_BRI = 2, DGR_SHARE_LIGHT_FADE = 4, DGR_SHARE_LIGHT_SCHEME = 8,
+ DGR_SHARE_LIGHT_COLOR = 16, DGR_SHARE_DIMMER_SETTINGS = 32 };
+
enum CommandSource { SRC_IGNORE, SRC_MQTT, SRC_RESTART, SRC_BUTTON, SRC_SWITCH, SRC_BACKLOG, SRC_SERIAL, SRC_WEBGUI, SRC_WEBCOMMAND, SRC_WEBCONSOLE, SRC_PULSETIMER,
SRC_TIMER, SRC_RULE, SRC_MAXPOWER, SRC_MAXENERGY, SRC_OVERTEMP, SRC_LIGHT, SRC_KNX, SRC_DISPLAY, SRC_WEMO, SRC_HUE, SRC_RETRY, SRC_REMOTE, SRC_SHUTTER,
SRC_MAX };
diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino
index e80331366..6572be777 100644
--- a/tasmota/tasmota.ino
+++ b/tasmota/tasmota.ino
@@ -1,7 +1,7 @@
/*
tasmota.ino - Tasmota firmware for iTead Sonoff, Wemos and NodeMCU hardware
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -19,10 +19,15 @@
/*====================================================
Prerequisites:
- Change libraries/PubSubClient/src/PubSubClient.h
- #define MQTT_MAX_PACKET_SIZE 1000
+ #define MQTT_MAX_PACKET_SIZE 1200
- - Select IDE Tools - Flash Mode: "DOUT"
- - Select IDE Tools - Flash Size: "1M (no SPIFFS)"
+ Arduino IDE 1.8.12 and up parameters
+ - Select IDE Tools - Board: "Generic ESP8266 Module"
+ - Select IDE Tools - Flash Mode: "DOUT (compatible)"
+ - Select IDE Tools - Flash Size: "1M (FS:none OTA:~502KB)"
+ - Select IDE Tools - LwIP Variant: "v2 Higher Bandwidth (no feature)"
+ - Select IDE Tools - VTables: "Flash"
+ - Select IDE Tools - Espressif FW: "nonos-sdk-2.2.1+100 (190703)"
====================================================*/
// Location specific includes
@@ -68,8 +73,6 @@
// Structs
#include "settings.h"
-const char kCodeImage[] PROGMEM = "tasmota|minimal|sensors|knx|lite|display|ir";
-
/*********************************************************************************************\
* Global variables
\*********************************************************************************************/
@@ -81,6 +84,7 @@ unsigned long feature_drv2; // Compiled driver feature map
unsigned long feature_sns1; // Compiled sensor feature map
unsigned long feature_sns2; // Compiled sensor feature map
unsigned long feature5; // Compiled feature map
+unsigned long feature6; // Compiled feature map
unsigned long serial_polling_window = 0; // Serial polling window
unsigned long state_second = 0; // State second timer
unsigned long state_50msecond = 0; // State 50msecond timer
@@ -96,7 +100,6 @@ power_t blink_mask = 0; // Blink relay active mask
power_t blink_powersave; // Blink start power save state
power_t latching_power = 0; // Power state at latching start
power_t rel_inverted = 0; // Relay inverted flag (1 = (0 = On, 1 = Off))
-int baudrate = APP_BAUDRATE; // Serial interface baud rate
int serial_in_byte_counter = 0; // Index in receive buffer
int ota_state_flag = 0; // OTA state flag
int ota_result = 0; // OTA result
@@ -111,12 +114,13 @@ float global_temperature = 9999; // Provide a global temperature to b
float global_humidity = 0; // Provide a global humidity to be used by some sensors
float global_pressure = 0; // Provide a global pressure to be used by some sensors
uint16_t tele_period = 9999; // Tele period timer
-uint16_t mqtt_cmnd_publish = 0; // ignore flag for publish command
uint16_t blink_counter = 0; // Number of blink cycles
uint16_t seriallog_timer = 0; // Timer to disable Seriallog
uint16_t syslog_timer = 0; // Timer to re-enable syslog_level
int16_t save_data_counter; // Counter and flag for config save to Flash
RulesBitfield rules_flag; // Rule state flags (16 bits)
+uint8_t mqtt_cmnd_blocked = 0; // Ignore flag for publish command
+uint8_t mqtt_cmnd_blocked_reset = 0; // Count down to reset if needed
uint8_t state_250mS = 0; // State 250msecond per second flag
uint8_t latching_relay_pulse = 0; // Latching relay pulse timer
uint8_t sleep; // Current copy of Settings.sleep
@@ -140,6 +144,7 @@ uint8_t my_module_type; // Current copy of Settings.module o
uint8_t my_adc0; // Active copy of Module ADC0
uint8_t last_source = 0; // Last command source
uint8_t shutters_present = 0; // Number of actual define shutters
+uint8_t prepped_loglevel = 0; // Delayed log level message
//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
@@ -153,8 +158,8 @@ bool i2c_flg = false; // I2C configured
bool spi_flg = false; // SPI configured
bool soft_spi_flg = false; // Software SPI configured
bool ntp_force_sync = false; // Force NTP sync
-bool ntp_synced_message = false; // NTP synced message flag
bool is_8285 = false; // Hardware device ESP8266EX (0) or ESP8285 (1)
+bool skip_light_fade; // Temporarily skip light fading
myio my_module; // Active copy of Module GPIOs (17 x 8 bits)
gpio_flag my_module_flag; // Active copy of Template GPIO flags
StateBitfield global_state; // Global states (currently Wifi and Mqtt) (8 bits)
@@ -193,17 +198,15 @@ void setup(void)
RtcReboot.fast_reboot_count++;
RtcRebootSave();
- Serial.begin(baudrate);
- delay(10);
- Serial.println();
+ Serial.begin(APP_BAUDRATE);
seriallog_level = LOG_LEVEL_INFO; // Allow specific serial messages until config loaded
snprintf_P(my_version, sizeof(my_version), PSTR("%d.%d.%d"), VERSION >> 24 & 0xff, VERSION >> 16 & 0xff, VERSION >> 8 & 0xff); // Release version 6.3.0
if (VERSION & 0xff) { // Development or patched version 6.3.0.10
snprintf_P(my_version, sizeof(my_version), PSTR("%s.%d"), my_version, VERSION & 0xff);
}
- char code_image[20];
- snprintf_P(my_image, sizeof(my_image), PSTR("(%s)"), GetTextIndexed(code_image, sizeof(code_image), CODE_IMAGE, kCodeImage));
+ // Thehackbox inserts "release" or "commit number" before compiling using sed -i -e 's/PSTR("(%s)")/PSTR("(85cff52-%s)")/g' tasmota.ino
+ snprintf_P(my_image, sizeof(my_image), PSTR("(%s)"), CODE_IMAGE_STR); // Results in (85cff52-tasmota) or (release-tasmota)
SettingsLoad();
SettingsDelta();
@@ -217,7 +220,6 @@ void setup(void)
XdrvCall(FUNC_SETTINGS_OVERRIDE);
}
- baudrate = Settings.baudrate * 300;
// mdns_delayed_start = Settings.param[P_MDNS_DELAYED_START];
seriallog_level = Settings.seriallog_level;
seriallog_timer = SERIALLOG_TIMER;
@@ -276,58 +278,11 @@ void setup(void)
GetEspHardwareType();
GpioInit();
- SetSerialBaudrate(baudrate);
+// SetSerialBaudrate(Settings.baudrate * 300); // Allow reset of serial interface if current baudrate is different from requested baudrate
WifiConnect();
- 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 {
- if ((ResetReason() == REASON_DEFAULT_RST) || (ResetReason() == REASON_EXT_SYS_RST)) {
- switch (Settings.poweronstate) {
- case POWER_ALL_OFF:
- case POWER_ALL_OFF_PULSETIME_ON:
- power = 0;
- SetDevicePower(power, SRC_RESTART);
- break;
- case POWER_ALL_ON: // All on
- power = (1 << devices_present) -1;
- SetDevicePower(power, SRC_RESTART);
- break;
- case POWER_ALL_SAVED_TOGGLE:
- power = (Settings.power & ((1 << devices_present) -1)) ^ POWER_MASK;
- if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart
- SetDevicePower(power, SRC_RESTART);
- }
- break;
- case POWER_ALL_SAVED:
- power = Settings.power & ((1 << devices_present) -1);
- if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart
- SetDevicePower(power, SRC_RESTART);
- }
- break;
- }
- } else {
- power = Settings.power & ((1 << devices_present) -1);
- if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart
- SetDevicePower(power, SRC_RESTART);
- }
- }
- }
-
- // Issue #526 and #909
- for (uint32_t i = 0; i < devices_present; i++) {
- if (!Settings.flag3.no_power_feedback) { // SetOption63 - Don't scan relay power state at restart - #5594 and #5663
- if ((i < MAX_RELAYS) && (pin[GPIO_REL1 +i] < 99)) {
- bitWrite(power, i, digitalRead(pin[GPIO_REL1 +i]) ^ bitRead(rel_inverted, i));
- }
- }
- if ((i < MAX_PULSETIMERS) && (bitRead(power, i) || (POWER_ALL_OFF_PULSETIME_ON == Settings.poweronstate))) {
- SetPulseTimer(i, Settings.pulse_timer[i]);
- }
- }
- blink_powersave = power;
+ SetPowerOnState();
AddLog_P2(LOG_LEVEL_INFO, PSTR(D_PROJECT " %s %s " D_VERSION " %s%s-" ARDUINO_ESP8266_RELEASE), PROJECT, SettingsText(SET_FRIENDLYNAME1), my_version, my_image);
#ifdef FIRMWARE_MINIMAL
@@ -380,6 +335,9 @@ void loop(void)
#ifdef ROTARY_V1
RotaryLoop();
#endif
+#ifdef USE_DEVICE_GROUPS
+ DeviceGroupsLoop();
+#endif // USE_DEVICE_GROUPS
BacklogLoop();
if (TimeReached(state_50msecond)) {
@@ -409,10 +367,7 @@ void loop(void)
if (!serial_local) { SerialInput(); }
#ifdef USE_ARDUINO_OTA
- MDNS.update();
- ArduinoOTA.handle();
- // Once OTA is triggered, only handle that and dont do other stuff. (otherwise it fails)
- while (arduino_ota_triggered) ArduinoOTA.handle();
+ ArduinoOtaLoop();
#endif // USE_ARDUINO_OTA
uint32_t my_activity = millis() - my_sleep;
diff --git a/tasmota/tasmota_ca.ino b/tasmota/tasmota_ca.ino
index 3df65c9b9..8e75f891e 100644
--- a/tasmota/tasmota_ca.ino
+++ b/tasmota/tasmota_ca.ino
@@ -1,7 +1,7 @@
/*
tasmota_ca.ino - Certificate authorities for Tasmota, LetsEncrypt and AWS
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
diff --git a/tasmota/tasmota_post.h b/tasmota/tasmota_post.h
index c9f8396fe..b9bc6a833 100644
--- a/tasmota/tasmota_post.h
+++ b/tasmota/tasmota_post.h
@@ -1,7 +1,7 @@
/*
tasmota_post.h - Post header file for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -38,6 +38,7 @@ extern "C" {
void KNX_CB_Action(message_t const &msg, void *arg);
//#endif // USE_KNX
+void DomoticzTempHumPressureSensor(float temp, float hum, float baro = -1);
char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, char inbetween = '\0');
extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack, uint32_t stack_end);
@@ -55,6 +56,9 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#ifdef USE_EMULATION_WEMO
#define USE_EMULATION
#endif
+#ifdef USE_DEVICE_GROUPS
+#define USE_EMULATION
+#endif
#ifdef USE_MQTT_TLS
const uint16_t WEB_LOG_SIZE = 2000; // Max number of characters in weblog
@@ -70,6 +74,16 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#define MODULE SONOFF_BASIC // [Module] Select default model
#endif
+#ifdef USE_PWM_DIMMER_REMOTE
+#ifdef USE_PWM_DIMMER
+#ifndef USE_DEVICE_GROUPS
+#define USE_DEVICE_GROUPS
+#endif // USE_DEVICE_GROUPS
+#else // USE_PWM_DIMMER
+#undef USE_PWM_DIMMER_REMOTE
+#endif // USE_PWM_DIMMER
+#endif // USE_PWM_DIMMER_REMOTE
+
/*********************************************************************************************\
* [tasmota-sensors.bin]
* Provide an image with useful supported sensors enabled
@@ -79,6 +93,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef CODE_IMAGE
#define CODE_IMAGE 2
+#undef CODE_IMAGE_STR
+#define CODE_IMAGE_STR "sensors"
#undef USE_DISCOVERY // Disable mDNS (+8k code or +23.5k code with core 2_5_x, +0.3k mem)
@@ -91,14 +107,19 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#ifndef TUYA_DIMMER_ID
#define TUYA_DIMMER_ID 0 // Default dimmer Id
#endif
-//#define USE_ARMTRONIX_DIMMERS // Add support for Armtronix Dimmers (+1k4 code)
-#define USE_PS_16_DZ // Add support for PS-16-DZ Dimmer (+2k code)
-#define USE_SONOFF_IFAN // Add support for Sonoff iFan02 and iFan03 (+2k code)
+#undef USE_ARMTRONIX_DIMMERS // Disable support for Armtronix Dimmers (+1k4 code)
+#undef USE_PS_16_DZ // Disable support for PS-16-DZ Dimmer (+2k code)
+#undef USE_SONOFF_IFAN // Disable support for Sonoff iFan02 and iFan03 (+2k code)
#define USE_BUZZER // Add support for a buzzer (+0k6 code)
-#define USE_ARILUX_RF // Add support for Arilux RF remote controller (+0k8 code, 252 iram (non 2.3.0))
-//#define USE_SHUTTER // Add Shutter support for up to 4 shutter with different motortypes (+6k code)
+#undef USE_ARILUX_RF // Disable support for Arilux RF remote controller (+0k8 code, 252 iram (non 2.3.0))
+#undef USE_SHUTTER // Disable Shutter support for up to 4 shutter with different motortypes (+6k code)
#define USE_DEEPSLEEP // Add support for deepsleep (+1k code)
-#define USE_EXS_DIMMER // Add support for EX-Store WiFi Dimmer
+#undef USE_EXS_DIMMER // Disable support for EX-Store WiFi Dimmer
+//#define USE_HOTPLUG // Add support for sensor HotPlug
+#undef USE_DEVICE_GROUPS // Disable support for device groups (+5k6 code)
+#undef USE_PWM_DIMMER // Disable support for MJ-SD01/acenx/NTONPOWER PWM dimmers (+4k5 code)
+#undef USE_KEELOQ // Disable support for Jarolift rollers by Keeloq algorithm (+4k5 code)
+#undef USE_SONOFF_D1 // DIsable support for Sonoff D1 Dimmer (+0k7 code)
// -- Optional light modules ----------------------
#define USE_LIGHT // Add Dimmer/Light support
@@ -114,6 +135,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code)
#define USE_SM2135 // Add support for SM2135 RGBCW led control as used in Action LSC (+0k6 code)
#define USE_SONOFF_L1 // Add support for Sonoff L1 led control
+#define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller
#define USE_COUNTER // Enable counters
#undef USE_ADC_VCC // Add Analog input on selected devices
@@ -136,7 +158,6 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#define USE_SGP30 // Add I2C code for SGP30 sensor (+1k1 code)
//#define USE_SI1145 // Add I2C code for SI1145/46/47 sensor (+1k code)
#define USE_LM75AD // Add I2C code for LM75AD sensor (+0k5 code)
-#define USE_DHT12 // Add I2C code for DHT12 temperature and humidity sensor (+0k7 code)
//#define USE_APDS9960 // Add I2C code for APDS9960 Proximity Sensor. Disables SHT and VEML6070 (+4k7 code)
//#define USE_MCP230xx // Enable MCP23008/MCP23017 - Must define I2C Address in #define USE_MCP230xx_ADDR below - range 0x20 - 0x27 (+4k7 code)
// #define USE_MCP230xx_ADDR 0x20 // Enable MCP23008/MCP23017 I2C Address to use (Must be within range 0x20 through 0x27 - set according to your wired setup)
@@ -146,7 +167,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
// #define USE_PCA9685_ADDR 0x40 // Enable PCA9685 I2C Address to use (Must be within range 0x40 through 0x47 - set according to your wired setup)
// #define USE_PCA9685_FREQ 50 // Define default PWM frequency in Hz to be used (must be within 24 to 1526) - If other value is used, it will rever to 50Hz
//#define USE_MPR121 // Enable MPR121 controller (I2C addresses 0x5A, 0x5B, 0x5C and 0x5D) in input mode for touch buttons (+1k3 code)
-//#define USE_CCS811 // Add I2C code for CCS811 sensor (+2k2 code)
+#define USE_CCS811 // Add I2C code for CCS811 sensor (+2k2 code)
//#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)
@@ -160,6 +181,13 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
//#define USE_PAJ7620 // Enable PAJ7620 gesture sensor (I2C address 0x73) (+2.5k code)
//#define USE_PCF8574 // Enable PCF8574 I/O Expander (I2C addresses 0x20 - 0x26 and 0x39 - 0x3F) (+1k9 code)
#define USE_HIH6 // Enable Honywell HIH Humidity and Temperature sensor (I2C address 0x27) (+0k6)
+#define USE_DHT12 // Add I2C code for DHT12 temperature and humidity sensor (+0k7 code)
+#define USE_DS1624 // Add I2C code for DS1624, DS1621 sensor
+//#define USE_AHT1x // Enable AHT10/15 humidity and temperature sensor (I2C address 0x38) (+0k8 code)
+#define USE_WEMOS_MOTOR_V1 // Enable Wemos motor driver V1 (I2C addresses 0x2D - 0x30) (+0k7 code)
+ #define WEMOS_MOTOR_V1_ADDR 0x30 // Default I2C address 0x30
+ #define WEMOS_MOTOR_V1_FREQ 1000 // Default frequency
+//#define USE_HDC1080 // Enable HDC1080 temperature/humidity sensor
#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)
@@ -181,6 +209,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#define USE_RDM6300 // Add support for RDM6300 125kHz RFID Reader (+0k8)
#define USE_IBEACON // Add support for bluetooth LE passive scan of ibeacon devices (uses HM17 module)
//#define USE_GPS // Add support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM)
+#define USE_HM10 // Add support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code)
+#define USE_HRXL // Add support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7)
#define USE_ENERGY_SENSOR // Add energy sensors (-14k code)
#define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code)
@@ -192,6 +222,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#define USE_DDS2382 // Add support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
#define USE_DDSU666 // Add support for Chint DDSU666 Modbus energy monitor (+0k6 code)
//#define USE_SOLAX_X1 // Add support for Solax X1 series Modbus log info (+3k1 code)
+//#define USE_LE01MR // Add support for F&F LE-01MR modbus energy meter (+2k code)
#define USE_DHT // Add support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
#define USE_MAX31855 // Add support for MAX31855 K-Type thermocouple sensor using softSPI
@@ -205,7 +236,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#define USE_TM1638 // Add support for TM1638 switches copying Switch1 .. Switch8 (+1k code)
#define USE_HX711 // Add support for HX711 load cell (+1k5 code)
//#define USE_HX711_GUI // Add optional web GUI to HX711 as scale (+1k8 code)
-//#define USE_TX20_WIND_SENSOR // Add support for La Crosse TX20 anemometer (+2k code)
+//#define USE_TX20_WIND_SENSOR // Add support for La Crosse TX20 anemometer (+2k6/0k8 code)
+//#define USE_TX23_WIND_SENSOR // Add support for La Crosse TX23 anemometer (+2k7/1k code)
#define USE_RC_SWITCH // Add support for RF transceiver using library RcSwitch (+2k7 code, 460 iram)
#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)
@@ -226,6 +258,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef CODE_IMAGE
#define CODE_IMAGE 3
+#undef CODE_IMAGE_STR
+#define CODE_IMAGE_STR "knx"
#ifndef USE_KNX
#define USE_KNX // Enable KNX IP Protocol Support (+23k code, +3k3 mem)
@@ -233,6 +267,9 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_EMULATION // Disable Belkin WeMo and Hue Bridge emulation for Alexa (-16k code, -2k mem)
#undef USE_EMULATION_HUE // Disable Hue Bridge emulation for Alexa (+14k code, +2k mem common)
#undef USE_EMULATION_WEMO // Disable Belkin WeMo emulation for Alexa (+6k code, +2k mem common)
+#undef USE_DEEPSLEEP // Disable support for deepsleep (+1k code)
+#undef USE_DEVICE_GROUPS // Disable support for device groups (+3k5 code)
+#undef USE_PWM_DIMMER_REMOTE // Disbale support for remote switches to PWM Dimmer
#undef DEBUG_THEO // Disable debug code
#undef USE_DEBUG_DRIVER // Disable debug code
#endif // FIRMWARE_KNX_NO_EMULATION
@@ -246,6 +283,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef CODE_IMAGE
#define CODE_IMAGE 5
+#undef CODE_IMAGE_STR
+#define CODE_IMAGE_STR "display"
#undef USE_EMULATION // Disable Belkin WeMo and Hue Bridge emulation for Alexa (-16k code, -2k mem)
#undef USE_EMULATION_HUE // Disable Hue Bridge emulation for Alexa (+14k code, +2k mem common)
@@ -267,6 +306,12 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_SHUTTER // Disable Shutter support for up to 4 shutter with different motortypes (+6k code)
#undef USE_DEEPSLEEP // Disable support for deepsleep (+1k code)
#undef USE_EXS_DIMMER // Disable support for EX-Store WiFi Dimmer
+#undef USE_HOTPLUG // Disable support for HotPlug
+#undef USE_DEVICE_GROUPS // Disable support for device groups (+3k5 code)
+#undef USE_PWM_DIMMER // Disable support for MJ-SD01/acenx/NTONPOWER PWM dimmers (+4k5 code)
+#undef USE_PWM_DIMMER_REMOTE // Disbale support for remote switches to PWM Dimmer
+#undef USE_KEELOQ // Disable support for Jarolift rollers by Keeloq algorithm (+4k5 code)
+#undef USE_SONOFF_D1 // Disable support for Sonoff D1 Dimmer (+0k7 code)
#undef USE_ENERGY_SENSOR // Disable energy sensors (-14k code)
#undef USE_PZEM004T // Disable PZEM004T energy sensor
@@ -278,6 +323,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
#undef USE_DDSU666 // Disable support for Chint DDSU666 Modbus energy monitor (+0k6 code)
#undef USE_SOLAX_X1 // Disable support for Solax X1 series Modbus log info (+3k1 code)
+ #undef USE_LE01MR // Disable support for F&F LE-01MR Modbus energy meter (+2k code)
#define USE_I2C // I2C using library wire (+10k code, 0k2 mem, 124 iram)
#define USE_DISPLAY // Add I2C Display Support (+2k code)
@@ -310,6 +356,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef CODE_IMAGE
#define CODE_IMAGE 6
+#undef CODE_IMAGE_STR
+#define CODE_IMAGE_STR "ir"
#undef USE_EMULATION
#undef USE_EMULATION_HUE // Disable Hue emulation - only for lights and relays
@@ -339,6 +387,12 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_SHUTTER // Disable Shutter support for up to 4 shutter with different motortypes (+6k code)
#undef USE_DEEPSLEEP // Disable support for deepsleep (+1k code)
#undef USE_EXS_DIMMER // Disable support for EX-Store WiFi Dimmer
+#undef USE_HOTPLUG // Disable support for HotPlug
+#undef USE_DEVICE_GROUPS // Disable support for device groups (+3k5 code)
+#undef USE_PWM_DIMMER // Disable support for MJ-SD01/acenx/NTONPOWER PWM dimmers (+4k5 code)
+#undef USE_PWM_DIMMER_REMOTE // Disbale support for remote switches to PWM Dimmer
+#undef USE_KEELOQ // Disable support for Jarolift rollers by Keeloq algorithm (+4k5 code)
+#undef USE_SONOFF_D1 // Disable support for Sonoff D1 Dimmer (+0k7 code)
// -- Optional light modules ----------------------
//#undef USE_LIGHT // Also disable all Dimmer/Light support
@@ -347,6 +401,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code)
#undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code)
#undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control
+#undef USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller
#undef USE_ENERGY_SENSOR // Disable energy sensors (-14k code)
#undef USE_PZEM004T // Disable PZEM004T energy sensor
@@ -358,12 +413,15 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
#undef USE_DDSU666 // Disable support for Chint DDSU666 Modbus energy monitor (+0k6 code)
#undef USE_SOLAX_X1 // Disable support for Solax X1 series Modbus log info (+3k1 code)
+ #undef USE_LE01MR // Disable support for F&F LE-01MR Modbus energy meter (+2k code)
//#undef USE_DS18x20 // Disable support for DS18x20 sensors with id sort, single scan and read retry (+1k3 code)
#undef USE_I2C // Disable all I2C sensors
#undef USE_SPI // Disable all SPI devices
+#undef USE_DISPLAY // Disable support for displays
+
#undef USE_MHZ19 // Disable support for MH-Z19 CO2 sensor
#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
@@ -376,6 +434,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_RDM6300 // Disable support for RDM6300 125kHz RFID Reader (+0k8)
#undef USE_IBEACON // Disable support for bluetooth LE passive scan of ibeacon devices (uses HM17 module)
#undef USE_GPS // Disable support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM)
+#undef USE_HM10 // Disable support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code)
+#undef USE_HRXL // Disable support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7)
//#define USE_DHT // Add support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
#undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI
@@ -384,6 +444,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8
#undef USE_HX711 // Disable support for HX711 load cell
#undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer
+#undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer
#undef USE_RC_SWITCH // Disable support for RF transceiver using library RcSwitch
#undef USE_RF_SENSOR // Disable support for RF sensor receiver (434MHz or 868MHz) (+0k8 code)
#undef USE_HRE // Disable support for Badger HR-E Water Meter (+1k4 code)
@@ -402,6 +463,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef CODE_IMAGE
#define CODE_IMAGE 4
+#undef CODE_IMAGE_STR
+#define CODE_IMAGE_STR "lite"
#undef APP_SLEEP
#define APP_SLEEP 1 // Default to sleep = 1 for FIRMWARE_LITE
@@ -438,6 +501,12 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_SHUTTER // Disable Shutter support for up to 4 shutter with different motortypes (+6k code)
#undef USE_DEEPSLEEP // Disable support for deepsleep (+1k code)
#undef USE_EXS_DIMMER // Disable support for EX-Store WiFi Dimmer
+#undef USE_HOTPLUG // Disable support for HotPlug
+#undef USE_DEVICE_GROUPS // Disable support for device groups (+3k5 code)
+#undef USE_PWM_DIMMER // Disable support for MJ-SD01/acenx/NTONPOWER PWM dimmers (+4k5 code)
+#undef USE_PWM_DIMMER_REMOTE // Disbale support for remote switches to PWM Dimmer
+#undef USE_KEELOQ // Disable support for Jarolift rollers by Keeloq algorithm (+4k5 code)
+//#undef USE_SONOFF_D1 // Disable support for Sonoff D1 Dimmer (+0k7 code)
// -- Optional light modules ----------------------
//#undef USE_LIGHT // Also disable all Dimmer/Light support
@@ -446,6 +515,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code)
#undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code)
#undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control
+#undef USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller
#undef USE_COUNTER // Disable counters
#define USE_ADC_VCC // Display Vcc in Power status. Disable for use as Analog input on selected devices
@@ -465,6 +535,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_RDM6300 // Disable support for RDM6300 125kHz RFID Reader (+0k8)
#undef USE_IBEACON // Disable support for bluetooth LE passive scan of ibeacon devices (uses HM17 module)
#undef USE_GPS // Disable support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM)
+#undef USE_HM10 // Disable support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code)
+#undef USE_HRXL // Disable support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7)
//#undef USE_ENERGY_SENSOR // Disable energy sensors
#undef USE_PZEM004T // Disable PZEM004T energy sensor
@@ -476,6 +548,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
#undef USE_DDSU666 // Disable support for Chint DDSU666 Modbus energy monitor (+0k6 code)
#undef USE_SOLAX_X1 // Disable support for Solax X1 series Modbus log info (+3k1 code)
+#undef USE_LE01MR // Disable support for F&F LE-01MR Modbus energy meter (+2k code)
#undef USE_DHT // Disable support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
#undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI
@@ -488,6 +561,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8
#undef USE_HX711 // Disable support for HX711 load cell
#undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer
+#undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer
#undef USE_RC_SWITCH // Disable support for RF transceiver using library RcSwitch
#undef USE_RF_SENSOR // Disable support for RF sensor receiver (434MHz or 868MHz) (+0k8 code)
#undef USE_HRE // Disable support for Badger HR-E Water Meter (+1k4 code)
@@ -506,6 +580,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef CODE_IMAGE
#define CODE_IMAGE 1
+#undef CODE_IMAGE_STR
+#define CODE_IMAGE_STR "minimal"
#undef FIRMWARE_LITE // Disable tasmota-lite with no sensors
#undef FIRMWARE_SENSORS // Disable tasmota-sensors with useful sensors enabled
@@ -546,6 +622,12 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_SHUTTER // Disable Shutter support for up to 4 shutter with different motortypes (+6k code)
#undef USE_DEEPSLEEP // Disable support for deepsleep (+1k code)
#undef USE_EXS_DIMMER // Disable support for EX-Store WiFi Dimmer
+#undef USE_HOTPLUG // Disable support for HotPlug
+#undef USE_DEVICE_GROUPS // Disable support for device groups (+3k5 code)
+#undef USE_PWM_DIMMER // Disable support for MJ-SD01/acenx/NTONPOWER PWM dimmers (+4k5 code)
+#undef USE_PWM_DIMMER_REMOTE // Disbale support for remote switches to PWM Dimmer
+#undef USE_KEELOQ // Disable support for Jarolift rollers by Keeloq algorithm (+4k5 code)
+#undef USE_SONOFF_D1 // Disable support for Sonoff D1 Dimmer (+0k7 code)
// -- Optional light modules ----------------------
#undef USE_LIGHT // Disable support for lights
@@ -554,6 +636,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code)
#undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code)
#undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control
+#undef USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller
#undef USE_COUNTER // Disable counters
#define USE_ADC_VCC // Display Vcc in Power status. Disable for use as Analog input on selected devices
@@ -575,6 +658,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_RDM6300 // Disable support for RDM6300 125kHz RFID Reader (+0k8)
#undef USE_IBEACON // Disable support for bluetooth LE passive scan of ibeacon devices (uses HM17 module)
#undef USE_GPS // Disable support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM)
+#undef USE_HM10 // Disable support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code)
+#undef USE_HRXL // Disable support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7)
#undef USE_ENERGY_SENSOR // Disable energy sensors
#undef USE_PZEM004T // Disable PZEM004T energy sensor
@@ -586,6 +671,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
#undef USE_DDSU666 // Disable support for Chint DDSU666 Modbus energy monitor (+0k6 code)
#undef USE_SOLAX_X1 // Disable support for Solax X1 series Modbus log info (+3k1 code)
+#undef USE_LE01MR // Disable support for F&F LE-01MR Modbus energy meter (+2k code)
#undef USE_DHT // Disable support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
#undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI
@@ -595,6 +681,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8
#undef USE_HX711 // Disable support for HX711 load cell
#undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer
+#undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer
#undef USE_RC_SWITCH // Disable support for RF transceiver using library RcSwitch
#undef USE_RF_SENSOR // Disable support for RF sensor receiver (434MHz or 868MHz) (+0k8 code)
#undef USE_HRE // Disable support for Badger HR-E Water Meter (+1k4 code)
@@ -637,7 +724,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#endif
#ifndef MQTT_MAX_PACKET_SIZE
-#define MQTT_MAX_PACKET_SIZE 1000 // Bytes
+#define MQTT_MAX_PACKET_SIZE 1200 // Bytes
#endif
#ifndef MQTT_KEEPALIVE
#define MQTT_KEEPALIVE 30 // Seconds
@@ -650,11 +737,11 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#endif
#ifndef MESSZ
-//#define MESSZ 893 // Max number of characters in JSON message string (Hass discovery and nice MQTT_MAX_PACKET_SIZE = 1000)
+//#define MESSZ 1040 // Max number of characters in JSON message string (Hass discovery and nice MQTT_MAX_PACKET_SIZE = 1200)
#define MESSZ (MQTT_MAX_PACKET_SIZE -TOPSZ -7) // Max number of characters in JSON message string
#endif
-//#include // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0)
+//#include // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0)
#ifndef ARDUINO_ESP8266_RELEASE
#define ARDUINO_ESP8266_RELEASE "STAGE"
#endif
@@ -663,6 +750,14 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack
#undef USE_MQTT_TLS_CA_CERT
#endif
+#ifdef USE_DEVICE_GROUPS
+#define SendDeviceGroupMessage(DEVICE_INDEX, REQUEST_TYPE, ...) _SendDeviceGroupMessage(DEVICE_INDEX, REQUEST_TYPE, __VA_ARGS__, 0)
+#define SendLocalDeviceGroupMessage(REQUEST_TYPE, ...) _SendDeviceGroupMessage(0, REQUEST_TYPE, __VA_ARGS__, 0)
+#define DEVICE_GROUP_MESSAGE "M-TASMOTA_DGR/"
+const char kDeviceGroupMessage[] PROGMEM = DEVICE_GROUP_MESSAGE;
+uint8_t device_group_count = 1;
+#endif // USE_DEVICE_GROUPS
+
#ifdef DEBUG_TASMOTA_CORE
#define DEBUG_CORE_LOG(...) AddLog_Debug(__VA_ARGS__)
#else
diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h
index 685546b91..4715f682f 100644
--- a/tasmota/tasmota_template.h
+++ b/tasmota/tasmota_template.h
@@ -1,7 +1,7 @@
/*
tasmota_template.h - template settings for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -128,7 +128,7 @@ enum UserSelectablePins {
GPIO_SDS0X1_TX, // Nova Fitness SDS011 Serial interface
GPIO_HX711_SCK, // HX711 Load Cell clock
GPIO_HX711_DAT, // HX711 Load Cell data
- GPIO_TX20_TXD_BLACK, // TX20 Transmission Pin
+ GPIO_TX2X_TXD_BLACK, // TX20/TX23 Transmission Pin
GPIO_RFSEND, // RF transmitter
GPIO_RFRECV, // RF receiver
GPIO_TUYA_TX, // Tuya Serial interface
@@ -169,7 +169,7 @@ enum UserSelectablePins {
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_TX, // CSE7766 Serial interface (S31 and Pow R2) - Not used anymore 20200121
GPIO_CSE7766_RX, // CSE7766 Serial interface (S31 and Pow R2)
GPIO_ARIRFRCV, // AriLux RF Receive input
GPIO_TXD, // Serial interface
@@ -216,6 +216,16 @@ enum UserSelectablePins {
GPIO_HPMA_TX, // Honeywell HPMA115S0 Serial interface
GPIO_GPS_RX, // GPS serial interface
GPIO_GPS_TX, // GPS serial interface
+ GPIO_DSB_OUT, // Pseudo Single wire DS18B20 or DS18S20
+ GPIO_DHT11_OUT, // Pseudo Single wire DHT11, DHT21, DHT22, AM2301, AM2302, AM2321
+ GPIO_HM10_RX, // HM10-BLE-Mijia-bridge serial interface
+ GPIO_HM10_TX, // HM10-BLE-Mijia-bridge serial interface
+ GPIO_LE01MR_RX, // F&F LE-01MR energy meter
+ GPIO_LE01MR_TX, // F&F LE-01MR energy meter
+ GPIO_CC1101_GDO0, // CC1101 pin for RX
+ GPIO_CC1101_GDO2, // CC1101 pin for RX
+ GPIO_HRXL_RX, // Data from MaxBotix HRXL sonar range sensor
+ GPIO_ELECTRIQ_MOODL_TX, // ElectriQ iQ-wifiMOODL Serial TX
GPIO_SENSOR_END };
// Programmer selectable GPIO functionality
@@ -261,7 +271,7 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_PZEM016_RX "|" D_SENSOR_PZEM017_RX "|"
D_SENSOR_DFR562 "|" D_SENSOR_SDS0X1_TX "|"
D_SENSOR_HX711_SCK "|" D_SENSOR_HX711_DAT "|"
- D_SENSOR_TX20_TX "|"
+ D_SENSOR_TX2X_TX "|"
D_SENSOR_RFSEND "|" D_SENSOR_RFRECV "|"
D_SENSOR_TUYA_TX "|" D_SENSOR_TUYA_RX "|"
D_SENSOR_MGC3130_XFER "|" D_SENSOR_MGC3130_RESET "|"
@@ -296,7 +306,13 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_DEEPSLEEP "|" D_SENSOR_EXS_ENABLE "|"
D_SENSOR_SLAVE_TX "|" D_SENSOR_SLAVE_RX "|" D_SENSOR_SLAVE_RESET "|" D_SENSOR_SLAVE_RESET "i|"
D_SENSOR_HPMA_RX "|" D_SENSOR_HPMA_TX "|"
- D_SENSOR_GPS_RX "|" D_SENSOR_GPS_TX
+ D_SENSOR_GPS_RX "|" D_SENSOR_GPS_TX "|"
+ D_SENSOR_DS18X20 "o|" D_SENSOR_DHT11 "o|"
+ D_SENSOR_HM10_RX "|" D_SENSOR_HM10_TX "|"
+ D_SENSOR_LE01MR_RX "|" D_SENSOR_LE01MR_TX "|"
+ D_SENSOR_CC1101_GDO0 "|" D_SENSOR_CC1101_GDO2 "|"
+ D_SENSOR_HRXL_RX "|"
+ D_SENSOR_ELECTRIQ_MOODL
;
const char kSensorNamesFixed[] PROGMEM =
@@ -311,7 +327,8 @@ enum UserSelectableAdc0 {
ADC0_LIGHT, // Light sensor
ADC0_BUTTON, // Button
ADC0_BUTTON_INV,
- ADC0_MOIST, // Moisture
+ ADC0_RANGE, // Range
+ ADC0_CT_POWER, // Current
// ADC0_SWITCH, // Switch
// ADC0_SWITCH_INV,
ADC0_END };
@@ -327,7 +344,8 @@ const char kAdc0Names[] PROGMEM =
D_SENSOR_NONE "|" D_ANALOG_INPUT "|"
D_TEMPERATURE "|" D_LIGHT "|"
D_SENSOR_BUTTON "|" D_SENSOR_BUTTON "i|"
- D_MOISTURE "|"
+ D_RANGE "|"
+ D_CT_POWER "|"
// D_SENSOR_SWITCH "|" D_SENSOR_SWITCH "i|"
;
@@ -407,6 +425,8 @@ enum SupportedModules {
SONOFF_L1,
SONOFF_IFAN03,
EXS_DIMMER,
+ PWM_DIMMER,
+ SONOFF_D1,
MAXMODULE};
#define USER_MODULE 255
@@ -557,9 +577,11 @@ const uint8_t kGpioNiceList[] PROGMEM = {
GPIO_DHT11, // DHT11
GPIO_DHT22, // DHT21, DHT22, AM2301, AM2302, AM2321
GPIO_SI7021, // iTead SI7021
+ GPIO_DHT11_OUT, // Pseudo Single wire DHT11, DHT21, DHT22, AM2301, AM2302, AM2321
#endif
#ifdef USE_DS18x20
GPIO_DSB, // Single wire DS18B20 or DS18S20
+ GPIO_DSB_OUT, // Pseudo Single wire DS18B20 or DS18S20
#endif
// Light
@@ -591,6 +613,9 @@ const uint8_t kGpioNiceList[] PROGMEM = {
#ifdef USE_EXS_DIMMER
GPIO_EXS_ENABLE, // EXS MCU Enable
#endif
+#ifdef USE_ELECTRIQ_MOODL
+ GPIO_ELECTRIQ_MOODL_TX,
+#endif
#endif // USE_LIGHT
#if defined(USE_IR_REMOTE) || defined(USE_IR_REMOTE_FULL)
@@ -674,6 +699,10 @@ const uint8_t kGpioNiceList[] PROGMEM = {
GPIO_SOLAXX1_TX, // Solax Inverter tx pin
GPIO_SOLAXX1_RX, // Solax Inverter rx pin
#endif // USE_SOLAX_X1
+#ifdef USE_LE01MR
+ GPIO_LE01MR_RX, // F7F LE-01MR energy meter rx pin
+ GPIO_LE01MR_TX, // F7F LE-01MR energy meter tx pin
+#endif // IFDEF:USE_LE01MR
#endif // USE_ENERGY_SENSOR
// Serial
@@ -704,8 +733,8 @@ const uint8_t kGpioNiceList[] PROGMEM = {
#ifdef USE_PMS5003
GPIO_PMS5003, // Plantower PMS5003 Serial interface
#endif
-#ifdef USE_TX20_WIND_SENSOR
- GPIO_TX20_TXD_BLACK, // TX20 Transmission Pin
+#if defined(USE_TX20_WIND_SENSOR) || defined(USE_TX23_WIND_SENSOR)
+ GPIO_TX2X_TXD_BLACK, // TX20/TX23 Transmission Pin
#endif
#ifdef USE_MP3_PLAYER
GPIO_MP3_DFR562, // RB-DFR-562, DFPlayer Mini MP3 Player Serial interface
@@ -735,6 +764,10 @@ const uint8_t kGpioNiceList[] PROGMEM = {
GPIO_GPS_RX, // GPS serial interface
GPIO_GPS_TX, // GPS serial interface
#endif
+#ifdef USE_HM10
+ GPIO_HM10_RX, // GPS serial interface
+ GPIO_HM10_TX, // GPS serial interface
+#endif
#ifdef USE_MGC3130
GPIO_MGC3130_XFER,
@@ -767,7 +800,13 @@ const uint8_t kGpioNiceList[] PROGMEM = {
#ifdef USE_DEEPSLEEP
GPIO_DEEPSLEEP,
#endif
-
+#ifdef USE_KEELOQ
+ GPIO_CC1101_GDO0, // CC1101 pin for RX
+ GPIO_CC1101_GDO2, // CC1101 pin for RX
+#endif
+#ifdef USE_HRXL
+ GPIO_HRXL_RX,
+#endif
};
const uint8_t kModuleNiceList[] PROGMEM = {
@@ -786,6 +825,9 @@ const uint8_t kModuleNiceList[] PROGMEM = {
SONOFF_T11,
SONOFF_T12,
SONOFF_T13,
+#ifdef USE_SONOFF_D1
+ SONOFF_D1, // Sonoff D1
+#endif
SONOFF_LED, // Sonoff Light Devices
SONOFF_BN,
#ifdef USE_SONOFF_L1
@@ -843,6 +885,9 @@ const uint8_t kModuleNiceList[] PROGMEM = {
#endif
#ifdef USE_EXS_DIMMER
EXS_DIMMER,
+#endif
+#ifdef USE_PWM_DIMMER
+ PWM_DIMMER,
#endif
H801, // Light Devices
MAGICHOME,
@@ -1680,10 +1725,10 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
0, 0
},
{ "Shelly 1", // SHELLY1 - Shelly1 Open Source (ESP8266 - 2MB) - https://shelly.cloud/shelly1-open-source/
- 0, // GPIO00 - Can be changed to GPIO_USER, only if Shelly is powered with 12V DC
- 0, // GPIO01 Serial RXD - Can be changed to GPIO_USER, only if Shelly is powered with 12V DC
+ GPIO_USER, // GPIO00 - Can be changed to GPIO_USER, only if Shelly is powered with 12V DC
+ GPIO_USER, // GPIO01 Serial RXD - Can be changed to GPIO_USER, only if Shelly is powered with 12V DC
0,
- 0, // GPIO03 Serial TXD - Can be changed to GPIO_USER, only if Shelly is powered with 12V DC
+ GPIO_USER, // GPIO03 Serial TXD - Can be changed to GPIO_USER, only if Shelly is powered with 12V DC
GPIO_REL1, // GPIO04 Relay (0 = Off, 1 = On)
GPIO_SWT1_NP, // GPIO05 SW pin
// GPIO06 (SD_CLK Flash)
@@ -2183,6 +2228,50 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
GPIO_USER, // GPIO14
0, // GPIO15
0, 0
+ },
+ { "PWM Dimmer", // PWM_DIMMER - Support for Martin Jerry/acenx/Tessan/NTONPOWER SD0x PWM
+ // dimmer switches. The brightness of the load for these dimmers is
+ // controlled by a PWM GPIO pin. There are typically power, up & down
+ // buttons and 4 LED's. Examples are:
+ // https://www.amazon.com/dp/B07FXYSVR1
+ // https://www.amazon.com/dp/B07V26Q3VD
+ // https://www.amazon.com/dp/B07K67D43J
+ // https://www.amazon.com/dp/B07TTGFWFM
+ GPIO_KEY3, // GPIO00 Up button
+ GPIO_KEY2, // GPIO01 Down button
+ 0, // GPIO02
+ GPIO_LED4_INV, // GPIO03 Level 5 LED
+ GPIO_LEDLNK_INV, // GPIO04 LED Link
+ GPIO_LED3_INV, // GPIO05 Level 4 LED
+ // 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_LED2_INV, // GPIO12 Level 3 LED
+ GPIO_PWM1, // GPIO13 Dimmer PWM
+ GPIO_LED1_INV, // GPIO12 Level 2 LED
+ GPIO_KEY1_INV, // GPIO15 Power button
+ GPIO_REL1_INV, // GPIO16 Power relay/Level 1 LED
+ 0
+ },
+ { "Sonoff D1", // SONOFF_D1 - Sonoff D1 RF Dimmer 433 (ESP8285)
+ GPIO_USER, // GPIO00 Pad
+ GPIO_TXD, // GPIO01 D1 control
+ 0, // GPIO02
+ GPIO_RXD, // GPIO03 D1 control
+ 0, // GPIO04 DEBUG_RX
+ 0, // GPIO05 DEBUG_TX
+ // GPIO06 (SD_CLK Flash)
+ // GPIO07 (SD_DATA0 Flash QIO/DIO/DOUT)
+ // GPIO08 (SD_DATA1 Flash QIO/DIO/DOUT)
+ 0, // GPIO09
+ 0, // GPIO10
+ // GPIO11 (SD_CMD Flash)
+ 0, // GPIO12
+ GPIO_LED1_INV, // GPIO13 WiFi Blue Led - Link and Power status
+ 0, 0, 0, 0
}
};
diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h
index 70747a9a6..0a3b9aa5e 100644
--- a/tasmota/tasmota_version.h
+++ b/tasmota/tasmota_version.h
@@ -1,7 +1,7 @@
/*
tasmota_version.h - Version header file for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -20,7 +20,7 @@
#ifndef _TASMOTA_VERSION_H_
#define _TASMOTA_VERSION_H_
-const uint32_t VERSION = 0x08010000;
+const uint32_t VERSION = 0x08020000;
// Lowest compatible version
const uint32_t VERSION_COMPATIBLE = 0x07010006;
diff --git a/tasmota/user_config_override_sample.h b/tasmota/user_config_override_sample.h
index c70ec849f..5bd99175a 100644
--- a/tasmota/user_config_override_sample.h
+++ b/tasmota/user_config_override_sample.h
@@ -1,7 +1,7 @@
/*
user_config_override.h - user configuration overrides my_user_config.h for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino
index d86562bb3..7f55a01fd 100644
--- a/tasmota/xdrv_01_webserver.ino
+++ b/tasmota/xdrv_01_webserver.ino
@@ -1,7 +1,7 @@
/*
xdrv_01_webserver.ino - webserver for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -31,7 +31,7 @@
#define WIFI_SOFT_AP_CHANNEL 1 // Soft Access Point Channel number between 1 and 11 as used by WifiManager web GUI
#endif
-const uint16_t CHUNKED_BUFFER_SIZE = 400; // Chunk buffer size (should be smaller than half mqtt_date size)
+const uint16_t CHUNKED_BUFFER_SIZE = 400; // Chunk buffer size (should be smaller than half mqtt_date size = MESSZ)
const uint16_t HTTP_REFRESH_TIME = 2345; // milliseconds
#define HTTP_RESTART_RECONNECT_TIME 9000 // milliseconds
@@ -187,7 +187,8 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM =
"c=eb('c1');"
"o='&c1='+encodeURIComponent(c.value);"
"c.value='';"
- "t.scrollTop=sn;"
+ "t.scrollTop=99999;"
+ "sn=t.scrollTop;"
"}"
"if(t.scrollTop>=sn){" // User scrolled back so no updates
"if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1)
@@ -341,7 +342,7 @@ const char HTTP_HEAD_STYLE1[] PROGMEM =
"input[type=checkbox],input[type=radio]{width:1em;margin-right:6px;vertical-align:-1px;}"
"input[type=range]{width:99%%;}"
"select{width:100%%;background:#%06x;color:#%06x;}" // COLOR_INPUT, COLOR_INPUT_TEXT
- "textarea{resize:none;width:98%%;height:318px;padding:5px;overflow:auto;background:#%06x;color:#%06x;}" // COLOR_CONSOLE, COLOR_CONSOLE_TEXT
+ "textarea{resize:vertical;width:98%%;height:318px;padding:5px;overflow:auto;background:#%06x;color:#%06x;}" // COLOR_CONSOLE, COLOR_CONSOLE_TEXT
"body{text-align:center;font-family:verdana,sans-serif;background:#%06x;}" // COLOR_BACKGROUND
"td{padding:0px;}";
const char HTTP_HEAD_STYLE2[] PROGMEM =
@@ -639,7 +640,14 @@ void WifiManagerBegin(bool reset_only)
int channel = WIFI_SOFT_AP_CHANNEL;
if ((channel < 1) || (channel > 13)) { channel = 1; }
- WiFi.softAP(my_hostname, nullptr, channel);
+
+#ifdef ARDUINO_ESP8266_RELEASE_2_3_0
+ // bool softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0);
+ WiFi.softAP(my_hostname, WIFI_AP_PASSPHRASE, channel, 0);
+#else
+ // bool softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0, int max_connection = 4);
+ WiFi.softAP(my_hostname, WIFI_AP_PASSPHRASE, channel, 0, 1);
+#endif
delay(500); // Without delay I've seen the IP address blank
/* Setup the DNS server redirecting all the domains to the apIP */
@@ -914,6 +922,17 @@ void WSContentSpaceButton(uint32_t title_index)
WSContentButton(title_index);
}
+void WSContentSend_THD(const char *types, float f_temperature, float f_humidity)
+{
+ char parameter[FLOATSZ];
+ dtostrfd(f_temperature, Settings.flag2.temperature_resolution, parameter);
+ WSContentSend_PD(HTTP_SNS_TEMP, types, parameter, TempUnit());
+ dtostrfd(f_humidity, Settings.flag2.humidity_resolution, parameter);
+ WSContentSend_PD(HTTP_SNS_HUM, types, parameter);
+ dtostrfd(CalcTempHumToDew(f_temperature, f_humidity), Settings.flag2.temperature_resolution, parameter);
+ WSContentSend_PD(HTTP_SNS_DEW, types, parameter, TempUnit());
+}
+
void WSContentEnd(void)
{
WSContentFlush(); // Flush chunk buffer
@@ -983,6 +1002,19 @@ void HandleWifiLogin(void)
WSContentStop();
}
+#ifdef USE_LIGHT
+void WebSliderColdWarm(void)
+{
+ WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, // Cold Warm
+ "a", // a - Unique HTML id
+ "#fff", "#ff0", // White to Yellow
+ 1, // sl1
+ 153, 500, // Range color temperature
+ LightGetColorTemp(),
+ 't', 0); // t0 - Value id releated to lc("t0", value) and WebGetArg("t0", tmp, sizeof(tmp));
+}
+#endif // USE_LIGHT
+
void HandleRoot(void)
{
if (CaptivePortal()) { return; } // If captive portal redirect instead of displaying the page.
@@ -1032,17 +1064,13 @@ void HandleRoot(void)
if (light_type) {
uint8_t light_subtype = light_type &7;
if (!Settings.flag3.pwm_multi_channels) { // SetOption68 0 - Enable multi-channels PWM instead of Color PWM
- if ((LST_COLDWARM == light_subtype) || (LST_RGBWC == light_subtype)) {
+ bool split_white = ((LST_RGBW <= light_subtype) && (devices_present > 1)); // Only on RGBW or RGBCW and SetOption37 128
- WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, // Cold Warm
- "a", // a - Unique HTML id
- "#fff", "#ff0", // White to Yellow
- 1, // sl1
- 153, 500, // Range color temperature
- LightGetColorTemp(),
- 't', 0); // t0 - Value id releated to lc("t0", value) and WebGetArg("t0", tmp, sizeof(tmp));
+ if ((LST_COLDWARM == light_subtype) || ((LST_RGBCW == light_subtype) && !split_white)) {
+ WebSliderColdWarm();
}
- if (light_subtype > 2) {
+
+ if (light_subtype > 2) { // No W or CW
uint16_t hue;
uint8_t sat;
LightGetHSB(&hue, &sat, nullptr);
@@ -1078,6 +1106,19 @@ void HandleRoot(void)
Settings.flag3.slider_dimmer_stay_on, 100, // Range 0/1 to 100%
Settings.light_dimmer,
'd', 0); // d0 - Value id is related to lc("d0", value) and WebGetArg("d0", tmp, sizeof(tmp));
+
+ if (split_white) { // SetOption37 128
+ if (LST_RGBCW == light_subtype) {
+ WebSliderColdWarm();
+ }
+ WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, // White brightness - Black to White
+ "f", // f - Unique HTML id
+ "#000", "#fff", // Black to White
+ 5, // sl5 - Unique range HTML id - Not used
+ Settings.flag3.slider_dimmer_stay_on, 100, // Range 0/1 to 100%
+ LightGetDimmer(2),
+ 'w', 0); // w0 - Value id is related to lc("w0", value) and WebGetArg("w0", tmp, sizeof(tmp));
+ }
} else { // Settings.flag3.pwm_multi_channels - SetOption68 1 - Enable multi-channels PWM instead of Color PWM
uint32_t pwm_channels = light_subtype > LST_MAX ? LST_MAX : light_subtype;
stemp[0] = 'e'; stemp[1] = '0'; stemp[2] = '\0'; // d0
@@ -1120,20 +1161,12 @@ void HandleRoot(void)
for (uint32_t idx = 1; idx <= devices_present; idx++) {
bool set_button = ((idx <= MAX_BUTTON_TEXT) && strlen(SettingsText(SET_BUTTON1 + idx -1)));
#ifdef USE_SHUTTER
- if (Settings.flag3.shutter_mode) { // SetOption80 - Enable shutter support
- bool shutter_used = false;
- for (uint32_t i = 0; i < MAX_SHUTTERS; i++) {
- if (Settings.shutter_startrelay[i] == (((idx -1) & 0xFFFFFFFE) +1)) {
- shutter_used = true;
- break;
- }
- }
- if (shutter_used) {
- WSContentSend_P(HTTP_DEVICE_CONTROL, 100 / devices_present, idx,
- (set_button) ? SettingsText(SET_BUTTON1 + idx -1) : (idx % 2) ? "▲" : "▼",
- "");
- continue;
- }
+ int32_t ShutterWebButton;
+ if (ShutterWebButton = IsShutterWebButton(idx)) {
+ WSContentSend_P(HTTP_DEVICE_CONTROL, 100 / devices_present, idx,
+ (set_button) ? SettingsText(SET_BUTTON1 + idx -1) : ((Settings.shutter_options[abs(ShutterWebButton)-1] & 2) /* is locked */ ? "-" : ((Settings.shutter_options[abs(ShutterWebButton)-1] & 8) /* invert web buttons */ ? ((ShutterWebButton>0) ? "▼" : "▲") : ((ShutterWebButton>0) ? "▲" : "▼"))),
+ "");
+ continue;
}
#endif // USE_SHUTTER
snprintf_P(stemp, sizeof(stemp), PSTR(" %d"), idx);
@@ -1216,22 +1249,39 @@ bool HandleRootStatusRefresh(void)
}
} else {
#endif // USE_SONOFF_IFAN
- ExecuteCommandPower(device, POWER_TOGGLE, SRC_IGNORE);
+#ifdef USE_SHUTTER
+ int32_t ShutterWebButton;
+ if (ShutterWebButton = IsShutterWebButton(device)) {
+ snprintf_P(svalue, sizeof(svalue), PSTR("ShutterPosition%d %s"), abs(ShutterWebButton), (ShutterWebButton>0) ? PSTR(D_CMND_SHUTTER_TOGGLEUP) : PSTR(D_CMND_SHUTTER_TOGGLEDOWN));
+ ExecuteWebCommand(svalue, SRC_WEBGUI);
+ } else {
+#endif // USE_SHUTTER
+ ExecuteCommandPower(device, POWER_TOGGLE, SRC_IGNORE);
+#ifdef USE_SHUTTER
+ }
+#endif // USE_SHUTTER
#ifdef USE_SONOFF_IFAN
}
#endif // USE_SONOFF_IFAN
}
+#ifdef USE_LIGHT
WebGetArg("d0", tmp, sizeof(tmp)); // 0 - 100 Dimmer value
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_DIMMER " %s"), tmp);
ExecuteWebCommand(svalue, SRC_WEBGUI);
}
+ WebGetArg("w0", tmp, sizeof(tmp)); // 0 - 100 White value
+ if (strlen(tmp)) {
+ snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_WHITE " %s"), tmp);
+ ExecuteWebCommand(svalue, SRC_WEBGUI);
+ }
+ uint32_t light_device = LightDevice(); // Channel number offset
uint32_t pwm_channels = (light_type & 7) > LST_MAX ? LST_MAX : (light_type & 7);
- for (uint32_t j = 1; j <= pwm_channels; j++) {
- snprintf_P(webindex, sizeof(webindex), PSTR("e%d"), j);
+ for (uint32_t j = 0; j < pwm_channels; j++) {
+ snprintf_P(webindex, sizeof(webindex), PSTR("e%d"), j +1);
WebGetArg(webindex, tmp, sizeof(tmp)); // 0 - 100 percent
if (strlen(tmp)) {
- snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_CHANNEL "%d %s"), j, tmp);
+ snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_CHANNEL "%d %s"), j +light_device, tmp);
ExecuteWebCommand(svalue, SRC_WEBGUI);
}
}
@@ -1250,6 +1300,7 @@ bool HandleRootStatusRefresh(void)
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_HSBCOLOR "2 %s"), tmp);
ExecuteWebCommand(svalue, SRC_WEBGUI);
}
+#endif // USE_LIGHT
#ifdef USE_SHUTTER
for (uint32_t j = 1; j <= shutters_present; j++) {
snprintf_P(webindex, sizeof(webindex), PSTR("u%d"), j);
@@ -1301,6 +1352,22 @@ bool HandleRootStatusRefresh(void)
return true;
}
+#ifdef USE_SHUTTER
+int32_t IsShutterWebButton(uint32_t idx) {
+ /* 0: Not a shutter, 1..4: shutter up idx, -1..-4: shutter down idx */
+ int32_t ShutterWebButton = 0;
+ if (Settings.flag3.shutter_mode) { // SetOption80 - Enable shutter support
+ for (uint32_t i = 0; i < MAX_SHUTTERS; i++) {
+ if (Settings.shutter_startrelay[i] && ((Settings.shutter_startrelay[i] == idx) || (Settings.shutter_startrelay[i] == (idx-1)))) {
+ ShutterWebButton = (Settings.shutter_startrelay[i] == idx) ? (i+1): (-1-i);
+ break;
+ }
+ }
+ }
+ return ShutterWebButton;
+}
+#endif // USE_SHUTTER
+
/*-------------------------------------------------------------------------------------------*/
#ifndef FIRMWARE_MINIMAL
@@ -1656,8 +1723,9 @@ void HandleWifiConfiguration(void)
for (uint32_t i = 0; i < n; i++) {
if (-1 == indices[i]) { continue; }
cssid = WiFi.SSID(indices[i]);
+ uint32_t cschn = WiFi.channel(indices[i]);
for (uint32_t j = i + 1; j < n; j++) {
- if (cssid == WiFi.SSID(indices[j])) {
+ if ((cssid == WiFi.SSID(indices[j])) && (cschn == WiFi.channel(indices[j]))) {
DEBUG_CORE_LOG(PSTR(D_LOG_WIFI D_DUPLICATE_ACCESSPOINT " %s"), WiFi.SSID(indices[j]).c_str());
indices[j] = -1; // set dup aps to index -1
}
@@ -1667,16 +1735,17 @@ void HandleWifiConfiguration(void)
//display networks in page
for (uint32_t i = 0; i < n; i++) {
if (-1 == indices[i]) { continue; } // skip dups
+ int32_t rssi = WiFi.RSSI(indices[i])
DEBUG_CORE_LOG(PSTR(D_LOG_WIFI D_SSID " %s, " D_BSSID " %s, " D_CHANNEL " %d, " D_RSSI " %d"),
- WiFi.SSID(indices[i]).c_str(), WiFi.BSSIDstr(indices[i]).c_str(), WiFi.channel(indices[i]), WiFi.RSSI(indices[i]));
- int quality = WifiGetRssiAsQuality(WiFi.RSSI(indices[i]));
+ WiFi.SSID(indices[i]).c_str(), WiFi.BSSIDstr(indices[i]).c_str(), WiFi.channel(indices[i]), rssi);
+ int quality = WifiGetRssiAsQuality(rssi);
int auth = WiFi.encryptionType(indices[i]);
char encryption[20];
WSContentSend_P(PSTR("%s (%d) 
%s %d%% (%d dBm) "),
HtmlEscape(WiFi.SSID(indices[i])).c_str(),
WiFi.channel(indices[i]),
GetTextIndexed(encryption, sizeof(encryption), auth +1, kEncryptionType),
- quality, WiFi.RSSI()
+ quality, rssi
);
delay(0);
@@ -1693,10 +1762,11 @@ void HandleWifiConfiguration(void)
}
if (WifiIsInManagerMode()) {
- WSContentSpaceButton(BUTTON_RESTART);
#ifndef FIRMWARE_MINIMAL
- WSContentSpaceButton(BUTTON_RESET_CONFIGURATION);
+ WSContentSpaceButton(BUTTON_RESTORE);
+ WSContentButton(BUTTON_RESET_CONFIGURATION);
#endif // FIRMWARE_MINIMAL
+ WSContentSpaceButton(BUTTON_RESTART);
} else {
WSContentSpaceButton(BUTTON_CONFIGURATION);
}
@@ -1828,6 +1898,7 @@ void HandleOtherConfiguration(void)
}
#ifdef USE_EMULATION
+#if defined(USE_EMULATION_WEMO) || defined(USE_EMULATION_HUE)
WSContentSend_P(PSTR("
" D_EMULATION " ")); // Keep close to Friendlynames so do not use
for (uint32_t i = 0; i < EMUL_MAX; i++) {
#ifndef USE_EMULATION_WEMO
@@ -1845,6 +1916,7 @@ void HandleOtherConfiguration(void)
}
}
WSContentSend_P(PSTR("
"));
+#endif // USE_EMULATION_WEMO || USE_EMULATION_HUE
#endif // USE_EMULATION
WSContentSend_P(HTTP_FORM_END);
@@ -1863,8 +1935,11 @@ void OtherSaveSettings(void)
SettingsUpdateText(SET_WEBPWD, (!strlen(tmp)) ? "" : (strchr(tmp,'*')) ? SettingsText(SET_WEBPWD) : tmp);
Settings.flag.mqtt_enabled = WebServer->hasArg("b1"); // SetOption3 - Enable MQTT
#ifdef USE_EMULATION
+ UdpDisconnect();
+#if defined(USE_EMULATION_WEMO) || defined(USE_EMULATION_HUE)
WebGetArg("b2", tmp, sizeof(tmp));
Settings.flag2.emulation = (!strlen(tmp)) ? 0 : atoi(tmp);
+#endif // USE_EMULATION_WEMO || USE_EMULATION_HUE
#endif // USE_EMULATION
snprintf_P(message, sizeof(message), PSTR(D_LOG_OTHER D_MQTT_ENABLE " %s, " D_CMND_EMULATION " %d, " D_CMND_FRIENDLYNAME), GetStateText(Settings.flag.mqtt_enabled), Settings.flag2.emulation);
@@ -1877,17 +1952,26 @@ void OtherSaveSettings(void)
}
AddLog_P(LOG_LEVEL_INFO, message);
+/*
+ // This sometimes provides intermittent watchdog
+ bool template_activate = WebServer->hasArg("t2"); // Try this to tackle intermittent watchdog after execution of Template command
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);
- if (WebServer->hasArg("t2")) {
+ if (template_activate) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_MODULE " 0"));
ExecuteWebCommand(svalue, SRC_WEBGUI);
}
-
+ }
+ // Try async execution of commands
+*/
+ 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}
+ snprintf_P(message, sizeof(message), PSTR(D_CMND_BACKLOG " " D_CMND_TEMPLATE " %s%s"), tmp, (WebServer->hasArg("t2")) ? "; " D_CMND_MODULE " 0" : "");
+ ExecuteWebCommand(message, SRC_WEBGUI);
}
}
@@ -1970,7 +2054,11 @@ void HandleRestoreConfiguration(void)
WSContentSendStyle();
WSContentSend_P(HTTP_FORM_RST);
WSContentSend_P(HTTP_FORM_RST_UPG, D_RESTORE);
- WSContentSpaceButton(BUTTON_CONFIGURATION);
+ if (WifiIsInManagerMode()) {
+ WSContentSpaceButton(BUTTON_MAIN);
+ } else {
+ WSContentSpaceButton(BUTTON_CONFIGURATION);
+ }
WSContentStop();
Web.upload_error = 0;
@@ -2010,7 +2098,8 @@ void HandleInformation(void)
WSContentSend_P(PSTR("}1" D_FRIENDLY_NAME " %d}2%s"), i +1, SettingsText(SET_FRIENDLYNAME1 +i));
}
WSContentSend_P(PSTR("}1}2 ")); // Empty line
- WSContentSend_P(PSTR("}1" D_AP "%d " D_SSID " (" D_RSSI ")}2%s (%d%%, %d dBm)"), Settings.sta_active +1, SettingsText(SET_STASSID1 + Settings.sta_active), WifiGetRssiAsQuality(WiFi.RSSI()), WiFi.RSSI());
+ int32_t rssi = WiFi.RSSI();
+ WSContentSend_P(PSTR("}1" D_AP "%d " D_SSID " (" D_RSSI ")}2%s (%d%%, %d dBm)"), Settings.sta_active +1, SettingsText(SET_STASSID1 + Settings.sta_active), WifiGetRssiAsQuality(rssi), rssi);
WSContentSend_P(PSTR("}1" D_HOSTNAME "}2%s%s"), my_hostname, (Wifi.mdns_begun) ? ".local" : "");
#if LWIP_IPV6
String ipv6_addr = WifiGetIPv6();
@@ -2265,16 +2354,18 @@ void HandleUploadLoop(void)
} else
#endif
{
- if (upload.buf[0] != 0xE9) {
+ if ((upload.buf[0] != 0xE9) && (upload.buf[0] != 0x1F)) { // 0x1F is gzipped 0xE9
Web.upload_error = 3; // Magic byte is not 0xE9
return;
}
- uint32_t bin_flash_size = ESP.magicFlashChipSize((upload.buf[3] & 0xf0) >> 4);
- if(bin_flash_size > ESP.getFlashChipRealSize()) {
- Web.upload_error = 4; // Program flash size is larger than real flash size
- return;
+ if (0xE9 == upload.buf[0]) {
+ uint32_t bin_flash_size = ESP.magicFlashChipSize((upload.buf[3] & 0xf0) >> 4);
+ if (bin_flash_size > ESP.getFlashChipRealSize()) {
+ Web.upload_error = 4; // Program flash size is larger than real flash size
+ return;
+ }
+// upload.buf[2] = 3; // Force DOUT - ESP8285
}
-// upload.buf[2] = 3; // Force DOUT - ESP8285
}
}
}
@@ -2391,8 +2482,7 @@ void HandleUploadLoop(void)
Web.upload_error = 6; // Upload failed. Enable logging 3
return;
}
- if (OtaVersion() < VERSION_COMPATIBLE) {
- AbandonOta();
+ if (!VersionCompatible()) {
Web.upload_error = 14; // Not compatible
return;
}
@@ -2764,6 +2854,7 @@ void (* const WebCommand[])(void) PROGMEM = {
#ifdef USE_EMULATION
void CmndEmulation(void)
{
+#if defined(USE_EMULATION_WEMO) || defined(USE_EMULATION_HUE)
#if defined(USE_EMULATION_WEMO) && defined(USE_EMULATION_HUE)
if ((XdrvMailbox.payload >= EMUL_NONE) && (XdrvMailbox.payload < EMUL_MAX)) {
#else
@@ -2777,6 +2868,7 @@ void CmndEmulation(void)
Settings.flag2.emulation = XdrvMailbox.payload;
restart_flag = 2;
}
+#endif
ResponseCmndNumber(Settings.flag2.emulation);
}
#endif // USE_EMULATION
@@ -2880,11 +2972,7 @@ void CmndWebButton(void)
{
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_BUTTON_TEXT)) {
if (!XdrvMailbox.usridx) {
- mqtt_data[0] = '\0';
- for (uint32_t i = 0; i < MAX_BUTTON_TEXT; i++) {
- ResponseAppend_P(PSTR("%c\"WebButton%d\":\"%s\""), (i) ? ',' : '{', i +1, SettingsText(SET_BUTTON1 +i));
- }
- ResponseJsonEnd();
+ ResponseCmndAll(SET_BUTTON1, MAX_BUTTON_TEXT);
} else {
if (XdrvMailbox.data_len > 0) {
SettingsUpdateText(SET_BUTTON1 + XdrvMailbox.index -1, ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data);
@@ -2914,7 +3002,11 @@ bool Xdrv01(uint8_t function)
case FUNC_LOOP:
PollDnsWebserver();
#ifdef USE_EMULATION
+#ifdef USE_DEVICE_GROUPS
+ if (Settings.flag2.emulation || Settings.flag4.device_groups_enabled) { PollUdp(); }
+#else // USE_DEVICE_GROUPS
if (Settings.flag2.emulation) { PollUdp(); }
+#endif // USE_DEVICE_GROUPS
#endif // USE_EMULATION
break;
case FUNC_COMMAND:
diff --git a/tasmota/xdrv_02_mqtt.ino b/tasmota/xdrv_02_mqtt.ino
index 910a2ea6f..1d084862b 100644
--- a/tasmota/xdrv_02_mqtt.ino
+++ b/tasmota/xdrv_02_mqtt.ino
@@ -1,7 +1,7 @@
/*
xdrv_02_mqtt.ino - mqtt support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -164,7 +164,7 @@ void MqttDiscoverServer(void)
// Max message size calculated by PubSubClient is (MQTT_MAX_PACKET_SIZE < 5 + 2 + strlen(topic) + plength)
#if (MQTT_MAX_PACKET_SIZE -TOPSZ -7) < MIN_MESSZ // If the max message size is too small, throw an error at compile time. See PubSubClient.cpp line 359
- #error "MQTT_MAX_PACKET_SIZE is too small in libraries/PubSubClient/src/PubSubClient.h, increase it to at least 1000"
+ #error "MQTT_MAX_PACKET_SIZE is too small in libraries/PubSubClient/src/PubSubClient.h, increase it to at least 1200"
#endif
#ifdef USE_MQTT_TLS
@@ -221,6 +221,15 @@ void MqttUnsubscribeLib(const char *topic)
bool MqttPublishLib(const char* topic, bool retained)
{
+ // If Prefix1 equals Prefix2 disable next MQTT subscription to prevent loop
+ if (!strcmp(SettingsText(SET_MQTTPREFIX1), SettingsText(SET_MQTTPREFIX2))) {
+ char *str = strstr(topic, SettingsText(SET_MQTTPREFIX1));
+ if (str == topic) {
+ mqtt_cmnd_blocked_reset = 4; // Allow up to four seconds before resetting residual cmnd blocks
+ mqtt_cmnd_blocked++;
+ }
+ }
+
bool result = MqttClient.publish(topic, mqtt_data, retained);
yield(); // #3313
return result;
@@ -238,12 +247,8 @@ void MqttDataHandler(char* mqtt_topic, uint8_t* mqtt_data, unsigned int data_len
// Do not execute multiple times if Prefix1 equals Prefix2
if (!strcmp(SettingsText(SET_MQTTPREFIX1), SettingsText(SET_MQTTPREFIX2))) {
char *str = strstr(mqtt_topic, SettingsText(SET_MQTTPREFIX1));
- if ((str == mqtt_topic) && mqtt_cmnd_publish) {
- if (mqtt_cmnd_publish > 3) {
- mqtt_cmnd_publish -= 3;
- } else {
- mqtt_cmnd_publish = 0;
- }
+ if ((str == mqtt_topic) && mqtt_cmnd_blocked) {
+ mqtt_cmnd_blocked--;
return;
}
}
@@ -291,52 +296,41 @@ void MqttUnsubscribe(const char *topic)
void MqttPublishLogging(const char *mxtime)
{
- if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
- if (MqttIsConnected()) {
+ char saved_mqtt_data[strlen(mqtt_data) +1];
+ memcpy(saved_mqtt_data, mqtt_data, sizeof(saved_mqtt_data));
- char saved_mqtt_data[MESSZ];
- memcpy(saved_mqtt_data, mqtt_data, sizeof(saved_mqtt_data));
-// ResponseTime_P(PSTR(",\"Log\":{\"%s\"}}"), log_data); // Will fail as some messages contain JSON
- Response_P(PSTR("%s%s"), mxtime, log_data); // No JSON and ugly!!
+// ResponseTime_P(PSTR(",\"Log\":{\"%s\"}}"), log_data); // Will fail as some messages contain JSON
+ Response_P(PSTR("%s%s"), mxtime, log_data); // No JSON and ugly!!
+ char stopic[TOPSZ];
+ GetTopic_P(stopic, STAT, mqtt_topic, PSTR("LOGGING"));
+ MqttPublishLib(stopic, false);
- char romram[33];
- char stopic[TOPSZ];
- snprintf_P(romram, sizeof(romram), PSTR("LOGGING"));
- GetTopic_P(stopic, STAT, mqtt_topic, romram);
-
- char *me;
- if (!strcmp(SettingsText(SET_MQTTPREFIX1), SettingsText(SET_MQTTPREFIX2))) {
- me = strstr(stopic, SettingsText(SET_MQTTPREFIX1));
- if (me == stopic) {
- mqtt_cmnd_publish += 3;
- }
- }
- MqttPublishLib(stopic, false);
-
- memcpy(mqtt_data, saved_mqtt_data, sizeof(saved_mqtt_data));
- }
- }
+ memcpy(mqtt_data, saved_mqtt_data, sizeof(saved_mqtt_data));
}
-void MqttPublishDirect(const char* topic, bool retained)
+void MqttPublish(const char* topic, bool retained)
{
- char sretained[CMDSZ];
- char slog_type[20];
-
#ifdef USE_DEBUG_DRIVER
- ShowFreeMem(PSTR("MqttPublishDirect"));
+ ShowFreeMem(PSTR("MqttPublish"));
#endif
+#if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) || defined(MQTT_NO_RETAIN)
+// if (retained) {
+// AddLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR("Retained are not supported by AWS IoT, using retained = false."));
+// }
+ retained = false; // AWS IoT does not support retained, it will disconnect if received
+#endif
+
+ char sretained[CMDSZ];
sretained[0] = '\0';
+ char slog_type[20];
snprintf_P(slog_type, sizeof(slog_type), PSTR(D_LOG_RESULT));
if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
- if (MqttIsConnected()) {
- if (MqttPublishLib(topic, retained)) {
- snprintf_P(slog_type, sizeof(slog_type), PSTR(D_LOG_MQTT));
- if (retained) {
- snprintf_P(sretained, sizeof(sretained), PSTR(" (" D_RETAINED ")"));
- }
+ if (MqttPublishLib(topic, retained)) {
+ snprintf_P(slog_type, sizeof(slog_type), PSTR(D_LOG_MQTT));
+ if (retained) {
+ snprintf_P(sretained, sizeof(sretained), PSTR(" (" D_RETAINED ")"));
}
}
}
@@ -354,25 +348,6 @@ void MqttPublishDirect(const char* topic, bool retained)
}
}
-void MqttPublish(const char* topic, bool retained)
-{
- char *me;
-#if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT)
- if (retained) {
- AddLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR("Retained are not supported by AWS IoT, using retained = false."));
- }
- retained = false; // AWS IoT does not support retained, it will disconnect if received
-#endif
-
- if (!strcmp(SettingsText(SET_MQTTPREFIX1), SettingsText(SET_MQTTPREFIX2))) {
- me = strstr(topic, SettingsText(SET_MQTTPREFIX1));
- if (me == topic) {
- mqtt_cmnd_publish += 3;
- }
- }
- MqttPublishDirect(topic, retained);
-}
-
void MqttPublish(const char* topic)
{
MqttPublish(topic, false);
@@ -387,7 +362,7 @@ void MqttPublishPrefixTopic_P(uint32_t prefix, const char* subtopic, bool retain
* prefix 5 = stat using subtopic or RESULT
* prefix 6 = tele using subtopic or RESULT
*/
- char romram[33];
+ char romram[64];
char stopic[TOPSZ];
snprintf_P(romram, sizeof(romram), ((prefix > 3) && !Settings.flag.mqtt_response) ? S_RSLT_RESULT : subtopic); // SetOption4 - Switch between MQTT RESULT or COMMAND
@@ -397,6 +372,36 @@ void MqttPublishPrefixTopic_P(uint32_t prefix, const char* subtopic, bool retain
prefix &= 3;
GetTopic_P(stopic, prefix, mqtt_topic, romram);
MqttPublish(stopic, retained);
+
+#ifdef USE_MQTT_AWS_IOT
+ if ((prefix > 0) && (Settings.flag4.awsiot_shadow)) { // placeholder for SetOptionXX
+ // compute the target topic
+ char *topic = SettingsText(SET_MQTT_TOPIC);
+ char topic2[strlen(topic)+1]; // save buffer onto stack
+ strcpy(topic2, topic);
+ // replace any '/' with '_'
+ char *s = topic2;
+ while (*s) {
+ if ('/' == *s) {
+ *s = '_';
+ }
+ s++;
+ }
+ // update topic is "$aws/things//shadow/update"
+ snprintf_P(romram, sizeof(romram), PSTR("$aws/things/%s/shadow/update"), topic2);
+
+ // copy buffer
+ char *mqtt_save = (char*) malloc(strlen(mqtt_data)+1);
+ if (!mqtt_save) { return; } // abort
+ strcpy(mqtt_save, mqtt_data);
+ snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"state\":{\"reported\":%s}}"), mqtt_save);
+ free(mqtt_save);
+
+ bool result = MqttClient.publish(romram, mqtt_data, false);
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_MQTT "Updated shadow: %s"), romram);
+ yield(); // #3313
+ }
+#endif // USE_MQTT_AWS_IOT
}
void MqttPublishPrefixTopic_P(uint32_t prefix, const char* subtopic)
@@ -532,7 +537,7 @@ void MqttConnected(void)
}
#endif // USE_WEBSERVER
Response_P(PSTR("{\"" D_JSON_RESTARTREASON "\":"));
- if (ResetReason() == REASON_EXCEPTION_RST) {
+ if (CrashFlag()) {
CrashDump();
} else {
ResponseAppend_P(PSTR("\"%s\""), GetResetReason().c_str());
@@ -692,11 +697,6 @@ void MqttCheck(void)
if (!MqttIsConnected()) {
global_state.mqtt_down = 1;
if (!Mqtt.retry_counter) {
-#ifdef USE_DISCOVERY
-#ifdef MQTT_HOST_DISCOVERY
- if (!strlen(SettingsText(SET_MQTT_HOST)) && !Wifi.mdns_begun) { return; }
-#endif // MQTT_HOST_DISCOVERY
-#endif // USE_DISCOVERY
MqttReconnect();
} else {
Mqtt.retry_counter--;
@@ -706,10 +706,22 @@ void MqttCheck(void)
}
} else {
global_state.mqtt_down = 0;
- if (Mqtt.initial_connection_state) MqttReconnect();
+ if (Mqtt.initial_connection_state) {
+ MqttReconnect();
+ }
}
}
+bool KeyTopicActive(uint32_t key)
+{
+ // key = 0 - Button topic
+ // key = 1 - Switch topic
+ key &= 1;
+ char key_topic[TOPSZ];
+ Format(key_topic, SettingsText(SET_MQTT_BUTTON_TOPIC + key), sizeof(key_topic));
+ return ((strlen(key_topic) != 0) && strcmp(key_topic, "0"));
+}
+
/*********************************************************************************************\
* Commands
\*********************************************************************************************/
@@ -789,14 +801,18 @@ void CmndMqttRetry(void)
void CmndStateText(void)
{
- if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 4)) {
- if (XdrvMailbox.data_len > 0) {
- for (uint32_t i = 0; i <= XdrvMailbox.data_len; i++) {
- if (XdrvMailbox.data[i] == ' ') XdrvMailbox.data[i] = '_';
+ if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_STATE_TEXT)) {
+ if (!XdrvMailbox.usridx) {
+ ResponseCmndAll(SET_STATE_TXT1, MAX_STATE_TEXT);
+ } else {
+ if (XdrvMailbox.data_len > 0) {
+ for (uint32_t i = 0; i <= XdrvMailbox.data_len; i++) {
+ if (XdrvMailbox.data[i] == ' ') XdrvMailbox.data[i] = '_';
+ }
+ SettingsUpdateText(SET_STATE_TXT1 + XdrvMailbox.index -1, XdrvMailbox.data);
}
- SettingsUpdateText(SET_STATE_TXT1 + XdrvMailbox.index -1, XdrvMailbox.data);
+ ResponseCmndIdxChar(GetStateText(XdrvMailbox.index -1));
}
- ResponseCmndIdxChar(GetStateText(XdrvMailbox.index -1));
}
}
@@ -828,32 +844,35 @@ void CmndFullTopic(void)
void CmndPrefix(void)
{
- if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 3)) {
-
- if (XdrvMailbox.data_len > 0) {
- MakeValidMqtt(0, XdrvMailbox.data);
- SettingsUpdateText(SET_MQTTPREFIX1 + XdrvMailbox.index -1,
- (SC_DEFAULT == Shortcut()) ? (1==XdrvMailbox.index) ? SUB_PREFIX : (2==XdrvMailbox.index) ? PUB_PREFIX : PUB_PREFIX2 : XdrvMailbox.data);
- restart_flag = 2;
+ if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_MQTT_PREFIXES)) {
+ if (!XdrvMailbox.usridx) {
+ ResponseCmndAll(SET_MQTTPREFIX1, MAX_MQTT_PREFIXES);
+ } else {
+ if (XdrvMailbox.data_len > 0) {
+ MakeValidMqtt(0, XdrvMailbox.data);
+ SettingsUpdateText(SET_MQTTPREFIX1 + XdrvMailbox.index -1,
+ (SC_DEFAULT == Shortcut()) ? (1==XdrvMailbox.index) ? SUB_PREFIX : (2==XdrvMailbox.index) ? PUB_PREFIX : PUB_PREFIX2 : XdrvMailbox.data);
+ restart_flag = 2;
+ }
+ ResponseCmndIdxChar(SettingsText(SET_MQTTPREFIX1 + XdrvMailbox.index -1));
}
- ResponseCmndIdxChar(SettingsText(SET_MQTTPREFIX1 + XdrvMailbox.index -1));
}
}
void CmndPublish(void)
{
if (XdrvMailbox.data_len > 0) {
- char *mqtt_part = strtok(XdrvMailbox.data, " ");
+ char *payload_part;
+ char *mqtt_part = strtok_r(XdrvMailbox.data, " ", &payload_part);
if (mqtt_part) {
char stemp1[TOPSZ];
strlcpy(stemp1, mqtt_part, sizeof(stemp1));
- mqtt_part = strtok(nullptr, " ");
- if (mqtt_part) {
- strlcpy(mqtt_data, mqtt_part, sizeof(mqtt_data));
+ if ((payload_part != nullptr) && strlen(payload_part)) {
+ strlcpy(mqtt_data, payload_part, sizeof(mqtt_data));
} else {
mqtt_data[0] = '\0';
}
- MqttPublishDirect(stemp1, (XdrvMailbox.index == 2));
+ MqttPublish(stemp1, (XdrvMailbox.index == 2));
// ResponseCmndDone();
mqtt_data[0] = '\0';
}
@@ -862,13 +881,26 @@ void CmndPublish(void)
void CmndGroupTopic(void)
{
+#ifdef USE_DEVICE_GROUPS
+ if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 4)) {
+ uint32_t settings_text_index = (XdrvMailbox.index <= 1 ? SET_MQTT_GRP_TOPIC : SET_MQTT_GRP_TOPIC2 + XdrvMailbox.index - 2);
+#endif // USE_DEVICE_GROUPS
if (XdrvMailbox.data_len > 0) {
MakeValidMqtt(0, XdrvMailbox.data);
if (!strcmp(XdrvMailbox.data, mqtt_client)) { SetShortcutDefault(); }
+#ifdef USE_DEVICE_GROUPS
+ SettingsUpdateText(settings_text_index, (SC_DEFAULT == Shortcut()) ? MQTT_GRPTOPIC : XdrvMailbox.data);
+#else // USE_DEVICE_GROUPS
SettingsUpdateText(SET_MQTT_GRP_TOPIC, (SC_DEFAULT == Shortcut()) ? MQTT_GRPTOPIC : XdrvMailbox.data);
+#endif // USE_DEVICE_GROUPS
restart_flag = 2;
}
+#ifdef USE_DEVICE_GROUPS
+ ResponseCmndChar(SettingsText(settings_text_index));
+ }
+#else // USE_DEVICE_GROUPS
ResponseCmndChar(SettingsText(SET_MQTT_GRP_TOPIC));
+#endif // USE_DEVICE_GROUPS
}
void CmndTopic(void)
@@ -979,8 +1011,10 @@ void CmndSensorRetain(void)
\*********************************************************************************************/
#if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT)
-const static uint16_t tls_spi_start_sector = SPIFFS_END + 4; // 0xXXFF
-const static uint8_t* tls_spi_start = (uint8_t*) ((tls_spi_start_sector * SPI_FLASH_SEC_SIZE) + 0x40200000); // 0x40XFF000
+// const static uint16_t tls_spi_start_sector = SPIFFS_END + 4; // 0xXXFF
+// const static uint8_t* tls_spi_start = (uint8_t*) ((tls_spi_start_sector * SPI_FLASH_SEC_SIZE) + 0x40200000); // 0x40XFF000
+const static uint16_t tls_spi_start_sector = 0xFF; // Force last bank of first MB
+const static uint8_t* tls_spi_start = (uint8_t*) 0x402FF000; // 0x402FF000
const static size_t tls_spi_len = 0x1000; // 4kb blocs
const static size_t tls_block_offset = 0x0400;
const static size_t tls_block_len = 0x0400; // 1kb
@@ -1137,8 +1171,12 @@ void CmndTlsDump(void) {
uint32_t start = (uint32_t)tls_spi_start + tls_block_offset;
uint32_t end = start + tls_block_len -1;
for (uint32_t pos = start; pos < end; pos += 0x10) {
- uint32_t* values = (uint32_t*)(pos);
- Serial.printf_P(PSTR("%08x: %08x %08x %08x %08x\n"), pos, bswap32(values[0]), bswap32(values[1]), bswap32(values[2]), bswap32(values[3]));
+ uint32_t* values = (uint32_t*)(pos);
+#ifdef ARDUINO_ESP8266_RELEASE_2_3_0
+ Serial.printf("%08x: %08x %08x %08x %08x\n", pos, bswap32(values[0]), bswap32(values[1]), bswap32(values[2]), bswap32(values[3]));
+#else
+ Serial.printf_P(PSTR("%08x: %08x %08x %08x %08x\n"), pos, bswap32(values[0]), bswap32(values[1]), bswap32(values[2]), bswap32(values[3]));
+#endif
}
}
#endif // DEBUG_DUMP_TLS
diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino
index 6d8be5c2b..bb74b991d 100644
--- a/tasmota/xdrv_03_energy.ino
+++ b/tasmota/xdrv_03_energy.ino
@@ -1,7 +1,7 @@
/*
xdrv_03_energy.ino - Energy sensor support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -289,14 +289,19 @@ void EnergyMarginCheck(void)
if (Settings.energy_power_delta) {
uint16_t delta = abs(Energy.power_history[0] - energy_power_u);
- uint16_t min_power = (Energy.power_history[0] > energy_power_u) ? energy_power_u : Energy.power_history[0];
-
- DEBUG_DRIVER_LOG(PSTR("NRG: Delta %d, Power %d"), delta, min_power);
-
- if ((delta > 0) && (min_power > 0)) { // Fix divide by 0 exception (#6741)
- if (((Settings.energy_power_delta < 101) && (((delta * 100) / min_power) > Settings.energy_power_delta)) || // 1..100 = Percentage
- ((Settings.energy_power_delta > 100) && (delta > (Settings.energy_power_delta -100)))) { // 101..32000 = Absolute
- Energy.power_delta = true;
+ if (delta > 0) {
+ if (Settings.energy_power_delta < 101) { // 1..100 = Percentage
+ uint16_t min_power = (Energy.power_history[0] > energy_power_u) ? energy_power_u : Energy.power_history[0];
+ if (0 == min_power) { min_power++; } // Fix divide by 0 exception (#6741)
+ if (((delta * 100) / min_power) > Settings.energy_power_delta) {
+ Energy.power_delta = true;
+ }
+ } else { // 101..32000 = Absolute
+ if (delta > (Settings.energy_power_delta -100)) {
+ Energy.power_delta = true;
+ }
+ }
+ if (Energy.power_delta) {
Energy.power_history[1] = Energy.active_power[0]; // We only want one report so reset history
Energy.power_history[2] = Energy.active_power[0];
}
@@ -360,7 +365,7 @@ void EnergyMarginCheck(void)
EnergyMqttShow();
SetAllPower(POWER_ALL_OFF, SRC_MAXPOWER);
if (!Energy.mplr_counter) {
- Energy.mplr_counter = Settings.param[P_MAX_POWER_RETRY] +1;
+ Energy.mplr_counter = Settings.param[P_MAX_POWER_RETRY] +1; // SetOption33 - Max Power Retry count
}
Energy.mplw_counter = Settings.energy_max_power_limit_window;
}
@@ -385,6 +390,7 @@ void EnergyMarginCheck(void)
ResponseTime_P(PSTR(",\"" D_JSON_MAXPOWERREACHEDRETRY "\":\"%s\"}"), GetStateText(0));
MqttPublishPrefixTopic_P(STAT, S_RSLT_WARNING);
EnergyMqttShow();
+ SetAllPower(POWER_ALL_OFF, SRC_MAXPOWER);
}
}
}
@@ -517,26 +523,19 @@ void CmndEnergyReset(void)
}
}
else if ((XdrvMailbox.index > 3) && (XdrvMailbox.index <= 5)) {
- char *p;
- char *str = strtok_r(XdrvMailbox.data, ", ", &p);
- int32_t position = -1;
- uint32_t values[2];
-
- while ((str != nullptr) && (position < 1)) {
- uint32_t value = strtoul(str, nullptr, 10);
- position++;
- values[position] = value *100;
- str = strtok_r(nullptr, ", ", &p);
- }
+ uint32_t values[2] = { 0 };
+ uint32_t position = ParseParameters(2, values);
+ values[0] *= 100;
+ values[1] *= 100;
switch (XdrvMailbox.index)
{
case 4:
// Reset energy_usage.usage totals
- if (position > -1) {
+ if (position > 0) {
RtcSettings.energy_usage.usage1_kWhtotal = values[0];
}
- if (position > 0) {
+ if (position > 1) {
RtcSettings.energy_usage.usage2_kWhtotal = values[1];
}
Settings.energy_usage.usage1_kWhtotal = RtcSettings.energy_usage.usage1_kWhtotal;
@@ -544,10 +543,10 @@ void CmndEnergyReset(void)
break;
case 5:
// Reset energy_usage.return totals
- if (position > -1) {
+ if (position > 0) {
RtcSettings.energy_usage.return1_kWhtotal = values[0];
}
- if (position > 0) {
+ if (position > 1) {
RtcSettings.energy_usage.return2_kWhtotal = values[1];
}
Settings.energy_usage.return1_kWhtotal = RtcSettings.energy_usage.return1_kWhtotal;
@@ -1062,15 +1061,12 @@ void EnergyShow(bool json)
#ifdef USE_WEBSERVER
} else {
if (Energy.voltage_available) {
- WSContentSend_PD(PSTR("{s}" D_VOLTAGE "{m}%s " D_UNIT_VOLT "{e}"),
- EnergyFormat(value_chr, voltage_chr[0], json, Energy.voltage_common));
+ WSContentSend_PD(HTTP_SNS_VOLTAGE, EnergyFormat(value_chr, voltage_chr[0], json, Energy.voltage_common));
}
if (Energy.current_available) {
- WSContentSend_PD(PSTR("{s}" D_CURRENT "{m}%s " D_UNIT_AMPERE "{e}"),
- EnergyFormat(value_chr, current_chr[0], json));
+ WSContentSend_PD(HTTP_SNS_CURRENT, EnergyFormat(value_chr, current_chr[0], json));
}
- WSContentSend_PD(PSTR("{s}" D_POWERUSAGE "{m}%s " D_UNIT_WATT "{e}"),
- EnergyFormat(value_chr, active_power_chr[0], json));
+ WSContentSend_PD(HTTP_SNS_POWER, EnergyFormat(value_chr, active_power_chr[0], json));
if (!Energy.type_dc) {
if (Energy.current_available && Energy.voltage_available) {
WSContentSend_PD(HTTP_ENERGY_SNS1, EnergyFormat(value_chr, apparent_power_chr[0], json),
diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino
index d6e71ab08..6b72da9b2 100644
--- a/tasmota/xdrv_04_light.ino
+++ b/tasmota/xdrv_04_light.ino
@@ -1,7 +1,7 @@
/*
xdrv_04_light.ino - PWM, WS2812 and sonoff led support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -79,6 +79,7 @@
* .b For white bulbs with Cold/Warm colortone, use changeCW() or changeCT()
* to change color-tone. Set overall brightness separately.
* Color-tone temperature can range from 153 (Cold) to 500 (Warm).
+ * SetOption82 can expand the rendering from 200-380 due to Alexa reduced range.
* CW channels are stored at full brightness to avoid rounding errors.
* .c Alternatively, you can set all 5 channels at once with changeChannels(),
* in this case it will also set the corresponding brightness.
@@ -112,12 +113,11 @@
* to adjust leds with different power
* .g If rgbwwTable[4] is zero, blend RGB with White and adjust the level of
* White channel according to rgbwwTable[3]
- * .h Avoid PMW values between 1008 and 1022, issue #1146
- * .i Scale ranges from 10 bits to 0..PWMRange (by default 1023) so no change
+ * .h Scale ranges from 10 bits to 0..PWMRange (by default 1023) so no change
* by default.
- * .j Apply port remapping from Option37
- * .k Invert PWM value if port is of type PMWxi instead of PMWx
- * .l Apply PWM value with analogWrite() - if pin is configured
+ * .i Apply port remapping from Option37
+ * .j Invert PWM value if port is of type PMWxi instead of PMWx
+ * .k Apply PWM value with analogWrite() - if pin is configured
*
\*********************************************************************************************/
@@ -161,73 +161,89 @@ struct LCwColor {
const uint8_t MAX_FIXED_COLD_WARM = 4;
const LCwColor kFixedColdWarm[MAX_FIXED_COLD_WARM] PROGMEM = { 0,0, 255,0, 0,255, 128,128 };
-// New version of Gamma correction table, with adaptative resolution
-// from 11 bits (lower values) to 8 bits (upper values).
-// We're using the fact that lower values are small and can fit within 8 bits
-// To save flash space, the array is only 8 bits uint
-#ifdef XFUNC_PTR_IN_ROM
-const uint8_t _ledTable[] PROGMEM = {
-#else
-const uint8_t _ledTable[] = {
-#endif
- // 11 bits resolution
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, // 11 bits, 0..2047
- 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, // 11 bits, 0..2047
- 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, // 11 bits, 0..2047
- 20, 21, 22, 24, 25, 26, 28, 29, 30, 32, 33, 35, 37, 38, 40, 42, // 11 bits, 0..2047
- // 10 bits resolution
- 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 36, 37, 38, 39, // 10 bits, 0..1023
- 41, 42, 44, 45, 47, 48, 50, 51, 53, 55, 56, 58, 60, 62, 64, 65, // 10 bits, 0..1023
- 67, 69, 71, 73, 75, 78, 80, 82, 84, 86, 89, 91, 93, 96, 98,101, // 10 bits, 0..1023
- 103,106,108,111,114,116,119,122,125,128,131,134,137,140,143,146, // 10 bits, 0..1023
- // 9 bits resolution
- 75, 77, 78, 80, 82, 84, 85, 87, 89, 91, 93, 94, 96, 98,100,102, // 9 bits, 0..511
- 104,106,108,110,112,115,117,119,121,123,125,128,130,132,135,137, // 9 bits, 0..511
- 140,142,144,147,149,152,155,157,160,163,165,168,171,173,176,179, // 9 bits, 0..511
- 182,185,188,191,194,197,200,203,206,209,212,215,219,222,225,229, // 9 bits, 0..511
- // 8 bits resolution
- 116,118,120,121,123,125,127,128,130,132,134,136,138,139,141,143, // 8 bits, 0..255
- 145,147,149,151,153,155,157,159,161,163,165,168,170,172,174,176, // 8 bits, 0..255
- 178,181,183,185,187,190,192,194,197,199,201,204,206,209,211,214, // 8 bits, 0..255
- 216,219,221,224,226,229,232,234,237,240,242,245,248,250,253,255 // 8 bits, 0..255
+// CT min and max
+const uint16_t CT_MIN = 153; // 6500K
+const uint16_t CT_MAX = 500; // 2000K
+// Ranges used for Alexa
+const uint16_t CT_MIN_ALEXA = 200; // also 5000K
+const uint16_t CT_MAX_ALEXA = 380; // also 2600K
+
+// New version of Gamma correction compute
+// Instead of a table, we do a multi-linear approximation, which is close enough
+// At low levels, the slope is a bit higher than actual gamma, to make changes smoother
+// Internal resolution is 10 bits.
+
+typedef struct gamma_table_t {
+ uint16_t to_src;
+ uint16_t to_gamma;
+} gamma_table_t;
+
+const gamma_table_t gamma_table[] = { // don't put in PROGMEM for performance reasons
+ { 1, 1 },
+ { 4, 1 },
+ { 209, 13 },
+ { 312, 41 },
+ { 457, 106 },
+ { 626, 261 },
+ { 762, 450 },
+ { 895, 703 },
+ { 1023, 1023 },
+ { 0xFFFF, 0xFFFF } // fail-safe if out of range
+};
+
+// simplified Gamma table for Fade, cheating a little at low brightness
+const gamma_table_t gamma_table_fast[] = {
+ { 384, 192 },
+ { 768, 576 },
+ { 1023, 1023 },
+ { 0xFFFF, 0xFFFF } // fail-safe if out of range
};
// For reference, below are the computed gamma tables, via ledGamma()
// for 8 bits output:
-// 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-// 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
-// 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6,
-// 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10,
-// 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17,
-// 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26,
-// 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37,
-// 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51,
-// 52, 53, 54, 55, 56, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 69,
-// 70, 71, 72, 74, 75, 76, 78, 79, 80, 82, 83, 84, 86, 87, 88, 90,
-// 91, 93, 94, 96, 97, 99,100,102,103,105,106,108,110,111,113,115,
-//116,118,120,121,123,125,127,128,130,132,134,136,138,139,141,143,
-//145,147,149,151,153,155,157,159,161,163,165,168,170,172,174,176,
-//178,181,183,185,187,190,192,194,197,199,201,204,206,209,211,214,
-//216,219,221,224,226,229,232,234,237,240,242,245,248,250,253,255
+// 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+// 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
+// 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
+// 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6,
+// 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11,
+// 11, 12, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18,
+// 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25,
+// 25, 26, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38,
+// 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53,
+// 54, 55, 56, 57, 58, 59, 60, 61, 61, 62, 63, 64, 65, 67, 68, 69,
+// 71, 72, 73, 75, 76, 78, 79, 80, 82, 83, 85, 86, 87, 89, 90, 91,
+// 93, 94, 95, 97, 98,100,101,102,104,105,107,108,109,111,112,114,
+// 116,118,120,122,124,125,127,129,131,133,135,137,139,141,143,144,
+// 146,148,150,152,154,156,158,160,162,164,166,168,170,171,173,175,
+// 178,180,183,185,188,190,193,195,198,200,203,205,208,210,213,215,
+// 218,220,223,225,228,230,233,235,238,240,243,245,248,250,253,255
//
// and for 10 bits output:
-// 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-// 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4,
-// 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10,
-// 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 17, 18, 19, 19, 20, 21,
-// 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 36, 37, 38, 39,
-// 41, 42, 44, 45, 47, 48, 50, 51, 53, 55, 56, 58, 60, 62, 64, 65,
-// 67, 69, 71, 73, 75, 78, 80, 82, 84, 86, 89, 91, 93, 96, 98,101,
-//103,106,108,111,114,116,119,122,125,128,131,134,137,140,143,146,
-//151,155,157,161,165,169,171,175,179,183,187,189,193,197,201,205,
-//209,213,217,221,225,231,235,239,243,247,251,257,261,265,271,275,
-//281,285,289,295,299,305,311,315,321,327,331,337,343,347,353,359,
-//365,371,377,383,389,395,401,407,413,419,425,431,439,445,451,459,
-//467,475,483,487,495,503,511,515,523,531,539,547,555,559,567,575,
-//583,591,599,607,615,623,631,639,647,655,663,675,683,691,699,707,
-//715,727,735,743,751,763,771,779,791,799,807,819,827,839,847,859,
-//867,879,887,899,907,919,931,939,951,963,971,983,995,1003,1015,1023
+// 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4,
+// 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8,
+// 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12,
+// 12, 12, 13, 13, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25,
+// 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43,
+// 45, 47, 49, 50, 52, 54, 56, 58, 59, 61, 63, 65, 67, 68, 70, 72,
+// 74, 76, 77, 79, 81, 83, 84, 86, 88, 90, 92, 93, 95, 97, 99, 101,
+// 102, 104, 106, 110, 113, 117, 121, 124, 128, 132, 135, 139, 143, 146, 150, 154,
+// 158, 162, 166, 169, 173, 177, 180, 184, 188, 191, 195, 199, 202, 206, 210, 213,
+// 217, 221, 224, 228, 232, 235, 239, 243, 246, 250, 254, 257, 261, 267, 272, 278,
+// 283, 289, 294, 300, 305, 311, 317, 322, 328, 333, 339, 344, 350, 356, 361, 367,
+// 372, 378, 383, 389, 394, 400, 406, 411, 417, 422, 428, 433, 439, 444, 450, 458,
+// 465, 473, 480, 488, 496, 503, 511, 518, 526, 534, 541, 549, 557, 564, 572, 579,
+// 587, 595, 602, 610, 617, 627, 635, 642, 650, 657, 665, 673, 680, 688, 695, 703,
+// 713, 723, 733, 743, 753, 763, 773, 783, 793, 803, 813, 823, 833, 843, 853, 863,
+// 873, 883, 893, 903, 913, 923, 933, 943, 953, 963, 973, 983, 993,1003,1013,1023
+//
+// Output for Dimmer 0..100 values
+// 0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9,
+// 10, 10, 11, 12, 12, 13, 15, 17, 21, 23, 26, 28, 31, 34, 37,
+// 40, 43, 49, 52, 58, 61, 67, 70, 76, 79, 84, 90, 93, 99,102,
+// 110,117,128,135,146,158,166,177,184,195,202,213,221,232,239,
+// 250,261,272,289,300,317,328,344,356,372,389,400,417,428,444,
+// 458,480,496,518,534,557,579,595,617,635,657,673,695,713,743,
+// 773,793,823,843,873,893,923,943,973,993,1023
struct LIGHT {
uint32_t strip_timer_counter = 0; // Bars and Gradient
@@ -255,10 +271,8 @@ struct LIGHT {
bool update = true;
bool pwm_multi_channels = false; // SetOption68, treat each PWM channel as an independant dimmer
+ bool fade_initialized = false; // dont't fade at startup
bool fade_running = false;
- uint8_t fade_start_8[LST_MAX] = {0,0,0,0,0};
- uint8_t fade_cur_8[LST_MAX];
- uint8_t fade_end_8[LST_MAX]; // 8 bits resolution target channel values
uint16_t fade_start_10[LST_MAX] = {0,0,0,0,0};
uint16_t fade_cur_10[LST_MAX];
uint16_t fade_end_10[LST_MAX]; // 10 bits resolution target channel values
@@ -271,6 +285,16 @@ power_t LightPower(void)
return Light.power; // Make external
}
+// IRAM variant for rotary
+#ifndef ARDUINO_ESP8266_RELEASE_2_3_0 // Fix core 2.5.x ISR not in IRAM Exception
+power_t LightPowerIRAM(void) ICACHE_RAM_ATTR;
+#endif // ARDUINO_ESP8266_RELEASE_2_3_0
+
+power_t LightPowerIRAM(void)
+{
+ return Light.power; // Make external
+}
+
uint8_t LightDevice(void)
{
return Light.device; // Make external
@@ -328,12 +352,19 @@ class LightStateClass {
uint8_t _b = 255; // 0..255
uint8_t _subtype = 0; // local copy of Light.subtype, if we need multiple lights
- uint16_t _ct = 153; // 153..500, default to 153 (cold white)
+ uint16_t _ct = CT_MIN; // 153..500, default to 153 (cold white)
uint8_t _wc = 255; // white cold channel
uint8_t _ww = 0; // white warm channel
uint8_t _briCT = 255;
uint8_t _color_mode = LCM_RGB; // RGB by default
+ // the CT range below represents the rendered range,
+ // This is due to Alexa whose CT range is 199..383
+ // Hence setting Min=200 and Max=380 makes Alexa use the full range
+ // Please note that you can still set CT to 153..500, but any
+ // value below _ct_min_range or above _ct_max_range not change the CT
+ uint16_t _ct_min_range = CT_MIN; // the minimum CT rendered range
+ uint16_t _ct_max_range = CT_MAX; // the maximum CT rendered range
public:
LightStateClass() {
@@ -351,7 +382,7 @@ class LightStateClass {
// LST_COLDWARM: LCM_CT
// LST_RGB: LCM_RGB
// LST_RGBW: LCM_RGB, LCM_CT or LCM_BOTH
- // LST_RGBWC: LCM_RGB, LCM_CT or LCM_BOTH
+ // LST_RGBCW: LCM_RGB, LCM_CT or LCM_BOTH
uint8_t setColorMode(uint8_t cm) {
uint8_t prev_cm = _color_mode;
if (cm < LCM_RGB) { cm = LCM_RGB; }
@@ -371,7 +402,7 @@ class LightStateClass {
break;
case LST_RGBW:
- case LST_RGBWC:
+ case LST_RGBCW:
_color_mode = cm;
break;
}
@@ -482,8 +513,23 @@ class LightStateClass {
return BriToDimmer(bri);
}
- inline uint16_t getCT() {
- return _ct; // 153..500
+ inline uint16_t getCT() const {
+ return _ct; // 153..500, or CT_MIN..CT_MAX
+ }
+
+ // get the CT value within the range into a 10 bits 0..1023 value
+ uint16_t getCT10bits() const {
+ return changeUIntScale(_ct, _ct_min_range, _ct_max_range, 0, 1023);
+ }
+
+ inline void setCTRange(uint16_t ct_min_range, uint16_t ct_max_range) {
+ _ct_min_range = ct_min_range;
+ _ct_max_range = ct_max_range;
+ }
+
+ inline void getCTRange(uint16_t *ct_min_range, uint16_t *ct_max_range) const {
+ if (ct_min_range) { *ct_min_range = _ct_min_range; }
+ if (ct_max_range) { *ct_max_range = _ct_max_range; }
}
// get current color in XY format
@@ -499,6 +545,9 @@ class LightStateClass {
#ifdef DEBUG_LIGHT
AddLog_P2(LOG_LEVEL_DEBUG_MORE, "LightStateClass::setBri RGB raw (%d %d %d) HS (%d %d) bri (%d)", _r, _g, _b, _hue, _sat, _briRGB);
#endif
+#ifdef USE_PWM_DIMMER
+ if (PWM_DIMMER == my_module_type) PWMDimmerSetBrightnessLeds(0);
+#endif // USE_PWM_DIMMER
}
// changes the RGB brightness alone
@@ -530,8 +579,8 @@ class LightStateClass {
// disable ct mode
setColorMode(LCM_RGB); // try deactivating CT mode, setColorMode() will check which is legal
} else {
- ct = (ct < 153 ? 153 : (ct > 500 ? 500 : ct));
- _ww = changeUIntScale(ct, 153, 500, 0, 255);
+ ct = (ct < CT_MIN ? CT_MIN : (ct > CT_MAX ? CT_MAX : ct));
+ _ww = changeUIntScale(ct, _ct_min_range, _ct_max_range, 0, 255);
_wc = 255 - _ww;
_ct = ct;
addCTMode();
@@ -571,7 +620,7 @@ class LightStateClass {
_ww = changeUIntScale(w, 0, max, 0, 255);
_wc = changeUIntScale(c, 0, max, 0, 255);
}
- _ct = changeUIntScale(w, 0, sum, 153, 500);
+ _ct = changeUIntScale(w, 0, sum, _ct_min_range, _ct_max_range);
addCTMode(); // activate CT mode if needed
if (_color_mode & LCM_CT) { _briCT = free_range ? max : (sum > 255 ? 255 : sum); }
}
@@ -844,6 +893,15 @@ public:
return prev;
}
+ void setAlexaCTRange(bool alexa_ct_range) {
+ // depending on SetOption82, full or limited CT range
+ if (alexa_ct_range) {
+ _state->setCTRange(CT_MIN_ALEXA, CT_MAX_ALEXA); // 200..380
+ } else {
+ _state->setCTRange(CT_MIN, CT_MAX); // 153..500
+ }
+ }
+
inline bool isCTRGBLinked() {
return _ct_rgb_linked;
}
@@ -910,8 +968,8 @@ public:
void changeCTB(uint16_t new_ct, uint8_t briCT) {
/* Color Temperature (https://developers.meethue.com/documentation/core-concepts)
*
- * ct = 153 = 2000K = Warm = CCWW = 00FF
- * ct = 500 = 6500K = Cold = CCWW = FF00
+ * ct = 153 = 6500K = Cold = CCWW = FF00
+ * ct = 500 = 2000K = Warm = CCWW = 00FF
*/
// don't set CT if not supported
if ((LST_COLDWARM != Light.subtype) && (LST_RGBW > Light.subtype)) {
@@ -930,9 +988,11 @@ public:
switch (mode) {
case 1:
changeBriRGB(bri);
+ if (_ct_rgb_linked) { _state->setColorMode(LCM_RGB); } // try to force CT
break;
case 2:
changeBriCT(bri);
+ if (_ct_rgb_linked) { _state->setColorMode(LCM_CT); } // try to force CT
break;
default:
changeBri(bri);
@@ -994,8 +1054,8 @@ public:
current_color[1] = w;
break;
case LST_RGBW:
- case LST_RGBWC:
- if (LST_RGBWC == Light.subtype) {
+ case LST_RGBCW:
+ if (LST_RGBCW == Light.subtype) {
current_color[3] = c;
current_color[4] = w;
} else {
@@ -1072,36 +1132,64 @@ public:
LightStateClass light_state = LightStateClass();
LightControllerClass light_controller = LightControllerClass(light_state);
+/*********************************************************************************************\
+ * Change scales from 8 bits to 10 bits and vice versa
+\*********************************************************************************************/
+// 8 to 10 to 8 is garanteed to give the same result
+uint16_t change8to10(uint8_t v) {
+ return changeUIntScale(v, 0, 255, 0, 1023);
+}
+// change from 10 bits to 8 bits, but any non-zero input will be non-zero
+uint8_t change10to8(uint16_t v) {
+ return (0 == v) ? 0 : changeUIntScale(v, 4, 1023, 1, 255);
+}
+
/*********************************************************************************************\
* Gamma correction
\*********************************************************************************************/
// Calculate the gamma corrected value for LEDS
-// You can request 11, 10, 9 or 8 bits resolution via 'bits_out' parameter
-uint16_t ledGamma(uint8_t v, uint16_t bits_out = 8) {
- uint16_t result;
- // bits_resolution: the resolution of _ledTable[v], between 8 and 11
- uint32_t bits_resolution = 11 - (v / 64); // 8..11
- int32_t bits_correction = bits_out - bits_resolution; // -3..3
-#ifdef XFUNC_PTR_IN_ROM
- uint32_t uncorrected_value = pgm_read_byte(_ledTable + v); // 0..255
-#else
- uint32_t uncorrected_value = _ledTable[v]; // 0..255
-#endif
- if (0 == bits_correction) {
- // we already match the required resolution, no change
- result = uncorrected_value;
- } else if (bits_correction > 0) {
- // the output resolution is higher than our value, we need to extrapolate
- // we shift by bits_correction, and force last bits to 1
- uint32_t bits_mask = (1 << bits_correction) - 1; // 1, 3, 7
- result = (uncorrected_value << bits_correction) | bits_mask;
- } else { // bits_correction < 0
- // our resolution is too high, we need to remove bits
- // we add 1, 3 or 7 to force rouding to the nearest high value
- uint32_t bits_mask = (1 << -bits_correction) - 1; // 1, 3, 7
- result = ((uncorrected_value + bits_mask) >> -bits_correction);
+uint16_t ledGamma_internal(uint16_t v, const struct gamma_table_t *gt_ptr) {
+ uint16_t from_src = 0;
+ uint16_t from_gamma = 0;
+
+ for (const gamma_table_t *gt = gt_ptr; ; gt++) {
+ uint16_t to_src = gt->to_src;
+ uint16_t to_gamma = gt->to_gamma;
+ if (v <= to_src) {
+ return changeUIntScale(v, from_src, to_src, from_gamma, to_gamma);
+ }
+ from_src = to_src;
+ from_gamma = to_gamma;
}
- return result;
+}
+// Calculate the reverse gamma value for LEDS
+uint16_t ledGammaReverse_internal(uint16_t vg, const struct gamma_table_t *gt_ptr) {
+ uint16_t from_src = 0;
+ uint16_t from_gamma = 0;
+
+ for (const gamma_table_t *gt = gt_ptr; ; gt++) {
+ uint16_t to_src = gt->to_src;
+ uint16_t to_gamma = gt->to_gamma;
+ if (vg <= to_gamma) {
+ return changeUIntScale(vg, from_gamma, to_gamma, from_src, to_src);
+ }
+ from_src = to_src;
+ from_gamma = to_gamma;
+ }
+}
+
+// 10 bits in, 10 bits out
+uint16_t ledGamma10_10(uint16_t v) {
+ return ledGamma_internal(v, gamma_table);
+}
+// 10 bits resolution, 8 bits in
+uint16_t ledGamma10(uint8_t v) {
+ return ledGamma10_10(change8to10(v));
+}
+
+// Legacy function
+uint8_t ledGamma(uint8_t v) {
+ return change10to8(ledGamma10(v));
}
/********************************************************************************************/
@@ -1189,6 +1277,7 @@ void LightInit(void)
light_controller.setSubType(Light.subtype);
light_controller.loadSettings();
+ light_controller.setAlexaCTRange(Settings.flag4.alexa_ct_range);
if (LST_SINGLE == Light.subtype) {
Settings.light_color[0] = 255; // One channel only supports Dimmer but needs max color
@@ -1250,11 +1339,15 @@ void LightUpdateColorMapping(void)
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("%d colors: %d %d %d %d %d") ,Settings.param[P_RGB_REMAP], Light.color_remap[0],Light.color_remap[1],Light.color_remap[2],Light.color_remap[3],Light.color_remap[4]);
}
+uint8_t LightGetDimmer(uint8_t dimmer) {
+ return light_state.getDimmer(dimmer);
+}
+
void LightSetDimmer(uint8_t dimmer) {
light_controller.changeDimmer(dimmer);
}
-uint32_t LightGetHSB(uint16_t *hue,uint8_t *sat, uint8_t *bri) {
+void LightGetHSB(uint16_t *hue, uint8_t *sat, uint8_t *bri) {
light_state.getHSB(hue, sat, bri);
}
@@ -1307,11 +1400,11 @@ void LightSetColorTemp(uint16_t ct)
{
/* Color Temperature (https://developers.meethue.com/documentation/core-concepts)
*
- * ct = 153 = 2000K = Warm = CCWW = 00FF
- * ct = 500 = 6500K = Cold = CCWW = FF00
+ * ct = 153 = 6500K = Cold = CCWW = FF00
+ * ct = 600 = 2000K = Warm = CCWW = 00FF
*/
// don't set CT if not supported
- if ((LST_COLDWARM != Light.subtype) && (LST_RGBWC != Light.subtype)) {
+ if ((LST_COLDWARM != Light.subtype) && (LST_RGBCW != Light.subtype)) {
return;
}
light_controller.changeCTB(ct, light_state.getBriCT());
@@ -1320,7 +1413,7 @@ void LightSetColorTemp(uint16_t ct)
uint16_t LightGetColorTemp(void)
{
// don't calculate CT for unsupported devices
- if ((LST_COLDWARM != Light.subtype) && (LST_RGBWC != Light.subtype)) {
+ if ((LST_COLDWARM != Light.subtype) && (LST_RGBCW != Light.subtype)) {
return 0;
}
return (light_state.getColorMode() & LCM_CT) ? light_state.getCT() : 0;
@@ -1391,13 +1484,23 @@ void LightState(uint8_t append)
if (Light.subtype > LST_SINGLE) {
ResponseAppend_P(PSTR(",\"" D_CMND_COLOR "\":\"%s\""), LightGetColor(scolor));
- uint16_t hue;
- uint8_t sat, bri;
- light_state.getHSB(&hue, &sat, &bri);
- sat = changeUIntScale(sat, 0, 255, 0, 100);
- bri = changeUIntScale(bri, 0, 255, 0, 100);
+ if (LST_RGB <= Light.subtype) {
+ uint16_t hue;
+ uint8_t sat, bri;
+ light_state.getHSB(&hue, &sat, &bri);
+ sat = changeUIntScale(sat, 0, 255, 0, 100);
+ bri = changeUIntScale(bri, 0, 255, 0, 100);
- ResponseAppend_P(PSTR(",\"" D_CMND_HSBCOLOR "\":\"%d,%d,%d\""), hue,sat,bri);
+ ResponseAppend_P(PSTR(",\"" D_CMND_HSBCOLOR "\":\"%d,%d,%d\""), hue,sat,bri);
+ }
+ // Add White level
+ if ((LST_COLDWARM == Light.subtype) || (LST_RGBW <= Light.subtype)) {
+ ResponseAppend_P(PSTR(",\"" D_CMND_WHITE "\":%d"), light_state.getDimmer(2));
+ }
+ // Add CT
+ if ((LST_COLDWARM == Light.subtype) || (LST_RGBCW == Light.subtype)) {
+ ResponseAppend_P(PSTR(",\"" D_CMND_COLORTEMPERATURE "\":%d"), light_state.getCT());
+ }
// Add status for each channel
ResponseAppend_P(PSTR(",\"" D_CMND_CHANNEL "\":[" ));
for (uint32_t i = 0; i < Light.subtype; i++) {
@@ -1409,9 +1512,6 @@ void LightState(uint8_t append)
}
ResponseAppend_P(PSTR("]"));
}
- if ((LST_COLDWARM == Light.subtype) || (LST_RGBWC == Light.subtype)) {
- ResponseAppend_P(PSTR(",\"" D_CMND_COLORTEMPERATURE "\":%d"), light_state.getCT());
- }
if (append) {
if (Light.subtype >= LST_RGB) {
@@ -1519,13 +1619,21 @@ void LightCycleColor(int8_t direction)
if (0 == direction) {
if (Light.random == Light.wheel) {
Light.random = random(255);
+
+ uint8_t my_dir = (Light.random < Light.wheel -128) ? 1 :
+ (Light.random < Light.wheel ) ? 0 :
+ (Light.random > Light.wheel +128) ? 0 : 1; // Increment or Decrement and roll-over
+ Light.random = (Light.random & 0xFE) | my_dir;
+
+// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("LGT: random %d"), Light.random);
}
- direction = (Light.random < Light.wheel) ? -1 : 1;
+// direction = (Light.random < Light.wheel) ? -1 : 1;
+ direction = (Light.random &0x01) ? 1 : -1;
}
Light.wheel += direction;
uint16_t hue = changeUIntScale(Light.wheel, 0, 255, 0, 359); // Scale to hue to keep amount of steps low (max 255 instead of 359)
-// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DBG: random %d, wheel %d, hue %d"), Light.random, Light.wheel, hue);
+// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("LGT: random %d, wheel %d, hue %d"), Light.random, Light.wheel, hue);
uint8_t sat;
light_state.getHSB(nullptr, &sat, nullptr); // Allow user control over Saturation
@@ -1569,10 +1677,11 @@ void LightSetPower(void)
// Light.power tells which lights or channels (SetOption68) are on/off
void LightAnimate(void)
{
- uint8_t cur_col[LST_MAX];
uint16_t light_still_on = 0;
bool power_off = false;
+ // make sure we update CT range in case SetOption82 was changed
+ light_controller.setAlexaCTRange(Settings.flag4.alexa_ct_range);
Light.strip_timer_counter++;
// set sleep parameter: either settings,
@@ -1617,8 +1726,16 @@ void LightAnimate(void)
Light.new_color[i] = Light.current_color[i];
}
} else {
+/*
Response_P(PSTR("{\"" D_CMND_WAKEUP "\":\"" D_JSON_DONE "\"}"));
MqttPublishPrefixTopic_P(TELE, PSTR(D_CMND_WAKEUP));
+*/
+ Response_P(PSTR("{\"" D_CMND_WAKEUP "\":\"" D_JSON_DONE "\""));
+ LightState(1);
+ ResponseJsonEnd();
+ MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_CMND_WAKEUP));
+ XdrvRulesProcess();
+
Light.wakeup_active = 0;
Settings.light_scheme = LS_POWER;
}
@@ -1653,90 +1770,87 @@ void LightAnimate(void)
Light.update = true;
}
if (Light.update) {
- uint16_t cur_col_10bits[LST_MAX]; // 10 bits version of cur_col for PWM
+#ifdef USE_DEVICE_GROUPS
+ if (Light.power) LightSendDeviceGroupStatus();
+#endif // USE_DEVICE_GROUPS
+
+ uint16_t cur_col_10[LST_MAX]; // 10 bits resolution
Light.update = false;
// first set 8 and 10 bits channels
for (uint32_t i = 0; i < LST_MAX; i++) {
- cur_col[i] = Light.last_color[i] = Light.new_color[i];
+ Light.last_color[i] = Light.new_color[i];
// Extend from 8 to 10 bits if no correction (in case no gamma correction is required)
- cur_col_10bits[i] = changeUIntScale(cur_col[i], 0, 255, 0, 1023);
+ cur_col_10[i] = change8to10(Light.new_color[i]);
}
if (Light.pwm_multi_channels) {
- calcGammaMultiChannels(cur_col, cur_col_10bits);
+ calcGammaMultiChannels(cur_col_10);
} else {
- calcGammaBulbs(cur_col, cur_col_10bits);
- if (PHILIPS == my_module_type) {
- calcGammaCTPwm(cur_col, cur_col_10bits);
- }
+ calcGammaBulbs(cur_col_10);
// Now see if we need to mix RGB and True White
- // Valid only for LST_RGBW, LST_RGBWC, rgbwwTable[4] is zero, and white is zero (see doc)
- if ((LST_RGBW <= Light.subtype) && (0 == Settings.rgbwwTable[4]) && (0 == cur_col[3]+cur_col[4])) {
- uint32_t min_rgb_10 = min3(cur_col_10bits[0], cur_col_10bits[1], cur_col_10bits[2]);
- uint8_t min_rgb = min3(cur_col[0], cur_col[1], cur_col[2]);
+ // Valid only for LST_RGBW, LST_RGBCW, rgbwwTable[4] is zero, and white is zero (see doc)
+ if ((LST_RGBW <= Light.subtype) && (0 == Settings.rgbwwTable[4]) && (0 == cur_col_10[3]+cur_col_10[4])) {
+ uint32_t min_rgb_10 = min3(cur_col_10[0], cur_col_10[1], cur_col_10[2]);
for (uint32_t i=0; i<3; i++) {
// substract white and adjust according to rgbwwTable
- uint32_t adjust10 = changeUIntScale(Settings.rgbwwTable[i], 0, 255, 0, 1023);
- cur_col_10bits[i] = changeUIntScale(cur_col_10bits[i] - min_rgb_10, 0, 1023, 0, adjust10);
- cur_col[i] = changeUIntScale(cur_col[i] - min_rgb, 0, 255, 0, Settings.rgbwwTable[i]);
+ uint32_t adjust10 = change8to10(Settings.rgbwwTable[i]);
+ cur_col_10[i] = changeUIntScale(cur_col_10[i] - min_rgb_10, 0, 1023, 0, adjust10);
}
+
// compute the adjusted white levels for 10 and 8 bits
- uint32_t white_10 = changeUIntScale(min_rgb_10, 0, 255, 0, Settings.rgbwwTable[3]); // set white power down corrected with rgbwwTable[3]
- uint32_t white = changeUIntScale(min_rgb, 0, 255, 0, Settings.rgbwwTable[3]); // set white power down corrected with rgbwwTable[3]
+ uint32_t adjust_w_10 = changeUIntScale(Settings.rgbwwTable[3], 0, 255, 0, 1023);
+ uint32_t white_10 = changeUIntScale(min_rgb_10, 0, 1023, 0, adjust_w_10); // set white power down corrected with rgbwwTable[3]
if (LST_RGBW == Light.subtype) {
// we simply set the white channel
- cur_col_10bits[3] = white_10;
- cur_col[3] = white;
- } else { // LST_RGBWC
+ cur_col_10[3] = white_10;
+ } else { // LST_RGBCW
// we distribute white between cold and warm according to CT value
- uint32_t ct = light_state.getCT();
- cur_col_10bits[4] = changeUIntScale(ct, 153, 500, 0, white_10);
- cur_col_10bits[3] = white_10 - cur_col_10bits[4];
- cur_col[4] = changeUIntScale(ct, 153, 500, 0, white);
- cur_col[3] = white - cur_col[4];
+ uint32_t ct = light_state.getCT10bits();
+ cur_col_10[4] = changeUIntScale(ct, 0, 1023, 0, white_10);
+ cur_col_10[3] = white_10 - cur_col_10[4];
}
}
}
+ // Apply RGBWWTable only if Settings.rgbwwTable[4] != 0
+ if (0 != Settings.rgbwwTable[4]) {
+ for (uint32_t i = 0; i 1008) && (cur_col_10bits[i] < 1023)) {
- cur_col_10bits[i] = 1008;
- }
-#endif
// scale from 0..1023 to 0..pwm_range, but keep any non-zero value to at least 1
- cur_col_10bits[i] = (cur_col_10bits[i] > 0) ? changeUIntScale(cur_col_10bits[i], 1, 1023, 1, Settings.pwm_range) : 0;
+ cur_col_10[i] = (cur_col_10[i] > 0) ? changeUIntScale(cur_col_10[i], 1, 1023, min, Settings.pwm_range) : 0;
}
// apply port remapping on both 8 bits and 10 bits versions
- uint8_t orig_col[LST_MAX];
uint16_t orig_col_10bits[LST_MAX];
- memcpy(orig_col, cur_col, sizeof(orig_col));
- memcpy(orig_col_10bits, cur_col_10bits, sizeof(orig_col_10bits));
+ memcpy(orig_col_10bits, cur_col_10, sizeof(orig_col_10bits));
for (uint32_t i = 0; i < LST_MAX; i++) {
- cur_col[i] = orig_col[Light.color_remap[i]];
- cur_col_10bits[i] = orig_col_10bits[Light.color_remap[i]];
+ cur_col_10[i] = orig_col_10bits[Light.color_remap[i]];
}
- if (!Settings.light_fade || power_off) { // no fade
+ if (!Settings.light_fade || skip_light_fade || power_off || (!Light.fade_initialized)) { // no fade
// record the current value for a future Fade
- memcpy(Light.fade_start_8, cur_col, sizeof(Light.fade_start_8));
- memcpy(Light.fade_start_10, cur_col_10bits, sizeof(Light.fade_start_10));
+ memcpy(Light.fade_start_10, cur_col_10, sizeof(Light.fade_start_10));
// push the final values at 8 and 10 bits resolution to the PWMs
- LightSetOutputs(cur_col, cur_col_10bits);
+ LightSetOutputs(cur_col_10);
+ Light.fade_initialized = true; // it is now ok to fade
} else { // fade on
if (Light.fade_running) {
// if fade is running, we take the curring value as the start for the next fade
- memcpy(Light.fade_start_8, Light.fade_cur_8, sizeof(Light.fade_start_8));
memcpy(Light.fade_start_10, Light.fade_cur_10, sizeof(Light.fade_start_10));
}
- memcpy(Light.fade_end_8, cur_col, sizeof(Light.fade_start_8));
- memcpy(Light.fade_end_10, cur_col_10bits, sizeof(Light.fade_start_10));
+ memcpy(Light.fade_end_10, cur_col_10, sizeof(Light.fade_start_10));
Light.fade_running = true;
Light.fade_duration = 0; // set the value to zero to force a recompute
Light.fade_start = 0;
@@ -1745,13 +1859,43 @@ void LightAnimate(void)
}
if (Light.fade_running) {
if (LightApplyFade()) {
- // AddLog_P2(LOG_LEVEL_INFO, PSTR("LightApplyFade %d %d %d %d %d - %d %d %d %d %d"),
- // Light.fade_cur_8[0], Light.fade_cur_8[1], Light.fade_cur_8[2], Light.fade_cur_8[3], Light.fade_cur_8[4],
+ // AddLog_P2(LOG_LEVEL_INFO, PSTR("LightApplyFade %d %d %d %d %d"),
// Light.fade_cur_10[0], Light.fade_cur_10[1], Light.fade_cur_10[2], Light.fade_cur_10[3], Light.fade_cur_10[4]);
- LightSetOutputs(Light.fade_cur_8, Light.fade_cur_10);
+ LightSetOutputs(Light.fade_cur_10);
}
}
+#ifdef USE_PWM_DIMMER
+ // If the power is off and the fade is done, turn the relay off.
+ if (PWM_DIMMER == my_module_type && !Light.power && !Light.fade_running) PWMDimmerSetPower();
+#endif // USE_PWM_DIMMER
+ }
+}
+
+bool isChannelGammaCorrected(uint32_t channel) {
+ if (!Settings.light_correction) { return false; } // Gamma correction not activated
+ if (channel >= Light.subtype) { return false; } // Out of range
+
+ if (PHILIPS == my_module_type) {
+ if ((LST_COLDWARM == Light.subtype) && (1 == channel)) { return false; } // PMW reserved for CT
+ if ((LST_RGBCW == Light.subtype) && (4 == channel)) { return false; } // PMW reserved for CT
+ }
+ return true;
+}
+
+// Calculate the Gamma correction, if any, for fading, using the fast Gamma curve (10 bits in+out)
+uint16_t fadeGamma(uint32_t channel, uint16_t v) {
+ if (isChannelGammaCorrected(channel)) {
+ return ledGamma_internal(v, gamma_table_fast);
+ } else {
+ return v;
+ }
+}
+uint16_t fadeGammaReverse(uint32_t channel, uint16_t vg) {
+ if (isChannelGammaCorrected(channel)) {
+ return ledGammaReverse_internal(vg, gamma_table_fast);
+ } else {
+ return vg;
}
}
@@ -1770,7 +1914,7 @@ bool LightApplyFade(void) { // did the value chanegd and needs to be applied
// compute the distance between start and and color (max of distance for each channel)
uint32_t distance = 0;
for (uint32_t i = 0; i < Light.subtype; i++) {
- int32_t channel_distance = Light.fade_end_10[i] - Light.fade_start_10[i];
+ int32_t channel_distance = fadeGammaReverse(i, Light.fade_end_10[i]) - fadeGammaReverse(i, Light.fade_start_10[i]);
if (channel_distance < 0) { channel_distance = - channel_distance; }
if (channel_distance > distance) { distance = channel_distance; }
}
@@ -1797,12 +1941,14 @@ bool LightApplyFade(void) { // did the value chanegd and needs to be applied
if (fade_current <= Light.fade_duration) { // fade not finished
//Serial.printf("Fade: %d / %d - ", fade_current, Light.fade_duration);
for (uint32_t i = 0; i < Light.subtype; i++) {
- Light.fade_cur_8[i] = changeUIntScale(fade_current,
- 0, Light.fade_duration,
- Light.fade_start_8[i], Light.fade_end_8[i]);
- Light.fade_cur_10[i] = changeUIntScale(fade_current,
- 0, Light.fade_duration,
- Light.fade_start_10[i], Light.fade_end_10[i]);
+ Light.fade_cur_10[i] = fadeGamma(i,
+ changeUIntScale(fadeGammaReverse(i, fade_current),
+ 0, Light.fade_duration,
+ fadeGammaReverse(i, Light.fade_start_10[i]),
+ fadeGammaReverse(i, Light.fade_end_10[i])));
+ // Light.fade_cur_10[i] = changeUIntScale(fade_current,
+ // 0, Light.fade_duration,
+ // Light.fade_start_10[i], Light.fade_end_10[i]);
}
} else {
// stop fade
@@ -1811,10 +1957,8 @@ bool LightApplyFade(void) { // did the value chanegd and needs to be applied
Light.fade_start = 0;
Light.fade_duration = 0;
// set light to target value
- memcpy(Light.fade_cur_8, Light.fade_end_8, sizeof(Light.fade_end_8));
memcpy(Light.fade_cur_10, Light.fade_end_10, sizeof(Light.fade_end_10));
// record the last value for next start
- memcpy(Light.fade_start_8, Light.fade_end_8, sizeof(Light.fade_start_8));
memcpy(Light.fade_start_10, Light.fade_end_10, sizeof(Light.fade_start_10));
}
return true;
@@ -1853,19 +1997,24 @@ void LightApplyPower(uint8_t new_color[LST_MAX], power_t power) {
}
}
-void LightSetOutputs(const uint8_t *cur_col, const uint16_t *cur_col_10bits) {
+void LightSetOutputs(const uint16_t *cur_col_10) {
// now apply the actual PWM values, adjusted and remapped 10-bits range
if (light_type < LT_PWM6) { // only for direct PWM lights, not for Tuya, Armtronix...
for (uint32_t i = 0; i < (Light.subtype - Light.pwm_offset); i++) {
if (pin[GPIO_PWM1 +i] < 99) {
- //AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION "Cur_Col%d 10 bits %d, Pwm%d %d"), i, cur_col_10bits[i], i+1, cur_col[i]);
- analogWrite(pin[GPIO_PWM1 +i], bitRead(pwm_inverted, i) ? Settings.pwm_range - cur_col_10bits[(i + Light.pwm_offset)] : cur_col_10bits[(i + Light.pwm_offset)]);
+ //AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION "Cur_Col%d 10 bits %d"), i, cur_col_10[i]);
+ analogWrite(pin[GPIO_PWM1 +i], bitRead(pwm_inverted, i) ? Settings.pwm_range - cur_col_10[(i + Light.pwm_offset)] : cur_col_10[(i + Light.pwm_offset)]);
}
}
}
- // AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("LGT: R %02X(%d) G %02X(%d) B %02X(%d), CW %02X(%d) WW %02x(%d), D %d"),
- // cur_col[0], cur_col_10bits[0], cur_col[1], cur_col_10bits[1], cur_col[2], cur_col_10bits[2], cur_col[3], cur_col_10bits[3], cur_col[4], cur_col_10bits[4], light_state.getDimmer());
+// char msg[24];
+// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("LGT: Channels %s"), ToHex_P((const unsigned char *)cur_col_10, 10, msg, sizeof(msg)));
+
+ uint8_t cur_col[LST_MAX];
+ for (uint32_t i = 0; i < LST_MAX; i++) {
+ cur_col[i] = change10to8(cur_col_10[i]);
+ }
// Some devices need scaled RGB like Sonoff L1
// TODO, should be probably moved to the Sonoff L1 support code
uint8_t scale_col[3];
@@ -1873,8 +2022,6 @@ void LightSetOutputs(const uint8_t *cur_col, const uint16_t *cur_col_10bits) {
for (uint32_t i = 0; i < 3; i++) {
scale_col[i] = (0 == max) ? 255 : (255 > max) ? changeUIntScale(cur_col[i], 0, max, 0, 255) : cur_col[i];
}
- // AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("LGT: R%d(%d) G%d(%d) B%d(%d), C%d(%d) W%d(%d), D%d"),
- // cur_col[0], scale_col[0], cur_col[1], scale_col[1], cur_col[2], scale_col[2], cur_col[3], scale_col[3], cur_col[4], scale_col[4], light_state.getDimmer());
char *tmp_data = XdrvMailbox.data;
char *tmp_topic = XdrvMailbox.topic;
@@ -1886,83 +2033,164 @@ void LightSetOutputs(const uint8_t *cur_col, const uint16_t *cur_col_10bits) {
XdrvMailbox.topic = tmp_topic;
}
-// Do specific computation is SetOption73 is on, Color Temp is a separate PWM channel
-void calcGammaCTPwm(uint8_t cur_col[5], uint16_t cur_col_10bits[5]) {
- // Xiaomi Philips bulbs follow a different scheme:
- uint8_t cold, warm; // channel 1 is the color tone, mapped to cold channel (0..255)
- light_state.getCW(&cold, &warm);
- // channels for white are always the last two channels
- uint32_t cw1 = Light.subtype - 1; // address for the ColorTone PWM
- uint32_t cw0 = Light.subtype - 2; // address for the White Brightness PWM
- // overall brightness
- uint16_t pxBri = cur_col[cw0] + cur_col[cw1];
- if (pxBri > 255) { pxBri = 255; }
- cur_col[cw1] = changeUIntScale(cold, 0, cold + warm, 0, 255); //
- cur_col_10bits[cw1] = changeUIntScale(cur_col[cw1], 0, 255, 0, 1023);
- // channel 0=intensity, channel1=temperature
- if (Settings.light_correction) { // gamma correction
- cur_col[cw0] = ledGamma(pxBri);
- cur_col_10bits[cw0] = ledGamma(pxBri, 10); // 10 bits gamma correction
- } else {
- cur_col[cw0] = pxBri;
- cur_col_10bits[cw0] = changeUIntScale(pxBri, 0, 255, 0, 1023); // no gamma, extend to 10 bits
- }
-}
-
// Just apply basic Gamma to each channel
-void calcGammaMultiChannels(uint8_t cur_col[5], uint16_t cur_col_10bits[5]) {
+void calcGammaMultiChannels(uint16_t cur_col_10[5]) {
// Apply gamma correction for 8 and 10 bits resolutions, if needed
if (Settings.light_correction) {
for (uint32_t i = 0; i < LST_MAX; i++) {
- cur_col_10bits[i] = ledGamma(cur_col[i], 10);
- cur_col[i] = ledGamma(cur_col[i]);
+ cur_col_10[i] = ledGamma10_10(cur_col_10[i]);
}
}
}
-void calcGammaBulbs(uint8_t cur_col[5], uint16_t cur_col_10bits[5]) {
+void calcGammaBulbs(uint16_t cur_col_10[5]) {
// Apply gamma correction for 8 and 10 bits resolutions, if needed
- if (Settings.light_correction) {
- // First apply combined correction to the overall white power
- if ((LST_COLDWARM == Light.subtype) || (LST_RGBWC == Light.subtype)) {
- uint8_t w_idx[2] = {0, 1}; // if LST_COLDWARM, channels 0 and 1
- if (LST_RGBWC == Light.subtype) { // if LST_RGBWC, channels 3 and 4
- w_idx[0] = 3;
- w_idx[1] = 4;
- }
- uint16_t white_bri = cur_col[w_idx[0]] + cur_col[w_idx[1]];
- // if sum of both channels is > 255, then channels are probablu uncorrelated
- if (white_bri <= 255) {
- // we calculate the gamma corrected sum of CW + WW
- uint16_t white_bri_10bits = ledGamma(white_bri, 10);
- uint8_t white_bri_8bits = ledGamma(white_bri);
- // then we split the total energy among the cold and warm leds
- cur_col_10bits[w_idx[0]] = changeUIntScale(cur_col[w_idx[0]], 0, white_bri, 0, white_bri_10bits);
- cur_col_10bits[w_idx[1]] = changeUIntScale(cur_col[w_idx[1]], 0, white_bri, 0, white_bri_10bits);
- cur_col[w_idx[0]] = changeUIntScale(cur_col[w_idx[0]], 0, white_bri, 0, white_bri_8bits);
- cur_col[w_idx[1]] = changeUIntScale(cur_col[w_idx[1]], 0, white_bri, 0, white_bri_8bits);
+
+ // First apply combined correction to the overall white power
+ if ((LST_COLDWARM == Light.subtype) || (LST_RGBCW == Light.subtype)) {
+ // channels for white are always the last two channels
+ uint32_t cw1 = Light.subtype - 1; // address for the ColorTone PWM
+ uint32_t cw0 = Light.subtype - 2; // address for the White Brightness PWM
+ uint16_t white_bri10 = cur_col_10[cw0] + cur_col_10[cw1]; // cumulated brightness
+ uint16_t white_bri10_1023 = (white_bri10 > 1023) ? 1023 : white_bri10; // max 1023
+
+ if (PHILIPS == my_module_type) { // channel 1 is the color tone, mapped to cold channel (0..255)
+ // Xiaomi Philips bulbs follow a different scheme:
+ cur_col_10[cw1] = light_state.getCT10bits();
+ // channel 0=intensity, channel1=temperature
+ if (Settings.light_correction) { // gamma correction
+ cur_col_10[cw0] = ledGamma10_10(white_bri10_1023); // 10 bits gamma correction
} else {
- cur_col_10bits[w_idx[0]] = ledGamma(cur_col[w_idx[0]], 10);
- cur_col_10bits[w_idx[1]] = ledGamma(cur_col[w_idx[1]], 10);
- cur_col[w_idx[0]] = ledGamma(cur_col[w_idx[0]]);
- cur_col[w_idx[1]] = ledGamma(cur_col[w_idx[1]]);
+ cur_col_10[cw0] = white_bri10_1023; // no gamma, extend to 10 bits
+ }
+ } else if (Settings.light_correction) {
+ // if sum of both channels is > 255, then channels are probably uncorrelated
+ if (white_bri10 <= 1031) { // take a margin of 8 above 1023 to account for rounding errors
+ // we calculate the gamma corrected sum of CW + WW
+ uint16_t white_bri_gamma10 = ledGamma10_10(white_bri10_1023);
+ // then we split the total energy among the cold and warm leds
+ cur_col_10[cw0] = changeUIntScale(cur_col_10[cw0], 0, white_bri10_1023, 0, white_bri_gamma10);
+ cur_col_10[cw1] = changeUIntScale(cur_col_10[cw1], 0, white_bri10_1023, 0, white_bri_gamma10);
+ } else {
+ cur_col_10[cw0] = ledGamma10_10(cur_col_10[cw0]);
+ cur_col_10[cw1] = ledGamma10_10(cur_col_10[cw1]);
}
}
+ }
+
+ if (Settings.light_correction) {
// then apply gamma correction to RGB channels
if (LST_RGB <= Light.subtype) {
for (uint32_t i = 0; i < 3; i++) {
- cur_col_10bits[i] = ledGamma(cur_col[i], 10);
- cur_col[i] = ledGamma(cur_col[i]);
+ cur_col_10[i] = ledGamma10_10(cur_col_10[i]);
}
}
// If RGBW or Single channel, also adjust White channel
- if ((LST_COLDWARM != Light.subtype) && (LST_RGBWC != Light.subtype)) {
- cur_col_10bits[3] = ledGamma(cur_col[3], 10);
- cur_col[3] = ledGamma(cur_col[3]);
+ if ((LST_SINGLE == Light.subtype) || (LST_RGBW == Light.subtype)) {
+ cur_col_10[Light.subtype - 1] = ledGamma10_10(cur_col_10[Light.subtype - 1]);
}
}
}
+#ifdef USE_DEVICE_GROUPS
+void LightSendDeviceGroupStatus()
+{
+ if (Light.subtype > LST_SINGLE) {
+ uint8_t channels[LST_MAX];
+ light_state.getChannels(channels);
+ SendLocalDeviceGroupMessage(DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_LIGHT_CHANNELS, channels);
+ }
+ SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SCHEME, Settings.light_scheme,
+ DGR_ITEM_LIGHT_BRI, light_state.getBri());
+}
+
+void LightHandleDeviceGroupItem()
+{
+ static bool send_state = false;
+ static bool restore_power = false;
+ bool more_to_come;
+ uint32_t value = XdrvMailbox.payload;
+#ifdef USE_PWM_DIMMER_REMOTE
+ if (XdrvMailbox.index & 0xff00) return; // Ignore updates from other device groups
+#endif // USE_PWM_DIMMER_REMOTE
+ switch (XdrvMailbox.command_code) {
+ case DGR_ITEM_EOL:
+ more_to_come = (XdrvMailbox.index & DGR_FLAG_MORE_TO_COME);
+ if (restore_power && !more_to_come) {
+ restore_power = false;
+ Light.power = Light.old_power;
+ }
+
+ LightAnimate();
+
+ if (send_state && !more_to_come) {
+ light_controller.saveSettings();
+ if (Settings.flag3.hass_tele_on_power) { // SetOption59 - Send tele/%topic%/STATE in addition to stat/%topic%/RESULT
+ MqttPublishTeleState();
+ }
+ send_state = false;
+ }
+ break;
+ case DGR_ITEM_LIGHT_BRI:
+ if (light_state.getBri() != value) {
+ light_state.setBri(value);
+ send_state = true;
+ }
+ break;
+ case DGR_ITEM_LIGHT_SCHEME:
+ if (Settings.light_scheme != value) {
+ Settings.light_scheme = value;
+ send_state = true;
+ }
+ break;
+ case DGR_ITEM_LIGHT_CHANNELS:
+ light_controller.changeChannels((uint8_t *)XdrvMailbox.data);
+ send_state = true;
+ break;
+ case DGR_ITEM_LIGHT_FIXED_COLOR:
+ if (Light.subtype >= LST_RGBW) {
+ if (value) {
+ bool save_decimal_text = Settings.flag.decimal_text;
+ char str[16];
+ LightColorEntry(str, sprintf_P(str, PSTR("%u"), value));
+ Settings.flag.decimal_text = save_decimal_text;
+ uint32_t old_bri = light_state.getBri();
+ light_controller.changeChannels(Light.entry_color);
+ light_controller.changeBri(old_bri);
+ Settings.light_scheme = 0;
+ }
+ else {
+ light_state.setColorMode(LCM_CT);
+ }
+ if (!restore_power && !Light.power) {
+ Light.old_power = Light.power;
+ Light.power = 0xff;
+ restore_power = true;
+ }
+ send_state = true;
+ }
+ break;
+ case DGR_ITEM_LIGHT_FADE:
+ if (Settings.light_fade != value) {
+ Settings.light_fade = value;
+ send_state = true;
+ }
+ break;
+ case DGR_ITEM_LIGHT_SPEED:
+ if (Settings.light_speed != value && value > 0 && value <= 40) {
+ Settings.light_speed = value;
+ send_state = true;
+ }
+ break;
+ case DGR_ITEM_STATUS:
+ SendLocalDeviceGroupMessage(DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade,
+ DGR_ITEM_LIGHT_SPEED, Settings.light_speed);
+ LightSendDeviceGroupStatus();
+ break;
+ }
+}
+#endif // USE_DEVICE_GROUPS
+
/*********************************************************************************************\
* Commands
\*********************************************************************************************/
@@ -2028,7 +2256,7 @@ bool LightColorEntry(char *buffer, uint32_t buffer_length)
memcpy_P(&Light.entry_color, &kFixedColdWarm[value -200], 2);
entry_type = 1; // Hexadecimal
}
- else if (LST_RGBWC == Light.subtype) {
+ else if (LST_RGBCW == Light.subtype) {
memcpy_P(&Light.entry_color[3], &kFixedColdWarm[value -200], 2);
entry_type = 1; // Hexadecimal
}
@@ -2089,6 +2317,13 @@ void CmndSupportColor(void)
void CmndColor(void)
{
+ // Color - Show current RGBWW color state
+ // Color1 - Change color to RGBWW
+ // Color2 - Change color to RGBWW but retain brightness (=dimmer)
+ // Color3 - Change color to RGB of WS2812 Clock Second
+ // Color4 - Change color to RGB of WS2812 Clock Minute
+ // Color5 - Change color to RGB of WS2812 Clock Hour
+ // Color6 - Change color to RGB of WS2812 Clock Marker
if ((Light.subtype > LST_SINGLE) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 6)) {
CmndSupportColor();
}
@@ -2096,23 +2331,25 @@ void CmndColor(void)
void CmndWhite(void)
{
- if ((Light.subtype == LST_RGBW) && (XdrvMailbox.index == 1)) {
+ // White - Show current White (=Dimmer2) state
+ // White 0..100 - Set White colors dimmer state
+ if (Light.pwm_multi_channels) { return; }
+ if ( ((Light.subtype >= LST_RGBW) || (LST_COLDWARM == Light.subtype)) && (XdrvMailbox.index == 1)) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
- uint32_t whiteBri = changeUIntScale(XdrvMailbox.payload,0,100,0,255);
- char scolor[LIGHT_COLOR_SIZE];
- snprintf_P(scolor, sizeof(scolor), PSTR("0,0,0,%d"), whiteBri);
- light_state.setBri(whiteBri); // save target Bri, will be confirmed below
- XdrvMailbox.data = scolor;
- XdrvMailbox.data_len = strlen(scolor);
+ light_controller.changeDimmer(XdrvMailbox.payload, 2);
+ LightPreparePower(2);
} else {
- XdrvMailbox.data_len = 0;
+ ResponseCmndNumber(light_state.getDimmer(2));
}
- CmndSupportColor();
}
}
void CmndChannel(void)
{
+ // Channel - Show current Channel state
+ // Channel 0..100 - Set Channel dimmer state
+ // Channel + - Incerement Channel in steps of 10
+ // Channel - - Decrement Channel in steps of 10
if ((XdrvMailbox.index >= Light.device) && (XdrvMailbox.index < Light.device + Light.subtype )) {
uint32_t light_index = XdrvMailbox.index - Light.device;
power_t coldim = 0; // bit flag to update
@@ -2157,49 +2394,35 @@ void CmndChannel(void)
void CmndHsbColor(void)
{
+ // HsbColor - Show current HSB
+ // HsbColor 360,100,100 - Set Hue, Saturation and Brighthness
+ // HsbColor 360,100 - Set Hue and Saturation
+ // HsbColor 360 - Set Hue
+ // HsbColor1 360 - Set Hue
+ // HsbColor2 100 - Set Saturation
+ // HsbColor3 100 - Set Brightness
if (Light.subtype >= LST_RGB) {
- bool validHSB = (XdrvMailbox.data_len > 0);
- if (validHSB) {
- uint16_t HSB[3];
- if (strstr(XdrvMailbox.data, ",") != nullptr) { // Command with 3 comma separated parameters, Hue (0 1) && (XdrvMailbox.index < 4)) {
- HSB[XdrvMailbox.index-1] = changeUIntScale(XdrvMailbox.payload,0,100,0,255);
- } else {
- validHSB = false;
+ if (XdrvMailbox.data_len > 0) {
+ uint16_t c_hue;
+ uint8_t c_sat;
+ light_state.getHSB(&c_hue, &c_sat, nullptr);
+ uint32_t HSB[3];
+ HSB[0] = c_hue;
+ HSB[1] = c_sat;
+ HSB[2] = light_state.getBriRGB();
+ if ((2 == XdrvMailbox.index) || (3 == XdrvMailbox.index)) {
+ if ((uint32_t)XdrvMailbox.payload > 100) { XdrvMailbox.payload = 100; }
+ HSB[XdrvMailbox.index-1] = changeUIntScale(XdrvMailbox.payload, 0, 100, 0, 255);
+ } else {
+ uint32_t paramcount = ParseParameters(3, HSB);
+ if (HSB[0] > 360) { HSB[0] = 360; }
+ for (uint32_t i = 1; i < paramcount; i++) {
+ if (HSB[i] > 100) { HSB[i] == 100; }
+ HSB[i] = changeUIntScale(HSB[i], 0, 100, 0, 255); // change sat and bri to 0..255
}
}
- if (validHSB) {
- light_controller.changeHSB(HSB[0], HSB[1], HSB[2]);
- LightPreparePower(1);
- MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_CMND_COLOR));
- }
+ light_controller.changeHSB(HSB[0], HSB[1], HSB[2]);
+ LightPreparePower(1);
} else {
LightState(0);
}
@@ -2208,6 +2431,11 @@ void CmndHsbColor(void)
void CmndScheme(void)
{
+ // Scheme 0..12 - Select one of schemes 0 to 12
+ // Scheme 2 - Select scheme 2
+ // Scheme 2,0 - Select scheme 2 with color wheel set to 0 (HSB Red)
+ // Scheme + - Select next scheme
+ // Scheme - - Select previous scheme
if (Light.subtype >= LST_RGB) {
uint32_t max_scheme = Light.max_scheme;
@@ -2220,7 +2448,14 @@ void CmndScheme(void)
}
}
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= max_scheme)) {
+ uint32_t parm[2];
+ if (ParseParameters(2, parm) > 1) {
+ Light.wheel = parm[1];
+ }
Settings.light_scheme = XdrvMailbox.payload;
+#ifdef USE_DEVICE_GROUPS
+ SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SCHEME, Settings.light_scheme);
+#endif // USE_DEVICE_GROUPS
if (LS_WAKEUP == Settings.light_scheme) {
Light.wakeup_active = 3;
}
@@ -2237,8 +2472,10 @@ void CmndScheme(void)
void CmndWakeup(void)
{
+ // Wakeup - Start wakeup light
+ // Wakeup 0..100 - Start wakeup light to dimmer value 0..100
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
- Settings.light_dimmer = XdrvMailbox.payload;
+ light_controller.changeDimmer(XdrvMailbox.payload);
}
Light.wakeup_active = 3;
Settings.light_scheme = LS_WAKEUP;
@@ -2248,18 +2485,23 @@ void CmndWakeup(void)
void CmndColorTemperature(void)
{
- if ((LST_COLDWARM == Light.subtype) || (LST_RGBWC == Light.subtype)) { // ColorTemp
+ // CT - Show current color temperature
+ // CT 153..500 - Set color temperature
+ // CT + - Incerement color temperature in steps of 34
+ // CT - - Decrement color temperature in steps of 34
+ if (Light.pwm_multi_channels) { return; }
+ if ((LST_COLDWARM == Light.subtype) || (LST_RGBCW == Light.subtype)) { // ColorTemp
uint32_t ct = light_state.getCT();
if (1 == XdrvMailbox.data_len) {
if ('+' == XdrvMailbox.data[0]) {
- XdrvMailbox.payload = (ct > (500-34)) ? 500 : ct + 34;
+ XdrvMailbox.payload = (ct > (CT_MAX-34)) ? CT_MAX : ct + 34;
}
else if ('-' == XdrvMailbox.data[0]) {
- XdrvMailbox.payload = (ct < (153+34)) ? 153 : ct - 34;
+ XdrvMailbox.payload = (ct < (CT_MIN+34)) ? CT_MIN : ct - 34;
}
}
- if ((XdrvMailbox.payload >= 153) && (XdrvMailbox.payload <= 500)) { // https://developers.meethue.com/documentation/core-concepts
- light_controller.changeCTB(XdrvMailbox.payload, light_state.getBri());
+ if ((XdrvMailbox.payload >= CT_MIN) && (XdrvMailbox.payload <= CT_MAX)) { // https://developers.meethue.com/documentation/core-concepts
+ light_controller.changeCTB(XdrvMailbox.payload, light_state.getBriCT());
LightPreparePower(2);
} else {
ResponseCmndNumber(ct);
@@ -2269,8 +2511,21 @@ void CmndColorTemperature(void)
void CmndDimmer(void)
{
+ // Dimmer - Show current Dimmer state
+ // Dimmer0 0..100 - Change both RGB and W(W) Dimmers
+ // Dimmer1 0..100 - Change RGB Dimmer
+ // Dimmer2 0..100 - Change W(W) Dimmer
+ // Dimmer3 0..100 - Change both RGB and W(W) Dimmers with no fading
+ // Dimmer + - Incerement Dimmer in steps of 10
+ // Dimmer - - Decrement Dimmer in steps of 10
uint32_t dimmer;
- if (XdrvMailbox.index > 2) { XdrvMailbox.index = 1; }
+ if (XdrvMailbox.index == 3) {
+ skip_light_fade = true;
+ XdrvMailbox.index = 0;
+ }
+ else if (XdrvMailbox.index > 2) {
+ XdrvMailbox.index = 1;
+ }
if ((light_controller.isCTRGBLinked()) || (0 == XdrvMailbox.index)) {
dimmer = light_state.getDimmer();
@@ -2302,25 +2557,27 @@ void CmndDimmer(void)
LightPreparePower();
}
}
+#if defined(USE_PWM_DIMMER) && defined(USE_DEVICE_GROUPS)
+ Settings.bri_power_on = light_state.getBri();;
+ SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_BRI_POWER_ON, Settings.bri_power_on);
+#endif // USE_PWM_DIMMER && USE_DEVICE_GROUPS
Light.update = true;
+ if (skip_light_fade) LightAnimate();
} else {
ResponseCmndNumber(dimmer);
}
+ skip_light_fade = false;
}
void CmndDimmerRange(void)
{
+ // DimmerRange - Show current dimmer range as used by Tuya and PS16DZ Dimmers
+ // DimmerRange 0,100 - Set dimmer hardware range from 0 to 100 and restart
if (XdrvMailbox.data_len > 0) {
- char *p;
- uint8_t i = 0;
- uint16_t parm[2];
+ uint32_t parm[2];
parm[0] = Settings.dimmer_hw_min;
parm[1] = Settings.dimmer_hw_max;
- for (char *str = strtok_r(XdrvMailbox.data, ", ", &p); str && i < 2; str = strtok_r(nullptr, ", ", &p)) {
- parm[i] = strtoul(str, nullptr, 0);
- i++;
- }
-
+ ParseParameters(2, parm);
if (parm[0] < parm[1]) {
Settings.dimmer_hw_min = parm[0];
Settings.dimmer_hw_max = parm[1];
@@ -2328,13 +2585,17 @@ void CmndDimmerRange(void)
Settings.dimmer_hw_min = parm[1];
Settings.dimmer_hw_max = parm[0];
}
- restart_flag = 2;
+ if (PWM_DIMMER != my_module_type) restart_flag = 2;
}
Response_P(PSTR("{\"" D_CMND_DIMMER_RANGE "\":{\"Min\":%d,\"Max\":%d}}"), Settings.dimmer_hw_min, Settings.dimmer_hw_max);
}
void CmndLedTable(void)
{
+ // LedTable - Show current LedTable state
+ // LedTable 0 - Turn LedTable Off
+ // LedTable On - Turn LedTable On
+ // LedTable Toggle - Toggle LedTable state
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 2)) {
switch (XdrvMailbox.payload) {
case 0: // Off
@@ -2352,33 +2613,30 @@ void CmndLedTable(void)
void CmndRgbwwTable(void)
{
+ // RgbWwTable - Show current RGBWW State
+ // RgbWwTable 255,255,255,255,255 - Set RGBWW state to maximum
if ((XdrvMailbox.data_len > 0)) {
- if (strstr(XdrvMailbox.data, ",") != nullptr) { // Command with up to 5 comma separated parameters
- for (uint32_t i = 0; i < LST_RGBWC; i++) {
- char *substr;
-
- if (0 == i) {
- substr = strtok(XdrvMailbox.data, ",");
- } else {
- substr = strtok(nullptr, ",");
- }
- if (substr != nullptr) {
- Settings.rgbwwTable[i] = atoi(substr);
- }
- }
+ uint32_t parm[LST_RGBCW -1];
+ uint32_t parmcount = ParseParameters(LST_RGBCW, parm);
+ for (uint32_t i = 0; i < parmcount; i++) {
+ Settings.rgbwwTable[i] = parm[i];
}
Light.update = true;
}
char scolor[LIGHT_COLOR_SIZE];
scolor[0] = '\0';
- for (uint32_t i = 0; i < LST_RGBWC; i++) {
+ for (uint32_t i = 0; i < LST_RGBCW; i++) {
snprintf_P(scolor, sizeof(scolor), PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", Settings.rgbwwTable[i]);
}
- ResponseCmndIdxChar(scolor);
+ ResponseCmndChar(scolor);
}
void CmndFade(void)
{
+ // Fade - Show current Fade state
+ // Fade 0 - Turn Fade Off
+ // Fade On - Turn Fade On
+ // Fade Toggle - Toggle Fade state
switch (XdrvMailbox.payload) {
case 0: // Off
case 1: // On
@@ -2388,12 +2646,21 @@ void CmndFade(void)
Settings.light_fade ^= 1;
break;
}
+#ifdef USE_DEVICE_GROUPS
+ if (XdrvMailbox.payload >= 0 && XdrvMailbox.payload <= 2) SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade);
+#endif // USE_DEVICE_GROUPS
+#ifdef USE_LIGHT
if (!Settings.light_fade) { Light.fade_running = false; }
+#endif // USE_LIGHT
ResponseCmndStateText(Settings.light_fade);
}
void CmndSpeed(void)
-{ // 1 - fast, 40 - very slow
+{
+ // Speed 1 - Fast
+ // Speed 40 - Very slow
+ // Speed + - Increment Speed
+ // Speed - - Decrement Speed
if (1 == XdrvMailbox.data_len) {
if (('+' == XdrvMailbox.data[0]) && (Settings.light_speed > 1)) {
XdrvMailbox.payload = Settings.light_speed - 1;
@@ -2404,12 +2671,17 @@ void CmndSpeed(void)
}
if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 40)) {
Settings.light_speed = XdrvMailbox.payload;
+#ifdef USE_DEVICE_GROUPS
+ SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SPEED, Settings.light_speed);
+#endif // USE_DEVICE_GROUPS
}
ResponseCmndNumber(Settings.light_speed);
}
void CmndWakeupDuration(void)
{
+ // WakeUpDuration - Show current Wake Up duration in seconds
+ // WakeUpDuration 60 - Set Wake Up duration to 60 seconds
if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload < 3001)) {
Settings.light_wakeup = XdrvMailbox.payload;
Light.wakeup_active = 0;
@@ -2418,7 +2690,8 @@ void CmndWakeupDuration(void)
}
void CmndUndocA(void)
-{ // Theos legacy status
+{
+ // Theos legacy status
char scolor[LIGHT_COLOR_SIZE];
LightGetColor(scolor, true); // force hex whatever Option 17
scolor[6] = '\0'; // RGB only
@@ -2436,7 +2709,7 @@ bool Xdrv04(uint8_t function)
bool result = false;
if (FUNC_MODULE_INIT == function) {
- return LightModuleInit();
+ return LightModuleInit();
}
else if (light_type) {
switch (function) {
@@ -2446,13 +2719,18 @@ bool Xdrv04(uint8_t function)
case FUNC_LOOP:
if (Light.fade_running) {
if (LightApplyFade()) {
- LightSetOutputs(Light.fade_cur_8, Light.fade_cur_10);
+ LightSetOutputs(Light.fade_cur_10);
}
}
break;
case FUNC_EVERY_50_MSECOND:
LightAnimate();
break;
+#ifdef USE_DEVICE_GROUPS
+ case FUNC_DEVICE_GROUP_ITEM:
+ LightHandleDeviceGroupItem();
+ break;
+#endif // USE_DEVICE_GROUPS
case FUNC_SET_POWER:
LightSetPower();
break;
diff --git a/tasmota/xdrv_05_irremote.ino b/tasmota/xdrv_05_irremote.ino
index 7c66c4b98..53197b693 100644
--- a/tasmota/xdrv_05_irremote.ino
+++ b/tasmota/xdrv_05_irremote.ino
@@ -1,7 +1,7 @@
/*
xdrv_05_irremote.ino - infra red support for Tasmota
- Copyright (C) 2019 Heiko Krupp, Lazar Obradovic and Theo Arends
+ Copyright (C) 2020 Heiko Krupp, Lazar Obradovic 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
@@ -181,7 +181,7 @@ uint32_t IrRemoteCmndIrSendJson(void)
// IRsend { "protocol": "RC5", "bits": 12, "data":"0xC86" }
// IRsend { "protocol": "SAMSUNG", "bits": 32, "data": 551502015 }
- char dataBufUc[XdrvMailbox.data_len];
+ char dataBufUc[XdrvMailbox.data_len + 1];
UpperCase(dataBufUc, XdrvMailbox.data);
RemoveSpace(dataBufUc);
if (strlen(dataBufUc) < 8) {
@@ -258,10 +258,10 @@ void IrRemoteCmndResponse(uint32_t error)
{
switch (error) {
case IE_INVALID_RAWDATA:
- ResponseCmndChar(D_JSON_INVALID_RAWDATA);
+ ResponseCmndChar_P(PSTR(D_JSON_INVALID_RAWDATA));
break;
case IE_INVALID_JSON:
- ResponseCmndChar(D_JSON_INVALID_JSON);
+ ResponseCmndChar_P(PSTR(D_JSON_INVALID_JSON));
break;
case IE_SYNTAX_IRSEND:
Response_P(PSTR("{\"" D_CMND_IRSEND "\":\"" D_JSON_NO " " D_JSON_IR_PROTOCOL ", " D_JSON_IR_BITS " " D_JSON_OR " " D_JSON_IR_DATA "\"}"));
diff --git a/tasmota/xdrv_05_irremote_full.ino b/tasmota/xdrv_05_irremote_full.ino
index d01291c7c..7d9987ae5 100644
--- a/tasmota/xdrv_05_irremote_full.ino
+++ b/tasmota/xdrv_05_irremote_full.ino
@@ -1,7 +1,7 @@
/*
xdrv_05_irremote_full.ino - complete integration of IRremoteESP8266 for Tasmota
- Copyright (C) 2019 Heiko Krupp, Lazar Obradovic, Theo Arends, Stephan Hadinger
+ Copyright (C) 2020 Heiko Krupp, Lazar Obradovic, Theo Arends, Stephan Hadinger
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
@@ -280,7 +280,7 @@ uint32_t IrRemoteCmndIrHvacJson(void)
char parm_uc[12];
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("IRHVAC: Received %s"), XdrvMailbox.data);
- char dataBufUc[XdrvMailbox.data_len];
+ char dataBufUc[XdrvMailbox.data_len + 1];
UpperCase(dataBufUc, XdrvMailbox.data);
RemoveSpace(dataBufUc);
if (strlen(dataBufUc) < 8) { return IE_INVALID_JSON; }
@@ -393,7 +393,7 @@ uint32_t IrRemoteCmndIrSendJson(void)
// ArduinoJSON entry used to calculate jsonBuf: JSON_OBJECT_SIZE(3) + 40 = 96
// IRsend { "protocol": "RC5", "bits": 12, "data":"0xC86" }
// IRsend { "protocol": "SAMSUNG", "bits": 32, "data": 551502015 }
- char dataBufUc[XdrvMailbox.data_len];
+ char dataBufUc[XdrvMailbox.data_len + 1];
UpperCase(dataBufUc, XdrvMailbox.data);
RemoveSpace(dataBufUc);
if (strlen(dataBufUc) < 8) { return IE_INVALID_JSON; }
@@ -605,10 +605,10 @@ void IrRemoteCmndResponse(uint32_t error)
{
switch (error) {
case IE_INVALID_RAWDATA:
- ResponseCmndChar(D_JSON_INVALID_RAWDATA);
+ ResponseCmndChar_P(PSTR(D_JSON_INVALID_RAWDATA));
break;
case IE_INVALID_JSON:
- ResponseCmndChar(D_JSON_INVALID_JSON);
+ ResponseCmndChar_P(PSTR(D_JSON_INVALID_JSON));
break;
case IE_SYNTAX_IRSEND:
Response_P(PSTR("{\"" D_CMND_IRSEND "\":\"" D_JSON_NO " " D_JSON_IR_BITS " " D_JSON_OR " " D_JSON_IR_DATA "\"}"));
diff --git a/tasmota/xdrv_06_snfbridge.ino b/tasmota/xdrv_06_snfbridge.ino
index 9f8a852d5..c8e9db67e 100644
--- a/tasmota/xdrv_06_snfbridge.ino
+++ b/tasmota/xdrv_06_snfbridge.ino
@@ -1,7 +1,7 @@
/*
xdrv_06_snfbridge.ino - sonoff RF bridge 433 support for Tasmota
- Copyright (C) 2019 Theo Arends and Erik Andrén Zachrisson (fw update)
+ Copyright (C) 2020 Theo Arends and Erik Andrén Zachrisson (fw update)
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
@@ -578,8 +578,7 @@ bool Xdrv06(uint8_t function)
SonoffBridgeSendCommand(0xA7); // Stop reading RF signals enabling iTead default RF handling
break;
case FUNC_PRE_INIT:
- Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
- baudrate = 19200;
+ SetSerial(19200, TS_SERIAL_8N1);
break;
}
}
diff --git a/tasmota/xdrv_07_domoticz.ino b/tasmota/xdrv_07_domoticz.ino
index f5e8af19c..1fddf5890 100644
--- a/tasmota/xdrv_07_domoticz.ino
+++ b/tasmota/xdrv_07_domoticz.ino
@@ -1,7 +1,7 @@
/*
xdrv_07_domoticz.ino - domoticz support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -51,6 +51,10 @@ uint32_t domoticz_fan_debounce = 0; // iFan02 state debounce timer
bool domoticz_subscribe = false;
bool domoticz_update_flag = true;
+#ifdef USE_SHUTTER
+bool domoticz_is_shutter = false;
+#endif // USE_SHUTTER
+
int DomoticzBatteryQuality(void)
{
// Battery 0%: ESP 2.6V (minimum operating voltage is 2.5)
@@ -108,6 +112,11 @@ void MqttPublishDomoticzPowerState(uint8_t device)
if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
if ((device < 1) || (device > devices_present)) { device = 1; }
if (Settings.domoticz_relay_idx[device -1]) {
+#ifdef USE_SHUTTER
+ if (domoticz_is_shutter) {
+ // Shutter is updated by sensor update - power state should not be sent
+ } else {
+#endif // USE_SHUTTER
#ifdef USE_SONOFF_IFAN
if (IsModuleIfan() && (device > 1)) {
// Fan handled by MqttPublishDomoticzFanState
@@ -121,6 +130,9 @@ void MqttPublishDomoticzPowerState(uint8_t device)
#ifdef USE_SONOFF_IFAN
}
#endif // USE_SONOFF_IFAN
+#ifdef USE_SHUTTER
+ }
+#endif //USE_SHUTTER
}
}
}
@@ -140,6 +152,13 @@ void DomoticzMqttUpdate(void)
if (domoticz_update_timer <= 0) {
domoticz_update_timer = Settings.domoticz_update_timer;
for (uint32_t i = 1; i <= devices_present; i++) {
+#ifdef USE_SHUTTER
+ if (domoticz_is_shutter)
+ {
+ // no power state updates for shutters
+ break;
+ }
+#endif // USE_SHUTTER
#ifdef USE_SONOFF_IFAN
if (IsModuleIfan() && (i > 1)) {
MqttPublishDomoticzFanState();
@@ -163,6 +182,7 @@ void DomoticzMqttSubscribe(void)
domoticz_subscribe = true;
}
}
+
if (domoticz_subscribe) {
char stopic[TOPSZ];
snprintf_P(stopic, sizeof(stopic), PSTR(DOMOTICZ_OUT_TOPIC "/#")); // domoticz topic
@@ -230,6 +250,8 @@ bool DomoticzMqttData(void)
for (uint32_t i = 0; i < maxdev; i++) {
if (idx == Settings.domoticz_relay_idx[i]) {
bool iscolordimmer = strcmp_P(domoticz["dtype"],PSTR("Color Switch")) == 0;
+ bool isShutter = strcmp_P(domoticz["dtype"],PSTR("Light/Switch")) == 0 & strncmp_P(domoticz["switchType"],PSTR("Blinds"), 6) == 0;
+
char stemp1[10];
snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1);
#ifdef USE_SONOFF_IFAN
@@ -252,7 +274,31 @@ bool DomoticzMqttData(void)
found = true;
} else
#endif // USE_SONOFF_IFAN
+#ifdef USE_SHUTTER
+ if (isShutter)
+ {
+ if (domoticz.containsKey("nvalue")) {
+ nvalue = domoticz["nvalue"];
+ }
+
+ uint8_t position = 0;
+ if (domoticz.containsKey("svalue1")) {
+ position = domoticz["svalue1"];
+ }
+ if (nvalue != 2) {
+ position = nvalue == 0 ? 0 : 100;
+ }
+
+ snprintf_P(XdrvMailbox.topic, TOPSZ, PSTR("/" D_PRFX_SHUTTER D_CMND_SHUTTER_POSITION));
+ snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), position);
+ XdrvMailbox.data_len = position > 99 ? 3 : (position > 9 ? 2 : 1);
+
+ found = true;
+ } else
+#endif // USE_SHUTTER
+#ifdef USE_LIGHT
if (iscolordimmer && 10 == nvalue) { // Color_SetColor
+ // https://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Set_a_light_to_a_certain_color_or_color_temperature
JsonObject& color = domoticz["Color"];
uint16_t level = nvalue = domoticz["svalue1"];
uint16_t r = color["r"]; r = r * level / 100;
@@ -260,8 +306,19 @@ bool DomoticzMqttData(void)
uint16_t b = color["b"]; b = b * level / 100;
uint16_t cw = color["cw"]; cw = cw * level / 100;
uint16_t ww = color["ww"]; ww = ww * level / 100;
- snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_COLOR));
- snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%02x%02x%02x%02x%02x"), r, g, b, cw, ww);
+ uint16_t m = 0;
+ uint16_t t = 0;
+ if (color.containsKey("m")) {
+ m = color["m"];
+ t = color["t"];
+ }
+ if (2 == m) { // White with color temperature. Valid fields: t
+ snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_BACKLOG));
+ snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR(D_CMND_COLORTEMPERATURE " %d;" D_CMND_DIMMER " %d"), changeUIntScale(t, 0, 255, CT_MIN, CT_MAX), level);
+ } else {
+ snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_COLOR));
+ snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%02x%02x%02x%02x%02x"), r, g, b, cw, ww);
+ }
found = true;
}
else if ((!iscolordimmer && 2 == nvalue) || // gswitch_sSetLevel
@@ -277,8 +334,9 @@ bool DomoticzMqttData(void)
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_DIMMER));
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue);
found = true;
- }
- else if (1 == nvalue || 0 == nvalue) {
+ } else
+#endif // USE_LIGHT
+ if (1 == nvalue || 0 == nvalue) {
if (((power >> i) &1) == (power_t)nvalue) {
return true; // Stop loop
}
@@ -332,9 +390,8 @@ bool DomoticzSendKey(uint8_t key, uint8_t device, uint8_t state, uint8_t svalflg
*
\*********************************************************************************************/
-uint8_t DomoticzHumidityState(char *hum)
+uint8_t DomoticzHumidityState(float h)
{
- uint8_t h = atoi(hum);
return (!h) ? 0 : (h < 40) ? 2 : (h > 70) ? 3 : 1;
}
@@ -370,18 +427,25 @@ void DomoticzSensor(uint8_t idx, uint32_t value)
DomoticzSensor(idx, data);
}
-void DomoticzTempHumSensor(char *temp, char *hum)
+//void DomoticzTempHumPressureSensor(float temp, float hum, float baro = -1);
+void DomoticzTempHumPressureSensor(float temp, float hum, float baro)
{
- char data[16];
- snprintf_P(data, sizeof(data), PSTR("%s;%s;%d"), temp, hum, DomoticzHumidityState(hum));
- DomoticzSensor(DZ_TEMP_HUM, data);
-}
+ char temperature[FLOATSZ];
+ dtostrfd(temp, 2, temperature);
+ char humidity[FLOATSZ];
+ dtostrfd(hum, 2, humidity);
-void DomoticzTempHumPressureSensor(char *temp, char *hum, char *baro)
-{
char data[32];
- snprintf_P(data, sizeof(data), PSTR("%s;%s;%d;%s;5"), temp, hum, DomoticzHumidityState(hum), baro);
- DomoticzSensor(DZ_TEMP_HUM_BARO, data);
+ if (baro > -1) {
+ char pressure[FLOATSZ];
+ dtostrfd(baro, 2, pressure);
+
+ snprintf_P(data, sizeof(data), PSTR("%s;%s;%d;%s;5"), temperature, humidity, DomoticzHumidityState(hum), pressure);
+ DomoticzSensor(DZ_TEMP_HUM_BARO, data);
+ } else {
+ snprintf_P(data, sizeof(data), PSTR("%s;%s;%d"), temperature, humidity, DomoticzHumidityState(hum));
+ DomoticzSensor(DZ_TEMP_HUM, data);
+ }
}
void DomoticzSensorPowerEnergy(int power, char *energy)
@@ -592,6 +656,9 @@ bool Xdrv07(uint8_t function)
#endif // USE_WEBSERVER
case FUNC_MQTT_SUBSCRIBE:
DomoticzMqttSubscribe();
+#ifdef USE_SHUTTER
+ if (Settings.domoticz_sensor_idx[DZ_SHUTTER]) { domoticz_is_shutter = true; }
+#endif // USE_SHUTTER
break;
case FUNC_MQTT_INIT:
domoticz_update_timer = 2;
diff --git a/tasmota/xdrv_08_serial_bridge.ino b/tasmota/xdrv_08_serial_bridge.ino
index 2d9856186..c4f530a21 100644
--- a/tasmota/xdrv_08_serial_bridge.ino
+++ b/tasmota/xdrv_08_serial_bridge.ino
@@ -1,7 +1,7 @@
/*
xdrv_08_serial_bridge.ino - serial bridge support for Tasmota
- Copyright (C) 2019 Theo Arends and Dániel Zoltán Tolnai
+ Copyright (C) 2020 Theo Arends and Dániel Zoltán Tolnai
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -71,8 +71,11 @@ void SerialBridgeInput(void)
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
char hex_char[(serial_bridge_in_byte_counter * 2) + 2];
- Response_P(PSTR("{\"" D_JSON_SSERIALRECEIVED "\":\"%s\"}"),
- (serial_bridge_raw) ? ToHex_P((unsigned char*)serial_bridge_buffer, serial_bridge_in_byte_counter, hex_char, sizeof(hex_char)) : serial_bridge_buffer);
+ bool assume_json = (!serial_bridge_raw && (serial_bridge_buffer[0] == '{'));
+ Response_P(PSTR("{\"" D_JSON_SSERIALRECEIVED "\":%s%s%s}"),
+ (assume_json) ? "" : """",
+ (serial_bridge_raw) ? ToHex_P((unsigned char*)serial_bridge_buffer, serial_bridge_in_byte_counter, hex_char, sizeof(hex_char)) : serial_bridge_buffer,
+ (assume_json) ? "" : """");
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SSERIALRECEIVED));
XdrvRulesProcess();
serial_bridge_in_byte_counter = 0;
diff --git a/tasmota/xdrv_09_timers.ino b/tasmota/xdrv_09_timers.ino
index a6c7b23a9..0804ce286 100644
--- a/tasmota/xdrv_09_timers.ino
+++ b/tasmota/xdrv_09_timers.ino
@@ -1,7 +1,7 @@
/*
xdrv_09_timers.ino - timer support for Tasmota
- Copyright (C) 2019 Theo Arends
+ Copyright (C) 2020 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
@@ -364,7 +364,7 @@ void CmndTimer(void)
#if defined(USE_RULES)==0 && defined(USE_SCRIPT)==0
if (devices_present) {
#endif
- char dataBufUc[XdrvMailbox.data_len];
+ char dataBufUc[XdrvMailbox.data_len + 1];
UpperCase(dataBufUc, XdrvMailbox.data);
StaticJsonBuffer<256> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(dataBufUc);
diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino
index 21c9de283..2509d6f6f 100644
--- a/tasmota/xdrv_10_rules.ino
+++ b/tasmota/xdrv_10_rules.ino
@@ -1,7 +1,7 @@
/*
xdrv_10_rules.ino - rule support for Tasmota
- Copyright (C) 2019 ESP Easy Group and Theo Arends
+ Copyright (C) 2020 ESP Easy Group 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
@@ -255,28 +255,43 @@ bool RulesRuleMatch(uint8_t rule_set, String &event, String &rule)
}
// Step2: Search rule_task and rule_name
- StaticJsonBuffer<1024> jsonBuf;
- JsonObject &root = jsonBuf.parseObject(event);
- if (!root.success()) { return false; } // No valid JSON data
-
- const char* str_value;
- if ((pos = rule_name.indexOf("[")) > 0) { // "CURRENT[1]"
- int rule_name_idx = rule_name.substring(pos +1).toInt();
+ int rule_name_idx = 0;
+ if ((pos = rule_name.indexOf("[")) > 0) { // "SUBTYPE1#CURRENT[1]"
+ rule_name_idx = rule_name.substring(pos +1).toInt();
if ((rule_name_idx < 1) || (rule_name_idx > 6)) { // Allow indexes 1 to 6
rule_name_idx = 1;
}
- rule_name = rule_name.substring(0, pos); // "CURRENT"
- str_value = root[rule_task][rule_name][rule_name_idx -1]; // "ENERGY" and "CURRENT" and 0
+ rule_name = rule_name.substring(0, pos); // "SUBTYPE1#CURRENT"
+ }
+
+ StaticJsonBuffer<1024> jsonBuf;
+ JsonObject &root = jsonBuf.parseObject(event);
+ if (!root.success()) { return false; } // No valid JSON data
+ if (!root[rule_task].success()) { return false; } // No rule_task in JSON data
+
+ JsonObject &obj1 = root[rule_task];
+ JsonObject *obj = &obj1;
+ String subtype;
+ uint32_t i = 0;
+ while ((pos = rule_name.indexOf("#")) > 0) { // "SUBTYPE1#SUBTYPE2#CURRENT"
+ subtype = rule_name.substring(0, pos);
+ if (!(*obj)[subtype].success()) { return false; } // No subtype in JSON data
+ JsonObject &obj2 = (*obj)[subtype];
+ obj = &obj2;
+ rule_name = rule_name.substring(pos +1);
+ if (i++ > 10) { return false; } // Abandon possible loop
+ }
+ if (!(*obj)[rule_name].success()) { return false; } // No name in JSON data
+ const char* str_value;
+ if (rule_name_idx) {
+ str_value = (*obj)[rule_name][rule_name_idx -1]; // "CURRENT[1]"
} else {
- str_value = root[rule_task][rule_name]; // "INA219" and "CURRENT"
+ str_value = (*obj)[rule_name]; // "CURRENT"
}
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("RUL: Task %s, Name %s, Value |%s|, TrigCnt %d, TrigSt %d, Source %s, Json %s"),
// rule_task.c_str(), rule_name.c_str(), rule_svalue, Rules.trigger_count[rule_set], bitRead(Rules.triggers[rule_set], Rules.trigger_count[rule_set]), event.c_str(), (str_value) ? str_value : "none");
- if (!root[rule_task][rule_name].success()) { return false; }
- // No value but rule_name is ok
-
Rules.event_value = str_value; // Prepare %value%
// Step 3: Compare rule (value)
@@ -315,6 +330,9 @@ bool RulesRuleMatch(uint8_t rule_set, String &event, String &rule)
}
} else match = true;
+//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("RUL: Match 1 %d"), match);
+
+
if (bitRead(Settings.rule_once, rule_set)) {
if (match) { // Only allow match state changes
if (!bitRead(Rules.triggers[rule_set], Rules.trigger_count[rule_set])) {
@@ -327,6 +345,8 @@ bool RulesRuleMatch(uint8_t rule_set, String &event, String &rule)
}
}
+//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("RUL: Match 2 %d"), match);
+
return match;
}
@@ -437,8 +457,14 @@ bool RuleSetProcess(uint8_t rule_set, String &event_saved)
commands.trim();
String ucommand = commands;
ucommand.toUpperCase();
+
// if (!ucommand.startsWith("BACKLOG")) { commands = "backlog " + commands; } // Always use Backlog to prevent power race exception
- if ((ucommand.indexOf("EVENT ") != -1) && (ucommand.indexOf("BACKLOG ") == -1)) { commands = "backlog " + commands; } // Always use Backlog with event to prevent rule event loop exception
+ // Use Backlog with event to prevent rule event loop exception unless IF is used which uses an implicit backlog
+ if ((ucommand.indexOf("IF ") == -1) &&
+ (ucommand.indexOf("EVENT ") != -1) &&
+ (ucommand.indexOf("BACKLOG ") == -1)) {
+ commands = "backlog " + commands;
+ }
RulesVarReplace(commands, F("%VALUE%"), Rules.event_value);
for (uint32_t i = 0; i < MAX_RULE_VARS; i++) {
@@ -557,8 +583,7 @@ void RulesEvery50ms(void)
#else
if (pin[GPIO_SWT1 +i] < 99) {
#endif // USE_TM1638
- bool swm = ((FOLLOW_INV == Settings.switchmode[i]) || (PUSHBUTTON_INV == Settings.switchmode[i]) || (PUSHBUTTONHOLD_INV == Settings.switchmode[i]));
- snprintf_P(json_event, sizeof(json_event), PSTR("{\"" D_JSON_SWITCH "%d\":{\"Boot\":%d}}"), i +1, (swm ^ SwitchLastState(i)));
+ snprintf_P(json_event, sizeof(json_event), PSTR("{\"" D_JSON_SWITCH "%d\":{\"Boot\":%d}}"), i +1, (SwitchState(i)));
RulesProcessEvent(json_event);
}
}
@@ -1806,11 +1831,7 @@ void CmndMemory(void)
{
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_MEMS)) {
if (!XdrvMailbox.usridx) {
- mqtt_data[0] = '\0';
- for (uint32_t i = 0; i < MAX_RULE_MEMS; i++) {
- ResponseAppend_P(PSTR("%c\"Mem%d\":\"%s\""), (i) ? ',' : '{', i +1, SettingsText(SET_MEM1 +i));
- }
- ResponseJsonEnd();
+ ResponseCmndAll(SET_MEM1, MAX_RULE_MEMS);
} else {
if (XdrvMailbox.data_len > 0) {
#ifdef USE_EXPRESSION
diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino
index 6b97fa68a..30ed26598 100755
--- a/tasmota/xdrv_10_scripter.ino
+++ b/tasmota/xdrv_10_scripter.ino
@@ -1,7 +1,7 @@
/*
xdrv_10_scripter.ino - script support for Tasmota
- Copyright (C) 2019 Gerhard Mutz and Theo Arends
+ Copyright (C) 2020 Gerhard Mutz 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
@@ -1496,6 +1496,37 @@ chknext:
fvar=!global_state.mqtt_down;
goto exit;
}
+ if (!strncmp(vname,"mp(",3)) {
+ lp+=3;
+ float fvar1;
+ lp=GetNumericResult(lp,OPER_EQU,&fvar1,0);
+ SCRIPT_SKIP_SPACES
+ while (*lp!=')') {
+ char *opp=lp;
+ lp++;
+ float fvar2;
+ lp=GetNumericResult(lp,OPER_EQU,&fvar2,0);
+ SCRIPT_SKIP_SPACES
+ fvar=fvar1;
+ if ((*opp=='<' && fvar1' && fvar1>fvar2) ||
+ (*opp=='=' && fvar1==fvar2))
+ {
+ if (*lp!='<' && *lp!='>' && *lp!='=' && *lp!=')' && *lp!=SCRIPT_EOL) {
+ float fvar3;
+ lp=GetNumericResult(lp,OPER_EQU,&fvar3,0);
+ SCRIPT_SKIP_SPACES
+ fvar=fvar3;
+ } else {
+ fvar=fvar2;
+ }
+ break;
+ }
+ while (*lp!='<' && *lp!='>' && *lp!='=' && *lp!=')' && *lp!=SCRIPT_EOL) lp++;
+ }
+ len=0;
+ goto exit;
+ }
break;
case 'p':
if (!strncmp(vname,"pin[",4)) {
@@ -1588,7 +1619,7 @@ chknext:
if (!strncmp(vname,"sw[",3)) {
// tasmota switch state
GetNumericResult(vname+3,OPER_EQU,&fvar,0);
- fvar=SwitchLastState((uint8_t)fvar);
+ fvar=SwitchLastState((uint32_t)fvar);
// skip ] bracket
len++;
goto exit;
@@ -1714,6 +1745,30 @@ chknext:
len=0;
goto exit;
}
+#endif
+#ifdef USE_SML_SCRIPT_CMD
+ if (!strncmp(vname,"sml(",4)) {
+ lp+=4;
+ float fvar1;
+ lp=GetNumericResult(lp,OPER_EQU,&fvar1,0);
+ SCRIPT_SKIP_SPACES
+ float fvar2;
+ lp=GetNumericResult(lp,OPER_EQU,&fvar2,0);
+ SCRIPT_SKIP_SPACES
+ if (fvar2==0) {
+ float fvar3;
+ lp=GetNumericResult(lp,OPER_EQU,&fvar3,0);
+ fvar=SML_SetBaud(fvar1,fvar3);
+ } else {
+ char str[SCRIPT_MAXSSIZE];
+ lp=GetStringResult(lp,OPER_EQU,str,0);
+ fvar=SML_Write(fvar1,str);
+ }
+ lp++;
+ fvar=0;
+ len=0;
+ goto exit;
+ }
#endif
break;
case 't':
@@ -3033,11 +3088,6 @@ void Scripter_save_pvars(void) {
#ifdef USE_WEBSERVER
#define WEB_HANDLE_SCRIPT "s10"
-#define D_CONFIGURE_SCRIPT "Edit script"
-#define D_SCRIPT "edit script"
-#define D_SDCARD_UPLOAD "file upload"
-#define D_SDCARD_DIR "sd card directory"
-#define D_UPL_DONE "Done"
const char S_CONFIGURE_SCRIPT[] PROGMEM = D_CONFIGURE_SCRIPT;
@@ -3051,7 +3101,7 @@ const char HTTP_FORM_SCRIPT[] PROGMEM =
const char HTTP_FORM_SCRIPT1[] PROGMEM =
"
"
- "script enable "
+ "" D_SCRIPT_ENABLE " "
"