diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index f9622222f..19c9bd00d 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -29,7 +29,7 @@ _Make sure your have performed every step and checked the applicable boxes befor - [ ] Read the [Contributing Guide and Policy](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md) and [the Code of Conduct](https://github.com/arendst/Tasmota/blob/development/CODE_OF_CONDUCT.md) - [ ] Searched the problem in [issues](https://github.com/arendst/Tasmota/issues) -- [ ] Searched the problem in the [wiki](https://github.com/arendst/Tasmota/wiki/Troubleshooting) +- [ ] Searched the problem in the [docs](https://tasmota.github.io/docs/#/help/FAQ) - [ ] Searched the problem in the [forum](https://groups.google.com/d/forum/sonoffusers) - [ ] Searched the problem in the [chat](https://discord.gg/Ks2Kzd4) - [ ] Device used (e.g., Sonoff Basic): _____ @@ -38,31 +38,31 @@ _Make sure your have performed every step and checked the applicable boxes befor - [ ] Self-compiled - [ ] IDE / Compiler used: _____ - [ ] Flashing tools used: _____ -- [ ] Provide the output of command: ``Backlog Template; Module; GPIO 255``: - ``` +- [ ] Provide the output of command: `Backlog Template; Module; GPIO 255`: +``` Configuration output here: - ``` -- [ ] If using rules, provide the output of this command: ``Backlog Rule1; Rule2; Rule3``: - ``` +``` +- [ ] If using rules, provide the output of this command: `Backlog Rule1; Rule2; Rule3`: +``` Rules output here: - ``` -- [ ] Provide the output of this command: ``Status 0``: - ``` +``` +- [ ] Provide the output of this command: `Status 0`: +``` STATUS 0 output here: - ``` +``` - [ ] Provide the output of the Console log output when you experience your issue; if applicable: - _(Please use_ ``weblog 4`` _for more debug information)_ - ``` + _(Please use_ `weblog 4` _for more debug information)_ +``` Console output here: - ``` +``` ### TO REPRODUCE _Steps to reproduce the behavior:_ diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md index 43fd36e7c..90d705ea0 100644 --- a/.github/ISSUE_TEMPLATE/Feature_request.md +++ b/.github/ISSUE_TEMPLATE/Feature_request.md @@ -10,7 +10,7 @@ Please take a few minutes to complete the requested information below. Our abili DO NOT DELETE ANY TEXT from this template! Otherwise the issue will be auto-closed. --> -**Have you looked for this feature in other issues and in the wiki?** +**Have you looked for this feature in other issues and in the docs?** **Is your feature request related to a problem? Please describe.** _A clear and concise description of what the problem is._ diff --git a/.github/issue-close-app.yml b/.github/issue-close-app.yml index 8e981441b..d222d8980 100644 --- a/.github/issue-close-app.yml +++ b/.github/issue-close-app.yml @@ -39,7 +39,7 @@ issueConfigs: - "EXPECTED BEHAVIOUR" - content: # template 2: feature request - - "Have you looked for this feature in other issues and in the wiki" + - "Have you looked for this feature in other issues and in the docs" - "Describe the solution you'd like" # Optional configuration: diff --git a/.gitignore b/.gitignore index e9c55b5b9..ef1e0a508 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ build firmware.map firmware.asm tasmota*.bin +tasmota*.bin.gz tasmota*.map platformio_override.ini diff --git a/.gitpod.yml b/.gitpod.yml index ee7750c54..8ac16a8ad 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -1,3 +1,3 @@ tasks: - - before: pip install -U platformio + - before: pip3 install -U platformio command: platformio run -e tasmota diff --git a/.travis.yml b/.travis.yml index 911f3423e..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 @@ -12,7 +12,7 @@ cache: false env: - ENV=tasmota - ENV=tasmota-minimal - - ENV=tasmota-basic + - ENV=tasmota-lite - ENV=tasmota-knx - ENV=tasmota-sensors - ENV=tasmota-display @@ -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 74c0a7a35..53ebba456 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -1,6 +1,6 @@ ## Available Features and Sensors -| Feature or Sensor | minimal | basic | tasmota | knx | sensors | ir | display | Remarks +| Feature or Sensor | minimal | lite | tasmota | knx | sensors | ir | display | Remarks |-----------------------|---------|-------|--------|-----|---------|----|---------|-------- | MY_LANGUAGE en-GB | x | x | x | x | x | x | x | | USE_ARDUINO_OTA | - | - | - | - | - | - | - | @@ -26,23 +26,26 @@ | USE_SCRIPT | - | - | - | - | - | - | - | | USE_EXPRESSION | - | - | - | - | - | - | - | | SUPPORT_IF_STATEMENT | - | - | - | - | - | - | - | +| USE_HOTPLUG | - | - | - | - | x | - | - | | | | | | | | | | -| Feature or Sensor | minimal | basic | tasmota | knx | sensors | ir | display | Remarks +| 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_BUZZER | - | - | x | x | x | - | - | | USE_ARILUX_RF | - | - | x | x | x | - | - | -| USE_SHUTTER | - | - | - | - | - | - | - | +| USE_SHUTTER | - | - | x | x | - | - | - | | USE_DEEPSLEEP | - | - | x | - | x | - | - | | USE_EXS_DIMMER | - | - | x | x | - | - | - | +| USE_DEVICE_GROUPS | - | - | x | - | - | - | - | +| USE_PWM_DIMMER | - | - | x | x | - | - | - | | | | | | | | | | -| Feature or Sensor | minimal | basic | tasmota | knx | sensors | ir | display | Remarks +| Feature or Sensor | minimal | lite | tasmota | knx | sensors | ir | display | Remarks | USE_LIGHT | - | x | x | x | x | x | x | | USE_WS2812 | - | - | x | x | x | - | x | | USE_WS2812_DMA | - | - | - | - | - | - | - | @@ -61,6 +64,7 @@ | USE_DDS2382 | - | - | - | - | x | - | - | | USE_DDSU666 | - | - | - | - | x | - | - | | USE_SOLAX_X1 | - | - | - | - | - | - | - | +| USE_LE01MR | - | - | - | - | - | - | - | | | | | | | | | | | USE_ADC_VCC | x | x | - | - | - | - | - | | USE_COUNTER | - | - | x | x | x | x | x | @@ -69,30 +73,30 @@ | USE_MAX31855 | - | - | - | - | x | - | - | | USE_MAX31865 | - | - | - | - | - | - | - | | | | | | | | | | -| Feature or Sensor | minimal | basic | tasmota | knx | sensors | ir | display | Remarks +| 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 | - | - | - | - | - | - | - | @@ -106,34 +110,47 @@ | USE_PAJ7620 | - | - | - | - | - | - | - | | USE_PCF8574 | - | - | - | - | - | - | - | | USE_HIH6 | - | - | - | - | x | - | - | +| USE_DHT12 | - | - | - | - | x | - | - | +| USE_DS1624 | - | - | - | - | x | - | - | +| USE_AHT1x | - | - | - | - | - | - | - | +| USE_WEMOS_MOTOR_V1 | - | - | - | - | x | - | - | | | | | | | | | | -| Feature or Sensor | minimal | basic | tasmota | knx | sensors | ir | display | Remarks +| 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 | - | - | | USE_AZ7798 | - | - | - | - | - | - | - | | USE_PN532_HSU | - | - | - | - | x | - | - | +| 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 | - | - | | USE_A4988_STEPPER | - | - | - | - | - | - | - | | USE_TASMOTA_SLAVE | - | - | - | - | - | - | - | Experimental | | | | | | | | | -| Feature or Sensor | minimal | basic | tasmota | knx | sensors | ir | display | Remarks +| Feature or Sensor | minimal | lite | tasmota | knx | sensors | ir | display | Remarks | USE_DISPLAY | - | - | - | - | - | - | x | | USE_DISPLAY_LCD | - | - | - | - | - | - | x | | USE_DISPLAY_SSD1306 | - | - | - | - | - | - | x | @@ -144,4 +161,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..4f2e9530e --- /dev/null +++ b/Device_Groups.md @@ -0,0 +1,45 @@ +# 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, set Option85 to 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 + ,<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 = Minimum brightness +

GroupTopic<x> + 1 = reset device group <x> MQTT group topic to firmware default (MQTT_GRPTOPIC) and restart +

+ = 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 73f4a9c6b..f9cf5b0e3 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -61,4 +61,8 @@ Index | Define | Driver | Device | Address(es) | Description 38 | USE_DISPLAY_ILI9488 | xdsp_08 | FT6236 | 0x38 | Touch panel controller 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) 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..5ba143fec --- /dev/null +++ b/PWM_Dimmer.md @@ -0,0 +1,173 @@ +# 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 (PWM value). The brightness is changed faster at higher brightnesses. The DimmerRange command sets the minimum and maximum PWM values. Brightness values (0 through 255) are scaled to dimmerMin through dimmerMax. Typically, dimmerMin would be set to the lowest value at which the lights show visible light and dimmerMax would be set 1023. If you want to increase the lowest brightness level and/or decrease the highest brightness level, set higher dimmerMin and/or lower dimmerMax values. + +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 the down or up button turns the power on at a temporary brightness of the low/high levels set by the BriPreset command (default =10,255). Turning the power on at the low preset can also be accomplished by holding the power button while the power is off. The brightness 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. + +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 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. + +When the power is on, tapping (pressing and releasing quickly) the down or up buttons a given number of times and then holding the down or up button decreases or increases settings according to the table below. For example, tapping the down button once and then holding the up button sets all RGB lights in the device group to the next fixed color. Tapping the up button three times and then holding the down button decreases the high brightness preset. + + + + + + + + + + + + + + + + + + + + + + + +
Taps + Down Button + Up Button +
1 + Set fixed color1 + Publish MQTT event2 +
2 + Adjust minimum brightness + Adjust fade speed +
3 + Adjust low brightness preset + Adjust high brightness preset +
+ + +1. Setting the previous/next color only functions when remote device mode is enabled (see below) and only when the switch is in a device group with an RGB light. 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. + +2. The MQTT topic has the format %group-topic%/cmnd/Event, where %group-topic% is the group topic set by the GroupTopic command. The MQTT payload is SwitchTrigger#, 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#SwitchTrigger1) or by automation software to trigger automations such as scene changes. For example, the Event topic SwitchTrigger1 payload could trigger the automation software to turn on the previous scene in a list and the SwitchTrigger2 payload could trigger the automation software to turn on the next scene in a list. + +Holding the power button, pressing the down/up buttons a given number of times and then releasing the power button toggles options according to the table below. Note that you must press a down or up button within 0.5 seconds to prevent the power button hold action from taking place. + + + + + + + + + + + + + + + + + + +
Presses + Down Button + Up Button +
1 + Toggle powered-off LED + Toggle brightness LED timeout +
2 + Toggle fading + +
+ + +Holding any button for over 10 seconds executes the WiFiConfig 2 command. + +Pressing and releasing a button publishes an MQTT TOGGLE command. 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, dimmer minimum and maximum values, fade and speed settings 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 +
DimmerRange + Change dimming range
+, = set minimum and maximum PWM values. Dimmer/brightness is scaled to this range.
+
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, set Option88 to 1. 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 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). + +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 (default =10). + +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 7b101df63..e6e157efb 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ In addition to the [release webpage](https://github.com/arendst/Tasmota/releases ## Development -[![Dev Version](https://img.shields.io/badge/development%20version-v7.1.1.x-blue.svg)](https://github.com/arendst/Tasmota) +[![Dev Version](https://img.shields.io/badge/development%20version-v8.1.x.x-blue.svg)](https://github.com/arendst/Tasmota) [![Download Dev](https://img.shields.io/badge/download-development-yellow.svg)](http://thehackbox.org/tasmota/) [![Build Status](https://img.shields.io/travis/arendst/Tasmota.svg)](https://travis-ci.org/arendst/Tasmota) @@ -68,6 +68,11 @@ See [wiki migration path](https://tasmota.github.io/docs/#/Upgrading?id=migratio 4. Migrate to **Sonoff-Tasmota 6.x** 5. Migrate to **Tasmota 7.x** +--- Major change in parameter storage layout --- + +6. Migrate to **Tasmota 8.1** +7. Migrate to **Tasmota 8.x** + ## Support Information @@ -127,7 +132,7 @@ 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 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 51d078352..2fc828a40 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2,8 +2,6 @@ # RELEASE NOTES -### Sonoff-Tasmota is now Tasmota - ## Migration Information See [migration path](https://tasmota.github.io/docs/#/Upgrading?id=migration-path) for instructions how to migrate to a major version. Pay attention to the following version breaks due to dynamic settings updates: @@ -14,9 +12,16 @@ See [migration path](https://tasmota.github.io/docs/#/Upgrading?id=migration-pat 4. Migrate to **Sonoff-Tasmota 6.x** 5. Migrate to **Tasmota 7.x** +--- Major change in parameter storage layout --- + +6. Migrate to **Tasmota 8.1** +7. Migrate to **Tasmota 8.x** + +While fallback or downgrading is common practice it was never supported due to Settings additions or changes in newer releases. Starting with release **v8.1.0 Doris** the Settings are re-allocated in such a way that fallback is only allowed and possible to release **v7.2.0 Constance**. Once at v7.2.0 you're on your own when downgrading even further. + ## 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. @@ -30,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-basic.bin** = The Basic 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. @@ -47,8 +52,69 @@ The following binary downloads have been compiled with ESP8266/Arduino library c ## Changelog -### Version 7.1.2 Betty +### Version 8.1.0.10 -- Fix lost functionality of GPIO9 and GPIO10 on some devices (#7080) -- Fix Zigbee uses Hardware Serial if GPIO 1/3 or GPIO 13/15 and SerialLog 0 (#7071) -- Change light color schemes 2, 3 and 4 from color wheel to Hue driven +- Change default my_user_config.h driver and sensor support removing most sensors and adding most drivers +- Change Lights: simplified gamma correction and 10 bits internal computation +- Change commands ``Prefix``, ``Ssid``, ``StateText``, ``NTPServer``, and ``FriendlyName`` displaying all items +- Change IRremoteESP8266 library updated to v2.7.4 +- 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 switchmode 6 according to issue 7778 (#7831) +- Fix Sonoff Bridge, Sc, L1, iFan03 and CSE7766 serial interface to forced speed, config and disable logging +- Fix commands ``Display`` and ``Counter`` from overruling command processing (#7322) +- Fix ``White`` added to light status (#7142) +- Fix Improved fade linearity with gamma correction +- Fix LCD line and column positioning (#7387) +- Fix Display handling of hexadecimal escape characters (#7387) +- Fix ``WakeUp `` ignores provided value (#7473) +- Fix exception 9 restart on log message in Ticker interrupt service routines NTP, Wemos and Hue emulation (#7496) +- Fix ``PowerDelta`` zero power detection (#7515) +- Fix ``RGBWWTable`` ignored (#7572) +- Fix PWM flickering at low levels (#7415) +- Fix Hass sensor discovery part 1/4 by Federico Leoni (#7582, #7548) +- Fix MaxPower functionality (#7647) +- Fix relation between 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 command ``Buzzer -1`` for infinite mode and command ``Buzzer -2`` for following led mode (#7623) +- 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 +- 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 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 +- Add support for gzipped binaries +- Add web page sliders when ``SetOption37 128`` is active allowing control of white(s) +- 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 ...`` +- Add support for sensors DS18x20 and DHT family on Shelly 1 and Shelly 1PM using Shelly Add-On adapter (#7469) +- 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) +- Add new DHT driver. The old driver can still be used using define USE_DHT_OLD (#7468) +- 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) +- 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 Zigbee features and improvements +- Add support for Martin Jerry/acenx/Tessan/NTONPOWER SD0x PWM dimmer switches by Paul Diem (#7791) +- Add support for Jarolift rollers by Keeloq algorithm +- Add support for MaxBotix HRXL-MaxSonar ultrasonic range finders by Jon Little (#7814) +- Add support for Romanian language translations by Augustin Marti 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/ArduinoNTPd/NTPPacket.cpp b/lib/ArduinoNTPd/NTPPacket.cpp new file mode 100644 index 000000000..e3cdf6b32 --- /dev/null +++ b/lib/ArduinoNTPd/NTPPacket.cpp @@ -0,0 +1,39 @@ +/* + * File: NTPPacket.cpp + * Description: + * NTP packet representation. + * Author: Mooneer Salem + * License: New BSD License + */ + +#include "NTPPacket.h" + +void NtpPacket::swapEndian() +{ + reverseBytes_(&rootDelay); + reverseBytes_(&rootDispersion); + reverseBytes_(&referenceTimestampSeconds); + reverseBytes_(&referenceTimestampFraction); + reverseBytes_(&originTimestampSeconds); + reverseBytes_(&originTimestampFraction); + reverseBytes_(&receiveTimestampSeconds); + reverseBytes_(&receiveTimestampFraction); + reverseBytes_(&transmitTimestampSeconds); + reverseBytes_(&transmitTimestampFraction); +} + +void NtpPacket::reverseBytes_(uint32_t *number) +{ + char buf[4]; + char *numberAsChar = (char*)number; + + buf[0] = numberAsChar[3]; + buf[1] = numberAsChar[2]; + buf[2] = numberAsChar[1]; + buf[3] = numberAsChar[0]; + + numberAsChar[0] = buf[0]; + numberAsChar[1] = buf[1]; + numberAsChar[2] = buf[2]; + numberAsChar[3] = buf[3]; +} diff --git a/lib/ArduinoNTPd/NTPPacket.h b/lib/ArduinoNTPd/NTPPacket.h new file mode 100644 index 000000000..80a1366f5 --- /dev/null +++ b/lib/ArduinoNTPd/NTPPacket.h @@ -0,0 +1,75 @@ +/* + * File: NTPPacket.h + * Description: + * NTP packet representation. + * Author: Mooneer Salem + * License: New BSD License + */ + +#ifndef NTP_PACKET_H +#define NTP_PACKET_H + +#include "Arduino.h" + + +/* + * Contains the data in a typical NTP packet. + */ +struct NtpPacket +{ + static const int PACKET_SIZE = 48; + + unsigned char leapVersionMode; + + unsigned int leapIndicator() const { return leapVersionMode >> 6; } + void leapIndicator(unsigned int newValue) { leapVersionMode = (0x3F & leapVersionMode) | ((newValue & 0x03) << 6); } + + unsigned int versionNumber() const { return (leapVersionMode >> 3) & 0x07; } + void versionNumber(unsigned int newValue) { leapVersionMode = (0xC7 & leapVersionMode) | ((newValue & 0x07) << 3); } + + unsigned int mode() const { return (leapVersionMode & 0x07); } + void mode(unsigned int newValue) { leapVersionMode = (leapVersionMode & 0xF8) | (newValue & 0x07); } + + char stratum; + char poll; + char precision; + uint32_t rootDelay; + uint32_t rootDispersion; + char referenceId[4]; + uint32_t referenceTimestampSeconds; + uint32_t referenceTimestampFraction; + uint32_t originTimestampSeconds; + uint32_t originTimestampFraction; + uint32_t receiveTimestampSeconds; + uint32_t receiveTimestampFraction; + uint32_t transmitTimestampSeconds; + uint32_t transmitTimestampFraction; + + /* + * Rearranges bytes in 32 bit values from big-endian (NTP protocol) + * to little-endian (Arduino/PC), or vice versa. Must be called before + * modifying the structure or sending the packet. + */ + void swapEndian(); + + /* + * Returns packet as a char array for transmission via network. + * WARNING: modifying the return value is unsafe. + */ + const char *packet() { return (const char*)this; } + + /* + * Copies packet buffer to packet object. + */ + void populatePacket(const char *buffer) + { + memcpy(this, buffer, PACKET_SIZE); + } +private: + /* + * Reverses bytes in a number. + */ + void reverseBytes_(uint32_t *number); +}; + +#endif // NTP_PACKET_H diff --git a/lib/ArduinoNTPd/NTPServer.cpp b/lib/ArduinoNTPd/NTPServer.cpp new file mode 100644 index 000000000..6ee82bd6c --- /dev/null +++ b/lib/ArduinoNTPd/NTPServer.cpp @@ -0,0 +1,79 @@ +/* + * File: NTPServer.cpp + * Description: + * NTP server implementation. + * Author: Mooneer Salem + * License: New BSD License + */ + + +#include + +#include "NTPPacket.h" +#include "NTPServer.h" + +#define NTP_PORT 123 +#define NTP_TIMESTAMP_DIFF (2208988800) // 1900 to 1970 in seconds + +bool NtpServer::beginListening() +{ + if (timeServerPort_.begin(NTP_PORT)){ + return true; + } + return false; +} + +bool NtpServer::processOneRequest(uint32_t utc, uint32_t millisecs) +{ + // We need the time we've received the packet in our response. + uint32_t recvSecs = utc + NTP_TIMESTAMP_DIFF; + double recvFractDouble = (double)millisecs/0.00023283064365386963; // millisec/((10^6)/(2^32)) + uint32_t recvFract = (double)recvFractDouble; //TODO: really handle this!!! + bool processed = false; + + int packetDataSize = timeServerPort_.parsePacket(); + if (packetDataSize && packetDataSize >= NtpPacket::PACKET_SIZE) + { + // Received what is probably an NTP packet. Read it in and verify + // that it's legit. + NtpPacket packet; + timeServerPort_.read((char*)&packet, NtpPacket::PACKET_SIZE); + // TODO: verify packet. + + // Populate response. + packet.swapEndian(); + packet.leapIndicator(0); + packet.versionNumber(4); + packet.mode(4); + packet.stratum = 2; // I guess stratum 1 is too optimistic + packet.poll = 10; // 6-10 per RFC 5905. + packet.precision = -21; // ~0.5 microsecond precision. + packet.rootDelay = 0; //60 * (0xFFFF / 1000); // ~60 milliseconds, TBD + packet.rootDispersion = 0; //10 * (0xFFFF / 1000); // ~10 millisecond dispersion, TBD + packet.referenceId[0] = 'G'; + packet.referenceId[1] = 'P'; + packet.referenceId[2] = 'S'; + packet.referenceId[3] = 0; + packet.referenceTimestampSeconds = utc; + packet.referenceTimestampFraction = recvFract; + packet.originTimestampSeconds = packet.transmitTimestampSeconds; + packet.originTimestampFraction = packet.transmitTimestampFraction; + packet.receiveTimestampSeconds = recvSecs; + packet.receiveTimestampFraction = recvFract; + + // ...and the transmit time. + // timeSource_.now(&packet.transmitTimestampSeconds, &packet.transmitTimestampFraction); + + // Now transmit the response to the client. + packet.swapEndian(); + timeServerPort_.beginPacket(timeServerPort_.remoteIP(), timeServerPort_.remotePort()); + for (int count = 0; count < NtpPacket::PACKET_SIZE; count++) + { + timeServerPort_.write(packet.packet()[count]); + } + timeServerPort_.endPacket(); + processed = true; + } + + return processed; +} \ No newline at end of file diff --git a/lib/ArduinoNTPd/NTPServer.h b/lib/ArduinoNTPd/NTPServer.h new file mode 100644 index 000000000..121d905ce --- /dev/null +++ b/lib/ArduinoNTPd/NTPServer.h @@ -0,0 +1,35 @@ +/* + * File: NTPServer.h + * Description: + * NTP server implementation. + * Author: Mooneer Salem + * License: New BSD License + */ + +#ifndef NTP_SERVER_H +#define NTP_SERVER_H + +class NtpServer +{ +public: + NtpServer(WiFiUDP Port) + { + timeServerPort_=Port; + } + + /* + * Begins listening for NTP requests. + */ + bool beginListening(void); + + + /* + * Processes a single NTP request. + */ + bool processOneRequest(uint32_t utc, uint32_t millisecs); + +private: + WiFiUDP timeServerPort_; +}; + +#endif // NTP_SERVER_H 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 100755 --- 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 100755 --- 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 100755 --- 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/esp-knx-ip-0.5.2/esp-knx-ip.h b/lib/esp-knx-ip-0.5.2/esp-knx-ip.h index eb5ecf7b0..7c6377bec 100644 --- a/lib/esp-knx-ip-0.5.2/esp-knx-ip.h +++ b/lib/esp-knx-ip-0.5.2/esp-knx-ip.h @@ -32,8 +32,18 @@ #define DISABLE_RESTORE_BUTTON 1 // [Default 0] Set to 1 to disable the "restore defaults" button in the web ui. // These values normally don't need adjustment -#define MULTICAST_PORT 3671 // [Default 3671] +#ifndef MULTICAST_IP #define MULTICAST_IP IPAddress(224, 0, 23, 12) // [Default IPAddress(224, 0, 23, 12)] +#else +#warning USING CUSTOM MULTICAST_IP +#endif + +#ifndef MULTICAST_PORT +#define MULTICAST_PORT 3671 // [Default 3671] +#else +#warning USING CUSTOM MULTICAST_PORT +#endif + #define SEND_CHECKSUM 0 // Uncomment to enable printing out debug messages. 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 d47eadafb..198e47264 100755 --- a/platformio.ini +++ b/platformio.ini @@ -20,7 +20,7 @@ default_envs = ; tasmota ; tasmota-ircustom ; alternative to 'tasmota' with full IR protocols activated, you will need to disable some features to keep code not too big ; tasmota-minimal -; tasmota-basic +; tasmota-lite ; tasmota-knx ; tasmota-sensors ; tasmota-display @@ -40,6 +40,7 @@ default_envs = ; tasmota-NL ; tasmota-PL ; tasmota-PT +; tasmota-RO ; tasmota-RU ; tasmota-SE ; tasmota-SK @@ -56,8 +57,10 @@ default_envs = framework = arduino board = esp01_1m board_build.flash_mode = dout +board_build.ldscript = eagle.flash.1m.ld platform = ${core_active.platform} +platform_packages = ${core_active.platform_packages} build_flags = ${core_active.build_flags} ; ********************************************************************* @@ -87,14 +90,25 @@ 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} [core_2_6_1] ; *** Esp8266 core for Arduino version 2.6.1 platform = espressif8266@2.3.0 +platform_packages = build_flags = ${esp82xx_defaults.build_flags} -Wl,-Teagle.flash.1m.ld -DBEARSSL_SSL_BASIC diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index ad669b0a7..fd5c86fdc 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -17,9 +17,9 @@ default_envs = ; *** Uncomment the line(s) below to select version(s) tasmota ; tasmota-debug -; tasmota-ircustom ; alternative to 'tasmota' with full IR protocols activated, you will need to disable some features to keep code not too big +; tasmota-ircustom ; tasmota-minimal -; tasmota-basic +; tasmota-lite ; tasmota-knx ; tasmota-sensors ; tasmota-display @@ -28,6 +28,7 @@ default_envs = [common] platform = ${core_active.platform} +platform_packages = ${core_active.platform_packages} build_flags = ${core_active.build_flags} ; *** Use settings from file user_config_override.h -DUSE_CONFIG_OVERRIDE @@ -35,7 +36,7 @@ build_flags = ${core_active.build_flags} ; *** Optional Firmware configurations ; -DFIRMWARE_MINIMAL ; -DFIRMWARE_SENSORS -; -DFIRMWARE_BASIC +; -DFIRMWARE_LITE ; -DFIRMWARE_KNX_NO_EMULATION ; -DFIRMWARE_DISPLAYS ; -DFIRMWARE_IR @@ -53,31 +54,44 @@ build_flags = ${core_active.build_flags} upload_port = COM5 extra_scripts = ${scripts_defaults.extra_scripts} + pio/gzip-firmware.py pio/obj-dump.py ; *** Upload file to OTA server using SCP ;upload_port = user@host:/path ;extra_scripts = ${scripts_defaults.extra_scripts} -; pio/strip-floats.py, pio/sftp-uploader.py +; pio/strip-floats.py +; pio/sftp-uploader.py ; *** Upload file to OTA server in folder api/arduino using HTTP ;upload_port = domus1:80/api/upload-arduino.php ;extra_scripts = ${scripts_defaults.extra_scripts} -; pio/strip-floats.py, pio/http-uploader.py +; pio/strip-floats.py +; pio/http-uploader.py [core_active] ; Select one core set for platform and build_flags -platform = ${core_2_6_1.platform} -build_flags = ${core_2_6_1.build_flags} -;platform = ${core_2_6_2.platform} -;build_flags = ${core_2_6_2.build_flags} +;platform = ${core_2_6_1.platform} +;platform_packages = ${core_2_6_1.platform_packages} +;build_flags = ${core_2_6_1.build_flags} + +;platform = ${core_2_6_3.platform} +;platform_packages = ${core_2_6_3.platform_packages} +;build_flags = ${core_2_6_3.build_flags} + +platform = ${tasmota_core_stage.platform} +platform_packages = ${tasmota_core_stage.platform_packages} +build_flags = ${tasmota_core_stage.build_flags} + ;platform = ${core_stage.platform} +;platform_packages = ${core_stage.platform_packages} ;build_flags = ${core_stage.build_flags} [core_2_6_1] ; *** Esp8266 core for Arduino version 2.6.1 platform = espressif8266@2.3.0 +platform_packages = build_flags = ${esp82xx_defaults.build_flags} -Wl,-Teagle.flash.1m.ld -DBEARSSL_SSL_BASIC @@ -119,11 +133,11 @@ build_flags = ${esp82xx_defaults.build_flags} ; -fexceptions ; -lstdc++-exc -[core_2_6_2] -; *** Esp8266 core for Arduino version 2.6.2 -platform = espressif8266@2.3.1 +[core_2_6_3] +; *** Esp8266 core for Arduino version 2.6.3 +platform = espressif8266@2.3.3 +platform_packages = build_flags = ${esp82xx_defaults.build_flags} - -Wl,-Teagle.flash.1m.ld -DBEARSSL_SSL_BASIC ; NONOSDK221 ; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221 @@ -163,11 +177,55 @@ build_flags = ${esp82xx_defaults.build_flags} ; -fexceptions ; -lstdc++-exc +[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} + -DBEARSSL_SSL_BASIC +; NONOSDK221 +; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221 +; NONOSDK22x_190313 +; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190313 +; NONOSDK22x_190703 = 2.2.1+100-dev(38a443e) (Tasmota default) (Firmware 2K smaller than NONOSDK22x_191105) + -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703 +; NONOSDK22x_191024 = 2.2.1+111-dev(5ab15d1) +; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191024 +; NONOSDK22x_191105 = 2.2.1+113-dev(bb83b9b) +; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191105 +; NONOSDK22x_191122 = 2.2.1+119-dev(a58da79) +; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191122 +; NONOSDK3V0 (known issues) +; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK3 +; lwIP 1.4 +; -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH +; lwIP 2 - Low Memory +; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY +; lwIP 2 - Higher Bandwidth +; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH +; lwIP 2 - Higher Bandwidth Low Memory no Features +; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY_LOW_FLASH +; lwIP 2 - Higher Bandwidth no Features (Tasmota default) + -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH +; VTABLES in Flash (Tasmota default) + -DVTABLES_IN_FLASH +; VTABLES in Heap +; -DVTABLES_IN_DRAM +; VTABLES in IRAM +; -DVTABLES_IN_IRAM +; enable one option set -> No exception recommended +; No exception code in firmware + -fno-exceptions + -lstdc++ +; Exception code in firmware /needs much space! 90k +; -fexceptions +; -lstdc++-exc + [core_stage] ; *** Esp8266 core for Arduino version latest beta -platform = https://github.com/platformio/platform-espressif8266.git#feature/stage +platform = espressif8266@2.3.3 +platform_packages = framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git build_flags = ${esp82xx_defaults.build_flags} - -Wl,-Teagle.flash.1m.ld -DBEARSSL_SSL_BASIC ; NONOSDK221 ; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221 diff --git a/platformio_tasmota_env.ini b/platformio_tasmota_env.ini index 46e71d7af..a09f01ecd 100644 --- a/platformio_tasmota_env.ini +++ b/platformio_tasmota_env.ini @@ -1,7 +1,9 @@ [env] platform = ${common.platform} +platform_packages = ${common.platform_packages} framework = ${common.framework} board = ${common.board} +board_build.ldscript = ${common.board_build.ldscript} board_build.flash_mode = ${common.board_build.flash_mode} board_build.f_cpu = ${common.board_build.f_cpu} build_unflags = ${common.build_unflags} @@ -17,8 +19,8 @@ extra_scripts = ${common.extra_scripts} [env:tasmota-minimal] build_flags = ${common.build_flags} -DFIRMWARE_MINIMAL -[env:tasmota-basic] -build_flags = ${common.build_flags} -DFIRMWARE_BASIC +[env:tasmota-lite] +build_flags = ${common.build_flags} -DFIRMWARE_LITE [env:tasmota-knx] build_flags = ${common.build_flags} -DFIRMWARE_KNX_NO_EMULATION @@ -30,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 @@ -80,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 @@ -96,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 1706dbbb3..90f2a711a 100644 --- a/tasmota/CHANGELOG.md +++ b/tasmota/CHANGELOG.md @@ -1,13 +1,210 @@ ## Unreleased (development) +### 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 +- Change 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 command ``SetOption89 0/1`` for Zigbee distinct MQTT topics per device for SENSOR, allowing retained messages (#7835) + +### 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 + +## Released + +### 8.1.0 20191225 + +- Release + +### 8.0.0.3 20191224 + +- Version bump due to internal Settings change + +### 8.0.0.2 20191223 + +- Changed Settings variable namings +- Change number of ``FriendlyName``s from 4 to 8 +- Add Zigbee better support for Xiaomi Double Switch and Xiaomi Vibration sensor +- Add support for ``AdcParam`` parameters to control ADC0 Moisture formula by Federico Leoni (#7309) +- Add commands ``WebButton1`` until ``WebButton16`` to support user defined GUI button text (#7166) + +### 8.0.0.1 20191221 + +- 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) +- 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 Zigbee coalesce sensor attributes into a single message +- Add Deepsleep start delay based on Teleperiod if ``Teleperiod`` differs from 10 or 300 + +### 7.2.0 20191221 + +- Release +- Change basic version string to lite (#7291) +- Fix Arduino IDE compile error (#7277) +- Fix restore ShutterAccuracy, MqttLog, WifiConfig, WifiPower and SerialConfig (#7281) +- Fix no AP on initial install (#7282) +- Fix failing downgrade (#7285) + +### 7.1.2.6 20191214 + +- Change some more Settings locations freeing up space for future single char allowing variable length text +- Change tasmota-basic.bin and FIRMWARE_BASIC to tasmota-lite.bin and FIRMWARE_LITE +- Fix DeepSleep in case there is no wifi by Stefan Bode (#7213) +- Fix Fade would ignore ``savedata 0`` and store to flash anyways (#7262) +- Add Zigbee send automatic ZigbeeRead after sending a command +- Add Zigbee improving Occupancy:false detection for Aqara sensor +- Add fallback support from version 8.x +- Add restriction if fallback firmware is incompatible with settings resulting in unreachable device +- Add support for DHT12 Temperature and Humidity sensor by Stefan Oskamp + +### 7.1.2.5 20191213 + +- Change some Settings locations freeing up space for future single char allowing variable length text +- Add Zigbee support for Xiaomi Aqara Vibration Sensor and Presence Sensor by Stefan Hadinger +- Add Shutter functions ramp up/down and MQTT reporting by Stefan Bode + +### 7.1.2.4 20191209 + +- Change HTTP CORS from command ``SetOption73 0/1`` to ``Cors `` allowing user control of specific CORS domain by Shantur Rathore (#7066) +- Change GUI Shutter button text to Up and Down Arrows based on PR by Xavier Muller (#7166) +- Change amount of supported DHT sensors from 3 to 4 by Xavier Muller (#7167) +- Revert removal of exception details from MQTT info on restart +- Add Wifi Signal Strength in dBm in addition to RSSI Wifi Experience by Andreas Schultz (#7145) +- Add Yaw, Pitch and Roll support for MPU6050 by Philip Barclay (#7058) +- Add reporting of raw weight to JSON from HX711 to overcome auto-tare functionality by @tobox (#7171) +- Add command ``Sensor34 9 `` to set minimum delta to trigger JSON message by @tobox (#7188) +- Fix flashing H801 led at boot by Stefan Hadinger (#7165, #649) +- Fix duplicated ``Backlog`` when using Event inside a Backlog by Adrian Scillato (#7178, #7147) +- Fix Gui Timer when using a negative zero offset of -00:00 by Peter Ooms (#7174) + +### 7.1.2.3 20191208 + +- Change Exception reporting removing exception details from both MQTT info and ``Status 1``. Now consolidated in ``Status 12`` if available. + +### 7.1.2.2 20191206 + +- Remove rule trigger ``tele_power1#state`` due to compatibility +- Add command ``SerialConfig 0..23`` or ``SerialConfig 8N1`` to select Serial Config based in PR by Luis Teixeira (#7108) +- Add save call stack in RTC memory in case of crash, command ``Status 12`` to dump the stack by Stefan Hadinger +- Add Home Assistant force update by Frederico Leoni (#7140, #7074) + +### 7.1.2.1 20191206 + +- Add SML bus decoder syntax support for byte order by Gerhard Mutz (#7112) +- Add rule var ``%topic%`` by Adrian Scillato (#5522) +- Add rule triggers ``tele_power1#state`` and multiple ``tele-wifi1#xxx`` by Adrian Scillato (#7093) +- Add experimental support for stepper motor shutter control by Stefan Bode +- Add optional USE_MQTT_TLS to tasmota-minimal.bin by Bohdan Kmit (#7115) + +### 7.1.2 20191206 + +- Maintenance Release + ### 7.1.1.1 20191201 - Fix lost functionality of GPIO9 and GPIO10 on some devices (#7080) - Fix Zigbee uses Hardware Serial if GPIO 1/3 or GPIO 13/15 and SerialLog 0 (#7071) - Fix WS2812 power control (#7090) -- Change light color schemes 2, 3 and 4 from color wheel to Hue driven - -## Released +- Change light color schemes 2, 3 and 4 from color wheel to Hue driven with user Saturation control +- Change log buffer size from 520 to 700 characters accomodating full rule text (#7110) ### 7.1.1 20191201 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 65f9887a3..09485cff6 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 @@ -50,6 +50,7 @@ #define D_JSON_COUNT "Count" #define D_JSON_COUNTER "Counter" #define D_JSON_CURRENT "Current" // As in Voltage and Current +#define D_JSON_DARKNESS "Darkness" #define D_JSON_DATA "Data" #define D_JSON_DISTANCE "Distance" #define D_JSON_DNSSERVER "DNSServer" @@ -58,6 +59,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" @@ -99,6 +101,7 @@ #define D_JSON_MEMORY_ERROR "Memory error" #define D_JSON_MINIMAL "minimal" #define D_JSON_MODEL "Model" +#define D_JSON_MOISTURE "Moisture" #define D_JSON_MQTT_COUNT "MqttCount" #define D_JSON_NO "No" #define D_JSON_NOISE "Noise" @@ -111,6 +114,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" @@ -134,6 +138,9 @@ #define D_JSON_SELECTED "selected" #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" @@ -179,6 +186,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" @@ -208,6 +216,7 @@ #define D_STATUS9_MARGIN "PTH" #define D_STATUS10_SENSOR "SNS" #define D_STATUS11_STATUS "STS" + #define D_STATUS12_STATUS "STK" #define D_CMND_STATE "State" #define D_CMND_POWER "Power" #define D_CMND_FANSPEED "FanSpeed" @@ -280,12 +289,15 @@ #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_SERIALCONFIG "SerialConfig" #define D_CMND_BAUDRATE "Baudrate" +#define D_CMND_SERIALCONFIG "SerialConfig" #define D_CMND_TEMPLATE "Template" #define D_JSON_NAME "NAME" #define D_JSON_GPIO "GPIO" @@ -330,9 +342,11 @@ #define D_CMND_WEBREFRESH "WebRefresh" #define D_CMND_WEBSEND "WebSend" #define D_CMND_WEBCOLOR "WebColor" +#define D_CMND_WEBBUTTON "WebButton" #define D_CMND_WEBSENSOR "WebSensor" #define D_CMND_EMULATION "Emulation" #define D_CMND_SENDMAIL "Sendmail" +#define D_CMND_CORS "CORS" // Commands xdrv_03_energy.ino #define D_CMND_POWERLOW "PowerLow" @@ -454,42 +468,93 @@ #define D_CMND_LONGITUDE "Longitude" // Commands xdrv_16_tuyadimmer.ino - #define D_CMND_TUYA_MCU "TuyaMCU" #define D_CMND_TUYA_MCU_SEND_STATE "TuyaSend" #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_JSON_ZIGBEE_Status "Status" +#define D_CMND_ZIGBEE_RESET "Reset" #define D_JSON_ZIGBEE_CC2530 "CC2530" -#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_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" - // Commands xdrv_25_A4988_Stepper.ino - #ifdef USE_A4988_STEPPER - #define D_CMND_MOTOR "MOTOR" - #define D_JSON_MOTOR_MOVE "doMove" - #define D_JSON_MOTOR_ROTATE "doRotate" - #define D_JSON_MOTOR_TURN "doTurn" - #define D_JSON_MOTOR_SPR "setSPR" - #define D_JSON_MOTOR_RPM "setRPM" - #define D_JSON_MOTOR_MIS "setMIS" - #endif +// Commands xdrv_25_A4988_Stepper.ino +#define D_CMND_MOTOR "MOTOR" +#define D_JSON_MOTOR_MOVE "doMove" +#define D_JSON_MOTOR_ROTATE "doRotate" +#define D_JSON_MOTOR_TURN "doTurn" +#define D_JSON_MOTOR_SPR "setSPR" +#define D_JSON_MOTOR_RPM "setRPM" +#define D_JSON_MOTOR_MIS "setMIS" + +// Commands xdrv_27_Shutter.ino +#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" +#define D_CMND_SHUTTER_CLOSETIME "CloseDuration" +#define D_CMND_SHUTTER_RELAY "Relay" +#define D_CMND_SHUTTER_SETHALFWAY "SetHalfway" +#define D_CMND_SHUTTER_SETCLOSE "SetClose" +#define D_CMND_SHUTTER_INVERT "Invert" +#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" + +// Commands xdrv_32_hotplug.ino +#define D_CMND_HOTPLUG "HotPlug" + +// Commands xdrv_34_pwm_dimmer.ino +#ifdef USE_PWM_DIMMER +#define D_CMND_BRI_MIN "BriMin" +#define D_CMND_BRI_PRESET "BriPreset" +#endif + +// Commands xsns_02_analog.ino +#define D_CMND_ADCPARAM "AdcParam" /********************************************************************************************/ @@ -567,6 +632,8 @@ 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}"; @@ -584,18 +651,36 @@ 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} = +// {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_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; @@ -614,4 +699,8 @@ const char S_INFORMATION[] PROGMEM = D_INFORMATION; const char S_RESTART[] PROGMEM = D_RESTART; #endif // USE_WEBSERVER +const uint32_t MARKER_START = 0x5AA55AA5; +const uint32_t MARKER_END = 0xA55AA55A; +const uint32_t VERSION_MARKER[] PROGMEM = { MARKER_START, VERSION, MARKER_END }; + #endif // _I18N_H_ diff --git a/tasmota/language/bg-BG.h b/tasmota/language/bg-BG.h index 10f13b786..589e74a90 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 @@ -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 v6.5.0.8 + * Updated until v7.1.2.4 \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Хладна" #define D_COMMAND "Команда" #define D_CONNECTED "Свързан" +#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 "Тъмна" @@ -112,8 +114,9 @@ #define D_LIGHT "Светлина" #define D_LWT "LWT" #define D_MODULE "Модул" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" -#define D_MULTI_PRESS "множествено натискане" +#define D_MULTI_PRESS "неколкократно натискане" #define D_NOISE "Шум" #define D_NONE "Няма" #define D_OFF "Изкл." @@ -134,6 +137,7 @@ #define D_PROGRAM_SIZE "Размер на програмата" #define D_PROJECT "Проект" #define D_RAIN "Дъжд" +#define D_RANGE "Range" #define D_RECEIVED "Получено" #define D_RESTART "Рестарт" #define D_RESTARTING "Рестартиране" @@ -285,10 +289,10 @@ #define D_LOGGING_PARAMETERS "Параметри на лога" #define D_SERIAL_LOG_LEVEL "Степен на серийния лог" -#define D_MQTT_LOG_LEVEL "Mqtt log level" +#define D_MQTT_LOG_LEVEL "Степен на MQTT лога" #define D_WEB_LOG_LEVEL "Степен на уеб лога" #define D_SYS_LOG_LEVEL "Степен на системния лог" -#define D_MORE_DEBUG "Още дебъгване" +#define D_MORE_DEBUG "Допълнителна debug информация" #define D_SYSLOG_HOST "Хост на системния лог" #define D_SYSLOG_PORT "Порт на системния лог" #define D_TELEMETRY_PERIOD "Период на телеметрия" @@ -353,6 +357,7 @@ #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_ERROR_CODE "Код на грешка при зареждането" #define D_ENTER_COMMAND "Въвеждане на команда" @@ -382,7 +387,7 @@ #define D_HUE "Hue" #define D_HUE_BRIDGE_SETUP "Настройка на Hue bridge" -#define D_HUE_API_NOT_IMPLEMENTED "Hue API не е внедрено" +#define D_HUE_API_NOT_IMPLEMENTED "Hue API не е внедрен" #define D_HUE_API "Hue API" #define D_HUE_POST_ARGS "Hue POST аргументи" #define D_3_RESPONSE_PACKETS_SENT "Изпратени са 3 пакета за отговор" @@ -444,17 +449,17 @@ #define D_ENERGY_TOTAL "Използвана енергия общо" // xdrv_27_shutter.ino -#define D_OPEN "Open" -#define D_CLOSE "Close" -#define D_DOMOTICZ_SHUTTER "Shutter" +#define D_OPEN "Отворена" +#define D_CLOSE "Затворена" +#define D_DOMOTICZ_SHUTTER "Щора" // xdrv_28_pcf8574.ino -#define D_CONFIGURE_PCF8574 "Configure PCF8574" -#define D_PCF8574_PARAMETERS "PCF8574 parameters" -#define D_INVERT_PORTS "Invert Ports" -#define D_DEVICE "Device" -#define D_DEVICE_INPUT "Input" -#define D_DEVICE_OUTPUT "Output" +#define D_CONFIGURE_PCF8574 "Конфигуриране на PCF8574" +#define D_PCF8574_PARAMETERS "PCF8574 параметри" +#define D_INVERT_PORTS "Обърни портовете" +#define D_DEVICE "Устройство" +#define D_DEVICE_INPUT "Вход" +#define D_DEVICE_OUTPUT "Изход" // xsns_05_ds18b20.ino #define D_SENSOR_BUSY "Датчикът DS18x20 е зает" @@ -501,7 +506,7 @@ //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 "И" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "A" @@ -664,7 +678,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 "Изходна активна мощност" @@ -673,29 +687,43 @@ #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" -#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 "Слънчева мощност" +#define D_INVERTER_POWER "Мощност на инвертера" +#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 "Грешка - друго оборудване" + +//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 639a0a184..d663724b7 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Studené světlo" #define D_COMMAND "Příkaz" #define D_CONNECTED "...připojeno" +#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ý" @@ -82,7 +84,7 @@ #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ž" @@ -112,6 +114,7 @@ #define D_LIGHT "Světlo" #define D_LWT "LWT" #define D_MODULE "Modul" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "několikeré-stisknutí" #define D_NOISE "Hluk" @@ -134,6 +137,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í" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Chyba smazání RF chipu" #define D_UPLOAD_ERR_12 "Chyba při zápisu do RF chipu" #define D_UPLOAD_ERR_13 "Chyba dekódování RF firmwaru" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Chyba nahrávání" #define D_ENTER_COMMAND "Vlož příkaz" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "A" @@ -640,7 +654,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³" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 75bf51435..7f59a6b16 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 v6.6.0.21 + * 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,13 +66,15 @@ #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" #define D_CONNECTED "verbunden" +#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" @@ -82,7 +84,7 @@ #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" @@ -112,6 +114,7 @@ #define D_LIGHT "Licht" #define D_LWT "LWT" #define D_MODULE "Modul" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "Mehrfachdruck" #define D_NOISE "Lautstärke" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "RF Chip löschen fehlgeschlagen" #define D_UPLOAD_ERR_12 "RF Chip beschreiben fehlgeschlagen" #define D_UPLOAD_ERR_13 "RF Firmware ungültig" +#define D_UPLOAD_ERR_14 "Nicht kompatibel" #define D_UPLOAD_ERROR_CODE "Upload Fehler Nummer" #define D_ENTER_COMMAND "Befehl eingeben" @@ -499,10 +504,10 @@ #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" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "A" @@ -643,7 +657,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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 0583c17e8..ddd34c944 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 @@ -72,7 +72,9 @@ #define D_COMMAND "Εντολή" #define D_CONNECTED "Συνδεδεμένο" #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 "Σκοτεινό" @@ -82,7 +84,7 @@ #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 "Διαγραφή" @@ -112,6 +114,7 @@ #define D_LIGHT "Φως" #define D_LWT "LWT" #define D_MODULE "Μονάδα" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "ανίχνευση για πολλαπλά πατήματα" #define D_NOISE "Θόρυβος" @@ -134,6 +137,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 "Επανεκκινεί" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Αποτυχία σβησίματος στο RF chip" #define D_UPLOAD_ERR_12 "Αποτυχία εγγραφής στο RF chip" #define D_UPLOAD_ERR_13 "Failed to decode RF firmware" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Κωδικός λάθους στη μεταφόρτωση" #define D_ENTER_COMMAND "Εισαγωγή εντολής" @@ -501,7 +506,7 @@ //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 "Α" @@ -560,7 +565,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" @@ -629,23 +634,32 @@ #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" // 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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 15e880600..c10378d94 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 @@ -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 v6.2.1.11 + * Updated until v8.0.0.0 \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Cold" #define D_COMMAND "Command" #define D_CONNECTED "Connected" +#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" @@ -82,7 +84,7 @@ #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" @@ -112,6 +114,7 @@ #define D_LIGHT "Light" #define D_LWT "LWT" #define D_MODULE "Module" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-press" #define D_NOISE "Noise" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Failed to erase RF chip" #define D_UPLOAD_ERR_12 "Failed to write to RF chip" #define D_UPLOAD_ERR_13 "Failed to decode RF firmware" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Upload error code" #define D_ENTER_COMMAND "Enter command" @@ -475,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" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,23 +634,32 @@ #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" // 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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 7f1ac36d6..dde47b382 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,18 +71,20 @@ #define D_COLDLIGHT "Fría" #define D_COMMAND "Comando" #define D_CONNECTED "Conectado" +#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_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" @@ -112,6 +114,7 @@ #define D_LIGHT "Luz" #define D_LWT "LWT" #define D_MODULE "Módulo" +#define D_MOISTURE "Humedad del Suelo" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-press" #define D_NOISE "Ruido" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "No se pudo borrar en el chip RF" #define D_UPLOAD_ERR_12 "No se puedo escribir en el chip RF" #define D_UPLOAD_ERR_13 "No se pudo decodificar firmware RF" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Código de error de carga" #define D_ENTER_COMMAND "Ingresar comando" @@ -501,7 +506,7 @@ //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" @@ -510,7 +515,7 @@ // 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" @@ -560,7 +565,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" @@ -626,26 +631,35 @@ #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" // 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" @@ -664,7 +678,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" @@ -673,12 +687,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" @@ -698,4 +713,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 446485462..243ae74c3 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 v6.6.0.15 + * 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,8 +71,10 @@ #define D_COLDLIGHT "Froid" #define D_COMMAND "Commande" #define D_CONNECTED "Connecté" +#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" @@ -82,7 +84,7 @@ #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" @@ -112,6 +114,7 @@ #define D_LIGHT "Lumière" #define D_LWT "LWT" #define D_MODULE "Module" +#define D_MOISTURE "Humidité" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-pression" #define D_NOISE "Bruit" @@ -134,6 +137,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" @@ -281,7 +285,7 @@ #define D_MQTT_PARAMETERS "Paramètres MQTT" #define D_CLIENT "Client" -#define D_FULL_TOPIC "topic complet" +#define D_FULL_TOPIC "Topic complet" #define D_LOGGING_PARAMETERS "Paramètres du journal" #define D_SERIAL_LOG_LEVEL "Niveau de journalisation série" @@ -353,6 +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 "Incompatible" #define D_UPLOAD_ERROR_CODE "Code d'erreur téléchargement" #define D_ENTER_COMMAND "Saisir une commande" @@ -498,10 +503,10 @@ #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" @@ -519,7 +524,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" @@ -527,15 +532,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" @@ -543,28 +548,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" @@ -573,8 +578,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" @@ -582,13 +587,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" @@ -596,18 +601,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" @@ -618,17 +623,26 @@ #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_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" // Units #define D_UNIT_AMPERE "A" @@ -643,7 +657,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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -688,7 +703,7 @@ #define D_CHECKING "En test" #define D_WORKING "En marche" #define D_FAILURE "Défault" -#define D_SOLAX_ERROR_0 "Aucun Code d'erreur" +#define D_SOLAX_ERROR_0 "Aucun code d'erreur" #define D_SOLAX_ERROR_1 "Défaut Perte de réseau" #define D_SOLAX_ERROR_2 "Défaut Tension réseau" #define D_SOLAX_ERROR_3 "Défaut Fréquence réseau" @@ -698,4 +713,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 1c9eed40a..87614e04f 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "אור קר" #define D_COMMAND "פקודה" #define D_CONNECTED "מחובר" +#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 "חושך" @@ -82,7 +84,7 @@ #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 "מחיקה" @@ -112,6 +114,7 @@ #define D_LIGHT "אור" #define D_LWT "LWT" #define D_MODULE "מודול" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "לחיצה מרובה" #define D_NOISE "רעש" @@ -134,6 +137,7 @@ #define D_PROGRAM_SIZE "גודל תוכנית" #define D_PROJECT "פרויקט" #define D_RAIN "גשם" +#define D_RANGE "Range" #define D_RECEIVED "התקבל" #define D_RESTART "איתחול" #define D_RESTARTING "הפעלה מחדש" @@ -353,6 +357,7 @@ #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_ERROR_CODE "שגיאת קוד העלאה" #define D_ENTER_COMMAND "הקש פקודה" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,23 +634,32 @@ #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" // 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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 f34b2cbb3..280a617f7 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Hideg fény" #define D_COMMAND "Parancs" #define D_CONNECTED "Csatlakoztatva" +#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ő" @@ -82,7 +84,7 @@ #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" @@ -112,6 +114,7 @@ #define D_LIGHT "Fény" #define D_LWT "LWT" #define D_MODULE "Modul" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "több lenyomás" #define D_NOISE "Zaj" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Az RF chip törlése sikertelen" #define D_UPLOAD_ERR_12 "Az RF chip írása sikertelen" #define D_UPLOAD_ERR_13 "Az RF firmware dekódolása sikertelen" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Feltöltési hibakód" #define D_ENTER_COMMAND "Kérem a parancsot..." @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "A" @@ -640,11 +654,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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 5de100fee..d52b9de02 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Fredda" #define D_COMMAND "Comando" #define D_CONNECTED "Connesso" +#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" @@ -82,7 +84,7 @@ #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" @@ -112,6 +114,7 @@ #define D_LIGHT "Luce" #define D_LWT "LWT" #define D_MODULE "Modulo" +#define D_MOISTURE "Umidità" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-pressione" #define D_NOISE "Rumore" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Cancellazione fallita del chip RF" #define D_UPLOAD_ERR_12 "Scrittura fallita del chip RF" #define D_UPLOAD_ERR_13 "Decodifica fallita del firmware RF" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Codice errore invio" #define D_ENTER_COMMAND "Inserire comando" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,23 +634,32 @@ #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" // 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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 65c045f3f..5c015f09b 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 @@ -72,7 +72,9 @@ #define D_COMMAND "커맨드" #define D_CONNECTED "연결됨" #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 "어둡게" @@ -82,7 +84,7 @@ #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 "삭제" @@ -112,6 +114,7 @@ #define D_LIGHT "밝게" #define D_LWT "LWT" #define D_MODULE "모듈" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-press" #define D_NOISE "소음" @@ -134,6 +137,7 @@ #define D_PROGRAM_SIZE "프로그램 용량" #define D_PROJECT "프로젝트" #define D_RAIN "비" +#define D_RANGE "Range" #define D_RECEIVED "받음" #define D_RESTART "재시작" #define D_RESTARTING "재시작 중.." @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "RF 칩 삭제 실패" #define D_UPLOAD_ERR_12 "RF 칩 쓰기 실패" #define D_UPLOAD_ERR_13 "RF 펌웨어 decode 실패" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "업로드 에러 코드" #define D_ENTER_COMMAND "커맨드 입력" @@ -501,8 +506,8 @@ //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" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "A" @@ -640,10 +654,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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 541b9bdc6..624bef70f 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 @@ -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 v6.7.0 + * Updated until v8.0.0 \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -72,7 +72,9 @@ #define D_COMMAND "Opdracht" #define D_CONNECTED "Verbonden" #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" @@ -82,7 +84,7 @@ #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" @@ -112,6 +114,7 @@ #define D_LIGHT "Licht" #define D_LWT "LWT" #define D_MODULE "Module" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "meervoudig" #define D_NOISE "Lawaai" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Wissen RF chip mislukt" #define D_UPLOAD_ERR_12 "Opwaarderen RF chip mislukt" #define D_UPLOAD_ERR_13 "Decoderen RF bestand mislukt" +#define D_UPLOAD_ERR_14 "Niet geschikt" #define D_UPLOAD_ERROR_CODE "Opwaardeer foutcode" #define D_ENTER_COMMAND "Geef opdracht" @@ -478,12 +483,12 @@ #define D_PARTICALS_BEYOND "Stofdeeltjes" // xsns_32_mpu6050.ino -#define D_AX_AXIS "Accel. X-Axis" -#define D_AY_AXIS "Accel. Y-Axis" -#define D_AZ_AXIS "Accel. Z-Axis" -#define D_GX_AXIS "Gyro X-Axis" -#define D_GY_AXIS "Gyro Y-Axis" -#define D_GZ_AXIS "Gyro Z-Axis" +#define D_AX_AXIS "Versn. X-as" +#define D_AY_AXIS "Versn. Y-as" +#define D_AZ_AXIS "Versn. Z-as" +#define D_GX_AXIS "Gyro X-as" +#define D_GY_AXIS "Gyro Y-as" +#define D_GZ_AXIS "Gyro Z-as" // xsns_34_hx711.ino #define D_HX_CAL_REMOVE "Verwijder gewicht" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -626,9 +631,18 @@ #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" // Units #define D_UNIT_AMPERE "A" @@ -643,7 +657,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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 dbb7339d3..a7fa58199 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,8 +71,10 @@ #define D_COLDLIGHT "Zimny" #define D_COMMAND "Komenda" #define D_CONNECTED "Połączony" +#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" @@ -82,7 +84,7 @@ #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ść" @@ -112,6 +114,7 @@ #define D_LIGHT "Światło" #define D_LWT "LWT" #define D_MODULE "Moduł" +#define D_MOISTURE "Wilgotność" #define D_MQTT "MQTT" #define D_MULTI_PRESS "Wielokrotne naciśnięcie" #define D_NOISE "Szum" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Błąd kasowania układu RF" #define D_UPLOAD_ERR_12 "Błąd zapisu układu RF" #define D_UPLOAD_ERR_13 "Błąd dekodowania oprrogramowania układu RF" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Błąd wgrywania" #define D_ENTER_COMMAND "Wprowadź polecenie" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "A" @@ -640,12 +654,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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 774514152..9d6daa244 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Luz fria" #define D_COMMAND "Comando" #define D_CONNECTED "Ligado" +#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" @@ -82,7 +84,7 @@ #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" @@ -112,6 +114,7 @@ #define D_LIGHT "Luz" #define D_LWT "LWT" #define D_MODULE "Módulo" +#define D_MOISTURE "Umidade" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-pressão" #define D_NOISE "Ruído" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Falha ao apagar o chip RF" #define D_UPLOAD_ERR_12 "Falha ao escrever o chip RF" #define D_UPLOAD_ERR_13 "Falha ao decodificar o firmware de RF" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Código de erro do envio" #define D_ENTER_COMMAND "Inserir comando" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "A" @@ -640,12 +654,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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 27987acf0..d7260ca6a 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Luz Fria" #define D_COMMAND "Comando" #define D_CONNECTED "Ligado" +#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" @@ -82,7 +84,7 @@ #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" @@ -112,6 +114,7 @@ #define D_LIGHT "Luz" #define D_LWT "LWT" #define D_MODULE "Módulo" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-pressão" #define D_NOISE "Ruído" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Falha ao apagar o chip de RF" #define D_UPLOAD_ERR_12 "Falha ao escrever no chip de RF" #define D_UPLOAD_ERR_13 "Falha ao descodificar o firmware RF" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Código de erro do envio" #define D_ENTER_COMMAND "Inserir comando" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,23 +634,32 @@ #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" // 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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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..2db7cf4ba --- /dev/null +++ b/tasmota/language/ro-RO.h @@ -0,0 +1,728 @@ +/* + 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_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 "Abilitat" +#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 "Încarcare" +#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 "Query 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 fabrica" +#define D_ERASED_SECTOR "Sector șters" + +// xdrv_02_webserver.ino +#define D_NOSCRIPT "Pentru a folosi Tasmota, vă rugăm abilitaț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 "Altă configurare" +#define D_CONFIRM_RESET_CONFIGURATION "Confirmă Reset Configurare" +#define D_RESET_CONFIGURATION "Reseteaza 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 "Abilitare 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 "Versiunea Program" +#define D_BUILD_DATE_AND_TIME "Creare Data & Timp" +#define D_CORE_AND_SDK_VERSION "Versiunea 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 "Listă MQTT" +#define D_MQTT_GROUP_TOPIC "Listă Grup MQTT" +#define D_MQTT_FULL_TOPIC "Listă Întreagă 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 "Actualizat de web server" +#define D_OTA_URL "OTA Url" +#define D_START_UPGRADE "Porneste actualizare" +#define D_UPGRADE_BY_FILE_UPLOAD "Actualizare cu î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ă. Abilitează logging 3" +#define D_UPLOAD_ERR_7 "Încărcare aulată" +#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 "Abilitează weblog 2 dacă există răspunsul așteptat" +#define D_NEED_USER_AND_PASSWORD "Necesită utilizator=&parolă=" + +// xdrv_01_mqtt.ino +#define D_FINGERPRINT "Verifică amprenta 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 dezabilitat" +#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 Cronometrare" + +// xdrv_09_timers.ino +#define D_CONFIGURE_TIMER "Configurare Cronometrare" +#define D_TIMER_PARAMETERS "Parameteri Cronometrare" +#define D_TIMER_ENABLE "Abilitează Cronometrare" +#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 "Abilitează 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" + +// 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" + +// 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 "abilitează 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 cd734a575..ed3fe87be 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Холодный" #define D_COMMAND "Команда" #define D_CONNECTED "Соединен" +#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 "Темный" @@ -82,7 +84,7 @@ #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 "Стирать" @@ -112,6 +114,7 @@ #define D_LIGHT "Свет" #define D_LWT "LWT" #define D_MODULE "Модуль" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "многократное нажатие" #define D_NOISE "Шум" @@ -134,6 +137,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 "Перезапуск" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Failed to erase RF chip" #define D_UPLOAD_ERR_12 "Failed to write to RF chip" #define D_UPLOAD_ERR_13 "Failed to decode RF firmware" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Код ошибки загрузки" #define D_ENTER_COMMAND "Введите команду" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "А" @@ -643,7 +657,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 "мА" @@ -664,7 +678,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 "Экспорт активной мощности" @@ -673,6 +687,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" @@ -698,4 +713,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 0accdc407..585052498 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Studené svetlo" #define D_COMMAND "Príkaz" #define D_CONNECTED "...pripojené" +#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" @@ -83,7 +85,7 @@ #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ž" @@ -112,6 +114,7 @@ #define D_LIGHT "Svetlo" #define D_LWT "LWT" #define D_MODULE "Modul" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-stlačenie" #define D_NOISE "Hluk" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Chyba zmazania RF chipu" #define D_UPLOAD_ERR_12 "Chyba pri zápise do RF chipu" #define D_UPLOAD_ERR_13 "Chyba dekódovania RF firmwaru" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Chyba nahrávania" #define D_ENTER_COMMAND "Vlož príkaz" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "A" @@ -640,12 +654,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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 30de42797..58ea66d3b 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Kallt" #define D_COMMAND "Kommando" #define D_CONNECTED "Ansluten" +#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" @@ -82,7 +84,7 @@ #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" @@ -112,6 +114,7 @@ #define D_LIGHT "Ljus" #define D_LWT "LWT" #define D_MODULE "Modul" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "fler tryck" #define D_NOISE "Oväsen" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Misslyckades rensa RF chip" #define D_UPLOAD_ERR_12 "Misslyckades skriva till RF chip" #define D_UPLOAD_ERR_13 "Misslyckades avkoda RF firmware" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Uppladdningsfelkod" #define D_ENTER_COMMAND "Ange kommando" @@ -501,7 +506,7 @@ //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 "Ö" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "A" @@ -640,12 +654,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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 cea928af7..e92a9584b 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "Soğuk" #define D_COMMAND "Komut" #define D_CONNECTED "Bağlandı" +#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" @@ -82,7 +84,7 @@ #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" @@ -112,6 +114,7 @@ #define D_LIGHT "Işık" #define D_LWT "LWT" #define D_MODULE "Modül" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-press" #define D_NOISE "Noise" @@ -134,6 +137,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" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Failed to erase RF chip" #define D_UPLOAD_ERR_12 "Failed to write to RF chip" #define D_UPLOAD_ERR_13 "Failed to decode RF firmware" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "Upload error code" #define D_ENTER_COMMAND "Komut girişi" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,23 +634,32 @@ #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" // 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" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 80% rename from tasmota/language/uk-UK.h rename to tasmota/language/uk-UA.h index 890c40b9c..45a5621af 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,26 +71,28 @@ #define D_COLDLIGHT "Холодний" #define D_COMMAND "Команда" #define D_CONNECTED "Під'єднано" -#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_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 "Потік" @@ -105,35 +107,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 "Волога" #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 "Перезавантаження" @@ -193,7 +197,7 @@ #define D_SET_SERIAL_CONFIG_TO "Set serial port mode to" #define D_RECEIVED_TOPIC "Отриманий Топік" #define D_DATA_SIZE "Розмір даних" -#define D_ANALOG_INPUT "Напруга" +#define D_ANALOG_INPUT "Аналоговий вхід" // support.ino #define D_OSWATCH "osWatch" @@ -202,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 не знайдено" @@ -212,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 "Стерто сектор" @@ -229,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 "Спроба підключення пристрою до мережі" @@ -285,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 "Параметри шаблона" @@ -327,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 "Завантаження почалось" @@ -349,10 +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 "Не сумісно" #define D_UPLOAD_ERROR_CODE "Код помилки завантаження" #define D_ENTER_COMMAND "Уведіть команду" @@ -361,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 "Небезпечне з'єднання, недійсний відбиток" @@ -412,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 "Дія" @@ -457,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 "Тайм-аут, в очікуванні" @@ -469,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 @@ -501,7 +506,7 @@ //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 "Сх" @@ -541,7 +546,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" @@ -560,9 +565,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" @@ -626,45 +631,54 @@ #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" // 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 "Активна вихід" @@ -673,29 +687,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 178497a88..3e7e108bc 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "冷" #define D_COMMAND "命令:" #define D_CONNECTED "已连接" +#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 "暗" @@ -82,7 +84,7 @@ #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 "擦除" @@ -112,6 +114,7 @@ #define D_LIGHT "灯" #define D_LWT "LWT" #define D_MODULE "模块" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "多次按键" #define D_NOISE "嘈杂" @@ -134,6 +137,7 @@ #define D_PROGRAM_SIZE "固件大小" #define D_PROJECT "项目:" #define D_RAIN "降水量" +#define D_RANGE "Range" #define D_RECEIVED "已接收" #define D_RESTART "重启" #define D_RESTARTING "正在重启" @@ -353,6 +357,7 @@ #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_ERROR_CODE "上传错误代码" #define D_ENTER_COMMAND "输入命令" @@ -501,7 +506,7 @@ //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 "东" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "安" @@ -664,7 +678,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 "有功输出" @@ -673,6 +687,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" @@ -698,4 +713,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 5862f4b5b..c7416df0e 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 @@ -71,8 +71,10 @@ #define D_COLDLIGHT "冷" #define D_COMMAND "命令:" #define D_CONNECTED "已連接" +#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" @@ -82,7 +84,7 @@ #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 "刪除" @@ -112,6 +114,7 @@ #define D_LIGHT "燈" #define D_LWT "LWT" #define D_MODULE "模組" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "多次按鍵" #define D_NOISE "雜訊" @@ -134,6 +137,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 "正在重啟" @@ -353,6 +357,7 @@ #define D_UPLOAD_ERR_11 "Failed to erase RF chip" #define D_UPLOAD_ERR_12 "Failed to write to RF chip" #define D_UPLOAD_ERR_13 "Failed to decode RF firmware" +#define D_UPLOAD_ERR_14 "Not compatible" #define D_UPLOAD_ERROR_CODE "上傳錯誤代碼" #define D_ENTER_COMMAND "輸入命令" @@ -501,7 +506,7 @@ //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" @@ -560,7 +565,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" @@ -629,6 +634,15 @@ #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" // Units #define D_UNIT_AMPERE "安" @@ -664,7 +678,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" @@ -673,6 +687,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" @@ -698,4 +713,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 7ef154d53..a62c6d191 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,27 +117,42 @@ #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) #define WEB_PASSWORD "" // [WebPassword] Web server Admin mode Password for WEB_USERNAME (empty string = Disable) #define FRIENDLY_NAME "Tasmota" // [FriendlyName] Friendlyname up to 32 characters used by webpages and Alexa #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 @@ -180,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) @@ -213,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 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 * @@ -260,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 @@ -284,14 +351,14 @@ #define DOMOTICZ_OUT_TOPIC "domoticz/out" // Domoticz Output Topic // -- MQTT - Home Assistant Discovery ------------- -#define USE_HOME_ASSISTANT // Enable Home Assistant Discovery Support (+7k code) +#define USE_HOME_ASSISTANT // Enable Home Assistant Discovery Support (+4.1k code, +6 bytes mem) #define HOME_ASSISTANT_DISCOVERY_PREFIX "homeassistant" // Home Assistant discovery prefix // -- MQTT - TLS - AWS IoT ------------------------ // Using TLS starting with version v6.5.0.16 compilation will only work using Core 2.4.2 and 2.5.2. No longer supported: 2.3.0 //#define USE_MQTT_TLS // Use TLS for MQTT connection (+34.5k code, +7.0k mem and +4.8k additional during connection handshake) // #define USE_MQTT_TLS_CA_CERT // Force full CA validation instead of fingerprints, slower, but simpler to use. (+2.2k code, +1.9k mem during connection handshake) - // This includes the LetsEncrypt CA in tasmota_ca.ino for verifying server certificates + // This includes the LetsEncrypt CA in tasmota_ca.ino for verifying server certificates // #define USE_MQTT_TLS_FORCE_EC_CIPHER // Force Elliptic Curve cipher (higher security) required by some servers (automatically enabled with USE_MQTT_AWS_IOT) (+11.4k code, +0.4k mem) // #define USE_MQTT_AWS_IOT // Enable MQTT for AWS IoT - requires a private key (+11.9k code, +0.4k mem) // Note: you need to generate a private key + certificate per device and update 'tasmota/tasmota_aws_iot.cpp' @@ -344,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 (+4k5 code) + #define USE_PWM_DIMMER_REMOTE // Add support for remote switches to PWM Dimmer, also adds device groups support (+0k7 code, also includes device groups) +//#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 // @@ -373,25 +446,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) @@ -417,6 +490,12 @@ // #define USE_PAJ7620 // [I2cDriver34] Enable PAJ7620 gesture sensor (I2C address 0x73) (+2.5k code) // #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_DISPLAY // Add I2C Display Support (+2k code) #define USE_DISPLAY_MODES1TO5 // Enable display mode 1 to 5 in addition to mode 0 @@ -436,27 +515,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) @@ -469,6 +552,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 (+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) @@ -488,6 +575,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) @@ -521,23 +611,26 @@ #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 (+35k code, +3.2k 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) #define USE_ZIGBEE_PRECFGKEY_L 0x0F0D0B0907050301L // note: changing requires to re-pair all devices #define USE_ZIGBEE_PRECFGKEY_H 0x0D0C0A0806040200L // note: changing requires to re-pair all devices #define USE_ZIGBEE_PERMIT_JOIN false // don't allow joining by default + #define USE_ZIGBEE_COALESCE_ATTR_TIMER 350 // timer to coalesce attribute values (in ms) // -- 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) @@ -569,7 +662,7 @@ * See RELEASENOTES.md for selected features \*********************************************************************************************/ -//#define FIRMWARE_BASIC // Create tasmota-basic with no sensors +//#define FIRMWARE_LITE // Create tasmota-lite with no sensors //#define FIRMWARE_SENSORS // Create tasmota-sensors with useful sensors enabled //#define FIRMWARE_KNX_NO_EMULATION // Create tasmota-knx with KNX but without Emulation //#define FIRMWARE_DISPLAYS // Create tasmota-display with display drivers enabled diff --git a/tasmota/settings.h b/tasmota/settings.h index a3f5fd63e..673758890 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 @@ -86,13 +86,13 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t energy_weekend : 1; // bit 20 (v6.6.0.8) - CMND_TARIFF uint32_t dds2382_model : 1; // bit 21 (v6.6.0.14) - SetOption71 - Select different Modbus registers for Active Energy (#6531) uint32_t hardware_energy_total : 1; // bit 22 (v6.6.0.15) - SetOption72 - Enable hardware energy total counter as reference (#6561) - uint32_t cors_enabled : 1; // bit 23 (v7.0.0.1) - SetOption73 - Enable HTTP CORS + uint32_t ex_cors_enabled : 1; // bit 23 (v7.0.0.1) - SetOption73 - Enable HTTP CORS uint32_t ds18x20_internal_pullup : 1; // bit 24 (v7.0.0.1) - SetOption74 - Enable internal pullup for single DS18x20 sensor uint32_t grouptopic_mode : 1; // bit 25 (v7.0.0.1) - SetOption75 - GroupTopic replaces %topic% (0) or fixed topic cmnd/grouptopic (1) 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 spare28 : 1; - uint32_t spare29 : 1; + uint32_t compatibility_check : 1; // bit 28 (v7.1.2.6) - SetOption78 - Disable OTA compatibility check + 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; @@ -229,35 +227,9 @@ typedef struct { uint8_t dpid = 0; } TuyaFnidDpidMap; +const uint32_t settings_text_size = 699; // Settings.text_pool[size] = Settings.display_model (2D2) - Settings.text_pool (017) const uint8_t MAX_TUYA_FUNCTIONS = 16; -/** - * Structure used for holding the hardware serial port settings. - * - * Description of the fields: - * - * baudrate - the baud rate multiplier, which can range from 0 - 15360 (multiply by 300 to obtain the actual baud rate) - * mode - encodes a selection of the main serial port settings. - * - * The mode field can take the following values: - * - * 0 - 7N1 (7 data bits / no parity / 1 stop bit) - * 1 - 7E1 (7 data bits / even parity / 1 stop bit) - * 2 - 8N1 (8 data bits / no parity / 1 stop bit) - * 3 - 8E1 (8 data bits / even parity / 1 stop bit) - */ -typedef struct { - uint16_t baudrate; // the baud rate multiplier, which can range from 0 - 15360 (multiply by 300 to obtain the actual baud rate) - uint8_t mode; // encodes a selection of the main serial port settings: 8E1, 8N1, 7E1 and 7N1 -} SerialCfg; - -/* -struct SYSCFG { - unsigned long cfg_holder; // 000 Pre v6 header - unsigned long save_flag; // 004 - unsigned long version; // 008 - unsigned long bootcount; // 00C -*/ struct SYSCFG { uint16_t cfg_holder; // 000 v6 header uint16_t cfg_size; // 002 @@ -268,42 +240,45 @@ struct SYSCFG { SysBitfield flag; // 010 int16_t save_data; // 014 int8_t timezone; // 016 - char ota_url[101]; // 017 - char mqtt_prefix[3][11]; // 07C - uint8_t ex_baudrate; // 09D - Free since 6.6.0.9 - uint8_t seriallog_level; // 09E - uint8_t sta_config; // 09F - uint8_t sta_active; // 0A0 - char sta_ssid[2][33]; // 0A1 - Keep together with sta_pwd as being copied as one chunck with reset 5 - char sta_pwd[2][65]; // 0E3 - Keep together with sta_ssid as being copied as one chunck with reset 5 - char hostname[33]; // 165 - char syslog_host[33]; // 186 - uint8_t rule_stop; // 1A7 - uint16_t syslog_port; // 1A8 - uint8_t syslog_level; // 1AA - uint8_t webserver; // 1AB - uint8_t weblog_level; // 1AC - uint8_t mqtt_fingerprint[2][20]; // 1AD - uint8_t adc_param_type; // 1D5 - uint8_t free_1d6[10]; // 1D6 + // Start of char array storing all parameter strings - SysBitfield4 flag4; // 1E0 + char text_pool[101]; // 017 - was ota_url[101] - size is settings_text_size - uint8_t free_1e4; // 1E4 + char ex_mqtt_prefix[3][11]; // 07C + uint8_t ex_baudrate; // 09D + uint8_t ex_seriallog_level; // 09E + uint8_t ex_sta_config; // 09F + uint8_t ex_sta_active; // 0A0 + char ex_sta_ssid[2][33]; // 0A1 + char ex_sta_pwd[2][65]; // 0E3 + char ex_hostname[33]; // 165 + char ex_syslog_host[33]; // 186 + uint8_t ex_rule_stop; // 1A7 + uint16_t ex_syslog_port; // 1A8 + uint8_t ex_syslog_level; // 1AA + uint8_t ex_webserver; // 1AB + uint8_t ex_weblog_level; // 1AC + uint8_t ex_mqtt_fingerprint[2][20]; // 1AD + uint8_t ex_adc_param_type; // 1D5 + uint8_t ex_free_1d6[10]; // 1D6 + SysBitfield4 ex_flag4; // 1E0 + uint8_t ex_serial_config; // 1E4 + uint8_t ex_wifi_output_power; // 1E5 + uint8_t ex_shutter_accuracy; // 1E6 + uint8_t ex_mqttlog_level; // 1E7 + uint8_t ex_sps30_inuse_hours; // 1E8 + char ex_mqtt_host[33]; // 1E9 + uint16_t ex_mqtt_port; // 20A + char ex_mqtt_client[33]; // 20C + char ex_mqtt_user[33]; // 22D + char ex_mqtt_pwd[33]; // 24E + char ex_mqtt_topic[33]; // 26F + char ex_button_topic[33]; // 290 + char ex_mqtt_grptopic[33]; // 2B1 + + // End of single char array of 698 chars max - uint8_t wifi_output_power; // 1E5 - uint8_t shutter_accuracy; // 1E6 - uint8_t mqttlog_level; // 1E7 - uint8_t sps30_inuse_hours; // 1E8 - char mqtt_host[33]; // 1E9 - Keep together with below as being copied as one chunck with reset 6 - uint16_t mqtt_port; // 20A - Keep together - char mqtt_client[33]; // 20C - Keep together - char mqtt_user[33]; // 22D - Keep together - char mqtt_pwd[33]; // 24E - Keep together - char mqtt_topic[33]; // 26F - Keep together with above items as being copied as one chunck with reset 6 - char button_topic[33]; // 290 - char mqtt_grptopic[33]; // 2B1 uint8_t display_model; // 2D2 uint8_t display_mode; // 2D3 uint8_t display_refresh; // 2D4 @@ -323,8 +298,10 @@ struct SYSCFG { uint8_t param[PARAM8_SIZE]; // 2FC SetOption32 .. SetOption49 int16_t toffset[2]; // 30E uint8_t display_font; // 312 - char state_text[4][11]; // 313 + + char ex_state_text[4][11]; // 313 uint8_t ex_energy_power_delta; // 33F - Free since 6.6.0.20 + uint16_t domoticz_update_timer; // 340 uint16_t pwm_range; // 342 unsigned long domoticz_relay_idx[MAX_DOMOTICZ_IDX]; // 344 @@ -357,10 +334,12 @@ struct SYSCFG { uint16_t light_rotation; // 39E SysBitfield3 flag3; // 3A0 uint8_t switchmode[MAX_SWITCHES]; // 3A4 (6.0.0b - moved from 0x4CA) - char friendlyname[MAX_FRIENDLYNAMES][33]; // 3AC - char switch_topic[33]; // 430 + + char ex_friendlyname[4][33]; // 3AC + char ex_switch_topic[33]; // 430 + char serial_delimiter; // 451 - uint8_t ex_sbaudrate; // 452 - Free since 6.6.0.9 + uint8_t seriallog_level; // 452 uint8_t sleep; // 453 uint16_t domoticz_switch_idx[MAX_DOMOTICZ_IDX]; // 454 uint16_t domoticz_sensor_idx[MAX_DOMOTICZ_SNS_IDX]; // 45C @@ -382,15 +361,21 @@ struct SYSCFG { uint8_t knx_GA_registered; // 4A5 Number of Group Address to read uint16_t light_wakeup; // 4A6 uint8_t knx_CB_registered; // 4A8 Number of Group Address to write - char web_password[33]; // 4A9 + + char ex_web_password[33]; // 4A9 + uint8_t interlock[MAX_INTERLOCKS]; // 4CA - char ntp_server[3][33]; // 4CE + + char ex_ntp_server[3][33]; // 4CE + uint8_t ina219_mode; // 531 uint16_t pulse_timer[MAX_PULSETIMERS]; // 532 uint16_t button_debounce; // 542 uint32_t ip_address[4]; // 544 unsigned long energy_kWhtotal; // 554 - char mqtt_fulltopic[100]; // 558 + + char ex_mqtt_fulltopic[100]; // 558 + SysBitfield2 flag2; // 5BC unsigned long pulse_counter[MAX_COUNTERS]; // 5C0 uint16_t pulse_counter_type; // 5D0 @@ -417,10 +402,9 @@ struct SYSCFG { uint8_t web_color[18][3]; // 73E uint16_t display_width; // 774 uint16_t display_height; // 776 - uint16_t serial_config; // 778 - 14 MSB's define the baud rate; 2 LSB's define the serial config (e.g. 8N1). Maps to the SerialCfg struct. + uint16_t baudrate; // 778 uint16_t sbaudrate; // 77A EnergyUsage energy_usage; // 77C -// uint32_t drivers[3]; // 794 - 6.5.0.12 replaced by below three entries uint32_t adc_param1; // 794 uint32_t adc_param2; // 798 int adc_param3; // 79C @@ -435,8 +419,10 @@ struct SYSCFG { unsigned long weight_calibration; // 7C4 unsigned long energy_frequency_calibration; // 7C8 also used by HX711 to save last weight uint16_t web_refresh; // 7CC - char mems[MAX_RULE_MEMS][10]; // 7CE + char script_pram[5][10]; // 7CE + char rules[MAX_RULE_SETS][MAX_RULE_SIZE]; // 800 uses 512 bytes in v5.12.0m, 3 x 512 bytes in v5.14.0b + TuyaFnidDpidMap tuya_fnid_map[MAX_TUYA_FUNCTIONS]; // E00 32 bytes uint16_t ina226_r_shunt[4]; // E20 uint16_t ina226_i_fs[4]; // E28 @@ -444,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 @@ -455,13 +441,44 @@ struct SYSCFG { uint16_t energy_power_delta; // E98 uint8_t shutter_motordelay[MAX_SHUTTERS]; // E9A int8_t temp_comp; // E9E - - uint8_t free_e9f[1]; // E9F - + uint8_t weight_change; // E9F uint8_t web_color2[2][3]; // EA0 - Needs to be on integer / 3 distance from web_color - uint8_t free_ea4[326]; // EA6 + char ex_cors_domain[33]; // EA6 + uint8_t sta_config; // EC7 + uint8_t sta_active; // EC8 + uint8_t rule_stop; // EC9 + uint16_t syslog_port; // ECA + uint8_t syslog_level; // ECC + uint8_t webserver; // ECD + uint8_t weblog_level; // ECE + uint8_t mqtt_fingerprint[2][20]; // ECF + uint8_t adc_param_type; // EF7 + SysBitfield4 flag4; // EF8 + uint16_t mqtt_port; // EFC + uint8_t serial_config; // EFE + uint8_t wifi_output_power; // EFF + 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 + + uint8_t free_f08[180]; // F08 + + 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 3f6621495..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 @@ -140,6 +140,10 @@ #ifndef DEFAULT_LIGHT_COMPONENT #define DEFAULT_LIGHT_COMPONENT 255 #endif +#ifndef CORS_ENABLED_ALL +#define CORS_ENABLED_ALL "*" +#endif + enum WebColors { COL_TEXT, COL_BACKGROUND, COL_FORM, @@ -156,6 +160,23 @@ const char kWebColors[] PROGMEM = COLOR_BUTTON_TEXT "|" COLOR_BUTTON "|" COLOR_BUTTON_HOVER "|" COLOR_BUTTON_RESET "|" COLOR_BUTTON_RESET_HOVER "|" COLOR_BUTTON_SAVE "|" COLOR_BUTTON_SAVE_HOVER "|" COLOR_TIMER_TAB_TEXT "|" COLOR_TIMER_TAB_BACKGROUND "|" COLOR_TITLE_TEXT; +enum TasmotaSerialConfig { + TS_SERIAL_5N1, TS_SERIAL_6N1, TS_SERIAL_7N1, TS_SERIAL_8N1, + TS_SERIAL_5N2, TS_SERIAL_6N2, TS_SERIAL_7N2, TS_SERIAL_8N2, + TS_SERIAL_5E1, TS_SERIAL_6E1, TS_SERIAL_7E1, TS_SERIAL_8E1, + TS_SERIAL_5E2, TS_SERIAL_6E2, TS_SERIAL_7E2, TS_SERIAL_8E2, + TS_SERIAL_5O1, TS_SERIAL_6O1, TS_SERIAL_7O1, TS_SERIAL_8O1, + TS_SERIAL_5O2, TS_SERIAL_6O2, TS_SERIAL_7O2, TS_SERIAL_8O2 }; + +const uint8_t kTasmotaSerialConfig[] PROGMEM = { + SERIAL_5N1, SERIAL_6N1, SERIAL_7N1, SERIAL_8N1, + SERIAL_5N2, SERIAL_6N2, SERIAL_7N2, SERIAL_8N2, + SERIAL_5E1, SERIAL_6E1, SERIAL_7E1, SERIAL_8E1, + SERIAL_5E2, SERIAL_6E2, SERIAL_7E2, SERIAL_8E2, + SERIAL_5O1, SERIAL_6O1, SERIAL_7O1, SERIAL_8O1, + SERIAL_5O2, SERIAL_6O2, SERIAL_7O2, SERIAL_8O2 +}; + /*********************************************************************************************\ * RTC memory \*********************************************************************************************/ @@ -256,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" { @@ -322,6 +360,53 @@ void SetFlashModeDout(void) delete[] _buffer; } +bool VersionCompatible(void) +{ + if (Settings.flag3.compatibility_check) { + return true; + } + + eboot_command ebcmd; + eboot_command_read(&ebcmd); + uint32_t start_address = ebcmd.args[0]; + uint32_t end_address = start_address + (ebcmd.args[2] & 0xFFFFF000) + FLASH_SECTOR_SIZE; + uint32_t* buffer = new uint32_t[FLASH_SECTOR_SIZE / 4]; + + uint32_t version[3] = { 0 }; + 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); + 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; } + } + delete[] buffer; + + if (!found) { version[1] = 0; } + + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("OTA: Version 0x%08X, Compatible 0x%08X"), version[1], VERSION_COMPATIBLE); + + 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; + } + + return true; +} + void SettingsBufferFree(void) { if (settings_buffer != nullptr) { @@ -421,6 +506,85 @@ void UpdateQuickPowerCycle(bool update) } } +/*********************************************************************************************\ + * Config Settings.text char array support +\*********************************************************************************************/ + +uint32_t GetSettingsTextLen(void) +{ + char* position = Settings.text_pool; + for (uint32_t size = 0; size < SET_MAX; size++) { + while (*position++ != '\0') { } + } + return position - Settings.text_pool; +} + +bool SettingsUpdateText(uint32_t index, const char* replace_me) +{ + if (index >= SET_MAX) { + return false; // Setting not supported - internal error + } + + // Make a copy first in case we use source from Settings.text + uint32_t replace_len = strlen(replace_me); + char replace[replace_len +1]; + memcpy(replace, replace_me, sizeof(replace)); + + uint32_t start_pos = 0; + uint32_t end_pos = 0; + char* position = Settings.text_pool; + for (uint32_t size = 0; size < SET_MAX; size++) { + while (*position++ != '\0') { } + if (1 == index) { + start_pos = position - Settings.text_pool; + } + else if (0 == index) { + end_pos = position - Settings.text_pool -1; + } + index--; + } + uint32_t char_len = position - Settings.text_pool; + + uint32_t current_len = end_pos - start_pos; + int diff = replace_len - current_len; + +// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TST: start %d, end %d, len %d, current %d, replace %d, diff %d"), +// start_pos, end_pos, char_len, current_len, replace_len, diff); + + int too_long = (char_len + diff) - settings_text_size; + if (too_long > 0) { + AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_CONFIG "Text overflow by %d char(s)"), too_long); + return false; // Replace text too long + } + + if (diff != 0) { + // Shift Settings.text up or down + memmove_P(Settings.text_pool + start_pos + replace_len, Settings.text_pool + end_pos, char_len - end_pos); + } + // Replace text + memmove_P(Settings.text_pool + start_pos, replace, replace_len); + // Fill for future use + memset(Settings.text_pool + char_len + diff, 0x00, settings_text_size - char_len - diff); + + AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_CONFIG "CR %d/%d"), GetSettingsTextLen(), settings_text_size); + + return true; +} + +char* SettingsText(uint32_t index) +{ + char* position = Settings.text_pool; + + if (index >= SET_MAX) { + position += settings_text_size -1; // Setting not supported - internal error - return empty string + } else { + for (;index > 0; index--) { + while (*position++ != '\0') { } + } + } + return position; +} + /*********************************************************************************************\ * Config Save - Save parameters to Flash ONLY if any parameter has changed \*********************************************************************************************/ @@ -553,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(); @@ -577,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 @@ -594,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 @@ -604,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); } @@ -635,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 @@ -652,11 +840,11 @@ void SettingsDefaultSet2(void) Settings.module = MODULE; ModuleDefault(WEMOS); // for (uint32_t i = 0; i < sizeof(Settings.my_gp); i++) { Settings.my_gp.io[i] = GPIO_NONE; } - strlcpy(Settings.friendlyname[0], FRIENDLY_NAME, sizeof(Settings.friendlyname[0])); - strlcpy(Settings.friendlyname[1], FRIENDLY_NAME"2", sizeof(Settings.friendlyname[1])); - strlcpy(Settings.friendlyname[2], FRIENDLY_NAME"3", sizeof(Settings.friendlyname[2])); - strlcpy(Settings.friendlyname[3], FRIENDLY_NAME"4", sizeof(Settings.friendlyname[3])); - strlcpy(Settings.ota_url, OTA_URL, sizeof(Settings.ota_url)); + SettingsUpdateText(SET_FRIENDLYNAME1, FRIENDLY_NAME); + SettingsUpdateText(SET_FRIENDLYNAME2, FRIENDLY_NAME"2"); + SettingsUpdateText(SET_FRIENDLYNAME3, FRIENDLY_NAME"3"); + SettingsUpdateText(SET_FRIENDLYNAME4, FRIENDLY_NAME"4"); + SettingsUpdateText(SET_OTAURL, OTA_URL); // Power Settings.flag.save_state = SAVE_STATE; @@ -670,17 +858,15 @@ void SettingsDefaultSet2(void) // for (uint32_t i = 1; i < MAX_PULSETIMERS; i++) { Settings.pulse_timer[i] = 0; } // Serial - - SerialCfg config = SettingToSerialCfg(Settings.serial_config); - config.baudrate = APP_BAUDRATE / 300; - Settings.serial_config = SerialCfgToSetting(config); - + Settings.serial_config = TS_SERIAL_8N1; + Settings.baudrate = APP_BAUDRATE / 300; Settings.sbaudrate = SOFT_BAUDRATE / 300; - //Settings.serial_config = SERIAL_8N1; Settings.serial_delimiter = 0xff; 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); @@ -688,28 +874,30 @@ void SettingsDefaultSet2(void) ParseIp(&Settings.ip_address[3], WIFI_DNS); Settings.sta_config = WIFI_CONFIG_TOOL; // Settings.sta_active = 0; - strlcpy(Settings.sta_ssid[0], STA_SSID1, sizeof(Settings.sta_ssid[0])); - strlcpy(Settings.sta_pwd[0], STA_PASS1, sizeof(Settings.sta_pwd[0])); - strlcpy(Settings.sta_ssid[1], STA_SSID2, sizeof(Settings.sta_ssid[1])); - strlcpy(Settings.sta_pwd[1], STA_PASS2, sizeof(Settings.sta_pwd[1])); - strlcpy(Settings.hostname, WIFI_HOSTNAME, sizeof(Settings.hostname)); + SettingsUpdateText(SET_STASSID1, STA_SSID1); + SettingsUpdateText(SET_STASSID2, STA_SSID2); + SettingsUpdateText(SET_STAPWD1, STA_PASS1); + SettingsUpdateText(SET_STAPWD2, STA_PASS2); + SettingsUpdateText(SET_HOSTNAME, WIFI_HOSTNAME); // Syslog - strlcpy(Settings.syslog_host, SYS_LOG_HOST, sizeof(Settings.syslog_host)); + SettingsUpdateText(SET_SYSLOG_HOST, SYS_LOG_HOST); Settings.syslog_port = SYS_LOG_PORT; Settings.syslog_level = SYS_LOG_LEVEL; // 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; - strlcpy(Settings.web_password, WEB_PASSWORD, sizeof(Settings.web_password)); - Settings.flag3.mdns_enabled = MDNS_ENABLED; + SettingsUpdateText(SET_WEBPWD, WEB_PASSWORD); + 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 @@ -717,34 +905,37 @@ 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; - strlcpy(Settings.mqtt_host, MQTT_HOST, sizeof(Settings.mqtt_host)); + 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; - strlcpy(Settings.mqtt_client, MQTT_CLIENT_ID, sizeof(Settings.mqtt_client)); - strlcpy(Settings.mqtt_user, MQTT_USER, sizeof(Settings.mqtt_user)); - strlcpy(Settings.mqtt_pwd, MQTT_PASS, sizeof(Settings.mqtt_pwd)); - strlcpy(Settings.mqtt_topic, MQTT_TOPIC, sizeof(Settings.mqtt_topic)); - strlcpy(Settings.button_topic, MQTT_BUTTON_TOPIC, sizeof(Settings.button_topic)); - strlcpy(Settings.switch_topic, MQTT_SWITCH_TOPIC, sizeof(Settings.switch_topic)); - strlcpy(Settings.mqtt_grptopic, MQTT_GRPTOPIC, sizeof(Settings.mqtt_grptopic)); - strlcpy(Settings.mqtt_fulltopic, MQTT_FULLTOPIC, sizeof(Settings.mqtt_fulltopic)); + SettingsUpdateText(SET_MQTT_CLIENT, MQTT_CLIENT_ID); + SettingsUpdateText(SET_MQTT_USER, MQTT_USER); + SettingsUpdateText(SET_MQTT_PWD, MQTT_PASS); + SettingsUpdateText(SET_MQTT_TOPIC, MQTT_TOPIC); + SettingsUpdateText(SET_MQTT_BUTTON_TOPIC, MQTT_BUTTON_TOPIC); + SettingsUpdateText(SET_MQTT_SWITCH_TOPIC, MQTT_SWITCH_TOPIC); + SettingsUpdateText(SET_MQTT_GRP_TOPIC, MQTT_GRPTOPIC); + SettingsUpdateText(SET_MQTT_FULLTOPIC, MQTT_FULLTOPIC); Settings.mqtt_retry = MQTT_RETRY_SECS; - strlcpy(Settings.mqtt_prefix[0], SUB_PREFIX, sizeof(Settings.mqtt_prefix[0])); - strlcpy(Settings.mqtt_prefix[1], PUB_PREFIX, sizeof(Settings.mqtt_prefix[1])); - strlcpy(Settings.mqtt_prefix[2], PUB_PREFIX2, sizeof(Settings.mqtt_prefix[2])); - strlcpy(Settings.state_text[0], MQTT_STATUS_OFF, sizeof(Settings.state_text[0])); - strlcpy(Settings.state_text[1], MQTT_STATUS_ON, sizeof(Settings.state_text[1])); - strlcpy(Settings.state_text[2], MQTT_CMND_TOGGLE, sizeof(Settings.state_text[2])); - strlcpy(Settings.state_text[3], MQTT_CMND_HOLD, sizeof(Settings.state_text[3])); + SettingsUpdateText(SET_MQTTPREFIX1, SUB_PREFIX); + SettingsUpdateText(SET_MQTTPREFIX2, PUB_PREFIX); + SettingsUpdateText(SET_MQTTPREFIX3, PUB_PREFIX2); + SettingsUpdateText(SET_STATE_TXT1, MQTT_STATUS_OFF); + SettingsUpdateText(SET_STATE_TXT2, MQTT_STATUS_ON); + SettingsUpdateText(SET_STATE_TXT3, MQTT_CMND_TOGGLE); + SettingsUpdateText(SET_STATE_TXT4, MQTT_CMND_HOLD); char fingerprint[60]; strlcpy(fingerprint, MQTT_FINGERPRINT1, sizeof(fingerprint)); char *p = fingerprint; @@ -760,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; @@ -793,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); @@ -816,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 @@ -824,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++) { @@ -896,15 +1104,11 @@ void SettingsDefaultSet2(void) Settings.timezone = APP_TIMEZONE / 60; Settings.timezone_minutes = abs(APP_TIMEZONE % 60); } - strlcpy(Settings.ntp_server[0], NTP_SERVER1, sizeof(Settings.ntp_server[0])); - strlcpy(Settings.ntp_server[1], NTP_SERVER2, sizeof(Settings.ntp_server[1])); - strlcpy(Settings.ntp_server[2], NTP_SERVER3, sizeof(Settings.ntp_server[2])); - for (uint32_t j = 0; j < 3; j++) { - for (uint32_t i = 0; i < strlen(Settings.ntp_server[j]); i++) { - if (Settings.ntp_server[j][i] == ',') { - Settings.ntp_server[j][i] = '.'; - } - } + SettingsUpdateText(SET_NTPSERVER1, NTP_SERVER1); + SettingsUpdateText(SET_NTPSERVER2, NTP_SERVER2); + SettingsUpdateText(SET_NTPSERVER3, NTP_SERVER3); + 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); Settings.longitude = (int)((double)LONGITUDE * 1000000); @@ -924,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; } /********************************************************************************************/ @@ -1064,11 +1277,8 @@ void SettingsDelta(void) } } if (Settings.version < 0x06060009) { - SerialCfg config = SettingToSerialCfg(Settings.serial_config); - config.baudrate = Settings.ex_baudrate * 4; - Settings.serial_config = SerialCfgToSetting(config); - - Settings.sbaudrate = Settings.ex_sbaudrate * 4; + Settings.baudrate = APP_BAUDRATE / 300; + Settings.sbaudrate = SOFT_BAUDRATE / 300; } if (Settings.version < 0x0606000A) { uint8_t tuyaindex = 0; @@ -1107,8 +1317,8 @@ void SettingsDelta(void) memset((char*)&Settings +0x1D6, 0x00, 16); } if (Settings.version < 0x0606000F) { - Settings.shutter_accuracy = 0; - Settings.mqttlog_level = MQTT_LOG_LEVEL; + Settings.ex_shutter_accuracy = 0; + Settings.ex_mqttlog_level = MQTT_LOG_LEVEL; } if (Settings.version < 0x06060011) { Settings.param[P_BACKLOG_DELAY] = MIN_BACKLOG_DELAY; @@ -1147,8 +1357,8 @@ void SettingsDelta(void) Settings.ex_energy_power_delta = 0; } if (Settings.version < 0x06060015) { - if ((EX_WIFI_SMARTCONFIG == Settings.sta_config) || (EX_WIFI_WPSCONFIG == Settings.sta_config)) { - Settings.sta_config = WIFI_MANAGER; + if ((EX_WIFI_SMARTCONFIG == Settings.ex_sta_config) || (EX_WIFI_WPSCONFIG == Settings.ex_sta_config)) { + Settings.ex_sta_config = WIFI_MANAGER; } } @@ -1161,33 +1371,103 @@ void SettingsDelta(void) SettingsEnableAllI2cDrivers(); } if (Settings.version < 0x07000004) { - Settings.wifi_output_power = 170; + Settings.ex_wifi_output_power = 170; + } + if (Settings.version < 0x07010202) { + Settings.ex_serial_config = TS_SERIAL_8N1; + } + if (Settings.version < 0x07010204) { + if (Settings.flag3.ex_cors_enabled == 1) { + strlcpy(Settings.ex_cors_domain, CORS_ENABLED_ALL, sizeof(Settings.ex_cors_domain)); + } else { + Settings.ex_cors_domain[0] = 0; + } + } + if (Settings.version < 0x07010205) { + Settings.seriallog_level = Settings.ex_seriallog_level; // 09E -> 452 + Settings.sta_config = Settings.ex_sta_config; // 09F -> EC7 + Settings.sta_active = Settings.ex_sta_active; // 0A0 -> EC8 + memcpy((char*)&Settings.rule_stop, (char*)&Settings.ex_rule_stop, 47); // 1A7 -> EC9 + } + if (Settings.version < 0x07010206) { + Settings.flag4 = Settings.ex_flag4; // 1E0 -> EF8 + Settings.mqtt_port = Settings.ex_mqtt_port; // 20A -> EFC + memcpy((char*)&Settings.serial_config, (char*)&Settings.ex_serial_config, 5); // 1E4 -> EFE + } + + if (Settings.version < 0x08000000) { + char temp[strlen(Settings.text_pool) +1]; strncpy(temp, Settings.text_pool, sizeof(temp)); // Was ota_url + char temp21[strlen(Settings.ex_mqtt_prefix[0]) +1]; strncpy(temp21, Settings.ex_mqtt_prefix[0], sizeof(temp21)); + char temp22[strlen(Settings.ex_mqtt_prefix[1]) +1]; strncpy(temp22, Settings.ex_mqtt_prefix[1], sizeof(temp22)); + char temp23[strlen(Settings.ex_mqtt_prefix[2]) +1]; strncpy(temp23, Settings.ex_mqtt_prefix[2], sizeof(temp23)); + char temp31[strlen(Settings.ex_sta_ssid[0]) +1]; strncpy(temp31, Settings.ex_sta_ssid[0], sizeof(temp31)); + char temp32[strlen(Settings.ex_sta_ssid[1]) +1]; strncpy(temp32, Settings.ex_sta_ssid[1], sizeof(temp32)); + char temp41[strlen(Settings.ex_sta_pwd[0]) +1]; strncpy(temp41, Settings.ex_sta_pwd[0], sizeof(temp41)); + char temp42[strlen(Settings.ex_sta_pwd[1]) +1]; strncpy(temp42, Settings.ex_sta_pwd[1], sizeof(temp42)); + char temp5[strlen(Settings.ex_hostname) +1]; strncpy(temp5, Settings.ex_hostname, sizeof(temp5)); + char temp6[strlen(Settings.ex_syslog_host) +1]; strncpy(temp6, Settings.ex_syslog_host, sizeof(temp6)); + char temp7[strlen(Settings.ex_mqtt_host) +1]; strncpy(temp7, Settings.ex_mqtt_host, sizeof(temp7)); + char temp8[strlen(Settings.ex_mqtt_client) +1]; strncpy(temp8, Settings.ex_mqtt_client, sizeof(temp8)); + char temp9[strlen(Settings.ex_mqtt_user) +1]; strncpy(temp9, Settings.ex_mqtt_user, sizeof(temp9)); + char temp10[strlen(Settings.ex_mqtt_pwd) +1]; strncpy(temp10, Settings.ex_mqtt_pwd, sizeof(temp10)); + char temp11[strlen(Settings.ex_mqtt_topic) +1]; strncpy(temp11, Settings.ex_mqtt_topic, sizeof(temp11)); + char temp12[strlen(Settings.ex_button_topic) +1]; strncpy(temp12, Settings.ex_button_topic, sizeof(temp12)); + char temp13[strlen(Settings.ex_mqtt_grptopic) +1]; strncpy(temp13, Settings.ex_mqtt_grptopic, sizeof(temp13)); + + memset(Settings.text_pool, 0x00, settings_text_size); + SettingsUpdateText(SET_OTAURL, temp); + SettingsUpdateText(SET_MQTTPREFIX1, temp21); + SettingsUpdateText(SET_MQTTPREFIX2, temp22); + SettingsUpdateText(SET_MQTTPREFIX3, temp23); + SettingsUpdateText(SET_STASSID1, temp31); + SettingsUpdateText(SET_STASSID2, temp32); + SettingsUpdateText(SET_STAPWD1, temp41); + SettingsUpdateText(SET_STAPWD2, temp42); + SettingsUpdateText(SET_HOSTNAME, temp5); + SettingsUpdateText(SET_SYSLOG_HOST, temp6); +#if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) + if (!strlen(Settings.ex_mqtt_user)) { + SettingsUpdateText(SET_MQTT_HOST, temp7); + SettingsUpdateText(SET_MQTT_USER, temp9); + } else { + char aws_mqtt_host[66]; + snprintf_P(aws_mqtt_host, sizeof(aws_mqtt_host), PSTR("%s%s"), temp9, temp7); + SettingsUpdateText(SET_MQTT_HOST, aws_mqtt_host); + SettingsUpdateText(SET_MQTT_USER, ""); + } +#else + SettingsUpdateText(SET_MQTT_HOST, temp7); + SettingsUpdateText(SET_MQTT_USER, temp9); +#endif + SettingsUpdateText(SET_MQTT_CLIENT, temp8); + SettingsUpdateText(SET_MQTT_PWD, temp10); + SettingsUpdateText(SET_MQTT_TOPIC, temp11); + SettingsUpdateText(SET_MQTT_BUTTON_TOPIC, temp12); + SettingsUpdateText(SET_MQTT_GRP_TOPIC, temp13); + + SettingsUpdateText(SET_WEBPWD, Settings.ex_web_password); + SettingsUpdateText(SET_CORS, Settings.ex_cors_domain); + SettingsUpdateText(SET_MQTT_FULLTOPIC, Settings.ex_mqtt_fulltopic); + SettingsUpdateText(SET_MQTT_SWITCH_TOPIC, Settings.ex_switch_topic); + SettingsUpdateText(SET_STATE_TXT1, Settings.ex_state_text[0]); + SettingsUpdateText(SET_STATE_TXT2, Settings.ex_state_text[1]); + SettingsUpdateText(SET_STATE_TXT3, Settings.ex_state_text[2]); + SettingsUpdateText(SET_STATE_TXT4, Settings.ex_state_text[3]); + SettingsUpdateText(SET_NTPSERVER1, Settings.ex_ntp_server[0]); + SettingsUpdateText(SET_NTPSERVER2, Settings.ex_ntp_server[1]); + SettingsUpdateText(SET_NTPSERVER3, Settings.ex_ntp_server[2]); + SettingsUpdateText(SET_MEM1, Settings.script_pram[0]); + SettingsUpdateText(SET_MEM2, Settings.script_pram[1]); + SettingsUpdateText(SET_MEM3, Settings.script_pram[2]); + SettingsUpdateText(SET_MEM4, Settings.script_pram[3]); + SettingsUpdateText(SET_MEM5, Settings.script_pram[4]); + SettingsUpdateText(SET_FRIENDLYNAME1, Settings.ex_friendlyname[0]); + SettingsUpdateText(SET_FRIENDLYNAME2, Settings.ex_friendlyname[1]); + SettingsUpdateText(SET_FRIENDLYNAME3, Settings.ex_friendlyname[2]); + SettingsUpdateText(SET_FRIENDLYNAME4, Settings.ex_friendlyname[3]); } Settings.version = VERSION; SettingsSave(1); } } - -/* Performs the bitwise operations needed for translating the serial port settings 16-bit word - to the SerialCfg struct: */ -SerialCfg SettingToSerialCfg(uint16_t setting) -{ - SerialCfg serial_config; - - serial_config.baudrate = (uint16_t) (setting >> 2) & 0x3FFF; - serial_config.mode = (uint8_t) (setting) & 0x3; - - return serial_config; -} - -/* Performs the bitwise operations needed for translating from the SerialCfg struct - to the serial port settings 16-bit word: */ -uint16_t SerialCfgToSetting(SerialCfg serial_config) -{ - uint16_t setting; - - setting = (uint16_t) ((uint16_t) (serial_config.baudrate << 2 & 0xFFFC)) | (serial_config.mode & 0x3); - - return setting; -} diff --git a/tasmota/support.ino b/tasmota/support.ino index 2c58631d1..8587c034b 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, last_run %d"), ESP.getFreeHeap(), WifiGetRssiAsQuality(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); } } @@ -107,12 +113,6 @@ String GetResetReason(void) } } -String GetResetReasonInfo(void) -{ - // "Fatal exception:0 flag:2 (EXCEPTION) epc1:0x704022a7 epc2:0x00000000 epc3:0x00000000 excvaddr:0x00000000 depc:0x00000000" - return (ResetReason() == REASON_EXCEPTION_RST) ? ESP.getResetInfo() : GetResetReason(); -} - /*********************************************************************************************\ * Miscellaneous \*********************************************************************************************/ @@ -334,6 +334,22 @@ char* RemoveSpace(char* p) return p; } +char* ReplaceCommaWithDot(char* p) +{ + char* write = (char*)p; + char* read = (char*)p; + char ch = '.'; + + while (ch != '\0') { + ch = *read++; + if (ch == ',') { + ch = '.'; + } + *write++ = ch; + } + return p; +} + char* LowerCase(char* dest, const char* source) { char* write = dest; @@ -383,6 +399,23 @@ char* Trim(char* p) return p; } +char* RemoveAllSpaces(char* p) +{ + // remove any white space from the base64 + char *cursor = p; + uint32_t offset = 0; + while (1) { + *cursor = *(cursor + offset); + if ((' ' == *cursor) || ('\t' == *cursor) || ('\n' == *cursor)) { // if space found, remove this char until end of string + offset++; + } else { + if (0 == *cursor) { break; } + cursor++; + } + } + return p; +} + char* NoAlNumToUnderscore(char* dest, const char* source) { char* write = dest; @@ -461,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. @@ -489,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))) { @@ -602,6 +641,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 @@ -704,6 +755,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; @@ -737,57 +795,65 @@ int GetStateNumber(char *state_text) return state_number; } -void SetSerialConfig(uint8_t mode) +String GetSerialConfig(void) { - SerialCfg config = SettingToSerialCfg(Settings.serial_config); - config.mode = mode; - Settings.serial_config = SerialCfgToSetting(config); + // Settings.serial_config layout + // b000000xx - 5, 6, 7 or 8 data bits + // b00000x00 - 1 or 2 stop bits + // b000xx000 - None, Even or Odd parity - SerialConfig hardware_serial_config = ConvertSettingByteToSerialConfig(mode); + const char kParity[] = "NEOI"; - if (seriallog_level) { - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_SET_SERIAL_CONFIG_TO " %d"), mode); - } + char config[4]; + config[0] = '5' + (Settings.serial_config & 0x3); + config[1] = kParity[(Settings.serial_config >> 3) & 0x3]; + config[2] = '1' + ((Settings.serial_config >> 2) & 0x1); + config[3] = '\0'; + return String(config); +} - delay(100); +void SetSerialBegin() +{ + 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)); +} - Serial.begin(Serial.baudRate(), hardware_serial_config); - delay(10); - Serial.println(); +void SetSerialConfig(uint32_t serial_config) +{ + 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(uint32_t baudrate) { - SerialCfg config = SettingToSerialCfg(Settings.serial_config); - config.baudrate = ((baudrate / 300) & 0x3FFF); - Settings.serial_config = SerialCfgToSetting(config); - - SerialConfig hardware_serial_config = ConvertSettingByteToSerialConfig(config.mode); - + Settings.baudrate = baudrate / 300; if (Serial.baudRate() != baudrate) { - if (seriallog_level) { - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_SET_BAUDRATE_TO " %d"), baudrate); - } - delay(100); - Serial.flush(); - - Serial.begin(baudrate, hardware_serial_config); - delay(10); - Serial.println(); + SetSerialBegin(); } } +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) { serial_local = true; AddLog_P(LOG_LEVEL_INFO, PSTR("SNS: Hardware Serial")); SetSeriallog(LOG_LEVEL_NONE); - baudrate = Serial.baudRate(); - - SerialCfg config = SettingToSerialCfg(Settings.serial_config); - config.baudrate = baudrate / 300; - Settings.serial_config = SerialCfgToSetting(config); + Settings.baudrate = Serial.baudRate() / 300; } void SerialSendRaw(char *codes) @@ -966,6 +1032,13 @@ int ResponseJsonEndEnd(void) * GPIO Module and Template management \*********************************************************************************************/ +void DigitalWrite(uint32_t gpio_pin, uint32_t state) +{ + if (pin[gpio_pin] < 99) { + digitalWrite(pin[gpio_pin], state &1); + } +} + uint8_t ModuleNr(void) { // 0 = User module (255) @@ -1194,45 +1267,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); @@ -1253,6 +1300,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 \*********************************************************************************************/ @@ -1498,11 +1557,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 @@ -1558,10 +1613,10 @@ void Syslog(void) { // Destroys log_data - uint32_t current_hash = GetHash(Settings.syslog_host, strlen(Settings.syslog_host)); + uint32_t current_hash = GetHash(SettingsText(SET_SYSLOG_HOST), strlen(SettingsText(SET_SYSLOG_HOST))); if (syslog_host_hash != current_hash) { syslog_host_hash = current_hash; - WiFi.hostByName(Settings.syslog_host, syslog_host_addr); // If sleep enabled this might result in exception so try to do it once using hash + WiFi.hostByName(SettingsText(SET_SYSLOG_HOST), syslog_host_addr); // If sleep enabled this might result in exception so try to do it once using hash } if (PortUdp.beginPacket(syslog_host_addr, Settings.syslog_port)) { char syslog_preamble[64]; // Hostname + Id @@ -1608,8 +1663,12 @@ 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(); } } void AddLog_P(uint32_t loglevel, const char *formatP) @@ -1628,6 +1687,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; @@ -1675,28 +1744,3 @@ void AddLogMissed(char *sensor, uint32_t misses) { AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SNS: %s missed %d"), sensor, SENSOR_MAX_MISS - misses); } - -SerialConfig ConvertSettingByteToSerialConfig(uint8_t setting_byte) -{ - SerialConfig hardware_serial_config; - - switch(setting_byte) { - case 0: - hardware_serial_config = SERIAL_7N1; - break; - case 1: - hardware_serial_config = SERIAL_7E1; - break; - case 2: - hardware_serial_config = SERIAL_8N1; - break; - case 3: - hardware_serial_config = SERIAL_8E1; - break; - default: - hardware_serial_config = SERIAL_8N1; - break; - } - - return hardware_serial_config; -} \ No newline at end of file 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 f0a5ba87d..c881e5db1 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 @@ -23,13 +23,17 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix D_CMND_SETOPTION "|" D_CMND_TEMPERATURE_RESOLUTION "|" D_CMND_HUMIDITY_RESOLUTION "|" D_CMND_PRESSURE_RESOLUTION "|" D_CMND_POWER_RESOLUTION "|" D_CMND_VOLTAGE_RESOLUTION "|" D_CMND_FREQUENCY_RESOLUTION "|" D_CMND_CURRENT_RESOLUTION "|" D_CMND_ENERGY_RESOLUTION "|" D_CMND_WEIGHT_RESOLUTION "|" D_CMND_MODULE "|" D_CMND_MODULES "|" D_CMND_GPIO "|" D_CMND_GPIOS "|" D_CMND_TEMPLATE "|" D_CMND_PWM "|" D_CMND_PWMFREQUENCY "|" D_CMND_PWMRANGE "|" - D_CMND_BUTTONDEBOUNCE "|" D_CMND_SWITCHDEBOUNCE "|" D_CMND_SYSLOG "|" D_CMND_LOGHOST "|" D_CMND_LOGPORT "|" D_CMND_SERIALSEND "|" D_CMND_SERIALCONFIG "|" - D_CMND_BAUDRATE "|" 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_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_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 = { @@ -38,13 +42,17 @@ void (* const TasmotaCommand[])(void) PROGMEM = { &CmndSetoption, &CmndTemperatureResolution, &CmndHumidityResolution, &CmndPressureResolution, &CmndPowerResolution, &CmndVoltageResolution, &CmndFrequencyResolution, &CmndCurrentResolution, &CmndEnergyResolution, &CmndWeightResolution, &CmndModule, &CmndModules, &CmndGpio, &CmndGpios, &CmndTemplate, &CmndPwm, &CmndPwmfrequency, &CmndPwmrange, - &CmndButtonDebounce, &CmndSwitchDebounce, &CmndSyslog, &CmndLoghost, &CmndLogport, &CmndSerialSend, &CmndSerialConfig, &CmndBaudrate, + &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, + &CmndSpeedUnit, #ifdef USE_I2C &CmndI2cScan, CmndI2cDriver, #endif +#ifdef USE_DEVICE_GROUPS + &CmndDevGroupShare, +#endif // USE_DEVICE_GROUPS &CmndSensor, &CmndDriver }; const char kWifiConfig[] PROGMEM = @@ -89,6 +97,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 +149,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) @@ -147,7 +164,7 @@ void CommandHandler(char* topicBuf, char* dataBuf, uint32_t data_len) data_len--; } - bool grpflg = (strstr(topicBuf, Settings.mqtt_grptopic) != nullptr); + bool grpflg = (strstr(topicBuf, SettingsText(SET_MQTT_GRP_TOPIC)) != nullptr); char stemp1[TOPSZ]; GetFallbackTopic_P(stemp1, ""); // Full Fallback topic = cmnd/DVES_xxxxxxxx_fb/ @@ -193,7 +210,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 +245,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') { @@ -325,14 +342,16 @@ void CmndStatus(void) uint32_t payload = ((XdrvMailbox.payload < 0) || (XdrvMailbox.payload > MAX_STATUS)) ? 99 : XdrvMailbox.payload; uint32_t option = STAT; - char stemp[MAX_FRIENDLYNAMES * (sizeof(Settings.friendlyname[0]) +MAX_FRIENDLYNAMES)]; - char stemp2[100]; + char stemp[200]; + char stemp2[TOPSZ]; // Workaround MQTT - TCP/IP stack queueing when SUB_PREFIX = PUB_PREFIX - if (!strcmp(Settings.mqtt_prefix[0],Settings.mqtt_prefix[1]) && (!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; } + 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; @@ -341,7 +360,7 @@ void CmndStatus(void) #endif // USE_SONOFF_IFAN stemp[0] = '\0'; for (uint32_t i = 0; i < maxfn; i++) { - snprintf_P(stemp, sizeof(stemp), PSTR("%s%s\"%s\"" ), stemp, (i > 0 ? "," : ""), Settings.friendlyname[i]); + snprintf_P(stemp, sizeof(stemp), PSTR("%s%s\"%s\"" ), stemp, (i > 0 ? "," : ""), SettingsText(SET_FRIENDLYNAME1 +i)); } stemp2[0] = '\0'; for (uint32_t i = 0; i < MAX_SWITCHES; i++) { @@ -352,10 +371,10 @@ void CmndStatus(void) D_CMND_LEDMASK "\":\"%04X\",\"" D_CMND_SAVEDATA "\":%d,\"" D_JSON_SAVESTATE "\":%d,\"" D_CMND_SWITCHTOPIC "\":\"%s\",\"" D_CMND_SWITCHMODE "\":[%s],\"" D_CMND_BUTTONRETAIN "\":%d,\"" D_CMND_SWITCHRETAIN "\":%d,\"" D_CMND_SENSORRETAIN "\":%d,\"" D_CMND_POWERRETAIN "\":%d}}"), ModuleNr(), stemp, mqtt_topic, - Settings.button_topic, power, Settings.poweronstate, Settings.ledstate, + SettingsText(SET_MQTT_BUTTON_TOPIC), power, Settings.poweronstate, Settings.ledstate, Settings.ledmask, Settings.save_data, Settings.flag.save_state, // SetOption0 - Save power state and use after restart - Settings.switch_topic, + SettingsText(SET_MQTT_SWITCH_TOPIC), stemp2, Settings.flag.mqtt_button_retain, // CMND_BUTTONRETAIN Settings.flag.mqtt_switch_retain, // CMND_SWITCHRETAIN @@ -365,21 +384,24 @@ 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, Settings.mqtt_grptopic, Settings.ota_url, - GetResetReasonInfo().c_str(), GetUptime().c_str(), GetDateAndTime(DT_RESTART).c_str(), Settings.sleep, - Settings.cfg_holder, Settings.bootcount, Settings.save_flag, GetSettingsAddress()); + 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, GetDateAndTime(DT_BOOTCOUNT).c_str(), Settings.save_flag, GetSettingsAddress()); MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "1")); } if ((0 == payload) || (2 == payload)) { Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS2_FIRMWARE "\":{\"" D_JSON_VERSION "\":\"%s%s\",\"" D_JSON_BUILDDATETIME "\":\"%s\",\"" D_JSON_BOOTVERSION "\":%d,\"" D_JSON_COREVERSION "\":\"" ARDUINO_ESP8266_RELEASE "\",\"" D_JSON_SDKVERSION "\":\"%s\"," - "\"Hardware\":\"%s\"}}"), + "\"Hardware\":\"%s\"" + "%s}}"), my_version, my_image, GetBuildDateAndTime().c_str(), - ESP.getBootVersion(), ESP.getSdkVersion(), GetDeviceHardware().c_str()); + ESP.getBootVersion(), ESP.getSdkVersion(), + GetDeviceHardware().c_str(), + GetStatistics().c_str()); MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "2")); } @@ -388,7 +410,7 @@ void CmndStatus(void) D_CMND_LOGHOST "\":\"%s\",\"" D_CMND_LOGPORT "\":%d,\"" D_CMND_SSID "\":[\"%s\",\"%s\"],\"" D_CMND_TELEPERIOD "\":%d,\"" D_JSON_RESOLUTION "\":\"%08X\",\"" D_CMND_SETOPTION "\":[\"%08X\",\"%s\",\"%08X\",\"%08X\"]}}"), Settings.seriallog_level, Settings.weblog_level, Settings.mqttlog_level, Settings.syslog_level, - Settings.syslog_host, Settings.syslog_port, Settings.sta_ssid[0], Settings.sta_ssid[1], Settings.tele_period, + SettingsText(SET_SYSLOG_HOST), Settings.syslog_port, SettingsText(SET_STASSID1), SettingsText(SET_STASSID2), Settings.tele_period, Settings.flag2.data, Settings.flag.data, ToHex_P((unsigned char*)Settings.param, PARAM8_SIZE, stemp2, sizeof(stemp2)), Settings.flag3.data, Settings.flag4.data); MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "3")); @@ -397,10 +419,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(); @@ -411,25 +433,18 @@ 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")); } if (((0 == payload) || (6 == payload)) && Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT -#ifdef USE_MQTT_AWS_IOT - Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS6_MQTT "\":{\"" D_CMND_MQTTHOST "\":\"%s%s\",\"" D_CMND_MQTTPORT "\":%d,\"" D_CMND_MQTTCLIENT D_JSON_MASK "\":\"%s\",\"" - D_CMND_MQTTCLIENT "\":\"%s\",\"" D_JSON_MQTT_COUNT "\":%d,\"MAX_PACKET_SIZE\":%d,\"KEEPALIVE\":%d}}"), - Settings.mqtt_user, Settings.mqtt_host, Settings.mqtt_port, Settings.mqtt_client, - mqtt_client, MqttConnectCount(), MQTT_MAX_PACKET_SIZE, MQTT_KEEPALIVE); -#else Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS6_MQTT "\":{\"" D_CMND_MQTTHOST "\":\"%s\",\"" D_CMND_MQTTPORT "\":%d,\"" D_CMND_MQTTCLIENT D_JSON_MASK "\":\"%s\",\"" D_CMND_MQTTCLIENT "\":\"%s\",\"" D_CMND_MQTTUSER "\":\"%s\",\"" D_JSON_MQTT_COUNT "\":%d,\"MAX_PACKET_SIZE\":%d,\"KEEPALIVE\":%d}}"), - Settings.mqtt_host, Settings.mqtt_port, Settings.mqtt_client, - mqtt_client, Settings.mqtt_user, MqttConnectCount(), MQTT_MAX_PACKET_SIZE, MQTT_KEEPALIVE); -#endif + SettingsText(SET_MQTT_HOST), Settings.mqtt_port, SettingsText(SET_MQTT_CLIENT), + mqtt_client, SettingsText(SET_MQTT_USER), MqttConnectCount(), MQTT_MAX_PACKET_SIZE, MQTT_KEEPALIVE); MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "6")); } @@ -442,13 +457,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")); } @@ -483,6 +498,15 @@ void CmndStatus(void) MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "11")); } + if (CrashFlag()) { + if ((0 == payload) || (12 == payload)) { + Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS12_STATUS "\":")); + CrashDump(); + ResponseJsonEnd(); + MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "12")); + } + } + #ifdef USE_SCRIPT_STATUS if (bitRead(Settings.rule_enabled, 0)) Run_Scripter(">U",2,mqtt_data); #endif @@ -542,10 +566,10 @@ void CmndUpgrade(void) void CmndOtaUrl(void) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.ota_url))) { - strlcpy(Settings.ota_url, (SC_DEFAULT == Shortcut()) ? OTA_URL : XdrvMailbox.data, sizeof(Settings.ota_url)); + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_OTAURL, (SC_DEFAULT == Shortcut()) ? OTA_URL : XdrvMailbox.data); } - ResponseCmndChar(Settings.ota_url); + ResponseCmndChar(SettingsText(SET_OTAURL)); } void CmndSeriallog(void) @@ -564,6 +588,15 @@ void CmndRestart(void) restart_flag = 2; ResponseCmndChar(D_JSON_RESTARTING); break; + 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(); @@ -846,6 +879,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)) { @@ -1103,13 +1144,54 @@ void CmndSerialConfig(void) void CmndBaudrate(void) { - if (XdrvMailbox.payload >= 300) { - SetSerialBaudrate(XdrvMailbox.payload); + if (XdrvMailbox.payload >= 300) { + XdrvMailbox.payload /= 300; // Make it a valid baudrate + uint32_t baudrate = (XdrvMailbox.payload & 0xFFFF) * 300; + SetSerialBaudrate(baudrate); } + ResponseCmndNumber(Settings.baudrate * 300); +} - SerialCfg config = SettingToSerialCfg(Settings.serial_config); +void CmndSerialConfig(void) +{ + // See TasmotaSerialConfig for possible options + // SerialConfig 0..23 where 3 equals 8N1 + // SerialConfig 8N1 - ResponseCmndNumber(config.baudrate * 300); + if (XdrvMailbox.data_len > 0) { + if (XdrvMailbox.data_len < 3) { // Use 0..23 as serial config option + if ((XdrvMailbox.payload >= TS_SERIAL_5N1) && (XdrvMailbox.payload <= TS_SERIAL_8O2)) { + SetSerialConfig(XdrvMailbox.payload); + } + } + else if ((XdrvMailbox.payload >= 5) && (XdrvMailbox.payload <= 8)) { + uint8_t serial_config = XdrvMailbox.payload -5; // Data bits 5, 6, 7 or 8, No parity and 1 stop bit + + bool valid = true; + char parity = (XdrvMailbox.data[1] & 0xdf); + if ('E' == parity) { + serial_config += 0x08; // Even parity + } + else if ('O' == parity) { + serial_config += 0x10; // Odd parity + } + else if ('N' != parity) { + valid = false; + } + + if ('2' == XdrvMailbox.data[2]) { + serial_config += 0x04; // Stop bits 2 + } + else if ('1' != XdrvMailbox.data[2]) { + valid = false; + } + + if (valid) { + SetSerialConfig(serial_config); + } + } + } + ResponseCmndChar(GetSerialConfig().c_str()); } void CmndSerialSend(void) @@ -1163,10 +1245,10 @@ void CmndSyslog(void) void CmndLoghost(void) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.syslog_host))) { - strlcpy(Settings.syslog_host, (SC_DEFAULT == Shortcut()) ? SYS_LOG_HOST : XdrvMailbox.data, sizeof(Settings.syslog_host)); + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_SYSLOG_HOST, (SC_DEFAULT == Shortcut()) ? SYS_LOG_HOST : XdrvMailbox.data); } - ResponseCmndChar(Settings.syslog_host); + ResponseCmndChar(SettingsText(SET_SYSLOG_HOST)); } void CmndLogport(void) @@ -1193,18 +1275,20 @@ void CmndIpAddress(void) void CmndNtpServer(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 3)) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.ntp_server[0]))) { - strlcpy(Settings.ntp_server[XdrvMailbox.index -1], - (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? (1==XdrvMailbox.index)?NTP_SERVER1:(2==XdrvMailbox.index)?NTP_SERVER2:NTP_SERVER3 : XdrvMailbox.data, - sizeof(Settings.ntp_server[0])); - for (uint32_t i = 0; i < strlen(Settings.ntp_server[XdrvMailbox.index -1]); i++) { - if (Settings.ntp_server[XdrvMailbox.index -1][i] == ',') Settings.ntp_server[XdrvMailbox.index -1][i] = '.'; + 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; } -// restart_flag = 2; // Issue #3890 - ntp_force_sync = true; + ResponseCmndIdxChar(SettingsText(ntp_server)); } - ResponseCmndIdxChar(Settings.ntp_server[XdrvMailbox.index -1]); } } @@ -1221,33 +1305,35 @@ void CmndAp(void) } restart_flag = 2; } - Response_P(S_JSON_COMMAND_NVALUE_SVALUE, XdrvMailbox.command, Settings.sta_active +1, Settings.sta_ssid[Settings.sta_active]); + Response_P(S_JSON_COMMAND_NVALUE_SVALUE, XdrvMailbox.command, Settings.sta_active +1, SettingsText(SET_STASSID1 + Settings.sta_active)); } void CmndSsid(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 2)) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.sta_ssid[0]))) { - strlcpy(Settings.sta_ssid[XdrvMailbox.index -1], - (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? (1 == XdrvMailbox.index) ? STA_SSID1 : STA_SSID2 : XdrvMailbox.data, - sizeof(Settings.sta_ssid[0])); - 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(Settings.sta_ssid[XdrvMailbox.index -1]); } } void CmndPassword(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 2)) { - if ((XdrvMailbox.data_len > 4 || SC_CLEAR == Shortcut() || SC_DEFAULT == Shortcut()) && (XdrvMailbox.data_len < sizeof(Settings.sta_pwd[0]))) { - strlcpy(Settings.sta_pwd[XdrvMailbox.index -1], - (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? (1 == XdrvMailbox.index) ? STA_PASS1 : STA_PASS2 : XdrvMailbox.data, - sizeof(Settings.sta_pwd[0])); + if ((XdrvMailbox.data_len > 4) || (SC_CLEAR == Shortcut()) || (SC_DEFAULT == Shortcut())) { + SettingsUpdateText(SET_STAPWD1 + XdrvMailbox.index -1, + (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? (1 == XdrvMailbox.index) ? STA_PASS1 : STA_PASS2 : XdrvMailbox.data); Settings.sta_active = XdrvMailbox.index -1; restart_flag = 2; - ResponseCmndIdxChar(Settings.sta_pwd[XdrvMailbox.index -1]); + ResponseCmndIdxChar(SettingsText(SET_STAPWD1 + XdrvMailbox.index -1)); } else { Response_P(S_JSON_COMMAND_INDEX_ASTERISK, XdrvMailbox.command, XdrvMailbox.index); } @@ -1256,14 +1342,14 @@ void CmndPassword(void) void CmndHostname(void) { - if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.hostname))) { - strlcpy(Settings.hostname, (SC_DEFAULT == Shortcut()) ? WIFI_HOSTNAME : XdrvMailbox.data, sizeof(Settings.hostname)); - if (strstr(Settings.hostname, "%") != nullptr) { - strlcpy(Settings.hostname, WIFI_HOSTNAME, sizeof(Settings.hostname)); + if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0)) { + SettingsUpdateText(SET_HOSTNAME, (SC_DEFAULT == Shortcut()) ? WIFI_HOSTNAME : XdrvMailbox.data); + if (strstr(SettingsText(SET_HOSTNAME), "%") != nullptr) { + SettingsUpdateText(SET_HOSTNAME, WIFI_HOSTNAME); } restart_flag = 2; } - ResponseCmndChar(Settings.hostname); + ResponseCmndChar(SettingsText(SET_HOSTNAME)); } void CmndWifiConfig(void) @@ -1285,16 +1371,20 @@ void CmndWifiConfig(void) void CmndFriendlyname(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_FRIENDLYNAMES)) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.friendlyname[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) { + 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); } - strlcpy(Settings.friendlyname[XdrvMailbox.index -1], (SC_DEFAULT == Shortcut()) ? stemp1 : XdrvMailbox.data, sizeof(Settings.friendlyname[XdrvMailbox.index -1])); + ResponseCmndIdxChar(SettingsText(SET_FRIENDLYNAME1 + XdrvMailbox.index -1)); } - ResponseCmndIdxChar(Settings.friendlyname[XdrvMailbox.index -1]); } } @@ -1350,6 +1440,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; @@ -1403,6 +1498,7 @@ void CmndReset(void) break; case 99: Settings.bootcount = 0; + Settings.bootcount_reset_time = 0; ResponseCmndDone(); break; default: @@ -1588,7 +1684,7 @@ void CmndWifiPower(void) } WifiSetOutputPower(); } - ResponseCmndFloat((float)(Settings.wifi_output_power) / 10, 1); + ResponseCmndChar(WifiGetOutputPower().c_str()); } #ifdef USE_I2C @@ -1613,6 +1709,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 new file mode 100644 index 000000000..cc9721cb4 --- /dev/null +++ b/tasmota/support_crash_recorder.ino @@ -0,0 +1,111 @@ +/* + support_crash_recorder.ino - record the call stack in RTC in case of crash + + 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 + 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 . +*/ + +const uint32_t crash_magic = 0x53415400; // Stack trace magic number (TASx) +const uint32_t crash_rtc_offset = 32; // Offset in RTC memory skipping OTA used block +const uint32_t crash_dump_max_len = 31; // Dump only 31 call addresses to satisfy max JSON length of about 600 characters + +/** + * Save crash information in RTC memory + * This function is called automatically if ESP8266 suffers an exception + * It should be kept quick / consise to be able to execute before hardware wdt may kick in + */ +extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack, uint32_t stack_end ) +{ + uint32_t addr_written = 0; // how many addresses have we already written in RTC + uint32_t value; // 4 bytes buffer to write to RTC + + for (uint32_t i = stack; i < stack_end; i += 4) { + value = *((uint32_t*) i); // load value from stack + if ((value >= 0x40000000) && (value < 0x40300000)) { // keep only addresses in code area + ESP.rtcUserMemoryWrite(crash_rtc_offset + addr_written, (uint32_t*)&value, sizeof(value)); + addr_written++; + if (addr_written >= crash_dump_max_len) { break; } // we store only 31 addresses + } + } + value = crash_magic + addr_written; + ESP.rtcUserMemoryWrite(crash_rtc_offset + crash_dump_max_len, (uint32_t*)&value, sizeof(value)); +} + +// Generate a crash to test the crash recorder +void CmndCrash(void) +{ + volatile uint32_t dummy; + 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) +{ + uint32_t value = 0; + ESP.rtcUserMemoryWrite(crash_rtc_offset + crash_dump_max_len, (uint32_t*)&value, sizeof(value)); +} + +/*********************************************************************************************\ + * 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\""), + resetInfo.exccause, // Exception Cause + GetResetReason().c_str(), // Reset Reason + resetInfo.epc1, // Exception Progam Counter + resetInfo.epc2, // Exception Progam Counter - High-Priority Interrupt 1 + resetInfo.epc3, // Exception Progam Counter - High-Priority Interrupt 2 + resetInfo.excvaddr, // Exception Virtual Address Register - Virtual address that caused last fetch, load, or store exception + resetInfo.depc); // Double Exception Program Counter + + uint32_t value; + ESP.rtcUserMemoryRead(crash_rtc_offset + crash_dump_max_len, (uint32_t*)&value, sizeof(value)); + if (crash_magic == (value & 0xFFFFFF00)) { + ResponseAppend_P(PSTR(",\"CallChain\":[")); + uint32_t count = value & 0x3F; + for (uint32_t i = 0; i < count; i++) { + ESP.rtcUserMemoryRead(crash_rtc_offset +i, (uint32_t*)&value, sizeof(value)); + if (i > 0) { ResponseAppend_P(PSTR(",")); } + ResponseAppend_P(PSTR("\"%08x\""), value); + } + ResponseAppend_P(PSTR("]")); + } + + ResponseJsonEnd(); +} diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino new file mode 100644 index 000000000..b6df25606 --- /dev/null +++ b/tasmota/support_device_groups.ino @@ -0,0 +1,709 @@ +/* + 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 + +extern bool udp_connected; + +struct device_group_member { + struct device_group_member * flink; + IPAddress ip_address; + uint32_t timeout_time; + uint16_t received_sequence; + uint16_t acked_sequence; +}; + +struct device_group { + uint32_t next_ack_check_time; + uint16_t last_full_status_sequence; + uint16_t message_length; + 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; +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 waiting_for_acks; +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; +} + +// 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: + 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_DIMMER_RANGE: + mask = DGR_SHARE_DIMMER_RANGE; + 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) +{ + 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_REQUEST); + 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 + uint16_t original_sequence = outgoing_sequence; + if (!building_status_message && message_type != DGR_MSGTYP_PARTIAL_UPDATE && !++outgoing_sequence) outgoing_sequence = 1; + *message_ptr++ = outgoing_sequence & 0xff; + *message_ptr++ = outgoing_sequence >> 8; + + 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++ = value & 0xff; + *message_ptr++ = value >> 8; + char * first_item_ptr = message_ptr; + + // 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++ = 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); + + // If there weren't any items added to the message, restore the outgoing message sequence and + // return. + if (message_ptr == first_item_ptr) { + outgoing_sequence = original_sequence; + return; + } + + // 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(IPAddress(239,255,255,250), device_group->message, device_group->message_length, PSTR("Multicast")); + device_group->next_ack_check_time = millis() + 100; + + if (message_type == DGR_MSGTYP_UPDATE_MORE_TO_COME) { + 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 { + waiting_for_acks = true; + } +} + +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 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; + } + device_group_member->timeout_time = 0; +#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 && 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: + case DGR_ITEM_DIMMER_RANGE: + 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("message[device_group->message_header_length]; + if (!++outgoing_sequence) outgoing_sequence = 1; + *message_ptr++ = outgoing_sequence & 0xff; + *message_ptr++ = outgoing_sequence >> 8; + *message_ptr++ = DGR_FLAG_RESET | DGR_FLAG_STATUS_REQUEST; + *message_ptr++ = 0; + device_group->message_length = message_ptr - device_group->message; + device_group->initial_status_requests_remaining = 5; + device_group->next_ack_check_time = millis() + 1000; + } + + waiting_for_acks = true; + } + + if (device_groups_initialization_failed) return; + + if (waiting_for_acks) { + uint32_t now = millis(); + waiting_for_acks = false; + 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 (device_group->next_ack_check_time) { + if (device_group->next_ack_check_time <= now) { + 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(IPAddress(239,255,255,250), 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; + waiting_for_acks = true; + } + else { + device_group->next_ack_check_time = 0; + _SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_FULL_STATUS); + } + } + else { + 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 (device_group_member->acked_sequence != outgoing_sequence) { + + if (device_group_member->timeout_time && 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); + } + 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")); + if (!device_group_member->timeout_time) device_group_member->timeout_time = now + 15000; + acked = false; + flink = &device_group_member->flink; + } + } + else { + flink = &device_group_member->flink; + } + } + if (acked) { + device_group->next_ack_check_time = 0; + device_group->message_length = 0; + } + else { + device_group->next_ack_check_time = now + 500; + waiting_for_acks = true; + } + } + } + else { + waiting_for_acks = true; + } + } + } + } + } + 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 be4c8f6a4..961dd1091 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,24 +484,96 @@ 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; // xsns_58_dht12.ino +#endif +#ifdef USE_DS1624 + feature5 |= 0x00200000; // xsns_59_ds1624.ino +#endif +#ifdef USE_GPS + 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 |= 0x00100000; -// feature5 |= 0x00200000; -// feature5 |= 0x00400000; -// 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 +// feature6 |= 0x00000008; + +// 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 new file mode 100644 index 000000000..162ea1f0b --- /dev/null +++ b/tasmota/support_flash_log.ino @@ -0,0 +1,432 @@ +/* + support_flash_log.ino - log to flash support for Sonoff-Tasmota + + 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 + 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 . + + -------------------------------------------------------------------------------------------- + Version Date Action Description + -------------------------------------------------------------------------------------------- + + + --- + 1.0.0.0 20190923 started - further development by Christian Baars - https://github.com/Staars/Sonoff-Tasmota + forked - from arendst/tasmota - https://github.com/arendst/Sonoff-Tasmota + base - code base from arendst and - written from scratch + +*/ + +/********************************************************************************************\ +| * 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 +| * erased and is the anchor point for downloading and state configuration +| * after reboot. +\*********************************************************************************************/ + +#ifdef USE_FLOG + +class FLOG + +#define MAGIC_WORD_FL 0x464c //F, L + +{ + +struct header_t{ + uint16_t magic_word; // FL + uint16_t padding; // leave something for the future + uint32_t physical_start_sector:10; //first used sector of the current FLOG + uint32_t number:10; // number of this sector, starting with 0 for the first sector + uint32_t buf_pointer:12; //internal pointer to the next free position in the buffer = first empty byte when reading + }; // should be 4-byte-aligned + +private: +void _readSector(uint8_t one_sector); +void _eraseSector(uint8_t one_sector); +void _writeSector(uint8_t one_sector); +void _clearBuffer(void); +void _searchSaves(void); +void _findFirstErasedSector(void); +void _showBuffer(void); +void _initBuffer(void); +void _saveBufferToSector(void); +header_t _saved_header; + +public: + uint32_t size; // size of OTA-partition + uint32_t start; // start position of OTA-partition in bytes + uint32_t end; // end position of OTA-partition in bytes + uint16_t num_sectors; // calculated number of sectors with a size of 4096 bytes + + uint16_t first_erased_sector; // this will be our new start + uint16_t current_sector; // always point to next sector, where data from the buffer will be written to + + uint16_t bytes_left; // byte per buffer (of sector size 4096 bytes - 8 byte header size) + uint16_t sectors_left; // number of saved sectors for download + + uint8_t mode = 0; // 0 - write once on all sectors, then stop, 1 - write infinitely through the sectors + bool found_saved_data = false; // possible saved data has been found + bool ready = false; // the FLOG is initialized + bool running_download = false; // a download operation is running + bool recording = false; // ready for recording + + union sector_t{ + uint32_t dword_buffer[FLASH_SECTOR_SIZE/4]; + uint8_t byte_buffer[FLASH_SECTOR_SIZE]; + header_t header; // should be 4-byte-aligned + } sector; // the global buffer of 4096 bytes, used for reading and writing + + void init(void); + void addToBuffer(uint8_t src[], uint32_t size); + void startRecording(bool append); + void stopRecording(void); + + 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); +}; + +extern "C" uint32_t _SPIFFS_start; // we make shure later, that only one of the two is really used ... +extern "C" uint32_t _FS_start; // ... depending on core-sdk-version + +/** + * @brief Will examine the start and end of the OTA-partition. Then the sector size will be computed, saved data should be found and the initial state will be configured. + */ +void FLOG::init(void) +{ +DEBUG_SENSOR_LOG(PSTR("FLOG: init ...")); +size = ESP.getSketchSize(); +// round one sector up +start = (size + FLASH_SECTOR_SIZE - 1) & (~(FLASH_SECTOR_SIZE - 1)); +#if defined(ARDUINO_ESP8266_RELEASE_2_3_0) || defined(ARDUINO_ESP8266_RELEASE_2_4_0) || defined(ARDUINO_ESP8266_RELEASE_2_4_1) || defined(ARDUINO_ESP8266_RELEASE_2_4_2) || defined(ARDUINO_ESP8266_RELEASE_2_5_0) || defined(ARDUINO_ESP8266_RELEASE_2_5_1) || defined(ARDUINO_ESP8266_RELEASE_2_5_2) +end = (uint32_t)&_SPIFFS_start - 0x40200000; +#else // Core > 2.5.2 and STAGE +end = (uint32_t)&_FS_start - 0x40200000; +#endif +num_sectors = (end - start)/FLASH_SECTOR_SIZE; +DEBUG_SENSOR_LOG(PSTR("FLOG: size: 0x%lx, start: 0x%lx, end: 0x%lx, num_sectors(dec): %lu"), size, start, end, num_sectors ); +_findFirstErasedSector(); +if(first_erased_sector == 0xffff){ + _eraseSector(0); + first_erased_sector = 0; // start with sector 0, could be first run or after crash +} +_searchSaves(); +_initBuffer(); +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); + 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); + 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); + 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++){ + sector.dword_buffer[i] = 0; + } + sector.header.buf_pointer = sizeof(sector.header); + // _showBuffer(); +} +/** + * @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); + _writeSector(current_sector); + if(current_sector == num_sectors){ // 1 MB means ~110 sectors in OTA-partition, if we reach this, start a again + current_sector = 0; + } + else{ + current_sector++; + } + _eraseSector(current_sector); // we always erase the next sector, to find out were we are after restart + _clearBuffer(); + sector.header.number++; + DEBUG_SENSOR_LOG(PSTR("FLOG: new sector header number: %u" ),sector.header.number); +} + +/** + * @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; + } + } +} + +/** + * @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 + */ +void FLOG::addToBuffer(uint8_t src[], uint32_t size){ + if(mode == 0){ + if(sector.header.number == num_sectors && !ready){ + return; // we ignore additional calls and are done, TODO: maybe use meaningful return values + } + } + if((FLASH_SECTOR_SIZE-sector.header.buf_pointer-sizeof(sector.header))>size){ + // DEBUG_SENSOR_LOG(PSTR("FLOG: enough space left in buffer: %u"), FLASH_SECTOR_SIZE - sector.header.buf_pointer - sizeof(sector.header)); + // DEBUG_SENSOR_LOG(PSTR("FLOG: current buf_pointer: %u, size of added: %u"), sector.header.buf_pointer, size); + + memcpy(sector.byte_buffer + sector.header.buf_pointer, src, size); + sector.header.buf_pointer+=size; // this is the next free spot + // DEBUG_SENSOR_LOG(PSTR("FLOG: current buf_pointer: %u"), sector.header.buf_pointer); + } + else{ + DEBUG_SENSOR_LOG(PSTR("FLOG: save buffer to flash sector: %u"), current_sector); + DEBUG_SENSOR_LOG(PSTR("FLOG: current buf_pointer: %u"), sector.header.buf_pointer); + _saveBufferToSector(); + sectors_left++; + // but now save the data to the fresh buffer + if((FLASH_SECTOR_SIZE-sector.header.buf_pointer-sizeof(sector.header))>size){ + memcpy(sector.byte_buffer + sector.header.buf_pointer, src, size); + sector.header.buf_pointer+=size; // this is the next free spot + } + } +} + +/** + * @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){ + if(recording){ + DEBUG_SENSOR_LOG(PSTR("FLOG: already recording")); + return; + } + recording = true; + DEBUG_SENSOR_LOG(PSTR("FLOG: start recording")); + _initBuffer(); + if(!found_saved_data) { + 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; + found_saved_data = false; + sectors_left = 0; + } + } + +/** + * @brief stop recording including saving current buffer to FLASH + * + */ +void FLOG::stopRecording(void){ + _saveBufferToSector(); + _findFirstErasedSector(); + _searchSaves(); + _initBuffer(); + recording = false; + found_saved_data = true; + } + +/** + * @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; + * 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(""); + */ + void FLOG::startDownload(size_t size, CallbackNoArgs sendHeader, CallbackWithArgs sendRecord, CallbackNoArgs sendFooter){ + + _readSector(sector.header.physical_start_sector); + uint32_t next_sector = sector.header.physical_start_sector; + bytes_left = sector.header.buf_pointer - sizeof(sector.header); + DEBUG_SENSOR_LOG(PSTR("FLOG: create file for download, will process %u bytes"), bytes_left); + running_download = true; + // Callback 1: Create the header incl. file name, content length (probably unknown!!) and additional header stuff + sendHeader(); + + while(sectors_left){ + DEBUG_SENSOR_LOG(PSTR("FLOG: next sector: %u"), next_sector); + //initially we have the first sector already loaded, so we do it at the bottom + uint32_t k = sizeof(sector.header); + while(bytes_left){ + // DEBUG_SENSOR_LOG(PSTR("FLOG: DL %u %u"), Flog->sector.byte_buffer[k],Flog->sector.byte_buffer[k+1]); + uint8_t *_record_start = (uint8_t*)§or.byte_buffer[k]; // this is basically the start address of the current record/entry of the Log + // Callback 2: send the pointer for consuming the next record/entry and doing something useful to create a file + sendRecord(_record_start); + if(k%128 == 0){ // give control to the system every x iteration, TODO: This will fail, when record/entry-size is not 8 + // DEBUG_SENSOR_LOG(PSTR("FLOG: now loop(), %u bytes left"), Flog->bytes_left); + OsWatchLoop(); + delay(sleep); + } + k+=size; + if(bytes_left>7){ + bytes_left-=size; + } + else{ + bytes_left = 0; + DEBUG_SENSOR_LOG(PSTR("FLOG: Flog->bytes_left not dividable by 8 ??????")); + } + } + next_sector++; + if(next_sector>num_sectors){ + next_sector = 0; + } + sectors_left--; + _readSector(next_sector); + 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(); + // refresh settings for another download + _searchSaves(); + _initBuffer(); + } + + #endif // USE_FLOG \ No newline at end of file diff --git a/tasmota/support_float.ino b/tasmota/support_float.ino index 21ec2f47d..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 @@ -172,6 +172,7 @@ double const f_sixthpi = f_pi / 6.0; // f_pi/6.0, used in double const f_tansixthpi = tan(f_sixthpi); // tan(f_pi/6), used in atan routines double const f_twelfthpi = f_pi / 12.0; // f_pi/12.0, used in atan routines double const f_tantwelfthpi = tan(f_twelfthpi); // tan(f_pi/12), used in atan routines +float const f_180pi = 180 / f_pi; // 180 / pi for angles in degrees // ******************************************************************* // *** 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 ffb7239a6..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) { @@ -379,11 +368,12 @@ void RtcSecond(void) Rtc.ntp_sync_minute = 1; // If sync prepare for a new cycle } uint8_t offset = (uptime < 30) ? RtcTime.second : (((ESP.getChipId() & 0xF) * 3) + 3) ; // First try ASAP to sync. If fails try once every 60 seconds based on chip id - if ( (((offset == RtcTime.second) && ( (RtcTime.year < 2016) || (Rtc.ntp_sync_minute == uptime_minute))) || ntp_force_sync ) ) { + if ( (((offset == RtcTime.second) && ( (RtcTime.year < 2016) || // Never synced + (Rtc.ntp_sync_minute == uptime_minute))) || // Re-sync every hour + ntp_force_sync ) ) { // Forced sync 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) { @@ -394,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; @@ -436,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); @@ -458,7 +453,9 @@ void RtcSetTime(uint32_t epoch) if (epoch < START_VALID_TIME) { // 2016-01-01 Rtc.user_time_entry = false; ntp_force_sync = true; + sntp_init(); } else { + sntp_stop(); Rtc.user_time_entry = true; Rtc.utc_time = epoch -1; // Will be corrected by RtcSecond } @@ -467,9 +464,9 @@ void RtcSetTime(uint32_t epoch) void RtcInit(void) { - sntp_setservername(0, Settings.ntp_server[0]); - sntp_setservername(1, Settings.ntp_server[1]); - sntp_setservername(2, Settings.ntp_server[2]); + sntp_setservername(0, SettingsText(SET_NTPSERVER1)); + sntp_setservername(1, SettingsText(SET_NTPSERVER2)); + sntp_setservername(2, SettingsText(SET_NTPSERVER3)); sntp_stop(); sntp_set_timezone(0); // UTC time sntp_init(); 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 new file mode 100644 index 000000000..59318e575 --- /dev/null +++ b/tasmota/support_statistics.ino @@ -0,0 +1,41 @@ +/* + support_statistics.ino - gather statistics for Tasmota + + 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 + 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 . +*/ + +#define USE_STATS_CODE + +#ifdef USE_STATS_CODE +/*********************************************************************************************\ + * Gather statistics +\*********************************************************************************************/ + +String GetStatistics(void) +{ + char data[40]; + snprintf_P(data, sizeof(data), PSTR(",\"CR\":\"%d/%d\""), GetSettingsTextLen(), settings_text_size); // Char Usage Ratio + return String(data); +} + +#else + +String GetStatistics(void) +{ + return String(""); +} + +#endif // USE_STATS_CODE \ No newline at end of file diff --git a/tasmota/support_switch.ino b/tasmota/support_switch.ino index af085468a..49b9428b0 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 @@ -48,21 +48,32 @@ 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) + ) ^ Switch.last_state[index]; +} + /*********************************************************************************************/ void SwitchProbe(void) @@ -137,22 +148,52 @@ 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}; +// enum SwitchModeOptions {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE, TOGGLEMULTI, FOLLOWMULTI, FOLLOWMULTI_INV, PUSHHOLDMULTI, PUSHHOLDMULTI_INV, MAX_SWITCH_OPTION}; if (button != Switch.last_state[i]) { - uint8_t switchflag = POWER_TOGGLE +1; switch (Settings.switchmode[i]) { case TOGGLE: + case PUSHBUTTON_TOGGLE: switchflag = POWER_TOGGLE; // Toggle break; case FOLLOW: @@ -171,39 +212,66 @@ void SwitchHandler(uint8_t mode) 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; + 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 + Switch.hold_timer[i] = 0; // Button released and hold timer not expired : stop timer... + switchflag = POWER_TOGGLE; // ...and Toggle } break; 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(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(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(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(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; } - - 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) + } + } } } } diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 2f54cec7d..19f592a18 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 @@ -60,15 +60,16 @@ char* Format(char* output, const char* input, int size) char* GetOtaUrl(char *otaurl, size_t otaurl_size) { - if (strstr(Settings.ota_url, "%04d") != nullptr) { // OTA url contains placeholder for chip ID - snprintf(otaurl, otaurl_size, Settings.ota_url, ESP.getChipId() & 0x1fff); + if (strstr(SettingsText(SET_OTAURL), "%04d") != nullptr) { // OTA url contains placeholder for chip ID + snprintf(otaurl, otaurl_size, SettingsText(SET_OTAURL), ESP.getChipId() & 0x1fff); } - else if (strstr(Settings.ota_url, "%d") != nullptr) { // OTA url contains placeholder for chip ID - snprintf_P(otaurl, otaurl_size, Settings.ota_url, ESP.getChipId()); + else if (strstr(SettingsText(SET_OTAURL), "%d") != nullptr) { // OTA url contains placeholder for chip ID + snprintf_P(otaurl, otaurl_size, SettingsText(SET_OTAURL), ESP.getChipId()); } else { - strlcpy(otaurl, Settings.ota_url, otaurl_size); + strlcpy(otaurl, SettingsText(SET_OTAURL), otaurl_size); } + return otaurl; } @@ -101,17 +102,19 @@ char* GetTopic_P(char *stopic, uint32_t prefix, char *topic, const char* subtopi fulltopic += topic; // cmnd/ } } else { - fulltopic = Settings.mqtt_fulltopic; + fulltopic = SettingsText(SET_MQTT_FULLTOPIC); if ((0 == prefix) && (-1 == fulltopic.indexOf(FPSTR(MQTT_TOKEN_PREFIX)))) { fulltopic += F("/"); fulltopic += FPSTR(MQTT_TOKEN_PREFIX); // Need prefix for commands to handle mqtt topic loops } - for (uint32_t i = 0; i < 3; i++) { - if ('\0' == Settings.mqtt_prefix[i][0]) { - GetTextIndexed(Settings.mqtt_prefix[i], sizeof(Settings.mqtt_prefix[i]), i, kPrefixes); + 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)); } } - fulltopic.replace(FPSTR(MQTT_TOKEN_PREFIX), Settings.mqtt_prefix[prefix]); + fulltopic.replace(FPSTR(MQTT_TOKEN_PREFIX), SettingsText(SET_MQTTPREFIX1 + prefix)); + fulltopic.replace(FPSTR(MQTT_TOKEN_TOPIC), topic); fulltopic.replace(F("%hostname%"), my_hostname); String token_id = WiFi.macAddress(); @@ -131,7 +134,7 @@ char* GetGroupTopic_P(char *stopic, const char* subtopic) { // SetOption75 0: %prefix%/nothing/%topic% = cmnd/nothing//# // SetOption75 1: cmnd/ - return GetTopic_P(stopic, (Settings.flag3.grouptopic_mode) ? CMND +8 : CMND, Settings.mqtt_grptopic, subtopic); // SetOption75 - GroupTopic replaces %topic% (0) or fixed topic cmnd/grouptopic (1) + return GetTopic_P(stopic, (Settings.flag3.grouptopic_mode) ? CMND +8 : CMND, SettingsText(SET_MQTT_GRP_TOPIC), subtopic); // SetOption75 - GroupTopic replaces %topic% (0) or fixed topic cmnd/grouptopic (1) } char* GetFallbackTopic_P(char *stopic, const char* subtopic) @@ -141,10 +144,10 @@ char* GetFallbackTopic_P(char *stopic, const char* subtopic) char* GetStateText(uint32_t state) { - if (state > 3) { + if (state >= MAX_STATE_TEXT) { state = 1; } - return Settings.state_text[state]; + return SettingsText(SET_STATE_TXT1 + state); } /********************************************************************************************/ @@ -163,9 +166,7 @@ void SetLatchingRelay(power_t lpower, uint32_t state) for (uint32_t i = 0; i < devices_present; i++) { uint32_t port = (i << 1) + ((latching_power >> i) &1); - if (pin[GPIO_REL1 +port] < 99) { - digitalWrite(pin[GPIO_REL1 +port], bitRead(rel_inverted, port) ? !state : state); - } + DigitalWrite(GPIO_REL1 +port, bitRead(rel_inverted, port) ? !state : state); } } @@ -223,8 +224,8 @@ void SetDevicePower(power_t rpower, uint32_t source) else { for (uint32_t i = 0; i < devices_present; i++) { power_t state = rpower &1; - if ((i < MAX_RELAYS) && (pin[GPIO_REL1 +i] < 99)) { - digitalWrite(pin[GPIO_REL1 +i], bitRead(rel_inverted, i) ? !state : state); + if (i < MAX_RELAYS) { + DigitalWrite(GPIO_REL1 +i, bitRead(rel_inverted, i) ? !state : state); } rpower >>= 1; } @@ -234,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(); } @@ -275,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 @@ -290,8 +346,13 @@ void SetLedPowerIdx(uint32_t led, uint32_t state) } else { led_power &= (0xFF ^ mask); } - digitalWrite(pin[GPIO_LED1 + led], bitRead(led_inverted, led) ? !state : 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) @@ -327,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) @@ -358,10 +422,11 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state) char stopic[TOPSZ]; char scommand[CMDSZ]; - char key_topic[sizeof(Settings.button_topic)]; + char key_topic[TOPSZ]; bool result = false; + uint32_t device_save = device; - char *tmp = (key) ? Settings.switch_topic : Settings.button_topic; + char *tmp = (key) ? SettingsText(SET_MQTT_SWITCH_TOPIC) : SettingsText(SET_MQTT_BUTTON_TOPIC); Format(key_topic, tmp, sizeof(key_topic)); if (Settings.flag.mqtt_enabled && MqttIsConnected() && (strlen(key_topic) != 0) && strcmp(key_topic, "0")) { // SetOption3 - Enable MQTT if (!key && (device > devices_present)) { @@ -374,7 +439,7 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state) } else { if ((Settings.flag3.button_switch_force_local || // SetOption61 - Force local operation when button/switch topic is set !strcmp(mqtt_topic, key_topic) || - !strcmp(Settings.mqtt_grptopic, key_topic)) && + !strcmp(SettingsText(SET_MQTT_GRP_TOPIC), key_topic)) && (POWER_TOGGLE == state)) { state = ~(power >> (device -1)) &1; // POWER_OFF or POWER_ON } @@ -383,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 @@ -395,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; @@ -477,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); @@ -545,7 +613,7 @@ void MqttShowPWMState(void) void MqttShowState(void) { - char stemp1[33]; + char stemp1[TOPSZ]; ResponseAppendTime(); ResponseAppend_P(PSTR(",\"" D_JSON_UPTIME "\":\"%s\",\"UptimeSec\":%u"), GetUptime().c_str(), UpTime()); @@ -565,7 +633,7 @@ void MqttShowState(void) if (i == LightDevice()) { LightState(1); } // call it only once } else { #endif - ResponseAppend_P(PSTR(",\"%s\":{\"STATE\":\"%s\"}"), GetPowerDevice(stemp1, i, sizeof(stemp1), Settings.flag.device_index_enable), // SetOption26 - Switch between POWER or POWER1 + ResponseAppend_P(PSTR(",\"%s\":\"%s\""), GetPowerDevice(stemp1, i, sizeof(stemp1), Settings.flag.device_index_enable), // SetOption26 - Switch between POWER or POWER1 GetStateText(bitRead(power, i-1))); #ifdef USE_SONOFF_IFAN if (IsModuleIfan()) { @@ -573,6 +641,12 @@ void MqttShowState(void) break; } #endif // USE_SONOFF_IFAN +#ifdef USE_PWM_DIMMER + if (PWM_DIMMER == my_module_type) { + ResponseAppend_P(PSTR(",\"" D_CMND_DIMMER "\":%d,\"" D_CMND_FADE "\":\"%s\",\"" D_CMND_SPEED "\":%d"), + Settings.light_dimmer, GetStateText(Settings.light_fade), Settings.light_speed); + } +#endif // USE_PWM_DIMMER #ifdef USE_LIGHT } #endif @@ -583,8 +657,10 @@ void MqttShowState(void) MqttShowPWMState(); } - 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_LINK_COUNT "\":%d,\"" D_JSON_DOWNTIME "\":\"%s\"}}"), - Settings.sta_active +1, Settings.sta_ssid[Settings.sta_active], WiFi.BSSIDstr().c_str(), WiFi.channel(), WifiGetRssiAsQuality(WiFi.RSSI()), WifiLinkCount(), WifiDowntime().c_str()); + 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(rssi), rssi, WifiLinkCount(), WifiDowntime().c_str()); } void MqttPublishTeleState(void) @@ -608,8 +684,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\":{\"STATE\":\"%s\"}"), i +1, GetStateText(swm ^ SwitchLastState(i))); + ResponseAppend_P(PSTR(",\"" D_JSON_SWITCH "%d\":\"%s\""), i +1, GetStateText(SwitchState(i))); } } XsnsCall(FUNC_JSON_APPEND); @@ -622,6 +697,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); } @@ -636,19 +714,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); } @@ -666,6 +742,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) { @@ -708,15 +791,13 @@ void PerformEverySecond(void) #endif // USE_RULES } + XsnsCall(FUNC_AFTER_TELEPERIOD); XdrvCall(FUNC_AFTER_TELEPERIOD); } } } } -/*********************************************************************************************\ - * State loops -\*********************************************************************************************/ /*-------------------------------------------------------------------------------------------*\ * Every 0.1 second \*-------------------------------------------------------------------------------------------*/ @@ -726,6 +807,11 @@ 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); + prepped_loglevel = 0; + } + if (latching_relay_pulse) { latching_relay_pulse--; if (!latching_relay_pulse) SetLatchingRelay(0, 0); @@ -768,8 +854,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) @@ -812,7 +896,6 @@ void Every250mSeconds(void) if (ota_state_flag && BACKLOG_EMPTY) { ota_state_flag--; if (2 == ota_state_flag) { - ota_url = Settings.ota_url; RtcSettings.ota_loader = 0; // Try requested image first ota_retry_counter = OTA_ATTEMPTS; ESPhttpUpdate.rebootOnUpdate(false); @@ -832,15 +915,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(Settings.ota_url, '.'); // 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); @@ -865,13 +978,20 @@ void Every250mSeconds(void) } if (90 == ota_state_flag) { // Allow MQTT to reconnect ota_state_flag = 0; + Response_P(PSTR("{\"" D_CMND_UPGRADE "\":\"")); if (ota_result) { // SetFlashModeDout(); // Force DOUT for both ESP8266 and ESP8285 - Response_P(PSTR(D_JSON_SUCCESSFUL ". " D_JSON_RESTARTING)); + if (!VersionCompatible()) { + ResponseAppend_P(PSTR(D_JSON_FAILED " " D_UPLOAD_ERR_14)); + } else { + ResponseAppend_P(PSTR(D_JSON_SUCCESSFUL ". " D_JSON_RESTARTING)); + restart_flag = 2; + } } else { - Response_P(PSTR(D_JSON_FAILED " %s"), ESPhttpUpdate.getLastErrorString().c_str()); + ResponseAppend_P(PSTR(D_JSON_FAILED " %s"), ESPhttpUpdate.getLastErrorString().c_str()); } - restart_flag = 2; // Restart anyway to keep memory clean webserver + ResponseAppend_P(PSTR("\"}")); +// restart_flag = 2; // Restart anyway to keep memory clean webserver MqttPublishPrefixTopic_P(STAT, PSTR(D_CMND_UPGRADE)); } } @@ -902,26 +1022,45 @@ void Every250mSeconds(void) } if (restart_flag && BACKLOG_EMPTY) { if ((214 == restart_flag) || (215 == restart_flag) || (216 == restart_flag)) { - char storage_wifi[sizeof(Settings.sta_ssid) + - sizeof(Settings.sta_pwd)]; - char storage_mqtt[sizeof(Settings.mqtt_host) + - sizeof(Settings.mqtt_port) + - sizeof(Settings.mqtt_client) + - sizeof(Settings.mqtt_user) + - sizeof(Settings.mqtt_pwd) + - sizeof(Settings.mqtt_topic)]; - memcpy(storage_wifi, Settings.sta_ssid, sizeof(storage_wifi)); // Backup current SSIDs and Passwords - if (216 == restart_flag) { - memcpy(storage_mqtt, Settings.mqtt_host, sizeof(storage_mqtt)); // Backup mqtt host, port, client, username and password - } + // Backup current SSIDs and Passwords + char storage_ssid1[strlen(SettingsText(SET_STASSID1)) +1]; + strncpy(storage_ssid1, SettingsText(SET_STASSID1), sizeof(storage_ssid1)); + char storage_ssid2[strlen(SettingsText(SET_STASSID2)) +1]; + strncpy(storage_ssid2, SettingsText(SET_STASSID2), sizeof(storage_ssid2)); + char storage_pass1[strlen(SettingsText(SET_STAPWD1)) +1]; + strncpy(storage_pass1, SettingsText(SET_STAPWD1), sizeof(storage_pass1)); + char storage_pass2[strlen(SettingsText(SET_STAPWD2)) +1]; + strncpy(storage_pass2, SettingsText(SET_STAPWD2), sizeof(storage_pass2)); + + char storage_mqtthost[strlen(SettingsText(SET_MQTT_HOST)) +1]; + strncpy(storage_mqtthost, SettingsText(SET_MQTT_HOST), sizeof(storage_mqtthost)); + char storage_mqttuser[strlen(SettingsText(SET_MQTT_USER)) +1]; + strncpy(storage_mqttuser, SettingsText(SET_MQTT_USER), sizeof(storage_mqttuser)); + char storage_mqttpwd[strlen(SettingsText(SET_MQTT_PWD)) +1]; + strncpy(storage_mqttpwd, SettingsText(SET_MQTT_PWD), sizeof(storage_mqttpwd)); + char storage_mqtttopic[strlen(SettingsText(SET_MQTT_TOPIC)) +1]; + strncpy(storage_mqtttopic, SettingsText(SET_MQTT_TOPIC), sizeof(storage_mqtttopic)); + uint16_t mqtt_port = Settings.mqtt_port; + +// if (216 == restart_flag) { + // Backup mqtt host, port, client, username and password +// } if ((215 == restart_flag) || (216 == restart_flag)) { SettingsErase(0); // Erase all flash from program end to end of physical flash } SettingsDefault(); - memcpy(Settings.sta_ssid, storage_wifi, sizeof(storage_wifi)); // Restore current SSIDs and Passwords + // Restore current SSIDs and Passwords + SettingsUpdateText(SET_STASSID1, storage_ssid1); + SettingsUpdateText(SET_STASSID2, storage_ssid2); + SettingsUpdateText(SET_STAPWD1, storage_pass1); + SettingsUpdateText(SET_STAPWD2, storage_pass2); if (216 == restart_flag) { - memcpy(Settings.mqtt_host, storage_mqtt, sizeof(storage_mqtt)); // Restore the mqtt host, port, client, username and password - strlcpy(Settings.mqtt_client, MQTT_CLIENT_ID, sizeof(Settings.mqtt_client)); // Set client to default + // Restore the mqtt host, port, client, username and password + SettingsUpdateText(SET_MQTT_HOST, storage_mqtthost); + SettingsUpdateText(SET_MQTT_USER, storage_mqttuser); + SettingsUpdateText(SET_MQTT_PWD, storage_mqttpwd); + SettingsUpdateText(SET_MQTT_TOPIC, storage_mqtttopic); + Settings.mqtt_port = mqtt_port; } restart_flag = 2; } @@ -972,7 +1111,9 @@ void ArduinoOTAInit(void) { ArduinoOTA.setPort(8266); ArduinoOTA.setHostname(my_hostname); - if (Settings.web_password[0] !=0) { ArduinoOTA.setPassword(Settings.web_password); } + if (strlen(SettingsText(SET_WEBPWD))) { + ArduinoOTA.setPassword(SettingsText(SET_WEBPWD)); + } ArduinoOTA.onStart([]() { @@ -1031,6 +1172,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 /********************************************************************************************/ @@ -1118,8 +1267,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; @@ -1141,7 +1293,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++) { @@ -1268,32 +1421,32 @@ 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 - if (!light_type) { - for (uint32_t i = 0; i < MAX_PWMS; i++) { // Basic PWM control only - if (pin[GPIO_PWM1 +i] < 99) { + for (uint32_t i = 0; i < MAX_PWMS; i++) { // Basic PWM control only + if (pin[GPIO_PWM1 +i] < 99) { + pinMode(pin[GPIO_PWM1 +i], OUTPUT); + if (light_type) { + // force PWM GPIOs to low or high mode, see #7165 + analogWrite(pin[GPIO_PWM1 +i], bitRead(pwm_inverted, i) ? Settings.pwm_range : 0); + } else { pwm_present = true; - pinMode(pin[GPIO_PWM1 +i], OUTPUT); analogWrite(pin[GPIO_PWM1 +i], bitRead(pwm_inverted, i) ? Settings.pwm_range - Settings.pwm_value[i] : Settings.pwm_value[i]); } } } + for (uint32_t i = 0; i < MAX_RELAYS; i++) { if (pin[GPIO_REL1 +i] < 99) { pinMode(pin[GPIO_REL1 +i], OUTPUT); diff --git a/tasmota/support_udp.ino b/tasmota/support_udp.ino index 9a33bcfed..9ff745364 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 @@ -85,54 +85,62 @@ void PollUdp(void) // AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("\n%s"), packet_buffer); // Simple Service Discovery Protocol (SSDP) + if (Settings.flag2.emulation) { #ifdef USE_SCRIPT_HUE - if (!udp_response_mutex && (strstr_P(packet_buffer, PSTR("M-SEARCH")) != nullptr)) { + 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 49faa0663..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) @@ -191,18 +197,25 @@ void WifiBegin(uint8_t flag, uint8_t channel) case 2: // Toggle Settings.sta_active ^= 1; } // 3: Current AP - if ('\0' == Settings.sta_ssid[Settings.sta_active][0]) { Settings.sta_active ^= 1; } // Skip empty SSID + if (!strlen(SettingsText(SET_STASSID1 + Settings.sta_active))) { + Settings.sta_active ^= 1; // Skip empty SSID + } if (Settings.ip_address[0]) { 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(Settings.sta_ssid[Settings.sta_active], Settings.sta_pwd[Settings.sta_active], channel, Wifi.bssid); + 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(Settings.sta_ssid[Settings.sta_active], Settings.sta_pwd[Settings.sta_active]); + 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, Settings.sta_ssid[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;) { @@ -221,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 @@ -277,12 +290,12 @@ void WifiBeginAfterScan(void) bool known = false; uint32_t j; - for (j = 0; j < 2; j++) { - if (ssid_scan == Settings.sta_ssid[j]) { // SSID match + 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 (sec_scan == ENC_TYPE_NONE || Settings.sta_pwd[j]) { // Check for passphrase if not open wlan - best_network_db = (int8_t)rssi_scan; + 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 + 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)); @@ -352,6 +365,14 @@ bool WifiCheckIPv6(void) return ipv6_global; } +String WifiGetIPv6(void) +{ + for (auto a : addrList) { + if(!a.isLocal() && a.isV6()) return a.toString(); + } + return ""; +} + bool WifiCheckIPAddrStatus(void) // Return false for 169.254.x.x or fe80::/64 { bool ip_global=false; @@ -374,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(); @@ -426,7 +447,7 @@ void WifiCheckIp(void) if (!Wifi.retry || ((Wifi.retry_init / 2) == Wifi.retry)) { AddLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_AP_TIMEOUT)); } else { - if (('\0' == Settings.sta_ssid[0][0]) && ('\0' == Settings.sta_ssid[1][0])) { + if (!strlen(SettingsText(SET_STASSID1)) && !strlen(SettingsText(SET_STASSID2))) { wifi_config_tool = WIFI_MANAGER; // Skip empty SSIDs and start Wifi config tool Wifi.retry = 0; } else { @@ -472,13 +493,13 @@ void WifiCheck(uint8_t param) if (Wifi.config_counter) { if (!Wifi.config_counter) { if (strlen(WiFi.SSID().c_str())) { - strlcpy(Settings.sta_ssid[0], WiFi.SSID().c_str(), sizeof(Settings.sta_ssid[0])); + SettingsUpdateText(SET_STASSID1, WiFi.SSID().c_str()); } if (strlen(WiFi.psk().c_str())) { - strlcpy(Settings.sta_pwd[0], WiFi.psk().c_str(), sizeof(Settings.sta_pwd[0])); + SettingsUpdateText(SET_STAPWD1, WiFi.psk().c_str()); } Settings.sta_active = 0; - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_WCFG_2_WIFIMANAGER D_CMND_SSID "1 %s"), Settings.sta_ssid[0]); + AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_WCFG_2_WIFIMANAGER D_CMND_SSID "1 %s"), SettingsText(SET_STASSID1)); } } if (!Wifi.config_counter) { @@ -543,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 @@ -577,46 +602,100 @@ 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 d9e55bd15..a9ff6f57f 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) @@ -58,7 +59,6 @@ const uint8_t MAX_PWMS = 5; // Max number of PWM channels const uint8_t MAX_COUNTERS = 4; // Max number of counter sensors const uint8_t MAX_TIMERS = 16; // Max number of Timers const uint8_t MAX_PULSETIMERS = 8; // Max number of supported pulse timers -const uint8_t MAX_FRIENDLYNAMES = 4; // Max number of Friendly names const uint8_t MAX_DOMOTICZ_IDX = 4; // Max number of Domoticz device, key and switch indices const uint8_t MAX_DOMOTICZ_SNS_IDX = 12; // Max number of Domoticz sensors indices const uint8_t MAX_KNX_GA = 10; // Max number of KNX Group Addresses to read that can be set @@ -70,10 +70,18 @@ const uint8_t MAX_XSNS_DRIVERS = 96; // Max number of allowed sensor driv const uint8_t MAX_I2C_DRIVERS = 96; // Max number of allowed i2c drivers const uint8_t MAX_SHUTTERS = 4; // Max number of shutters const uint8_t MAX_PCF8574 = 8; // Max number of PCF8574 devices -const uint8_t MAX_RULE_MEMS = 5; // Max number of saved vars const uint8_t MAX_RULE_SETS = 3; // Max number of rule sets of size 512 characters 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 + const uint8_t MAX_HUE_DEVICES = 15; // Max number of Philips Hue device per emulation const char MQTT_TOKEN_PREFIX[] PROGMEM = "%prefix%"; // To be substituted by mqtt_prefix[x] @@ -118,9 +126,9 @@ const uint8_t OTA_ATTEMPTS = 5; // Number of times to try fetching t const uint16_t INPUT_BUFFER_SIZE = 520; // Max number of characters in (serial and http) command buffer const uint16_t FLOATSZ = 16; // Max number of characters in float result from dtostrfd (max 32) const uint16_t CMDSZ = 24; // Max number of characters in command -const uint16_t TOPSZ = 100; // Max number of characters in topic string -const uint16_t LOGSZ = 520; // Max number of characters in log -const uint16_t MIN_MESSZ = 893; // Min number of characters in MQTT message +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 = 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 @@ -131,7 +139,7 @@ const uint32_t SOFT_BAUDRATE = 9600; // Default software serial baudrate const uint32_t APP_BAUDRATE = 115200; // Default serial baudrate const uint32_t SERIAL_POLLING = 100; // Serial receive polling in ms const uint32_t ZIGBEE_POLLING = 100; // Serial receive polling in ms -const uint8_t MAX_STATUS = 11; // Max number of status lines +const uint8_t MAX_STATUS = 12; // Max number of status lines const uint32_t START_VALID_TIME = 1451602800; // Time is synced and after 2016-01-01 @@ -143,7 +151,7 @@ const uint32_t LOOP_SLEEP_DELAY = 50; // Lowest number of milliseconds to \*********************************************************************************************/ #define MAX_RULE_TIMERS 8 // Max number of rule timers (4 bytes / timer) -#define MAX_RULE_VARS 5 // Max number of rule variables (10 bytes / variable) +#define MAX_RULE_VARS 16 // Max number of rule variables (33 bytes / variable) /* // Removed from esp8266 core since 20171105 @@ -218,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, 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}; @@ -235,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 }; @@ -256,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 @@ -268,10 +277,55 @@ 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_REQUEST }; enum AddressConfigSteps { ADDR_IDLE, ADDR_RECEIVE, ADDR_SEND }; +enum SettingsTextIndex { SET_OTAURL, + SET_MQTTPREFIX1, SET_MQTTPREFIX2, SET_MQTTPREFIX3, + SET_STASSID1, SET_STASSID2, + SET_STAPWD1, SET_STAPWD2, + SET_HOSTNAME, SET_SYSLOG_HOST, + SET_WEBPWD, SET_CORS, + SET_MQTT_HOST, SET_MQTT_CLIENT, + SET_MQTT_USER, SET_MQTT_PWD, + SET_MQTT_FULLTOPIC, SET_MQTT_TOPIC, + SET_MQTT_BUTTON_TOPIC, SET_MQTT_SWITCH_TOPIC, SET_MQTT_GRP_TOPIC, + SET_STATE_TXT1, SET_STATE_TXT2, SET_STATE_TXT3, SET_STATE_TXT4, + SET_NTPSERVER1, SET_NTPSERVER2, SET_NTPSERVER3, + SET_MEM1, SET_MEM2, SET_MEM3, SET_MEM4, SET_MEM5, SET_MEM6, SET_MEM7, SET_MEM8, + SET_MEM9, SET_MEM10, SET_MEM11, SET_MEM12, SET_MEM13, SET_MEM14, SET_MEM15, SET_MEM16, + SET_FRIENDLYNAME1, SET_FRIENDLYNAME2, SET_FRIENDLYNAME3, SET_FRIENDLYNAME4, + 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 }; + +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_ACK, + 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_RANGE = 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 e18a22ce1..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,14 +73,10 @@ // Structs #include "settings.h" -const char kCodeImage[] PROGMEM = "tasmota|minimal|sensors|knx|basic|display|ir"; - /*********************************************************************************************\ * Global variables \*********************************************************************************************/ -SerialConfig serial_config = SERIAL_8N1; // Serial interface configuration 8 data bits, No parity, 1 stop bit - WiFiUDP PortUdp; // UDP Syslog and Alexa unsigned long feature_drv1; // Compiled driver feature map @@ -83,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 @@ -98,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 @@ -112,14 +113,14 @@ uint32_t web_log_index = 1; // Index in Web log buffer (should n float global_temperature = 9999; // Provide a global temperature to be used by some sensors 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 -char *ota_url; // OTA url string pointer 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 @@ -143,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 @@ -156,16 +158,16 @@ 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) char my_version[33]; // Composed version string char my_image[33]; // Code image and/or commit char my_hostname[33]; // Composed Wifi hostname -char mqtt_client[33]; // Composed MQTT Clientname -char mqtt_topic[33]; // Composed MQTT topic +char mqtt_client[TOPSZ]; // Composed MQTT Clientname +char mqtt_topic[TOPSZ]; // Composed MQTT topic char serial_in_buffer[INPUT_BUFFER_SIZE]; // Receive buffer char mqtt_data[MESSZ]; // MQTT publish buffer and web page ajax buffer char log_data[LOGSZ]; // Logging @@ -196,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(); @@ -220,9 +220,6 @@ void setup(void) XdrvCall(FUNC_SETTINGS_OVERRIDE); } - SerialCfg config = SettingToSerialCfg(Settings.serial_config); - - baudrate = config.baudrate * 300; // mdns_delayed_start = Settings.param[P_MDNS_DELAYED_START]; seriallog_level = Settings.seriallog_level; seriallog_timer = SERIALLOG_TIMER; @@ -269,76 +266,31 @@ void setup(void) } } - Format(mqtt_client, Settings.mqtt_client, sizeof(mqtt_client)); - Format(mqtt_topic, Settings.mqtt_topic, sizeof(mqtt_topic)); - if (strstr(Settings.hostname, "%") != nullptr) { - strlcpy(Settings.hostname, WIFI_HOSTNAME, sizeof(Settings.hostname)); - snprintf_P(my_hostname, sizeof(my_hostname)-1, Settings.hostname, mqtt_topic, ESP.getChipId() & 0x1FFF); + Format(mqtt_client, SettingsText(SET_MQTT_CLIENT), sizeof(mqtt_client)); + Format(mqtt_topic, SettingsText(SET_MQTT_TOPIC), sizeof(mqtt_topic)); + if (strstr(SettingsText(SET_HOSTNAME), "%") != nullptr) { + SettingsUpdateText(SET_HOSTNAME, WIFI_HOSTNAME); + snprintf_P(my_hostname, sizeof(my_hostname)-1, SettingsText(SET_HOSTNAME), mqtt_topic, ESP.getChipId() & 0x1FFF); } else { - snprintf_P(my_hostname, sizeof(my_hostname)-1, Settings.hostname); + snprintf_P(my_hostname, sizeof(my_hostname)-1, SettingsText(SET_HOSTNAME)); } 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); - } - } - } + SetPowerOnState(); - // 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; - - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_PROJECT " %s %s " D_VERSION " %s%s-" ARDUINO_ESP8266_RELEASE), PROJECT, Settings.friendlyname[0], my_version, my_image); + 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 AddLog_P2(LOG_LEVEL_INFO, PSTR(D_WARNING_MINIMAL_VERSION)); #endif // FIRMWARE_MINIMAL + memcpy_P(log_data, VERSION_MARKER, 1); // Dummy for compiler saving VERSION_MARKER + RtcInit(); #ifdef USE_ARDUINO_OTA @@ -353,15 +305,18 @@ void BacklogLoop(void) { if (TimeReached(backlog_delay)) { if (!BACKLOG_EMPTY && !backlog_mutex) { - backlog_mutex = true; #ifdef SUPPORT_IF_STATEMENT - ExecuteCommand((char*)backlog.shift().c_str(), SRC_BACKLOG); + backlog_mutex = true; + String cmd = backlog.shift(); + backlog_mutex = false; + ExecuteCommand((char*)cmd.c_str(), SRC_BACKLOG); #else + backlog_mutex = true; ExecuteCommand((char*)backlog[backlog_pointer].c_str(), SRC_BACKLOG); backlog_pointer++; if (backlog_pointer >= MAX_BACKLOG) { backlog_pointer = 0; } -#endif backlog_mutex = false; +#endif } } } @@ -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 be3b503f0..7cf0fff75 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 @@ -21,7 +21,7 @@ #define _TASMOTA_POST_H_ /*********************************************************************************************\ - * Function declarations + * Function prototypes \*********************************************************************************************/ // Needed for core 2.3.0 compilation (#6721) @@ -39,6 +39,7 @@ void KNX_CB_Action(message_t const &msg, void *arg); //#endif // USE_KNX 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); /*********************************************************************************************\ * Default global defines @@ -54,6 +55,9 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -69,6 +73,16 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -78,6 +92,8 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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) @@ -90,14 +106,19 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #ifndef TUYA_DIMMER_ID #define TUYA_DIMMER_ID 0 // Default dimmer Id #endif -//#define USE_ARMTRONIX_DIMMERS // Add support for Armtronix Dimmers (+1k4 code) +#undef USE_ARMTRONIX_DIMMERS // Disable 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) #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_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) +#define USE_SONOFF_D1 // Add support for Sonoff D1 Dimmer (+0k7 code) // -- Optional light modules ---------------------- #define USE_LIGHT // Add Dimmer/Light support @@ -144,7 +165,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c // #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) @@ -158,6 +179,12 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c //#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_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) @@ -178,6 +205,9 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #define USE_PN532_HSU // Add support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem) #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) @@ -189,6 +219,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -202,7 +233,8 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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) @@ -223,6 +255,8 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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) @@ -230,6 +264,9 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -243,6 +280,8 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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) @@ -264,6 +303,12 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -275,6 +320,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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) @@ -307,6 +353,8 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -336,6 +384,12 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -355,12 +409,15 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -372,6 +429,9 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #undef USE_PN532_HSU // Disable support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem) #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 @@ -380,6 +440,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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) @@ -390,17 +451,19 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #endif // FIRMWARE_IR /*********************************************************************************************\ - * [tasmota-basic.bin] + * [tasmota-lite.bin] * Provide an image without sensors \*********************************************************************************************/ -#ifdef FIRMWARE_BASIC +#ifdef FIRMWARE_LITE #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_BASIC +#define APP_SLEEP 1 // Default to sleep = 1 for FIRMWARE_LITE #undef USE_ARDUINO_OTA // Disable support for Arduino OTA #undef USE_DOMOTICZ // Disable Domoticz @@ -434,6 +497,12 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -460,6 +529,9 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #undef USE_PN532_HSU // Disable support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem) #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 @@ -471,6 +543,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -483,6 +556,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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) @@ -501,8 +575,10 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #undef CODE_IMAGE #define CODE_IMAGE 1 +#undef CODE_IMAGE_STR +#define CODE_IMAGE_STR "minimal" -#undef FIRMWARE_BASIC // Disable tasmota-basic with no sensors +#undef FIRMWARE_LITE // Disable tasmota-lite with no sensors #undef FIRMWARE_SENSORS // Disable tasmota-sensors with useful sensors enabled #undef FIRMWARE_KNX_NO_EMULATION // Disable tasmota-knx with KNX but without Emulation #undef FIRMWARE_DISPLAYS // Disable tasmota-display with display drivers enabled @@ -512,7 +588,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #undef USE_ARDUINO_OTA // Disable support for Arduino OTA #undef USE_DOMOTICZ // Disable Domoticz #undef USE_HOME_ASSISTANT // Disable Home Assistant -#undef USE_MQTT_TLS // Disable TLS support won't work as the MQTTHost is not set +//#undef USE_MQTT_TLS // Disable TLS support won't work as the MQTTHost is not set #undef USE_KNX // Disable KNX IP Protocol Support //#undef USE_WEBSERVER // Disable Webserver #undef USE_WEBSEND_RESPONSE // Disable command WebSend response message (+1k code) @@ -541,6 +617,12 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -569,6 +651,9 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #undef USE_PN532_HSU // Disable support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem) #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 @@ -580,6 +665,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -589,6 +675,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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) @@ -631,7 +718,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -644,11 +731,11 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 @@ -657,6 +744,14 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #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 5556629f9..a45c456f8 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 @@ -214,6 +214,17 @@ enum UserSelectablePins { GPIO_TASMOTASLAVE_RST_INV, // Slave Reset Inverted GPIO_HPMA_RX, // Honeywell HPMA115S0 Serial interface 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_SENSOR_END }; // Programmer selectable GPIO functionality @@ -259,7 +270,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 "|" @@ -294,6 +305,12 @@ 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_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 ; const char kSensorNamesFixed[] PROGMEM = @@ -308,6 +325,8 @@ enum UserSelectableAdc0 { ADC0_LIGHT, // Light sensor ADC0_BUTTON, // Button ADC0_BUTTON_INV, + ADC0_RANGE, // Range + ADC0_CT_POWER, // Current // ADC0_SWITCH, // Switch // ADC0_SWITCH_INV, ADC0_END }; @@ -323,6 +342,8 @@ const char kAdc0Names[] PROGMEM = D_SENSOR_NONE "|" D_ANALOG_INPUT "|" D_TEMPERATURE "|" D_LIGHT "|" D_SENSOR_BUTTON "|" D_SENSOR_BUTTON "i|" + D_RANGE "|" + D_CT_POWER "|" // D_SENSOR_SWITCH "|" D_SENSOR_SWITCH "i|" ; @@ -402,6 +423,8 @@ enum SupportedModules { SONOFF_L1, SONOFF_IFAN03, EXS_DIMMER, + PWM_DIMMER, + SONOFF_D1, MAXMODULE}; #define USER_MODULE 255 @@ -552,9 +575,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 @@ -669,8 +694,13 @@ 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 #ifdef USE_SERIAL_BRIDGE GPIO_SBR_TX, // Serial Bridge Serial interface GPIO_SBR_RX, // Serial Bridge Serial interface @@ -698,8 +728,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 @@ -725,6 +755,15 @@ const uint8_t kGpioNiceList[] PROGMEM = { GPIO_IBEACON_RX, GPIO_IBEACON_TX, #endif +#ifdef USE_GPS + 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, GPIO_MGC3130_RESET, @@ -754,7 +793,14 @@ const uint8_t kGpioNiceList[] PROGMEM = { GPIO_A4988_MS3, // A4988 microstep pin3 #endif #ifdef USE_DEEPSLEEP - GPIO_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 }; @@ -774,6 +820,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 @@ -831,6 +880,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, @@ -1668,10 +1720,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) @@ -2171,6 +2223,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 54e4c165f..b9b08b46e 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,6 +20,9 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x07010101; +const uint32_t VERSION = 0x0801000A; + +// Lowest compatible version +const uint32_t VERSION_COMPATIBLE = 0x07010006; #endif // _TASMOTA_VERSION_H_ 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 48e2cd26a..2dff240ad 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 = @@ -414,7 +415,8 @@ const char HTTP_FORM_WIFI[] PROGMEM = "

" D_AP1_PASSWORD "

" "

" D_AP2_SSID " (" STA_SSID2 ")

" "

" D_AP2_PASSWORD "

" - "

" D_HOSTNAME " (%s)

"; + "

" D_HOSTNAME " (%s)

" + "

" D_CORS_DOMAIN "

"; const char HTTP_FORM_LOG1[] PROGMEM = "
 " D_LOGGING_PARAMETERS " " @@ -511,6 +513,7 @@ const char kUploadErrors[] PROGMEM = #ifdef USE_RF_FLASH "|" D_UPLOAD_ERR_10 "|" D_UPLOAD_ERR_11 "|" D_UPLOAD_ERR_12 "|" D_UPLOAD_ERR_13 #endif + "|" D_UPLOAD_ERR_14 ; const uint16_t DNS_PORT = 53; @@ -597,7 +600,13 @@ void StartWebserver(int type, IPAddress ipweb) WebServer->begin(); // Web server start } if (Web.state != type) { +#if LWIP_IPV6 + String ipv6_addr = WifiGetIPv6(); + if(ipv6_addr!="") AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_HTTP D_WEBSERVER_ACTIVE_ON " %s%s " D_WITH_IP_ADDRESS " %s and IPv6 global address %s "), my_hostname, (Wifi.mdns_begun) ? ".local" : "", ipweb.toString().c_str(),ipv6_addr.c_str()); + else AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_HTTP D_WEBSERVER_ACTIVE_ON " %s%s " D_WITH_IP_ADDRESS " %s"), my_hostname, (Wifi.mdns_begun) ? ".local" : "", ipweb.toString().c_str()); +#else AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_HTTP D_WEBSERVER_ACTIVE_ON " %s%s " D_WITH_IP_ADDRESS " %s"), my_hostname, (Wifi.mdns_begun) ? ".local" : "", ipweb.toString().c_str()); +#endif // LWIP_IPV6 = 1 rules_flag.http_init = 1; } if (type) { Web.state = type; } @@ -631,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 */ @@ -651,8 +667,8 @@ void PollDnsWebserver(void) bool WebAuthenticate(void) { - if (Settings.web_password[0] != 0 && HTTP_MANAGER_RESET_ONLY != Web.state) { - return WebServer->authenticate(WEB_USERNAME, Settings.web_password); + if (strlen(SettingsText(SET_WEBPWD)) && (HTTP_MANAGER_RESET_ONLY != Web.state)) { + return WebServer->authenticate(WEB_USERNAME, SettingsText(SET_WEBPWD)); } else { return true; } @@ -673,8 +689,8 @@ bool HttpCheckPriviledgedAccess(bool autorequestauth = true) void HttpHeaderCors(void) { - if (Settings.flag3.cors_enabled) { // SetOption73 - Enable HTTP CORS - WebServer->sendHeader(F("Access-Control-Allow-Origin"), F("*")); + if (strlen(SettingsText(SET_CORS))) { + WebServer->sendHeader(F("Access-Control-Allow-Origin"), SettingsText(SET_CORS)); } } @@ -809,7 +825,7 @@ void WSContentSend_PD(const char* formatP, ...) // Content send snprintf_P ch void WSContentStart_P(const char* title, bool auth) { - if (auth && (Settings.web_password[0] != 0) && !WebServer->authenticate(WEB_USERNAME, Settings.web_password)) { + if (auth && strlen(SettingsText(SET_WEBPWD)) && !WebServer->authenticate(WEB_USERNAME, SettingsText(SET_WEBPWD))) { return WebServer->requestAuthentication(); } @@ -818,7 +834,7 @@ void WSContentStart_P(const char* title, bool auth) if (title != nullptr) { char ctitle[strlen_P(title) +1]; strcpy_P(ctitle, title); // Get title from flash to RAM - WSContentSend_P(HTTP_HEADER, Settings.friendlyname[0], ctitle); + WSContentSend_P(HTTP_HEADER, SettingsText(SET_FRIENDLYNAME1), ctitle); } } @@ -862,7 +878,7 @@ void WSContentSendStyle_P(const char* formatP, ...) WebColor(COL_TEXT_WARNING), #endif WebColor(COL_TITLE), - ModuleName().c_str(), Settings.friendlyname[0]); + ModuleName().c_str(), SettingsText(SET_FRIENDLYNAME1)); if (Settings.flag3.gui_hostname_ip) { // SetOption53 - Show hostanme and IP address in GUI main menu bool lip = (static_cast(WiFi.localIP()) != 0); bool sip = (static_cast(WiFi.softAPIP()) != 0); @@ -975,6 +991,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. @@ -986,10 +1015,10 @@ void HandleRoot(void) if (WifiIsInManagerMode()) { #ifndef FIRMWARE_MINIMAL - if ((Settings.web_password[0] != 0) && !(WebServer->hasArg("USER1")) && !(WebServer->hasArg("PASS1")) && HTTP_MANAGER_RESET_ONLY != Web.state) { + if (strlen(SettingsText(SET_WEBPWD)) && !(WebServer->hasArg("USER1")) && !(WebServer->hasArg("PASS1")) && HTTP_MANAGER_RESET_ONLY != Web.state) { HandleWifiLogin(); } else { - if (!(Settings.web_password[0] != 0) || (((WebServer->arg("USER1") == WEB_USERNAME ) && (WebServer->arg("PASS1") == Settings.web_password )) || HTTP_MANAGER_RESET_ONLY == Web.state)) { + if (!strlen(SettingsText(SET_WEBPWD)) || (((WebServer->arg("USER1") == WEB_USERNAME ) && (WebServer->arg("PASS1") == SettingsText(SET_WEBPWD) )) || HTTP_MANAGER_RESET_ONLY == Web.state)) { HandleWifiConfiguration(); } else { // wrong user and pass @@ -1006,7 +1035,7 @@ void HandleRoot(void) AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_MAIN_MENU); - char stemp[10]; + char stemp[33]; WSContentStart_P(S_MAIN_MENU); #ifdef USE_SCRIPT_WEB_DISPLAY @@ -1024,17 +1053,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); @@ -1070,6 +1095,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 @@ -1087,6 +1125,17 @@ void HandleRoot(void) } // Settings.flag3.pwm_multi_channels } #endif // USE_LIGHT +#ifdef USE_PWM_DIMMER + if (PWM_DIMMER == my_module_type) { + WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, // Brightness - Black to White + "c", // c - Unique HTML id + "#000", "#fff", // Black to White + 4, // sl4 - Unique range HTML id - Used as source for Saturation begin color + 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)); + } +#endif // USE_PWM_DIMMER #ifdef USE_SHUTTER if (Settings.flag3.shutter_mode) { // SetOption80 - Enable shutter support for (uint32_t i = 0; i < shutters_present; i++) { @@ -1098,16 +1147,32 @@ void HandleRoot(void) WSContentSend_P(PSTR("")); #ifdef USE_SONOFF_IFAN if (IsModuleIfan()) { - WSContentSend_P(HTTP_DEVICE_CONTROL, 36, 1, D_BUTTON_TOGGLE, ""); + WSContentSend_P(HTTP_DEVICE_CONTROL, 36, 1, + (strlen(SettingsText(SET_BUTTON1))) ? SettingsText(SET_BUTTON1) : D_BUTTON_TOGGLE, + ""); for (uint32_t i = 0; i < MaxFanspeed(); i++) { snprintf_P(stemp, sizeof(stemp), PSTR("%d"), i); - WSContentSend_P(HTTP_DEVICE_CONTROL, 16, i +2, stemp, ""); + WSContentSend_P(HTTP_DEVICE_CONTROL, 16, i +2, + (strlen(SettingsText(SET_BUTTON2 + i))) ? SettingsText(SET_BUTTON2 + i) : stemp, + ""); } } else { #endif // USE_SONOFF_IFAN 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 + 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 */ ? "-" : ((ShutterWebButton>0) ? "▲" : "▼")), + ""); + continue; + } +#endif // USE_SHUTTER snprintf_P(stemp, sizeof(stemp), PSTR(" %d"), idx); - WSContentSend_P(HTTP_DEVICE_CONTROL, 100 / devices_present, idx, (devices_present < 5) ? D_BUTTON_TOGGLE : "", (devices_present > 1) ? stemp : ""); + WSContentSend_P(HTTP_DEVICE_CONTROL, 100 / devices_present, idx, + (set_button) ? SettingsText(SET_BUTTON1 + idx -1) : (devices_present < 5) ? D_BUTTON_TOGGLE : "", + (set_button) ? "" : (devices_present > 1) ? stemp : ""); } #ifdef USE_SONOFF_IFAN } @@ -1123,7 +1188,9 @@ void HandleRoot(void) if (idx > 0) { WSContentSend_P(PSTR("")); } for (uint32_t j = 0; j < 4; j++) { idx++; - WSContentSend_P(PSTR(""), idx, idx); // &k is related to WebGetArg("k", tmp, sizeof(tmp)); + snprintf_P(stemp, sizeof(stemp), PSTR("%d"), idx); + WSContentSend_P(PSTR(""), idx, // &k is related to WebGetArg("k", tmp, sizeof(tmp)); + (strlen(SettingsText(SET_BUTTON1 + idx -1))) ? SettingsText(SET_BUTTON1 + idx -1) : stemp); } } WSContentSend_P(PSTR("")); @@ -1182,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); } } @@ -1216,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); @@ -1267,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 @@ -1622,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 } @@ -1633,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%%
"), + 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 + quality, rssi ); delay(0); @@ -1654,15 +1757,16 @@ void HandleWifiConfiguration(void) } // As WIFI_HOSTNAME may contain %s-%04d it cannot be part of HTTP_FORM_WIFI where it will exception - WSContentSend_P(HTTP_FORM_WIFI, Settings.sta_ssid[0], Settings.sta_ssid[1], WIFI_HOSTNAME, WIFI_HOSTNAME, Settings.hostname); + WSContentSend_P(HTTP_FORM_WIFI, SettingsText(SET_STASSID1), SettingsText(SET_STASSID2), WIFI_HOSTNAME, WIFI_HOSTNAME, SettingsText(SET_HOSTNAME), SettingsText(SET_CORS)); WSContentSend_P(HTTP_FORM_END); } 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); } @@ -1671,22 +1775,25 @@ void HandleWifiConfiguration(void) void WifiSaveSettings(void) { - char tmp[sizeof(Settings.sta_pwd[0])]; // Max length is currently 65 + char tmp[TOPSZ]; // Max length is currently 150 WebGetArg("h", tmp, sizeof(tmp)); - strlcpy(Settings.hostname, (!strlen(tmp)) ? WIFI_HOSTNAME : tmp, sizeof(Settings.hostname)); - if (strstr(Settings.hostname, "%") != nullptr) { - strlcpy(Settings.hostname, WIFI_HOSTNAME, sizeof(Settings.hostname)); + SettingsUpdateText(SET_HOSTNAME, (!strlen(tmp)) ? WIFI_HOSTNAME : tmp); + if (strstr(SettingsText(SET_HOSTNAME), "%") != nullptr) { + SettingsUpdateText(SET_HOSTNAME, WIFI_HOSTNAME); } + WebGetArg("c", tmp, sizeof(tmp)); + SettingsUpdateText(SET_CORS, (!strlen(tmp)) ? CORS_DOMAIN : tmp); WebGetArg("s1", tmp, sizeof(tmp)); - strlcpy(Settings.sta_ssid[0], (!strlen(tmp)) ? STA_SSID1 : tmp, sizeof(Settings.sta_ssid[0])); + SettingsUpdateText(SET_STASSID1, (!strlen(tmp)) ? STA_SSID1 : tmp); WebGetArg("s2", tmp, sizeof(tmp)); - strlcpy(Settings.sta_ssid[1], (!strlen(tmp)) ? STA_SSID2 : tmp, sizeof(Settings.sta_ssid[1])); + SettingsUpdateText(SET_STASSID2, (!strlen(tmp)) ? STA_SSID2 : tmp); WebGetArg("p1", tmp, sizeof(tmp)); - strlcpy(Settings.sta_pwd[0], (!strlen(tmp)) ? "" : (strlen(tmp) < 5) ? Settings.sta_pwd[0] : tmp, sizeof(Settings.sta_pwd[0])); + SettingsUpdateText(SET_STAPWD1, (!strlen(tmp)) ? "" : (strlen(tmp) < 5) ? SettingsText(SET_STAPWD1) : tmp); WebGetArg("p2", tmp, sizeof(tmp)); - strlcpy(Settings.sta_pwd[1], (!strlen(tmp)) ? "" : (strlen(tmp) < 5) ? Settings.sta_pwd[1] : tmp, sizeof(Settings.sta_pwd[1])); - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CMND_HOSTNAME " %s, " D_CMND_SSID "1 %s, " D_CMND_SSID "2 %s"), Settings.hostname, Settings.sta_ssid[0], Settings.sta_ssid[1]); + SettingsUpdateText(SET_STAPWD2, (!strlen(tmp)) ? "" : (strlen(tmp) < 5) ? SettingsText(SET_STAPWD2) : tmp); + AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CMND_HOSTNAME " %s, " D_CMND_SSID "1 %s, " D_CMND_SSID "2 %s, " D_CMND_CORS " %s"), + SettingsText(SET_HOSTNAME), SettingsText(SET_STASSID1), SettingsText(SET_STASSID2), SettingsText(SET_CORS)); } /*-------------------------------------------------------------------------------------------*/ @@ -1723,7 +1830,7 @@ void HandleLoggingConfiguration(void) } WSContentSend_P(PSTR("

")); } - WSContentSend_P(HTTP_FORM_LOG2, Settings.syslog_host, Settings.syslog_port, Settings.tele_period); + WSContentSend_P(HTTP_FORM_LOG2, SettingsText(SET_SYSLOG_HOST), Settings.syslog_port, Settings.tele_period); WSContentSend_P(HTTP_FORM_END); WSContentSpaceButton(BUTTON_CONFIGURATION); WSContentStop(); @@ -1731,7 +1838,7 @@ void HandleLoggingConfiguration(void) void LoggingSaveSettings(void) { - char tmp[sizeof(Settings.syslog_host)]; // Max length is currently 33 + char tmp[TOPSZ]; // Max length is currently 33 WebGetArg("l0", tmp, sizeof(tmp)); SetSeriallog((!strlen(tmp)) ? SERIAL_LOG_LEVEL : atoi(tmp)); @@ -1742,7 +1849,7 @@ void LoggingSaveSettings(void) WebGetArg("l3", tmp, sizeof(tmp)); SetSyslog((!strlen(tmp)) ? SYS_LOG_LEVEL : atoi(tmp)); WebGetArg("lh", tmp, sizeof(tmp)); - strlcpy(Settings.syslog_host, (!strlen(tmp)) ? SYS_LOG_HOST : tmp, sizeof(Settings.syslog_host)); + SettingsUpdateText(SET_SYSLOG_HOST, (!strlen(tmp)) ? SYS_LOG_HOST : tmp); WebGetArg("lp", tmp, sizeof(tmp)); Settings.syslog_port = (!strlen(tmp)) ? SYS_LOG_PORT : atoi(tmp); WebGetArg("lt", tmp, sizeof(tmp)); @@ -1751,7 +1858,7 @@ void LoggingSaveSettings(void) Settings.tele_period = 10; // Do not allow periods < 10 seconds } AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_LOG D_CMND_SERIALLOG " %d, " D_CMND_WEBLOG " %d, " D_CMND_MQTTLOG " %d, " D_CMND_SYSLOG " %d, " D_CMND_LOGHOST " %s, " D_CMND_LOGPORT " %d, " D_CMND_TELEPERIOD " %d"), - Settings.seriallog_level, Settings.weblog_level, Settings.mqttlog_level, Settings.syslog_level, Settings.syslog_host, Settings.syslog_port, Settings.tele_period); + Settings.seriallog_level, Settings.weblog_level, Settings.mqttlog_level, Settings.syslog_level, SettingsText(SET_SYSLOG_HOST), Settings.syslog_port, Settings.tele_period); } /*-------------------------------------------------------------------------------------------*/ @@ -1787,10 +1894,11 @@ void HandleOtherConfiguration(void) (i) ? stemp : "", i, (i) ? stemp : "", - Settings.friendlyname[i]); + SettingsText(SET_FRIENDLYNAME1 + i)); } #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 @@ -1808,6 +1916,7 @@ void HandleOtherConfiguration(void) } } WSContentSend_P(PSTR("

")); +#endif // USE_EMULATION_WEMO || USE_EMULATION_HUE #endif // USE_EMULATION WSContentSend_P(HTTP_FORM_END); @@ -1817,26 +1926,31 @@ void HandleOtherConfiguration(void) void OtherSaveSettings(void) { - char tmp[128]; + char tmp[TOPSZ]; char webindex[5]; - char friendlyname[sizeof(Settings.friendlyname[0])]; + char friendlyname[TOPSZ]; + char message[LOGSZ]; WebGetArg("wp", tmp, sizeof(tmp)); - strlcpy(Settings.web_password, (!strlen(tmp)) ? "" : (strchr(tmp,'*')) ? Settings.web_password : tmp, sizeof(Settings.web_password)); + SettingsUpdateText(SET_WEBPWD, (!strlen(tmp)) ? "" : (strchr(tmp,'*')) ? SettingsText(SET_WEBPWD) : tmp); Settings.flag.mqtt_enabled = WebServer->hasArg("b1"); // SetOption3 - Enable MQTT #ifdef USE_EMULATION +#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(log_data, sizeof(log_data), PSTR(D_LOG_OTHER D_MQTT_ENABLE " %s, " D_CMND_EMULATION " %d, " D_CMND_FRIENDLYNAME), GetStateText(Settings.flag.mqtt_enabled), Settings.flag2.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); for (uint32_t i = 0; i < MAX_FRIENDLYNAMES; i++) { snprintf_P(webindex, sizeof(webindex), PSTR("a%d"), i); WebGetArg(webindex, tmp, sizeof(tmp)); snprintf_P(friendlyname, sizeof(friendlyname), PSTR(FRIENDLY_NAME"%d"), i +1); - strlcpy(Settings.friendlyname[i], (!strlen(tmp)) ? (i) ? friendlyname : FRIENDLY_NAME : tmp, sizeof(Settings.friendlyname[i])); - snprintf_P(log_data, sizeof(log_data), PSTR("%s%s %s"), log_data, (i) ? "," : "", Settings.friendlyname[i]); + SettingsUpdateText(SET_FRIENDLYNAME1 +i, (!strlen(tmp)) ? (i) ? friendlyname : FRIENDLY_NAME : tmp); + snprintf_P(message, sizeof(message), PSTR("%s%s %s"), message, (i) ? "," : "", SettingsText(SET_FRIENDLYNAME1 +i)); } - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, message); + 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]; @@ -1864,10 +1978,10 @@ void HandleBackupConfiguration(void) WiFiClient myClient = WebServer->client(); WebServer->setContentLength(sizeof(Settings)); - char attachment[100]; + char attachment[TOPSZ]; -// char friendlyname[sizeof(Settings.friendlyname[0])]; -// snprintf_P(attachment, sizeof(attachment), PSTR("attachment; filename=Config_%s_%s.dmp"), NoAlNumToUnderscore(friendlyname, Settings.friendlyname[0]), my_version); +// char friendlyname[TOPSZ]; +// snprintf_P(attachment, sizeof(attachment), PSTR("attachment; filename=Config_%s_%s.dmp"), NoAlNumToUnderscore(friendlyname, SettingsText(SET_FRIENDLYNAME1)), my_version); char hostname[sizeof(my_hostname)]; snprintf_P(attachment, sizeof(attachment), PSTR("attachment; filename=Config_%s_%s.dmp"), NoAlNumToUnderscore(hostname, my_hostname), my_version); @@ -1930,7 +2044,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; @@ -1967,11 +2085,18 @@ void HandleInformation(void) if (IsModuleIfan()) { maxfn = 1; } #endif // USE_SONOFF_IFAN for (uint32_t i = 0; i < maxfn; i++) { - WSContentSend_P(PSTR("}1" D_FRIENDLY_NAME " %d}2%s"), i +1, Settings.friendlyname[i]); + 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%%)"), Settings.sta_active +1, Settings.sta_ssid[Settings.sta_active], WifiGetRssiAsQuality(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(); + if(ipv6_addr != ""){ + WSContentSend_P(PSTR("}1 IPv6 Address }2%s"), ipv6_addr.c_str()); + } +#endif if (static_cast(WiFi.localIP()) != 0) { WSContentSend_P(PSTR("}1" D_IP_ADDRESS "}2%s"), WiFi.localIP().toString().c_str()); WSContentSend_P(PSTR("}1" D_GATEWAY "}2%s"), IPAddress(Settings.ip_address[1]).toString().c_str()); @@ -1986,17 +2111,12 @@ void HandleInformation(void) } WSContentSend_P(PSTR("}1}2 ")); // Empty line if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT -#ifdef USE_MQTT_AWS_IOT - WSContentSend_P(PSTR("}1" D_MQTT_HOST "}2%s%s"), Settings.mqtt_user, Settings.mqtt_host); + WSContentSend_P(PSTR("}1" D_MQTT_HOST "}2%s"), SettingsText(SET_MQTT_HOST)); WSContentSend_P(PSTR("}1" D_MQTT_PORT "}2%d"), Settings.mqtt_port); -#else - WSContentSend_P(PSTR("}1" D_MQTT_HOST "}2%s"), Settings.mqtt_host); - WSContentSend_P(PSTR("}1" D_MQTT_PORT "}2%d"), Settings.mqtt_port); - WSContentSend_P(PSTR("}1" D_MQTT_USER "}2%s"), Settings.mqtt_user); -#endif + WSContentSend_P(PSTR("}1" D_MQTT_USER "}2%s"), SettingsText(SET_MQTT_USER)); WSContentSend_P(PSTR("}1" D_MQTT_CLIENT "}2%s"), mqtt_client); - WSContentSend_P(PSTR("}1" D_MQTT_TOPIC "}2%s"), Settings.mqtt_topic); -// WSContentSend_P(PSTR("}1" D_MQTT_GROUP_TOPIC "}2%s"), Settings.mqtt_grptopic); + WSContentSend_P(PSTR("}1" D_MQTT_TOPIC "}2%s"), SettingsText(SET_MQTT_TOPIC)); +// WSContentSend_P(PSTR("}1" D_MQTT_GROUP_TOPIC "}2%s"), SettingsText(SET_MQTT_GRP_TOPIC)); WSContentSend_P(PSTR("}1" D_MQTT_GROUP_TOPIC "}2%s"), GetGroupTopic_P(stopic, "")); WSContentSend_P(PSTR("}1" D_MQTT_FULL_TOPIC "}2%s"), GetTopic_P(stopic, CMND, mqtt_topic, "")); WSContentSend_P(PSTR("}1" D_MQTT " " D_FALLBACK_TOPIC "}2%s"), GetFallbackTopic_P(stopic, "")); @@ -2055,7 +2175,7 @@ void HandleUpgradeFirmware(void) WSContentStart_P(S_FIRMWARE_UPGRADE); WSContentSendStyle(); - WSContentSend_P(HTTP_FORM_UPG, Settings.ota_url); + WSContentSend_P(HTTP_FORM_UPG, SettingsText(SET_OTAURL)); WSContentSend_P(HTTP_FORM_RST_UPG, D_UPGRADE); WSContentSpaceButton(BUTTON_MAIN); WSContentStop(); @@ -2068,12 +2188,12 @@ void HandleUpgradeFirmwareStart(void) { if (!HttpCheckPriviledgedAccess()) { return; } - char command[sizeof(Settings.ota_url) + 10]; // OtaUrl + char command[TOPSZ + 10]; // OtaUrl AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_UPGRADE_STARTED)); WifiConfigCounter(); - char otaurl[sizeof(Settings.ota_url)]; + char otaurl[TOPSZ]; WebGetArg("o", otaurl, sizeof(otaurl)); if (strlen(otaurl)) { snprintf_P(command, sizeof(command), PSTR(D_CMND_OTAURL " %s"), otaurl); @@ -2111,12 +2231,12 @@ void HandleUploadDone(void) WSContentSendStyle(); WSContentSend_P(PSTR("
" D_UPLOAD " " D_FAILED "

")); WSContentSend_P(PSTR("%06x'>" D_FAILED "

"), WebColor(COL_TEXT_WARNING)); #ifdef USE_RF_FLASH - if (Web.upload_error < 14) { + if (Web.upload_error < 15) { #else - if (Web.upload_error < 10) { + if ((Web.upload_error < 10) || (14 == Web.upload_error)) { + if (14 == Web.upload_error) { Web.upload_error = 10; } #endif GetTextIndexed(error, sizeof(error), Web.upload_error -1, kUploadErrors); } else { @@ -2211,7 +2331,7 @@ void HandleUploadLoop(void) Update.end(); // End esp8266 update session Web.upload_file_type = UPL_EFM8BB1; - Web.upload_error = SnfBrUpdateInit(); + Web.upload_error = SnfBrUpdateInit(); // 10, 11 if (Web.upload_error != 0) { return; } } else #endif // USE_RF_FLASH @@ -2219,21 +2339,23 @@ void HandleUploadLoop(void) if ((WEMOS == my_module_type) && (upload.buf[0] == ':')) { // Check if this is a ARDUINO SLAVE hex file Update.end(); // End esp8266 update session Web.upload_file_type = UPL_TASMOTASLAVE; - Web.upload_error = TasmotaSlave_UpdateInit(); + Web.upload_error = TasmotaSlave_UpdateInit(); // 0 if (Web.upload_error != 0) { return; } } 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 } } } @@ -2254,13 +2376,13 @@ void HandleUploadLoop(void) free(efm8bb1_update); efm8bb1_update = nullptr; if (result != 0) { - Web.upload_error = abs(result); // 2 = Not enough space, 8 = File invalid + Web.upload_error = abs(result); // 2 = Not enough space, 8 = File invalid, 12, 13 return; } } ssize_t result = rf_search_and_write(upload.buf, upload.currentSize); if (result < 0) { - Web.upload_error = abs(result); + Web.upload_error = abs(result); // 8, 12, 13 return; } else if (result > 0) { if ((size_t)result > upload.currentSize) { @@ -2350,6 +2472,10 @@ void HandleUploadLoop(void) Web.upload_error = 6; // Upload failed. Enable logging 3 return; } + if (!VersionCompatible()) { + Web.upload_error = 14; // Not compatible + return; + } } if (!Web.upload_error) { AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_UPLOAD D_SUCCESSFUL " %u bytes. " D_RESTARTING), upload.totalSize); @@ -2382,12 +2508,12 @@ void HandleHttpCommand(void) AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_COMMAND)); bool valid = true; - if (Settings.web_password[0] != 0) { - char tmp1[sizeof(Settings.web_password)]; + if (strlen(SettingsText(SET_WEBPWD))) { + char tmp1[33]; WebGetArg("user", tmp1, sizeof(tmp1)); - char tmp2[sizeof(Settings.web_password)]; + char tmp2[strlen(SettingsText(SET_WEBPWD)) +1]; WebGetArg("password", tmp2, sizeof(tmp2)); - if (!(!strcmp(tmp1, WEB_USERNAME) && !strcmp(tmp2, Settings.web_password))) { valid = false; } + if (!(!strcmp(tmp1, WEB_USERNAME) && !strcmp(tmp2, SettingsText(SET_WEBPWD)))) { valid = false; } } WSContentBegin(200, CT_JSON); @@ -2605,7 +2731,7 @@ int WebSend(char *buffer) if (user) { user = strtok_r(user, ":", &password); // user = |admin|, password = |joker| if (user && password) { - char userpass[128]; + char userpass[200]; snprintf_P(userpass, sizeof(userpass), PSTR("user=%s&password=%s&"), user, password); url += userpass; // url = |http://192.168.178.86/cm?user=admin&password=joker&| } @@ -2698,7 +2824,8 @@ const char kWebCommands[] PROGMEM = "|" // No prefix #ifdef USE_SENDMAIL D_CMND_SENDMAIL "|" #endif - D_CMND_WEBSERVER "|" D_CMND_WEBPASSWORD "|" D_CMND_WEBLOG "|" D_CMND_WEBREFRESH "|" D_CMND_WEBSEND "|" D_CMND_WEBCOLOR "|" D_CMND_WEBSENSOR; + D_CMND_WEBSERVER "|" D_CMND_WEBPASSWORD "|" D_CMND_WEBLOG "|" D_CMND_WEBREFRESH "|" D_CMND_WEBSEND "|" D_CMND_WEBCOLOR "|" + D_CMND_WEBSENSOR "|" D_CMND_WEBBUTTON "|" D_CMND_CORS; void (* const WebCommand[])(void) PROGMEM = { #ifdef USE_EMULATION @@ -2707,7 +2834,8 @@ void (* const WebCommand[])(void) PROGMEM = { #ifdef USE_SENDMAIL &CmndSendmail, #endif - &CmndWebServer, &CmndWebPassword, &CmndWeblog, &CmndWebRefresh, &CmndWebSend, &CmndWebColor, &CmndWebSensor }; + &CmndWebServer, &CmndWebPassword, &CmndWeblog, &CmndWebRefresh, &CmndWebSend, &CmndWebColor, + &CmndWebSensor, &CmndWebButton, &CmndCors }; /*********************************************************************************************\ * Commands @@ -2716,6 +2844,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 @@ -2729,6 +2858,7 @@ void CmndEmulation(void) Settings.flag2.emulation = XdrvMailbox.payload; restart_flag = 2; } +#endif ResponseCmndNumber(Settings.flag2.emulation); } #endif // USE_EMULATION @@ -2760,9 +2890,9 @@ void CmndWebServer(void) void CmndWebPassword(void) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.web_password))) { - strlcpy(Settings.web_password, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? WEB_PASSWORD : XdrvMailbox.data, sizeof(Settings.web_password)); - ResponseCmndChar(Settings.web_password); + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_WEBPWD, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? WEB_PASSWORD : XdrvMailbox.data); + ResponseCmndChar(SettingsText(SET_WEBPWD)); } else { Response_P(S_JSON_COMMAND_ASTERISK, XdrvMailbox.command); } @@ -2828,6 +2958,28 @@ void CmndWebSensor(void) ResponseJsonEnd(); } +void CmndWebButton(void) +{ + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_BUTTON_TEXT)) { + if (!XdrvMailbox.usridx) { + ResponseCmndAll(SET_BUTTON1, MAX_BUTTON_TEXT); + } else { + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_BUTTON1 + XdrvMailbox.index -1, ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data); + } + ResponseCmndIdxChar(SettingsText(SET_BUTTON1 + XdrvMailbox.index -1)); + } + } +} + +void CmndCors(void) +{ + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_CORS, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? WEB_PASSWORD : XdrvMailbox.data); + } + ResponseCmndChar(SettingsText(SET_CORS)); +} + /*********************************************************************************************\ * Interface \*********************************************************************************************/ @@ -2840,7 +2992,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 49f35d579..c766ab247 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 @@ -32,9 +32,7 @@ const char kMqttCommands[] PROGMEM = "|" // No prefix #if defined(USE_MQTT_TLS) && !defined(USE_MQTT_TLS_CA_CERT) D_CMND_MQTTFINGERPRINT "|" #endif -#if !defined(USE_MQTT_TLS) || !defined(USE_MQTT_AWS_IOT) // user and password are disabled with AWS IoT D_CMND_MQTTUSER "|" D_CMND_MQTTPASSWORD "|" -#endif #if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) D_CMND_TLSKEY "|" #endif @@ -46,9 +44,7 @@ void (* const MqttCommand[])(void) PROGMEM = { #if defined(USE_MQTT_TLS) && !defined(USE_MQTT_TLS_CA_CERT) &CmndMqttFingerprint, #endif -#if !defined(USE_MQTT_TLS) || !defined(USE_MQTT_AWS_IOT) // user and password are disabled with AWS IoT &CmndMqttUser, &CmndMqttPassword, -#endif #if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) &CmndTlsKey, #endif @@ -91,10 +87,6 @@ tls_dir_t tls_dir; // memory copy of tls_dir from flash #endif // USE_MQTT_AWS_IOT -// A typical AWS IoT endpoint is 50 characters long, it does not fit -// in MqttHost field (32 chars). We need to concatenate both MqttUser and MqttHost -char AWS_endpoint[65]; // aWS IOT endpoint, concatenation of user and host - // check whether the fingerprint is filled with a single value // Filled with 0x00 = accept any fingerprint and learn it for next time // Filled with 0xFF = accept any fingerpring forever @@ -106,21 +98,6 @@ bool is_fingerprint_mono_value(uint8_t finger[20], uint8_t value) { } return true; } - -#ifdef USE_MQTT_AWS_IOT -void setLongMqttHost(const char *mqtt_host) { - if (strlen(mqtt_host) <= sizeof(Settings.mqtt_host)) { - strlcpy(Settings.mqtt_host, mqtt_host, sizeof(Settings.mqtt_host)); - Settings.mqtt_user[0] = 0; - } else { - // need to split in mqtt_user first then mqtt_host - strlcpy(Settings.mqtt_user, mqtt_host, sizeof(Settings.mqtt_user)); - strlcpy(Settings.mqtt_host, &mqtt_host[sizeof(Settings.mqtt_user)-1], sizeof(Settings.mqtt_host)); - } - strlcpy(AWS_endpoint, mqtt_host, sizeof(AWS_endpoint)); -} -#endif // USE_MQTT_AWS_IOT - #endif // USE_MQTT_TLS void MakeValidMqtt(uint32_t option, char* str) @@ -165,10 +142,10 @@ void MqttDiscoverServer(void) } } #endif // MDNS_HOSTNAME - snprintf_P(Settings.mqtt_host, sizeof(Settings.mqtt_host), MDNS.IP(i).toString().c_str()); + SettingsUpdateText(SET_MQTT_HOST, MDNS.IP(i).toString().c_str()); Settings.mqtt_port = MDNS.port(i); - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_MDNS D_MQTT_SERVICE_FOUND " %s, " D_IP_ADDRESS " %s, " D_PORT " %d"), MDNS.hostname(i).c_str(), Settings.mqtt_host, Settings.mqtt_port); + AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_MDNS D_MQTT_SERVICE_FOUND " %s, " D_IP_ADDRESS " %s, " D_PORT " %d"), MDNS.hostname(i).c_str(), SettingsText(SET_MQTT_HOST), Settings.mqtt_port); } } #endif // MQTT_HOST_DISCOVERY @@ -187,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 @@ -202,8 +179,6 @@ void MqttInit(void) tlsClient = new BearSSL::WiFiClientSecure_light(1024,1024); #ifdef USE_MQTT_AWS_IOT - snprintf_P(AWS_endpoint, sizeof(AWS_endpoint), PSTR("%s%s"), Settings.mqtt_user, Settings.mqtt_host); - loadTlsDir(); // load key and certificate data from Flash tlsClient->setClientECCert(AWS_IoT_Client_Certificate, AWS_IoT_Private_Key, @@ -246,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; @@ -261,14 +245,10 @@ void MqttDataHandler(char* mqtt_topic, uint8_t* mqtt_data, unsigned int data_len if (data_len >= MQTT_MAX_PACKET_SIZE) { return; } // Do not execute multiple times if Prefix1 equals Prefix2 - if (!strcmp(Settings.mqtt_prefix[0], Settings.mqtt_prefix[1])) { - char *str = strstr(mqtt_topic, Settings.mqtt_prefix[0]); - if ((str == mqtt_topic) && mqtt_cmnd_publish) { - if (mqtt_cmnd_publish > 3) { - mqtt_cmnd_publish -= 3; - } else { - mqtt_cmnd_publish = 0; - } + if (!strcmp(SettingsText(SET_MQTTPREFIX1), SettingsText(SET_MQTTPREFIX2))) { + char *str = strstr(mqtt_topic, SettingsText(SET_MQTTPREFIX1)); + if ((str == mqtt_topic) && mqtt_cmnd_blocked) { + mqtt_cmnd_blocked--; return; } } @@ -316,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(Settings.mqtt_prefix[0], Settings.mqtt_prefix[1])) { - me = strstr(stopic, Settings.mqtt_prefix[0]); - 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 ")")); } } } @@ -379,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(Settings.mqtt_prefix[0],Settings.mqtt_prefix[1])) { - me = strstr(topic,Settings.mqtt_prefix[0]); - if (me == topic) { - mqtt_cmnd_publish += 3; - } - } - MqttPublishDirect(topic, retained); -} - void MqttPublish(const char* topic) { MqttPublish(topic, false); @@ -412,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 @@ -422,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) @@ -505,11 +485,7 @@ void MqttDisconnected(int state) MqttClient.disconnect(); -#if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_MQTT D_CONNECT_FAILED_TO " %s:%d, rc %d. " D_RETRY_IN " %d " D_UNIT_SECOND), AWS_endpoint, Settings.mqtt_port, state, Mqtt.retry_counter); -#else - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_MQTT D_CONNECT_FAILED_TO " %s:%d, rc %d. " D_RETRY_IN " %d " D_UNIT_SECOND), Settings.mqtt_host, Settings.mqtt_port, state, Mqtt.retry_counter); -#endif + AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_MQTT D_CONNECT_FAILED_TO " %s:%d, rc %d. " D_RETRY_IN " %d " D_UNIT_SECOND), SettingsText(SET_MQTT_HOST), Settings.mqtt_port, state, Mqtt.retry_counter); rules_flag.mqtt_disconnected = 1; } @@ -533,7 +509,7 @@ void MqttConnected(void) GetTopic_P(stopic, CMND, mqtt_topic, PSTR("#")); MqttSubscribe(stopic); - if (strstr_P(Settings.mqtt_fulltopic, MQTT_TOKEN_TOPIC) != nullptr) { + if (strstr_P(SettingsText(SET_MQTT_FULLTOPIC), MQTT_TOKEN_TOPIC) != nullptr) { GetGroupTopic_P(stopic, PSTR("#")); // SetOption75 0: %prefix%/nothing/%topic% = cmnd/nothing//# or SetOption75 1: cmnd/ MqttSubscribe(stopic); GetFallbackTopic_P(stopic, PSTR("#")); @@ -550,12 +526,23 @@ void MqttConnected(void) MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO "1")); #ifdef USE_WEBSERVER if (Settings.webserver) { +#if LWIP_IPV6 + Response_P(PSTR("{\"" D_JSON_WEBSERVER_MODE "\":\"%s\",\"" D_CMND_HOSTNAME "\":\"%s\",\"" D_CMND_IPADDRESS "\":\"%s\",\"IPv6Address\":\"%s\"}"), + (2 == Settings.webserver) ? D_ADMIN : D_USER, my_hostname, WiFi.localIP().toString().c_str(),WifiGetIPv6().c_str()); +#else Response_P(PSTR("{\"" D_JSON_WEBSERVER_MODE "\":\"%s\",\"" D_CMND_HOSTNAME "\":\"%s\",\"" D_CMND_IPADDRESS "\":\"%s\"}"), (2 == Settings.webserver) ? D_ADMIN : D_USER, my_hostname, WiFi.localIP().toString().c_str()); +#endif // LWIP_IPV6 = 1 MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO "2")); } #endif // USE_WEBSERVER - Response_P(PSTR("{\"" D_JSON_RESTARTREASON "\":\"%s\"}"), GetResetReasonInfo().c_str()); + Response_P(PSTR("{\"" D_JSON_RESTARTREASON "\":")); + if (CrashFlag()) { + CrashDump(); + } else { + ResponseAppend_P(PSTR("\"%s\""), GetResetReason().c_str()); + } + ResponseJsonEnd(); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO "3")); MqttPublishAllPowerState(); if (Settings.tele_period) { @@ -583,7 +570,7 @@ void MqttReconnect(void) MqttDiscoverServer(); #endif // MQTT_HOST_DISCOVERY #endif // USE_DISCOVERY - if (!strlen(Settings.mqtt_host) || !Settings.mqtt_port) { + if (!strlen(SettingsText(SET_MQTT_HOST)) || !Settings.mqtt_port) { Mqtt.allowed = false; } #if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) @@ -610,8 +597,12 @@ void MqttReconnect(void) char *mqtt_user = nullptr; char *mqtt_pwd = nullptr; - if (strlen(Settings.mqtt_user) > 0) mqtt_user = Settings.mqtt_user; - if (strlen(Settings.mqtt_pwd) > 0) mqtt_pwd = Settings.mqtt_pwd; + if (strlen(SettingsText(SET_MQTT_USER))) { + mqtt_user = SettingsText(SET_MQTT_USER); + } + if (strlen(SettingsText(SET_MQTT_PWD))) { + mqtt_pwd = SettingsText(SET_MQTT_PWD); + } GetTopic_P(stopic, TELE, mqtt_topic, S_LWT); Response_P(S_OFFLINE); @@ -634,10 +625,8 @@ void MqttReconnect(void) tlsClient->setClientECCert(AWS_IoT_Client_Certificate, AWS_IoT_Private_Key, 0xFFFF /* all usages, don't care */, 0); - MqttClient.setServer(AWS_endpoint, Settings.mqtt_port); -#else - MqttClient.setServer(Settings.mqtt_host, Settings.mqtt_port); #endif + MqttClient.setServer(SettingsText(SET_MQTT_HOST), Settings.mqtt_port); uint32_t mqtt_connect_time = millis(); #if defined(USE_MQTT_TLS) && !defined(USE_MQTT_TLS_CA_CERT) @@ -651,8 +640,7 @@ void MqttReconnect(void) tlsClient->setPubKeyFingerprint(Settings.mqtt_fingerprint[0], Settings.mqtt_fingerprint[1], allow_all_fingerprints); #endif #if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_MQTT "AWS IoT endpoint: %s"), AWS_endpoint); - //if (MqttClient.connect(mqtt_client, nullptr, nullptr, nullptr, 0, false, nullptr)) { + AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_MQTT "AWS IoT endpoint: %s"), SettingsText(SET_MQTT_HOST)); if (MqttClient.connect(mqtt_client, nullptr, nullptr, stopic, 1, false, mqtt_data, MQTT_CLEAN_SESSION)) { #else if (MqttClient.connect(mqtt_client, mqtt_user, mqtt_pwd, stopic, 1, true, mqtt_data, MQTT_CLEAN_SESSION)) { @@ -709,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(Settings.mqtt_host) && !Wifi.mdns_begun) { return; } -#endif // MQTT_HOST_DISCOVERY -#endif // USE_DISCOVERY MqttReconnect(); } else { Mqtt.retry_counter--; @@ -723,10 +706,19 @@ void MqttCheck(void) } } else { global_state.mqtt_down = 0; - if (Mqtt.initial_connection_state) MqttReconnect(); + if (Mqtt.initial_connection_state) { + MqttReconnect(); + } } } +bool ButtonTopicActive(void) +{ + char key_topic[TOPSZ]; + Format(key_topic, SettingsText(SET_MQTT_BUTTON_TOPIC), sizeof(key_topic)); + return ((strlen(key_topic) != 0) && strcmp(key_topic, "0")); +} + /*********************************************************************************************\ * Commands \*********************************************************************************************/ @@ -749,27 +741,25 @@ void CmndMqttFingerprint(void) } #endif -#if !defined(USE_MQTT_TLS) || !defined(USE_MQTT_AWS_IOT) // user and password are disabled with AWS IoT void CmndMqttUser(void) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.mqtt_user))) { - strlcpy(Settings.mqtt_user, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? MQTT_USER : XdrvMailbox.data, sizeof(Settings.mqtt_user)); + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_MQTT_USER, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? MQTT_USER : XdrvMailbox.data); restart_flag = 2; } - ResponseCmndChar(Settings.mqtt_user); + ResponseCmndChar(SettingsText(SET_MQTT_USER)); } void CmndMqttPassword(void) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.mqtt_pwd))) { - strlcpy(Settings.mqtt_pwd, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? MQTT_PASS : XdrvMailbox.data, sizeof(Settings.mqtt_pwd)); - ResponseCmndChar(Settings.mqtt_pwd); + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_MQTT_PWD, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? MQTT_PASS : XdrvMailbox.data); + ResponseCmndChar(SettingsText(SET_MQTT_PWD)); restart_flag = 2; } else { Response_P(S_JSON_COMMAND_ASTERISK, XdrvMailbox.command); } } -#endif // USE_MQTT_AWS_IOT void CmndMqttlog(void) { @@ -781,19 +771,11 @@ void CmndMqttlog(void) void CmndMqttHost(void) { -#if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len <= sizeof(Settings.mqtt_host) + sizeof(Settings.mqtt_user) - 2)) { - setLongMqttHost((SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? MQTT_HOST : XdrvMailbox.data); + if (XdrvMailbox.data_len > 0) { + SettingsUpdateText(SET_MQTT_HOST, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? MQTT_HOST : XdrvMailbox.data); restart_flag = 2; } - ResponseCmndChar(AWS_endpoint); -#else - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.mqtt_host))) { - strlcpy(Settings.mqtt_host, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? MQTT_HOST : XdrvMailbox.data, sizeof(Settings.mqtt_host)); - restart_flag = 2; - } - ResponseCmndChar(Settings.mqtt_host); -#endif + ResponseCmndChar(SettingsText(SET_MQTT_HOST)); } void CmndMqttPort(void) @@ -816,70 +798,78 @@ void CmndMqttRetry(void) void CmndStateText(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 4)) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.state_text[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); } - strlcpy(Settings.state_text[XdrvMailbox.index -1], XdrvMailbox.data, sizeof(Settings.state_text[0])); + ResponseCmndIdxChar(GetStateText(XdrvMailbox.index -1)); } - ResponseCmndIdxChar(GetStateText(XdrvMailbox.index -1)); } } void CmndMqttClient(void) { - if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.mqtt_client))) { - strlcpy(Settings.mqtt_client, (SC_DEFAULT == Shortcut()) ? MQTT_CLIENT_ID : XdrvMailbox.data, sizeof(Settings.mqtt_client)); + if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0)) { + SettingsUpdateText(SET_MQTT_CLIENT, (SC_DEFAULT == Shortcut()) ? MQTT_CLIENT_ID : XdrvMailbox.data); restart_flag = 2; } - ResponseCmndChar(Settings.mqtt_client); + ResponseCmndChar(SettingsText(SET_MQTT_CLIENT)); } void CmndFullTopic(void) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.mqtt_fulltopic))) { + if (XdrvMailbox.data_len > 0) { MakeValidMqtt(1, XdrvMailbox.data); if (!strcmp(XdrvMailbox.data, mqtt_client)) { SetShortcutDefault(); } char stemp1[TOPSZ]; strlcpy(stemp1, (SC_DEFAULT == Shortcut()) ? MQTT_FULLTOPIC : XdrvMailbox.data, sizeof(stemp1)); - if (strcmp(stemp1, Settings.mqtt_fulltopic)) { + if (strcmp(stemp1, SettingsText(SET_MQTT_FULLTOPIC))) { Response_P((Settings.flag.mqtt_offline) ? S_OFFLINE : ""); // SetOption10 - Control MQTT LWT message format MqttPublishPrefixTopic_P(TELE, PSTR(D_LWT), true); // Offline or remove previous retained topic - strlcpy(Settings.mqtt_fulltopic, stemp1, sizeof(Settings.mqtt_fulltopic)); + SettingsUpdateText(SET_MQTT_FULLTOPIC, stemp1); restart_flag = 2; } } - ResponseCmndChar(Settings.mqtt_fulltopic); + ResponseCmndChar(SettingsText(SET_MQTT_FULLTOPIC)); } void CmndPrefix(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 3)) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.mqtt_prefix[0]))) { - MakeValidMqtt(0, XdrvMailbox.data); - strlcpy(Settings.mqtt_prefix[XdrvMailbox.index -1], (SC_DEFAULT == Shortcut()) ? (1==XdrvMailbox.index)?SUB_PREFIX:(2==XdrvMailbox.index)?PUB_PREFIX:PUB_PREFIX2 : XdrvMailbox.data, sizeof(Settings.mqtt_prefix[0])); -// if (Settings.mqtt_prefix[XdrvMailbox.index -1][strlen(Settings.mqtt_prefix[XdrvMailbox.index -1])] == '/') Settings.mqtt_prefix[XdrvMailbox.index -1][strlen(Settings.mqtt_prefix[XdrvMailbox.index -1])] = 0; - 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(Settings.mqtt_prefix[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'; } @@ -888,60 +878,67 @@ void CmndPublish(void) void CmndGroupTopic(void) { - if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.mqtt_grptopic))) { +#ifdef USE_DEVICE_GROUPS + 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(); } - strlcpy(Settings.mqtt_grptopic, (SC_DEFAULT == Shortcut()) ? MQTT_GRPTOPIC : XdrvMailbox.data, sizeof(Settings.mqtt_grptopic)); +#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; } - ResponseCmndChar(Settings.mqtt_grptopic); + ResponseCmndChar(SettingsText(SET_MQTT_GRP_TOPIC)); } void CmndTopic(void) { - if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.mqtt_topic))) { + if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0)) { MakeValidMqtt(0, XdrvMailbox.data); if (!strcmp(XdrvMailbox.data, mqtt_client)) { SetShortcutDefault(); } char stemp1[TOPSZ]; strlcpy(stemp1, (SC_DEFAULT == Shortcut()) ? MQTT_TOPIC : XdrvMailbox.data, sizeof(stemp1)); - if (strcmp(stemp1, Settings.mqtt_topic)) { + if (strcmp(stemp1, SettingsText(SET_MQTT_TOPIC))) { Response_P((Settings.flag.mqtt_offline) ? S_OFFLINE : ""); // SetOption10 - Control MQTT LWT message format MqttPublishPrefixTopic_P(TELE, PSTR(D_LWT), true); // Offline or remove previous retained topic - strlcpy(Settings.mqtt_topic, stemp1, sizeof(Settings.mqtt_topic)); + SettingsUpdateText(SET_MQTT_TOPIC, stemp1); restart_flag = 2; } } - ResponseCmndChar(Settings.mqtt_topic); + ResponseCmndChar(SettingsText(SET_MQTT_TOPIC)); } void CmndButtonTopic(void) { - if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.button_topic))) { + if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0)) { MakeValidMqtt(0, XdrvMailbox.data); if (!strcmp(XdrvMailbox.data, mqtt_client)) { SetShortcutDefault(); } switch (Shortcut()) { - case SC_CLEAR: strlcpy(Settings.button_topic, "", sizeof(Settings.button_topic)); break; - case SC_DEFAULT: strlcpy(Settings.button_topic, mqtt_topic, sizeof(Settings.button_topic)); break; - case SC_USER: strlcpy(Settings.button_topic, MQTT_BUTTON_TOPIC, sizeof(Settings.button_topic)); break; - default: strlcpy(Settings.button_topic, XdrvMailbox.data, sizeof(Settings.button_topic)); + case SC_CLEAR: SettingsUpdateText(SET_MQTT_BUTTON_TOPIC, ""); break; + case SC_DEFAULT: SettingsUpdateText(SET_MQTT_BUTTON_TOPIC, mqtt_topic); break; + case SC_USER: SettingsUpdateText(SET_MQTT_BUTTON_TOPIC, MQTT_BUTTON_TOPIC); break; + default: SettingsUpdateText(SET_MQTT_BUTTON_TOPIC, XdrvMailbox.data); } } - ResponseCmndChar(Settings.button_topic); + ResponseCmndChar(SettingsText(SET_MQTT_BUTTON_TOPIC)); } void CmndSwitchTopic(void) { - if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.switch_topic))) { + if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0)) { MakeValidMqtt(0, XdrvMailbox.data); if (!strcmp(XdrvMailbox.data, mqtt_client)) { SetShortcutDefault(); } switch (Shortcut()) { - case SC_CLEAR: strlcpy(Settings.switch_topic, "", sizeof(Settings.switch_topic)); break; - case SC_DEFAULT: strlcpy(Settings.switch_topic, mqtt_topic, sizeof(Settings.switch_topic)); break; - case SC_USER: strlcpy(Settings.switch_topic, MQTT_SWITCH_TOPIC, sizeof(Settings.switch_topic)); break; - default: strlcpy(Settings.switch_topic, XdrvMailbox.data, sizeof(Settings.switch_topic)); + case SC_CLEAR: SettingsUpdateText(SET_MQTT_SWITCH_TOPIC, ""); break; + case SC_DEFAULT: SettingsUpdateText(SET_MQTT_SWITCH_TOPIC, mqtt_topic); break; + case SC_USER: SettingsUpdateText(SET_MQTT_SWITCH_TOPIC, MQTT_SWITCH_TOPIC); break; + default: SettingsUpdateText(SET_MQTT_SWITCH_TOPIC, XdrvMailbox.data); } } - ResponseCmndChar(Settings.switch_topic); + ResponseCmndChar(SettingsText(SET_MQTT_SWITCH_TOPIC)); } void CmndButtonRetain(void) @@ -1005,8 +1002,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 @@ -1071,6 +1070,9 @@ void CmndTlsKey(void) { } memcpy_P(spi_buffer, tls_spi_start, tls_spi_len); + // remove any white space from the base64 + RemoveAllSpaces(XdrvMailbox.data); + // allocate buffer for decoded base64 uint32_t bin_len = decode_base64_length((unsigned char*)XdrvMailbox.data); uint8_t *bin_buf = nullptr; @@ -1160,8 +1162,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 @@ -1187,10 +1193,8 @@ const char HTTP_FORM_MQTT1[] PROGMEM = "

" D_PORT " (" STR(MQTT_PORT) ")

" "

" D_CLIENT " (%s)

"; const char HTTP_FORM_MQTT2[] PROGMEM = -#if !defined(USE_MQTT_TLS) || !defined(USE_MQTT_AWS_IOT) // user and password disabled with AWS IoT "

" D_USER " (" MQTT_USER ")

" "

" D_PASSWORD "

" -#endif // USE_MQTT_AWS_IOT "

" D_TOPIC " = %%topic%% (%s)

" "

" D_FULL_TOPIC " (%s)

"; @@ -1206,22 +1210,18 @@ void HandleMqttConfiguration(void) return; } - char str[sizeof(Settings.mqtt_client)]; + char str[TOPSZ]; WSContentStart_P(S_CONFIGURE_MQTT); WSContentSendStyle(); WSContentSend_P(HTTP_FORM_MQTT1, -#if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) - AWS_endpoint, -#else - Settings.mqtt_host, -#endif + SettingsText(SET_MQTT_HOST), Settings.mqtt_port, - Format(str, MQTT_CLIENT_ID, sizeof(str)), MQTT_CLIENT_ID, Settings.mqtt_client); + Format(str, MQTT_CLIENT_ID, sizeof(str)), MQTT_CLIENT_ID, SettingsText(SET_MQTT_CLIENT)); WSContentSend_P(HTTP_FORM_MQTT2, - (Settings.mqtt_user[0] == '\0') ? "0" : Settings.mqtt_user, - Format(str, MQTT_TOPIC, sizeof(str)), MQTT_TOPIC, Settings.mqtt_topic, - MQTT_FULLTOPIC, MQTT_FULLTOPIC, Settings.mqtt_fulltopic); + (!strlen(SettingsText(SET_MQTT_USER))) ? "0" : SettingsText(SET_MQTT_USER), + Format(str, MQTT_TOPIC, sizeof(str)), MQTT_TOPIC, SettingsText(SET_MQTT_TOPIC), + MQTT_FULLTOPIC, MQTT_FULLTOPIC, SettingsText(SET_MQTT_FULLTOPIC)); WSContentSend_P(HTTP_FORM_END); WSContentSpaceButton(BUTTON_CONFIGURATION); WSContentStop(); @@ -1229,7 +1229,7 @@ void HandleMqttConfiguration(void) void MqttSaveSettings(void) { - char tmp[100]; + char tmp[TOPSZ]; char stemp[TOPSZ]; char stemp2[TOPSZ]; @@ -1239,32 +1239,28 @@ void MqttSaveSettings(void) WebGetArg("mf", tmp, sizeof(tmp)); strlcpy(stemp2, (!strlen(tmp)) ? MQTT_FULLTOPIC : tmp, sizeof(stemp2)); MakeValidMqtt(1, stemp2); - if ((strcmp(stemp, Settings.mqtt_topic)) || (strcmp(stemp2, Settings.mqtt_fulltopic))) { + if ((strcmp(stemp, SettingsText(SET_MQTT_TOPIC))) || (strcmp(stemp2, SettingsText(SET_MQTT_FULLTOPIC)))) { Response_P((Settings.flag.mqtt_offline) ? S_OFFLINE : ""); // SetOption10 - Control MQTT LWT message format MqttPublishPrefixTopic_P(TELE, S_LWT, true); // Offline or remove previous retained topic } - strlcpy(Settings.mqtt_topic, stemp, sizeof(Settings.mqtt_topic)); - strlcpy(Settings.mqtt_fulltopic, stemp2, sizeof(Settings.mqtt_fulltopic)); + SettingsUpdateText(SET_MQTT_TOPIC, stemp); + SettingsUpdateText(SET_MQTT_FULLTOPIC, stemp2); WebGetArg("mh", tmp, sizeof(tmp)); -#if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) - setLongMqttHost((!strlen(tmp)) ? MQTT_HOST : (!strcmp(tmp,"0")) ? "" : tmp); -#else - strlcpy(Settings.mqtt_host, (!strlen(tmp)) ? MQTT_HOST : (!strcmp(tmp,"0")) ? "" : tmp, sizeof(Settings.mqtt_host)); -#endif + SettingsUpdateText(SET_MQTT_HOST, (!strlen(tmp)) ? MQTT_HOST : (!strcmp(tmp,"0")) ? "" : tmp); WebGetArg("ml", tmp, sizeof(tmp)); Settings.mqtt_port = (!strlen(tmp)) ? MQTT_PORT : atoi(tmp); WebGetArg("mc", tmp, sizeof(tmp)); - strlcpy(Settings.mqtt_client, (!strlen(tmp)) ? MQTT_CLIENT_ID : tmp, sizeof(Settings.mqtt_client)); + SettingsUpdateText(SET_MQTT_CLIENT, (!strlen(tmp)) ? MQTT_CLIENT_ID : tmp); #if defined(USE_MQTT_TLS) && defined(USE_MQTT_AWS_IOT) AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_MQTT D_CMND_MQTTHOST " %s, " D_CMND_MQTTPORT " %d, " D_CMND_MQTTCLIENT " %s, " D_CMND_TOPIC " %s, " D_CMND_FULLTOPIC " %s"), - AWS_endpoint, Settings.mqtt_port, Settings.mqtt_client, Settings.mqtt_topic, Settings.mqtt_fulltopic); + SettingsText(SET_MQTT_HOST), Settings.mqtt_port, SettingsText(SET_MQTT_CLIENT), SettingsText(SET_MQTT_TOPIC), SettingsText(SET_MQTT_FULLTOPIC)); #else // USE_MQTT_AWS_IOT WebGetArg("mu", tmp, sizeof(tmp)); - strlcpy(Settings.mqtt_user, (!strlen(tmp)) ? MQTT_USER : (!strcmp(tmp,"0")) ? "" : tmp, sizeof(Settings.mqtt_user)); + SettingsUpdateText(SET_MQTT_USER, (!strlen(tmp)) ? MQTT_USER : (!strcmp(tmp,"0")) ? "" : tmp); WebGetArg("mp", tmp, sizeof(tmp)); - strlcpy(Settings.mqtt_pwd, (!strlen(tmp)) ? "" : (!strcmp(tmp, D_ASTERISK_PWD)) ? Settings.mqtt_pwd : tmp, sizeof(Settings.mqtt_pwd)); + SettingsUpdateText(SET_MQTT_PWD, (!strlen(tmp)) ? "" : (!strcmp(tmp, D_ASTERISK_PWD)) ? SettingsText(SET_MQTT_PWD) : tmp); AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_MQTT D_CMND_MQTTHOST " %s, " D_CMND_MQTTPORT " %d, " D_CMND_MQTTCLIENT " %s, " D_CMND_MQTTUSER " %s, " D_CMND_TOPIC " %s, " D_CMND_FULLTOPIC " %s"), - Settings.mqtt_host, Settings.mqtt_port, Settings.mqtt_client, Settings.mqtt_user, Settings.mqtt_topic, Settings.mqtt_fulltopic); + SettingsText(SET_MQTT_HOST), Settings.mqtt_port, SettingsText(SET_MQTT_CLIENT), SettingsText(SET_MQTT_USER), SettingsText(SET_MQTT_TOPIC), SettingsText(SET_MQTT_FULLTOPIC)); #endif } #endif // USE_WEBSERVER 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 7f1e66fc6..4c331b273 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,15 +271,13 @@ 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 - uint16_t fade_counter = 0; // fade timer in ticks (50ms) - uint16_t fade_duration = 0; // duration of fade in ticks (50ms) + uint16_t fade_duration = 0; // duration of fade in milliseconds + uint32_t fade_start = 0; // fade start time in milliseconds, compared to millis() } Light; power_t LightPower(void) @@ -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 @@ -530,8 +576,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 +617,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 +890,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 +965,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 +985,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 +1051,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 +1129,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 +1274,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 +1336,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 +1397,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 +1410,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 +1481,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 +1509,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 +1616,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,25 +1674,31 @@ 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++; - if (!Light.power) { // All channels powered off - Light.strip_timer_counter = 0; - if (!Light.fade_running) { - sleep = Settings.sleep; - } - if (Settings.light_scheme >= LS_MAX) { - power_off = true; - } - } else { + + // set sleep parameter: either settings, + // or set a maximum of PWM_MAX_SLEEP if light is on or Fade is running + if (Light.power || Light.fade_running) { if (Settings.sleep > PWM_MAX_SLEEP) { sleep = PWM_MAX_SLEEP; // set a maxumum value of 50 milliseconds to ensure that animations are smooth } else { sleep = Settings.sleep; // or keep the current sleep if it's lower than 50 } + } else { + sleep = Settings.sleep; + } + + if (!Light.power) { // All channels powered off + Light.strip_timer_counter = 0; + if (Settings.light_scheme >= LS_MAX) { + power_off = true; + } + } else { switch (Settings.light_scheme) { case LS_POWER: light_controller.calcLevels(Light.new_color); @@ -1612,8 +1723,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; } @@ -1648,159 +1767,190 @@ 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, 1, 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_counter = 0; Light.fade_duration = 0; // set the value to zero to force a recompute + Light.fade_start = 0; // Fade will applied immediately below } } if (Light.fade_running) { - 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], - // 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]); + if (LightApplyFade()) { + // 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); + } } } } -void LightApplyFade(void) { +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; + } +} + +bool LightApplyFade(void) { // did the value chanegd and needs to be applied + static uint32_t last_millis = 0; + uint32_t now = millis(); + + if ((now - last_millis) <= 5) { + return false; // the value was not changed in the last 5 milliseconds, ignore + } + last_millis = now; // Check if we need to calculate the duration if (0 == Light.fade_duration) { - Light.fade_counter = 0; + Light.fade_start = now; // 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; } } if (distance > 0) { // compute the duration of the animation // Note: Settings.light_speed is the number of half-seconds for a 100% fade, - // i.e. light_speed=1 means 1024 steps in 10 ticks (500ms) - Light.fade_duration = (distance * Settings.light_speed * 10) / 1024; - // Also postpone the save_data for the duration of the Fade (in seconds) - uint32_t delay_seconds = 1 + (Light.fade_duration + 19) / 20; // add one more second - // AddLog_P2(LOG_LEVEL_INFO, PSTR("delay_seconds %d, save_data_counter %d"), delay_seconds, save_data_counter); - if (save_data_counter < delay_seconds) { - save_data_counter = delay_seconds; // pospone + // i.e. light_speed=1 means 1024 steps in 500ms + Light.fade_duration = (distance * Settings.light_speed * 500) / 1023; + if (Settings.save_data) { + // Also postpone the save_data for the duration of the Fade (in seconds) + uint32_t delay_seconds = 1 + (Light.fade_duration + 999) / 1000; // add one more second + // AddLog_P2(LOG_LEVEL_INFO, PSTR("delay_seconds %d, save_data_counter %d"), delay_seconds, save_data_counter); + if (save_data_counter < delay_seconds) { + save_data_counter = delay_seconds; // pospone + } } } else { // no fade needed, we keep the duration at zero, it will fallback directly to end of fade + Light.fade_running = false; } } - Light.fade_counter++; - if (Light.fade_counter <= Light.fade_duration) { // fade not finished + uint16_t fade_current = now - Light.fade_start; // number of milliseconds since start of fade + 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(Light.fade_counter, - 0, Light.fade_duration, - Light.fade_start_8[i], Light.fade_end_8[i]); - Light.fade_cur_10[i] = changeUIntScale(Light.fade_counter, - 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 //AddLop_P2(LOG_LEVEL_DEBUG, PSTR("Stop fade")); Light.fade_running = false; - Light.fade_counter = 0; + 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; } // On entry we take the 5 channels 8 bits entry, and we apply Power modifiers @@ -1836,19 +1986,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]; @@ -1856,8 +2011,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; @@ -1869,83 +2022,154 @@ 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() +{ + uint8_t channels[LST_MAX]; + light_state.getChannels(channels); + SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SCHEME, Settings.light_scheme, DGR_ITEM_LIGHT_CHANNELS, channels, + DGR_ITEM_LIGHT_BRI, (power ? light_state.getBri() : 0)); +} + +void LightHandleDeviceGroupRequest() +{ + static bool send_state = false; + uint32_t value = XdrvMailbox.payload; + switch (XdrvMailbox.command_code) { + case DGR_ITEM_EOL: + LightAnimate(); + if (send_state && !(XdrvMailbox.index & DGR_FLAG_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_controller.changeBri(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: + { + struct XDRVMAILBOX save_XdrvMailbox; + power_t save_power = Light.power; + + if (value) { + bool save_decimal_text = Settings.flag.decimal_text; + char str[16]; + XdrvMailbox.index = 2; + XdrvMailbox.data_len = sprintf_P(str, PSTR("%u"), value); + XdrvMailbox.data = str; + CmndSupportColor(); + Settings.flag.decimal_text = save_decimal_text; + } + else { + Light.fixed_color_index = 0; + XdrvMailbox.index = 1; + XdrvMailbox.payload = light_state.BriToDimmer(light_state.getBri()); + CmndWhite(); + } + if (Light.power != save_power) { + XdrvMailbox.index = save_power; + LightSetPower(); + } + XdrvMailbox = save_XdrvMailbox; + 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 \*********************************************************************************************/ @@ -2011,7 +2235,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 } @@ -2072,6 +2296,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(); } @@ -2079,23 +2310,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 @@ -2140,49 +2373,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); } @@ -2191,6 +2410,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; @@ -2203,7 +2427,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; } @@ -2220,8 +2451,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; @@ -2231,18 +2464,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); @@ -2252,8 +2490,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(); @@ -2286,24 +2537,24 @@ void CmndDimmer(void) } } Light.update = true; + if (skip_light_fade) LightAnimate(); } else { ResponseCmndNumber(dimmer); } + skip_light_fade = false; } +#endif // USE_LIGHT +#if defined(USE_LIGHT) || defined(USE_PWM_DIMMER) 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]; @@ -2311,13 +2562,22 @@ void CmndDimmerRange(void) Settings.dimmer_hw_min = parm[1]; Settings.dimmer_hw_max = parm[0]; } - restart_flag = 2; +#ifdef USE_DEVICE_GROUPS + SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_DIMMER_RANGE, Settings.dimmer_hw_min | Settings.dimmer_hw_max << 16); +#endif // USE_DEVICE_GROUPS + 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); } +#endif // #if defined(USE_LIGHT) || defined(USE_PWM_DIMMER) +#ifdef USE_LIGHT 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 @@ -2335,33 +2595,32 @@ 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); } +#endif // USE_LIGHT +#if defined(USE_LIGHT) || defined(USE_PWM_DIMMER) 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 @@ -2371,12 +2630,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; @@ -2387,12 +2655,19 @@ 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); } +#endif // #if defined(USE_LIGHT) || defined(USE_PWM_DIMMER) +#ifdef USE_LIGHT 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; @@ -2401,7 +2676,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 @@ -2419,16 +2695,31 @@ bool Xdrv04(uint8_t function) bool result = false; if (FUNC_MODULE_INIT == function) { - return LightModuleInit(); +#ifdef USE_PWM_DIMMER + if (PWM_DIMMER != my_module_type) +#endif // USE_PWM_DIMMER + return LightModuleInit(); } else if (light_type) { switch (function) { case FUNC_SERIAL: result = XlgtCall(FUNC_SERIAL); break; + case FUNC_LOOP: + if (Light.fade_running) { + if (LightApplyFade()) { + LightSetOutputs(Light.fade_cur_10); + } + } + break; case FUNC_EVERY_50_MSECOND: LightAnimate(); break; +#ifdef USE_DEVICE_GROUPS + case FUNC_DEVICE_GROUP_REQUEST: + LightHandleDeviceGroupRequest(); + 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..6c6e16fdb 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) { diff --git a/tasmota/xdrv_05_irremote_full.ino b/tasmota/xdrv_05_irremote_full.ino index d01291c7c..14de34cbc 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; } 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..90563eeed 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 } @@ -592,6 +650,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 a71960695..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); @@ -554,10 +554,10 @@ const char HTTP_TIMER_SCRIPT2[] PROGMEM = "o=qs('#ho');" "e=o.childElementCount;" "if(b==1){" - "qs('#dr').disabled='';" + "qs('#dr').style.visibility='';" "if(e>12){for(i=12;i<=23;i++){o.removeChild(o.lastElementChild);}}" // Create offset hours select options "}else{" - "qs('#dr').disabled='disabled';" + "qs('#dr').style.visibility='hidden';" "if(e<23){for(i=12;i<=23;i++){ce(i,o);}}" // Create hours select options "}" "}"; @@ -583,7 +583,7 @@ const char HTTP_TIMER_SCRIPT3[] PROGMEM = "if(m==0){s|=l;}" // Get time #ifdef USE_SUNRISE "if((m==1)||(m==2)){" - "if(qs('#dr').selectedIndex>0){l+=720;}" // If negative offset, add 12h to given offset time + "if(qs('#dr').selectedIndex>0){if(l>0){l+=720;}}" // If negative offset and delta-time > 0, add 12h to given offset time "s|=l&0x7FF;" // Save offset instead of time "}" #endif @@ -733,12 +733,13 @@ void HandleTimerConfiguration(void) void TimerSaveSettings(void) { char tmp[MAX_TIMERS *12]; // Need space for MAX_TIMERS x 10 digit numbers separated by a comma + char message[LOGSZ]; Timer timer; Settings.flag3.timers_enable = WebServer->hasArg("e0"); // CMND_TIMERS WebGetArg("t0", tmp, sizeof(tmp)); char *p = tmp; - snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MQTT D_CMND_TIMERS " %d"), Settings.flag3.timers_enable); // CMND_TIMERS + snprintf_P(message, sizeof(message), PSTR(D_LOG_MQTT D_CMND_TIMERS " %d"), Settings.flag3.timers_enable); // CMND_TIMERS for (uint32_t i = 0; i < MAX_TIMERS; i++) { timer.data = strtol(p, &p, 10); p++; // Skip comma @@ -747,9 +748,9 @@ void TimerSaveSettings(void) Settings.timer[i].data = timer.data; if (flag) TimerSetRandomWindow(i); } - snprintf_P(log_data, sizeof(log_data), PSTR("%s,0x%08X"), log_data, Settings.timer[i].data); + snprintf_P(message, sizeof(message), PSTR("%s,0x%08X"), message, Settings.timer[i].data); } - AddLog(LOG_LEVEL_DEBUG); + AddLog_P(LOG_LEVEL_DEBUG, message); } #endif // USE_TIMERS_WEB #endif // USE_WEBSERVER diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index 441722662..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 @@ -174,8 +174,8 @@ char rules_vars[MAX_RULE_VARS][33] = {{ 0 }}; #if (MAX_RULE_VARS>16) #error MAX_RULE_VARS is bigger than 16 #endif -#if (MAX_RULE_MEMS>5) -#error MAX_RULE_MEMS is bigger than 5 +#if (MAX_RULE_MEMS>16) +#error MAX_RULE_MEMS is bigger than 16 #endif /*******************************************************************************************/ @@ -217,7 +217,7 @@ bool RulesRuleMatch(uint8_t rule_set, String &event, String &rule) for (uint32_t i = 0; i < MAX_RULE_MEMS; i++) { snprintf_P(stemp, sizeof(stemp), PSTR("%%MEM%d%%"), i +1); if (rule_param.startsWith(stemp)) { - rule_param = Settings.mems[i]; + rule_param = SettingsText(SET_MEM1 + i); break; } } @@ -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) { 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++) { @@ -447,12 +473,12 @@ bool RuleSetProcess(uint8_t rule_set, String &event_saved) } for (uint32_t i = 0; i < MAX_RULE_MEMS; i++) { snprintf_P(stemp, sizeof(stemp), PSTR("%%MEM%d%%"), i +1); - RulesVarReplace(commands, stemp, Settings.mems[i]); + RulesVarReplace(commands, stemp, SettingsText(SET_MEM1 +i)); } RulesVarReplace(commands, F("%TIME%"), String(MinutesPastMidnight())); RulesVarReplace(commands, F("%UPTIME%"), String(MinutesUptime())); RulesVarReplace(commands, F("%TIMESTAMP%"), GetDateAndTime(DT_LOCAL)); - RulesVarReplace(commands, F("%TOPIC%"), Settings.mqtt_topic); + RulesVarReplace(commands, F("%TOPIC%"), SettingsText(SET_MQTT_TOPIC)); #if defined(USE_TIMERS) && defined(USE_SUNRISE) RulesVarReplace(commands, F("%SUNRISE%"), String(SunMinutes(0))); RulesVarReplace(commands, F("%SUNSET%"), String(SunMinutes(1))); @@ -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); } } @@ -608,7 +633,7 @@ void RulesEvery50ms(void) for (uint32_t i = 0; i < MAX_RULE_MEMS; i++) { if (bitRead(Rules.mems_event, i)) { bitClear(Rules.mems_event, i); - snprintf_P(json_event, sizeof(json_event), PSTR("{\"Mem%d\":{\"State\":%s}}"), i+1, Settings.mems[i]); + snprintf_P(json_event, sizeof(json_event), PSTR("{\"Mem%d\":{\"State\":%s}}"), i+1, SettingsText(SET_MEM1 +i)); RulesProcessEvent(json_event); break; } @@ -1002,7 +1027,7 @@ bool findNextVariableValue(char * &pVarname, float &value) } else if (sVarName.startsWith(F("MEM"))) { int index = sVarName.substring(3).toInt(); if (index > 0 && index <= MAX_RULE_MEMS) { - value = CharToFloat(Settings.mems[index -1]); + value = CharToFloat(SettingsText(SET_MEM1 + index -1)); } } else if (sVarName.equals(F("TIME"))) { value = MinutesPastMidnight(); @@ -1400,8 +1425,7 @@ bool evaluateLogicalExpression(const char * expression, int len) memcpy(expbuff, expression, len); expbuff[len] = '\0'; - //snprintf_P(log_data, sizeof(log_data), PSTR("EvalLogic: |%s|"), expbuff); - //AddLog(LOG_LEVEL_DEBUG); + //AddLog_P2(LOG_LEVEL_DEBUG, PSTR("EvalLogic: |%s|"), expbuff); char * pointer = expbuff; LinkedList values; LinkedList logicOperators; @@ -1527,8 +1551,7 @@ void ExecuteCommandBlock(const char * commands, int len) memcpy(cmdbuff, commands, len); cmdbuff[len] = '\0'; - //snprintf_P(log_data, sizeof(log_data), PSTR("ExecCmd: |%s|"), cmdbuff); - //AddLog(LOG_LEVEL_DEBUG); + //AddLog_P2(LOG_LEVEL_DEBUG, PSTR("ExecCmd: |%s|"), cmdbuff); char oneCommand[len + 1]; //To put one command int insertPosition = 0; //When insert into backlog, we should do it by 0, 1, 2 ... char * pos = cmdbuff; @@ -1808,25 +1831,21 @@ 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, Settings.mems[i]); - } - ResponseJsonEnd(); + ResponseCmndAll(SET_MEM1, MAX_RULE_MEMS); } else { if (XdrvMailbox.data_len > 0) { #ifdef USE_EXPRESSION if (XdrvMailbox.data[0] == '=') { // Spaces already been skipped in data - dtostrfd(evaluateExpression(XdrvMailbox.data + 1, XdrvMailbox.data_len - 1), Settings.flag2.calc_resolution, Settings.mems[XdrvMailbox.index -1]); + dtostrfd(evaluateExpression(XdrvMailbox.data + 1, XdrvMailbox.data_len - 1), Settings.flag2.calc_resolution, SettingsText(SET_MEM1 + XdrvMailbox.index -1)); } else { - strlcpy(Settings.mems[XdrvMailbox.index -1], ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data, sizeof(Settings.mems[XdrvMailbox.index -1])); + SettingsUpdateText(SET_MEM1 + XdrvMailbox.index -1, ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data); } #else - strlcpy(Settings.mems[XdrvMailbox.index -1], ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data, sizeof(Settings.mems[XdrvMailbox.index -1])); + SettingsUpdateText(SET_MEM1 + XdrvMailbox.index -1, ('"' == XdrvMailbox.data[0]) ? "" : XdrvMailbox.data); #endif // USE_EXPRESSION bitSet(Rules.mems_event, XdrvMailbox.index -1); } - ResponseCmndIdxChar(Settings.mems[XdrvMailbox.index -1]); + ResponseCmndIdxChar(SettingsText(SET_MEM1 + XdrvMailbox.index -1)); } } } diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 0bab141d7..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 @@ -56,7 +56,8 @@ keywords if then else endif, or, and are better readable for beginners (others m #define SCRIPT_MAXSSIZE 48 #define SCRIPT_EOL '\n' #define SCRIPT_FLOAT_PRECISION 2 -#define SCRIPT_MAXPERM (MAX_RULE_MEMS*10)-4/sizeof(float) +#define PMEM_SIZE sizeof(Settings.script_pram) +#define SCRIPT_MAXPERM (PMEM_SIZE)-4/sizeof(float) #define MAX_SCRIPT_SIZE MAX_RULE_SIZE*MAX_RULE_SETS // offsets epoch readings by 1.1.2019 00:00:00 to fit into float with second resolution @@ -1030,8 +1031,10 @@ char *isvar(char *lp, uint8_t *vtype,struct T_INDEX *tind,float *fp,char *sp,Jso if ((*jo).is(vn)) { if (!strncmp(str_value,"ON",2)) { if (fp) *fp=1; + goto nexit; } else if (!strncmp(str_value,"OFF",3)) { if (fp) *fp=0; + goto nexit; } else { *vtype=STR_RES; tind->bits.constant=1; @@ -1039,6 +1042,7 @@ char *isvar(char *lp, uint8_t *vtype,struct T_INDEX *tind,float *fp,char *sp,Jso if (sp) strlcpy(sp,str_value,SCRIPT_MAXSSIZE); return lp+len; } + } else { if (fp) { if (!strncmp(vn.c_str(),"Epoch",5)) { @@ -1047,6 +1051,7 @@ char *isvar(char *lp, uint8_t *vtype,struct T_INDEX *tind,float *fp,char *sp,Jso *fp=CharToFloat((char*)str_value); } } + nexit: *vtype=NUM_RES; tind->bits.constant=1; tind->bits.is_string=0; @@ -1366,7 +1371,7 @@ chknext: goto exit; } if (!strncmp(vname,"gtopic",6)) { - if (sp) strlcpy(sp,Settings.mqtt_grptopic,glob_script_mem.max_ssize); + if (sp) strlcpy(sp,SettingsText(SET_MQTT_GRP_TOPIC),glob_script_mem.max_ssize); goto strexit; } break; @@ -1491,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)) { @@ -1523,15 +1559,15 @@ chknext: goto exit; } if (!strncmp(vname,"prefix1",7)) { - if (sp) strlcpy(sp,Settings.mqtt_prefix[0],glob_script_mem.max_ssize); + if (sp) strlcpy(sp,SettingsText(SET_MQTTPREFIX1),glob_script_mem.max_ssize); goto strexit; } if (!strncmp(vname,"prefix2",7)) { - if (sp) strlcpy(sp,Settings.mqtt_prefix[1],glob_script_mem.max_ssize); + if (sp) strlcpy(sp,SettingsText(SET_MQTTPREFIX2),glob_script_mem.max_ssize); goto strexit; } if (!strncmp(vname,"prefix3",7)) { - if (sp) strlcpy(sp,Settings.mqtt_prefix[2],glob_script_mem.max_ssize); + if (sp) strlcpy(sp,SettingsText(SET_MQTTPREFIX3),glob_script_mem.max_ssize); goto strexit; } if (!strncmp(vname,"pow(",4)) { @@ -1571,7 +1607,7 @@ chknext: case 'r': if (!strncmp(vname,"ram",3)) { - fvar=glob_script_mem.script_mem_size+(glob_script_mem.script_size)+(MAX_RULE_MEMS*10); + fvar=glob_script_mem.script_mem_size+(glob_script_mem.script_size)+(PMEM_SIZE); goto exit; } break; @@ -1583,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; @@ -1709,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': @@ -1740,7 +1800,7 @@ chknext: goto strexit; } if (!strncmp(vname,"topic",5)) { - if (sp) strlcpy(sp,Settings.mqtt_topic,glob_script_mem.max_ssize); + if (sp) strlcpy(sp,SettingsText(SET_MQTT_TOPIC),glob_script_mem.max_ssize); goto strexit; } #ifdef USE_DISPLAY @@ -2199,8 +2259,7 @@ void Replace_Cmd_Vars(char *srcbuf,char *dstbuf,uint16_t dstsize) { void toLog(const char *str) { if (!str) return; - snprintf_P(log_data, sizeof(log_data), PSTR("%s"),str); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, str); } @@ -2677,8 +2736,7 @@ int16_t Run_Scripter(const char *type, int8_t tlen, char *js) { } cmd[count]=*lp++; } - //snprintf_P(log_data, sizeof(log_data), tmp); - //AddLog(LOG_LEVEL_INFO); + //AddLog_P(LOG_LEVEL_INFO, tmp); // replace vars in cmd char *tmp=cmdmem+SCRIPT_CMDMEM/2; Replace_Cmd_Vars(cmd,tmp,SCRIPT_CMDMEM/2); @@ -2690,8 +2748,7 @@ int16_t Run_Scripter(const char *type, int8_t tlen, char *js) { } else { if (!sflag) { tasm_cmd_activ=1; - snprintf_P(log_data, sizeof(log_data), PSTR("Script: performs \"%s\""), tmp); - AddLog(glob_script_mem.script_loglevel&0x7f); + AddLog_P2(glob_script_mem.script_loglevel&0x7f, PSTR("Script: performs \"%s\""), tmp); } else if (sflag==2) { // allow recursive call } else { @@ -2991,7 +3048,7 @@ void ScripterEvery100ms(void) { if (fast_script==99) Run_Scripter(">F",2,0); } -//mems[MAX_RULE_MEMS] is 50 bytes in 6.5 +//mems[5] is 50 bytes in 6.5 // can hold 11 floats or floats + strings // should report overflow later void Scripter_save_pvars(void) { @@ -3003,7 +3060,7 @@ void Scripter_save_pvars(void) { if (vtp[count].bits.is_permanent && !vtp[count].bits.is_string) { uint8_t index=vtp[count].index; mlen+=sizeof(float); - if (mlen>MAX_RULE_MEMS*10) { + if (mlen>PMEM_SIZE) { vtp[count].bits.is_permanent=0; return; } @@ -3017,7 +3074,7 @@ void Scripter_save_pvars(void) { char *sp=glob_script_mem.glob_snp+(index*glob_script_mem.max_ssize); uint8_t slen=strlen(sp); mlen+=slen+1; - if (mlen>MAX_RULE_MEMS*10) { + if (mlen>PMEM_SIZE) { vtp[count].bits.is_permanent=0; return; } @@ -3031,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; @@ -3049,7 +3101,7 @@ const char HTTP_FORM_SCRIPT[] PROGMEM = const char HTTP_FORM_SCRIPT1[] PROGMEM = "
" - "script enable
" + "" D_SCRIPT_ENABLE "
" "