diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fa3a182c3..181254a59 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,7 +6,7 @@ - [ ] The pull request is done against the latest dev branch - [ ] Only relevant files were touched - [ ] Only one feature/fix was added per PR. - - [ ] The code change is tested and works on Tasmota core ESP8266 V.2.7.2.1 + - [ ] The code change is tested and works on Tasmota core ESP8266 V.2.7.3.2 - [ ] The code change is tested and works on core ESP32 V.1.12.2 - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). diff --git a/.github/workflows/CI_github.yml b/.github/workflows/CI_github.yml index 0fe2fd9c5..1f4f79f38 100644 --- a/.github/workflows/CI_github.yml +++ b/.github/workflows/CI_github.yml @@ -110,6 +110,21 @@ jobs: - name: Run PlatformIO run: platformio run -e tasmota-ir + tasmota-zbbridge: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: platformio run -e tasmota-zbbridge + tasmota-BG: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index 819771059..1a9a011de 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -207,6 +207,28 @@ jobs: path: ./build_output/firmware + tasmota-zbbridge: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota-zbbridge + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + tasmota-BG: needs: tasmota_pull runs-on: ubuntu-latest @@ -1482,6 +1504,7 @@ jobs: [ ! -f ./mv_firmware/tasmota-ir*.* ] || mv ./mv_firmware/tasmota-ir*.* ./firmware/tasmota/ [ ! -f ./mv_firmware/tasmota-display.* ] || mv ./mv_firmware/tasmota-display.* ./firmware/tasmota/ [ ! -f ./mv_firmware/tasmota-knx.* ] || mv ./mv_firmware/tasmota-knx.* ./firmware/tasmota/ + [ ! -f ./mv_firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/tasmota-zbbridge.* ./firmware/tasmota/ [ ! -f ./mv_firmware/tasmota32.* ] || mv ./mv_firmware/tasmota32.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-sensors.* ] || mv ./mv_firmware/tasmota32-sensors.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-minimal.* ] || mv ./mv_firmware/tasmota32-minimal.* ./firmware/tasmota32/ diff --git a/BUILDS.md b/BUILDS.md index c1aa5e2e3..b27400c96 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -148,6 +148,8 @@ | USE_NRF24 | - | - | - | - | - | - | - | | USE_MIBLE | - | - | - | - | - | - | - | | USE_ZIGBEE | - | - | - | - | - | - | - | +| USE_ZIGBEE_ZNP | - | - | - | - | - | - | - | +| USE_ZIGBEE_EZSP | - | - | - | - | - | - | - | Sonoff ZbBridge | | | | | | | | | | USE_IR_REMOTE | - | - | x | x | x | x | x | | USE_IR_RECEIVE | - | - | x | x | x | x | x | diff --git a/FIRMWARE.md b/FIRMWARE.md index d66bd1ba1..9f05223e8 100644 --- a/FIRMWARE.md +++ b/FIRMWARE.md @@ -18,7 +18,7 @@ See [CHANGELOG.md](https://github.com/arendst/Tasmota/blob/development/tasmota/C ## Development -[![Dev Version](https://img.shields.io/badge/development%20version-v8.3.x.x-blue.svg)](https://github.com/arendst/Tasmota) +[![Dev Version](https://img.shields.io/badge/development%20version-v8.4.x.x-blue.svg)](https://github.com/arendst/Tasmota) [![Download Dev](https://img.shields.io/badge/download-development-yellow.svg)](http://thehackbox.org/tasmota/) [![Tasmota CI](https://github.com/arendst/Tasmota/workflows/Tasmota%20CI/badge.svg)](https://github.com/arendst/Tasmota/actions?query=workflow%3A%22Tasmota+CI%22) [![Tasmota ESP32 CI](https://github.com/arendst/Tasmota/workflows/Tasmota%20ESP32%20CI/badge.svg)](https://github.com/arendst/Tasmota/actions?query=workflow%3A%22Tasmota+ESP32+CI%22) diff --git a/MODULES.md b/MODULES.md index e16dec401..29575f5bb 100644 --- a/MODULES.md +++ b/MODULES.md @@ -2,81 +2,82 @@ The following hardware modules are supported. -Module | Description -------------------|----------------------- -01 Sonoff Basic | Sonoff Basic Wifi Smart Switch -02 Sonoff RF | Sonoff RF Wifi Smart Switch with RF (434MHz) receiver -03 Sonoff SV | Sonoff SV Safe Voltage Wifi Smart Switch -04 Sonoff TH | Sonoff TH10/TH16 Wifi Smart Switch with Sensor connection -05 Sonoff Dual | Sonoff Dual Wifi Smart Switch -06 Sonoff Pow | Sonoff Pow Wifi Smart Switch with Energy Monitoring -07 Sonoff 4CH | Sonoff 4CH 4-gang Wifi Smart Switch -08 Sonoff S2X | Sonoff S20/S26 Wifi Smart Socket -09 Slampher | Sonoff Slampher Wifi Smart Light Bulb Socket with RF (434MHz) receiver -10 Sonoff Touch | Sonoff Touch Wifi Light Switch -11 Sonoff LED | Sonoff Led Wifi Led Pack (Retired) -12 1 Channel | 1 Channel Inching/Self Locking Wifi Switch 5V/12V -13 4 Channel | 4 Channel Inching/Self Locking Wifi Switch (Retired) -14 Motor C/AC | Motor Clockwise/Antoclockwise Wifi Switch (Retired) -15 ElectroDragon | Electrodragon Wifi IoT Board -16 EXS Relay(s) | Electronic Experience Store 1 or 2-gang Wifi Module -17 WiOn | WiOn Wifi Smart Socket -18 Generic | Any ESP8266/ESP8285 device like WeMos and NodeMCU -19 Sonoff Dev | Sonoff Dev Wifi Development Board -20 H801 | H801 Wifi 5 Channel LED Controller -21 Sonoff SC | Sonoff SC Wifi Environmental Monitor -22 Sonoff BN-SZ | Sonoff BN-SZ01 Wifi Ceiling Led (Retired) -23 Sonoff 4CH Pro | Sonoff 4CH Pro 4-gang Wifi Smart Switch -24 Huafan SS | HuaFan Wifi Smart Socket -25 Sonoff Bridge | Sonoff RF (434MHz) transceive to Wifi Bridge -26 Sonoff B1 | Sonoff B1 Wifi RGBWW Led Bulb -27 AiLight | Ai-Thinker RGBW Led Bulb -28 Sonoff T1 1CH | Sonoff T1 1-gang Wifi Light Switch -29 Sonoff T1 2CH | Sonoff T1 2-gang Wifi Light Switch -30 Sonoff T1 3CH | Sonoff T1 3-gang Wifi Light Switch -31 Supla Espablo | 2-gang Wifi Module -32 Witty Cloud | Witty Cloud ESP8266 Wifi Development Board -33 Yunshan Relay | ESP8266 Wifi Network Relay Module -34 MagicHome | MagicHome, Flux-light and some Arilux LC10 RGB(W) Led Controller -35 Luani HVIO | Luani ESP8266 Wifi I/O Module -36 KMC 70011 | KMC Wifi Smart Socket with Energy Monitoring -37 Arilux LC01 | Arilux AL-LC01 RGB Led Controller -38 Arilux LC11 | Arilux AL-LC11 RGBWW Led Controller -39 Sonoff Dual R2 | Sonoff Dual R2 Wifi Smart Switch -40 Arilux LC06 | Arilux AL-LC06 RGB(WW) Led Controller -41 Sonoff S31 | Sonoff S31 Wifi Smart Socket with Energy Monitoring -42 Zengge WF017 | Zengge WF017 Wifi RGB(W) Led Controller -43 Sonoff Pow R2 | Sonoff Pow R2 Wifi Smart Switch with Energy Monitoring -44 Sonoff iFan02 | Sonoff iFan02 Wifi Smart Ceiling Fan with Light -45 BlitzWolf SHP | BlitzWolf BW-SHP2, BW-SHP6, HomeCube SP1, Gosund SP111, Teckin SP22 Wifi Smart Switch with Energy Monitoring -46 Shelly 1 | Shelly 1 Open Source Wifi Relay Module -47 Shelly 2 | Shelly 2 Wifi 2-gang Relay Module with Energy Monitoring -48 Xiaomi Philips | Xiaomi Philips Wifi WW Led Bulb -49 Neo Coolcam | Neo Coolcam Wifi Smart Socket -50 ESP Switch | ESP Switch 4-gang Wifi Switch with Leds -51 OBI Socket | OBI Wifi Smart Socket -52 Teckin | Teckin SP22 Wifi Smart Switch with Energy Monitoring -53 AplicWDP303075 | Aplic WDP 303075 CSL Wifi Smart Switch with Energy Monitoring -54 TuyaMCU | Devices with an MCU using Tuya communication protocol for control -55 Gosund SP1 v23 | Gosund SP1 v2.3 Wifi Smart Switch with Energy Monitoring -56 ARMTR Dimmer | ARMtronix Wifi dimmer for Incandescent Lights and Led -57 SK03 Outdoor | SK03 Outdoor Wifi Smart Switch with Energy Monitoring -58 PS-16-DZ | PS-16-DZ Wifi dimmer for Incandescent Lights and Led -59 Teckin US | Teckin SP20 and ZooZee SA102 Wifi Smart Switch with Energy Monitoring -60 Manzoku strip | Manzoku Wifi Smart Power Strip with four Relays -61 OBI Socket 2 | OBI 2 Wifi Smart Socket -62 YTF IR Bridge | YTF Universal IR Bridge -63 Digoo DG-SP202 | Digoo DG-SP202 Dual Wifi Smart Switch with Energy Monitoring -64 KA10 | Smanergy KA10 Wifi Smart Wall Switch with Energy Monitoring -65 Luminea ZX2820 | Luminea ZX2820 Wifi Smart Switch with Energy Monitoring -66 Mi Desk Lamp | Mi Desk Lamp with rotary switch and Wifi -67 SP10 | Tuya SP10 Wifi Smart Switch with Energy Monitoring -68 WAGA CHCZ02MB | WAGA life CHCZ02MB Wifi Smart Switch with Energy Monitoring -69 SYF05 | Sunyesmart SYF05 RGBWW Wifi Led Bulb -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 +Module | Description +-------------------|----------------------- +01 Sonoff Basic | Sonoff Basic Wifi Smart Switch +02 Sonoff RF | Sonoff RF Wifi Smart Switch with RF (434MHz) receiver +03 Sonoff SV | Sonoff SV Safe Voltage Wifi Smart Switch +04 Sonoff TH | Sonoff TH10/TH16 Wifi Smart Switch with Sensor connection +05 Sonoff Dual | Sonoff Dual Wifi Smart Switch +06 Sonoff Pow | Sonoff Pow Wifi Smart Switch with Energy Monitoring +07 Sonoff 4CH | Sonoff 4CH 4-gang Wifi Smart Switch +08 Sonoff S2X | Sonoff S20/S26 Wifi Smart Socket +09 Slampher | Sonoff Slampher Wifi Smart Light Bulb Socket with RF (434MHz) receiver +10 Sonoff Touch | Sonoff Touch Wifi Light Switch +11 Sonoff LED | Sonoff Led Wifi Led Pack (Retired) +12 1 Channel | 1 Channel Inching/Self Locking Wifi Switch 5V/12V +13 4 Channel | 4 Channel Inching/Self Locking Wifi Switch (Retired) +14 Motor C/AC | Motor Clockwise/Antoclockwise Wifi Switch (Retired) +15 ElectroDragon | Electrodragon Wifi IoT Board +16 EXS Relay(s) | Electronic Experience Store 1 or 2-gang Wifi Module +17 WiOn | WiOn Wifi Smart Socket +18 Generic | Any ESP8266/ESP8285 device like WeMos and NodeMCU +19 Sonoff Dev | Sonoff Dev Wifi Development Board +20 H801 | H801 Wifi 5 Channel LED Controller +21 Sonoff SC | Sonoff SC Wifi Environmental Monitor +22 Sonoff BN-SZ | Sonoff BN-SZ01 Wifi Ceiling Led (Retired) +23 Sonoff 4CH Pro | Sonoff 4CH Pro 4-gang Wifi Smart Switch +24 Huafan SS | HuaFan Wifi Smart Socket +25 Sonoff Bridge | Sonoff RF (434MHz) transceive to Wifi Bridge +26 Sonoff B1 | Sonoff B1 Wifi RGBWW Led Bulb +27 AiLight | Ai-Thinker RGBW Led Bulb +28 Sonoff T1 1CH | Sonoff T1 1-gang Wifi Light Switch +29 Sonoff T1 2CH | Sonoff T1 2-gang Wifi Light Switch +30 Sonoff T1 3CH | Sonoff T1 3-gang Wifi Light Switch +31 Supla Espablo | 2-gang Wifi Module +32 Witty Cloud | Witty Cloud ESP8266 Wifi Development Board +33 Yunshan Relay | ESP8266 Wifi Network Relay Module +34 MagicHome | MagicHome, Flux-light and some Arilux LC10 RGB(W) Led Controller +35 Luani HVIO | Luani ESP8266 Wifi I/O Module +36 KMC 70011 | KMC Wifi Smart Socket with Energy Monitoring +37 Arilux LC01 | Arilux AL-LC01 RGB Led Controller +38 Arilux LC11 | Arilux AL-LC11 RGBWW Led Controller +39 Sonoff Dual R2 | Sonoff Dual R2 Wifi Smart Switch +40 Arilux LC06 | Arilux AL-LC06 RGB(WW) Led Controller +41 Sonoff S31 | Sonoff S31 Wifi Smart Socket with Energy Monitoring +42 Zengge WF017 | Zengge WF017 Wifi RGB(W) Led Controller +43 Sonoff Pow R2 | Sonoff Pow R2 Wifi Smart Switch with Energy Monitoring +44 Sonoff iFan02 | Sonoff iFan02 Wifi Smart Ceiling Fan with Light +45 BlitzWolf SHP | BlitzWolf BW-SHP2, BW-SHP6, HomeCube SP1, Gosund SP111, Teckin SP22 Wifi Smart Switch with Energy Monitoring +46 Shelly 1 | Shelly 1 Open Source Wifi Relay Module +47 Shelly 2 | Shelly 2 Wifi 2-gang Relay Module with Energy Monitoring +48 Xiaomi Philips | Xiaomi Philips Wifi WW Led Bulb +49 Neo Coolcam | Neo Coolcam Wifi Smart Socket +50 ESP Switch | ESP Switch 4-gang Wifi Switch with Leds +51 OBI Socket | OBI Wifi Smart Socket +52 Teckin | Teckin SP22 Wifi Smart Switch with Energy Monitoring +53 AplicWDP303075 | Aplic WDP 303075 CSL Wifi Smart Switch with Energy Monitoring +54 TuyaMCU | Devices with an MCU using Tuya communication protocol for control +55 Gosund SP1 v23 | Gosund SP1 v2.3 Wifi Smart Switch with Energy Monitoring +56 ARMTR Dimmer | ARMtronix Wifi dimmer for Incandescent Lights and Led +57 SK03 Outdoor | SK03 Outdoor Wifi Smart Switch with Energy Monitoring +58 PS-16-DZ | PS-16-DZ Wifi dimmer for Incandescent Lights and Led +59 Teckin US | Teckin SP20 and ZooZee SA102 Wifi Smart Switch with Energy Monitoring +60 Manzoku strip | Manzoku Wifi Smart Power Strip with four Relays +61 OBI Socket 2 | OBI 2 Wifi Smart Socket +62 YTF IR Bridge | YTF Universal IR Bridge +63 Digoo DG-SP202 | Digoo DG-SP202 Dual Wifi Smart Switch with Energy Monitoring +64 KA10 | Smanergy KA10 Wifi Smart Wall Switch with Energy Monitoring +65 Luminea ZX2820 | Luminea ZX2820 Wifi Smart Switch with Energy Monitoring +66 Mi Desk Lamp | Mi Desk Lamp with rotary switch and Wifi +67 SP10 | Tuya SP10 Wifi Smart Switch with Energy Monitoring +68 WAGA CHCZ02MB | WAGA life CHCZ02MB Wifi Smart Switch with Energy Monitoring +69 SYF05 | Sunyesmart SYF05 RGBWW Wifi Led Bulb +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 +75 Sonoff ZbBridge | Sonoff Zigbee bridge -Over 1000 additional devices are supported using [templates](TEMPLATES.md). +Over 1400 additional devices are supported using [templates](TEMPLATES.md). diff --git a/README.md b/README.md index 19fbff041..0bdf2a9e9 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ _Written for PlatformIO with limited support for Arduino IDE._ [![GitHub download](https://img.shields.io/github/downloads/arendst/Tasmota/total.svg)](https://github.com/arendst/Tasmota/releases/latest) [![License](https://img.shields.io/github/license/arendst/Tasmota.svg)](LICENSE.txt) [![Chat](https://img.shields.io/discord/479389167382691863.svg)](https://discord.gg/Ks2Kzd4) +[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/arendst/Tasmota.svg)](http://isitmaintained.com/project/arendst/Tasmota "Average time to resolve an issue") +[![Percentage of issues still open](http://isitmaintained.com/badge/open/arendst/Tasmota.svg)](http://isitmaintained.com/project/arendst/Tasmota "Percentage of issues still open") If you like **Tasmota**, give it a star, or fork it and contribute! @@ -20,7 +22,7 @@ In addition to the [release webpage](https://github.com/arendst/Tasmota/releases ## Development -[![Dev Version](https://img.shields.io/badge/development%20version-v8.3.x.x-blue.svg)](https://github.com/arendst/Tasmota) +[![Dev Version](https://img.shields.io/badge/development%20version-v8.4.x.x-blue.svg)](https://github.com/arendst/Tasmota) [![Download Dev](https://img.shields.io/badge/download-development-yellow.svg)](http://thehackbox.org/tasmota/) [![Tasmota CI](https://github.com/arendst/Tasmota/workflows/Tasmota%20CI/badge.svg)](https://github.com/arendst/Tasmota/actions?query=workflow%3A%22Tasmota+CI%22) [![Tasmota ESP32 CI](https://github.com/arendst/Tasmota/workflows/Tasmota%20ESP32%20CI/badge.svg)](https://github.com/arendst/Tasmota/actions?query=workflow%3A%22Tasmota+ESP32+CI%22) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5e5e3e549..1bfd9e2d3 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -21,9 +21,9 @@ While fallback or downgrading is common practice it was never supported due to S ## Supported Core versions -This release will be supported from ESP8266/Arduino library Core version **2.7.2** due to reported security and stability issues on previous Core version. This will also support gzipped binaries. +This release will be supported from ESP8266/Arduino library Core version **2.7.2.1** 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. +Support of Core versions before 2.7.1 has been removed. ## Support of TLS @@ -35,7 +35,7 @@ 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.7.2**. +The following binary downloads have been compiled with ESP8266/Arduino library core version **2.7.2.1**. - **tasmota.bin** = The Tasmota version with most drivers. **RECOMMENDED RELEASE BINARY** - **tasmota-BG.bin** to **tasmota-TW.bin** = The Tasmota version in different languages. @@ -44,6 +44,7 @@ The following binary downloads have been compiled with ESP8266/Arduino library c - **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. - **tasmota-display.bin** = The Display version without Energy Monitoring but adds display support. +- **tasmota-zbbridge.bin** = The dedicated Sonoff Zigbee Bridge version. - **tasmota-minimal.bin** = The Minimal version allows intermediate OTA uploads to support larger versions and does NOT change any persistent parameter. This version **should NOT be used for initial installation**. [List](MODULES.md) of embedded modules. @@ -52,51 +53,8 @@ The following binary downloads have been compiled with ESP8266/Arduino library c ## Changelog -### Version 8.3.1.7 +### Version 8.4.0.1 -- Remove Arduino ESP8266 Core support for versions before 2.7.1 -- Change to limited support of Arduino IDE as an increasing amount of features cannot be compiled with Arduino IDE -- Change IRremoteESP8266 library from v2.7.6 to v2.7.8 -- Change Adafruit_SGP30 library from v1.0.3 to v1.2.0 (#8519) -- Change Energy JSON Total field from ``"Total":[33.736,11.717,16.978]`` to ``"Total":33.736,"TotalTariff":[11.717,16.978]`` -- Change Energy JSON ExportActive field from ``"ExportActive":[33.736,11.717,16.978]`` to ``"ExportActive":33.736,"ExportTariff":[11.717,16.978]`` -- Change ESP32 USER GPIO template representation decreasing template message size -- Change define USE_TASMOTA_SLAVE into USE_TASMOTA_CLIENT -- Change commands ``SlaveSend`` and ``SlaveReset`` into ``ClientSend`` and ``ClientReset`` -- Fix escape of non-JSON received serial data (#8329) -- Fix exception or watchdog on rule re-entry (#8757) -- Add command ``Rule0`` to change global rule parameters -- Add command ``Time 4`` to display timestamp using milliseconds (#8537) -- Add command ``SetOption94 0/1`` to select MAX31855 or MAX6675 thermocouple support (#8616) -- Add command ``SetOption97 0/1`` to switch between Tuya serial speeds 9600 bps (0) or 115200 bps (1) -- Add command ``SetOption98 0/1`` to provide rotary rule triggers (1) instead of controlling light (0) -- Add command ``SetOption99 0/1`` to enable zero cross detection on PWM dimmer -- Add command ``SetOption100 0/1`` to remove ``ZbReceived`` value from ``{"ZbReceived":{xxx:yyy}}`` JSON message -- Add command ``Module2`` to configure fallback module on fast reboot (#8464) -- Add commands ``LedPwmOn 0..255``, ``LedPwmOff 0..255`` and ``LedPwmMode1 0/1`` to control led brightness by George (#8491) -- Add ESP32 ethernet commands ``EthType 0/1``, ``EthAddress 0..31`` and ``EthClockMode 0..3`` -- Add rule trigger ``System#Init`` to allow early rule execution without wifi and mqtt initialized yet -- Add support for unique MQTTClient (and inherited fallback topic) by full Mac address using ``mqttclient DVES_%12X`` (#8300) -- Add more functionality to ``Switchmode`` 11 and 12 (#8450) -- Add wildcard pattern ``?`` for JSON matching in rules -- Add support for VEML6075 UVA/UVB/UVINDEX Sensor by device111 (#8432) -- Add support for VEML7700 Ambient light intensity Sensor by device111 (#8432) -- Add Three Phase Export Active Energy to SDM630 driver -- Add Zigbee options to ``ZbSend`` to write and report attributes -- Add Zigbee auto-responder for common attributes -- Add ``CpuFrequency`` to ``status 2`` -- Add ``FlashFrequency`` to ``status 4`` -- Add support for up to two BH1750 sensors controlled by commands ``BH1750Resolution`` and ``BH1750MTime`` (#8139) -- Add support for up to eight MCP9808 temperature sensors by device111 (#8594) -- Add support for BL0940 energy monitor as used in Blitzwolf BW-SHP10 (#8175) -- Add support for Telegram bot (#8619) -- Add support for HP303B Temperature and Pressure sensor by Robert Jaakke (#8638) -- Add support for Energy sensor (Denky) for French Smart Metering meter provided by global Energy Providers, need a adaptater. See dedicated full [blog](http://hallard.me/category/tinfo/) about French teleinformation stuff -- Add Library to be used for decoding Teleinfo (French Metering Smart Meter) -- Add support for ESP32 ethernet adding commands ``Wifi 0/1`` and ``Ethernet 0/1`` both default ON -- Add support for single wire LMT01 temperature Sensor by justifiably (#8713) -- Add compile time interlock parameters (#8759) -- Add compile time user template (#8766) -- Add rotary encoder support for light dimmer and optional color temperature if button1 still pressed (#8670) -- Add support for switches/relays using an AC detection circuitry e.g. MOES MS-104B or BlitzWolf SS5 (#8606) -- Add support for Schneider Electric iEM3000 series Modbus energy meter by Marius Bezuidenhout +- Fix ESP32 PWM range +- Add Zigbee better support for IKEA Motion Sensor +- Add ESP32 Analog input support for GPIO32 to GPIO39 diff --git a/TEMPLATES.md b/TEMPLATES.md index d39a55b92..ff354aab7 100644 --- a/TEMPLATES.md +++ b/TEMPLATES.md @@ -42,9 +42,11 @@ BrilliantSmart 20696 9W 900lm {"NAME":"Brilliant20696","GPIO":[0,0,0,0,0,0,0,0, BrilliantSmart 20697 9W 900lm {"NAME":"Brilliant20696","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18} 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} Bulbrite Solana G25 5.5W 600lm Filament {"NAME":"BulbBrite01","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18} +Bulbrite Solana ST18 16W 140lm Filament {"NAME":"BulbBrite02","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18} Calex G125 7,5W 1055lm {"NAME":"Calex G125 E27","GPIO":[0,0,0,0,0,140,0,0,38,0,37,142,141],"FLAG":0,"BASE":18} Calex G125 7.5W 1055lm Globe {"NAME":"Calex G125 E27","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18} Connect Smart GU5.3 5W {"NAME":"Connect CSH-GU53WW5W","GPIO":[0,0,0,0,37,38,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +Connect SmartHome 10W 900lm {"NAME":"Connect CCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":48} Deltaco SH-LE14W 470lm {"NAME":"SH-LE14W","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18} Deltaco SH-LE27W 810lm {"NAME":"SH-LE27W","GPIO":[0,0,0,0,0,0,0,0,38,0,37,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} @@ -58,8 +60,10 @@ Hama 806lm {"NAME":"Hama 00176550","GPIO":[0,0,0,0,0,37,0,0,0,38,0 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 10W CCT","GPIO":[0,0,0,0,0,37,0,0,0,47,0,0,0],"FLAG":0,"BASE":48} -Kogan 4.5W 330lm CCT {"NAME":"Kogan White/Wa","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18} +Kogan 4.5W 330lm 110C {"NAME":"Kogan White/Wa","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18} Kogan 5W {"NAME":"Kogan Co/Wa","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18} +Laser 10W 1000lm {"NAME":"Laser 10W CCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":48} +Laser 10W 1000lm {"NAME":"Laster 10W CCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":48} LE lampUX 380lm Candle {"NAME":"LE Bulb","GPIO":[0,0,0,0,0,0,0,0,38,0,37,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} @@ -70,7 +74,7 @@ Lumiman A19 7.5W 800lm {"NAME":"Lumiman LM520","GPIO":[0,0,0,0,0,37,0,0,38,0,0 Luminea ZX-2831 {"NAME":"Luminea CCT","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18} LVWIT A60 6.5W 806lm Filament {"NAME":"LVWIT-E27-WiFi-6.5","GPIO":[0,0,0,0,0,0,0,0,38,0,37,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} +Mimoodz A21 10.5W 1050lm {"NAME":"Mimoodz","GPIO":[0,0,0,0,21,22,0,0,23,24,25,26,27],"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 9W 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} @@ -82,11 +86,12 @@ Nedis A60 800lm {"NAME":"WIFILW10WTE27","GPIO":[0,0,0,0,0,37,0,0,38,0,0 Nedis C10 350lm {"NAME":"WIFILW10WTE14","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18} Nedis G125 5.5W 350lm Twisted Filament {"NAME":"WIFILF10GDG125","GPIO":[0,0,0,0,0,0,0,0,38,0,37,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} -Nedis PAR16 4.5W 330lm {"NAME":"WIFILW30","GPIO":[0,0,0,0,0,37,0,0,38,0,0,0,0],"FLAG":0,"BASE":18} +Nedis PAR16 4.5W 330lm 110C {"NAME":"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} SmartDGM L-WT9W1 9W 800lm {"NAME":"L-WT9W1","GPIO":[0,0,0,0,0,37,0,0,9,38,0,0,0],"FLAG":0,"BASE":18} Swisstone SH 330 806lm {"NAME":"SwisstoneSH330","GPIO":[0,0,0,0,140,37,0,0,38,142,141,0,0],"FLAG":0,"BASE":18} +V-Tac PAR16 4.5W 300lm 110C {"NAME":"V-TAC VT-5174","GPIO":[0,0,0,0,0,0,0,0,38,0,37,0,0],"FLAG":0,"BASE":18} Vestaiot BR30 800lm {"NAME":"Vesta BR30 CCT","GPIO":[0,0,0,0,0,37,0,0,0,38,0,0,0],"FLAG":0,"BASE":18} Wipro Garnet NS9100 810lm {"NAME":"WiproSmartBulb","GPIO":[0,0,0,0,38,0,0,0,37,0,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,38,0,0],"FLAG":0,"BASE":48} @@ -108,6 +113,7 @@ Teekar SYS-CS 01 {"NAME":"Teekar-Tag","GPIO":[56,0,157,18,22,11,0,0,0,21 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} +Zemismart {"NAME":"Zemismart","GPIO":[157,0,0,11,54,10,0,0,9,21,23,22,0],"FLAG":0,"BASE":18} ``` ## DIY @@ -195,7 +201,7 @@ EX-Store 2 Kanal RS232 V4 {"NAME":"EXS Dimmer","GPIO":[0,148,0,149,0,0,0,0,0,18 Feit Electric DIM/WIFI {"NAME":"Generic","GPIO":[255,107,255,108,255,255,0,0,255,0,255,0,255],"FLAG":0,"BASE":54} Gosund SW2 {"NAME":"Gosund Dimmer","GPIO":[255,148,255,149,17,0,255,255,56,158,37,255,255],"FLAG":0,"BASE":18} iSwitch Touch Switch {"NAME":"iSwitchOZ Dimmer","GPIO":[0,0,0,0,0,0,0,0,0,0,54,0,0],"FLAG":0,"BASE":54} -Martin Jerry MJ-SD01 {"NAME":"MJ-SD02","GPIO":[19,18,0,59,158,58,0,0,57,37,56,122,29],"FLAG":0,"BASE":73} +Martin Jerry SD01 {"NAME":"MJ-SD02","GPIO":[19,18,0,59,158,58,0,0,57,37,56,122,29],"FLAG":0,"BASE":73} 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} @@ -204,6 +210,7 @@ RJWF-02A {"NAME":"RJWF-02A","GPIO":[17,107,0,108,0,0,0,0,0,0,52, 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} Tessan MJ-SD02 {"NAME":"MJ-SD02","GPIO":[19,18,0,59,158,58,0,0,57,37,56,122,29],"FLAG":0,"BASE":73} +TopGreener TGWF500D {"NAME":"TopGreener-Dimmer","GPIO":[0,0,0,0,0,0,0,0,0,108,0,107,0],"FLAG":0,"BASE":54} 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} @@ -223,6 +230,7 @@ Sichler Haushaltsgeraete Column {"NAME":"Sichler Fan","GPIO":[0,107,0,108,0,0,0 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} Technical Pro FXA16 {"NAME":"FXA16 Fan","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} +Zemismart Bladeless {"NAME":"Bladeless Fan","GPIO":[255,107,255,108,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54} ``` ## IR Bridge @@ -264,10 +272,12 @@ Arilux AL-LC11 {"NAME":"Arilux LC11","GPIO":[17,0,59,0,38,37,0,0,41,40 Arilux SL-LC 03 {"NAME":"Arilux LC03","GPIO":[0,0,0,0,51,38,0,0,37,39,0,40,0],"FLAG":0,"BASE":34} 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} CIN-03 96W RGB {"NAME":"CIN03-03 Strip","GPIO":[0,0,0,0,38,0,0,0,37,0,39,0,0],"FLAG":0,"BASE":18} +DD001-MINI(G)-IR-V03 {"NAME":"WIFI-RGB","GPIO":[17,0,0,0,0,0,0,0,38,39,37,0,0],"FLAG":0,"BASE":40} 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} Jinvoo SM-WA104 RGB {"NAME":"Jinvoo LED Controller","GPIO":[0,0,0,0,29,39,0,0,37,17,38,0,30],"FLAG":0,"BASE":18} +Konesky 12V RGB {"NAME":"RGBwifi","GPIO":[0,0,0,0,37,0,0,0,38,56,39,0,0],"FLAG":0,"BASE":18} 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} @@ -298,6 +308,7 @@ Cocoon Smart {"NAME":"Cocoon Smart","GPIO":[17,0,0,0,37,0,0,0,38,0,3 Deltaco 3m RGBCCT {"NAME":"Deltaco Led Strip","GPIO":[0,0,0,0,37,17,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} electriQ 3m RGBCCT {"NAME":"ElectricQ wifiRGBWLEDSTR","GPIO":[0,0,0,0,37,41,0,0,38,40,39,0,0],"FLAG":0,"BASE":18} Elfeland 10m RGB {"NAME":"Elfeland RGB","GPIO":[0,0,0,0,0,38,0,0,39,51,0,37,0],"FLAG":0,"BASE":18} +Geeni Prisma Plus {"NAME":"Geeni Prisma Plus Strip","GPIO":[17,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} Gosund 2.8m RGB {"NAME":"Gosund LED Strip","GPIO":[17,0,0,0,0,0,0,0,37,39,38,0,0],"FLAG":3,"BASE":18} HitLights L1012V-MC1 {"NAME":"HitLights RBG","GPIO":[17,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} HomeMate 10m RGB {"NAME":"Homemate Strip","GPIO":[0,0,0,0,0,37,0,0,39,17,38,0,0],"FLAG":0,"BASE":18} @@ -371,6 +382,7 @@ Mirabella Genio I002742 {"NAME":"GenioDLightCCT","GPIO":[0,0,0,0,0,0,0,0,38,0,3 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} Moes 7W RGBCCT Downlight {"NAME":"Moes Downlight","GPIO":[0,0,0,0,40,41,0,0,37,38,39,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} +Reafoo A27 9W 810lm {"NAME":"ReaFooE27","GPIO":[0,0,0,0,41,40,0,0,37,0,39,38,0],"FLAG":0,"BASE":18} SMRTLite LED Panel {"NAME":"SMRTLite","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} @@ -425,6 +437,7 @@ HA109US {"NAME":"HA109US","GPIO":[17,0,0,0,52,53,0,0,21,0,22,0, 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} Kogan Energy Meter IP44 {"NAME":"Kogan Smart Sw IP44","GPIO":[17,0,0,0,133,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18} +Koolertron {"NAME":"C168 Outdoor","GPIO":[0,17,0,56,134,132,0,0,21,131,22,23,0],"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} @@ -479,6 +492,7 @@ Anoopsyche AWP08L {"NAME":"AWP08L-Annopsy","GPIO":[0,0,0,0,17,56,0,0,21,0 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} +AOFO 10A {"NAME":"AOFO Smart Plug Wifi","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18} 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} @@ -511,7 +525,7 @@ Avatar AWP14H {"NAME":"Avatar UK 10A","GPIO":[0,0,56,0,0,134,0,0,131, 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} -Avatto OT08 {"NAME":"Avatto OT08","GPIO":[37,0,39,0,38,134,0,0,130,17,132,21,0],"FLAG":0,"BASE":18} +Avatto OT08 {"NAME":"Avatto OT08","GPIO":[37,0,39,0,38,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":18} Awow EU3S {"NAME":"AWOW BSD33","GPIO":[0,0,56,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":18} Awow X5P {"NAME":"Awow","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18} AWP02L-N {"NAME":"AWP02L-N","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18} @@ -532,7 +546,7 @@ BlitzWolf BW-SHP6 10A {"NAME":"BW-SHP6 10A","GPIO":[158,255,56,255,0,134,0,0, 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} -BNETA IoT {"NAME":"BNETA WifiPlug","GPIO":[17,0,0,0,133,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":18} +BNETA IO-WIFI-PlugSA {"NAME":"BNETA WifiPlug","GPIO":[17,0,0,0,133,132,0,0,131,56,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} Bright {"NAME":"Bright Wi-Fi Smart Plug","GPIO":[0,0,0,0,56,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":18} Brilliant HK17654S05 {"NAME":"HK17654S05","GPIO":[17,255,255,255,133,132,255,255,131,56,21,255,255],"FLAG":0,"BASE":18} @@ -559,6 +573,7 @@ Coosa {"NAME":"COOSA","GPIO":[0,0,0,0,57,52,0,0,21,17,255,0,0 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} +D3D Smart Plug with USB & Power Monitor {"NAME":"D3D d_SUM","GPIO":[57,255,56,255,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45} 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} @@ -651,6 +666,7 @@ iClever IC-BS08 {"NAME":"iClever BS08","GPIO":[0,0,0,0,157,56,0,0,21,17 iDIGITAL {"NAME":"Brilliant","GPIO":[0,0,0,0,52,0,0,0,21,90,0,0,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} Infray 16A {"NAME":"AWP08L","GPIO":[17,0,52,0,0,0,0,0,0,0,0,21,0],"FLAG":1,"BASE":18} +Insmart WP5 {"NAME":"INSMART","GPIO":[0,0,46,0,0,0,0,0,0,9,0,21,0],"FLAG":0,"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} @@ -658,6 +674,7 @@ Jinli XS-SSA01 {"NAME":"JINLI","GPIO":[0,0,0,0,0,0,0,0,56,17,0,21,0]," 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 SH0617 {"NAME":"Jomarto SH0617","GPIO":[57,0,56,0,0,0,0,0,0,17,0,21,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-SM200 V1.3 {"NAME":"NX-SM200","GPIO":[52,0,0,131,0,134,0,0,0,17,132,21,0],"FLAG":1,"BASE":45} @@ -710,6 +727,7 @@ Merkury MI-WW105-199W {"NAME":"Merkury Switch","GPIO":[255,255,255,255,158,56 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} Mirabella Genio USB {"NAME":"Mirabella Genio 1002826","GPIO":[0,0,0,17,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":1} +Mirabella Genio USB Port and Plug {"NAME":"Genio I002341","GPIO":[0,0,0,0,56,0,0,0,21,17,0,0,0],"FLAG":0,"BASE":1} Mistral {"NAME":"Mistral Smart ","GPIO":[56,0,0,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":18} 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 W-DE004S {"NAME":"Moes DE004S ","GPIO":[57,0,0,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":18} @@ -722,6 +740,7 @@ Nedis P130 {"NAME":"WIFIP130FWT","GPIO":[0,0,0,0,56,57,0,0,21,17,0 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} NEO Coolcam NAS-WR01W 16A {"NAME":"Neo Coolcam 16","GPIO":[17,0,0,0,134,132,0,0,131,56,21,0,0],"FLAG":0,"BASE":49} NETVIP XS-SSA01 {"NAME":"XS-SSA01","GPIO":[0,0,0,0,0,0,0,0,56,17,0,21,0],"FLAG":0,"BASE":18} +Nightlight and AC Outlet {"NAME":"SWN03","GPIO":[17,0,0,0,0,0,255,255,37,0,0,21,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} @@ -751,10 +770,12 @@ Prime CCRCWFII113PK {"NAME":"Prime","GPIO":[0,0,0,0,57,56,0,0,21,122,0,0,0] Prime RCWFII11 {"NAME":"Prime Plug","GPIO":[0,0,0,0,56,0,0,0,21,0,17,0,0],"FLAG":0,"BASE":18} PrimeCables Cab-LA-WF4 {"NAME":"Mini Smart Outlet Wifi Socket with Timer Function","GPIO":[0,0,0,56,57,0,0,0,0,0,0,21,17],"FLAG":0,"BASE":18} qnect 16A {"NAME":"QNECT QN-WP01E","GPIO":[0,0,0,17,133,132,0,0,131,52,21,0,0],"FLAG":0,"BASE":18} +Qualitel Mini {"NAME":"Qualitel HG01WT","GPIO":[56,0,57,0,0,133,0,0,131,17,132,21,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} Robaxo {"NAME":"Robaxo RSP-025","GPIO":[17,0,0,0,134,132,0,0,131,56,21,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} S126 {"NAME":"tuya-plug","GPIO":[0,0,0,0,0,0,0,0,21,20,0,0,0],"FLAG":0,"BASE":8} +Sansui {"NAME":"Sansui YSP-1","GPIO":[52,0,53,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"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} Silvergear Slimme Stekker {"NAME":"Silvergear SmartHomePlug","GPIO":[0,0,0,122,0,0,0,0,0,56,21,0,0],"FLAG":0,"BASE":18} SimpleHome {"NAME":"SimpleHome","GPIO":[53,0,0,0,0,0,0,0,21,56,17,0,0],"FLAG":0,"BASE":1} @@ -800,6 +821,7 @@ Teckin SP22 {"NAME":"Teckin","GPIO":[0,17,0,57,134,132,0,0,131,56,2 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} +Tellur 16A 2 Ports {"NAME":"Tellur WiFi Smart Socket","GPIO":[18,0,0,131,134,132,0,0,157,21,22,0,17],"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 C338 {"NAME":"C338","GPIO":[17,0,255,0,0,0,0,0,21,52,255,0,0],"FLAG":0,"BASE":1} @@ -828,6 +850,7 @@ WAZA 10A {"NAME":"WAZA","GPIO":[0,0,0,0,21,17,0,0,56,0,0,0,0],"F 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} +Wily Electronics {"NAME":"VC Plug","GPIO":[157,0,0,0,0,134,0,0,131,17,132,21,0],"FLAG":0,"BASE":45} 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":[0,0,0,157,22,21,0,0,56,17,57,0,0],"FLAG":0,"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} @@ -870,7 +893,7 @@ ZSP-001 {"NAME":"ZSP-001","GPIO":[17,255,255,255,133,132,0,0,13 ``` A0F0 ZLD-44EU-W {"NAME":"AOFO-4AC-4USB","GPIO":[0,56,0,17,22,21,0,0,23,24,33,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} -AHRise 4+4AC+4USB {"NAME":"AHRise-083","GPIO":[0,0,0,0,52,17,0,0,22,21,23,24,0],"FLAG":0,"BASE":18} +AHRise 4+4AC+4USB {"NAME":"AHRise-083","GPIO":[0,0,0,0,56,17,0,0,22,21,23,24,0],"FLAG":0,"BASE":18} AHRise AHR-085 {"NAME":"AHRise AHR-085","GPIO":[0,0,0,0,17,56,0,0,22,23,21,0,0],"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} @@ -902,6 +925,7 @@ Hyleton 330 {"NAME":"Hyleton-330","GPIO":[57,0,0,56,29,17,0,0,31,30 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} +Jinvoo 4AC+2USB {"NAME":"JINVOO Model SM-SO306-2A","GPIO":[56,0,0,0,32,17,0,0,30,31,29,0,25],"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} Konesky Type 1 {"NAME":"Konesky","GPIO":[0,0,0,0,25,22,0,0,24,17,23,21,0],"FLAG":0,"BASE":18} @@ -1009,6 +1033,7 @@ Globe A19 10W 800lm {"NAME":"GlobeRGBWW","GPIO":[0,0,0,0,37,40,0,0,38,41,39 Helloify BR30 9W 600lm {"NAME":"Helloify","GPIO":[255,255,255,255,37,40,255,255,38,41,39,255,255],"FLAG":0,"BASE":18} HIPER IoT A61 {"NAME":"HIPER IoT A61","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} HIPER IoT C1 {"NAME":"Hiper IoT C1 RGB","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18} +Holdpeak BR40 12W 1100lm {"NAME":"HP-BR40-12W","GPIO":[0,0,0,0,140,37,0,0,38,0,141,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} 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} @@ -1042,10 +1067,12 @@ LVWIT A70 12W 1521lm {"NAME":"LVWIT A70 12W","GPIO":[0,0,0,0,37,40,0,0,38,50 LVWIT BR30 8.5W 650lm {"NAME":"LVWIT BR30 8.5W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} LVWIT G45 5W 470Lm {"NAME":"LVWIT E14 5W G45 RGBWCCT","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18} MagicHome 7W {"NAME":"MagicHome E27","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} +Moes 9W 800lm {"NAME":"Moes 9w","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} Nishica JBT 9W 806lm {"NAME":"Nishica","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18} +Novostella 7W 600lm {"NAME":"Novostella E27","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} +Novostella 7W 600lm {"NAME":"Novostella B22","GPIO":[0,0,0,0,37,41,0,0,38,40,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 UT55507 9W 900lm {"NAME":"Novostella UT55507","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} Novostella UT55507 9W 900lm {"NAME":"Novostella UT55507","GPIO":[0,0,0,0,37,40,0,0,38,41,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} @@ -1074,7 +1101,7 @@ Techlux A19 9W 806lm {"NAME":"TECHLUX A19 RGBCW 806lm 9w","GPIO":[0,0,0,0,37 Teckin SB50 v3 A19 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} Treatlife A19 8W 650lm {"NAME":"Treatlife RGBW","GPIO":[0,0,0,0,38,37,0,0,41,39,40,0,0],"FLAG":0,"BASE":18} -V-Tac PAR16 4.5W 400lm {"NAME":"V-TAC VT5164","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18} +V-Tac PAR16 4.5W 400lm 100C {"NAME":"V-TAC VT5164","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18} Vizia 5W GU10 {"NAME":"Vizia RGBWW","GPIO":[0,0,0,0,40,41,0,0,38,39,37,0,0],"FLAG":15,"BASE":18} Wipro Garnet 9W 810lm {"NAME":"Wipro","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} Zemismart 5W 480lm {"NAME":"Zemismart 5W","GPIO":[0,0,0,0,37,40,0,0,38,41,39,0,0],"FLAG":0,"BASE":18} @@ -1173,6 +1200,7 @@ Merkury MI-BW904-999W 1050lm {"NAME":"MI-BW904-999W","GPIO":[0,0,0,0,140,37,0,0 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} +Mimoodz A19 6.5W {"NAME":"Miimoodz RGBCW LED","GPIO":[0,0,0,0,180,0,0,0,0,0,181,0,0],"FLAG":0,"BASE":18} Mirabella Genio 9W 800lm {"NAME":"GenioBulbRGB","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} Mirabella Genio 9W 800lm {"NAME":"GenioBulbRGB","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0],"FLAG":0,"BASE":18} Mirabella Genio 9W 800lm {"NAME":"MiraBellaGenio","GPIO":[0,0,0,0,0,0,0,0,181,0,180,0,0],"FLAG":0,"BASE":18} @@ -1203,6 +1231,7 @@ Swisstone SH 320 350lm {"NAME":"SH 320","GPIO":[0,0,0,0,37,40,0,0,38,0,39,0,0] 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 7.5W 800lm {"NAME":"Teckin SB60","GPIO":[0,0,0,0,37,40,0,0,38,0,39,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} @@ -1228,8 +1257,9 @@ Zilotek A19 800lm {"NAME":"Zilotek RGBW","GPIO":[0,0,0,0,140,37,0,0,38,14 Anmbest 2 Channel Inching Self-locking Switch Module {"NAME":"Generic","GPIO":[17,255,255,255,255,22,18,0,21,56,0,0,0],"FLAG":0,"BASE":1} ATMS1601 230VAC DIN Timer/Switch {"NAME":"ATMS1601","GPIO":[255,255,255,255,157,56,255,255,21,17,255,255,255],"FLAG":15,"BASE":18} BlitzWolf BW-SS1 {"NAME":"BW-SS1","GPIO":[255,255,255,255,157,21,0,0,255,17,255,255,0],"FLAG":0,"BASE":18} +BlitzWolf BW-SS5 1 Gang {"NAME":"BlitzWolf SS5 1 Gang","GPIO":[0,0,0,0,0,0,0,0,9,21,0,0,0],"FLAG":0,"BASE":18} BlitzWolf BW-SS5 2 Gang {"NAME":"BlitzWolf SS5 2 Gang","GPIO":[0,0,0,0,160,0,0,0,43,42,21,22,0],"FLAG":0,"BASE":18} -BlitzWolf SS4 Two Gang {"NAME":"BlitzWolf SS4","GPIO":[0,0,0,0,56,21,0,0,22,17,0,0,0],"FLAG":0,"BASE":18} +BlitzWolf SS4 {"NAME":"BlitzWolf SS4 Two Gang","GPIO":[0,0,0,0,56,21,0,0,22,17,0,0,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} @@ -1314,6 +1344,7 @@ Lenovo Rechargable PIR Motion {"NAME":"Lenovo PIR","GPIO":[255,107,255,108,255, Mirabella Genio I002576 Motion {"NAME":"GenioPir","GPIO":[17,107,0,108,0,0,0,0,0,56,0,0,0],"FLAG":0,"BASE":54} Natural Gas (CH4) Alarm {"NAME":"PA-210WYS","GPIO":[255,107,255,108,255,255,0,0,255,255,255,255,255],"FLAG":0,"BASE":54} Nedis Smoke Detector {"NAME":"Nedis Smoke","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} +Shelly i3 Action and Scenes Activation Device {"NAME":"Shelly i3","GPIO":[0,0,0,0,0,0,0,0,83,84,82,0,0],"FLAG":0,"BASE":18} Shelly Temperature Sensor Add-on {"NAME":"Shelly 1 Temp ","GPIO":[192,0,0,4,21,82,0,0,0,0,0,0,0],"FLAG":0,"BASE":46} Smoke Alarm {"NAME":"YG400A","GPIO":[255,107,255,108,255,255,0,0,255,255,255,255,255],"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} @@ -1324,6 +1355,7 @@ Zemismart Door Window {"NAME":"Zemismart","GPIO":[255,107,255,108,255,255,0,0 ## 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} +AGL 3 Gang {"NAME":"AGL WiFi 03","GPIO":[0,0,56,0,19,18,0,0,22,21,23,0,17],"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} Avatto 2 Gang {"NAME":"Avatto Wifi - ","GPIO":[0,0,52,0,0,17,0,0,21,22,0,0,18],"FLAG":0,"BASE":18} Avatto Fan Light {"NAME":"AVATTO Smart Wifi Fan Light","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} @@ -1365,6 +1397,7 @@ Girier JRSWR-US01 No Neutral 3 Gang {"NAME":"Girier JRSWR-U","GPIO":[0,0,0,0,21 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,0,56,0,0,0,0,0,0,0,21,0,158],"FLAG":0,"BASE":18} Gosund SW1 {"NAME":"Gosund SW1","GPIO":[17,0,57,0,0,0,0,0,0,0,21,0,56],"FLAG":0,"BASE":18} +Gosund SW6 3-Way {"NAME":"Gosund SW6","GPIO":[17,0,56,0,9,0,0,0,0,0,22,21,158],"FLAG":0,"BASE":18} Hama Flush-mounted {"NAME":"Hama WiFiTouch","GPIO":[157,0,0,0,0,18,0,0,17,22,0,21,0],"FLAG":0,"BASE":45} HBN Wall-Mounted Timer {"NAME":"HBN Timer Switch","GPIO":[0,0,0,0,54,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18} Innens 1 Gang 1 Way {"NAME":"Innens 1 Gang 1 Way","GPIO":[0,0,0,17,21,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":18} @@ -1400,8 +1433,7 @@ LX-WIFI-00M 4 Gang {"NAME":"LX-WIFI-00M","GPIO":[17,25,255,255,23,22,18,19 MakeGood 2 Gang {"NAME":"MakeGood 2 Gang","GPIO":[0,0,0,0,0,0,0,0,0,0,54,0,0],"FLAG":0,"BASE":54} MakeGood 4 Gang {"NAME":"MakeGood 4 Gang","GPIO":[0,0,0,0,0,0,0,0,0,0,54,0,0],"FLAG":0,"BASE":54} 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 3 Way {"NAME":"MJ 3Way Switch","GPIO":[0,0,0,0,52,53,0,0,21,9,157,0,0],"FLAG":0,"BASE":18} -Martin Jerry MJ-S01 15A {"NAME":"MJ Switch","GPIO":[0,0,0,0,56,57,0,0,21,17,0,0,0],"FLAG":0,"BASE":18} +Martin Jerry S01 15A {"NAME":"MJ-S01 Switch","GPIO":[0,0,0,0,56,57,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} @@ -1434,6 +1466,9 @@ NaamaSmart KS602 {"NAME":"KS-602","GPIO":[17,0,0,0,0,0,0,0,21,158,0,0,0] Nedis Dual {"NAME":"SM-SW102U-2","GPIO":[158,0,0,18,22,0,0,0,17,21,0,0,0],"FLAG":1,"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} +Qualitel 1 Gang {"NAME":"Qualitel 1 Gang","GPIO":[157,0,0,9,21,0,0,0,0,0,52,0,0],"FLAG":0,"BASE":18} +Qualitel 2-Gang {"NAME":"Qualitel 2 Gang","GPIO":[157,0,53,0,0,10,0,0,9,21,0,22,52],"FLAG":0,"BASE":18} +Qualitel 3 Gang {"NAME":"Qualitel 3 Gang","GPIO":[157,0,54,10,22,11,0,0,9,21,53,23,52],"FLAG":0,"BASE":18} RY-RSM104 Light Touch {"NAME":"RY-RSM104","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Sainko 1-Way {"NAME":"SAINKO 1CH","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":28} Sainko 2 Way {"NAME":"Sainko 2-Way","GPIO":[0,255,56,0,0,17,0,0,21,22,0,0,18],"FLAG":0,"BASE":18} @@ -1474,6 +1509,7 @@ Teekar 10 Way 1 Gang {"NAME":"Teekar 10way","GPIO":[9,10,11,20,13,14,0,0,15, 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} +TopGreener TGWF15S {"NAME":"TopGreener-Switch","GPIO":[0,0,0,0,0,0,0,0,0,108,0,107,0],"FLAG":0,"BASE":54} 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} Touch 3 Gang {"NAME":"Switch 3-Gang","GPIO":[0,0,0,0,23,18,0,0,17,21,19,22,157],"FLAG":0,"BASE":18} Treatlife SS01 3-Way {"NAME":"Treatlife SS01 3-Way","GPIO":[0,0,0,0,21,158,0,0,22,18,9,0,0],"FLAG":0,"BASE":18} @@ -1508,7 +1544,7 @@ ZUCZUG 3 Gang {"NAME":"2ph105626a x3","GPIO":[0,52,0,17,19,18,0,0,22, ## Valve ``` -Garden Water Timer BQ05 {"NAME":"BQ05","GPIO":[255,255,255,255,255,255,0,0,255,255,255,21,22],"FLAG":1,"BASE":18} +Garden Water Timer BQ05 {"NAME":"BQ05","GPIO":[17,0,0,0,0,0,0,0,21,157,0,0,0],"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} @@ -1547,5 +1583,5 @@ Vigica VGSPK00815 {"NAME":"VIGICA outlet","GPIO":[17,255,255,255,255,22,1 ## Zigbee Bridge ``` -Sonoff ZBBridge {"NAME":"Sonoff ZBBridge","GPIO":[56,165,0,166,59,58,0,0,0,158,0,0,17],"FLAG":0,"BASE":18} +Sonoff ZBBridge {"NAME":"Sonoff ZbBridge","GPIO":[56,165,0,166,215,0,0,0,0,158,0,0,17],"FLAG":0,"BASE":75} ``` diff --git a/lib/IRremoteESP8266-2.7.8/CPPLINT.cfg b/lib/IRremoteESP8266-2.7.8.10/CPPLINT.cfg similarity index 100% rename from lib/IRremoteESP8266-2.7.8/CPPLINT.cfg rename to lib/IRremoteESP8266-2.7.8.10/CPPLINT.cfg diff --git a/lib/IRremoteESP8266-2.7.8/Doxyfile b/lib/IRremoteESP8266-2.7.8.10/Doxyfile similarity index 100% rename from lib/IRremoteESP8266-2.7.8/Doxyfile rename to lib/IRremoteESP8266-2.7.8.10/Doxyfile diff --git a/lib/IRremoteESP8266-2.7.8/LICENSE.txt b/lib/IRremoteESP8266-2.7.8.10/LICENSE.txt similarity index 100% rename from lib/IRremoteESP8266-2.7.8/LICENSE.txt rename to lib/IRremoteESP8266-2.7.8.10/LICENSE.txt diff --git a/lib/IRremoteESP8266-2.7.8/README.md b/lib/IRremoteESP8266-2.7.8.10/README.md similarity index 100% rename from lib/IRremoteESP8266-2.7.8/README.md rename to lib/IRremoteESP8266-2.7.8.10/README.md diff --git a/lib/IRremoteESP8266-2.7.8/README_fr.md b/lib/IRremoteESP8266-2.7.8.10/README_fr.md similarity index 100% rename from lib/IRremoteESP8266-2.7.8/README_fr.md rename to lib/IRremoteESP8266-2.7.8.10/README_fr.md diff --git a/lib/IRremoteESP8266-2.7.8/ReleaseNotes.md b/lib/IRremoteESP8266-2.7.8.10/ReleaseNotes.md similarity index 100% rename from lib/IRremoteESP8266-2.7.8/ReleaseNotes.md rename to lib/IRremoteESP8266-2.7.8.10/ReleaseNotes.md diff --git a/lib/IRremoteESP8266-2.7.8/SupportedProtocols.md b/lib/IRremoteESP8266-2.7.8.10/SupportedProtocols.md similarity index 100% rename from lib/IRremoteESP8266-2.7.8/SupportedProtocols.md rename to lib/IRremoteESP8266-2.7.8.10/SupportedProtocols.md diff --git a/lib/IRremoteESP8266-2.7.8/docs/README.md b/lib/IRremoteESP8266-2.7.8.10/docs/README.md similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/README.md rename to lib/IRremoteESP8266-2.7.8.10/docs/README.md diff --git a/lib/IRremoteESP8266-2.7.8/docs/README_fr.md b/lib/IRremoteESP8266-2.7.8.10/docs/README_fr.md similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/README_fr.md rename to lib/IRremoteESP8266-2.7.8.10/docs/README_fr.md diff --git a/lib/IRremoteESP8266-2.7.8/docs/_config.yml b/lib/IRremoteESP8266-2.7.8.10/docs/_config.yml similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/_config.yml rename to lib/IRremoteESP8266-2.7.8.10/docs/_config.yml diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRac_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRac_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRac_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRac_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRac_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRac_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRac_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRac_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRac_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRac_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRac_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRac_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRrecv_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRrecv_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRrecv_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRrecv_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRrecv_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRrecv_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRrecv_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRrecv_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRrecv_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRrecv_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRrecv_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRrecv_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRremoteESP8266_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRremoteESP8266_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRremoteESP8266_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRremoteESP8266_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRremoteESP8266_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRremoteESP8266_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRremoteESP8266_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRremoteESP8266_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRsend_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRsend_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRsend_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRsend_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRsend_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRsend_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRsend_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRsend_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRsend_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRsend_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRsend_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRsend_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtext_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtext_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtext_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtext_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtext_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtext_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtext_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtext_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtext_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtext_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtext_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtext_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtimer_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtimer_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtimer_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtimer_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtimer_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtimer_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtimer_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtimer_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtimer_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtimer_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRtimer_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRtimer_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRutils_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRutils_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRutils_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRutils_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRutils_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRutils_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRutils_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRutils_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRutils_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRutils_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/IRutils_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/IRutils_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/README_8md.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/README_8md.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/README_8md.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/README_8md.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/annotated.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/annotated.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/annotated.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/annotated.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/bc_s.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/bc_s.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/bc_s.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/bc_s.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/bdwn.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/bdwn.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/bdwn.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/bdwn.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRAmcorAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRAmcorAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRAmcorAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRAmcorAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRAmcorAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRAmcorAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRAmcorAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRAmcorAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRAmcorAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRAmcorAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRAmcorAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRAmcorAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRAmcorAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRAmcorAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRAmcorAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRAmcorAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRAmcorAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRAmcorAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRAmcorAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRAmcorAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRArgoAC-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRArgoAC-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRArgoAC-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRArgoAC-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRArgoAC.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRArgoAC.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRArgoAC.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRArgoAC.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRArgoAC__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRArgoAC__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRArgoAC__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRArgoAC__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRArgoAC__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRArgoAC__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRArgoAC__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRArgoAC__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRArgoAC__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRArgoAC__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRArgoAC__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRArgoAC__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCarrierAc64-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCarrierAc64-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCarrierAc64-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCarrierAc64-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCarrierAc64.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCarrierAc64.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCarrierAc64.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCarrierAc64.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCarrierAc64__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCarrierAc64__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCarrierAc64__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCarrierAc64__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCarrierAc64__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCarrierAc64__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCarrierAc64__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCarrierAc64__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCarrierAc64__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCarrierAc64__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCarrierAc64__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCarrierAc64__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoolixAC-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoolixAC-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoolixAC-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoolixAC-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoolixAC.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoolixAC.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoolixAC.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoolixAC.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoolixAC__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoolixAC__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoolixAC__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoolixAC__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoolixAC__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoolixAC__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoolixAC__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoolixAC__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoolixAC__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoolixAC__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoolixAC__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoolixAC__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoronaAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoronaAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoronaAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoronaAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoronaAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoronaAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoronaAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoronaAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoronaAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoronaAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoronaAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoronaAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoronaAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoronaAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoronaAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoronaAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoronaAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoronaAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRCoronaAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRCoronaAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin128-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin128-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin128-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin128-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin128.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin128.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin128.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin128.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin128__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin128__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin128__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin128__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin128__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin128__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin128__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin128__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin128__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin128__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin128__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin128__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin152-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin152-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin152-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin152-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin152.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin152.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin152.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin152.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin152__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin152__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin152__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin152__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin152__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin152__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin152__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin152__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin152__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin152__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin152__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin152__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin160-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin160-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin160-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin160-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin160.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin160.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin160.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin160.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin160__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin160__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin160__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin160__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin160__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin160__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin160__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin160__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin160__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin160__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin160__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin160__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin176-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin176-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin176-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin176-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin176.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin176.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin176.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin176.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin176__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin176__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin176__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin176__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin176__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin176__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin176__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin176__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin176__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin176__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin176__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin176__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin2-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin2-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin2-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin2-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin2.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin2.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin2.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin2.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin216-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin216-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin216-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin216-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin216.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin216.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin216.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin216.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin216__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin216__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin216__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin216__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin216__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin216__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin216__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin216__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin216__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin216__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin216__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin216__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin2__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin2__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin2__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin2__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin2__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin2__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin2__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin2__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin2__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin2__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin2__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin2__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin64-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin64-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin64-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin64-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin64.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin64.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin64.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin64.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin64__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin64__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin64__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin64__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin64__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin64__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin64__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin64__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin64__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin64__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikin64__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikin64__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikinESP-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikinESP-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikinESP-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikinESP-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikinESP.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikinESP.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikinESP.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikinESP.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikinESP__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikinESP__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikinESP__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikinESP__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikinESP__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikinESP__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikinESP__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikinESP__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikinESP__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikinESP__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDaikinESP__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDaikinESP__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDelonghiAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDelonghiAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDelonghiAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDelonghiAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDelonghiAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDelonghiAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDelonghiAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDelonghiAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDelonghiAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDelonghiAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDelonghiAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDelonghiAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDelonghiAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDelonghiAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDelonghiAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDelonghiAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDelonghiAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDelonghiAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRDelonghiAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRDelonghiAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRElectraAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRElectraAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRElectraAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRElectraAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRElectraAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRElectraAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRElectraAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRElectraAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRElectraAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRElectraAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRElectraAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRElectraAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRElectraAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRElectraAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRElectraAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRElectraAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRElectraAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRElectraAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRElectraAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRElectraAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRFujitsuAC-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRFujitsuAC-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRFujitsuAC-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRFujitsuAC-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRFujitsuAC.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRFujitsuAC.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRFujitsuAC.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRFujitsuAC.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRFujitsuAC__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRFujitsuAC__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRFujitsuAC__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRFujitsuAC__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRFujitsuAC__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRFujitsuAC__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRFujitsuAC__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRFujitsuAC__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRFujitsuAC__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRFujitsuAC__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRFujitsuAC__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRFujitsuAC__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGoodweatherAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGoodweatherAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGoodweatherAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGoodweatherAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGoodweatherAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGoodweatherAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGoodweatherAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGoodweatherAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGoodweatherAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGoodweatherAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGoodweatherAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGoodweatherAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGoodweatherAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGoodweatherAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGoodweatherAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGoodweatherAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGoodweatherAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGoodweatherAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGoodweatherAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGoodweatherAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGreeAC-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGreeAC-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGreeAC-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGreeAC-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGreeAC.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGreeAC.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGreeAC.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGreeAC.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGreeAC__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGreeAC__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGreeAC__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGreeAC__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGreeAC__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGreeAC__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGreeAC__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGreeAC__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGreeAC__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGreeAC__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRGreeAC__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRGreeAC__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierAC-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierAC-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierAC-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierAC-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierAC.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierAC.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierAC.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierAC.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierACYRW02-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierACYRW02-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierACYRW02-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierACYRW02-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierACYRW02.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierACYRW02.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierACYRW02.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierACYRW02.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierACYRW02__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierACYRW02__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierACYRW02__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierACYRW02__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierACYRW02__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierACYRW02__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierACYRW02__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierACYRW02__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierACYRW02__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierACYRW02__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierACYRW02__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierACYRW02__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierAC__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierAC__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierAC__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierAC__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierAC__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierAC__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierAC__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierAC__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierAC__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierAC__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHaierAC__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHaierAC__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc1-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc1-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc1-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc1-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc1.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc1.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc1.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc1.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc1__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc1__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc1__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc1__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc1__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc1__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc1__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc1__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc1__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc1__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc1__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc1__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc3-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc3-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc3-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc3-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc3.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc3.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc3.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc3.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__inherit__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__inherit__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__inherit__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__inherit__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__inherit__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__inherit__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__inherit__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__inherit__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__inherit__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__inherit__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc344__inherit__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc344__inherit__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc3__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc3__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc3__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc3__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc3__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc3__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc3__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc3__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc3__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc3__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc3__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc3__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__inherit__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__inherit__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__inherit__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__inherit__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__inherit__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__inherit__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__inherit__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__inherit__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__inherit__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__inherit__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc424__inherit__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc424__inherit__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRHitachiAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRHitachiAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRKelvinatorAC-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRKelvinatorAC-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRKelvinatorAC-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRKelvinatorAC-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRKelvinatorAC.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRKelvinatorAC.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRKelvinatorAC.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRKelvinatorAC.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRKelvinatorAC__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRKelvinatorAC__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRKelvinatorAC__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRKelvinatorAC__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRKelvinatorAC__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRKelvinatorAC__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRKelvinatorAC__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRKelvinatorAC__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRKelvinatorAC__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRKelvinatorAC__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRKelvinatorAC__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRKelvinatorAC__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRLgAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRLgAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRLgAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRLgAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRLgAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRLgAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRLgAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRLgAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRLgAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRLgAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRLgAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRLgAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRLgAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRLgAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRLgAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRLgAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRLgAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRLgAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRLgAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRLgAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMideaAC-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMideaAC-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMideaAC-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMideaAC-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMideaAC.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMideaAC.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMideaAC.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMideaAC.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMideaAC__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMideaAC__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMideaAC__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMideaAC__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMideaAC__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMideaAC__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMideaAC__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMideaAC__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMideaAC__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMideaAC__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMideaAC__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMideaAC__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi112-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi112-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi112-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi112-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi112.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi112.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi112.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi112.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi112__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi112__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi112__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi112__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi112__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi112__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi112__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi112__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi112__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi112__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi112__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi112__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi136-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi136-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi136-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi136-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi136.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi136.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi136.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi136.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi136__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi136__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi136__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi136__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi136__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi136__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi136__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi136__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi136__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi136__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishi136__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishi136__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiAC-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiAC-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiAC-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiAC-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiAC.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiAC.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiAC.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiAC.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiAC__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiAC__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiAC__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiAC__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiAC__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiAC__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiAC__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiAC__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiAC__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiAC__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiAC__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiAC__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy152Ac-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy152Ac-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy152Ac-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy152Ac-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy152Ac.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy152Ac.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy152Ac.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy152Ac.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy88Ac-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy88Ac-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy88Ac-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy88Ac-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy88Ac.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy88Ac.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy88Ac.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy88Ac.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRNeoclimaAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRNeoclimaAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRNeoclimaAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRNeoclimaAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRNeoclimaAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRNeoclimaAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRNeoclimaAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRNeoclimaAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRPanasonicAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRPanasonicAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRPanasonicAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRPanasonicAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRPanasonicAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRPanasonicAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRPanasonicAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRPanasonicAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRPanasonicAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRPanasonicAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRPanasonicAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRPanasonicAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRPanasonicAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRPanasonicAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRPanasonicAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRPanasonicAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRPanasonicAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRPanasonicAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRPanasonicAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRPanasonicAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSamsungAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSamsungAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSamsungAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSamsungAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSamsungAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSamsungAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSamsungAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSamsungAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSamsungAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSamsungAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSamsungAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSamsungAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSamsungAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSamsungAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSamsungAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSamsungAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSharpAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSharpAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSharpAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSharpAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSharpAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSharpAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSharpAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSharpAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSharpAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSharpAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSharpAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSharpAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSharpAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSharpAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSharpAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSharpAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSharpAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSharpAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRSharpAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRSharpAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTcl112Ac-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTcl112Ac-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTcl112Ac-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTcl112Ac-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTcl112Ac.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTcl112Ac.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTcl112Ac.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTcl112Ac.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTcl112Ac__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTcl112Ac__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTcl112Ac__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTcl112Ac__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTcl112Ac__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTcl112Ac__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTcl112Ac__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTcl112Ac__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTecoAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTecoAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTecoAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTecoAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTecoAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTecoAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTecoAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTecoAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTecoAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTecoAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTecoAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTecoAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTecoAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTecoAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTecoAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTecoAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTecoAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTecoAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTecoAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTecoAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRToshibaAC-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRToshibaAC-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRToshibaAC-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRToshibaAC-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRToshibaAC.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRToshibaAC.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRToshibaAC.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRToshibaAC.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRToshibaAC__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRToshibaAC__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRToshibaAC__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRToshibaAC__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRToshibaAC__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRToshibaAC__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRToshibaAC__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRToshibaAC__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTrotecESP-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTrotecESP-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTrotecESP-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTrotecESP-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTrotecESP.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTrotecESP.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTrotecESP.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTrotecESP.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTrotecESP__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTrotecESP__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTrotecESP__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTrotecESP__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTrotecESP__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTrotecESP__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTrotecESP__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTrotecESP__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTrotecESP__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTrotecESP__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRTrotecESP__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRTrotecESP__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRVestelAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRVestelAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRVestelAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRVestelAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRVestelAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRVestelAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRVestelAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRVestelAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRVestelAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRVestelAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRVestelAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRVestelAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRVestelAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRVestelAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRVestelAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRVestelAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRVestelAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRVestelAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRVestelAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRVestelAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRWhirlpoolAc-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRWhirlpoolAc-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRWhirlpoolAc-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRWhirlpoolAc-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRWhirlpoolAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRWhirlpoolAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRWhirlpoolAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRWhirlpoolAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRac-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRac-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRac-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRac-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRac.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRac.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRac.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRac.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRac__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRac__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRac__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRac__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRac__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRac__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRac__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRac__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRac__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRac__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRac__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRac__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRrecv-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRrecv-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRrecv-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRrecv-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRrecv.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRrecv.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRrecv.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRrecv.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRrecv__coll__graph.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRrecv__coll__graph.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRrecv__coll__graph.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRrecv__coll__graph.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRrecv__coll__graph.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRrecv__coll__graph.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRrecv__coll__graph.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRrecv__coll__graph.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRrecv__coll__graph.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRrecv__coll__graph.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRrecv__coll__graph.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRrecv__coll__graph.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRsend-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRsend-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRsend-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRsend-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRsend.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRsend.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRsend.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRsend.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRtimer-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRtimer-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRtimer-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRtimer-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRtimer.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRtimer.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classIRtimer.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classIRtimer.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classTimerMs-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classTimerMs-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classTimerMs-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classTimerMs-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classTimerMs.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classTimerMs.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classTimerMs.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classTimerMs.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classdecode__results-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classdecode__results-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classdecode__results-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classdecode__results-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classdecode__results.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classdecode__results.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classdecode__results.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classdecode__results.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classes.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classes.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/classes.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/classes.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/closed.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/closed.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/closed.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/closed.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/de-CH_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/de-CH_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/de-CH_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/de-CH_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/de-CH_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/de-CH_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/de-CH_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/de-CH_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/de-DE_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/de-DE_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/de-DE_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/de-DE_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/de-DE_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/de-DE_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/de-DE_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/de-DE_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/defaults_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/defaults_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/defaults_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/defaults_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/defaults_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/defaults_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/defaults_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/defaults_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/deprecated.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/deprecated.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/deprecated.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/deprecated.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/dir_49e56c817e5e54854c35e136979f97ca.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/dir_49e56c817e5e54854c35e136979f97ca.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/dir_49e56c817e5e54854c35e136979f97ca.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/dir_49e56c817e5e54854c35e136979f97ca.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/dir_84fe998d1eb06414cc389ad334e77e63.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/dir_84fe998d1eb06414cc389ad334e77e63.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/dir_84fe998d1eb06414cc389ad334e77e63.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/dir_84fe998d1eb06414cc389ad334e77e63.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/doc.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/doc.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/doc.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/doc.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/doxygen.css b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/doxygen.css similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/doxygen.css rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/doxygen.css diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/doxygen.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/doxygen.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/doxygen.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/doxygen.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/doxygen__index_8md.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/doxygen__index_8md.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/doxygen__index_8md.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/doxygen__index_8md.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/dynsections.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/dynsections.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/dynsections.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/dynsections.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-AU_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-AU_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-AU_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-AU_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-AU_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-AU_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-AU_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-AU_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-IE_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-IE_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-IE_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-IE_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-IE_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-IE_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-IE_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-IE_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-UK_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-UK_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-UK_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-UK_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-UK_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-UK_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-UK_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-UK_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-US_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-US_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-US_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-US_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-US_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-US_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/en-US_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/en-US_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/es-ES_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/es-ES_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/es-ES_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/es-ES_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/es-ES_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/es-ES_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/es-ES_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/es-ES_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/files.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/files.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/files.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/files.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/folderclosed.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/folderclosed.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/folderclosed.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/folderclosed.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/folderopen.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/folderopen.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/folderopen.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/folderopen.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/fr-FR_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/fr-FR_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/fr-FR_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/fr-FR_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/fr-FR_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/fr-FR_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/fr-FR_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/fr-FR_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_a.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_a.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_a.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_a.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_b.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_b.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_b.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_b.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_c.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_c.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_c.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_c.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_d.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_d.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_d.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_d.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_e.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_e.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_e.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_e.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_f.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_f.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_f.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_f.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_a.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_a.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_a.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_a.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_b.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_b.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_b.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_b.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_c.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_c.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_c.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_c.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_d.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_d.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_d.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_d.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_e.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_e.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_e.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_e.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_f.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_f.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_f.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_f.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_g.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_g.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_g.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_g.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_i.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_i.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_i.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_i.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_k.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_k.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_k.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_k.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_l.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_l.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_l.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_l.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_m.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_m.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_m.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_m.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_n.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_n.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_n.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_n.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_o.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_o.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_o.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_o.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_p.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_p.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_p.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_p.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_r.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_r.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_r.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_r.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_s.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_s.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_s.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_s.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_t.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_t.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_t.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_t.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_u.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_u.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_u.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_u.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_v.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_v.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_v.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_v.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_w.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_w.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_w.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_w.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_~.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_~.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_func_~.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_func_~.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_g.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_g.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_g.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_g.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_i.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_i.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_i.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_i.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_k.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_k.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_k.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_k.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_l.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_l.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_l.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_l.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_m.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_m.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_m.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_m.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_n.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_n.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_n.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_n.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_o.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_o.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_o.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_o.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_p.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_p.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_p.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_p.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_q.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_q.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_q.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_q.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_r.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_r.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_r.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_r.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_rela.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_rela.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_rela.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_rela.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_s.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_s.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_s.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_s.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_t.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_t.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_t.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_t.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_u.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_u.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_u.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_u.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_v.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_v.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_v.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_v.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_a.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_a.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_a.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_a.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_b.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_b.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_b.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_b.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_c.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_c.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_c.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_c.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_d.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_d.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_d.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_d.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_e.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_e.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_e.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_e.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_f.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_f.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_f.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_f.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_i.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_i.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_i.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_i.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_l.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_l.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_l.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_l.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_m.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_m.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_m.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_m.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_n.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_n.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_n.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_n.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_o.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_o.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_o.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_o.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_p.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_p.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_p.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_p.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_q.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_q.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_q.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_q.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_r.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_r.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_r.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_r.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_s.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_s.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_s.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_s.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_t.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_t.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_t.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_t.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_u.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_u.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_u.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_u.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_v.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_v.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_v.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_v.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_w.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_w.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_w.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_w.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_z.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_z.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_vars_z.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_vars_z.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_w.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_w.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_w.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_w.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_z.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_z.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_z.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_z.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_~.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_~.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/functions_~.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/functions_~.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_a.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_a.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_a.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_a.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_c.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_c.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_c.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_c.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_d.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_d.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_d.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_d.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_e.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_e.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_e.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_e.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_enum.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_enum.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_enum.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_enum.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_eval.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_eval.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_eval.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_eval.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_f.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_f.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_f.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_f.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_func.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_func.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_func.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_func.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_g.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_g.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_g.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_g.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_i.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_i.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_i.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_i.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_j.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_j.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_j.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_j.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_k.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_k.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_k.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_k.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_l.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_l.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_l.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_l.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_m.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_m.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_m.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_m.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_n.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_n.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_n.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_n.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_p.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_p.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_p.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_p.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_r.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_r.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_r.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_r.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_s.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_s.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_s.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_s.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_t.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_t.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_t.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_t.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_type.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_type.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_type.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_type.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_u.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_u.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_u.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_u.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_v.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_v.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_v.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_v.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_vars.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_vars.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_vars.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_vars.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_vars_i.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_vars_i.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_vars_i.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_vars_i.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_vars_k.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_vars_k.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_vars_k.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_vars_k.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_w.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_w.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_w.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_w.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_x.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_x.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_x.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_x.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_y.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_y.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_y.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_y.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_z.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_z.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/globals_z.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/globals_z.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/graph_legend.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/graph_legend.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/graph_legend.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/graph_legend.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/graph_legend.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/graph_legend.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/graph_legend.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/graph_legend.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/graph_legend.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/graph_legend.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/graph_legend.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/graph_legend.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/hierarchy.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/hierarchy.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/hierarchy.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/hierarchy.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/i18n_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/i18n_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/i18n_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/i18n_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/i18n_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/i18n_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/i18n_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/i18n_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/index.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/index.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/index.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/index.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_0.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_0.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_0.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_0.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_0.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_0.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_0.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_0.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_0.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_0.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_0.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_0.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_1.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_1.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_1.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_1.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_1.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_1.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_1.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_1.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_1.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_1.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_1.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_1.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_10.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_10.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_10.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_10.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_10.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_10.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_10.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_10.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_10.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_10.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_10.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_10.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_11.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_11.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_11.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_11.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_11.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_11.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_11.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_11.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_11.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_11.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_11.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_11.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_12.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_12.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_12.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_12.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_12.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_12.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_12.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_12.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_12.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_12.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_12.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_12.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_13.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_13.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_13.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_13.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_13.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_13.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_13.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_13.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_13.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_13.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_13.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_13.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_14.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_14.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_14.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_14.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_14.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_14.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_14.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_14.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_14.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_14.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_14.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_14.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_15.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_15.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_15.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_15.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_15.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_15.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_15.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_15.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_15.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_15.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_15.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_15.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_16.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_16.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_16.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_16.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_16.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_16.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_16.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_16.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_16.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_16.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_16.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_16.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_17.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_17.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_17.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_17.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_17.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_17.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_17.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_17.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_17.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_17.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_17.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_17.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_18.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_18.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_18.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_18.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_18.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_18.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_18.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_18.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_18.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_18.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_18.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_18.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_19.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_19.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_19.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_19.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_19.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_19.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_19.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_19.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_19.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_19.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_19.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_19.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_2.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_2.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_2.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_2.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_2.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_2.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_2.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_2.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_2.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_2.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_2.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_2.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_20.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_20.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_20.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_20.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_20.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_20.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_20.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_20.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_20.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_20.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_20.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_20.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_21.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_21.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_21.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_21.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_21.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_21.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_21.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_21.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_21.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_21.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_21.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_21.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_22.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_22.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_22.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_22.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_22.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_22.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_22.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_22.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_22.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_22.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_22.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_22.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_23.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_23.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_23.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_23.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_23.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_23.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_23.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_23.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_23.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_23.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_23.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_23.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_24.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_24.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_24.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_24.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_24.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_24.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_24.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_24.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_24.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_24.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_24.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_24.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_25.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_25.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_25.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_25.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_25.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_25.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_25.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_25.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_25.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_25.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_25.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_25.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_26.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_26.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_26.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_26.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_26.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_26.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_26.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_26.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_26.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_26.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_26.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_26.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_27.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_27.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_27.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_27.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_27.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_27.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_27.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_27.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_27.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_27.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_27.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_27.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_28.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_28.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_28.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_28.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_28.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_28.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_28.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_28.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_28.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_28.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_28.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_28.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_29.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_29.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_29.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_29.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_29.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_29.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_29.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_29.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_29.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_29.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_29.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_29.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_3.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_3.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_3.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_3.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_3.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_3.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_3.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_3.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_3.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_3.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_3.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_3.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_30.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_30.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_30.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_30.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_30.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_30.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_30.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_30.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_30.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_30.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_30.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_30.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_31.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_31.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_31.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_31.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_31.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_31.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_31.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_31.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_31.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_31.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_31.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_31.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_32.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_32.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_32.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_32.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_32.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_32.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_32.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_32.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_32.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_32.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_32.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_32.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_33.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_33.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_33.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_33.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_33.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_33.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_33.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_33.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_33.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_33.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_33.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_33.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_34.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_34.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_34.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_34.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_34.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_34.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_34.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_34.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_34.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_34.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_34.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_34.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_35.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_35.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_35.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_35.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_35.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_35.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_35.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_35.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_35.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_35.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_35.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_35.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_36.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_36.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_36.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_36.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_36.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_36.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_36.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_36.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_36.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_36.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_36.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_36.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_37.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_37.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_37.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_37.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_37.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_37.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_37.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_37.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_37.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_37.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_37.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_37.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_38.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_38.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_38.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_38.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_38.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_38.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_38.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_38.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_38.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_38.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_38.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_38.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_39.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_39.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_39.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_39.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_39.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_39.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_39.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_39.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_39.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_39.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_39.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_39.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_4.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_4.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_4.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_4.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_4.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_4.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_4.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_4.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_4.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_4.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_4.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_4.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_40.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_40.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_40.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_40.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_40.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_40.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_40.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_40.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_40.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_40.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_40.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_40.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_41.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_41.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_41.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_41.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_41.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_41.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_41.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_41.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_41.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_41.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_41.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_41.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_42.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_42.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_42.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_42.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_42.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_42.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_42.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_42.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_42.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_42.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_42.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_42.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_43.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_43.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_43.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_43.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_43.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_43.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_43.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_43.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_43.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_43.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_43.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_43.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_44.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_44.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_44.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_44.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_44.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_44.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_44.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_44.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_44.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_44.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_44.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_44.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_45.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_45.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_45.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_45.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_45.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_45.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_45.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_45.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_45.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_45.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_45.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_45.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_46.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_46.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_46.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_46.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_46.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_46.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_46.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_46.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_46.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_46.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_46.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_46.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_47.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_47.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_47.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_47.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_47.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_47.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_47.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_47.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_47.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_47.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_47.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_47.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_48.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_48.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_48.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_48.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_48.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_48.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_48.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_48.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_48.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_48.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_48.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_48.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_49.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_49.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_49.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_49.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_49.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_49.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_49.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_49.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_49.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_49.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_49.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_49.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_5.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_5.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_5.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_5.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_5.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_5.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_5.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_5.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_5.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_5.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_5.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_5.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_50.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_50.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_50.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_50.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_50.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_50.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_50.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_50.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_50.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_50.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_50.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_50.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_51.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_51.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_51.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_51.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_51.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_51.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_51.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_51.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_51.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_51.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_51.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_51.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_6.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_6.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_6.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_6.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_6.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_6.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_6.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_6.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_6.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_6.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_6.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_6.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_7.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_7.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_7.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_7.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_7.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_7.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_7.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_7.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_7.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_7.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_7.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_7.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_8.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_8.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_8.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_8.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_8.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_8.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_8.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_8.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_8.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_8.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_8.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_8.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_9.map b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_9.map similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_9.map rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_9.map diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_9.md5 b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_9.md5 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_9.md5 rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_9.md5 diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_9.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_9.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherit_graph_9.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherit_graph_9.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherits.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherits.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/inherits.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/inherits.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Airwell_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Airwell_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Airwell_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Airwell_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Aiwa_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Aiwa_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Aiwa_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Aiwa_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Amcor_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Amcor_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Amcor_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Amcor_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Amcor_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Amcor_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Amcor_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Amcor_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Amcor_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Amcor_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Amcor_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Amcor_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Argo_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Argo_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Argo_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Argo_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Argo_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Argo_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Argo_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Argo_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Argo_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Argo_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Argo_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Argo_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Carrier_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Carrier_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Carrier_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Carrier_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Carrier_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Carrier_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Carrier_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Carrier_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Carrier_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Carrier_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Carrier_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Carrier_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Coolix_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Coolix_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Coolix_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Coolix_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Coolix_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Coolix_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Coolix_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Coolix_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Coolix_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Coolix_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Coolix_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Coolix_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Corona_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Corona_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Corona_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Corona_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Corona_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Corona_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Corona_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Corona_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Corona_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Corona_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Corona_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Corona_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Daikin_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Daikin_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Daikin_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Daikin_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Daikin_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Daikin_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Daikin_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Daikin_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Daikin_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Daikin_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Daikin_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Daikin_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Delonghi_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Delonghi_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Delonghi_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Delonghi_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Delonghi_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Delonghi_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Delonghi_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Delonghi_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Delonghi_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Delonghi_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Delonghi_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Delonghi_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Denon_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Denon_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Denon_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Denon_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Dish_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Dish_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Dish_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Dish_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Doshisha_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Doshisha_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Doshisha_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Doshisha_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Electra_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Electra_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Electra_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Electra_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Electra_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Electra_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Electra_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Electra_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Electra_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Electra_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Electra_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Electra_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Epson_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Epson_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Epson_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Epson_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Fujitsu_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Fujitsu_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Fujitsu_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Fujitsu_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Fujitsu_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Fujitsu_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Fujitsu_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Fujitsu_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Fujitsu_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Fujitsu_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Fujitsu_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Fujitsu_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__GICable_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__GICable_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__GICable_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__GICable_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__GlobalCache_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__GlobalCache_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__GlobalCache_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__GlobalCache_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Goodweather_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Goodweather_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Goodweather_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Goodweather_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Goodweather_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Goodweather_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Goodweather_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Goodweather_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Goodweather_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Goodweather_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Goodweather_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Goodweather_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Gree_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Gree_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Gree_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Gree_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Gree_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Gree_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Gree_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Gree_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Gree_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Gree_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Gree_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Gree_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Haier_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Haier_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Haier_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Haier_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Haier_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Haier_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Haier_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Haier_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Haier_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Haier_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Haier_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Haier_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Hitachi_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Hitachi_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Hitachi_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Hitachi_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Hitachi_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Hitachi_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Hitachi_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Hitachi_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Hitachi_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Hitachi_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Hitachi_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Hitachi_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Inax_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Inax_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Inax_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Inax_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__JVC_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__JVC_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__JVC_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__JVC_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Kelvinator_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Kelvinator_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Kelvinator_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Kelvinator_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Kelvinator_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Kelvinator_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Kelvinator_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Kelvinator_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Kelvinator_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Kelvinator_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Kelvinator_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Kelvinator_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__LG_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__LG_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__LG_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__LG_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__LG_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__LG_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__LG_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__LG_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__LG_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__LG_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__LG_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__LG_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Lasertag_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Lasertag_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Lasertag_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Lasertag_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Lego_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Lego_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Lego_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Lego_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Lutron_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Lutron_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Lutron_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Lutron_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__MWM_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__MWM_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__MWM_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__MWM_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Magiquest_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Magiquest_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Magiquest_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Magiquest_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Magiquest_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Magiquest_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Magiquest_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Magiquest_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Magiquest_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Magiquest_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Magiquest_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Magiquest_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Midea_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Midea_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Midea_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Midea_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Midea_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Midea_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Midea_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Midea_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Midea_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Midea_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Midea_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Midea_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__MitsubishiHeavy_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__MitsubishiHeavy_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__MitsubishiHeavy_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__MitsubishiHeavy_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__MitsubishiHeavy_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__MitsubishiHeavy_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__MitsubishiHeavy_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__MitsubishiHeavy_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__MitsubishiHeavy_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__MitsubishiHeavy_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__MitsubishiHeavy_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__MitsubishiHeavy_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Mitsubishi_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Mitsubishi_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Mitsubishi_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Mitsubishi_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Mitsubishi_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Mitsubishi_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Mitsubishi_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Mitsubishi_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Mitsubishi_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Mitsubishi_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Mitsubishi_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Mitsubishi_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Multibrackets_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Multibrackets_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Multibrackets_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Multibrackets_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__NEC_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__NEC_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__NEC_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__NEC_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__NEC_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__NEC_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__NEC_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__NEC_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__NEC_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__NEC_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__NEC_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__NEC_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Neoclima_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Neoclima_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Neoclima_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Neoclima_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Neoclima_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Neoclima_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Neoclima_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Neoclima_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Neoclima_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Neoclima_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Neoclima_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Neoclima_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Nikai_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Nikai_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Nikai_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Nikai_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Panasonic_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Panasonic_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Panasonic_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Panasonic_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Panasonic_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Panasonic_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Panasonic_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Panasonic_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Panasonic_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Panasonic_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Panasonic_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Panasonic_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Pioneer_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Pioneer_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Pioneer_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Pioneer_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Pronto_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Pronto_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Pronto_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Pronto_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__RC5__RC6_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__RC5__RC6_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__RC5__RC6_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__RC5__RC6_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__RCMM_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__RCMM_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__RCMM_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__RCMM_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Samsung_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Samsung_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Samsung_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Samsung_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Samsung_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Samsung_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Samsung_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Samsung_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Samsung_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Samsung_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Samsung_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Samsung_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sanyo_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sanyo_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sanyo_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sanyo_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sharp_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sharp_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sharp_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sharp_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sharp_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sharp_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sharp_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sharp_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sharp_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sharp_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sharp_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sharp_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sherwood_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sherwood_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sherwood_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sherwood_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sony_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sony_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Sony_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Sony_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Symphony_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Symphony_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Symphony_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Symphony_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Tcl_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Tcl_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Tcl_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Tcl_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Tcl_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Tcl_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Tcl_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Tcl_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Tcl_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Tcl_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Tcl_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Tcl_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Teco_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Teco_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Teco_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Teco_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Teco_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Teco_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Teco_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Teco_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Teco_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Teco_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Teco_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Teco_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Toshiba_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Toshiba_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Toshiba_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Toshiba_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Toshiba_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Toshiba_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Toshiba_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Toshiba_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Toshiba_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Toshiba_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Toshiba_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Toshiba_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Trotec_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Trotec_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Trotec_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Trotec_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Trotec_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Trotec_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Trotec_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Trotec_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Trotec_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Trotec_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Trotec_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Trotec_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Vestel_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Vestel_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Vestel_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Vestel_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Vestel_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Vestel_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Vestel_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Vestel_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Vestel_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Vestel_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Vestel_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Vestel_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Whirlpool_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Whirlpool_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Whirlpool_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Whirlpool_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Whirlpool_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Whirlpool_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Whirlpool_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Whirlpool_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Whirlpool_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Whirlpool_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Whirlpool_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Whirlpool_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Whynter_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Whynter_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Whynter_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Whynter_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Zepeal_8cpp.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Zepeal_8cpp.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/ir__Zepeal_8cpp.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/ir__Zepeal_8cpp.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/it-IT_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/it-IT_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/it-IT_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/it-IT_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/it-IT_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/it-IT_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/it-IT_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/it-IT_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/jquery.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/jquery.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/jquery.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/jquery.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/md_src_locale_README.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/md_src_locale_README.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/md_src_locale_README.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/md_src_locale_README.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/menu.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/menu.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/menu.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/menu.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/menudata.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/menudata.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/menudata.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/menudata.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespaceIRAcUtils.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespaceIRAcUtils.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespaceIRAcUtils.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespaceIRAcUtils.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespaceirutils.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespaceirutils.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespaceirutils.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespaceirutils.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespacemembers.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespacemembers.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespacemembers.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespacemembers.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespacemembers_enum.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespacemembers_enum.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespacemembers_enum.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespacemembers_enum.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespacemembers_func.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespacemembers_func.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespacemembers_func.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespacemembers_func.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespaces.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespaces.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespaces.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespaces.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespacestdAc.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespacestdAc.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/namespacestdAc.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/namespacestdAc.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/nav_f.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/nav_f.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/nav_f.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/nav_f.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/nav_g.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/nav_g.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/nav_g.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/nav_g.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/nav_h.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/nav_h.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/nav_h.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/nav_h.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/open.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/open.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/open.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/open.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/pages.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/pages.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/pages.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/pages.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_10.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_10.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_10.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_10.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_10.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_10.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_10.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_10.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_11.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_11.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_11.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_11.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_11.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_11.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_11.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_11.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_12.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_12.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_12.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_12.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_12.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_12.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_12.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_12.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_13.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_13.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_13.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_13.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_13.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_13.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_13.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_13.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_14.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_14.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_14.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_14.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_14.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_14.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_14.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_14.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_15.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_15.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_15.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_15.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_15.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_15.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_15.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_15.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_16.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_16.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_16.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_16.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_16.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_16.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_16.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_16.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_17.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_17.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_17.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_17.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_17.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_17.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_17.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_17.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_18.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_18.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_18.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_18.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_18.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_18.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_18.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_18.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_19.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_19.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_19.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_19.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_19.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_19.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_19.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_19.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1a.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1a.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1a.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1a.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1a.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1a.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1a.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1a.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1b.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1b.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1b.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1b.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1b.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1b.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_1b.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_1b.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_2.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_2.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_2.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_2.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_2.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_2.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_2.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_2.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_3.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_3.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_3.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_3.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_3.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_3.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_3.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_3.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_4.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_4.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_4.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_4.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_4.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_4.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_4.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_4.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_5.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_5.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_5.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_5.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_5.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_5.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_5.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_5.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_6.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_6.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_6.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_6.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_6.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_6.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_6.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_6.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_7.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_7.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_7.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_7.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_7.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_7.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_7.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_7.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_8.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_8.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_8.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_8.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_8.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_8.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_8.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_8.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_9.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_9.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_9.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_9.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_9.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_9.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_9.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_9.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_a.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_a.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_a.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_a.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_a.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_a.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_a.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_a.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_b.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_b.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_b.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_b.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_b.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_b.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_b.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_b.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_c.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_c.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_c.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_c.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_c.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_c.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_c.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_c.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_d.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_d.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_d.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_d.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_d.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_d.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_d.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_d.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_e.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_e.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_e.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_e.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_e.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_e.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_e.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_e.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_f.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_f.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_f.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_f.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_f.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_f.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/all_f.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/all_f.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_1.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_1.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_1.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_1.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_1.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_1.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_1.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_1.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_2.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_2.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_2.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_2.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_2.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_2.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_2.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_2.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_3.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_3.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_3.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_3.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_3.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_3.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_3.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_3.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_4.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_4.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_4.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_4.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_4.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_4.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/classes_4.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/classes_4.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/close.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/close.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/close.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/close.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_1.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_1.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_1.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_1.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_1.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_1.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_1.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_1.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_2.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_2.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_2.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_2.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_2.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_2.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_2.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_2.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_3.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_3.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_3.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_3.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_3.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_3.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_3.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_3.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_4.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_4.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_4.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_4.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_4.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_4.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_4.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_4.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_5.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_5.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_5.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_5.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_5.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_5.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_5.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_5.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_6.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_6.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_6.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_6.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_6.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_6.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_6.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_6.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_7.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_7.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_7.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_7.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_7.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_7.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_7.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_7.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_8.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_8.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_8.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_8.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_8.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_8.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enums_8.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enums_8.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_1.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_1.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_1.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_1.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_1.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_1.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_1.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_1.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_10.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_10.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_10.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_10.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_10.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_10.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_10.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_10.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_11.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_11.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_11.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_11.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_11.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_11.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_11.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_11.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_12.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_12.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_12.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_12.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_12.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_12.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_12.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_12.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_13.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_13.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_13.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_13.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_13.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_13.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_13.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_13.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_14.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_14.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_14.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_14.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_14.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_14.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_14.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_14.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_15.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_15.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_15.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_15.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_15.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_15.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_15.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_15.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_2.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_2.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_2.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_2.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_2.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_2.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_2.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_2.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_3.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_3.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_3.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_3.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_3.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_3.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_3.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_3.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_4.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_4.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_4.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_4.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_4.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_4.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_4.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_4.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_5.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_5.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_5.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_5.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_5.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_5.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_5.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_5.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_6.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_6.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_6.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_6.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_6.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_6.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_6.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_6.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_7.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_7.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_7.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_7.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_7.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_7.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_7.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_7.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_8.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_8.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_8.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_8.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_8.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_8.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_8.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_8.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_9.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_9.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_9.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_9.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_9.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_9.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_9.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_9.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_a.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_a.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_a.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_a.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_a.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_a.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_a.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_a.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_b.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_b.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_b.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_b.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_b.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_b.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_b.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_b.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_c.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_c.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_c.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_c.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_c.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_c.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_c.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_c.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_d.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_d.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_d.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_d.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_d.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_d.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_d.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_d.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_e.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_e.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_e.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_e.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_e.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_e.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_e.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_e.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_f.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_f.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_f.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_f.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_f.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_f.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/enumvalues_f.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/enumvalues_f.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_1.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_1.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_1.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_1.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_1.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_1.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_1.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_1.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_2.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_2.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_2.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_2.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_2.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_2.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_2.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_2.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_3.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_3.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_3.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_3.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_3.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_3.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_3.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_3.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_4.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_4.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_4.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_4.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_4.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_4.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_4.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_4.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_5.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_5.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_5.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_5.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_5.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_5.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/files_5.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/files_5.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_1.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_1.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_1.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_1.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_1.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_1.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_1.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_1.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_10.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_10.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_10.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_10.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_10.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_10.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_10.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_10.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_11.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_11.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_11.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_11.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_11.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_11.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_11.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_11.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_12.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_12.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_12.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_12.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_12.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_12.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_12.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_12.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_13.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_13.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_13.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_13.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_13.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_13.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_13.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_13.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_14.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_14.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_14.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_14.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_14.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_14.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_14.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_14.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_15.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_15.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_15.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_15.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_15.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_15.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_15.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_15.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_16.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_16.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_16.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_16.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_16.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_16.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_16.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_16.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_17.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_17.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_17.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_17.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_17.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_17.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_17.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_17.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_2.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_2.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_2.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_2.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_2.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_2.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_2.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_2.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_3.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_3.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_3.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_3.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_3.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_3.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_3.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_3.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_4.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_4.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_4.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_4.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_4.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_4.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_4.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_4.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_5.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_5.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_5.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_5.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_5.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_5.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_5.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_5.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_6.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_6.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_6.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_6.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_6.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_6.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_6.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_6.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_7.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_7.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_7.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_7.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_7.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_7.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_7.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_7.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_8.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_8.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_8.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_8.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_8.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_8.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_8.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_8.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_9.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_9.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_9.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_9.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_9.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_9.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_9.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_9.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_a.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_a.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_a.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_a.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_a.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_a.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_a.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_a.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_b.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_b.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_b.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_b.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_b.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_b.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_b.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_b.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_c.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_c.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_c.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_c.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_c.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_c.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_c.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_c.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_d.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_d.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_d.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_d.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_d.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_d.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_d.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_d.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_e.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_e.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_e.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_e.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_e.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_e.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_e.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_e.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_f.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_f.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_f.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_f.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_f.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_f.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/functions_f.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/functions_f.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/mag_sel.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/mag_sel.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/mag_sel.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/mag_sel.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/namespaces_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/namespaces_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/namespaces_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/namespaces_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/namespaces_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/namespaces_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/namespaces_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/namespaces_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/namespaces_1.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/namespaces_1.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/namespaces_1.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/namespaces_1.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/namespaces_1.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/namespaces_1.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/namespaces_1.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/namespaces_1.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/nomatches.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/nomatches.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/nomatches.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/nomatches.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_1.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_1.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_1.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_1.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_1.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_1.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_1.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_1.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_2.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_2.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_2.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_2.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_2.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_2.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/pages_2.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/pages_2.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/related_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/related_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/related_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/related_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/related_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/related_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/related_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/related_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/search.css b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/search.css similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/search.css rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/search.css diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/search.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/search.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/search.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/search.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/search_l.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/search_l.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/search_l.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/search_l.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/search_m.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/search_m.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/search_m.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/search_m.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/search_r.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/search_r.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/search_r.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/search_r.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/searchdata.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/searchdata.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/searchdata.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/searchdata.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/typedefs_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/typedefs_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/typedefs_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/typedefs_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/typedefs_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/typedefs_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/typedefs_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/typedefs_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_0.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_0.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_0.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_0.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_0.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_0.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_0.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_0.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_1.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_1.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_1.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_1.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_1.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_1.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_1.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_1.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_10.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_10.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_10.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_10.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_10.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_10.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_10.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_10.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_11.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_11.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_11.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_11.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_11.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_11.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_11.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_11.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_12.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_12.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_12.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_12.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_12.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_12.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_12.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_12.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_13.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_13.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_13.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_13.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_13.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_13.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_13.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_13.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_14.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_14.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_14.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_14.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_14.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_14.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_14.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_14.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_15.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_15.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_15.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_15.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_15.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_15.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_15.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_15.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_16.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_16.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_16.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_16.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_16.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_16.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_16.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_16.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_2.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_2.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_2.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_2.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_2.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_2.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_2.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_2.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_3.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_3.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_3.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_3.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_3.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_3.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_3.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_3.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_4.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_4.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_4.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_4.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_4.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_4.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_4.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_4.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_5.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_5.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_5.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_5.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_5.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_5.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_5.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_5.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_6.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_6.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_6.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_6.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_6.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_6.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_6.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_6.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_7.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_7.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_7.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_7.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_7.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_7.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_7.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_7.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_8.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_8.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_8.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_8.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_8.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_8.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_8.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_8.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_9.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_9.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_9.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_9.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_9.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_9.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_9.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_9.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_a.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_a.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_a.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_a.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_a.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_a.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_a.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_a.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_b.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_b.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_b.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_b.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_b.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_b.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_b.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_b.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_c.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_c.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_c.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_c.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_c.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_c.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_c.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_c.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_d.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_d.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_d.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_d.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_d.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_d.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_d.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_d.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_e.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_e.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_e.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_e.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_e.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_e.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_e.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_e.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_f.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_f.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_f.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_f.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_f.js b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_f.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/search/variables_f.js rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/search/variables_f.js diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/splitbar.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/splitbar.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/splitbar.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/splitbar.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structirparams__t-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structirparams__t-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structirparams__t-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structirparams__t-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structirparams__t.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structirparams__t.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structirparams__t.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structirparams__t.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structmatch__result__t-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structmatch__result__t-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structmatch__result__t-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structmatch__result__t-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structmatch__result__t.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structmatch__result__t.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structmatch__result__t.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structmatch__result__t.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structstdAc_1_1state__t-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structstdAc_1_1state__t-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structstdAc_1_1state__t-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structstdAc_1_1state__t-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structstdAc_1_1state__t.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structstdAc_1_1state__t.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/structstdAc_1_1state__t.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/structstdAc_1_1state__t.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/sync_off.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/sync_off.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/sync_off.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/sync_off.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/sync_on.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/sync_on.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/sync_on.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/sync_on.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/tab_a.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/tab_a.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/tab_a.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/tab_a.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/tab_b.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/tab_b.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/tab_b.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/tab_b.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/tab_h.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/tab_h.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/tab_h.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/tab_h.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/tab_s.png b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/tab_s.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/tab_s.png rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/tab_s.png diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/tabs.css b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/tabs.css similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/tabs.css rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/tabs.css diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/todo.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/todo.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/todo.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/todo.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/unionmagiquest-members.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/unionmagiquest-members.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/unionmagiquest-members.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/unionmagiquest-members.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/unionmagiquest.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/unionmagiquest.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/unionmagiquest.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/unionmagiquest.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/zh-CN_8h.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/zh-CN_8h.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/zh-CN_8h.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/zh-CN_8h.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen/html/zh-CN_8h_source.html b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/zh-CN_8h_source.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen/html/zh-CN_8h_source.html rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen/html/zh-CN_8h_source.html diff --git a/lib/IRremoteESP8266-2.7.8/docs/doxygen_index.md b/lib/IRremoteESP8266-2.7.8.10/docs/doxygen_index.md similarity index 100% rename from lib/IRremoteESP8266-2.7.8/docs/doxygen_index.md rename to lib/IRremoteESP8266-2.7.8.10/docs/doxygen_index.md diff --git a/lib/IRremoteESP8266-2.7.8/examples/BlynkIrRemote/BlynkIrRemote.ino b/lib/IRremoteESP8266-2.7.8.10/examples/BlynkIrRemote/BlynkIrRemote.ino similarity index 97% rename from lib/IRremoteESP8266-2.7.8/examples/BlynkIrRemote/BlynkIrRemote.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/BlynkIrRemote/BlynkIrRemote.ino index 6e659bd64..7eaed8f83 100644 --- a/lib/IRremoteESP8266-2.7.8/examples/BlynkIrRemote/BlynkIrRemote.ino +++ b/lib/IRremoteESP8266-2.7.8.10/examples/BlynkIrRemote/BlynkIrRemote.ino @@ -1,196 +1,196 @@ -/************************************************************* - Emulate a physical remote via an iOS and Android App. - Copyright Gaurav Barwalia 2020 - - Download latest Blynk library here: - https://github.com/blynkkk/blynk-library/releases/latest - - Blynk is a platform with iOS and Android apps to control - Arduino, Raspberry Pi and the likes over the Internet. - You can easily build graphic interfaces for all your - projects by simply dragging and dropping widgets. - - Downloads, docs, tutorials: http://www.blynk.cc - Sketch generator: http://examples.blynk.cc - Blynk community: http://community.blynk.cc - Follow us: http://www.fb.com/blynkapp - http://twitter.com/blynk_app - - Blynk library is licensed under MIT license - This example code is in public domain. - - ************************************************************* - This example runs directly on ESP8266 chip. - - Note: This requires ESP8266 support package: - https://github.com/esp8266/Arduino - - Please be sure to select the right ESP8266 module - in the Tools -> Board menu! - - Change WiFi ssid, pass, and Blynk auth token to run :) - Feel free to apply it to any other example. It's simple! - *************************************************************/ - - /* - // After decoding received below codes - - // Power button - -18:12:33.993 -> Protocol : NEC -18:12:33.993 -> Code : 0x1FE50AF (32 Bits) -18:12:33.993 -> uint16_t rawData[71] = {9040, 4452, 606, 532, 606, 534, 630, 508, 604, 534, 604, 534, 604, 534, 630, 506, 606, 1646, 632, 1620, 606, 1646, 632, 1620, 630, 1620, 632, 1620, 630, 1620, 606, 1646, 632, 506, 632, 506, 632, 1620, 632, 506, 632, 1620, 632, 506, 632, 508, 632, 506, 632, 506, 632, 1620, 632, 506, 632, 1624, 628, 506, 632, 1620, 632, 1618, 632, 1620, 632, 1620, 632, 39016, 9040, 2216, 630}; // NEC 1FE50AF -18:12:34.027 -> uint32_t address = 0x80; -18:12:34.027 -> uint32_t command = 0xA; -18:12:34.027 -> uint64_t data = 0x1FE50AF; - -//mute button - -18:13:27.215 -> Protocol : NEC -18:13:27.215 -> Code : 0x1FE30CF (32 Bits) -18:13:27.215 -> uint16_t rawData[71] = {9094, 4398, 660, 478, 658, 480, 658, 480, 658, 480, 658, 480, 658, 480, 660, 480, 658, 1594, 658, 1594, 658, 1594, 658, 1594, 658, 1592, 658, 1594, 658, 1592, 658, 1594, 660, 480, 658, 480, 658, 480, 658, 1592, 658, 1592, 658, 480, 658, 480, 660, 478, 660, 478, 658, 1594, 658, 1592, 658, 480, 658, 480, 658, 1594, 658, 1592, 658, 1594, 658, 1594, 658, 38986, 9094, 2162, 658}; // NEC 1FE30CF -18:13:27.285 -> uint32_t address = 0x80; -18:13:27.285 -> uint32_t command = 0xC; -18:13:27.285 -> uint64_t data = 0x1FE30CF; - -//Vol. low - -18:14:44.427 -> Protocol : NEC -18:14:44.427 -> Code : 0x1FEC03F (32 Bits) -18:14:44.427 -> uint16_t rawData[71] = {9120, 4374, 658, 478, 658, 480, 658, 480, 658, 480, 658, 482, 658, 478, 658, 480, 658, 1594, 658, 1594, 658, 1592, 660, 1594, 658, 1592, 658, 1594, 658, 1594, 658, 1592, 660, 480, 658, 1594, 658, 1594, 658, 480, 658, 480, 660, 480, 658, 480, 658, 480, 658, 480, 658, 480, 658, 480, 658, 1594, 660, 1592, 658, 1594, 658, 1594, 658, 1592, 658, 1594, 658, 39002, 9094, 2162, 658}; // NEC 1FEC03F -18:14:44.497 -> uint32_t address = 0x80; -18:14:44.497 -> uint32_t command = 0x3; -18:14:44.497 -> uint64_t data = 0x1FEC03F; - -//VOl. High - -18:15:11.677 -> Protocol : NEC -18:15:11.677 -> Code : 0x1FE40BF (32 Bits) -18:15:11.677 -> uint16_t rawData[67] = {9068, 4426, 630, 506, 632, 508, 630, 508, 630, 508, 630, 508, 630, 508, 630, 508, 630, 1622, 630, 1622, 630, 1622, 630, 1622, 656, 1594, 630, 1622, 632, 1620, 630, 1622, 630, 508, 630, 508, 630, 1622, 630, 508, 630, 508, 630, 508, 630, 508, 630, 508, 630, 508, 630, 1622, 656, 482, 630, 1622, 630, 1622, 630, 1622, 630, 1622, 630, 1622, 632, 1620, 630}; // NEC 1FE40BF -18:15:11.747 -> uint32_t address = 0x80; -18:15:11.747 -> uint32_t command = 0x2; -18:15:11.747 -> uint64_t data = 0x1FE40BF; - -//Play/Pause - -18:15:38.529 -> Protocol : NEC -18:15:38.529 -> Code : 0x1FE32CD (32 Bits) -18:15:38.529 -> uint16_t rawData[71] = {9092, 4400, 632, 504, 658, 480, 658, 480, 632, 506, 658, 480, 658, 480, 658, 482, 632, 1620, 658, 1594, 658, 1594, 632, 1618, 658, 1594, 658, 1594, 632, 1620, 632, 1618, 634, 506, 658, 480, 658, 480, 632, 1620, 658, 1598, 656, 478, 658, 478, 658, 1594, 658, 482, 632, 1618, 632, 1618, 634, 506, 632, 506, 658, 1594, 632, 1620, 658, 480, 632, 1620, 658, 38998, 9094, 2162, 660}; // NEC 1FE32CD -18:15:38.564 -> uint32_t address = 0x80; -18:15:38.564 -> uint32_t command = 0x4C; -18:15:38.564 -> uint64_t data = 0x1FE32CD; - -//Song Back - -18:16:07.527 -> Protocol : NEC -18:16:07.527 -> Code : 0x1FEA05F (32 Bits) -18:16:07.562 -> uint16_t rawData[71] = {9590, 3902, 684, 452, 686, 456, 652, 480, 660, 480, 684, 456, 656, 480, 658, 480, 684, 1568, 658, 1594, 658, 1594, 686, 1566, 658, 1594, 684, 1568, 658, 1594, 658, 1594, 686, 454, 684, 1568, 686, 454, 658, 1594, 684, 454, 686, 454, 658, 480, 660, 480, 684, 454, 658, 482, 658, 1594, 682, 456, 658, 1596, 658, 1594, 686, 1568, 660, 1592, 684, 1568, 686, 38982, 9098, 2162, 684}; // NEC 1FEA05F -18:16:07.597 -> uint32_t address = 0x80; -18:16:07.597 -> uint32_t command = 0x5; -18:16:07.597 -> uint64_t data = 0x1FEA05F; - -//Song Forward - -18:17:20.541 -> Protocol : NEC -18:17:20.541 -> Code : 0x1FEE01F (32 Bits) -18:17:20.575 -> uint16_t rawData[71] = {9068, 4424, 632, 506, 630, 506, 632, 508, 606, 532, 632, 506, 630, 508, 630, 508, 632, 1620, 632, 1620, 632, 1620, 604, 1646, 606, 1646, 630, 1622, 604, 1646, 632, 1620, 606, 534, 630, 1622, 604, 1646, 630, 1622, 604, 534, 630, 508, 604, 534, 606, 534, 630, 508, 630, 508, 606, 534, 606, 532, 630, 1622, 604, 1646, 632, 1620, 604, 1648, 604, 1646, 604, 39040, 9040, 2216, 604}; // NEC 1FEE01F -18:17:20.610 -> uint32_t address = 0x80; -18:17:20.610 -> uint32_t command = 0x7; -18:17:20.610 -> uint64_t data = 0x1FEE01F; - - */ - -// check complete video tutorial here for program explanation https://www.youtube.com/watch?v=LqmkDKu54XY&t=17s - -/* Comment this out to disable prints and save space */ -#define BLYNK_PRINT Serial - -#if defined(ESP8266) -#include -#include -#else -#include -#endif // ESP8266 -#if defined(ESP32) -#include -#endif // ESP32 - -// IR library -#include -#include - -const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2). -IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message. - -// You should get Auth Token in the Blynk App. -// Go to the Project Settings (nut icon). -char auth[] = "YourAuthToken"; - -// Your WiFi credentials. -// Set password to "" for open networks. -char ssid[] = "YourNetworkName"; -char pass[] = "YourPassword"; - - BLYNK_WRITE(V51) { // Power button - if (param.asInt() == 0) { - // Serial.println("NEC"); - irsend.sendNEC(0x1FE50AF); - } - } - - BLYNK_WRITE(V52) { // Mute button - if (param.asInt() == 0) { - // Serial.println("NEC"); - irsend.sendNEC(0x1FE30CF); - } - } - - BLYNK_WRITE(V53) { // Song Forward - if (param.asInt() == 0) { - // Serial.println("NEC"); - irsend.sendNEC(0x1FEE01F); - } - } - - BLYNK_WRITE(V54) { // Song Backward - if (param.asInt() == 0) { - // Serial.println("NEC"); - irsend.sendNEC(0x1FEA05F); - delay(10); // double tap back button to back one song - irsend.sendNEC(0x1FEA05F); - } - } - - BLYNK_WRITE(V55) { // Volume -- - if (param.asInt() == 0) { - // Serial.println("NEC"); - irsend.sendNEC(0x1FEC03F); - } - } - - BLYNK_WRITE(V56) { // Volume ++ - if (param.asInt() == 0) { - // Serial.println("NEC"); - irsend.sendNEC(0x1FE40BF); - } - } - - BLYNK_WRITE(V57) { // Play/Pause - if (param.asInt() == 0) { - // Serial.println("NEC"); - irsend.sendNEC(0x1FE32CD); - } - } - -void setup() { -#if defined(BLYNK_PRINT) - // Debug console - Serial.begin(115200); -#endif // BLYNK_PRINT - - Blynk.begin(auth, ssid, pass); -} - -void loop() { - Blynk.run(); -} +/************************************************************* + Emulate a physical remote via an iOS and Android App. + Copyright Gaurav Barwalia 2020 + + Download latest Blynk library here: + https://github.com/blynkkk/blynk-library/releases/latest + + Blynk is a platform with iOS and Android apps to control + Arduino, Raspberry Pi and the likes over the Internet. + You can easily build graphic interfaces for all your + projects by simply dragging and dropping widgets. + + Downloads, docs, tutorials: http://www.blynk.cc + Sketch generator: http://examples.blynk.cc + Blynk community: http://community.blynk.cc + Follow us: http://www.fb.com/blynkapp + http://twitter.com/blynk_app + + Blynk library is licensed under MIT license + This example code is in public domain. + + ************************************************************* + This example runs directly on ESP8266 chip. + + Note: This requires ESP8266 support package: + https://github.com/esp8266/Arduino + + Please be sure to select the right ESP8266 module + in the Tools -> Board menu! + + Change WiFi ssid, pass, and Blynk auth token to run :) + Feel free to apply it to any other example. It's simple! + *************************************************************/ + + /* + // After decoding received below codes + + // Power button + +18:12:33.993 -> Protocol : NEC +18:12:33.993 -> Code : 0x1FE50AF (32 Bits) +18:12:33.993 -> uint16_t rawData[71] = {9040, 4452, 606, 532, 606, 534, 630, 508, 604, 534, 604, 534, 604, 534, 630, 506, 606, 1646, 632, 1620, 606, 1646, 632, 1620, 630, 1620, 632, 1620, 630, 1620, 606, 1646, 632, 506, 632, 506, 632, 1620, 632, 506, 632, 1620, 632, 506, 632, 508, 632, 506, 632, 506, 632, 1620, 632, 506, 632, 1624, 628, 506, 632, 1620, 632, 1618, 632, 1620, 632, 1620, 632, 39016, 9040, 2216, 630}; // NEC 1FE50AF +18:12:34.027 -> uint32_t address = 0x80; +18:12:34.027 -> uint32_t command = 0xA; +18:12:34.027 -> uint64_t data = 0x1FE50AF; + +//mute button + +18:13:27.215 -> Protocol : NEC +18:13:27.215 -> Code : 0x1FE30CF (32 Bits) +18:13:27.215 -> uint16_t rawData[71] = {9094, 4398, 660, 478, 658, 480, 658, 480, 658, 480, 658, 480, 658, 480, 660, 480, 658, 1594, 658, 1594, 658, 1594, 658, 1594, 658, 1592, 658, 1594, 658, 1592, 658, 1594, 660, 480, 658, 480, 658, 480, 658, 1592, 658, 1592, 658, 480, 658, 480, 660, 478, 660, 478, 658, 1594, 658, 1592, 658, 480, 658, 480, 658, 1594, 658, 1592, 658, 1594, 658, 1594, 658, 38986, 9094, 2162, 658}; // NEC 1FE30CF +18:13:27.285 -> uint32_t address = 0x80; +18:13:27.285 -> uint32_t command = 0xC; +18:13:27.285 -> uint64_t data = 0x1FE30CF; + +//Vol. low + +18:14:44.427 -> Protocol : NEC +18:14:44.427 -> Code : 0x1FEC03F (32 Bits) +18:14:44.427 -> uint16_t rawData[71] = {9120, 4374, 658, 478, 658, 480, 658, 480, 658, 480, 658, 482, 658, 478, 658, 480, 658, 1594, 658, 1594, 658, 1592, 660, 1594, 658, 1592, 658, 1594, 658, 1594, 658, 1592, 660, 480, 658, 1594, 658, 1594, 658, 480, 658, 480, 660, 480, 658, 480, 658, 480, 658, 480, 658, 480, 658, 480, 658, 1594, 660, 1592, 658, 1594, 658, 1594, 658, 1592, 658, 1594, 658, 39002, 9094, 2162, 658}; // NEC 1FEC03F +18:14:44.497 -> uint32_t address = 0x80; +18:14:44.497 -> uint32_t command = 0x3; +18:14:44.497 -> uint64_t data = 0x1FEC03F; + +//VOl. High + +18:15:11.677 -> Protocol : NEC +18:15:11.677 -> Code : 0x1FE40BF (32 Bits) +18:15:11.677 -> uint16_t rawData[67] = {9068, 4426, 630, 506, 632, 508, 630, 508, 630, 508, 630, 508, 630, 508, 630, 508, 630, 1622, 630, 1622, 630, 1622, 630, 1622, 656, 1594, 630, 1622, 632, 1620, 630, 1622, 630, 508, 630, 508, 630, 1622, 630, 508, 630, 508, 630, 508, 630, 508, 630, 508, 630, 508, 630, 1622, 656, 482, 630, 1622, 630, 1622, 630, 1622, 630, 1622, 630, 1622, 632, 1620, 630}; // NEC 1FE40BF +18:15:11.747 -> uint32_t address = 0x80; +18:15:11.747 -> uint32_t command = 0x2; +18:15:11.747 -> uint64_t data = 0x1FE40BF; + +//Play/Pause + +18:15:38.529 -> Protocol : NEC +18:15:38.529 -> Code : 0x1FE32CD (32 Bits) +18:15:38.529 -> uint16_t rawData[71] = {9092, 4400, 632, 504, 658, 480, 658, 480, 632, 506, 658, 480, 658, 480, 658, 482, 632, 1620, 658, 1594, 658, 1594, 632, 1618, 658, 1594, 658, 1594, 632, 1620, 632, 1618, 634, 506, 658, 480, 658, 480, 632, 1620, 658, 1598, 656, 478, 658, 478, 658, 1594, 658, 482, 632, 1618, 632, 1618, 634, 506, 632, 506, 658, 1594, 632, 1620, 658, 480, 632, 1620, 658, 38998, 9094, 2162, 660}; // NEC 1FE32CD +18:15:38.564 -> uint32_t address = 0x80; +18:15:38.564 -> uint32_t command = 0x4C; +18:15:38.564 -> uint64_t data = 0x1FE32CD; + +//Song Back + +18:16:07.527 -> Protocol : NEC +18:16:07.527 -> Code : 0x1FEA05F (32 Bits) +18:16:07.562 -> uint16_t rawData[71] = {9590, 3902, 684, 452, 686, 456, 652, 480, 660, 480, 684, 456, 656, 480, 658, 480, 684, 1568, 658, 1594, 658, 1594, 686, 1566, 658, 1594, 684, 1568, 658, 1594, 658, 1594, 686, 454, 684, 1568, 686, 454, 658, 1594, 684, 454, 686, 454, 658, 480, 660, 480, 684, 454, 658, 482, 658, 1594, 682, 456, 658, 1596, 658, 1594, 686, 1568, 660, 1592, 684, 1568, 686, 38982, 9098, 2162, 684}; // NEC 1FEA05F +18:16:07.597 -> uint32_t address = 0x80; +18:16:07.597 -> uint32_t command = 0x5; +18:16:07.597 -> uint64_t data = 0x1FEA05F; + +//Song Forward + +18:17:20.541 -> Protocol : NEC +18:17:20.541 -> Code : 0x1FEE01F (32 Bits) +18:17:20.575 -> uint16_t rawData[71] = {9068, 4424, 632, 506, 630, 506, 632, 508, 606, 532, 632, 506, 630, 508, 630, 508, 632, 1620, 632, 1620, 632, 1620, 604, 1646, 606, 1646, 630, 1622, 604, 1646, 632, 1620, 606, 534, 630, 1622, 604, 1646, 630, 1622, 604, 534, 630, 508, 604, 534, 606, 534, 630, 508, 630, 508, 606, 534, 606, 532, 630, 1622, 604, 1646, 632, 1620, 604, 1648, 604, 1646, 604, 39040, 9040, 2216, 604}; // NEC 1FEE01F +18:17:20.610 -> uint32_t address = 0x80; +18:17:20.610 -> uint32_t command = 0x7; +18:17:20.610 -> uint64_t data = 0x1FEE01F; + + */ + +// check complete video tutorial here for program explanation https://www.youtube.com/watch?v=LqmkDKu54XY&t=17s + +/* Comment this out to disable prints and save space */ +#define BLYNK_PRINT Serial + +#if defined(ESP8266) +#include +#include +#else +#include +#endif // ESP8266 +#if defined(ESP32) +#include +#endif // ESP32 + +// IR library +#include +#include + +const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2). +IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message. + +// You should get Auth Token in the Blynk App. +// Go to the Project Settings (nut icon). +char auth[] = "YourAuthToken"; + +// Your WiFi credentials. +// Set password to "" for open networks. +char ssid[] = "YourNetworkName"; +char pass[] = "YourPassword"; + + BLYNK_WRITE(V51) { // Power button + if (param.asInt() == 0) { + // Serial.println("NEC"); + irsend.sendNEC(0x1FE50AF); + } + } + + BLYNK_WRITE(V52) { // Mute button + if (param.asInt() == 0) { + // Serial.println("NEC"); + irsend.sendNEC(0x1FE30CF); + } + } + + BLYNK_WRITE(V53) { // Song Forward + if (param.asInt() == 0) { + // Serial.println("NEC"); + irsend.sendNEC(0x1FEE01F); + } + } + + BLYNK_WRITE(V54) { // Song Backward + if (param.asInt() == 0) { + // Serial.println("NEC"); + irsend.sendNEC(0x1FEA05F); + delay(10); // double tap back button to back one song + irsend.sendNEC(0x1FEA05F); + } + } + + BLYNK_WRITE(V55) { // Volume -- + if (param.asInt() == 0) { + // Serial.println("NEC"); + irsend.sendNEC(0x1FEC03F); + } + } + + BLYNK_WRITE(V56) { // Volume ++ + if (param.asInt() == 0) { + // Serial.println("NEC"); + irsend.sendNEC(0x1FE40BF); + } + } + + BLYNK_WRITE(V57) { // Play/Pause + if (param.asInt() == 0) { + // Serial.println("NEC"); + irsend.sendNEC(0x1FE32CD); + } + } + +void setup() { +#if defined(BLYNK_PRINT) + // Debug console + Serial.begin(115200); +#endif // BLYNK_PRINT + + Blynk.begin(auth, ssid, pass); +} + +void loop() { + Blynk.run(); +} diff --git a/lib/IRremoteESP8266-2.7.8/examples/BlynkIrRemote/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/BlynkIrRemote/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/BlynkIrRemote/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/BlynkIrRemote/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/CommonAcControl/CommonAcControl.ino b/lib/IRremoteESP8266-2.7.8.10/examples/CommonAcControl/CommonAcControl.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/CommonAcControl/CommonAcControl.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/CommonAcControl/CommonAcControl.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/CommonAcControl/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/CommonAcControl/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/CommonAcControl/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/CommonAcControl/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/ControlSamsungAC/ControlSamsungAC.ino b/lib/IRremoteESP8266-2.7.8.10/examples/ControlSamsungAC/ControlSamsungAC.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/ControlSamsungAC/ControlSamsungAC.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/ControlSamsungAC/ControlSamsungAC.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/ControlSamsungAC/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/ControlSamsungAC/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/ControlSamsungAC/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/ControlSamsungAC/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/DumbIRRepeater/DumbIRRepeater.ino b/lib/IRremoteESP8266-2.7.8.10/examples/DumbIRRepeater/DumbIRRepeater.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/DumbIRRepeater/DumbIRRepeater.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/DumbIRRepeater/DumbIRRepeater.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/DumbIRRepeater/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/DumbIRRepeater/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/DumbIRRepeater/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/DumbIRRepeater/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRGCSendDemo/IRGCSendDemo.ino b/lib/IRremoteESP8266-2.7.8.10/examples/IRGCSendDemo/IRGCSendDemo.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRGCSendDemo/IRGCSendDemo.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/IRGCSendDemo/IRGCSendDemo.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRGCSendDemo/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/IRGCSendDemo/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRGCSendDemo/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/IRGCSendDemo/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRGCTCPServer/IRGCTCPServer.ino b/lib/IRremoteESP8266-2.7.8.10/examples/IRGCTCPServer/IRGCTCPServer.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRGCTCPServer/IRGCTCPServer.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/IRGCTCPServer/IRGCTCPServer.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRGCTCPServer/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/IRGCTCPServer/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRGCTCPServer/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/IRGCTCPServer/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRMQTTServer/IRMQTTServer.h b/lib/IRremoteESP8266-2.7.8.10/examples/IRMQTTServer/IRMQTTServer.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRMQTTServer/IRMQTTServer.h rename to lib/IRremoteESP8266-2.7.8.10/examples/IRMQTTServer/IRMQTTServer.h diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRMQTTServer/IRMQTTServer.ino b/lib/IRremoteESP8266-2.7.8.10/examples/IRMQTTServer/IRMQTTServer.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRMQTTServer/IRMQTTServer.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/IRMQTTServer/IRMQTTServer.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRMQTTServer/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/IRMQTTServer/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRMQTTServer/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/IRMQTTServer/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRServer/IRServer.ino b/lib/IRremoteESP8266-2.7.8.10/examples/IRServer/IRServer.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRServer/IRServer.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/IRServer/IRServer.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRServer/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/IRServer/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRServer/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/IRServer/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRrecvDemo/IRrecvDemo.ino b/lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDemo/IRrecvDemo.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRrecvDemo/IRrecvDemo.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDemo/IRrecvDemo.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRrecvDemo/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDemo/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRrecvDemo/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDemo/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRrecvDump/IRrecvDump.ino b/lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDump/IRrecvDump.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRrecvDump/IRrecvDump.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDump/IRrecvDump.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRrecvDump/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDump/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRrecvDump/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDump/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRrecvDumpV2/IRrecvDumpV2.ino b/lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDumpV2/IRrecvDumpV2.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRrecvDumpV2/IRrecvDumpV2.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDumpV2/IRrecvDumpV2.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRrecvDumpV2/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDumpV2/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRrecvDumpV2/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDumpV2/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRrecvDumpV3/BaseOTA.h b/lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDumpV3/BaseOTA.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRrecvDumpV3/BaseOTA.h rename to lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDumpV3/BaseOTA.h diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRrecvDumpV3/IRrecvDumpV3.ino b/lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDumpV3/IRrecvDumpV3.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRrecvDumpV3/IRrecvDumpV3.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDumpV3/IRrecvDumpV3.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRrecvDumpV3/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDumpV3/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRrecvDumpV3/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/IRrecvDumpV3/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRsendDemo/IRsendDemo.ino b/lib/IRremoteESP8266-2.7.8.10/examples/IRsendDemo/IRsendDemo.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRsendDemo/IRsendDemo.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/IRsendDemo/IRsendDemo.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRsendDemo/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/IRsendDemo/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRsendDemo/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/IRsendDemo/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRsendProntoDemo/IRsendProntoDemo.ino b/lib/IRremoteESP8266-2.7.8.10/examples/IRsendProntoDemo/IRsendProntoDemo.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRsendProntoDemo/IRsendProntoDemo.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/IRsendProntoDemo/IRsendProntoDemo.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/IRsendProntoDemo/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/IRsendProntoDemo/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/IRsendProntoDemo/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/IRsendProntoDemo/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino b/lib/IRremoteESP8266-2.7.8.10/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/JVCPanasonicSendDemo/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/JVCPanasonicSendDemo/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/JVCPanasonicSendDemo/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/JVCPanasonicSendDemo/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/LGACSend/LGACSend.ino b/lib/IRremoteESP8266-2.7.8.10/examples/LGACSend/LGACSend.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/LGACSend/LGACSend.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/LGACSend/LGACSend.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/LGACSend/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/LGACSend/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/LGACSend/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/LGACSend/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/SmartIRRepeater/SmartIRRepeater.ino b/lib/IRremoteESP8266-2.7.8.10/examples/SmartIRRepeater/SmartIRRepeater.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/SmartIRRepeater/SmartIRRepeater.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/SmartIRRepeater/SmartIRRepeater.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/SmartIRRepeater/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/SmartIRRepeater/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/SmartIRRepeater/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/SmartIRRepeater/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnArgoAC/TurnOnArgoAC.ino b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnArgoAC/TurnOnArgoAC.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnArgoAC/TurnOnArgoAC.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnArgoAC/TurnOnArgoAC.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnArgoAC/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnArgoAC/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnArgoAC/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnArgoAC/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnDaikinAC/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnDaikinAC/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnDaikinAC/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnDaikinAC/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnFujitsuAC/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnFujitsuAC/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnFujitsuAC/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnFujitsuAC/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnGreeAC/TurnOnGreeAC.ino b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnGreeAC/TurnOnGreeAC.ino similarity index 97% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnGreeAC/TurnOnGreeAC.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnGreeAC/TurnOnGreeAC.ino index 64c857f3d..ecb3b8869 100644 --- a/lib/IRremoteESP8266-2.7.8/examples/TurnOnGreeAC/TurnOnGreeAC.ino +++ b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnGreeAC/TurnOnGreeAC.ino @@ -1,77 +1,77 @@ -/* Copyright 2016, 2018 David Conran -* Copyright 2020 Sadid Rafsun Tulon -* -* An IR LED circuit *MUST* be connected to the ESP8266 on a pin -* as specified by kIrLed below. -* -* TL;DR: The IR LED needs to be driven by a transistor for a good result. -* -* Suggested circuit: -* https://github.com/crankyoldgit/IRremoteESP8266/wiki#ir-sending -* -* Common mistakes & tips: -* * Don't just connect the IR LED directly to the pin, it won't -* have enough current to drive the IR LED effectively. -* * Make sure you have the IR LED polarity correct. -* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity -* * Typical digital camera/phones can be used to see if the IR LED is flashed. -* Replace the IR LED with a normal LED if you don't have a digital camera -* when debugging. -* * Avoid using the following pins unless you really know what you are doing: -* * Pin 0/D3: Can interfere with the boot/program mode & support circuits. -* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere. -* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere. -* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs -* for your first time. e.g. ESP-12 etc. -*/ -#include -#include -#include -#include - -const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2). -IRGreeAC ac(kIrLed); // Set the GPIO to be used for sending messages. - -void printState() { - // Display the settings. - Serial.println("GREE A/C remote is in the following state:"); - Serial.printf(" %s\n", ac.toString().c_str()); - // Display the encoded IR sequence. - unsigned char* ir_code = ac.getRaw(); - Serial.print("IR Code: 0x"); - for (uint8_t i = 0; i < kGreeStateLength; i++) - Serial.printf("%02X", ir_code[i]); - Serial.println(); -} - -void setup() { - ac.begin(); - Serial.begin(115200); - delay(200); - - // Set up what we want to send. See ir_Gree.cpp for all the options. - // Most things default to off. - Serial.println("Default state of the remote."); - printState(); - Serial.println("Setting desired state for A/C."); - ac.on(); - ac.setFan(1); - // kGreeAuto, kGreeDry, kGreeCool, kGreeFan, kGreeHeat - ac.setMode(kGreeCool); - ac.setTemp(20); // 16-30C - ac.setSwingVertical(true, kGreeSwingAuto); - ac.setXFan(false); - ac.setLight(false); - ac.setSleep(false); - ac.setTurbo(false); -} - -void loop() { - // Now send the IR signal. -#if SEND_GREE - Serial.println("Sending IR command to A/C ..."); - ac.send(); -#endif // SEND_GREE - printState(); - delay(5000); -} +/* Copyright 2016, 2018 David Conran +* Copyright 2020 Sadid Rafsun Tulon +* +* An IR LED circuit *MUST* be connected to the ESP8266 on a pin +* as specified by kIrLed below. +* +* TL;DR: The IR LED needs to be driven by a transistor for a good result. +* +* Suggested circuit: +* https://github.com/crankyoldgit/IRremoteESP8266/wiki#ir-sending +* +* Common mistakes & tips: +* * Don't just connect the IR LED directly to the pin, it won't +* have enough current to drive the IR LED effectively. +* * Make sure you have the IR LED polarity correct. +* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity +* * Typical digital camera/phones can be used to see if the IR LED is flashed. +* Replace the IR LED with a normal LED if you don't have a digital camera +* when debugging. +* * Avoid using the following pins unless you really know what you are doing: +* * Pin 0/D3: Can interfere with the boot/program mode & support circuits. +* * Pin 1/TX/TXD0: Any serial transmissions from the ESP8266 will interfere. +* * Pin 3/RX/RXD0: Any serial transmissions to the ESP8266 will interfere. +* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs +* for your first time. e.g. ESP-12 etc. +*/ +#include +#include +#include +#include + +const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2). +IRGreeAC ac(kIrLed); // Set the GPIO to be used for sending messages. + +void printState() { + // Display the settings. + Serial.println("GREE A/C remote is in the following state:"); + Serial.printf(" %s\n", ac.toString().c_str()); + // Display the encoded IR sequence. + unsigned char* ir_code = ac.getRaw(); + Serial.print("IR Code: 0x"); + for (uint8_t i = 0; i < kGreeStateLength; i++) + Serial.printf("%02X", ir_code[i]); + Serial.println(); +} + +void setup() { + ac.begin(); + Serial.begin(115200); + delay(200); + + // Set up what we want to send. See ir_Gree.cpp for all the options. + // Most things default to off. + Serial.println("Default state of the remote."); + printState(); + Serial.println("Setting desired state for A/C."); + ac.on(); + ac.setFan(1); + // kGreeAuto, kGreeDry, kGreeCool, kGreeFan, kGreeHeat + ac.setMode(kGreeCool); + ac.setTemp(20); // 16-30C + ac.setSwingVertical(true, kGreeSwingAuto); + ac.setXFan(false); + ac.setLight(false); + ac.setSleep(false); + ac.setTurbo(false); +} + +void loop() { + // Now send the IR signal. +#if SEND_GREE + Serial.println("Sending IR command to A/C ..."); + ac.send(); +#endif // SEND_GREE + printState(); + delay(5000); +} diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnGreeAC/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnGreeAC/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnGreeAC/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnGreeAC/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnKelvinatorAC/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnKelvinatorAC/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnKelvinatorAC/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnKelvinatorAC/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnMitsubishiAC/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnMitsubishiAC/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnMitsubishiAC/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnMitsubishiAC/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnMitsubishiHeavyAc/TurnOnMitsubishiHeavyAc.ino b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnMitsubishiHeavyAc/TurnOnMitsubishiHeavyAc.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnMitsubishiHeavyAc/TurnOnMitsubishiHeavyAc.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnMitsubishiHeavyAc/TurnOnMitsubishiHeavyAc.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnMitsubishiHeavyAc/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnMitsubishiHeavyAc/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnMitsubishiHeavyAc/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnMitsubishiHeavyAc/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnPanasonicAC/TurnOnPanasonicAC.ino b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnPanasonicAC/TurnOnPanasonicAC.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnPanasonicAC/TurnOnPanasonicAC.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnPanasonicAC/TurnOnPanasonicAC.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnPanasonicAC/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnPanasonicAC/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnPanasonicAC/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnPanasonicAC/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino similarity index 97% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino index a37a07e5c..fb71c0486 100644 --- a/lib/IRremoteESP8266-2.7.8/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino +++ b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino @@ -38,7 +38,7 @@ void printState() { // Display the encoded IR sequence. unsigned char* ir_code = ac.getRaw(); Serial.print("IR Code: 0x"); - for (uint8_t i = 0; i < kToshibaACStateLength; i++) + for (uint8_t i = 0; i < ac.getStateLength(); i++) Serial.printf("%02X", ir_code[i]); Serial.println(); } diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnToshibaAC/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnToshibaAC/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnToshibaAC/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnToshibaAC/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/TurnOnTrotecAC/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/TurnOnTrotecAC/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/TurnOnTrotecAC/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/TurnOnTrotecAC/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/README.md b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/README.md similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/README.md rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/README.md diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/Web-AC-control.ino b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/Web-AC-control.ino similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/Web-AC-control.ino rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/Web-AC-control.ino diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/printscreen.png b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/printscreen.png similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/printscreen.png rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/printscreen.png diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/favicon.ico b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/favicon.ico similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/favicon.ico rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/favicon.ico diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_1_off.svg b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_1_off.svg similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_1_off.svg rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_1_off.svg diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_1_on.svg b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_1_on.svg similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_1_on.svg rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_1_on.svg diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_2_off.svg b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_2_off.svg similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_2_off.svg rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_2_off.svg diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_2_on.svg b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_2_on.svg similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_2_on.svg rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_2_on.svg diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_3_off.svg b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_3_off.svg similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_3_off.svg rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_3_off.svg diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_3_on.svg b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_3_on.svg similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_3_on.svg rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_3_on.svg diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_4_off.svg b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_4_off.svg similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_4_off.svg rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_4_off.svg diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_4_on.svg b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_4_on.svg similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/level_4_on.svg rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/level_4_on.svg diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/ui.html b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/ui.html similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/ui.html rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/ui.html diff --git a/lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/ui.js b/lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/ui.js similarity index 100% rename from lib/IRremoteESP8266-2.7.8/examples/Web-AC-control/upload/ui.js rename to lib/IRremoteESP8266-2.7.8.10/examples/Web-AC-control/upload/ui.js diff --git a/lib/IRremoteESP8266-2.7.8/keywords.txt b/lib/IRremoteESP8266-2.7.8.10/keywords.txt similarity index 100% rename from lib/IRremoteESP8266-2.7.8/keywords.txt rename to lib/IRremoteESP8266-2.7.8.10/keywords.txt diff --git a/lib/IRremoteESP8266-2.7.8/library.json b/lib/IRremoteESP8266-2.7.8.10/library.json similarity index 100% rename from lib/IRremoteESP8266-2.7.8/library.json rename to lib/IRremoteESP8266-2.7.8.10/library.json diff --git a/lib/IRremoteESP8266-2.7.8/library.properties b/lib/IRremoteESP8266-2.7.8.10/library.properties similarity index 100% rename from lib/IRremoteESP8266-2.7.8/library.properties rename to lib/IRremoteESP8266-2.7.8.10/library.properties diff --git a/lib/IRremoteESP8266-2.7.8/platformio.ini b/lib/IRremoteESP8266-2.7.8.10/platformio.ini similarity index 100% rename from lib/IRremoteESP8266-2.7.8/platformio.ini rename to lib/IRremoteESP8266-2.7.8.10/platformio.ini diff --git a/lib/IRremoteESP8266-2.7.8/pylintrc b/lib/IRremoteESP8266-2.7.8.10/pylintrc similarity index 100% rename from lib/IRremoteESP8266-2.7.8/pylintrc rename to lib/IRremoteESP8266-2.7.8.10/pylintrc diff --git a/lib/IRremoteESP8266-2.7.8/src/CPPLINT.cfg b/lib/IRremoteESP8266-2.7.8.10/src/CPPLINT.cfg similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/CPPLINT.cfg rename to lib/IRremoteESP8266-2.7.8.10/src/CPPLINT.cfg diff --git a/lib/IRremoteESP8266-2.7.8/src/IRac.cpp b/lib/IRremoteESP8266-2.7.8.10/src/IRac.cpp similarity index 94% rename from lib/IRremoteESP8266-2.7.8/src/IRac.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/IRac.cpp index fda16aba5..4e54d26f0 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRac.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRac.cpp @@ -16,6 +16,7 @@ #include "IRremoteESP8266.h" #include "IRtext.h" #include "IRutils.h" +#include "ir_Airwell.h" #include "ir_Amcor.h" #include "ir_Argo.h" #include "ir_Carrier.h" @@ -34,6 +35,7 @@ #include "ir_Neoclima.h" #include "ir_Panasonic.h" #include "ir_Samsung.h" +#include "ir_Sanyo.h" #include "ir_Sharp.h" #include "ir_Tcl.h" #include "ir_Teco.h" @@ -132,6 +134,9 @@ stdAc::state_t IRac::getStatePrev(void) { return _prev; } /// @return true if the protocol is supported by this class, otherwise false. bool IRac::isProtocolSupported(const decode_type_t protocol) { switch (protocol) { +#if SEND_AIRWELL + case decode_type_t::AIRWELL: +#endif #if SEND_AMCOR case decode_type_t::AMCOR: #endif @@ -236,6 +241,9 @@ bool IRac::isProtocolSupported(const decode_type_t protocol) { #if SEND_SAMSUNG_AC case decode_type_t::SAMSUNG_AC: #endif +#if SEND_SANYO_AC + case decode_type_t::SANYO_AC: +#endif #if SEND_SHARP_AC case decode_type_t::SHARP_AC: #endif @@ -269,6 +277,34 @@ bool IRac::isProtocolSupported(const decode_type_t protocol) { } } +#if SEND_AIRWELL +/// Send an Airwell A/C message with the supplied settings. +/// @param[in, out] ac A Ptr to an IRAirwellAc object to use. +/// @param[in] on The power setting. +/// @param[in] mode The operation mode setting. +/// @param[in] degrees The temperature setting in degrees. +/// @param[in] fan The speed setting for the fan. +void IRac::airwell(IRAirwellAc *ac, + const bool on, const stdAc::opmode_t mode, + const float degrees, const stdAc::fanspeed_t fan) { + ac->begin(); + ac->setPowerToggle(on); + ac->setMode(ac->convertMode(mode)); + ac->setTemp(degrees); + ac->setFan(ac->convertFan(fan)); + // No Swing setting available. + // No Quiet setting available. + // No Light setting available. + // No Filter setting available. + // No Turbo setting available. + // No Economy setting available. + // No Clean setting available. + // No Beep setting available. + // No Sleep setting available. + ac->send(); +} +#endif // SEND_AIRWELL + #if SEND_AMCOR /// Send an Amcor A/C message with the supplied settings. /// @param[in, out] ac A Ptr to an IRAmcorAc object to use. @@ -1231,11 +1267,14 @@ void IRac::lg(IRLgAc *ac, const lg_ac_remote_model_t model, /// @param[in] degrees The temperature setting in degrees. /// @param[in] fan The speed setting for the fan. /// @param[in] swingv The vertical swing setting. +/// @param[in] econo Run the device in economical mode. /// @param[in] sleep Nr. of minutes for sleep mode. -1 is Off, >= 0 is on. +/// @note On Danby A/C units, swingv controls the Ion Filter instead. void IRac::midea(IRMideaAC *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, const int16_t sleep) { + const stdAc::swingv_t swingv, const bool econo, + const int16_t sleep) { ac->begin(); ac->setPower(on); ac->setMode(ac->convertMode(mode)); @@ -1246,6 +1285,7 @@ void IRac::midea(IRMideaAC *ac, // No Horizontal swing setting available. // No Quiet setting available. // No Turbo setting available. + ac->setEconoToggle(econo); // No Light setting available. // No Filter setting available. // No Clean setting available. @@ -1572,6 +1612,45 @@ void IRac::samsung(IRSamsungAc *ac, } #endif // SEND_SAMSUNG_AC +#if SEND_SANYO_AC +/// Send a Toshiba A/C message with the supplied settings. +/// @param[in, out] ac A Ptr to an IRSanyoAc object to use. +/// @param[in] on The power setting. +/// @param[in] mode The operation mode setting. +/// @param[in] degrees The temperature setting in degrees. +/// @param[in] fan The speed setting for the fan. +/// @param[in] swingv The vertical swing setting. +/// @param[in] beep Enable/Disable beeps when receiving IR messages. +/// @param[in] sleep Nr. of minutes for sleep mode. -1 is Off, > 0 is on. +void IRac::sanyo(IRSanyoAc *ac, + const bool on, const stdAc::opmode_t mode, + const float degrees, const stdAc::fanspeed_t fan, + const stdAc::swingv_t swingv, const bool beep, + const int16_t sleep) { + ac->begin(); + ac->setPower(on); + ac->setMode(ac->convertMode(mode)); + ac->setTemp(degrees); + ac->setFan(ac->convertFan(fan)); + ac->setSwingV(ac->convertSwingV(swingv)); + // No Horizontal swing setting available. + // No Quiet setting available. + // No Turbo setting available. + // No Econo setting available. + // No Light setting available. + // No Filter setting available. + // No Clean setting available. + ac->setBeep(beep); + ac->setSleep(sleep >= 0); // Sleep is either on/off, so convert to boolean. + // No Clock setting available. + + // Extra + ac->setSensor(true); // Set the A/C to use the temp sensor in the Unit/Wall. + ac->setSensorTemp(degrees); // Set the sensor temp to the desired temp. + ac->send(); +} +#endif // SEND_SANYO_AC + #if SEND_SHARP_AC /// Send a Sharp A/C message with the supplied settings. /// @note Multiple IR messages may be generated & sent. @@ -1703,18 +1782,26 @@ void IRac::teco(IRTecoAc *ac, /// @param[in] mode The operation mode setting. /// @param[in] degrees The temperature setting in degrees. /// @param[in] fan The speed setting for the fan. +/// @param[in] swingv The vertical swing setting. +/// @param[in] turbo Run the device in turbo/powerful mode. +/// @param[in] econo Run the device in economical mode. void IRac::toshiba(IRToshibaAC *ac, const bool on, const stdAc::opmode_t mode, - const float degrees, const stdAc::fanspeed_t fan) { + const float degrees, const stdAc::fanspeed_t fan, + const stdAc::swingv_t swingv, + const bool turbo, const bool econo) { ac->begin(); ac->setPower(on); ac->setMode(ac->convertMode(mode)); ac->setTemp(degrees); ac->setFan(ac->convertFan(fan)); - // No Vertical swing setting available. + // The API has no "step" option, so off is off, anything else is on. + ac->setSwing((swingv == stdAc::swingv_t::kOff) ? kToshibaAcSwingOff + : kToshibaAcSwingOn); // No Horizontal swing setting available. // No Quiet setting available. - // No Turbo setting available. + ac->setTurbo(turbo); + ac->setEcono(econo); // No Light setting available. // No Filter setting available. // No Clean setting available. @@ -1881,10 +1968,12 @@ stdAc::state_t IRac::handleToggles(const stdAc::state_t desired, case decode_type_t::ELECTRA_AC: result.light = desired.light ^ prev->light; break; + case decode_type_t::MIDEA: + result.econo = desired.econo ^ prev->econo; + // FALL THRU case decode_type_t::CORONA_AC: case decode_type_t::HITACHI_AC344: case decode_type_t::HITACHI_AC424: - case decode_type_t::MIDEA: case decode_type_t::SHARP_AC: if ((desired.swingv == stdAc::swingv_t::kOff) ^ (prev->swingv == stdAc::swingv_t::kOff)) // It changed, so toggle. @@ -1892,6 +1981,7 @@ stdAc::state_t IRac::handleToggles(const stdAc::state_t desired, else result.swingv = stdAc::swingv_t::kOff; // No change, so no toggle. break; + case decode_type_t::AIRWELL: case decode_type_t::DAIKIN64: case decode_type_t::WHIRLPOOL_AC: result.power = desired.power ^ prev->power; @@ -1959,6 +2049,14 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { stdAc::state_t send = this->handleToggles(this->cleanState(desired), prev); // Per vendor settings & setup. switch (send.protocol) { +#if SEND_AIRWELL + case AIRWELL: + { + IRAirwellAc ac(_pin, _inverted, _modulation); + airwell(&ac, send.power, send.mode, degC, send.fanspeed); + break; + } +#endif // SEND_AIRWELL #if SEND_AMCOR case AMCOR: { @@ -2210,7 +2308,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { { IRMideaAC ac(_pin, _inverted, _modulation); midea(&ac, send.power, send.mode, send.celsius, send.degrees, - send.fanspeed, send.swingv, send.sleep); + send.fanspeed, send.swingv, send.econo, send.sleep); break; } #endif // SEND_MIDEA @@ -2288,6 +2386,15 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { break; } #endif // SEND_SAMSUNG_AC +#if SEND_SANYO_AC + case SANYO_AC: + { + IRSanyoAc ac(_pin, _inverted, _modulation); + sanyo(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv, + send.beep, send.sleep); + break; + } +#endif // SEND_SANYO_AC #if SEND_SHARP_AC case SHARP_AC: { @@ -2321,7 +2428,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { case TOSHIBA_AC: { IRToshibaAC ac(_pin, _inverted, _modulation); - toshiba(&ac, send.power, send.mode, degC, send.fanspeed); + toshiba(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv, + send.turbo, send.econo); break; } #endif // SEND_TOSHIBA_AC @@ -2715,16 +2823,23 @@ namespace IRAcUtils { /// An empty string if we can't. String resultAcToString(const decode_results * const result) { switch (result->decode_type) { +#if DECODE_AIRWELL + case decode_type_t::AIRWELL: { + IRAirwellAc ac(kGpioUnused); + ac.setRaw(result->value); // AIRWELL uses value instead of state. + return ac.toString(); + } +#endif // DECODE_AIRWELL #if DECODE_AMCOR case decode_type_t::AMCOR: { - IRAmcorAc ac(0); + IRAmcorAc ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_AMCOR #if DECODE_ARGO case decode_type_t::ARGO: { - IRArgoAC ac(0); + IRArgoAC ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } @@ -2738,49 +2853,49 @@ namespace IRAcUtils { #endif // DECODE_CARRIER_AC64 #if DECODE_DAIKIN case decode_type_t::DAIKIN: { - IRDaikinESP ac(0); + IRDaikinESP ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_DAIKIN #if DECODE_DAIKIN128 case decode_type_t::DAIKIN128: { - IRDaikin128 ac(0); + IRDaikin128 ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_DAIKIN128 #if DECODE_DAIKIN152 case decode_type_t::DAIKIN152: { - IRDaikin152 ac(0); + IRDaikin152 ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_DAIKIN152 #if DECODE_DAIKIN160 case decode_type_t::DAIKIN160: { - IRDaikin160 ac(0); + IRDaikin160 ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_DAIKIN160 #if DECODE_DAIKIN176 case decode_type_t::DAIKIN176: { - IRDaikin176 ac(0); + IRDaikin176 ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_DAIKIN160 #if DECODE_DAIKIN2 case decode_type_t::DAIKIN2: { - IRDaikin2 ac(0); + IRDaikin2 ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_DAIKIN2 #if DECODE_DAIKIN216 case decode_type_t::DAIKIN216: { - IRDaikin216 ac(0); + IRDaikin216 ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } @@ -2801,131 +2916,138 @@ namespace IRAcUtils { #endif // DECODE_DELONGHI_AC #if DECODE_ELECTRA_AC case decode_type_t::ELECTRA_AC: { - IRElectraAc ac(0); + IRElectraAc ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_ELECTRA_AC #if DECODE_FUJITSU_AC case decode_type_t::FUJITSU_AC: { - IRFujitsuAC ac(0); + IRFujitsuAC ac(kGpioUnused); ac.setRaw(result->state, result->bits / 8); return ac.toString(); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR case decode_type_t::KELVINATOR: { - IRKelvinatorAC ac(0); + IRKelvinatorAC ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_KELVINATOR #if DECODE_MITSUBISHI_AC case decode_type_t::MITSUBISHI_AC: { - IRMitsubishiAC ac(0); + IRMitsubishiAC ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_MITSUBISHI_AC #if DECODE_MITSUBISHI112 case decode_type_t::MITSUBISHI112: { - IRMitsubishi112 ac(0); + IRMitsubishi112 ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_MITSUBISHI112 #if DECODE_MITSUBISHI136 case decode_type_t::MITSUBISHI136: { - IRMitsubishi136 ac(0); + IRMitsubishi136 ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_MITSUBISHI136 #if DECODE_MITSUBISHIHEAVY case decode_type_t::MITSUBISHI_HEAVY_88: { - IRMitsubishiHeavy88Ac ac(0); + IRMitsubishiHeavy88Ac ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } case decode_type_t::MITSUBISHI_HEAVY_152: { - IRMitsubishiHeavy152Ac ac(0); + IRMitsubishiHeavy152Ac ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_MITSUBISHIHEAVY #if DECODE_NEOCLIMA case decode_type_t::NEOCLIMA: { - IRNeoclimaAc ac(0); + IRNeoclimaAc ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_NEOCLIMA #if DECODE_TOSHIBA_AC case decode_type_t::TOSHIBA_AC: { - IRToshibaAC ac(0); + IRToshibaAC ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_TOSHIBA_AC #if DECODE_TROTEC case decode_type_t::TROTEC: { - IRTrotecESP ac(0); + IRTrotecESP ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_TROTEC #if DECODE_GOODWEATHER case decode_type_t::GOODWEATHER: { - IRGoodweatherAc ac(0); + IRGoodweatherAc ac(kGpioUnused); ac.setRaw(result->value); // Goodweather uses value instead of state. return ac.toString(); } #endif // DECODE_GOODWEATHER #if DECODE_GREE case decode_type_t::GREE: { - IRGreeAC ac(0); + IRGreeAC ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_GREE #if DECODE_MIDEA case decode_type_t::MIDEA: { - IRMideaAC ac(0); + IRMideaAC ac(kGpioUnused); ac.setRaw(result->value); // Midea uses value instead of state. return ac.toString(); } #endif // DECODE_MIDEA #if DECODE_HAIER_AC case decode_type_t::HAIER_AC: { - IRHaierAC ac(0); + IRHaierAC ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_HAIER_AC #if DECODE_HAIER_AC_YRW02 case decode_type_t::HAIER_AC_YRW02: { - IRHaierACYRW02 ac(0); + IRHaierACYRW02 ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_HAIER_AC_YRW02 #if DECODE_SAMSUNG_AC case decode_type_t::SAMSUNG_AC: { - IRSamsungAc ac(0); + IRSamsungAc ac(kGpioUnused); ac.setRaw(result->state, result->bits / 8); return ac.toString(); } #endif // DECODE_SAMSUNG_AC +#if DECODE_SANYO_AC + case decode_type_t::SANYO_AC: { + IRSanyoAc ac(kGpioUnused); + ac.setRaw(result->state); + return ac.toString(); + } +#endif // DECODE_SANYO_AC #if DECODE_SHARP_AC case decode_type_t::SHARP_AC: { - IRSharpAc ac(0); + IRSharpAc ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_SHARP_AC #if DECODE_COOLIX case decode_type_t::COOLIX: { - IRCoolixAC ac(0); + IRCoolixAC ac(kGpioUnused); ac.on(); ac.setRaw(result->value); // Coolix uses value instead of state. return ac.toString(); @@ -2941,7 +3063,7 @@ namespace IRAcUtils { #if DECODE_PANASONIC_AC case decode_type_t::PANASONIC_AC: { if (result->bits > kPanasonicAcShortBits) { - IRPanasonicAc ac(0); + IRPanasonicAc ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } @@ -2950,7 +3072,7 @@ namespace IRAcUtils { #endif // DECODE_PANASONIC_AC #if DECODE_HITACHI_AC case decode_type_t::HITACHI_AC: { - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } @@ -2971,35 +3093,35 @@ namespace IRAcUtils { #endif // DECODE_HITACHI_AC344 #if DECODE_HITACHI_AC424 case decode_type_t::HITACHI_AC424: { - IRHitachiAc424 ac(0); + IRHitachiAc424 ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_HITACHI_AC424 #if DECODE_WHIRLPOOL_AC case decode_type_t::WHIRLPOOL_AC: { - IRWhirlpoolAc ac(0); + IRWhirlpoolAc ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } #endif // DECODE_WHIRLPOOL_AC #if DECODE_VESTEL_AC case decode_type_t::VESTEL_AC: { - IRVestelAc ac(0); + IRVestelAc ac(kGpioUnused); ac.setRaw(result->value); // Like Coolix, use value instead of state. return ac.toString(); } #endif // DECODE_VESTEL_AC #if DECODE_TECO case decode_type_t::TECO: { - IRTecoAc ac(0); + IRTecoAc ac(kGpioUnused); ac.setRaw(result->value); // Like Coolix, use value instead of state. return ac.toString(); } #endif // DECODE_TECO #if DECODE_TCL112AC case decode_type_t::TCL112AC: { - IRTcl112Ac ac(0); + IRTcl112Ac ac(kGpioUnused); ac.setRaw(result->state); return ac.toString(); } @@ -3007,7 +3129,7 @@ namespace IRAcUtils { #if DECODE_LG case decode_type_t::LG: case decode_type_t::LG2: { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); ac.setRaw(result->value); // Like Coolix, use value instead of state. switch (result->decode_type) { case decode_type_t::LG2: @@ -3040,6 +3162,14 @@ namespace IRAcUtils { ) { if (decode == NULL || result == NULL) return false; // Safety check. switch (decode->decode_type) { +#if DECODE_AIRWELL + case decode_type_t::AIRWELL: { + IRAirwellAc ac(kGpioUnused); + ac.setRaw(decode->value); // Uses value instead of state. + *result = ac.toCommon(); + break; + } +#endif // DECODE_AIRWELL #if DECODE_AMCOR case decode_type_t::AMCOR: { IRAmcorAc ac(kGpioUnused); @@ -3090,7 +3220,7 @@ namespace IRAcUtils { #endif // DECODE_DAIKIN #if DECODE_DAIKIN128 case decode_type_t::DAIKIN128: { - IRDaikin128 ac(0); + IRDaikin128 ac(kGpioUnused); ac.setRaw(decode->state); *result = ac.toCommon(); break; @@ -3098,7 +3228,7 @@ namespace IRAcUtils { #endif // DECODE_DAIKIN128 #if DECODE_DAIKIN152 case decode_type_t::DAIKIN152: { - IRDaikin152 ac(0); + IRDaikin152 ac(kGpioUnused); ac.setRaw(decode->state); *result = ac.toCommon(); break; @@ -3327,6 +3457,14 @@ namespace IRAcUtils { break; } #endif // DECODE_SAMSUNG_AC +#if DECODE_SANYO_AC + case decode_type_t::SANYO_AC: { + IRSanyoAc ac(kGpioUnused); + ac.setRaw(decode->state); + *result = ac.toCommon(); + break; + } +#endif // DECODE_SANYO_AC #if DECODE_SHARP_AC case decode_type_t::SHARP_AC: { IRSharpAc ac(kGpioUnused); diff --git a/lib/IRremoteESP8266-2.7.8/src/IRac.h b/lib/IRremoteESP8266-2.7.8.10/src/IRac.h similarity index 93% rename from lib/IRremoteESP8266-2.7.8/src/IRac.h rename to lib/IRremoteESP8266-2.7.8.10/src/IRac.h index 01365a180..5721f2bd6 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRac.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRac.h @@ -7,6 +7,7 @@ #include #endif #include "IRremoteESP8266.h" +#include "ir_Airwell.h" #include "ir_Amcor.h" #include "ir_Argo.h" #include "ir_Carrier.h" @@ -28,6 +29,7 @@ #include "ir_Neoclima.h" #include "ir_Panasonic.h" #include "ir_Samsung.h" +#include "ir_Sanyo.h" #include "ir_Sharp.h" #include "ir_Tcl.h" #include "ir_Teco.h" @@ -37,9 +39,10 @@ #include "ir_Whirlpool.h" // Constants -const int8_t kGpioUnused = -1; +const int8_t kGpioUnused = -1; ///< A placeholder for not using an actual GPIO. // Class +/// A universal/common/generic interface for controling supported A/Cs. class IRac { public: explicit IRac(const uint16_t pin, const bool inverted = false, @@ -93,10 +96,15 @@ class IRac { private: #endif - uint16_t _pin; - bool _inverted; - bool _modulation; - stdAc::state_t _prev; // The state we expect the device to currently be in. + uint16_t _pin; ///< The GPIO to use to transmit messages from. + bool _inverted; ///< IR LED is lit when GPIO is LOW (true) or HIGH (false)? + bool _modulation; ///< Is frequency modulation to be used? + stdAc::state_t _prev; ///< The state we expect the device to currently be in. +#if SEND_AIRWELL + void airwell(IRAirwellAc *ac, + const bool on, const stdAc::opmode_t mode, const float degrees, + const stdAc::fanspeed_t fan); +#endif // SEND_AIRWELL #if SEND_AMCOR void amcor(IRAmcorAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, @@ -286,7 +294,8 @@ void electra(IRElectraAc *ac, void midea(IRMideaAC *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, const int16_t sleep = -1); + const stdAc::swingv_t swingv, const bool econo, + const int16_t sleep = -1); #endif // SEND_MIDEA #if SEND_MITSUBISHI_AC void mitsubishi(IRMitsubishiAC *ac, @@ -350,6 +359,12 @@ void electra(IRElectraAc *ac, const bool beep, const bool prevpower = true, const bool forcepower = true); #endif // SEND_SAMSUNG_AC +#if SEND_SANYO_AC + void sanyo(IRSanyoAc *ac, + const bool on, const stdAc::opmode_t mode, const float degrees, + const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, + const bool beep, const int16_t sleep = -1); +#endif // SEND_SANYO_AC #if SEND_SHARP_AC void sharp(IRSharpAc *ac, const bool on, const bool prev_power, const stdAc::opmode_t mode, @@ -374,7 +389,8 @@ void electra(IRElectraAc *ac, #if SEND_TOSHIBA_AC void toshiba(IRToshibaAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, - const stdAc::fanspeed_t fan); + const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, + const bool turbo, const bool econo); #endif // SEND_TOSHIBA_AC #if SEND_TROTEC void trotec(IRTrotecESP *ac, @@ -401,6 +417,7 @@ static stdAc::state_t handleToggles(const stdAc::state_t desired, const stdAc::state_t *prev = NULL); }; // IRac class +/// Common functions for use with all A/Cs supported by the IRac class. namespace IRAcUtils { String resultAcToString(const decode_results * const results); bool decodeToState(const decode_results *decode, stdAc::state_t *result, diff --git a/lib/IRremoteESP8266-2.7.8/src/IRrecv.cpp b/lib/IRremoteESP8266-2.7.8.10/src/IRrecv.cpp similarity index 99% rename from lib/IRremoteESP8266-2.7.8/src/IRrecv.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/IRrecv.cpp index efddcc17c..24ea0b021 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRrecv.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRrecv.cpp @@ -614,8 +614,12 @@ bool IRrecv::decode(decode_results *results, irparams_t *save, if (decodeDaikin216(results, offset)) return true; #endif #if DECODE_TOSHIBA_AC - DPRINTLN("Attempting Toshiba AC decode"); + DPRINTLN("Attempting Toshiba AC 72bit decode"); if (decodeToshibaAC(results, offset)) return true; + DPRINTLN("Attempting Toshiba AC 80bit decode"); + if (decodeToshibaAC(results, offset, kToshibaACBitsLong)) return true; + DPRINTLN("Attempting Toshiba AC 56bit decode"); + if (decodeToshibaAC(results, offset, kToshibaACBitsShort)) return true; #endif #if DECODE_MIDEA DPRINTLN("Attempting Midea decode"); @@ -852,6 +856,10 @@ bool IRrecv::decode(decode_results *results, irparams_t *save, DPRINTLN("Attempting Zepeal decode"); if (decodeZepeal(results, offset)) return true; #endif // DECODE_ZEPEAL +#if DECODE_SANYO_AC + DPRINTLN("Attempting Sanyo AC decode"); + if (decodeSanyoAc(results, offset)) return true; +#endif // DECODE_SANYO_AC // Typically new protocols are added above this line. } #if DECODE_HASH diff --git a/lib/IRremoteESP8266-2.7.8/src/IRrecv.h b/lib/IRremoteESP8266-2.7.8.10/src/IRrecv.h similarity index 98% rename from lib/IRremoteESP8266-2.7.8/src/IRrecv.h rename to lib/IRremoteESP8266-2.7.8.10/src/IRrecv.h index 36da8df1b..62cdeed6b 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRrecv.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRrecv.h @@ -283,8 +283,14 @@ class IRrecv { bool decodeSanyoLC7461(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kSanyoLC7461Bits, - bool strict = true); + const bool strict = true); #endif +#if DECODE_SANYO_AC + bool decodeSanyoAc(decode_results *results, + uint16_t offset = kStartOffset, + const uint16_t nbits = kSanyoAcBits, + const bool strict = true); +#endif // DECODE_SANYO_AC #if DECODE_MITSUBISHI bool decodeMitsubishi(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kMitsubishiBits, @@ -469,7 +475,7 @@ class IRrecv { #endif #if DECODE_TOSHIBA_AC bool decodeToshibaAC(decode_results *results, uint16_t offset = kStartOffset, - const uint16_t nbytes = kToshibaACBits, + const uint16_t nbits = kToshibaACBits, const bool strict = true); #endif #if DECODE_TROTEC diff --git a/lib/IRremoteESP8266-2.7.8/src/IRremoteESP8266.h b/lib/IRremoteESP8266-2.7.8.10/src/IRremoteESP8266.h similarity index 98% rename from lib/IRremoteESP8266-2.7.8/src/IRremoteESP8266.h rename to lib/IRremoteESP8266-2.7.8.10/src/IRremoteESP8266.h index 4490baa3b..007645073 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRremoteESP8266.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRremoteESP8266.h @@ -201,6 +201,13 @@ #define SEND_SANYO _IR_ENABLE_DEFAULT_ #endif // SEND_SANYO +#ifndef DECODE_SANYO_AC +#define DECODE_SANYO_AC _IR_ENABLE_DEFAULT_ +#endif // DECODE_SANYO_AC +#ifndef SEND_SANYO_AC +#define SEND_SANYO_AC _IR_ENABLE_DEFAULT_ +#endif // SEND_SANYO_AC + #ifndef DECODE_MITSUBISHI #define DECODE_MITSUBISHI _IR_ENABLE_DEFAULT_ #endif // DECODE_MITSUBISHI @@ -674,7 +681,7 @@ DECODE_NEOCLIMA || DECODE_DAIKIN176 || DECODE_DAIKIN128 || \ DECODE_AMCOR || DECODE_DAIKIN152 || DECODE_MITSUBISHI136 || \ DECODE_MITSUBISHI112 || DECODE_HITACHI_AC424 || DECODE_HITACHI_AC3 || \ - DECODE_HITACHI_AC344 || DECODE_CORONA_AC) + DECODE_HITACHI_AC344 || DECODE_CORONA_AC || DECODE_SANYO_AC) // Add any DECODE to the above if it uses result->state (see kStateSizeMax) // you might also want to add the protocol to hasACState function #define DECODE_AC true // We need some common infrastructure for decoding A/Cs. @@ -802,8 +809,9 @@ enum decode_type_t { CORONA_AC, MIDEA24, ZEPEAL, + SANYO_AC, // Add new entries before this one, and update it to point to the last entry. - kLastDecodeType = ZEPEAL, + kLastDecodeType = SANYO_AC, }; // Message lengths & required repeat values @@ -971,6 +979,8 @@ const uint16_t kSamsungAcBits = kSamsungAcStateLength * 8; const uint16_t kSamsungAcExtendedStateLength = 21; const uint16_t kSamsungAcExtendedBits = kSamsungAcExtendedStateLength * 8; const uint16_t kSamsungAcDefaultRepeat = kNoRepeat; +const uint16_t kSanyoAcStateLength = 9; +const uint16_t kSanyoAcBits = kSanyoAcStateLength * 8; const uint16_t kSanyoSA8650BBits = 12; const uint16_t kSanyoLC7461AddressBits = 13; const uint16_t kSanyoLC7461CommandBits = 8; @@ -999,6 +1009,10 @@ const uint16_t kTecoDefaultRepeat = kNoRepeat; const uint16_t kToshibaACStateLength = 9; const uint16_t kToshibaACBits = kToshibaACStateLength * 8; const uint16_t kToshibaACMinRepeat = kSingleRepeat; +const uint16_t kToshibaACStateLengthShort = kToshibaACStateLength - 2; +const uint16_t kToshibaACBitsShort = kToshibaACStateLengthShort * 8; +const uint16_t kToshibaACStateLengthLong = kToshibaACStateLength + 1; +const uint16_t kToshibaACBitsLong = kToshibaACStateLengthLong * 8; const uint16_t kTrotecStateLength = 9; const uint16_t kTrotecBits = kTrotecStateLength * 8; const uint16_t kTrotecDefaultRepeat = kNoRepeat; diff --git a/lib/IRremoteESP8266-2.7.8/src/IRsend.cpp b/lib/IRremoteESP8266-2.7.8.10/src/IRsend.cpp similarity index 99% rename from lib/IRremoteESP8266-2.7.8/src/IRsend.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/IRsend.cpp index d3e097839..e3537381f 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRsend.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRsend.cpp @@ -721,6 +721,8 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) { return kNeoclimaBits; case SAMSUNG_AC: return kSamsungAcBits; + case SANYO_AC: + return kSanyoAcBits; case SHARP_AC: return kSharpAcBits; case TCL112AC: @@ -1152,6 +1154,11 @@ bool IRsend::send(const decode_type_t type, const uint8_t *state, sendSamsungAC(state, nbytes); break; #endif // SEND_SAMSUNG_AC +#if SEND_SANYO_AC + case SANYO_AC: + sendSanyoAc(state, nbytes); + break; +#endif // SEND_SANYO_AC #if SEND_SHARP_AC case SHARP_AC: sendSharpAc(state, nbytes); diff --git a/lib/IRremoteESP8266-2.7.8/src/IRsend.h b/lib/IRremoteESP8266-2.7.8.10/src/IRsend.h similarity index 99% rename from lib/IRremoteESP8266-2.7.8/src/IRsend.h rename to lib/IRremoteESP8266-2.7.8.10/src/IRsend.h index fe206583f..0b237ecc0 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRsend.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRsend.h @@ -294,6 +294,11 @@ class IRsend { const uint16_t nbits = kSanyoLC7461Bits, const uint16_t repeat = kNoRepeat); #endif +#if SEND_SANYO_AC + void sendSanyoAc(const uint8_t *data, + const uint16_t nbytes = kSanyoAcStateLength, + const uint16_t repeat = kNoRepeat); +#endif // SEND_SANYO_AC #if SEND_DISH // sendDISH() should typically be called with repeat=3 as DISH devices // expect the code to be sent at least 4 times. (code + 3 repeats = 4 codes) @@ -461,7 +466,7 @@ class IRsend { uint16_t repeat = kNoRepeat); #endif #if SEND_TOSHIBA_AC - void sendToshibaAC(const unsigned char data[], + void sendToshibaAC(const uint8_t data[], const uint16_t nbytes = kToshibaACStateLength, const uint16_t repeat = kToshibaACMinRepeat); #endif diff --git a/lib/IRremoteESP8266-2.7.8/src/IRtext.cpp b/lib/IRremoteESP8266-2.7.8.10/src/IRtext.cpp similarity index 99% rename from lib/IRremoteESP8266-2.7.8/src/IRtext.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/IRtext.cpp index 7af2ffd0b..80e39b0a1 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRtext.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRtext.cpp @@ -130,6 +130,7 @@ const PROGMEM char* kTopStr = D_STR_TOP; ///< "Top" const PROGMEM char* kBottomStr = D_STR_BOTTOM; ///< "Bottom" // Compound words/phrases/descriptions from pre-defined words. +const PROGMEM char* kEconoToggleStr = D_STR_ECONOTOGGLE; ///< "Econo Toggle" const PROGMEM char* kEyeAutoStr = D_STR_EYEAUTO; ///< "Eye Auto" const PROGMEM char* kLightToggleStr = D_STR_LIGHTTOGGLE; ///< "Light Toggle" const PROGMEM char* kOutsideQuietStr = D_STR_OUTSIDEQUIET; ///< "Outside Quiet" @@ -264,5 +265,6 @@ const PROGMEM char *kAllProtocolNamesStr = D_STR_CORONA_AC "\x0" D_STR_MIDEA24 "\x0" D_STR_ZEPEAL "\x0" + D_STR_SANYO_AC "\x0" ///< New protocol strings should be added just above this line. "\x0"; ///< This string requires double null termination. diff --git a/lib/IRremoteESP8266-2.7.8/src/IRtext.h b/lib/IRremoteESP8266-2.7.8.10/src/IRtext.h similarity index 99% rename from lib/IRremoteESP8266-2.7.8/src/IRtext.h rename to lib/IRremoteESP8266-2.7.8.10/src/IRtext.h index 57ba2858b..73b42edc1 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRtext.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRtext.h @@ -45,6 +45,7 @@ extern const char* kDisplayTempStr; extern const char* kDownStr; extern const char* kDryStr; extern const char* kEconoStr; +extern const char* kEconoToggleStr; extern const char* kEyeAutoStr; extern const char* kEyeStr; extern const char* kFalseStr; @@ -104,10 +105,10 @@ extern const char* kOnStr; extern const char* kOnTimerStr; extern const char* kOutsideQuietStr; extern const char* kOutsideStr; +extern const char* kPowerButtonStr; extern const char* kPowerfulStr; extern const char* kPowerStr; extern const char* kPowerToggleStr; -extern const char* kPowerButtonStr; extern const char* kPreviousPowerStr; extern const char* kProtocolStr; extern const char* kPurifyStr; diff --git a/lib/IRremoteESP8266-2.7.8/src/IRtimer.cpp b/lib/IRremoteESP8266-2.7.8.10/src/IRtimer.cpp similarity index 93% rename from lib/IRremoteESP8266-2.7.8/src/IRtimer.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/IRtimer.cpp index edd98a2d7..e1f098b28 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRtimer.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRtimer.cpp @@ -14,7 +14,7 @@ uint32_t _TimerMs_unittest_now = 0; /// Class constructor. IRtimer::IRtimer() { reset(); } -/// Resets the IRtimer object. +/// Resets the IRtimer object. I.e. The counter starts again from now. void IRtimer::reset() { #ifndef UNIT_TEST start = micros(); @@ -47,7 +47,7 @@ void IRtimer::add(uint32_t usecs) { _IRtimer_unittest_now += usecs; } /// Class constructor. TimerMs::TimerMs() { reset(); } -/// Resets the TimerMs object. +/// Resets the TimerMs object. I.e. The counter starts again from now. void TimerMs::reset() { #ifndef UNIT_TEST start = millis(); diff --git a/lib/IRremoteESP8266-2.7.8/src/IRtimer.h b/lib/IRremoteESP8266-2.7.8.10/src/IRtimer.h similarity index 67% rename from lib/IRremoteESP8266-2.7.8/src/IRtimer.h rename to lib/IRremoteESP8266-2.7.8.10/src/IRtimer.h index 1a2215fd5..659819d8f 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRtimer.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRtimer.h @@ -8,7 +8,7 @@ // Classes -/// This class performs a simple timer in useconds since instantiated. +/// This class offers a simple counter in micro-seconds since instantiated. /// @note Handles when the system timer wraps around (once). class IRtimer { public: @@ -20,10 +20,10 @@ class IRtimer { #endif // UNIT_TEST private: - uint32_t start; + uint32_t start; ///< Time in uSeconds when the class was instantiated/reset. }; -/// This class performs a simple timer in milli-seoncds since instantiated. +/// This class offers a simple counter in milli-seconds since instantiated. /// @note Handles when the system timer wraps around (once). class TimerMs { public: @@ -35,6 +35,6 @@ class TimerMs { #endif // UNIT_TEST private: - uint32_t start; + uint32_t start; ///< Time in mSeconds when the class was instantiated/reset. }; #endif // IRTIMER_H_ diff --git a/lib/IRremoteESP8266-2.7.8/src/IRutils.cpp b/lib/IRremoteESP8266-2.7.8.10/src/IRutils.cpp similarity index 96% rename from lib/IRremoteESP8266-2.7.8/src/IRutils.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/IRutils.cpp index 9393fcf2d..beec2fbfb 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRutils.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRutils.cpp @@ -161,6 +161,7 @@ bool hasACState(const decode_type_t protocol) { case NEOCLIMA: case PANASONIC_AC: case SAMSUNG_AC: + case SANYO_AC: case SHARP_AC: case TCL112AC: case TOSHIBA_AC: @@ -915,4 +916,35 @@ namespace irutils { // Merge in the data. *dst |= ((data & mask) << offset); } + + /// Create byte pairs where the second byte of the pair is a bit + /// inverted/flipped copy of the first/previous byte of the pair. + /// @param[in,out] ptr A pointer to the start of array to modify. + /// @param[in] length The byte size of the array. + /// @note A length of `<= 1` will do nothing. + /// @return A ptr to the modified array. + uint8_t * invertBytePairs(uint8_t *ptr, const uint16_t length) { + for (uint16_t i = 1; i < length; i += 2) { + // Code done this way to avoid a compiler warning bug. + uint8_t inv = ~*(ptr + i - 1); + *(ptr + i) = inv; + } + return ptr; + } + + /// Check an array to see if every second byte of a pair is a bit + /// inverted/flipped copy of the first/previous byte of the pair. + /// @param[in] ptr A pointer to the start of array to check. + /// @param[in] length The byte size of the array. + /// @note A length of `<= 1` will always return true. + /// @return true, if every second byte is inverted. Otherwise false. + bool checkInvertedBytePairs(const uint8_t * const ptr, + const uint16_t length) { + for (uint16_t i = 1; i < length; i += 2) { + // Code done this way to avoid a compiler warning bug. + uint8_t inv = ~*(ptr + i - 1); + if (*(ptr + i) != inv) return false; + } + return true; + } } // namespace irutils diff --git a/lib/IRremoteESP8266-2.7.8/src/IRutils.h b/lib/IRremoteESP8266-2.7.8.10/src/IRutils.h similarity index 97% rename from lib/IRremoteESP8266-2.7.8/src/IRutils.h rename to lib/IRremoteESP8266-2.7.8.10/src/IRutils.h index 3c865dfcf..a3320ae93 100644 --- a/lib/IRremoteESP8266-2.7.8/src/IRutils.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/IRutils.h @@ -107,5 +107,7 @@ namespace irutils { const uint32_t data); void setBits(uint64_t * const dst, const uint8_t offset, const uint8_t nbits, const uint64_t data); + uint8_t * invertBytePairs(uint8_t *ptr, const uint16_t length); + bool checkInvertedBytePairs(const uint8_t * const ptr, const uint16_t length); } // namespace irutils #endif // IRUTILS_H_ diff --git a/lib/IRremoteESP8266-2.7.8/src/i18n.h b/lib/IRremoteESP8266-2.7.8.10/src/i18n.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/i18n.h rename to lib/IRremoteESP8266-2.7.8.10/src/i18n.h diff --git a/lib/IRremoteESP8266-2.7.8.10/src/ir_Airwell.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Airwell.cpp new file mode 100644 index 000000000..106e9c7bf --- /dev/null +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Airwell.cpp @@ -0,0 +1,281 @@ +// Copyright 2020 David Conran +#include "ir_Airwell.h" +#include +#include "IRrecv.h" +#include "IRsend.h" +#include "IRtext.h" +#include "IRutils.h" + +/// @file +/// @brief Airwell "Manchester code" based protocol. +/// Some other Airwell products use the COOLIX protocol. + +const uint8_t kAirwellOverhead = 4; +const uint16_t kAirwellHalfClockPeriod = 950; // uSeconds +const uint16_t kAirwellHdrMark = 3 * kAirwellHalfClockPeriod; // uSeconds +const uint16_t kAirwellHdrSpace = 3 * kAirwellHalfClockPeriod; // uSeconds +const uint16_t kAirwellFooterMark = 5 * kAirwellHalfClockPeriod; // uSeconds + +using irutils::addBoolToString; +using irutils::addModeToString; +using irutils::addFanToString; +using irutils::addTempToString; +using irutils::setBit; +using irutils::setBits; + +#if SEND_AIRWELL +/// Send an Airwell Manchester Code formatted message. +/// Status: BETA / Appears to be working. +/// @param[in] data The message to be sent. +/// @param[in] nbits The number of bits of the message to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1069 +void IRsend::sendAirwell(uint64_t data, uint16_t nbits, uint16_t repeat) { + // Header + Data + sendManchester(kAirwellHdrMark, kAirwellHdrMark, kAirwellHalfClockPeriod, + 0, 0, data, nbits, 38000, true, repeat, kDutyDefault, false); + // Footer + mark(kAirwellHdrMark + kAirwellHalfClockPeriod); + space(kDefaultMessageGap); // A guess. +} +#endif + +#if DECODE_AIRWELL +/// Decode the supplied Airwell "Manchester code" message. +/// +/// Status: BETA / Appears to be working. +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// result. +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1069 +bool IRrecv::decodeAirwell(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (results->rawlen < nbits + kAirwellOverhead - offset) + return false; // Too short a message to match. + + // Compliance + if (strict && nbits != kAirwellBits) + return false; // Doesn't match our protocol defn. + + // Header #1 + Data #1 + Footer #1 (There are total of 3 sections) + uint16_t used = matchManchester(results->rawbuf + offset, &results->value, + results->rawlen - offset, nbits, + kAirwellHdrMark, kAirwellHdrMark, + kAirwellHalfClockPeriod, + kAirwellHdrMark, kAirwellHdrSpace, + true, kUseDefTol, kMarkExcess, true, false); + if (used == 0) return false; + offset += used; + + // Success + results->decode_type = decode_type_t::AIRWELL; + results->bits = nbits; + results->address = 0; + results->command = 0; + return true; +} +#endif + +/// Class constructor +/// @param[in] pin GPIO to be used when sending. +/// @param[in] inverted Is the output signal to be inverted? +/// @param[in] use_modulation Is frequency modulation to be used? +IRAirwellAc::IRAirwellAc(const uint16_t pin, const bool inverted, + const bool use_modulation) + : _irsend(pin, inverted, use_modulation) { stateReset(); } + +/// Set up hardware to be able to send a message. +void IRAirwellAc::begin(void) { _irsend.begin(); } + +/// Get the raw state of the object, suitable to be sent with the appropriate +/// IRsend object method. +/// @return A copy of the internal state. +uint64_t IRAirwellAc::getRaw(void) { + return remote_state; +} + +/// Set the raw state of the object. +/// @param[in] state The raw state from the native IR message. +void IRAirwellAc::setRaw(const uint64_t state) { + remote_state = state; +} + +#if SEND_AIRWELL +/// Send the current internal state as an IR message. +/// @param[in] repeat Nr. of times the message will be repeated. +void IRAirwellAc::send(const uint16_t repeat) { + _irsend.sendAirwell(getRaw(), kAirwellBits, repeat); +} +#endif // SEND_AIRWELL + +/// Reset the internals of the object to a known good state. +void IRAirwellAc::stateReset(void) { + remote_state = kAirwellKnownGoodState; +} + +/// Turn on/off the Power Airwell setting. +/// @param[in] on The desired setting state. +void IRAirwellAc::setPowerToggle(const bool on) { + setBit(&remote_state, kAirwellPowerToggleBit, on); +} + +/// Get the power toggle setting from the internal state. +/// @return A boolean indicating the setting. +bool IRAirwellAc::getPowerToggle(void) { + return GETBIT64(remote_state, kAirwellPowerToggleBit); +} + +/// Get the current operation mode setting. +/// @return The current operation mode. +uint8_t IRAirwellAc::getMode(void) { + return GETBITS64(remote_state, kAirwellModeOffset, kAirwellModeSize); +} + +/// Set the desired operation mode. +/// @param[in] mode The desired operation mode. +void IRAirwellAc::setMode(const uint8_t mode) { + switch (mode) { + case kAirwellFan: + case kAirwellCool: + case kAirwellHeat: + case kAirwellDry: + case kAirwellAuto: + setBits(&remote_state, kAirwellModeOffset, kAirwellModeSize, mode); + break; + default: + setMode(kAirwellAuto); + } + setFan(getFan()); // Ensure the fan is at the correct speed for the new mode. +} + +/// Convert a stdAc::opmode_t enum into its native mode. +/// @param[in] mode The enum to be converted. +/// @return The native equivilant of the enum. +uint8_t IRAirwellAc::convertMode(const stdAc::opmode_t mode) { + switch (mode) { + case stdAc::opmode_t::kCool: return kAirwellCool; + case stdAc::opmode_t::kHeat: return kAirwellHeat; + case stdAc::opmode_t::kDry: return kAirwellDry; + case stdAc::opmode_t::kFan: return kAirwellFan; + default: return kAirwellAuto; + } +} + +/// Convert a native mode into its stdAc equivilant. +/// @param[in] mode The native setting to be converted. +/// @return The stdAc equivilant of the native setting. +stdAc::opmode_t IRAirwellAc::toCommonMode(const uint8_t mode) { + switch (mode) { + case kAirwellCool: return stdAc::opmode_t::kCool; + case kAirwellHeat: return stdAc::opmode_t::kHeat; + case kAirwellDry: return stdAc::opmode_t::kDry; + case kAirwellFan: return stdAc::opmode_t::kFan; + default: return stdAc::opmode_t::kAuto; + } +} + +/// Set the speed of the fan. +/// @param[in] speed The desired setting. +/// @note The speed is locked to Low when in Dry mode. +void IRAirwellAc::setFan(const uint8_t speed) { + setBits(&remote_state, kAirwellFanOffset, kAirwellFanSize, + (getMode() == kAirwellDry) ? kAirwellFanLow + : std::min(speed, kAirwellFanAuto)); +} + +/// Get the current fan speed setting. +/// @return The current fan speed. +uint8_t IRAirwellAc::getFan(void) { + return GETBITS64(remote_state, kAirwellFanOffset, kAirwellFanSize); +} + +/// Convert a stdAc::fanspeed_t enum into it's native speed. +/// @param[in] speed The enum to be converted. +/// @return The native equivilant of the enum. +uint8_t IRAirwellAc::convertFan(const stdAc::fanspeed_t speed) { + switch (speed) { + case stdAc::fanspeed_t::kMin: + case stdAc::fanspeed_t::kLow: + return kAirwellFanLow; + case stdAc::fanspeed_t::kMedium: + return kAirwellFanMedium; + case stdAc::fanspeed_t::kHigh: + case stdAc::fanspeed_t::kMax: + return kAirwellFanHigh; + default: + return kAirwellFanAuto; + } +} + +/// Convert a native fan speed into its stdAc equivilant. +/// @param[in] speed The native setting to be converted. +/// @return The stdAc equivilant of the native setting. +stdAc::fanspeed_t IRAirwellAc::toCommonFanSpeed(const uint8_t speed) { + switch (speed) { + case kAirwellFanHigh: return stdAc::fanspeed_t::kMax; + case kAirwellFanMedium: return stdAc::fanspeed_t::kMedium; + case kAirwellFanLow: return stdAc::fanspeed_t::kMin; + default: return stdAc::fanspeed_t::kAuto; + } +} + +/// Set the temperature. +/// @param[in] degrees The temperature in degrees celsius. +void IRAirwellAc::setTemp(const uint8_t degrees) { + uint8_t temp = std::max(kAirwellMinTemp, degrees); + temp = std::min(kAirwellMaxTemp, temp); + setBits(&remote_state, kAirwellTempOffset, kAirwellTempSize, + temp - kAirwellMinTemp + 1); +} + +/// Get the current temperature setting. +/// @return Get current setting for temp. in degrees celsius. +uint8_t IRAirwellAc::getTemp(void) { + return GETBITS64(remote_state, kAirwellTempOffset, + kAirwellTempSize) + kAirwellMinTemp - 1; +} + +/// Convert the current internal state into its stdAc::state_t equivilant. +/// @return The stdAc equivilant of the native settings. +stdAc::state_t IRAirwellAc::toCommon(void) { + stdAc::state_t result; + result.protocol = decode_type_t::AIRWELL; + result.power = getPowerToggle(); + result.mode = toCommonMode(getMode()); + result.celsius = true; + result.degrees = getTemp(); + result.fanspeed = toCommonFanSpeed(getFan()); + // Not supported. + result.model = -1; + result.turbo = false; + result.swingv = stdAc::swingv_t::kOff; + result.swingh = stdAc::swingh_t::kOff; + result.light = false; + result.filter = false; + result.econo = false; + result.quiet = false; + result.clean = false; + result.beep = false; + result.sleep = -1; + result.clock = -1; + return result; +} + +/// Convert the current internal state into a human readable string. +/// @return A human readable string. +String IRAirwellAc::toString(void) { + String result = ""; + result.reserve(70); // Reserve some heap for the string to reduce fragging. + result += addBoolToString(getPowerToggle(), kPowerToggleStr, false); + result += addModeToString(getMode(), kAirwellAuto, kAirwellCool, + kAirwellHeat, kAirwellDry, kAirwellFan); + result += addFanToString(getFan(), kAirwellFanHigh, kAirwellFanLow, + kAirwellFanAuto, kAirwellFanAuto, + kAirwellFanMedium); + result += addTempToString(getTemp()); + return result; +} diff --git a/lib/IRremoteESP8266-2.7.8.10/src/ir_Airwell.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Airwell.h new file mode 100644 index 000000000..3ffbd21c7 --- /dev/null +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Airwell.h @@ -0,0 +1,97 @@ +// Copyright 2020 David Conran + +/// @file +/// @brief Airwell "Manchester code" based protocol. +/// Some other Airwell products use the COOLIX protocol. + +// Supports: +// Brand: Airwell, Model: RC08W remote +// Brand: Airwell, Model: RC04 remote +// Brand: Airwell, Model: DLS 21 DCI R410 AW A/C + +#ifndef IR_AIRWELL_H_ +#define IR_AIRWELL_H_ + +#define __STDC_LIMIT_MACROS +#include +#ifndef UNIT_TEST +#include +#endif +#include "IRremoteESP8266.h" +#include "IRsend.h" +#ifdef UNIT_TEST +#include "IRsend_test.h" +#endif + + +// Constants +const uint64_t kAirwellKnownGoodState = 0x140500002; // Mode Fan, Speed 1, 25C +// Temperature +const uint8_t kAirwellMinTemp = 16; // Celsius +const uint8_t kAirwellMaxTemp = 30; // Celsius +const uint8_t kAirwellTempSize = 4; // Bits +const uint8_t kAirwellTempOffset = 19; // 0b1111 << 19 +// Fan +const uint8_t kAirwellFanSize = 2; // Bits +const uint8_t kAirwellFanOffset = 28; // 0b11 << 28 +const uint8_t kAirwellFanLow = 0; // 0b00 +const uint8_t kAirwellFanMedium = 1; // 0b01 +const uint8_t kAirwellFanHigh = 2; // 0b10 +const uint8_t kAirwellFanAuto = 3; // 0b11 +// Modes +const uint8_t kAirwellModeSize = 3; // Bits +const uint8_t kAirwellModeOffset = 30; // 0b111 << 30 +const uint8_t kAirwellCool = 1; // 0b001 +const uint8_t kAirwellHeat = 2; // 0b010 +const uint8_t kAirwellAuto = 3; // 0b011 +const uint8_t kAirwellDry = 4; // 0b100 +const uint8_t kAirwellFan = 5; // 0b101 +// Power +const uint8_t kAirwellPowerToggleBit = 33; // 0b1 << 33 + + +// Classes +/// Class for handling detailed Airwell A/C messages. +class IRAirwellAc { + public: + explicit IRAirwellAc(const uint16_t pin, const bool inverted = false, + const bool use_modulation = true); + void stateReset(); +#if SEND_AIRWELL + void send(const uint16_t repeat = kAirwellMinRepeats); + /// Run the calibration to calculate uSec timing offsets for this platform. + /// @return The uSec timing offset needed per modulation of the IR Led. + /// @note This will produce a 65ms IR signal pulse at 38kHz. + /// Only ever needs to be run once per object instantiation, if at all. + int8_t calibrate(void) { return _irsend.calibrate(); } +#endif // SEND_AIRWELL + void begin(); + void setPowerToggle(const bool on); + bool getPowerToggle(); + void setTemp(const uint8_t temp); + uint8_t getTemp(); + void setFan(const uint8_t speed); + uint8_t getFan(); + void setMode(const uint8_t mode); + uint8_t getMode(); + uint64_t getRaw(); + void setRaw(const uint64_t state); + uint8_t convertMode(const stdAc::opmode_t mode); + uint8_t convertFan(const stdAc::fanspeed_t speed); + static stdAc::opmode_t toCommonMode(const uint8_t mode); + static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); + stdAc::state_t toCommon(void); + String toString(); +#ifndef UNIT_TEST + + private: + IRsend _irsend; ///< Instance of the IR send class +#else + /// @cond IGNORE + IRsendTest _irsend; ///< Instance of the testing IR send class + /// @endcond +#endif + uint64_t remote_state; // The state of the IR remote in native IR code form. + void checksum(void); +}; +#endif // IR_AIRWELL_H_ diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Aiwa.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Aiwa.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Aiwa.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Aiwa.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Amcor.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Amcor.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Amcor.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Amcor.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Amcor.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Amcor.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Amcor.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Amcor.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Argo.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Argo.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Argo.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Argo.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Argo.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Argo.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Argo.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Argo.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Carrier.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Carrier.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Carrier.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Carrier.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Carrier.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Carrier.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Carrier.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Carrier.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Coolix.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Coolix.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Coolix.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Coolix.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Coolix.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Coolix.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Coolix.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Coolix.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Corona.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Corona.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Corona.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Corona.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Corona.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Corona.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Corona.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Corona.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Daikin.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Daikin.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Daikin.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Daikin.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Daikin.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Daikin.h similarity index 99% rename from lib/IRremoteESP8266-2.7.8/src/ir_Daikin.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Daikin.h index 8c11dfb9f..35e62302b 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Daikin.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Daikin.h @@ -598,7 +598,7 @@ class IRDaikinESP { }; /// Class for handling detailed Daikin 312-bit A/C messages. -/// Code by crankyoldgit, Reverse engineering analysis by sheppy99 +/// @note Code by crankyoldgit, Reverse engineering analysis by sheppy99 class IRDaikin2 { public: explicit IRDaikin2(const uint16_t pin, const bool inverted = false, @@ -859,8 +859,7 @@ class IRDaikin176 { }; /// Class for handling detailed Daikin 128-bit A/C messages. -/// Code by crankyoldgit. -/// Analysis by Daniel Vena +/// @note Code by crankyoldgit. Analysis by Daniel Vena class IRDaikin128 { public: explicit IRDaikin128(const uint16_t pin, const bool inverted = false, diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Delonghi.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Delonghi.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Delonghi.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Delonghi.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Delonghi.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Delonghi.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Delonghi.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Delonghi.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Denon.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Denon.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Denon.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Denon.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Dish.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Dish.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Dish.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Dish.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Doshisha.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Doshisha.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Doshisha.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Doshisha.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Electra.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Electra.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Electra.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Electra.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Electra.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Electra.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Electra.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Electra.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Epson.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Epson.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Epson.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Epson.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Fujitsu.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Fujitsu.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Fujitsu.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Fujitsu.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Fujitsu.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Fujitsu.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Fujitsu.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Fujitsu.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_GICable.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_GICable.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_GICable.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_GICable.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_GlobalCache.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_GlobalCache.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_GlobalCache.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_GlobalCache.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Goodweather.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Goodweather.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Goodweather.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Goodweather.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Goodweather.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Goodweather.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Goodweather.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Goodweather.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Gree.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Gree.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Gree.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Gree.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Gree.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Gree.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Gree.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Gree.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Haier.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Haier.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Haier.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Haier.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Haier.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Haier.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Haier.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Haier.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Hitachi.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Hitachi.cpp similarity index 99% rename from lib/IRremoteESP8266-2.7.8/src/ir_Hitachi.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Hitachi.cpp index 368f9995a..68d562fce 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Hitachi.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Hitachi.cpp @@ -52,6 +52,8 @@ using irutils::addModeToString; using irutils::addModelToString; using irutils::addFanToString; using irutils::addTempToString; +using irutils::checkInvertedBytePairs; +using irutils::invertBytePairs; using irutils::minsToString; using irutils::setBit; using irutils::setBits; @@ -1047,8 +1049,7 @@ void IRHitachiAc424::stateReset(void) { /// Update the internal consistency check for the protocol. void IRHitachiAc424::setInvertedStates(void) { - for (uint8_t i = 3; i < kHitachiAc424StateLength - 1; i += 2) - remote_state[i + 1] = ~remote_state[i]; + invertBytePairs(remote_state + 3, kHitachiAc424StateLength - 3); } /// Set up hardware to be able to send a message. @@ -1402,8 +1403,7 @@ void IRHitachiAc3::stateReset(void) { /// @param[in] length The size of the state array. /// @note This is this protocols integrity check. void IRHitachiAc3::setInvertedStates(const uint16_t length) { - for (uint8_t i = 3; i < length - 1; i += 2) - remote_state[i + 1] = ~remote_state[i]; + if (length > 3) invertBytePairs(remote_state + 3, length - 3); } /// Check if every second byte of the state, after the fixed header @@ -1413,9 +1413,7 @@ void IRHitachiAc3::setInvertedStates(const uint16_t length) { /// @note This is this protocols integrity check. bool IRHitachiAc3::hasInvertedStates(const uint8_t state[], const uint16_t length) { - for (uint8_t i = 3; i < length - 1; i += 2) - if ((state[i + 1] ^ state[i]) != 0xFF) return false; - return true; + return (length <= 3 || checkInvertedBytePairs(state + 3, length - 3)); } /// Set up hardware to be able to send a message. diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Hitachi.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Hitachi.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Hitachi.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Hitachi.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Inax.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Inax.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Inax.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Inax.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_JVC.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_JVC.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_JVC.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_JVC.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Kelvinator.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Kelvinator.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Kelvinator.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Kelvinator.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Kelvinator.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Kelvinator.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Kelvinator.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Kelvinator.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_LG.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_LG.cpp similarity index 98% rename from lib/IRremoteESP8266-2.7.8/src/ir_LG.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_LG.cpp index 65fe91883..40b141176 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_LG.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_LG.cpp @@ -400,6 +400,7 @@ uint8_t IRLgAc::getTemp(void) { void IRLgAc::setFan(const uint8_t speed) { switch (speed) { case kLgAcFanAuto: + case kLgAcFanLowest: case kLgAcFanLow: case kLgAcFanMedium: case kLgAcFanHigh: @@ -469,12 +470,12 @@ stdAc::opmode_t IRLgAc::toCommonMode(const uint8_t mode) { /// @return The native equivilant of the enum. uint8_t IRLgAc::convertFan(const stdAc::fanspeed_t speed) { switch (speed) { - case stdAc::fanspeed_t::kMin: + case stdAc::fanspeed_t::kMin: return kLgAcFanLowest; 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; + case stdAc::fanspeed_t::kMax: return kLgAcFanHigh; + default: return kLgAcFanAuto; } } @@ -486,6 +487,7 @@ stdAc::fanspeed_t IRLgAc::toCommonFanSpeed(const uint8_t speed) { case kLgAcFanHigh: return stdAc::fanspeed_t::kMax; case kLgAcFanMedium: return stdAc::fanspeed_t::kMedium; case kLgAcFanLow: return stdAc::fanspeed_t::kLow; + case kLgAcFanLowest: return stdAc::fanspeed_t::kMin; default: return stdAc::fanspeed_t::kAuto; } } @@ -528,7 +530,7 @@ String IRLgAc::toString(void) { kLgAcHeat, kLgAcDry, kLgAcFan); result += addTempToString(getTemp()); result += addFanToString(getFan(), kLgAcFanHigh, kLgAcFanLow, - kLgAcFanAuto, kLgAcFanAuto, kLgAcFanMedium); + kLgAcFanAuto, kLgAcFanLowest, kLgAcFanMedium); } return result; } diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_LG.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_LG.h similarity index 97% rename from lib/IRremoteESP8266-2.7.8/src/ir_LG.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_LG.h index bf0cdd0b6..1748d143e 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_LG.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_LG.h @@ -32,7 +32,8 @@ 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 kLgAcFanLowest = 0; // 0b000 +const uint8_t kLgAcFanLow = 1; // 0b001 const uint8_t kLgAcFanMedium = 2; // 0b010 const uint8_t kLgAcFanHigh = 4; // 0b100 const uint8_t kLgAcFanAuto = 5; // 0b101 diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Lasertag.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Lasertag.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Lasertag.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Lasertag.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Lego.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Lego.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Lego.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Lego.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Lutron.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Lutron.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Lutron.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Lutron.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_MWM.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_MWM.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_MWM.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_MWM.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Magiquest.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Magiquest.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Magiquest.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Magiquest.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Magiquest.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Magiquest.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Magiquest.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Magiquest.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Midea.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Midea.cpp similarity index 92% rename from lib/IRremoteESP8266-2.7.8/src/ir_Midea.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Midea.cpp index 5d270d3d4..d02088cef 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Midea.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Midea.cpp @@ -3,7 +3,9 @@ /// @brief Support for Midea protocols. /// Midea added by crankyoldgit & bwze. /// send: bwze/crankyoldgit, decode: crankyoldgit +/// @note SwingV has the function of an Ion Filter on Danby A/C units. /// @see https://docs.google.com/spreadsheets/d/1TZh4jWrx4h9zzpYUI9aYXMl1fYOiqu-xVuOOMqagxrs/edit?usp=sharing +/// @see https://github.com/crankyoldgit/IRremoteESP8266/pull/1213 #include "ir_Midea.h" #include "ir_NEC.h" @@ -99,6 +101,7 @@ void IRMideaAC::stateReset(void) { // Power On, Mode Auto, Fan Auto, Temp = 25C/77F remote_state = 0xA1826FFFFF62; _SwingVToggle = false; + _EconoToggle = false; } /// Set up hardware to be able to send a message. @@ -110,11 +113,14 @@ void IRMideaAC::begin(void) { _irsend.begin(); } void IRMideaAC::send(const uint16_t repeat) { this->checksum(); // Ensure correct checksum before sending. _irsend.sendMidea(remote_state, kMideaBits, repeat); - // Handle toggling the swing if we need to. - if (_SwingVToggle && !isSwingVToggle()) { + // Handle toggling the swing & econo mode if we need to. + if (_SwingVToggle && !isSwingVToggle()) _irsend.sendMidea(kMideaACToggleSwingV, kMideaBits, repeat); - } - _SwingVToggle = false; // The toggle message has been sent, so reset. + if (_EconoToggle && !isEconoToggle()) + _irsend.sendMidea(kMideaACToggleEcono, kMideaBits, repeat); + // The toggle messages has been sent, so reset. + _SwingVToggle = false; + _EconoToggle = false; } #endif // SEND_MIDEA @@ -246,22 +252,42 @@ bool IRMideaAC::getSleep(void) { } /// Set the A/C to toggle the vertical swing toggle for the next send. +/// @note On Danby A/C units, this is associated with the Ion Filter instead. /// @param[in] on true, the setting is on. false, the setting is off. void IRMideaAC::setSwingVToggle(const bool on) { _SwingVToggle = on; } /// Is the current state a vertical swing toggle message? +/// @note On Danby A/C units, this is associated with the Ion Filter instead. /// @return true, it is. false, it isn't. bool IRMideaAC::isSwingVToggle(void) { return remote_state == kMideaACToggleSwingV; } // Get the vertical swing toggle state of the A/C. +/// @note On Danby A/C units, this is associated with the Ion Filter instead. /// @return true, the setting is on. false, the setting is off. bool IRMideaAC::getSwingVToggle(void) { _SwingVToggle |= isSwingVToggle(); return _SwingVToggle; } +/// Set the A/C to toggle the Econo (energy saver) mode for the next send. +/// @param[in] on true, the setting is on. false, the setting is off. +void IRMideaAC::setEconoToggle(const bool on) { _EconoToggle = on; } + +/// Is the current state an Econo (energy saver) toggle message? +/// @return true, it is. false, it isn't. +bool IRMideaAC::isEconoToggle(void) { + return remote_state == kMideaACToggleEcono; +} + +// Get the Econo (energy saver) toggle state of the A/C. +/// @return true, the setting is on. false, the setting is off. +bool IRMideaAC::getEconoToggle(void) { + _EconoToggle |= isEconoToggle(); + return _EconoToggle; +} + /// Calculate the checksum for a given state. /// @param[in] state The value to calc the checksum of. /// @return The calculated checksum value. @@ -376,6 +402,7 @@ stdAc::state_t IRMideaAC::toCommon(const stdAc::state_t *prev) { result.degrees = this->getTemp(result.celsius); result.fanspeed = this->toCommonFanSpeed(this->getFan()); result.sleep = this->getSleep() ? 0 : -1; + result.econo = this->getEconoToggle(); return result; } @@ -384,7 +411,8 @@ stdAc::state_t IRMideaAC::toCommon(const stdAc::state_t *prev) { String IRMideaAC::toString(void) { String result = ""; result.reserve(100); // Reserve some heap for the string to reduce fragging. - if (!isSwingVToggle()) { + bool needComma = false; + if (!isSwingVToggle() && !isEconoToggle()) { result += addBoolToString(getPower(), kPowerStr, false); result += addModeToString(getMode(), kMideaACAuto, kMideaACCool, kMideaACHeat, kMideaACDry, kMideaACFan); @@ -396,9 +424,10 @@ String IRMideaAC::toString(void) { result += addFanToString(getFan(), kMideaACFanHigh, kMideaACFanLow, kMideaACFanAuto, kMideaACFanAuto, kMideaACFanMed); result += addBoolToString(getSleep(), kSleepStr); + needComma = true; } - result += addBoolToString(getSwingVToggle(), kSwingVToggleStr, - !isSwingVToggle()); + result += addBoolToString(getSwingVToggle(), kSwingVToggleStr, needComma); + result += addBoolToString(getEconoToggle(), kEconoToggleStr); return result; } diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Midea.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Midea.h similarity index 89% rename from lib/IRremoteESP8266-2.7.8/src/ir_Midea.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Midea.h index b7825f569..96a1ffec4 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Midea.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Midea.h @@ -11,6 +11,10 @@ // Brand: Comfee, Model: MPD1-12CRN7 A/C (MIDEA) // Brand: Keystone, Model: RG57H4(B)BGEF remote (MIDEA) // Brand: Midea, Model: FS40-7AR Stand Fan (MIDEA24) +// Brand: Danby, Model: DAC080BGUWDB (MIDEA) +// Brand: Danby, Model: DAC100BGUWDB (MIDEA) +// Brand: Danby, Model: DAC120BGUWDB (MIDEA) +// Brand: Danby, Model: R09C/BCGE remote (MIDEA) #ifndef IR_MIDEA_H_ #define IR_MIDEA_H_ @@ -26,6 +30,10 @@ #include "IRsend_test.h" #endif +#if DANBY_DAC + kSwingVToggleStr = kIonStr; +#endif + // Constants const uint8_t kMideaACTempOffset = 24; const uint8_t kMideaACTempSize = 5; // Bits @@ -49,6 +57,9 @@ const uint8_t kMideaACFanHigh = 3; // 0b11 const uint8_t kMideaACSleepOffset = 38; const uint8_t kMideaACPowerOffset = 39; const uint64_t kMideaACToggleSwingV = 0x0000A201FFFFFF7C; +// For Danby DAC unit, the Ionizer toggle is the same as ToggleSwingV +// const uint64_t kMideaACToggleIonizer = 0x0000A201FFFFFF7C; +const uint64_t kMideaACToggleEcono = 0x0000A202FFFFFF7E; // Legacy defines. (Deprecated) #define MIDEA_AC_COOL kMideaACCool @@ -104,6 +115,9 @@ class IRMideaAC { bool isSwingVToggle(void); void setSwingVToggle(const bool on); bool getSwingVToggle(void); + bool isEconoToggle(void); + void setEconoToggle(const bool on); + bool getEconoToggle(void); uint8_t convertMode(const stdAc::opmode_t mode); uint8_t convertFan(const stdAc::fanspeed_t speed); static stdAc::opmode_t toCommonMode(const uint8_t mode); @@ -121,6 +135,7 @@ class IRMideaAC { #endif // UNIT_TEST uint64_t remote_state; ///< The state of the IR remote in IR code form. bool _SwingVToggle; + bool _EconoToggle; void checksum(void); static uint8_t calcChecksum(const uint64_t state); }; diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Mitsubishi.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Mitsubishi.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Mitsubishi.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Mitsubishi.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Mitsubishi.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Mitsubishi.h similarity index 98% rename from lib/IRremoteESP8266-2.7.8/src/ir_Mitsubishi.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Mitsubishi.h index 04c7bf57d..60f997095 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Mitsubishi.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Mitsubishi.h @@ -163,7 +163,7 @@ const uint8_t kMitsubishi112SwingHAuto = 0b1100; /// Class for handling detailed Mitsubishi 144-bit A/C messages. -/// Inspired and derived from the work done at: https://github.com/r45635/HVAC-IR-Control +/// @note Inspired and derived from the work done at: https://github.com/r45635/HVAC-IR-Control /// @warning Consider this very alpha code. Seems to work, but not validated. class IRMitsubishiAC { public: @@ -282,7 +282,7 @@ class IRMitsubishi136 { void checksum(void); }; - +/// Class for handling detailed Mitsubishi 122-bit A/C messages. class IRMitsubishi112 { public: explicit IRMitsubishi112(const uint16_t pin, const bool inverted = false, diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_MitsubishiHeavy.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_MitsubishiHeavy.cpp similarity index 98% rename from lib/IRremoteESP8266-2.7.8/src/ir_MitsubishiHeavy.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_MitsubishiHeavy.cpp index 7747ded6d..8a52bb762 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_MitsubishiHeavy.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_MitsubishiHeavy.cpp @@ -33,6 +33,8 @@ using irutils::addIntToString; using irutils::addLabeledString; using irutils::addModeToString; using irutils::addTempToString; +using irutils::checkInvertedBytePairs; +using irutils::invertBytePairs; using irutils::setBit; using irutils::setBits; @@ -321,32 +323,24 @@ bool IRMitsubishiHeavy152Ac::checkZmsSig(const uint8_t *state) { } /// Calculate the checksum for the current internal state of the remote. -/// Note: Technically it has no checksum, but does has inverted byte pairs. +/// Note: Technically it has no checksum, but does have inverted byte pairs. void IRMitsubishiHeavy152Ac::checksum(void) { - for (uint8_t i = kMitsubishiHeavySigLength - 2; - i < kMitsubishiHeavy152StateLength; - i += 2) { - remote_state[i + 1] = ~remote_state[i]; - } + const uint8_t kOffset = kMitsubishiHeavySigLength - 2; + invertBytePairs(remote_state + kOffset, + kMitsubishiHeavy152StateLength - kOffset); } /// Verify the checksum is valid for a given state. /// @param[in] state The array to verify the checksum of. /// @param[in] length The length/size of the state array. /// @return true, if the state has a valid checksum. Otherwise, false. -/// Note: Technically it has no checksum, but does has inverted byte pairs. +/// Note: Technically it has no checksum, but does have inverted byte pairs. bool IRMitsubishiHeavy152Ac::validChecksum(const uint8_t *state, const uint16_t length) { // Assume anything too short is fine. if (length < kMitsubishiHeavySigLength) return true; - // Check all the byte pairs. - for (uint16_t i = kMitsubishiHeavySigLength - 2; - i < length; - i += 2) { - // XOR of a byte and it's self inverted should be 0xFF; - if ((state[i] ^ state[i + 1]) != 0xFF) return false; - } - return true; + const uint8_t kOffset = kMitsubishiHeavySigLength - 2; + return checkInvertedBytePairs(state + kOffset, length - kOffset); } /// Convert a stdAc::opmode_t enum into its native mode. @@ -856,20 +850,18 @@ bool IRMitsubishiHeavy88Ac::checkZjsSig(const uint8_t *state) { } /// Calculate the checksum for the current internal state of the remote. -/// Note: Technically it has no checksum, but does has inverted byte pairs. +/// Note: Technically it has no checksum, but does have inverted byte pairs. void IRMitsubishiHeavy88Ac::checksum(void) { - for (uint8_t i = kMitsubishiHeavySigLength - 2; - i < kMitsubishiHeavy88StateLength; - i += 2) { - remote_state[i + 1] = ~remote_state[i]; - } + const uint8_t kOffset = kMitsubishiHeavySigLength - 2; + invertBytePairs(remote_state + kOffset, + kMitsubishiHeavy88StateLength - kOffset); } /// Verify the checksum is valid for a given state. /// @param[in] state The array to verify the checksum of. /// @param[in] length The length/size of the state array. /// @return true, if the state has a valid checksum. Otherwise, false. -/// Note: Technically it has no checksum, but does has inverted byte pairs. +/// Note: Technically it has no checksum, but does have inverted byte pairs. bool IRMitsubishiHeavy88Ac::validChecksum(const uint8_t *state, const uint16_t length) { return IRMitsubishiHeavy152Ac::validChecksum(state, length); diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_MitsubishiHeavy.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_MitsubishiHeavy.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_MitsubishiHeavy.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_MitsubishiHeavy.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Multibrackets.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Multibrackets.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Multibrackets.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Multibrackets.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_NEC.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_NEC.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_NEC.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_NEC.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_NEC.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_NEC.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_NEC.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_NEC.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Neoclima.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Neoclima.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Neoclima.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Neoclima.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Neoclima.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Neoclima.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Neoclima.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Neoclima.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Nikai.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Nikai.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Nikai.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Nikai.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Panasonic.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Panasonic.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Panasonic.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Panasonic.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Panasonic.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Panasonic.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Panasonic.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Panasonic.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Pioneer.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Pioneer.cpp similarity index 84% rename from lib/IRremoteESP8266-2.7.8/src/ir_Pioneer.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Pioneer.cpp index d5ac89765..90f58c6ed 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Pioneer.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Pioneer.cpp @@ -8,9 +8,12 @@ /// @see http://www.adrian-kingston.com/IRFormatPioneer.htm /// @see https://github.com/crankyoldgit/IRremoteESP8266/pull/547 /// @see https://www.pioneerelectronics.com/PUSA/Support/Home-Entertainment-Custom-Install/IR+Codes/A+V+Receivers +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1220 // Supports: // Brand: Pioneer, Model: AV Receivers +// Brand: Pioneer, Model: VSX-324 AV Receiver +// Brand: Pioneer, Model: AXD7690 Remote #define __STDC_LIMIT_MACROS #include @@ -20,22 +23,15 @@ #include "IRutils.h" // Constants -const uint16_t kPioneerTick = 534; -const uint16_t kPioneerHdrMarkTicks = 16; -const uint16_t kPioneerHdrMark = kPioneerHdrMarkTicks * kPioneerTick; -const uint16_t kPioneerHdrSpaceTicks = 8; -const uint16_t kPioneerHdrSpace = kPioneerHdrSpaceTicks * kPioneerTick; -const uint16_t kPioneerBitMarkTicks = 1; -const uint16_t kPioneerBitMark = kPioneerBitMarkTicks * kPioneerTick; -const uint16_t kPioneerOneSpaceTicks = 3; -const uint16_t kPioneerOneSpace = kPioneerOneSpaceTicks * kPioneerTick; -const uint16_t kPioneerZeroSpaceTicks = 1; -const uint16_t kPioneerZeroSpace = kPioneerZeroSpaceTicks * kPioneerTick; -const uint16_t kPioneerMinCommandLengthTicks = 159; -const uint32_t kPioneerMinCommandLength = kPioneerMinCommandLengthTicks * - kPioneerTick; -const uint16_t kPioneerMinGapTicks = 47; -const uint32_t kPioneerMinGap = kPioneerMinGapTicks * kPioneerTick; +// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1220 +const uint16_t kPioneerTick = 534; ///< uSeconds. +const uint16_t kPioneerHdrMark = 8506; ///< uSeconds. +const uint16_t kPioneerHdrSpace = 4191; ///< uSeconds. +const uint16_t kPioneerBitMark = 568; ///< uSeconds. +const uint16_t kPioneerOneSpace = 1542; ///< uSeconds. +const uint16_t kPioneerZeroSpace = 487; ///< uSeconds. +const uint32_t kPioneerMinCommandLength = 84906; ///< uSeconds. +const uint32_t kPioneerMinGap = 25181; ///< uSeconds. #if SEND_PIONEER /// Send a raw Pioneer formatted message. diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Pronto.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Pronto.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Pronto.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Pronto.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_RC5_RC6.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_RC5_RC6.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_RC5_RC6.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_RC5_RC6.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_RCMM.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_RCMM.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_RCMM.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_RCMM.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Samsung.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Samsung.cpp similarity index 96% rename from lib/IRremoteESP8266-2.7.8/src/ir_Samsung.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Samsung.cpp index 02aa4abdd..c3ff5ec7d 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Samsung.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Samsung.cpp @@ -53,6 +53,14 @@ const uint16_t kSamsungAcBitMark = 586; const uint16_t kSamsungAcOneSpace = 1432; const uint16_t kSamsungAcZeroSpace = 436; +// Data from https://github.com/crankyoldgit/IRremoteESP8266/issues/1220 +// Values calculated based on the average of ten messages. +const uint16_t kSamsung36HdrMark = 4515; /// < uSeconds +const uint16_t kSamsung36HdrSpace = 4438; /// < uSeconds +const uint16_t kSamsung36BitMark = 512; /// < uSeconds +const uint16_t kSamsung36OneSpace = 1468; /// < uSeconds +const uint16_t kSamsung36ZeroSpace = 490; /// < uSeconds + using irutils::addBoolToString; using irutils::addFanToString; using irutils::addIntToString; @@ -146,7 +154,7 @@ bool IRrecv::decodeSAMSUNG(decode_results *results, uint16_t offset, #if SEND_SAMSUNG36 /// Send a Samsung 36-bit formatted message. -/// Status: Alpha / Experimental. +/// Status: STABLE / Works on real devices. /// @param[in] data The message to be sent. /// @param[in] nbits The number of bits of message to be sent. /// @param[in] repeat The number of times the command is to be repeated. @@ -156,16 +164,16 @@ void IRsend::sendSamsung36(const uint64_t data, const uint16_t nbits, if (nbits < 16) return; // To small to send. for (uint16_t r = 0; r <= repeat; r++) { // Block #1 (16 bits) - sendGeneric(kSamsungHdrMark, kSamsungHdrSpace, - kSamsungBitMark, kSamsungOneSpace, - kSamsungBitMark, kSamsungZeroSpace, - kSamsungBitMark, kSamsungHdrSpace, + sendGeneric(kSamsung36HdrMark, kSamsung36HdrSpace, + kSamsung36BitMark, kSamsung36OneSpace, + kSamsung36BitMark, kSamsung36ZeroSpace, + kSamsung36BitMark, kSamsung36HdrSpace, data >> (nbits - 16), 16, 38, true, 0, kDutyDefault); // Block #2 (The rest, typically 20 bits) sendGeneric(0, 0, // No header - kSamsungBitMark, kSamsungOneSpace, - kSamsungBitMark, kSamsungZeroSpace, - kSamsungBitMark, kSamsungMinGap, // Gap is just a guess. + kSamsung36BitMark, kSamsung36OneSpace, + kSamsung36BitMark, kSamsung36ZeroSpace, + kSamsung36BitMark, kSamsungMinGap, // Gap is just a guess. // Mask off the rest of the bits. data & ((1ULL << (nbits - 16)) - 1), nbits - 16, 38, true, 0, kDutyDefault); @@ -175,7 +183,7 @@ void IRsend::sendSamsung36(const uint64_t data, const uint16_t nbits, #if DECODE_SAMSUNG36 /// Decode the supplied Samsung36 message. -/// Status: Alpha / Experimental +/// Status: STABLE / Expected to work. /// @param[in,out] results Ptr to the data to decode & where to store the result /// @param[in] offset The starting index to use when attempting to decode the /// raw data. Typically/Defaults to kStartOffset. @@ -198,10 +206,10 @@ bool IRrecv::decodeSamsung36(decode_results *results, uint16_t offset, uint16_t used; used = matchGeneric(results->rawbuf + offset, &data, results->rawlen - offset, 16, - kSamsungHdrMark, kSamsungHdrSpace, - kSamsungBitMark, kSamsungOneSpace, - kSamsungBitMark, kSamsungZeroSpace, - kSamsungBitMark, kSamsungHdrSpace, false); + kSamsung36HdrMark, kSamsung36HdrSpace, + kSamsung36BitMark, kSamsung36OneSpace, + kSamsung36BitMark, kSamsung36ZeroSpace, + kSamsung36BitMark, kSamsung36HdrSpace, false); if (!used) return false; offset += used; // Data (Block #2) @@ -209,9 +217,9 @@ bool IRrecv::decodeSamsung36(decode_results *results, uint16_t offset, if (!matchGeneric(results->rawbuf + offset, &data2, results->rawlen - offset, nbits - 16, 0, 0, - kSamsungBitMark, kSamsungOneSpace, - kSamsungBitMark, kSamsungZeroSpace, - kSamsungBitMark, kSamsungMinGap, true)) return false; + kSamsung36BitMark, kSamsung36OneSpace, + kSamsung36BitMark, kSamsung36ZeroSpace, + kSamsung36BitMark, kSamsungMinGap, true)) return false; data <<= (nbits - 16); data += data2; diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Samsung.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Samsung.h similarity index 98% rename from lib/IRremoteESP8266-2.7.8/src/ir_Samsung.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Samsung.h index fa6f9f2f3..d5c9955ec 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Samsung.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Samsung.h @@ -14,6 +14,8 @@ // Brand: Samsung, Model: DB93-16761C remote // Brand: Samsung, Model: IEC-R03 remote // Brand: Samsung, Model: AK59-00167A Bluray remote (SAMSUNG36) +// Brand: Samsung, Model: AH59-02692E Soundbar remote (SAMSUNG36) +// Brand: Samsung, Model: HW-J551 Soundbar (SAMSUNG36) // Brand: Samsung, Model: AR09FSSDAWKNFA A/C (SAMSUNG_AC) // Brand: Samsung, Model: AR12KSFPEWQNET A/C (SAMSUNG_AC) // Brand: Samsung, Model: AR12HSSDBWKNEU A/C (SAMSUNG_AC) diff --git a/lib/IRremoteESP8266-2.7.8.10/src/ir_Sanyo.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Sanyo.cpp new file mode 100644 index 000000000..04a9f4f2f --- /dev/null +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Sanyo.cpp @@ -0,0 +1,693 @@ +// Copyright 2009 Ken Shirriff +// Copyright 2016 marcosamarinho +// Copyright 2017-2020 David Conran + +/// @file +/// @brief Support for Sanyo protocols. +/// Sanyo LC7461 support originally by marcosamarinho +/// Sanyo SA 8650B originally added from +/// https://github.com/shirriff/Arduino-IRremote/ +/// @see https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Sanyo.cpp +/// @see http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf +/// @see https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Sanyo.cpp +/// @see http://slydiman.narod.ru/scr/kb/sanyo.htm +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1211 +/// @see https://docs.google.com/spreadsheets/d/1dYfLsnYvpjV-SgO8pdinpfuBIpSzm8Q1R5SabrLeskw/edit?usp=sharing + +#include "ir_Sanyo.h" +#include +#include +#include "IRrecv.h" +#include "IRsend.h" +#include "IRtext.h" +#include "IRutils.h" + +using irutils::addBoolToString; +using irutils::addFanToString; +using irutils::addIntToString; +using irutils::addLabeledString; +using irutils::addModeToString; +using irutils::addTempToString; +using irutils::minsToString; +using irutils::sumNibbles; +using irutils::setBit; +using irutils::setBits; + +// Constants +// Sanyo SA 8650B +const uint16_t kSanyoSa8650bHdrMark = 3500; // seen range 3500 +const uint16_t kSanyoSa8650bHdrSpace = 950; // seen 950 +const uint16_t kSanyoSa8650bOneMark = 2400; // seen 2400 +const uint16_t kSanyoSa8650bZeroMark = 700; // seen 700 +// usually see 713 - not using ticks as get number wrapround +const uint16_t kSanyoSa8650bDoubleSpaceUsecs = 800; +const uint16_t kSanyoSa8650bRptLength = 45000; + +// Sanyo LC7461 +const uint16_t kSanyoLc7461AddressMask = (1 << kSanyoLC7461AddressBits) - 1; +const uint16_t kSanyoLc7461CommandMask = (1 << kSanyoLC7461CommandBits) - 1; +const uint16_t kSanyoLc7461HdrMark = 9000; +const uint16_t kSanyoLc7461HdrSpace = 4500; +const uint16_t kSanyoLc7461BitMark = 560; // 1T +const uint16_t kSanyoLc7461OneSpace = 1690; // 3T +const uint16_t kSanyoLc7461ZeroSpace = 560; // 1T +const uint32_t kSanyoLc7461MinCommandLength = 108000; + +const uint16_t kSanyoLc7461MinGap = + kSanyoLc7461MinCommandLength - + (kSanyoLc7461HdrMark + kSanyoLc7461HdrSpace + + kSanyoLC7461Bits * (kSanyoLc7461BitMark + + (kSanyoLc7461OneSpace + kSanyoLc7461ZeroSpace) / 2) + + kSanyoLc7461BitMark); + +const uint16_t kSanyoAcHdrMark = 8500; ///< uSeconds +const uint16_t kSanyoAcHdrSpace = 4200; ///< uSeconds +const uint16_t kSanyoAcBitMark = 500; ///< uSeconds +const uint16_t kSanyoAcOneSpace = 1600; ///< uSeconds +const uint16_t kSanyoAcZeroSpace = 550; ///< uSeconds +const uint32_t kSanyoAcGap = kDefaultMessageGap; ///< uSeconds (Guess only) +const uint16_t kSanyoAcFreq = 38000; ///< Hz. (Guess only) + +#if SEND_SANYO +/// Construct a Sanyo LC7461 message. +/// @param[in] address The 13 bit value of the address(Custom) portion of the +/// protocol. +/// @param[in] command The 8 bit value of the command(Key) portion of the +/// protocol. +/// @return An uint64_t with the encoded raw 42 bit Sanyo LC7461 data value. +/// @note This protocol uses the NEC protocol timings. However, data is +/// formatted as : address(13 bits), !address, command(8 bits), !command. +/// According with LIRC, this protocol is used on Sanyo, Aiwa and Chinon +uint64_t IRsend::encodeSanyoLC7461(uint16_t address, uint8_t command) { + // Mask our input values to ensure the correct bit sizes. + address &= kSanyoLc7461AddressMask; + command &= kSanyoLc7461CommandMask; + + uint64_t data = address; + address ^= kSanyoLc7461AddressMask; // Invert the 13 LSBs. + // Append the now inverted address. + data = (data << kSanyoLC7461AddressBits) | address; + // Append the command. + data = (data << kSanyoLC7461CommandBits) | command; + command ^= kSanyoLc7461CommandMask; // Invert the command. + // Append the now inverted command. + data = (data << kSanyoLC7461CommandBits) | command; + + return data; +} + +/// Send a Sanyo LC7461 message. +/// Status: BETA / Probably works. +/// @param[in] data The message to be sent. +/// @param[in] nbits The number of bits of message to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +/// @note Based on \@marcosamarinho's work. +/// This protocol uses the NEC protocol timings. However, data is +/// formatted as : address(13 bits), !address, command (8 bits), !command. +/// According with LIRC, this protocol is used on Sanyo, Aiwa and Chinon +/// Information for this protocol is available at the Sanyo LC7461 datasheet. +/// Repeats are performed similar to the NEC method of sending a special +/// repeat message, rather than duplicating the entire message. +/// @see https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Sanyo.cpp +/// @see http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf +void IRsend::sendSanyoLC7461(const uint64_t data, const uint16_t nbits, + const uint16_t repeat) { + // This protocol appears to be another 42-bit variant of the NEC protocol. + sendNEC(data, nbits, repeat); +} +#endif // SEND_SANYO + +#if DECODE_SANYO +/// Decode the supplied SANYO LC7461 message. +/// Status: BETA / Probably works. +/// @param[in,out] results Ptr to the data to decode & where to store the result +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return True if it can decode it, false if it can't. +/// @note Based on \@marcosamarinho's work. +/// This protocol uses the NEC protocol. However, data is +/// formatted as : address(13 bits), !address, command (8 bits), !command. +/// According with LIRC, this protocol is used on Sanyo, Aiwa and Chinon +/// Information for this protocol is available at the Sanyo LC7461 datasheet. +/// @see http://slydiman.narod.ru/scr/kb/sanyo.htm +/// @see https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Sanyo.cpp +/// @see http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf +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, offset, nbits, false)) + return false; // Didn't match a NEC format (without strict) + + // Bits 30 to 42+. + uint16_t address = + results->value >> (kSanyoLC7461Bits - kSanyoLC7461AddressBits); + // Bits 9 to 16. + uint8_t command = + (results->value >> kSanyoLC7461CommandBits) & kSanyoLc7461CommandMask; + // Compliance + if (strict) { + if (results->bits != nbits) return false; + // Bits 17 to 29. + uint16_t inverted_address = + (results->value >> (kSanyoLC7461CommandBits * 2)) & + kSanyoLc7461AddressMask; + // Bits 1-8. + uint8_t inverted_command = results->value & kSanyoLc7461CommandMask; + if ((address ^ kSanyoLc7461AddressMask) != inverted_address) + return false; // Address integrity check failed. + if ((command ^ kSanyoLc7461CommandMask) != inverted_command) + return false; // Command integrity check failed. + } + + // Success + results->decode_type = SANYO_LC7461; + results->address = address; + results->command = command; + return true; +} + +/* NOTE: Disabled due to poor quality. +/// Decode the supplied Sanyo SA 8650B message. +/// Status: Depricated. +/// @depricated Disabled due to poor quality. +/// @param[in,out] results Ptr to the data to decode & where to store the result +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return True if it can decode it, false if it can't. +/// @warning This decoder looks like rubbish. Only keeping it for compatibility +/// with the Arduino IRremote library. Seriously, don't trust it. +/// If someone has a device that this is supposed to be for, please log an +/// Issue on github with a rawData dump please. We should probably remove it. +/// We think this is a Sanyo decoder - serial = SA 8650B +/// @see https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Sanyo.cpp +bool IRrecv::decodeSanyo(decode_results *results, uint16_t nbits, bool strict) { + if (results->rawlen < 2 * nbits + kHeader - 1) + return false; // Shorter than shortest possible. + if (strict && nbits != kSanyoSA8650BBits) + return false; // Doesn't match the spec. + + uint16_t offset = 0; + + // TODO(crankyoldgit): This repeat code looks like garbage, it should never + // match or if it does, it won't be reliable. We should probably just + // remove it. + if (results->rawbuf[offset++] < kSanyoSa8650bDoubleSpaceUsecs) { + results->bits = 0; + results->value = kRepeat; + results->decode_type = SANYO; + results->address = 0; + results->command = 0; + results->repeat = true; + return true; + } + + // Header + if (!matchMark(results->rawbuf[offset++], kSanyoSa8650bHdrMark)) + return false; + // NOTE: These next two lines look very wrong. Treat as suspect. + if (!matchMark(results->rawbuf[offset++], kSanyoSa8650bHdrMark)) + return false; + // Data + uint64_t data = 0; + while (offset + 1 < results->rawlen) { + if (!matchSpace(results->rawbuf[offset], kSanyoSa8650bHdrSpace)) + break; + offset++; + if (matchMark(results->rawbuf[offset], kSanyoSa8650bOneMark)) + data = (data << 1) | 1; // 1 + else if (matchMark(results->rawbuf[offset], kSanyoSa8650bZeroMark)) + data <<= 1; // 0 + else + return false; + offset++; + } + + if (strict && kSanyoSA8650BBits > (offset - 1U) / 2U) + return false; + + // Success + results->bits = (offset - 1) / 2; + results->decode_type = SANYO; + results->value = data; + results->address = 0; + results->command = 0; + return true; +} +*/ +#endif // DECODE_SANYO + + +#if SEND_SANYO_AC +/// Send a SanyoAc formatted message. +/// Status: STABLE / Reported as working. +/// @param[in] data An array of bytes containing the IR command. +/// @param[in] nbytes Nr. of bytes of data in the array. +/// @param[in] repeat Nr. of times the message is to be repeated. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1211 +void IRsend::sendSanyoAc(const uint8_t data[], const uint16_t nbytes, + const uint16_t repeat) { + // Header + Data + Footer + sendGeneric(kSanyoAcHdrMark, kSanyoAcHdrSpace, + kSanyoAcBitMark, kSanyoAcOneSpace, + kSanyoAcBitMark, kSanyoAcZeroSpace, + kSanyoAcBitMark, kSanyoAcGap, + data, nbytes, kSanyoAcFreq, false, repeat, kDutyDefault); +} +#endif // SEND_SANYO_AC + +#if DECODE_SANYO_AC +/// Decode the supplied SanyoAc message. +/// Status: STABLE / Reported as working. +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1211 +bool IRrecv::decodeSanyoAc(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (strict && nbits != kSanyoAcBits) + return false; + + // Header + Data + Footer + if (!matchGeneric(results->rawbuf + offset, results->state, + results->rawlen - offset, nbits, + kSanyoAcHdrMark, kSanyoAcHdrSpace, + kSanyoAcBitMark, kSanyoAcOneSpace, + kSanyoAcBitMark, kSanyoAcZeroSpace, + kSanyoAcBitMark, kSanyoAcGap, + true, kUseDefTol, kMarkExcess, false)) return false; + // Compliance + if (strict) + if (!IRSanyoAc::validChecksum(results->state, nbits / 8)) return false; + + // Success + results->decode_type = decode_type_t::SANYO_AC; + results->bits = nbits; + // No need to record the state as we stored it as we decoded it. + // As we use result->state, we don't record value, address, or command as it + // is a union data type. + return true; +} +#endif // DECODE_SANYO_AC + +/// Class constructor +/// @param[in] pin GPIO to be used when sending. +/// @param[in] inverted Is the output signal to be inverted? +/// @param[in] use_modulation Is frequency modulation to be used? +IRSanyoAc::IRSanyoAc(const uint16_t pin, const bool inverted, + const bool use_modulation) + : _irsend(pin, inverted, use_modulation) { stateReset(); } + +/// Reset the state of the remote to a known good state/sequence. +/// @see https://docs.google.com/spreadsheets/d/1dYfLsnYvpjV-SgO8pdinpfuBIpSzm8Q1R5SabrLeskw/edit?ts=5f0190a5#gid=1050142776&range=A2:B2 +void IRSanyoAc::stateReset(void) { + static const uint8_t kReset[kSanyoAcStateLength] = { + 0x6A, 0x6D, 0x51, 0x00, 0x10, 0x45, 0x00, 0x00, 0x33}; + memcpy(remote_state, kReset, kSanyoAcStateLength); +} + +/// Set up hardware to be able to send a message. +void IRSanyoAc::begin(void) { _irsend.begin(); } + +#if SEND_SANYO_AC +/// Send the current internal state as IR messages. +/// @param[in] repeat Nr. of times the message will be repeated. +void IRSanyoAc::send(const uint16_t repeat) { + _irsend.sendSanyoAc(getRaw(), kSanyoAcStateLength, repeat); +} +#endif // SEND_SANYO_AC + +/// Get a PTR to the internal state/code for this protocol with all integrity +/// checks passing. +/// @return PTR to a code for this protocol based on the current internal state. +uint8_t* IRSanyoAc::getRaw(void) { + checksum(); + return remote_state; +} + +/// Set the internal state from a valid code for this protocol. +/// @param[in] newState A valid code for this protocol. +void IRSanyoAc::setRaw(const uint8_t newState[]) { + memcpy(remote_state, newState, kSanyoAcStateLength); +} + +/// Calculate the checksum for a given state. +/// @param[in] state The array to calc the checksum of. +/// @param[in] length The length/size of the array. +/// @return The calculated checksum value. +uint8_t IRSanyoAc::calcChecksum(const uint8_t state[], + const uint16_t length) { + return length ? sumNibbles(state, length - 1) : 0; +} + +/// Verify the checksum is valid for a given state. +/// @param[in] state The array to verify the checksum of. +/// @param[in] length The length/size of the array. +/// @return true, if the state has a valid checksum. Otherwise, false. +bool IRSanyoAc::validChecksum(const uint8_t state[], const uint16_t length) { + return length && state[length - 1] == IRSanyoAc::calcChecksum(state, length); +} + +/// Calculate & set the checksum for the current internal state of the remote. +void IRSanyoAc::checksum(void) { + // Stored the checksum value in the last byte. + remote_state[kSanyoAcStateLength - 1] = calcChecksum(remote_state); +} + + +/// Set the requested power state of the A/C to on. +void IRSanyoAc::on(void) { setPower(true); } + +/// Set the requested power state of the A/C to off. +void IRSanyoAc::off(void) { setPower(false); } + +/// Change the power setting. +/// @param[in] on true, the setting is on. false, the setting is off. +void IRSanyoAc::setPower(const bool on) { + setBits(&remote_state[kSanyoAcPowerByte], kSanyoAcPowerOffset, + kSanyoAcPowerSize, on ? kSanyoAcPowerOn : kSanyoAcPowerOff); +} + +/// Get the value of the current power setting. +/// @return true, the setting is on. false, the setting is off. +bool IRSanyoAc::getPower(void) { + return GETBITS8(remote_state[kSanyoAcPowerByte], kSanyoAcPowerOffset, + kSanyoAcPowerSize) == kSanyoAcPowerOn; +} + +/// Get the operating mode setting of the A/C. +/// @return The current operating mode setting. +uint8_t IRSanyoAc::getMode(void) { + return GETBITS8(remote_state[kSanyoAcModeByte], kSanyoAcModeOffset, + kSanyoAcModeSize); +} + +/// Set the operating mode of the A/C. +/// @param[in] mode The desired operating mode. +/// @note If we get an unexpected mode, default to AUTO. +void IRSanyoAc::setMode(const uint8_t mode) { + switch (mode) { + case kSanyoAcAuto: + case kSanyoAcCool: + case kSanyoAcDry: + case kSanyoAcHeat: + setBits(&remote_state[kSanyoAcModeByte], kSanyoAcModeOffset, + kSanyoAcModeSize, mode); + break; + default: setMode(kSanyoAcAuto); + } +} + +/// Convert a stdAc::opmode_t enum into its native mode. +/// @param[in] mode The enum to be converted. +/// @return The native equivilant of the enum. +uint8_t IRSanyoAc::convertMode(const stdAc::opmode_t mode) { + switch (mode) { + case stdAc::opmode_t::kCool: return kSanyoAcCool; + case stdAc::opmode_t::kHeat: return kSanyoAcHeat; + case stdAc::opmode_t::kDry: return kSanyoAcDry; + default: return kSanyoAcAuto; + } +} + +/// Convert a native mode into its stdAc equivilant. +/// @param[in] mode The native setting to be converted. +/// @return The stdAc equivilant of the native setting. +stdAc::opmode_t IRSanyoAc::toCommonMode(const uint8_t mode) { + switch (mode) { + case kSanyoAcCool: return stdAc::opmode_t::kCool; + case kSanyoAcHeat: return stdAc::opmode_t::kHeat; + case kSanyoAcDry: return stdAc::opmode_t::kDry; + default: return stdAc::opmode_t::kAuto; + } +} + +/// Set the temperature at a given location. +/// @param[out] ptr A pointer to a temperature byte. +/// @param[in] degrees The temperature in degrees celsius. +void IRSanyoAc::_setTemp(uint8_t *ptr, const uint8_t degrees) { + uint8_t temp = std::max((uint8_t)kSanyoAcTempMin, degrees); + temp = std::min((uint8_t)kSanyoAcTempMax, temp); + setBits(ptr, kSanyoAcTempOffset, kSanyoAcTempSize, temp - kSanyoAcTempDelta); +} + +/// Get the temperature from a given location. +/// @param[in] ptr A pointer to a temperature byte. +/// @return The current setting for temp. in degrees celsius. +uint8_t IRSanyoAc::_getTemp(uint8_t *ptr) { + return GETBITS8(*ptr, kSanyoAcTempOffset, kSanyoAcTempSize) + + kSanyoAcTempDelta; +} + +/// Set the desired temperature. +/// @param[in] degrees The temperature in degrees celsius. +void IRSanyoAc::setTemp(const uint8_t degrees) { + _setTemp(&remote_state[kSanyoAcTempByte], degrees); +} + +/// Get the current desired temperature setting. +/// @return The current setting for temp. in degrees celsius. +uint8_t IRSanyoAc::getTemp(void) { + return _getTemp(&remote_state[kSanyoAcTempByte]); +} + +/// Set the sensor temperature. +/// @param[in] degrees The temperature in degrees celsius. +void IRSanyoAc::setSensorTemp(const uint8_t degrees) { + _setTemp(&remote_state[kSanyoAcSensorByte], degrees); +} + +/// Get the current sensor temperature setting. +/// @return The current setting for temp. in degrees celsius. +uint8_t IRSanyoAc::getSensorTemp(void) { + return _getTemp(&remote_state[kSanyoAcSensorByte]); +} + +/// Set the speed of the fan. +/// @param[in] speed The desired setting. +void IRSanyoAc::setFan(const uint8_t speed) { + setBits(&remote_state[kSanyoAcModeByte], kSanyoAcFanOffset, kSanyoAcFanSize, + speed); +} + +/// Get the current fan speed setting. +/// @return The current fan speed/mode. +uint8_t IRSanyoAc::getFan(void) { + return GETBITS8(remote_state[kSanyoAcModeByte], kSanyoAcFanOffset, + kSanyoAcFanSize); +} + +/// Convert a stdAc::fanspeed_t enum into it's native speed. +/// @param[in] speed The enum to be converted. +/// @return The native equivilant of the enum. +uint8_t IRSanyoAc::convertFan(const stdAc::fanspeed_t speed) { + switch (speed) { + case stdAc::fanspeed_t::kMin: + case stdAc::fanspeed_t::kLow: return kSanyoAcFanLow; + case stdAc::fanspeed_t::kMedium: return kSanyoAcFanMedium; + case stdAc::fanspeed_t::kHigh: + case stdAc::fanspeed_t::kMax: return kSanyoAcFanHigh; + default: return kSanyoAcFanAuto; + } +} + +/// Convert a native fan speed into its stdAc equivilant. +/// @param[in] spd The native setting to be converted. +/// @return The stdAc equivilant of the native setting. +stdAc::fanspeed_t IRSanyoAc::toCommonFanSpeed(const uint8_t spd) { + switch (spd) { + case kSanyoAcFanHigh: return stdAc::fanspeed_t::kHigh; + case kSanyoAcFanMedium: return stdAc::fanspeed_t::kMedium; + case kSanyoAcFanLow: return stdAc::fanspeed_t::kLow; + default: return stdAc::fanspeed_t::kAuto; + } +} + +/// Get the vertical swing setting of the A/C. +/// @return The current swing mode setting. +uint8_t IRSanyoAc::getSwingV(void) { + return GETBITS8(remote_state[kSanyoAcPowerByte], kSanyoAcSwingVOffset, + kSanyoAcSwingVSize); +} + +/// Set the vertical swing setting of the A/C. +/// @param[in] setting The value of the desired setting. +void IRSanyoAc::setSwingV(const uint8_t setting) { + if (setting == kSanyoAcSwingVAuto || + (setting >= kSanyoAcSwingVLowest && setting <= kSanyoAcSwingVHighest)) + setBits(&remote_state[kSanyoAcPowerByte], kSanyoAcSwingVOffset, + kSanyoAcSwingVSize, setting); + + else + setSwingV(kSanyoAcSwingVAuto); +} + +/// Convert a stdAc::swingv_t enum into it's native setting. +/// @param[in] position The enum to be converted. +/// @return The native equivilant of the enum. +uint8_t IRSanyoAc::convertSwingV(const stdAc::swingv_t position) { + switch (position) { + case stdAc::swingv_t::kHighest: return kSanyoAcSwingVHighest; + case stdAc::swingv_t::kHigh: return kSanyoAcSwingVHigh; + case stdAc::swingv_t::kMiddle: return kSanyoAcSwingVUpperMiddle; + case stdAc::swingv_t::kLow: return kSanyoAcSwingVLow; + case stdAc::swingv_t::kLowest: return kSanyoAcSwingVLowest; + default: return kSanyoAcSwingVAuto; + } +} + +/// Convert a native vertical swing postion to it's common equivalent. +/// @param[in] setting A native position to convert. +/// @return The common vertical swing position. +stdAc::swingv_t IRSanyoAc::toCommonSwingV(const uint8_t setting) { + switch (setting) { + case kSanyoAcSwingVHighest: return stdAc::swingv_t::kHighest; + case kSanyoAcSwingVHigh: return stdAc::swingv_t::kHigh; + case kSanyoAcSwingVUpperMiddle: + case kSanyoAcSwingVLowerMiddle: return stdAc::swingv_t::kMiddle; + case kSanyoAcSwingVLow: return stdAc::swingv_t::kLow; + case kSanyoAcSwingVLowest: return stdAc::swingv_t::kLowest; + default: return stdAc::swingv_t::kAuto; + } +} + +/// Set the Sleep (Night Setback) setting of the A/C. +/// @param[in] on true, the setting is on. false, the setting is off. +void IRSanyoAc::setSleep(const bool on) { + setBit(&remote_state[kSanyoAcSleepByte], kSanyoAcSleepBit, on); +} + +/// Get the Sleep (Night Setback) setting of the A/C. +/// @return true, the setting is on. false, the setting is off. +bool IRSanyoAc::getSleep(void) { + return GETBIT8(remote_state[kSanyoAcSleepByte], kSanyoAcSleepBit); +} + +/// Set the Sensor Location setting of the A/C. +/// i.e. Where the ambient temperature is measured. +/// @param[in] location true is Unit/Wall, false is Remote/Room. +void IRSanyoAc::setSensor(const bool location) { + setBit(&remote_state[kSanyoAcSensorByte], kSanyoAcSensorBit, location); +} + +/// Get the Sensor Location setting of the A/C. +/// i.e. Where the ambient temperature is measured. +/// @return true is Unit/Wall, false is Remote/Room. +bool IRSanyoAc::getSensor(void) { + return GETBIT8(remote_state[kSanyoAcSensorByte], kSanyoAcSensorBit); +} + +/// Set the Beep setting of the A/C. +/// @param[in] on true, the setting is on. false, the setting is off. +void IRSanyoAc::setBeep(const bool on) { + setBit(&remote_state[kSanyoAcSensorByte], kSanyoAcBeepBit, on); +} + +/// Get the Beep setting of the A/C. +/// @return true, the setting is on. false, the setting is off. +bool IRSanyoAc::getBeep(void) { + return GETBIT8(remote_state[kSanyoAcSensorByte], kSanyoAcBeepBit); +} + +/// Get the nr of minutes the Off Timer is set to. +/// @return The timer time expressed as the number of minutes. +/// A value of 0 means the Off Timer is off/disabled. +/// @note The internal precission has a resolution of 1 hour. +uint16_t IRSanyoAc::getOffTimer(void) { + if (GETBIT8(remote_state[kSanyoAcModeByte], kSanyoAcOffTimerEnableBit)) + return GETBITS8(remote_state[kSanyoAcOffHourByte], kSanyoAcOffHourOffset, + kSanyoAcOffHourSize) * 60; + else + return 0; +} + +/// Set the nr of minutes for the Off Timer. +/// @param[in] mins The timer time expressed as nr. of minutes. +/// A value of 0 means the Off Timer is off/disabled. +/// @note The internal precission has a resolution of 1 hour. +void IRSanyoAc::setOffTimer(const uint16_t mins) { + const uint8_t hours = std::min((uint8_t)(mins / 60), kSanyoAcHourMax); + setBit(&remote_state[kSanyoAcModeByte], kSanyoAcOffTimerEnableBit, hours > 0); + setBits(&remote_state[kSanyoAcOffHourByte], kSanyoAcOffHourOffset, + kSanyoAcOffHourSize, hours); +} + +/// Convert the current internal state into its stdAc::state_t equivilant. +/// @return The stdAc equivilant of the native settings. +stdAc::state_t IRSanyoAc::toCommon(void) { + stdAc::state_t result; + result.protocol = decode_type_t::SANYO_AC; + result.model = -1; // Not supported. + result.power = getPower(); + result.mode = toCommonMode(getMode()); + result.celsius = true; + result.degrees = getTemp(); + result.fanspeed = toCommonFanSpeed(getFan()); + result.sleep = getSleep() ? 0 : -1; + result.swingv = toCommonSwingV(getSwingV()); + result.beep = getBeep(); + // Not supported. + result.swingh = stdAc::swingh_t::kOff; + result.turbo = false; + result.econo = false; + result.light = false; + result.filter = false; + result.quiet = false; + result.clean = false; + result.clock = -1; + return result; +} + +/// Convert the current internal state into a human readable string. +/// @return A human readable string. +String IRSanyoAc::toString(void) { + String result = ""; + result.reserve(140); + result += addBoolToString(getPower(), kPowerStr, false); + result += addModeToString(getMode(), kSanyoAcAuto, kSanyoAcCool, + kSanyoAcHeat, kSanyoAcDry, kSanyoAcAuto); + result += addTempToString(getTemp()); + result += addFanToString(getFan(), kSanyoAcFanHigh, kSanyoAcFanLow, + kSanyoAcFanAuto, kSanyoAcFanAuto, + kSanyoAcFanMedium); + result += addIntToString(getSwingV(), kSwingVStr); + result += kSpaceLBraceStr; + switch (getSwingV()) { + case kSanyoAcSwingVHighest: result += kHighestStr; break; + case kSanyoAcSwingVHigh: result += kHighStr; break; + case kSanyoAcSwingVUpperMiddle: + result += kUpperStr; + result += ' '; + result += kMiddleStr; + break; + case kSanyoAcSwingVLowerMiddle: + result += kLowerStr; + result += ' '; + result += kMiddleStr; + break; + case kSanyoAcSwingVLow: result += kLowStr; break; + case kSanyoAcSwingVLowest: result += kLowestStr; break; + case kSanyoAcSwingVAuto: result += kAutoStr; break; + default: result += kUnknownStr; + } + result += ')'; + result += addBoolToString(getSleep(), kSleepStr); + result += addBoolToString(getBeep(), kBeepStr); + result += addLabeledString(getSensor() ? kRoomStr : kWallStr, kSensorStr); + result += kCommaSpaceStr; + result += kSensorStr; + result += ' '; + result += addTempToString(getSensorTemp(), true, false); + const uint16_t offtime = getOffTimer(); + result += addLabeledString(offtime ? minsToString(offtime) : kOffStr, + kOffTimerStr); + return result; +} diff --git a/lib/IRremoteESP8266-2.7.8.10/src/ir_Sanyo.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Sanyo.h new file mode 100644 index 000000000..9cdde61c8 --- /dev/null +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Sanyo.h @@ -0,0 +1,163 @@ +// Copyright 2020 David Conran + +/// @file +/// @brief Support for Sanyo protocols. +/// Sanyo LC7461 support originally by marcosamarinho +/// Sanyo SA 8650B originally added from +/// https://github.com/shirriff/Arduino-IRremote/ +/// @see https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Sanyo.cpp +/// @see http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf +/// @see https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Sanyo.cpp +/// @see http://slydiman.narod.ru/scr/kb/sanyo.htm +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1211 +/// @see https://docs.google.com/spreadsheets/d/1dYfLsnYvpjV-SgO8pdinpfuBIpSzm8Q1R5SabrLeskw/edit?usp=sharing + +// Supports: +// Brand: Sanyo, Model: SA 8650B - disabled +// Brand: Sanyo, Model: LC7461 transmitter IC (SANYO_LC7461) +// Brand: Sanyo, Model: SAP-K121AHA A/C (SANYO_AC) +// Brand: Sanyo, Model: RCS-2HS4E remote (SANYO_AC) +// Brand: Sanyo, Model: SAP-K242AH A/C (SANYO_AC) +// Brand: Sanyo, Model: RCS-2S4E remote (SANYO_AC) + +#ifndef IR_SANYO_H_ +#define IR_SANYO_H_ + +#define __STDC_LIMIT_MACROS +#include +#ifdef ARDUINO +#include +#endif +#include "IRremoteESP8266.h" +#include "IRsend.h" +#ifdef UNIT_TEST +#include "IRsend_test.h" +#endif + +// Constants + +// Sanyo A/C +// Ref: https://docs.google.com/spreadsheets/d/1dYfLsnYvpjV-SgO8pdinpfuBIpSzm8Q1R5SabrLeskw/edit?usp=sharing +// Byte[0] - 0x6A (Fixed?) +// Byte[1] - Address + Temperature +const uint8_t kSanyoAcTempByte = 1; ///< Index +const uint8_t kSanyoAcTempOffset = 0; ///< Mask 0b000xxxxx +const uint8_t kSanyoAcTempSize = 5; ///< Mask 0b000xxxxx +const uint8_t kSanyoAcTempMin = 16; ///< Celsius +const uint8_t kSanyoAcTempMax = 30; ///< Celsius +const uint8_t kSanyoAcTempDelta = 4; ///< Celsius to Native Temp difference. +// Byte[2] - Ambient Temp + Sensor +const uint8_t kSanyoAcSensorByte = 2; ///< Index +const uint8_t kSanyoAcSensorBit = 2; ///< Mask 0b00x00000 +// Ambient Temp Mask 0b000xxxxx +const uint8_t kSanyoAcBeepBit = 6; ///< Mask 0b0x000000 +// Byte[3] - Off Hour +const uint8_t kSanyoAcOffHourByte = 3; ///< Index +const uint8_t kSanyoAcOffHourOffset = 0; ///< Mask 0b0000xxxx +const uint8_t kSanyoAcOffHourSize = 4; ///< Mask 0b0000xxxx +const uint8_t kSanyoAcHourMax = 15; ///< 0b1111 +// Byte[4] - Mode + Fan + Timer Enables +const uint8_t kSanyoAcModeByte = 4; ///< Index +const uint8_t kSanyoAcModeOffset = 4; ///< Mask 0b0xxx0000 +const uint8_t kSanyoAcModeSize = 3; ///< Mask 0b0xxx0000 +const uint8_t kSanyoAcHeat = 1; ///< 0b001 +const uint8_t kSanyoAcCool = 2; ///< 0b010 +const uint8_t kSanyoAcDry = 3; ///< 0b011 +const uint8_t kSanyoAcAuto = 4; ///< 0b100 +const uint8_t kSanyoAcOffTimerEnableBit = 2; ///< Mask 0b00000x00 +const uint8_t kSanyoAcFanOffset = 0; ///< Mask 0b000000xx +const uint8_t kSanyoAcFanSize = 2; ///< Mask 0b000000xx +const uint8_t kSanyoAcFanAuto = 0; ///< 0b00 +const uint8_t kSanyoAcFanHigh = 1; ///< 0b01 +const uint8_t kSanyoAcFanLow = 2; ///< 0b10 +const uint8_t kSanyoAcFanMedium = 3; ///< 0b11 +// Byte[5] - Power + SwingV +const uint8_t kSanyoAcPowerByte = 5; ///< Index +const uint8_t kSanyoAcPowerOffset = 6; ///< Mask 0bxx000000 +const uint8_t kSanyoAcPowerSize = 2; ///< Mask 0bxx000000 +// const uint8_t kSanyoAcPowerStandby = 0b00; ///< Standby? +const uint8_t kSanyoAcPowerOff = 0b01; ///< Off +const uint8_t kSanyoAcPowerOn = 0b10; ///< On +const uint8_t kSanyoAcSwingVOffset = 0; ///< Mask 0b00000xxx +const uint8_t kSanyoAcSwingVSize = 3; ///< Mask 0b00000xxx +const uint8_t kSanyoAcSwingVAuto = 0; ///< 0b000 +const uint8_t kSanyoAcSwingVLowest = 2; ///< 0b010 +const uint8_t kSanyoAcSwingVLow = 3; ///< 0b011 +const uint8_t kSanyoAcSwingVLowerMiddle = 4; ///< 0b100 +const uint8_t kSanyoAcSwingVUpperMiddle = 5; ///< 0b101 +const uint8_t kSanyoAcSwingVHigh = 6; ///< 0b110 +const uint8_t kSanyoAcSwingVHighest = 7; ///< 0b111 +// Byte[6] - Sleep +const uint8_t kSanyoAcSleepByte = 6; ///< Index +const uint8_t kSanyoAcSleepBit = 3; ///< Mask 0b0000x000 +// Byte[8] - Checksum (8-bit Sum of all preceeding nibbles) + + +// Classes +/// Class for handling detailed Sanyo A/C messages. +class IRSanyoAc { + public: + explicit IRSanyoAc(const uint16_t pin, const bool inverted = false, + const bool use_modulation = true); + void stateReset(void); +#if SEND_SANYO_AC + void send(const uint16_t repeat = kNoRepeat); + /// Run the calibration to calculate uSec timing offsets for this platform. + /// @return The uSec timing offset needed per modulation of the IR Led. + /// @note This will produce a 65ms IR signal pulse at 38kHz. + /// Only ever needs to be run once per object instantiation, if at all. + int8_t calibrate(void) { return _irsend.calibrate(); } +#endif // SEND_SANYO_AC + 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 setSensorTemp(const uint8_t degrees); + uint8_t getSensorTemp(void); + void setFan(const uint8_t speed); + uint8_t getFan(void); + void setMode(const uint8_t mode); + uint8_t getMode(void); + void setSleep(const bool on); + bool getSleep(void); + void setSensor(const bool location); + bool getSensor(void); + void setBeep(const bool on); + bool getBeep(void); + void setSwingV(const uint8_t setting); + uint8_t getSwingV(void); + void setRaw(const uint8_t newState[]); + uint8_t* getRaw(void); + uint16_t getOffTimer(void); + void setOffTimer(const uint16_t mins); + static bool validChecksum(const uint8_t state[], + const uint16_t length = kSanyoAcStateLength); + uint8_t convertMode(const stdAc::opmode_t mode); + uint8_t convertFan(const stdAc::fanspeed_t speed); + uint8_t convertSwingV(const stdAc::swingv_t position); + static stdAc::opmode_t toCommonMode(const uint8_t mode); + static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); + static stdAc::swingv_t toCommonSwingV(const uint8_t setting); + stdAc::state_t toCommon(void); + String toString(void); +#ifndef UNIT_TEST + + private: + IRsend _irsend; ///< Instance of the IR send class +#else // UNIT_TEST + /// @cond IGNORE + IRsendTest _irsend; ///< Instance of the testing IR send class + /// @endcond +#endif // UNIT_TEST + uint8_t remote_state[kSanyoAcStateLength]; ///< The state in IR code form. + void checksum(void); + static uint8_t calcChecksum(const uint8_t state[], + const uint16_t length = kSanyoAcStateLength); + void _setTemp(uint8_t *ptr, const uint8_t degrees); + uint8_t _getTemp(uint8_t *ptr); +}; + +#endif // IR_SANYO_H_ diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Sharp.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Sharp.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Sharp.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Sharp.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Sharp.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Sharp.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Sharp.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Sharp.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Sherwood.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Sherwood.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Sherwood.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Sherwood.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Sony.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Sony.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Sony.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Sony.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Symphony.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Symphony.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Symphony.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Symphony.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Tcl.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Tcl.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Tcl.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Tcl.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Tcl.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Tcl.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Tcl.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Tcl.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Teco.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Teco.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Teco.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Teco.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Teco.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Teco.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Teco.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Teco.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Toshiba.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Toshiba.cpp similarity index 54% rename from lib/IRremoteESP8266-2.7.8/src/ir_Toshiba.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Toshiba.cpp index c28b700f8..f799885b3 100644 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Toshiba.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Toshiba.cpp @@ -4,6 +4,9 @@ /// @brief Support for Toshiba protocols. /// @see https://github.com/r45635/HVAC-IR-Control /// @see https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266T.ino#L77 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1205 +/// @see https://www.toshiba-carrier.co.jp/global/about/index.htm +/// @see http://www.toshiba-carrier.co.th/AboutUs/Pages/CompanyProfile.aspx #include "ir_Toshiba.h" #include @@ -21,10 +24,10 @@ // Toshiba A/C const uint16_t kToshibaAcHdrMark = 4400; const uint16_t kToshibaAcHdrSpace = 4300; -const uint16_t kToshibaAcBitMark = 543; -const uint16_t kToshibaAcOneSpace = 1623; -const uint16_t kToshibaAcZeroSpace = 472; -const uint16_t kToshibaAcMinGap = 7048; +const uint16_t kToshibaAcBitMark = 580; +const uint16_t kToshibaAcOneSpace = 1600; +const uint16_t kToshibaAcZeroSpace = 490; +const uint16_t kToshibaAcMinGap = 7400; using irutils::addBoolToString; using irutils::addFanToString; @@ -32,6 +35,8 @@ using irutils::addIntToString; using irutils::addLabeledString; using irutils::addModeToString; using irutils::addTempToString; +using irutils::checkInvertedBytePairs; +using irutils::invertBytePairs; using irutils::setBit; using irutils::setBits; @@ -41,10 +46,8 @@ using irutils::setBits; /// @param[in] data The message to be sent. /// @param[in] nbytes The number of bytes of message to be sent. /// @param[in] repeat The number of times the command is to be repeated. -void IRsend::sendToshibaAC(const unsigned char data[], const uint16_t nbytes, +void IRsend::sendToshibaAC(const uint8_t data[], const uint16_t nbytes, const uint16_t repeat) { - if (nbytes < kToshibaACStateLength) - return; // Not enough bytes to send a proper message. sendGeneric(kToshibaAcHdrMark, kToshibaAcHdrSpace, kToshibaAcBitMark, kToshibaAcOneSpace, kToshibaAcBitMark, kToshibaAcZeroSpace, kToshibaAcBitMark, kToshibaAcMinGap, data, nbytes, 38, true, @@ -58,7 +61,7 @@ void IRsend::sendToshibaAC(const unsigned char data[], const uint16_t nbytes, /// @param[in] use_modulation Is frequency modulation to be used? IRToshibaAC::IRToshibaAC(const uint16_t pin, const bool inverted, const bool use_modulation) - : _irsend(pin, inverted, use_modulation) { this->stateReset(); } + : _irsend(pin, inverted, use_modulation) { stateReset(); } /// Reset the state of the remote to a known good state/sequence. /// @see https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266T.ino#L103 @@ -66,24 +69,72 @@ void IRToshibaAC::stateReset(void) { static const uint8_t kReset[kToshibaACStateLength] = { 0xF2, 0x0D, 0x03, 0xFC, 0x01}; memcpy(remote_state, kReset, kToshibaACStateLength); - mode_state = getMode(true); + setTemp(22); // Remote defaults to 22C after factory reset. So do the same. + setSwing(kToshibaAcSwingOff); + prev_mode = getMode(); } /// Set up hardware to be able to send a message. void IRToshibaAC::begin(void) { _irsend.begin(); } #if SEND_TOSHIBA_AC -/// Send the current internal state as an IR message. +/// Send the current internal state as IR messages. /// @param[in] repeat Nr. of times the message will be repeated. void IRToshibaAC::send(const uint16_t repeat) { - _irsend.sendToshibaAC(getRaw(), kToshibaACStateLength, repeat); + _backupState(); + _irsend.sendToshibaAC(getRaw(), getStateLength(), repeat); + if (_send_swing && (getStateLength() != kToshibaACStateLengthShort)) { + setStateLength(kToshibaACStateLengthShort); + // Swing settings expect the min temp to be set. + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1205#issuecomment-653922374 + setTemp(kToshibaAcMinTemp); + setSwing(_swing_mode); + _irsend.sendToshibaAC(getRaw(), getStateLength(), repeat); + _restoreState(); + } + _send_swing = false; } #endif // SEND_TOSHIBA_AC -/// Get a PTR to the internal state/code for this protocol. +/// Get the length of the supplied Toshiba state per it's protocol structure. +/// @param[in] state The array to get the built-in length from. +/// @param[in] size The physical size of the state array. +/// @return Nr. of bytes in use for the provided state message. +uint16_t IRToshibaAC::getInternalStateLength(const uint8_t state[], + const uint16_t size) { + if (size < kToshibaAcLengthByte) return 0; + return std::min((uint16_t)(state[kToshibaAcLengthByte] + kToshibaAcMinLength), + kToshibaACStateLengthLong); +} + +/// Get the length of the current internal state per the protocol structure. +/// @return Nr. of bytes in use for the current internal state message. +uint16_t IRToshibaAC::getStateLength(void) { + return getInternalStateLength(remote_state, kToshibaACStateLengthLong); +} + +/// Set the internal length of the current internal state per the protocol. +/// @param[in] size Nr. of bytes in use for the current internal state message. +void IRToshibaAC::setStateLength(const uint16_t size) { + if (size < kToshibaAcMinLength) return; + remote_state[kToshibaAcLengthByte] = size - kToshibaAcMinLength; +} + +/// Make a copy of the internal code-form A/C state. +void IRToshibaAC::_backupState(void) { + memcpy(backup, remote_state, kToshibaACStateLengthLong); +} + +/// Recover the internal code-form A/C state from the backup. +void IRToshibaAC::_restoreState(void) { + memcpy(remote_state, backup, kToshibaACStateLengthLong); +} + +/// Get a PTR to the internal state/code for this protocol with all integrity +/// checks passing. /// @return PTR to a code for this protocol based on the current internal state. uint8_t* IRToshibaAC::getRaw(void) { - this->checksum(); + checksum(getStateLength()); return remote_state; } @@ -91,7 +142,8 @@ uint8_t* IRToshibaAC::getRaw(void) { /// @param[in] newState A valid code for this protocol. void IRToshibaAC::setRaw(const uint8_t newState[]) { memcpy(remote_state, newState, kToshibaACStateLength); - mode_state = this->getMode(true); + prev_mode = getMode(); + _send_swing = true; } /// Calculate the checksum for a given state. @@ -100,13 +152,7 @@ void IRToshibaAC::setRaw(const uint8_t newState[]) { /// @return The calculated checksum value. uint8_t IRToshibaAC::calcChecksum(const uint8_t state[], const uint16_t length) { - uint8_t checksum = 0; - // Only calculate it for valid lengths. - if (length > 1) { - // Checksum is simple XOR of all bytes except the last one. - for (uint8_t i = 0; i < length - 1; i++) checksum ^= state[i]; - } - return checksum; + return length ? xorBytes(state, length - 1) : 0; } /// Verify the checksum is valid for a given state. @@ -114,17 +160,27 @@ uint8_t IRToshibaAC::calcChecksum(const uint8_t state[], /// @param[in] length The length/size of the array. /// @return true, if the state has a valid checksum. Otherwise, false. bool IRToshibaAC::validChecksum(const uint8_t state[], const uint16_t length) { - return (length > 1 && state[length - 1] == IRToshibaAC::calcChecksum(state, - length)); + return length >= kToshibaAcMinLength && + state[length - 1] == IRToshibaAC::calcChecksum(state, length) && + checkInvertedBytePairs(state, kToshibaAcInvertedLength) && + IRToshibaAC::getInternalStateLength(state, length) == length; } /// Calculate & set the checksum for the current internal state of the remote. /// @param[in] length The length/size of the internal array to checksum. - void IRToshibaAC::checksum(const uint16_t length) { // Stored the checksum value in the last byte. - if (length > 1) remote_state[length - 1] = this->calcChecksum(remote_state, - length); + if (length >= kToshibaAcMinLength) { + // Set/clear the short msg bit. + setBit(&remote_state[4], kToshibaAcShortMsgBit, + getStateLength() == kToshibaACStateLengthShort); + // Set/clear the long msg bit. + setBit(&remote_state[4], kToshibaAcLongMsgBit, + getStateLength() == kToshibaACStateLengthLong); + invertBytePairs(remote_state, kToshibaAcInvertedLength); + // Always do the Xor checksum LAST! + remote_state[length - 1] = calcChecksum(remote_state, length); + } } /// Set the requested power state of the A/C to on. @@ -136,19 +192,18 @@ void IRToshibaAC::off(void) { setPower(false); } /// Change the power setting. /// @param[in] on true, the setting is on. false, the setting is off. void IRToshibaAC::setPower(const bool on) { - setBit(&remote_state[6], kToshibaAcPowerOffset, !on); // Cleared when on. - if (on) - setMode(mode_state); - else - setBits(&remote_state[6], kToshibaAcModeOffset, kToshibaAcModeSize, - kToshibaAcHeat); + if (on) { // On + // If not already on, pick the last non-off mode used + if (!getPower()) setMode(prev_mode); + } else { // Off + setMode(kToshibaAcOff); + } } - /// Get the value of the current power setting. /// @return true, the setting is on. false, the setting is off. bool IRToshibaAC::getPower(void) { - return !GETBIT8(remote_state[6], kToshibaAcPowerOffset); + return getMode(true) != kToshibaAcOff; } /// Set the temperature. @@ -187,32 +242,104 @@ uint8_t IRToshibaAC::getFan(void) { return --fan; } +/// Get the swing setting of the A/C. +/// @param[in] raw Calculate the answer from just the state data. +/// @return The current swing mode setting. +uint8_t IRToshibaAC::getSwing(const bool raw) { + return raw ? GETBITS8(remote_state[5], kToshibaAcSwingOffset, + kToshibaAcSwingSize) : _swing_mode; +} + +/// Set the swing setting of the A/C. +/// @param[in] setting The value of the desired setting. +void IRToshibaAC::setSwing(const uint8_t setting) { + switch (setting) { + case kToshibaAcSwingStep: + case kToshibaAcSwingOn: + case kToshibaAcSwingOff: + _send_swing = true; + _swing_mode = setting; + if (getStateLength() == kToshibaACStateLengthShort) + setBits(&remote_state[5], kToshibaAcSwingOffset, kToshibaAcSwingSize, + setting); + } +} + /// Get the operating mode setting of the A/C. -/// @param[in] useRaw Indicate to get the mode from the internal state array. +/// @param[in] raw Get the value without any intelligent processing. /// @return The current operating mode setting. -uint8_t IRToshibaAC::getMode(const bool useRaw) { - if (useRaw) - return GETBITS8(remote_state[6], kToshibaAcModeOffset, kToshibaAcModeSize); - else - return mode_state; +uint8_t IRToshibaAC::getMode(const bool raw) { + const uint8_t mode = GETBITS8(remote_state[6], kToshibaAcModeOffset, + kToshibaAcModeSize); + if (raw) return mode; + switch (mode) { + case kToshibaAcOff: return prev_mode; + default: return mode; + } } /// Set the operating mode of the A/C. /// @param[in] mode The desired operating mode. /// @note If we get an unexpected mode, default to AUTO. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1205#issuecomment-654446771 void IRToshibaAC::setMode(const uint8_t mode) { + if (mode != prev_mode) + // Changing mode or power turns Econo & Turbo to off on a real remote. + // Setting the internal message length to "normal" will do that. + setStateLength(kToshibaACStateLength); switch (mode) { case kToshibaAcAuto: case kToshibaAcCool: case kToshibaAcDry: case kToshibaAcHeat: - mode_state = mode; - // Only adjust the remote_state if we have power set to on. - if (getPower()) - setBits(&remote_state[6], kToshibaAcModeOffset, kToshibaAcModeSize, - mode_state); - return; - default: this->setMode(kToshibaAcAuto); // There is no Fan mode. + case kToshibaAcFan: + prev_mode = mode; + // FALL-THRU + case kToshibaAcOff: + setBits(&remote_state[6], kToshibaAcModeOffset, kToshibaAcModeSize, + mode); + break; + default: setMode(kToshibaAcAuto); + } +} + +/// Get the Turbo (Powerful) setting of the A/C. +/// @return true, if the current setting is on. Otherwise, false. +bool IRToshibaAC::getTurbo(void) { + if (getStateLength() == kToshibaACStateLengthLong) + return remote_state[8] == kToshibaAcTurboOn; + return false; +} + +/// Set the Turbo (Powerful) setting of the A/C. +/// @param[in] on true, the setting is on. false, the setting is off. +/// Note: Turbo mode is mutually exclusive with Economy mode. +void IRToshibaAC::setTurbo(const bool on) { + if (on) { + remote_state[8] = kToshibaAcTurboOn; + setStateLength(kToshibaACStateLengthLong); + } else { + if (!getEcono()) setStateLength(kToshibaACStateLength); + } +} + +/// Get the Economy mode setting of the A/C. +/// @return true, if the current setting is on. Otherwise, false. +bool IRToshibaAC::getEcono(void) { + if (getStateLength() == kToshibaACStateLengthLong) + return remote_state[8] == kToshibaAcEconoOn; + return false; +} + +/// Set the Economy mode setting of the A/C. +/// @param[in] on true, the setting is on. false, the setting is off. +/// Note: Economy mode is mutually exclusive with Turbo mode. +void IRToshibaAC::setEcono(const bool on) { + if (on) { + remote_state[8] = kToshibaAcEconoOn; + setStateLength(kToshibaACStateLengthLong); + } else { + if (!getTurbo()) setStateLength(kToshibaACStateLength); } } @@ -224,7 +351,8 @@ uint8_t IRToshibaAC::convertMode(const stdAc::opmode_t mode) { case stdAc::opmode_t::kCool: return kToshibaAcCool; case stdAc::opmode_t::kHeat: return kToshibaAcHeat; case stdAc::opmode_t::kDry: return kToshibaAcDry; - // No Fan mode. + case stdAc::opmode_t::kFan: return kToshibaAcFan; + case stdAc::opmode_t::kOff: return kToshibaAcOff; default: return kToshibaAcAuto; } } @@ -251,6 +379,8 @@ stdAc::opmode_t IRToshibaAC::toCommonMode(const uint8_t mode) { case kToshibaAcCool: return stdAc::opmode_t::kCool; case kToshibaAcHeat: return stdAc::opmode_t::kHeat; case kToshibaAcDry: return stdAc::opmode_t::kDry; + case kToshibaAcFan: return stdAc::opmode_t::kFan; + case kToshibaAcOff: return stdAc::opmode_t::kOff; default: return stdAc::opmode_t::kAuto; } } @@ -280,12 +410,13 @@ stdAc::state_t IRToshibaAC::toCommon(void) { result.celsius = true; result.degrees = this->getTemp(); result.fanspeed = this->toCommonFanSpeed(this->getFan()); + result.swingv = (getSwing() == kToshibaAcSwingOn) ? stdAc::swingv_t::kAuto + : stdAc::swingv_t::kOff; + result.turbo = getTurbo(); + result.econo = getEcono(); // Not supported. - result.turbo = false; result.light = false; result.filter = false; - result.econo = false; - result.swingv = stdAc::swingv_t::kOff; result.swingh = stdAc::swingh_t::kOff; result.quiet = false; result.clean = false; @@ -299,14 +430,33 @@ stdAc::state_t IRToshibaAC::toCommon(void) { /// @return A human readable string. String IRToshibaAC::toString(void) { String result = ""; - result.reserve(40); - result += addBoolToString(getPower(), kPowerStr, false); - result += addModeToString(getMode(), kToshibaAcAuto, kToshibaAcCool, - kToshibaAcHeat, kToshibaAcDry, kToshibaAcAuto); - result += addTempToString(getTemp()); - result += addFanToString(getFan(), kToshibaAcFanMax, kToshibaAcFanMin, - kToshibaAcFanAuto, kToshibaAcFanAuto, - kToshibaAcFanMed); + result.reserve(80); + result += addTempToString(getTemp(), true, false); + switch (getStateLength()) { + case kToshibaACStateLengthShort: + result += addIntToString(getSwing(true), kSwingVStr); + result += kSpaceLBraceStr; + switch (getSwing(true)) { + case kToshibaAcSwingOff: result += kOffStr; break; + case kToshibaAcSwingOn: result += kOnStr; break; + case kToshibaAcSwingStep: result += kStepStr; break; + default: result += kUnknownStr; + } + result += ')'; + break; + case kToshibaACStateLengthLong: + case kToshibaACStateLength: + default: + result += addBoolToString(getPower(), kPowerStr); + if (getPower()) + result += addModeToString(getMode(), kToshibaAcAuto, kToshibaAcCool, + kToshibaAcHeat, kToshibaAcDry, kToshibaAcFan); + result += addFanToString(getFan(), kToshibaAcFanMax, kToshibaAcFanMin, + kToshibaAcFanAuto, kToshibaAcFanAuto, + kToshibaAcFanMed); + result += addBoolToString(getTurbo(), kTurboStr); + result += addBoolToString(getEcono(), kEconoStr); + } return result; } @@ -322,8 +472,16 @@ String IRToshibaAC::toString(void) { 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. + if (strict) { + switch (nbits) { // Must be called with the correct nr. of bits. + case kToshibaACBits: + case kToshibaACBitsShort: + case kToshibaACBitsLong: + break; + default: + return false; + } + } // Match Header + Data + Footer if (!matchGeneric(results->rawbuf + offset, results->state, @@ -336,7 +494,7 @@ bool IRrecv::decodeToshibaAC(decode_results* results, uint16_t offset, // Compliance if (strict) { // Check that the checksum of the message is correct. - if (!IRToshibaAC::validChecksum(results->state)) return false; + if (!IRToshibaAC::validChecksum(results->state, nbits / 8)) return false; } // Success diff --git a/lib/IRremoteESP8266-2.7.8.10/src/ir_Toshiba.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Toshiba.h new file mode 100644 index 000000000..803cc59b5 --- /dev/null +++ b/lib/IRremoteESP8266-2.7.8.10/src/ir_Toshiba.h @@ -0,0 +1,165 @@ +// Copyright 2017 David Conran + +/// @file +/// @brief Support for Toshiba protocols. +/// @see https://github.com/r45635/HVAC-IR-Control +/// @see https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266T.ino#L77 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1205 +/// @see https://docs.google.com/spreadsheets/d/1yidE2fvaO9kpCHfKafIdH31q4uaskYR1OwwrkyOxbp0/edit?usp=drivesdk +/// @see https://www.toshiba-carrier.co.jp/global/about/index.htm +/// @see http://www.toshiba-carrier.co.th/AboutUs/Pages/CompanyProfile.aspx + +// Supports: +// Brand: Toshiba, Model: RAS-B13N3KV2 +// Brand: Toshiba, Model: Akita EVO II +// Brand: Toshiba, Model: RAS-B13N3KVP-E +// Brand: Toshiba, Model: RAS 18SKP-ES +// Brand: Toshiba, Model: WH-TA04NE +// Brand: Toshiba, Model: WC-L03SE +// Brand: Carrier, Model: 42NQV060M2 / 38NYV060M2 A/C +// Brand: Carrier, Model: 42NQV050M2 / 38NYV050M2 A/C +// Brand: Carrier, Model: 42NQV035M2 / 38NYV035M2 A/C +// Brand: Carrier, Model: 42NQV025M2 / 38NYV025M2 A/C + +#ifndef IR_TOSHIBA_H_ +#define IR_TOSHIBA_H_ + +#define __STDC_LIMIT_MACROS +#include +#ifdef ARDUINO +#include +#endif +#include "IRremoteESP8266.h" +#include "IRsend.h" +#ifdef UNIT_TEST +#include "IRsend_test.h" +#endif + +// Constants +// Byte[0] - 0xF2 +// Byte[1] - 0x0D (inverted previous byte's value) +// Byte[2] - The expected payload length (in bytes) past the Byte[4]. +const uint8_t kToshibaAcLengthByte = 2; ///< Byte pos of the "length" attribute +const uint8_t kToshibaAcMinLength = 6; ///< Min Nr. of bytes in a message. +///< Known lengths are: +///< 1 (56 bit message) +///< 3 (72 bit message) +///< 4 (80 bit message) +// Byte[3] - The bit-inverted value of the "length" byte. +const uint16_t kToshibaAcInvertedLength = 4; ///< Nr. of leading bytes in + ///< inverted pairs. +// Byte[4] +const uint8_t kToshibaAcShortMsgBit = 5; ///< Mask 0b00x00000 +const uint8_t kToshibaAcLongMsgBit = 3; ///< Mask 0b00001000 +// Byte[5] +const uint8_t kToshibaAcSwingOffset = 0; ///< Bit offset. +const uint8_t kToshibaAcSwingSize = 2; ///< Mask 0b000000xx +const uint8_t kToshibaAcSwingStep = 0; ///< 0b00 +const uint8_t kToshibaAcSwingOn = 1; ///< 0b01 +const uint8_t kToshibaAcSwingOff = 2; ///< 0b10 + +const uint8_t kToshibaAcTempOffset = 4; ///< Bit offset. +const uint8_t kToshibaAcTempSize = 4; ///< Mask 0bxxxx0000 +const uint8_t kToshibaAcMinTemp = 17; ///< 17C +const uint8_t kToshibaAcMaxTemp = 30; ///< 30C +// Byte[6] +const uint8_t kToshibaAcModeOffset = 0; +const uint8_t kToshibaAcModeSize = 3; // Mask 0b00000xxx +const uint8_t kToshibaAcAuto = 0; // 0b000 +const uint8_t kToshibaAcCool = 1; // 0b001 +const uint8_t kToshibaAcDry = 2; // 0b010 +const uint8_t kToshibaAcHeat = 3; // 0b011 +const uint8_t kToshibaAcFan = 4; // 0b100 +const uint8_t kToshibaAcOff = 7; // 0b111 +const uint8_t kToshibaAcFanOffset = 5; +const uint8_t kToshibaAcFanSize = 3; // Mask 0bxxx00000 +const uint8_t kToshibaAcFanAuto = 0; // 0b000 +const uint8_t kToshibaAcFanMin = 1; // 0b001 +const uint8_t kToshibaAcFanMed = 3; // 0b011 +const uint8_t kToshibaAcFanMax = 5; // 0b101 +// Byte[8] (Checksum for 72 bit messages, Eco/Turbo for long 80 bit messages) +const uint8_t kToshibaAcEcoTurboOffset = 0; +const uint8_t kToshibaAcEcoTurboSize = 2; // Mask 0b000000xx +const uint8_t kToshibaAcTurboOn = 1; // 0b01 +const uint8_t kToshibaAcEconoOn = 3; // 0b11 +// Byte[last] - Checksum (xor) + +// Legacy defines. (Deperecated) +#define TOSHIBA_AC_AUTO kToshibaAcAuto +#define TOSHIBA_AC_COOL kToshibaAcCool +#define TOSHIBA_AC_DRY kToshibaAcDry +#define TOSHIBA_AC_HEAT kToshibaAcHeat +#define TOSHIBA_AC_POWER kToshibaAcPower +#define TOSHIBA_AC_FAN_AUTO kToshibaAcFanAuto +#define TOSHIBA_AC_FAN_MAX kToshibaAcFanMax +#define TOSHIBA_AC_MIN_TEMP kToshibaAcMinTemp +#define TOSHIBA_AC_MAX_TEMP kToshibaAcMaxTemp + +// Classes +/// Class for handling detailed Toshiba A/C messages. +class IRToshibaAC { + public: + explicit IRToshibaAC(const uint16_t pin, const bool inverted = false, + const bool use_modulation = true); + void stateReset(void); +#if SEND_TOSHIBA_AC + void send(const uint16_t repeat = kToshibaACMinRepeat); + /// Run the calibration to calculate uSec timing offsets for this platform. + /// @return The uSec timing offset needed per modulation of the IR Led. + /// @note This will produce a 65ms IR signal pulse at 38kHz. + /// Only ever needs to be run once per object instantiation, if at all. + int8_t calibrate(void) { return _irsend.calibrate(); } +#endif // SEND_TOSHIBA_AC + 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 setTurbo(const bool on); + bool getTurbo(void); + void setEcono(const bool on); + bool getEcono(void); + void setMode(const uint8_t mode); + uint8_t getMode(const bool raw = false); + void setRaw(const uint8_t newState[]); + uint8_t* getRaw(void); + static uint16_t getInternalStateLength(const uint8_t state[], + const uint16_t size); + uint16_t getStateLength(void); + static bool validChecksum(const uint8_t state[], + const uint16_t length = kToshibaACStateLength); + uint8_t getSwing(const bool raw = true); + void setSwing(const uint8_t setting); + uint8_t convertMode(const stdAc::opmode_t mode); + uint8_t convertFan(const stdAc::fanspeed_t speed); + static stdAc::opmode_t toCommonMode(const uint8_t mode); + static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); + stdAc::state_t toCommon(void); + String toString(void); +#ifndef UNIT_TEST + + private: + IRsend _irsend; ///< Instance of the IR send class +#else // UNIT_TEST + /// @cond IGNORE + IRsendTest _irsend; ///< Instance of the testing IR send class + /// @endcond +#endif // UNIT_TEST + uint8_t remote_state[kToshibaACStateLengthLong]; ///< The state in code form. + uint8_t backup[kToshibaACStateLengthLong]; ///< A backup copy of the state. + uint8_t prev_mode; ///< Store of the previously set mode. + bool _send_swing; ///< Flag indicating if we need to send a swing message. + uint8_t _swing_mode; ///< The saved swing state/mode/command. + void checksum(const uint16_t length = kToshibaACStateLength); + static uint8_t calcChecksum(const uint8_t state[], + const uint16_t length = kToshibaACStateLength); + void setStateLength(const uint16_t size); + void _backupState(void); + void _restoreState(void); +}; + +#endif // IR_TOSHIBA_H_ diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Trotec.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Trotec.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Trotec.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Trotec.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Trotec.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Trotec.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Trotec.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Trotec.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Vestel.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Vestel.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Vestel.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Vestel.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Vestel.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Vestel.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Vestel.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Vestel.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Whirlpool.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Whirlpool.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Whirlpool.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Whirlpool.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Whirlpool.h b/lib/IRremoteESP8266-2.7.8.10/src/ir_Whirlpool.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Whirlpool.h rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Whirlpool.h diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Whynter.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Whynter.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Whynter.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Whynter.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Zepeal.cpp b/lib/IRremoteESP8266-2.7.8.10/src/ir_Zepeal.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/ir_Zepeal.cpp rename to lib/IRremoteESP8266-2.7.8.10/src/ir_Zepeal.cpp diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/README.md b/lib/IRremoteESP8266-2.7.8.10/src/locale/README.md similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/README.md rename to lib/IRremoteESP8266-2.7.8.10/src/locale/README.md diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/de-CH.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/de-CH.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/de-CH.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/de-CH.h diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/de-DE.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/de-DE.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/de-DE.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/de-DE.h diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/defaults.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/defaults.h similarity index 99% rename from lib/IRremoteESP8266-2.7.8/src/locale/defaults.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/defaults.h index 340e2b8fe..7fc0990e1 100644 --- a/lib/IRremoteESP8266-2.7.8/src/locale/defaults.h +++ b/lib/IRremoteESP8266-2.7.8.10/src/locale/defaults.h @@ -360,6 +360,9 @@ // Compound words/phrases/descriptions from pre-defined words. // Note: Obviously these need to be defined *after* their component words. +#ifndef D_STR_ECONOTOGGLE +#define D_STR_ECONOTOGGLE D_STR_ECONO " " D_STR_TOGGLE +#endif // D_STR_ECONOTOGGLE #ifndef D_STR_EYEAUTO #define D_STR_EYEAUTO D_STR_EYE " " D_STR_AUTO #endif // D_STR_EYEAUTO @@ -685,6 +688,9 @@ #ifndef D_STR_SANYO #define D_STR_SANYO "SANYO" #endif // D_STR_SANYO +#ifndef D_STR_SANYO_AC +#define D_STR_SANYO_AC "SANYO_AC" +#endif // D_STR_SANYO_AC #ifndef D_STR_SANYO_LC7461 #define D_STR_SANYO_LC7461 "SANYO_LC7461" #endif // D_STR_SANYO_LC7461 diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/en-AU.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/en-AU.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/en-AU.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/en-AU.h diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/en-IE.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/en-IE.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/en-IE.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/en-IE.h diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/en-UK.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/en-UK.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/en-UK.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/en-UK.h diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/en-US.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/en-US.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/en-US.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/en-US.h diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/es-ES.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/es-ES.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/es-ES.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/es-ES.h diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/fr-FR.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/fr-FR.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/fr-FR.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/fr-FR.h diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/it-IT.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/it-IT.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/it-IT.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/it-IT.h diff --git a/lib/IRremoteESP8266-2.7.8/src/locale/zh-CN.h b/lib/IRremoteESP8266-2.7.8.10/src/locale/zh-CN.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/src/locale/zh-CN.h rename to lib/IRremoteESP8266-2.7.8.10/src/locale/zh-CN.h diff --git a/lib/IRremoteESP8266-2.7.8/test/IRac_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/IRac_test.cpp similarity index 90% rename from lib/IRremoteESP8266-2.7.8/test/IRac_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/IRac_test.cpp index a0f975666..f91be3459 100644 --- a/lib/IRremoteESP8266-2.7.8/test/IRac_test.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/test/IRac_test.cpp @@ -1,6 +1,7 @@ // Copyright 2019 David Conran #include +#include "ir_Airwell.h" #include "ir_Amcor.h" #include "ir_Argo.h" #include "ir_Carrier.h" @@ -39,10 +40,33 @@ // Tests for IRac class. +TEST(TestIRac, Airwell) { + IRAirwellAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); + char expected[] = + "Power Toggle: On, Mode: 3 (Auto), Fan: 1 (Medium), Temp: 18C"; + + ac.begin(); + irac.airwell(&ac, + true, // Power + stdAc::opmode_t::kAuto, // Mode + 18, // Celsius + stdAc::fanspeed_t::kMedium); // Fan speed + ASSERT_EQ(expected, ac.toString()); + ac._irsend.makeDecodeResult(); + EXPECT_TRUE(capture.decode(&ac._irsend.capture)); + ASSERT_EQ(AIRWELL, ac._irsend.capture.decode_type); + ASSERT_EQ(kAirwellBits, ac._irsend.capture.bits); + ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); +} + TEST(TestIRac, Amcor) { - IRAmcorAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRAmcorAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 5 (Auto), Fan: 3 (High), Temp: 19C, Max: Off"; @@ -63,8 +87,8 @@ TEST(TestIRac, Amcor) { } TEST(TestIRac, Argo) { - IRArgoAC ac(0); - IRac irac(0); + IRArgoAC ac(kGpioUnused); + IRac irac(kGpioUnused); ac.begin(); irac.argo(&ac, @@ -118,9 +142,9 @@ TEST(TestIRac, Carrier64) { } TEST(TestIRac, Coolix) { - IRCoolixAC ac(0); - IRac irac(0); - IRrecv capture(0); + IRCoolixAC ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 3 (Heat), Fan: 1 (Max), Temp: 21C, Zone Follow: Off, " "Sensor Temp: Off"; @@ -221,9 +245,9 @@ TEST(TestIRac, Corona) { } TEST(TestIRac, Daikin) { - IRDaikinESP ac(0); - IRac irac(0); - IRrecv capture(0); + IRDaikinESP ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 3 (Cool), Temp: 19C, Fan: 5 (High), Powerful: Off, " "Quiet: Off, Sensor: Off, Mould: On, Comfort: Off, " @@ -254,9 +278,9 @@ TEST(TestIRac, Daikin) { } TEST(TestIRac, Daikin128) { - IRDaikin128 ac(0); - IRac irac(0); - IRrecv capture(0); + IRDaikin128 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power Toggle: On, Mode: 8 (Heat), Temp: 27C, Fan: 9 (Quiet), " "Powerful: Off, Quiet: On, Swing(V): On, Sleep: On, " @@ -287,9 +311,9 @@ TEST(TestIRac, Daikin128) { } TEST(TestIRac, Daikin152) { - IRDaikin152 ac(0); - IRac irac(0); - IRrecv capture(0); + IRDaikin152 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 3 (Cool), Temp: 27C, Fan: 3 (Medium), Swing(V): On, " "Powerful: Off, Quiet: Off, Econo: On, Sensor: Off, Comfort: Off"; @@ -315,9 +339,9 @@ TEST(TestIRac, Daikin152) { } TEST(TestIRac, Daikin160) { - IRDaikin160 ac(0); - IRac irac(0); - IRrecv capture(0); + IRDaikin160 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 2 (Dry), Temp: 23C, Fan: 1 (Low), " "Swing(V): 3 (Middle)"; @@ -340,9 +364,9 @@ TEST(TestIRac, Daikin160) { } TEST(TestIRac, Daikin176) { - IRDaikin176 ac(0); - IRac irac(0); - IRrecv capture(0); + IRDaikin176 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 7 (Cool), Temp: 26C, Fan: 1 (Low), Swing(H): 5 (Auto)"; @@ -364,9 +388,9 @@ TEST(TestIRac, Daikin176) { } TEST(TestIRac, Daikin2) { - IRDaikin2 ac(0); - IRac irac(0); - IRrecv capture(0); + IRDaikin2 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 3 (Cool), Temp: 19C, Fan: 1 (Low), " "Swing(V): 14 (Auto), Swing(H): 170 (UNKNOWN), Clock: 00:00, " @@ -402,9 +426,9 @@ TEST(TestIRac, Daikin2) { } TEST(TestIRac, Daikin216) { - IRDaikin216 ac(0); - IRac irac(0); - IRrecv capture(0); + IRDaikin216 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 4 (Heat), Temp: 31C, Fan: 11 (Quiet), " "Swing(H): On, Swing(V): On, Quiet: On, Powerful: Off"; @@ -511,9 +535,9 @@ TEST(TestIRac, Electra) { } TEST(TestIRac, Fujitsu) { - IRFujitsuAC ac(0); - IRac irac(0); - IRrecv capture(0); + IRFujitsuAC ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); std::string ardb1_expected = "Model: 2 (ARDB1), Power: On, Mode: 1 (Cool), Temp: 19C, " "Fan: 2 (Medium), Command: N/A"; @@ -591,9 +615,9 @@ TEST(TestIRac, Fujitsu) { } TEST(TestIRac, Goodweather) { - IRGoodweatherAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRGoodweatherAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 1 (Cool), Temp: 19C, Fan: 2 (Medium), Turbo: Toggle, " "Light: Toggle, Sleep: Toggle, Swing: 1 (Slow), Command: 0 (Power)"; @@ -619,9 +643,9 @@ TEST(TestIRac, Goodweather) { } TEST(TestIRac, Gree) { - IRGreeAC ac(0); - IRac irac(0); - IRrecv capture(0); + IRGreeAC ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Model: 1 (YAW1F), Power: On, Mode: 1 (Cool), Temp: 71F, " "Fan: 2 (Medium), Turbo: Off, IFeel: Off, WiFi: Off, XFan: On, " @@ -652,9 +676,9 @@ TEST(TestIRac, Gree) { } TEST(TestIRac, Haier) { - IRHaierAC ac(0); - IRac irac(0); - IRrecv capture(0); + IRHaierAC ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Command: 1 (On), Mode: 1 (Cool), Temp: 24C, Fan: 2 (Medium), " "Swing: 1 (Up), Sleep: On, Health: On, Clock: 13:45, " @@ -682,9 +706,9 @@ TEST(TestIRac, Haier) { TEST(TestIRac, HaierYrwo2) { - IRHaierACYRW02 ac(0); - IRac irac(0); - IRrecv capture(0); + IRHaierACYRW02 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 23C, " "Fan: 2 (Medium), Turbo: 1 (High), Swing: 1 (Highest), Sleep: On, " @@ -711,9 +735,9 @@ TEST(TestIRac, HaierYrwo2) { } TEST(TestIRac, Hitachi) { - IRHitachiAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRHitachiAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 2 (Auto), Temp: 22C, Fan: 3 (Medium), " "Swing(V): Off, Swing(H): On"; @@ -821,9 +845,9 @@ TEST(TestIRac, Hitachi344) { } TEST(TestIRac, Hitachi424) { - IRHitachiAc424 ac(0); - IRac irac(0); - IRrecv capture(0); + IRHitachiAc424 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 6 (Heat), Temp: 25C, Fan: 6 (Max), " "Button: 19 (Power/Mode), Swing(V) Toggle: Off"; @@ -866,9 +890,9 @@ TEST(TestIRac, Hitachi424) { } TEST(TestIRac, Kelvinator) { - IRKelvinatorAC ac(0); - IRac irac(0); - IRrecv capture(0); + IRKelvinatorAC ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 1 (Cool), Temp: 19C, Fan: 3 (Medium), Turbo: Off, " "Quiet: Off, XFan: On, Ion: On, Light: On, " @@ -899,9 +923,9 @@ TEST(TestIRac, Kelvinator) { } TEST(TestIRac, LG) { - IRLgAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRLgAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Model: 1 (GE6711AR2853M), " "Power: On, Mode: 1 (Dry), Temp: 27C, Fan: 2 (Medium)"; @@ -925,12 +949,12 @@ TEST(TestIRac, LG) { } TEST(TestIRac, Midea) { - IRMideaAC ac(0); - IRac irac(0); - IRrecv capture(0); + IRMideaAC ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 1 (Dry), Celsius: On, Temp: 27C/80F, Fan: 2 (Medium), " - "Sleep: On, Swing(V) Toggle: Off"; + "Sleep: On, Swing(V) Toggle: Off, Econo Toggle: Off"; ac.begin(); irac.midea(&ac, @@ -940,6 +964,7 @@ TEST(TestIRac, Midea) { 27, // Degrees stdAc::fanspeed_t::kMedium, // Fan speed stdAc::swingv_t::kOff, // Swing(V) + false, // Econo 8 * 60 + 0); // Sleep time ASSERT_EQ(expected, ac.toString()); @@ -953,9 +978,9 @@ TEST(TestIRac, Midea) { } TEST(TestIRac, Mitsubishi) { - IRMitsubishiAC ac(0); - IRac irac(0); - IRrecv capture(0); + IRMitsubishiAC ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 3 (Cool), Temp: 20C, Fan: 2 (Medium), " "Swing(V): 0 (Auto), Swing(H): 3 (UNKNOWN), " @@ -982,9 +1007,9 @@ TEST(TestIRac, Mitsubishi) { } TEST(TestIRac, Mitsubishi136) { - IRMitsubishi136 ac(0); - IRac irac(0); - IRrecv capture(0); + IRMitsubishi136 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 5 (Dry), Temp: 22C, Fan: 3 (High), " "Swing(V): 3 (Highest), Quiet: Off"; @@ -1008,9 +1033,9 @@ TEST(TestIRac, Mitsubishi136) { } TEST(TestIRac, MitsubishiHeavy88) { - IRMitsubishiHeavy88Ac ac(0); - IRac irac(0); - IRrecv capture(0); + IRMitsubishiHeavy88Ac ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 1 (Cool), Temp: 21C, Fan: 3 (Med), " "Swing(V): 4 (Auto), Swing(H): 0 (Off), Turbo: Off, Econo: Off, " @@ -1038,9 +1063,9 @@ TEST(TestIRac, MitsubishiHeavy88) { } TEST(TestIRac, MitsubishiHeavy152) { - IRMitsubishiHeavy152Ac ac(0); - IRac irac(0); - IRrecv capture(0); + IRMitsubishiHeavy152Ac ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 1 (Cool), Temp: 20C, Fan: 6 (Econo), " "Swing(V): 6 (Off), Swing(H): 0 (Auto), Silent: On, Turbo: Off, " @@ -1071,9 +1096,9 @@ TEST(TestIRac, MitsubishiHeavy152) { } TEST(TestIRac, Neoclima) { - IRNeoclimaAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRNeoclimaAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 1 (Cool), Temp: 20C, Fan: 3 (Low), " "Swing(V): Off, Swing(H): On, Sleep: On, Turbo: Off, Hold: Off, Ion: On, " @@ -1103,9 +1128,9 @@ TEST(TestIRac, Neoclima) { } TEST(TestIRac, Panasonic) { - IRPanasonicAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRPanasonicAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected_nke[] = "Model: 2 (NKE), Power: On, Mode: 4 (Heat), Temp: 28C, Fan: 2 (Medium), " "Swing(V): 15 (Auto), Swing(H): 6 (Middle), Quiet: On, " @@ -1161,9 +1186,9 @@ TEST(TestIRac, Panasonic) { } TEST(TestIRac, Samsung) { - IRSamsungAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRSamsungAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 0 (Auto), Temp: 28C, Fan: 6 (Auto), Swing: On, " "Beep: On, Clean: On, Quiet: On, Powerful: Off, Breeze: Off, " @@ -1223,10 +1248,38 @@ TEST(TestIRac, Samsung) { ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); } +TEST(TestIRac, Sanyo) { + IRSanyoAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); + char expected[] = + "Power: On, Mode: 2 (Cool), Temp: 28C, Fan: 3 (Medium), " + "Swing(V): 7 (Highest), Sleep: On, Beep: On, " + "Sensor: Wall, Sensor Temp: 28C, Off Timer: Off"; + + ac.begin(); + irac.sanyo(&ac, + true, // Power + stdAc::opmode_t::kCool, // Mode + 28, // Celsius + stdAc::fanspeed_t::kMedium, // Fan speed + stdAc::swingv_t::kHighest, // Vertical Swing + true, // Beep + 17); // Sleep + ASSERT_EQ(expected, ac.toString()); + ac._irsend.makeDecodeResult(); + EXPECT_TRUE(capture.decode(&ac._irsend.capture)); + ASSERT_EQ(SANYO_AC, ac._irsend.capture.decode_type); + ASSERT_EQ(kSanyoAcBits, ac._irsend.capture.bits); + ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); +} + TEST(TestIRac, Sharp) { - IRSharpAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRSharpAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 2 (Cool), Temp: 28C, Fan: 3 (Medium), " "Turbo: Off, Swing(V) Toggle: On, Ion: On, Econo: -, Clean: Off"; @@ -1253,9 +1306,9 @@ TEST(TestIRac, Sharp) { } TEST(TestIRac, Tcl112) { - IRTcl112Ac ac(0); - IRac irac(0); - IRrecv capture(0); + IRTcl112Ac ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 3 (Cool), Temp: 20C, Fan: 3 (Medium), Econo: On, " "Health: On, Light: On, Turbo: Off, Swing(H): On, Swing(V): Off"; @@ -1283,9 +1336,9 @@ TEST(TestIRac, Tcl112) { } TEST(TestIRac, Teco) { - IRTecoAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRTecoAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 0 (Auto), Temp: 21C, Fan: 2 (Medium), Sleep: On, " "Swing: On, Light: On, Humid: Off, Save: Off, Timer: Off"; @@ -1310,31 +1363,82 @@ TEST(TestIRac, Teco) { } TEST(TestIRac, Toshiba) { - IRToshibaAC ac(0); - IRac irac(0); - IRrecv capture(0); - char expected[] = "Power: On, Mode: 2 (Dry), Temp: 29C, Fan: 2 (UNKNOWN)"; + IRToshibaAC ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); + char expected[] = + "Temp: 29C, Power: On, Mode: 2 (Dry), Fan: 2 (UNKNOWN), " + "Turbo: Off, Econo: On"; ac.begin(); irac.toshiba(&ac, true, // Power stdAc::opmode_t::kDry, // Mode 29, // Celsius - stdAc::fanspeed_t::kLow); // Fan speed + stdAc::fanspeed_t::kLow, // Fan speed + stdAc::swingv_t::kOff, // Vertical Swing + false, // Turbo + true); // Econo ASSERT_EQ(expected, ac.toString()); + ASSERT_EQ(kToshibaACStateLengthLong, ac.getStateLength()); ac._irsend.makeDecodeResult(); EXPECT_TRUE(capture.decode(&ac._irsend.capture)); ASSERT_EQ(TOSHIBA_AC, ac._irsend.capture.decode_type); - ASSERT_EQ(kToshibaACBits, ac._irsend.capture.bits); + ASSERT_EQ(kToshibaACBitsLong, ac._irsend.capture.bits); ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + EXPECT_EQ( + "f38000d50" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s1600m580s490m580s490" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s490m580s1600m580s1600" + "m580s490m580s490m580s490m580s490m580s1600m580s490m580s490m580s1600" + "m580s1600m580s1600m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s1600m580s1600m580s490m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s1600m580s1600" + "m580s1600m580s490m580s1600m580s490m580s1600m580s490m580s490m580s490" + "m580s7400" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s1600m580s490m580s490" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s490m580s1600m580s1600" + "m580s490m580s490m580s490m580s490m580s1600m580s490m580s490m580s1600" + "m580s1600m580s1600m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s1600m580s1600m580s490m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s1600m580s1600" + "m580s1600m580s490m580s1600m580s490m580s1600m580s490m580s490m580s490" + "m580s7400" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s1600" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s1600m580s1600m580s490" + "m580s490m580s490m580s1600m580s490m580s490m580s490m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s1600m580s490m580s490m580s490m580s1600m580s1600" + "m580s7400" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s1600" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s1600m580s1600m580s490" + "m580s490m580s490m580s1600m580s490m580s490m580s490m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s1600m580s490m580s490m580s490m580s1600m580s1600" + "m580s7400", + ac._irsend.outputStr()); } TEST(TestIRac, Trotec) { - IRTrotecESP ac(0); - IRac irac(0); - IRrecv capture(0); + IRTrotecESP ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 1 (Cool), Temp: 18C, Fan: 3 (High), Sleep: On"; @@ -1361,9 +1465,9 @@ TEST(TestIRac, Trotec) { } TEST(TestIRac, Vestel) { - IRVestelAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRVestelAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Power: On, Mode: 0 (Auto), Temp: 22C, Fan: 5 (Low), Sleep: On, " "Turbo: Off, Ion: On, Swing: On"; @@ -1452,9 +1556,9 @@ TEST(TestIRac, Vestel) { TEST(TestIRac, Whirlpool) { - IRWhirlpoolAc ac(0); - IRac irac(0); - IRrecv capture(0); + IRWhirlpoolAc ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); char expected[] = "Model: 1 (DG11J13A), Power Toggle: On, Mode: 1 (Auto), Temp: 21C, " "Fan: 3 (Low), Swing: On, Light: On, Clock: 23:58, On Timer: Off, " @@ -1755,9 +1859,9 @@ TEST(TestIRac, Issue821) { next = prev; next.light = true; - IRac irac(0); - IRrecv capture(0); - IRCoolixAC ac(0); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); + IRCoolixAC ac(kGpioUnused); ac.begin(); result = irac.handleToggles(next, &prev); @@ -1844,9 +1948,9 @@ TEST(TestIRac, Issue1001) { desired = prev; desired.power = false; - IRac irac(0); - IRrecv capture(0); - IRWhirlpoolAc ac(0); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); + IRWhirlpoolAc ac(kGpioUnused); ac.begin(); ASSERT_TRUE(prev.power); diff --git a/lib/IRremoteESP8266-2.7.8/test/IRrecv_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/IRrecv_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/IRrecv_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/IRrecv_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/IRrecv_test.h b/lib/IRremoteESP8266-2.7.8.10/test/IRrecv_test.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/IRrecv_test.h rename to lib/IRremoteESP8266-2.7.8.10/test/IRrecv_test.h diff --git a/lib/IRremoteESP8266-2.7.8/test/IRsend_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/IRsend_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/IRsend_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/IRsend_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/IRsend_test.h b/lib/IRremoteESP8266-2.7.8.10/test/IRsend_test.h similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/IRsend_test.h rename to lib/IRremoteESP8266-2.7.8.10/test/IRsend_test.h diff --git a/lib/IRremoteESP8266-2.7.8/test/IRutils_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/IRutils_test.cpp similarity index 88% rename from lib/IRremoteESP8266-2.7.8/test/IRutils_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/IRutils_test.cpp index ecb23dbbf..0dde7ec04 100644 --- a/lib/IRremoteESP8266-2.7.8/test/IRutils_test.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/test/IRutils_test.cpp @@ -220,32 +220,32 @@ TEST(TestResultToSourceCode, ComplexProtocols) { ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); ASSERT_EQ(kToshibaACBits, irsend.capture.bits); EXPECT_EQ( - "uint16_t rawData[296] = {4400, 4300, 542, 1622, 542, 1622, " - "542, 1622, 542, 1622, 542, 472, 542, 472, 542, 1622, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 1622, 542, 1622, " - "542, 472, 542, 1622, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 1622, 542, 1622, 542, 1622, 542, 1622, " - "542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 1622, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 1622, 542, 7048, 4400, 4300, " - "542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 472, 542, 472, " - "542, 1622, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 1622, 542, 1622, 542, 472, 542, 1622, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 1622, 542, 1622, " - "542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 1622, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 1622, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, " - "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 1622, " - "542, 7048 }; // TOSHIBA_AC\n" + "uint16_t rawData[296] = {4400, 4300, 580, 1600, 580, 1600, " + "580, 1600, 580, 1600, 580, 490, 580, 490, 580, 1600, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 1600, 580, 1600, " + "580, 490, 580, 1600, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 1600, 580, 1600, 580, 1600, 580, 1600, " + "580, 1600, 580, 1600, 580, 1600, 580, 1600, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 1600, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 1600, 580, 7400, 4400, 4300, " + "580, 1600, 580, 1600, 580, 1600, 580, 1600, 580, 490, 580, 490, " + "580, 1600, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 1600, 580, 1600, 580, 490, 580, 1600, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 1600, 580, 1600, " + "580, 1600, 580, 1600, 580, 1600, 580, 1600, 580, 1600, 580, 1600, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 1600, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 490, " + "580, 490, 580, 490, 580, 490, 580, 490, 580, 490, 580, 1600, " + "580, 7400 }; // TOSHIBA_AC\n" "uint8_t state[9] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, 0x00, 0x00, 0x00, " "0x01};\n", resultToSourceCode(&irsend.capture)); @@ -744,3 +744,35 @@ TEST(TestUtils, setBits64Bit) { irutils::setBits(&data, 32, 4, 0b1001); EXPECT_EQ(0x4000000900000013, data); } + +TEST(TestUtils, InvertedBytePairs) { + const uint8_t correct[] = {0x00, 0xFF, 0x01, 0xFE, 0xAA, 0x55}; + uint8_t wrong[] = {0x00, 0xFF, 0x01, 0xFD, 0xAA, 0x55}; + + ASSERT_TRUE(irutils::checkInvertedBytePairs(correct, 6)); + ASSERT_TRUE(irutils::checkInvertedBytePairs(correct, 5)); + ASSERT_TRUE(irutils::checkInvertedBytePairs(correct, 4)); + ASSERT_TRUE(irutils::checkInvertedBytePairs(correct, 3)); + ASSERT_TRUE(irutils::checkInvertedBytePairs(correct, 2)); + ASSERT_TRUE(irutils::checkInvertedBytePairs(correct, 1)); + ASSERT_TRUE(irutils::checkInvertedBytePairs(correct, 0)); + + ASSERT_FALSE(irutils::checkInvertedBytePairs(wrong, 6)); + ASSERT_FALSE(irutils::checkInvertedBytePairs(wrong, 5)); + ASSERT_FALSE(irutils::checkInvertedBytePairs(wrong, 4)); + ASSERT_TRUE(irutils::checkInvertedBytePairs(wrong, 3)); + ASSERT_TRUE(irutils::checkInvertedBytePairs(wrong, 2)); + ASSERT_TRUE(irutils::checkInvertedBytePairs(wrong, 1)); + ASSERT_TRUE(irutils::checkInvertedBytePairs(wrong, 0)); + + irutils::invertBytePairs(wrong, 0); + ASSERT_FALSE(irutils::checkInvertedBytePairs(wrong, 6)); + irutils::invertBytePairs(wrong, 1); + ASSERT_FALSE(irutils::checkInvertedBytePairs(wrong, 6)); + irutils::invertBytePairs(wrong, 2); + ASSERT_FALSE(irutils::checkInvertedBytePairs(wrong, 6)); + + irutils::invertBytePairs(wrong, 6); + ASSERT_TRUE(irutils::checkInvertedBytePairs(wrong, 6)); + EXPECT_STATE_EQ(correct, wrong, 6 * 8); +} diff --git a/lib/IRremoteESP8266-2.7.8/test/Makefile b/lib/IRremoteESP8266-2.7.8.10/test/Makefile similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/Makefile rename to lib/IRremoteESP8266-2.7.8.10/test/Makefile diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Airwell_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Airwell_test.cpp similarity index 75% rename from lib/IRremoteESP8266-2.7.8/test/ir_Airwell_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Airwell_test.cpp index 09300bac2..e5f28d4df 100644 --- a/lib/IRremoteESP8266-2.7.8/test/ir_Airwell_test.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/test/ir_Airwell_test.cpp @@ -1,5 +1,6 @@ // Copyright 2020 David Conran +#include "ir_Airwell.h" #include "IRac.h" #include "IRrecv.h" #include "IRrecv_test.h" @@ -44,6 +45,9 @@ TEST(TestDecodeAirwell, RealExample) { EXPECT_EQ(0x2B0D0181B, irsend.capture.value); EXPECT_EQ(0x0, irsend.capture.address); EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_EQ( + "Power Toggle: On, Mode: 2 (Heat), Fan: 3 (Auto), Temp: 25C", + IRAcUtils::resultAcToString(&irsend.capture)); const uint16_t rawData_2[175] = { 2862, 3892, @@ -76,6 +80,9 @@ TEST(TestDecodeAirwell, RealExample) { EXPECT_EQ(0x270F8181B, irsend.capture.value); EXPECT_EQ(0x0, irsend.capture.address); EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_EQ( + "Power Toggle: On, Mode: 1 (Cool), Fan: 3 (Auto), Temp: 30C", + IRAcUtils::resultAcToString(&irsend.capture)); } TEST(TestDecodeAirwell, SyntheticExample) { @@ -192,6 +199,9 @@ TEST(TestDecodeAirwell, RealExample2) { EXPECT_EQ(0xB0C0181B, irsend.capture.value); EXPECT_EQ(0x0, irsend.capture.address); EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_EQ( + "Power Toggle: Off, Mode: 2 (Heat), Fan: 3 (Auto), Temp: 23C", + IRAcUtils::resultAcToString(&irsend.capture)); // Resend it as a synthetic to see if it decodes to the same value. irsend.reset(); @@ -210,7 +220,7 @@ TEST(TestUtils, Housekeeping) { ASSERT_EQ("AIRWELL", typeToString(decode_type_t::AIRWELL)); ASSERT_EQ(decode_type_t::AIRWELL, strToDecodeType("AIRWELL")); ASSERT_FALSE(hasACState(decode_type_t::AIRWELL)); - ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::AIRWELL)); + ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::AIRWELL)); ASSERT_EQ(kAirwellBits, IRsend::defaultBits(decode_type_t::AIRWELL)); ASSERT_EQ(kAirwellMinRepeats, IRsend::minRepeats(decode_type_t::AIRWELL)); } @@ -250,4 +260,142 @@ TEST(TestDecodeAirwell, RealExample3) { EXPECT_EQ(0x60080002, irsend.capture.value); EXPECT_EQ(0x0, irsend.capture.address); EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_EQ( + "Power Toggle: Off, Mode: 1 (Cool), Fan: 2 (High), Temp: 16C", + IRAcUtils::resultAcToString(&irsend.capture)); +} + +// Tests for IRAirwellAc class. + +TEST(TestAirwellAcClass, PowerToggle) { + IRAirwellAc ac(kGpioUnused); + ac.begin(); + + ac.setPowerToggle(true); + EXPECT_TRUE(ac.getPowerToggle()); + ac.setPowerToggle(false); + EXPECT_FALSE(ac.getPowerToggle()); + ac.setPowerToggle(true); + EXPECT_TRUE(ac.getPowerToggle()); +} + +TEST(TestAirwellAcClass, Temperature) { + IRAirwellAc ac(kGpioUnused); + ac.begin(); + + ac.setTemp(0); + EXPECT_EQ(kAirwellMinTemp, ac.getTemp()); + + ac.setTemp(255); + EXPECT_EQ(kAirwellMaxTemp, ac.getTemp()); + + ac.setTemp(kAirwellMinTemp); + EXPECT_EQ(kAirwellMinTemp, ac.getTemp()); + + ac.setTemp(kAirwellMaxTemp); + EXPECT_EQ(kAirwellMaxTemp, ac.getTemp()); + + ac.setTemp(kAirwellMinTemp - 1); + EXPECT_EQ(kAirwellMinTemp, ac.getTemp()); + + ac.setTemp(kAirwellMaxTemp + 1); + EXPECT_EQ(kAirwellMaxTemp, ac.getTemp()); + + ac.setTemp(17); + EXPECT_EQ(17, ac.getTemp()); + + ac.setTemp(21); + EXPECT_EQ(21, ac.getTemp()); + + ac.setTemp(25); + EXPECT_EQ(25, ac.getTemp()); + + ac.setTemp(29); + EXPECT_EQ(29, ac.getTemp()); +} + +TEST(TestAirwellAcClass, OperatingMode) { + IRAirwellAc ac(kGpioUnused); + ac.begin(); + + ac.setMode(kAirwellAuto); + EXPECT_EQ(kAirwellAuto, ac.getMode()); + + ac.setMode(kAirwellCool); + EXPECT_EQ(kAirwellCool, ac.getMode()); + + ac.setMode(kAirwellHeat); + EXPECT_EQ(kAirwellHeat, ac.getMode()); + + ac.setMode(kAirwellDry); + EXPECT_EQ(kAirwellDry, ac.getMode()); + + ac.setMode(kAirwellFan); + EXPECT_EQ(kAirwellFan, ac.getMode()); + + ac.setMode(kAirwellFan + 1); + EXPECT_EQ(kAirwellAuto, ac.getMode()); + + ac.setMode(255); + EXPECT_EQ(kAirwellAuto, ac.getMode()); +} + +TEST(TestAirwellAcClass, FanSpeed) { + IRAirwellAc ac(0); + ac.begin(); + + ac.setFan(0); + EXPECT_EQ(kAirwellFanLow, ac.getFan()); + + ac.setFan(255); + EXPECT_EQ(kAirwellFanAuto, ac.getFan()); + + ac.setFan(kAirwellFanHigh); + EXPECT_EQ(kAirwellFanHigh, ac.getFan()); + + ac.setFan(kAirwellFanHigh + 2); + EXPECT_EQ(kAirwellFanAuto, ac.getFan()); + + ac.setFan(kAirwellFanHigh - 1); + EXPECT_EQ(kAirwellFanHigh - 1, ac.getFan()); + + ac.setFan(1); + EXPECT_EQ(1, ac.getFan()); + + ac.setFan(1); + EXPECT_EQ(1, ac.getFan()); + + ac.setFan(3); + EXPECT_EQ(3, ac.getFan()); +} + +// Test human readable output. +TEST(TestAirwellAcClass, HumanReadable) { + IRAirwellAc ac(kGpioUnused); + EXPECT_EQ( + "Power Toggle: Off, Mode: 5 (Fan), Fan: 0 (Low), Temp: 25C", + ac.toString()); + ac.setPowerToggle(true); + ac.setMode(kAirwellHeat); + ac.setTemp(30); + ac.setFan(kAirwellFanAuto); + EXPECT_EQ( + "Power Toggle: On, Mode: 2 (Heat), Fan: 3 (Auto), Temp: 30C", + ac.toString()); +} + +TEST(TestAirwellAcClass, ReconstructKnownState) { + IRAirwellAc ac(kGpioUnused); + const uint64_t expected = 0x240380002; + ac.begin(); + ac.stateReset(); + ASSERT_NE(expected, ac.getRaw()); + ac.setPowerToggle(true); + ac.setMode(kAirwellCool); + ac.setTemp(22); + ac.setFan(kAirwellFanLow); + EXPECT_EQ(expected, ac.getRaw()); + EXPECT_EQ( + "Power Toggle: On, Mode: 1 (Cool), Fan: 0 (Low), Temp: 22C", + ac.toString()); } diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Aiwa_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Aiwa_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Aiwa_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Aiwa_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Amcor_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Amcor_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Amcor_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Amcor_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Argo_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Argo_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Argo_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Argo_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Carrier_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Carrier_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Carrier_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Carrier_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Coolix_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Coolix_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Coolix_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Coolix_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Corona_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Corona_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Corona_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Corona_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Daikin_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Daikin_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Daikin_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Daikin_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Delonghi_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Delonghi_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Delonghi_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Delonghi_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Denon_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Denon_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Denon_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Denon_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Dish_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Dish_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Dish_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Dish_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Doshisha_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Doshisha_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Doshisha_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Doshisha_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Electra_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Electra_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Electra_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Electra_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Epson_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Epson_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Epson_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Epson_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Fujitsu_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Fujitsu_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Fujitsu_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Fujitsu_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_GICable_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_GICable_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_GICable_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_GICable_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_GlobalCache_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_GlobalCache_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_GlobalCache_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_GlobalCache_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Goodweather_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Goodweather_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Goodweather_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Goodweather_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Gree_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Gree_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Gree_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Gree_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Haier_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Haier_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Haier_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Haier_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Hitachi_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Hitachi_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Hitachi_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Hitachi_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Inax_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Inax_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Inax_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Inax_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_JVC_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_JVC_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_JVC_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_JVC_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Kelvinator_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Kelvinator_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Kelvinator_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Kelvinator_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_LG_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_LG_test.cpp similarity index 95% rename from lib/IRremoteESP8266-2.7.8/test/ir_LG_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_LG_test.cpp index d899576b9..8d5dc1246 100644 --- a/lib/IRremoteESP8266-2.7.8/test/ir_LG_test.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/test/ir_LG_test.cpp @@ -448,7 +448,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); + IRLgAc ac(kGpioUnused); irsend.sendLG(0x8808721); irsend.makeDecodeResult(); ASSERT_TRUE(irrecv.decode(&irsend.capture)); @@ -477,7 +477,7 @@ TEST(TestDecodeLG, Issue620) { } TEST(TestIRLgAcClass, SetAndGetPower) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); ac.on(); EXPECT_TRUE(ac.getPower()); ac.off(); @@ -489,7 +489,7 @@ TEST(TestIRLgAcClass, SetAndGetPower) { } TEST(TestIRLgAcClass, SetAndGetTemp) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); ac.setTemp(25); EXPECT_EQ(25, ac.getTemp()); ac.setTemp(kLgAcMinTemp); @@ -503,7 +503,7 @@ TEST(TestIRLgAcClass, SetAndGetTemp) { } TEST(TestIRLgAcClass, SetAndGetMode) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); ac.setMode(kLgAcCool); ac.setFan(kLgAcFanAuto); ac.setTemp(25); @@ -517,22 +517,22 @@ TEST(TestIRLgAcClass, SetAndGetMode) { } TEST(TestIRLgAcClass, SetAndGetFan) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); ac.setMode(kLgAcCool); ac.setFan(kLgAcFanAuto); EXPECT_EQ(kLgAcFanAuto, ac.getFan()); - ac.setFan(kLgAcFanLow); - EXPECT_EQ(kLgAcFanLow, ac.getFan()); + ac.setFan(kLgAcFanLowest); + EXPECT_EQ(kLgAcFanLowest, ac.getFan()); ac.setFan(kLgAcFanHigh); EXPECT_EQ(kLgAcFanHigh, ac.getFan()); ac.setFan(kLgAcFanAuto + 1); EXPECT_EQ(kLgAcFanAuto, ac.getFan()); - ac.setFan(kLgAcFanLow - 1); + ac.setFan(kLgAcFanLowest - 1); EXPECT_EQ(kLgAcFanAuto, ac.getFan()); } TEST(TestIRLgAcClass, toCommon) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); ac.setPower(true); ac.setMode(kLgAcCool); ac.setTemp(20); @@ -564,7 +564,7 @@ TEST(TestIRLgAcClass, toCommon) { } TEST(TestIRLgAcClass, HumanReadable) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); EXPECT_EQ( "Model: 1 (GE6711AR2853M), " @@ -583,17 +583,17 @@ TEST(TestIRLgAcClass, HumanReadable) { ac.setTemp(kLgAcMinTemp); EXPECT_EQ( "Model: 1 (GE6711AR2853M), " - "Power: On, Mode: 0 (Cool), Temp: 16C, Fan: 0 (Low)", + "Power: On, Mode: 0 (Cool), Temp: 16C, Fan: 1 (Low)", ac.toString()); ac.setTemp(ac.getTemp() + 1); EXPECT_EQ( "Model: 1 (GE6711AR2853M), " - "Power: On, Mode: 0 (Cool), Temp: 17C, Fan: 0 (Low)", + "Power: On, Mode: 0 (Cool), Temp: 17C, Fan: 1 (Low)", ac.toString()); ac.setTemp(ac.getTemp() - 1); EXPECT_EQ( "Model: 1 (GE6711AR2853M), " - "Power: On, Mode: 0 (Cool), Temp: 16C, Fan: 0 (Low)", + "Power: On, Mode: 0 (Cool), Temp: 16C, Fan: 1 (Low)", ac.toString()); ac.setPower(false); EXPECT_EQ( @@ -603,7 +603,7 @@ TEST(TestIRLgAcClass, HumanReadable) { } TEST(TestIRLgAcClass, SetAndGetRaw) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); ac.setRaw(0x8800A4E); ASSERT_EQ(0x8800A4E, ac.getRaw()); @@ -621,7 +621,7 @@ TEST(TestIRLgAcClass, SetAndGetRaw) { } TEST(TestIRLgAcClass, MessageConstruction) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); ac.on(); ac.setMode(kLgAcCool); @@ -635,7 +635,7 @@ TEST(TestIRLgAcClass, MessageConstruction) { } TEST(TestIRLgAcClass, isValidLgAc) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); ac.setRaw(0x8800A4E); ASSERT_TRUE(ac.isValidLgAc()); @@ -670,7 +670,7 @@ TEST(TestUtils, Housekeeping) { } TEST(TestIRLgAcClass, KnownExamples) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); // Ref: // https://github.com/crankyoldgit/IRremoteESP8266/issues/1008#issuecomment-570646648 @@ -694,7 +694,7 @@ TEST(TestIRLgAcClass, KnownExamples) { ASSERT_TRUE(ac.isValidLgAc()); EXPECT_EQ( "Model: 1 (GE6711AR2853M), " - "Power: On, Mode: 1 (Dry), Temp: 21C, Fan: 0 (Low)", + "Power: On, Mode: 1 (Dry), Temp: 21C, Fan: 0 (Quiet)", ac.toString()); ac.setRaw(0x880C758); @@ -716,7 +716,7 @@ TEST(TestIRLgAcClass, KnownExamples) { ASSERT_TRUE(ac.isValidLgAc()); EXPECT_EQ( "Model: 1 (GE6711AR2853M), " - "Power: On, Mode: 0 (Cool), Temp: 22C, Fan: 0 (Low)", + "Power: On, Mode: 0 (Cool), Temp: 22C, Fan: 0 (Quiet)", ac.toString()); ac.setRaw(0x8808721); @@ -816,7 +816,7 @@ TEST(TestDecodeLG2, Issue1008) { EXPECT_EQ(0x8800347, irsend.capture.value); irsend.reset(); - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); ac.setRaw(0x8800347); ac.setModel(lg_ac_remote_model_t::AKB75215403); // aka. 2 ac.send(); @@ -835,7 +835,7 @@ TEST(TestDecodeLG2, Issue1008) { } TEST(TestIRLgAcClass, DifferentModels) { - IRLgAc ac(0); + IRLgAc ac(kGpioUnused); IRrecv capture(0); ac.setRaw(0x8800347); @@ -872,3 +872,12 @@ TEST(TestIRLgAcClass, DifferentModels) { ASSERT_EQ(expected2, IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); } + +TEST(TestIRLgAcClass, FanSpeedIssue1214) { + EXPECT_EQ(kLgAcFanLowest, IRLgAc::convertFan(stdAc::fanspeed_t::kMin)); + EXPECT_EQ(kLgAcFanLow, IRLgAc::convertFan(stdAc::fanspeed_t::kLow)); + EXPECT_EQ(kLgAcFanMedium, IRLgAc::convertFan(stdAc::fanspeed_t::kMedium)); + EXPECT_EQ(kLgAcFanHigh, IRLgAc::convertFan(stdAc::fanspeed_t::kHigh)); + EXPECT_EQ(kLgAcFanHigh, IRLgAc::convertFan(stdAc::fanspeed_t::kMax)); + EXPECT_EQ(kLgAcFanAuto, IRLgAc::convertFan(stdAc::fanspeed_t::kAuto)); +} diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Lasertag_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Lasertag_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Lasertag_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Lasertag_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Lego_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Lego_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Lego_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Lego_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Lutron_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Lutron_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Lutron_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Lutron_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_MWM_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_MWM_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_MWM_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_MWM_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Magiquest_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Magiquest_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Magiquest_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Magiquest_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Midea_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Midea_test.cpp similarity index 95% rename from lib/IRremoteESP8266-2.7.8/test/ir_Midea_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Midea_test.cpp index 24c2610a4..adce3f9d9 100644 --- a/lib/IRremoteESP8266-2.7.8/test/ir_Midea_test.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/test/ir_Midea_test.cpp @@ -441,13 +441,13 @@ TEST(TestMideaACClass, Sleep) { } TEST(TestMideaACClass, HumanReadableOutput) { - IRMideaAC ac(0); + IRMideaAC ac(kGpioUnused); ac.begin(); ac.setRaw(0xA1826FFFFF62); EXPECT_EQ( "Power: On, Mode: 2 (Auto), Celsius: Off, Temp: 25C/77F, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off", ac.toString()); ac.off(); ac.setTemp(25, true); ac.setFan(kMideaACFanHigh); @@ -455,16 +455,16 @@ TEST(TestMideaACClass, HumanReadableOutput) { ac.setSleep(true); EXPECT_EQ( "Power: Off, Mode: 1 (Dry), Celsius: Off, Temp: 25C/77F, Fan: 3 (High), " - "Sleep: On, Swing(V) Toggle: Off", ac.toString()); + "Sleep: On, Swing(V) Toggle: Off, Econo Toggle: Off", ac.toString()); ac.setUseCelsius(true); EXPECT_EQ( "Power: Off, Mode: 1 (Dry), Celsius: On, Temp: 25C/77F, Fan: 3 (High), " - "Sleep: On, Swing(V) Toggle: Off", ac.toString()); + "Sleep: On, Swing(V) Toggle: Off, Econo Toggle: Off", ac.toString()); ac.setRaw(0xA19867FFFF7E); EXPECT_EQ( "Power: On, Mode: 0 (Cool), Celsius: Off, Temp: 21C/69F, Fan: 3 (High), " - "Sleep: Off, Swing(V) Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off", ac.toString()); } // Tests for decodeMidea(). @@ -672,14 +672,14 @@ TEST(TestDecodeMidea, DecodeRealExample) { EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value); EXPECT_EQ( "Power: On, Mode: 2 (Auto), Celsius: Off, Temp: 18C/65F, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off", + "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off", IRAcUtils::resultAcToString(&irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); } TEST(TestMideaACClass, toCommon) { - IRMideaAC ac(0); + IRMideaAC ac(kGpioUnused); ac.setPower(true); ac.setMode(kMideaACCool); ac.setUseCelsius(true); @@ -709,7 +709,7 @@ TEST(TestMideaACClass, toCommon) { // https://github.com/crankyoldgit/IRremoteESP8266/issues/819 TEST(TestMideaACClass, CelsiusRemoteTemp) { - IRMideaAC ac(0); + IRMideaAC ac(kGpioUnused); uint64_t on_cool_low_17c = 0xA18840FFFF56; uint64_t on_cool_low_30c = 0xA1884DFFFF5D; ac.on(); @@ -722,13 +722,13 @@ TEST(TestMideaACClass, CelsiusRemoteTemp) { EXPECT_EQ(on_cool_low_17c, ac.getRaw()); EXPECT_EQ( "Power: On, Mode: 0 (Cool), Celsius: On, Temp: 17C/62F, Fan: 1 (Low), " - "Sleep: Off, Swing(V) Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off", ac.toString()); ac.setRaw(on_cool_low_17c); EXPECT_EQ(17, ac.getTemp(true)); EXPECT_EQ(62, ac.getTemp(false)); EXPECT_EQ( "Power: On, Mode: 0 (Cool), Celsius: On, Temp: 17C/62F, Fan: 1 (Low), " - "Sleep: Off, Swing(V) Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off", ac.toString()); ac.setTemp(17, true); EXPECT_EQ(17, ac.getTemp(true)); EXPECT_EQ(62, ac.getTemp(false)); @@ -737,26 +737,45 @@ TEST(TestMideaACClass, CelsiusRemoteTemp) { ac.setRaw(on_cool_low_30c); EXPECT_EQ( "Power: On, Mode: 0 (Cool), Celsius: On, Temp: 30C/86F, Fan: 1 (Low), " - "Sleep: Off, Swing(V) Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off", ac.toString()); } // https://github.com/crankyoldgit/IRremoteESP8266/issues/819 TEST(TestMideaACClass, SwingV) { - IRMideaAC ac(0); + IRMideaAC ac(kGpioUnused); ac.setSwingVToggle(false); ASSERT_FALSE(ac.getSwingVToggle()); ac.setSwingVToggle(true); ASSERT_TRUE(ac.getSwingVToggle()); EXPECT_EQ( "Power: On, Mode: 2 (Auto), Celsius: Off, Temp: 25C/77F, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: On", ac.toString()); + "Sleep: Off, Swing(V) Toggle: On, Econo Toggle: Off", ac.toString()); ac.setSwingVToggle(false); ASSERT_FALSE(ac.getSwingVToggle()); EXPECT_EQ( "Power: On, Mode: 2 (Auto), Celsius: Off, Temp: 25C/77F, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off", ac.toString()); ac.setRaw(kMideaACToggleSwingV); - EXPECT_EQ("Swing(V) Toggle: On", ac.toString()); + EXPECT_EQ("Swing(V) Toggle: On, Econo Toggle: Off", ac.toString()); +} + +// https://github.com/crankyoldgit/IRremoteESP8266/pull/1213 +TEST(TestMideaACClass, Econo) { + IRMideaAC ac(kGpioUnused); + ac.setEconoToggle(false); + ASSERT_FALSE(ac.getEconoToggle()); + ac.setEconoToggle(true); + ASSERT_TRUE(ac.getEconoToggle()); + EXPECT_EQ( + "Power: On, Mode: 2 (Auto), Celsius: Off, Temp: 25C/77F, Fan: 0 (Auto), " + "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: On", ac.toString()); + ac.setEconoToggle(false); + ASSERT_FALSE(ac.getEconoToggle()); + EXPECT_EQ( + "Power: On, Mode: 2 (Auto), Celsius: Off, Temp: 25C/77F, Fan: 0 (Auto), " + "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off", ac.toString()); + ac.setRaw(kMideaACToggleEcono); + EXPECT_EQ("Swing(V) Toggle: Off, Econo Toggle: On", ac.toString()); } // Test abusing the protocol for sending 6 arbitary bytes. diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_MitsubishiHeavy_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_MitsubishiHeavy_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_MitsubishiHeavy_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_MitsubishiHeavy_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Mitsubishi_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Mitsubishi_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Mitsubishi_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Mitsubishi_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Multibrackets_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Multibrackets_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Multibrackets_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Multibrackets_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_NEC_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_NEC_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_NEC_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_NEC_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Neoclima_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Neoclima_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Neoclima_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Neoclima_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Nikai_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Nikai_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Nikai_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Nikai_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Panasonic_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Panasonic_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Panasonic_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Panasonic_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8.10/test/ir_Pioneer_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Pioneer_test.cpp new file mode 100644 index 000000000..fce2503e4 --- /dev/null +++ b/lib/IRremoteESP8266-2.7.8.10/test/ir_Pioneer_test.cpp @@ -0,0 +1,229 @@ +// Copyright 2018 David Conran + +#include "IRsend.h" +#include "IRsend_test.h" +#include "IRutils.h" +#include "gtest/gtest.h" + +// Tests for sendPioneer(). + +// Test sending typical data only. +TEST(TestSendPioneer, SendDataOnly) { + IRsendTest irsend(0); + irsend.begin(); + irsend.sendPioneer(0); + EXPECT_EQ( + "f40000d33" + "m8506s4191" + "m568s487m568s487m568s487m568s487m568s487m568s487m568s487m568s487" + "m568s487m568s487m568s487m568s487m568s487m568s487m568s487m568s487" + "m568s487m568s487m568s487m568s487m568s487m568s487m568s487m568s487" + "m568s487m568s487m568s487m568s487m568s487m568s487m568s487m568s487" + "m568s37881" + "m8506s4191" + "m568s487m568s487m568s487m568s487m568s487m568s487m568s487m568s487" + "m568s487m568s487m568s487m568s487m568s487m568s487m568s487m568s487" + "m568s487m568s487m568s487m568s487m568s487m568s487m568s487m568s487" + "m568s487m568s487m568s487m568s487m568s487m568s487m568s487m568s487" + "m568s37881", + irsend.outputStr()); + irsend.sendPioneer(0x55FF00AAAA00FF55); + EXPECT_EQ( + "f40000d33" + "m8506s4191" + "m568s487m568s1542m568s487m568s1542m568s487m568s1542m568s487m568s1542" + "m568s1542m568s1542m568s1542m568s1542m568s1542m568s1542m568s1542m568s1542" + "m568s487m568s487m568s487m568s487m568s487m568s487m568s487m568s487" + "m568s1542m568s487m568s1542m568s487m568s1542m568s487m568s1542m568s487" + "m568s25181" + "m8506s4191" + "m568s1542m568s487m568s1542m568s487m568s1542m568s487m568s1542m568s487" + "m568s487m568s487m568s487m568s487m568s487m568s487m568s487m568s487" + "m568s1542m568s1542m568s1542m568s1542m568s1542m568s1542m568s1542m568s1542" + "m568s487m568s1542m568s487m568s1542m568s487m568s1542m568s487m568s1542" + "m568s25181", + irsend.outputStr()); +} + +// Tests for IRutils. + +TEST(TestIRUtils, TypeToString) { EXPECT_EQ("PIONEER", typeToString(PIONEER)); } + +// Tests for encodePioneer(). + +TEST(TestEncodePioneer, SimpleEncoding) { + IRsendTest irsend(0); + IRrecv irrecv(0); + + // Spotify button (A556+AF20) + // via + // https://www.pioneerelectronics.com/StaticFiles/PUSA/Files/Home%20Custom%20Install/2015%20Pioneer%20&%20Elite%20AVR%20IR%20with%20Hex_1.xls + EXPECT_EQ(0xA55A6A95F50A04FB, irsend.encodePioneer(0xA556, 0xAF20)); + + // "Source" from + // https://github.com/crankyoldgit/IRremoteESP8266/pull/547#issuecomment-429616582 + EXPECT_EQ(0x659A05FAF50AC53A, irsend.encodePioneer(0xA6A0, 0xAFA3)); +} + +// Tests for decodePioneer(). + +// Synthesised Normal Pioneer message. +TEST(TestDecodePioneer, SyntheticPioneerDecode) { + IRsendTest irsend(0); + IRrecv irrecv(0); + irsend.begin(); + + irsend.reset(); + irsend.sendPioneer(0x659A05FAF50AC53A); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(PIONEER, irsend.capture.decode_type); + EXPECT_EQ(kPioneerBits, irsend.capture.bits); + EXPECT_EQ(0x659A05FAF50AC53A, irsend.capture.value); + EXPECT_EQ(0xA6A0, irsend.capture.address); + EXPECT_EQ(0xAFA3, irsend.capture.command); +} + +// Real long Pioneer message. +TEST(TestDecodePioneer, RealExampleLongDecodeSourceButton) { + IRsendTest irsend(0); + IRrecv irrecv(0); + irsend.begin(); + + irsend.reset(); + // "Source" button. + // https://github.com/crankyoldgit/IRremoteESP8266/pull/547#issuecomment-429616582 + uint16_t rawData[135] = { + 8552, 4184, 596, 472, 592, 1524, 594, 1524, 594, 472, 592, 472, + 598, 1520, 596, 472, 594, 1524, 592, 1524, 592, 472, 592, 472, + 596, 1520, 598, 1520, 596, 472, 592, 1524, 592, 472, 592, 476, + 592, 472, 592, 472, 592, 476, 592, 472, 592, 1524, 592, 472, + 598, 1518, 598, 1520, 596, 1520, 596, 1520, 596, 1520, 596, 1520, + 596, 472, 592, 1524, 592, 472, 598, 25282, 8552, 4182, 596, 1520, + 598, 1518, 598, 1520, 596, 1520, 596, 472, 592, 1524, 592, 472, + 598, 1520, 596, 472, 594, 472, 592, 472, 596, 472, 592, 1524, + 592, 472, 592, 1524, 596, 472, 594, 1520, 596, 1520, 598, 472, + 592, 472, 598, 472, 594, 1522, 594, 472, 592, 1524, 594, 472, + 596, 472, 594, 1524, 592, 1524, 592, 1524, 592, 472, 594, 1524, + 598, 472, 592}; + + irsend.sendRaw(rawData, 135, 38000); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(PIONEER, irsend.capture.decode_type); + EXPECT_EQ(kPioneerBits, irsend.capture.bits); + EXPECT_EQ(0x659A05FAF50AC53A, irsend.capture.value); + EXPECT_EQ(0xA6A0, irsend.capture.address); + EXPECT_EQ(0xAFA3, irsend.capture.command); +} + +// Synthetic Pioneer message. +// For: +// https://github.com/crankyoldgit/IRremoteESP8266/pull/547#issuecomment-430800734 +TEST(TestDecodePioneer, SyntheticPioneerMessage) { + IRsendTest irsend(0); + IRrecv irrecv(0); + irsend.begin(); + + irsend.reset(); + irsend.sendPioneer(0x659A857AF50A3DC2, 64, 0); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(PIONEER, irsend.capture.decode_type); + EXPECT_EQ(kPioneerBits, irsend.capture.bits); + EXPECT_EQ(0x659A857AF50A3DC2, irsend.capture.value); + EXPECT_EQ(0xA6A1, irsend.capture.address); + EXPECT_EQ(0xAFBC, irsend.capture.command); + + irsend.reset(); + irsend.sendPioneer(0x659A857AF50A3DC2, 64, 0); + EXPECT_EQ( + "f40000d33" + "m8506s4191" + "m568s487m568s1542m568s1542m568s487m568s487m568s1542m568s487m568s1542" + "m568s1542m568s487m568s487m568s1542m568s1542m568s487m568s1542m568s487" + "m568s1542m568s487m568s487m568s487m568s487m568s1542m568s487m568s1542" + "m568s487m568s1542m568s1542m568s1542m568s1542m568s487m568s1542m568s487" + "m568s25181" + "m8506s4191" + "m568s1542m568s1542m568s1542m568s1542m568s487m568s1542m568s487m568s1542" + "m568s487m568s487m568s487m568s487m568s1542m568s487m568s1542m568s487" + "m568s487m568s487m568s1542m568s1542m568s1542m568s1542m568s487m568s1542" + "m568s1542m568s1542m568s487m568s487m568s487m568s487m568s1542m568s487" + "m568s25181", + irsend.outputStr()); +} + +// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1220#issuecomment-661598412 +TEST(TestDecodePioneer, Issue1220) { + IRsendTest irsend(0); + IRrecv irrecv(0); + irsend.begin(); + + irsend.reset(); + // Pwr Toggle {"IrReceived":{"Protocol":"PIONEER","Bits":64, + // "Data":"0xA55A38C7A55A38C7"}} + const uint16_t rawPowerToggle[203] = { + 8510, 4188, 580, 1544, 556, 470, 582, 1566, 556, 494, 560, 488, 556, 1542, + 580, 470, 584, 1540, 582, 492, 552, 1522, 578, 496, 558, 1564, 558, 1542, + 580, 470, 586, 1564, 536, 512, 532, 494, 560, 464, 582, 1542, 580, 1544, + 578, 1544, 578, 498, 558, 492, 562, 488, 556, 1518, 582, 1542, 582, 492, + 552, 498, 556, 494, 550, 1572, 560, 1538, 562, 1536, 586, 25188, + 8512, 4186, 584, 1540, 584, 468, 576, 1572, 528, 522, 532, 492, 552, 1546, + 584, 492, 550, 1548, 582, 494, 560, 1538, 580, 468, 586, 1514, 586, 1538, + 584, 490, 554, 1546, 586, 488, 554, 470, 584, 490, 556, 1542, 556, 1542, + 580, 1544, 578, 496, 560, 466, 578, 496, 560, 1538, 584, 1516, 584, 490, + 554, 472, 582, 492, 552, 1546, 586, 1536, 586, 1538, 586, 25162, + 8514, 4184, 582, 1542, 580, 496, 562, 1536, 584, 490, 554, 496, 560, 1538, + 562, 514, 530, 1542, 580, 496, 560, 1538, 584, 466, 578, 1546, 576, 1524, + 578, 496, 558, 1542, 586, 488, 554, 496, 558, 466, 576, 1546, 576, 1548, + 586, 1512, 578, 498, 558, 492, 552, 496, 558, 1540, 580, 1542, 578, 498, + 556, 494, 550, 498, 556, 1516, 584, 1540, 584, 1540, 580}; + irsend.sendRaw(rawPowerToggle, 203, 40); // Pioneer uses 40kHz + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(PIONEER, irsend.capture.decode_type); + EXPECT_EQ(kPioneerBits, irsend.capture.bits); + EXPECT_EQ(0xA55A38C7A55A38C7, irsend.capture.value); + EXPECT_EQ(0xA51C, irsend.capture.address); + EXPECT_EQ(0xA51C, irsend.capture.command); + + irsend.reset(); + irsend.sendPioneer(0xA55A38C7A55A38C7, 64, 1); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(PIONEER, irsend.capture.decode_type); + EXPECT_EQ(kPioneerBits, irsend.capture.bits); + EXPECT_EQ(0xA55A38C7A55A38C7, irsend.capture.value); + EXPECT_EQ(0xA51C, irsend.capture.address); + EXPECT_EQ(0xA51C, irsend.capture.command); + EXPECT_EQ( + "f40000d33" + "m8506s4191" + "m568s1542m568s487m568s1542m568s487m568s487m568s1542m568s487m568s1542" + "m568s487m568s1542m568s487m568s1542m568s1542m568s487m568s1542m568s487" + "m568s487m568s487m568s1542m568s1542m568s1542m568s487m568s487m568s487" + "m568s1542m568s1542m568s487m568s487m568s487m568s1542m568s1542m568s1542" + "m568s25181" + "m8506s4191" + "m568s1542m568s487m568s1542m568s487m568s487m568s1542m568s487m568s1542" + "m568s487m568s1542m568s487m568s1542m568s1542m568s487m568s1542m568s487" + "m568s487m568s487m568s1542m568s1542m568s1542m568s487m568s487m568s487" + "m568s1542m568s1542m568s487m568s487m568s487m568s1542m568s1542m568s1542" + "m568s25181" + "m8506s4191" + "m568s1542m568s487m568s1542m568s487m568s487m568s1542m568s487m568s1542" + "m568s487m568s1542m568s487m568s1542m568s1542m568s487m568s1542m568s487" + "m568s487m568s487m568s1542m568s1542m568s1542m568s487m568s487m568s487" + "m568s1542m568s1542m568s487m568s487m568s487m568s1542m568s1542m568s1542" + "m568s25181" + "m8506s4191" + "m568s1542m568s487m568s1542m568s487m568s487m568s1542m568s487m568s1542" + "m568s487m568s1542m568s487m568s1542m568s1542m568s487m568s1542m568s487" + "m568s487m568s487m568s1542m568s1542m568s1542m568s487m568s487m568s487" + "m568s1542m568s1542m568s487m568s487m568s487m568s1542m568s1542m568s1542" + "m568s25181", + irsend.outputStr()); + + EXPECT_EQ(0xA55A38C7A55A38C7, irsend.encodePioneer(0xA51C, 0xA51C)); +} diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Pronto_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Pronto_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Pronto_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Pronto_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_RC5_RC6_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_RC5_RC6_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_RC5_RC6_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_RC5_RC6_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_RCMM_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_RCMM_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_RCMM_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_RCMM_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Samsung_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Samsung_test.cpp similarity index 94% rename from lib/IRremoteESP8266-2.7.8/test/ir_Samsung_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Samsung_test.cpp index 52165b780..59fc964e3 100644 --- a/lib/IRremoteESP8266-2.7.8/test/ir_Samsung_test.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/test/ir_Samsung_test.cpp @@ -12,8 +12,10 @@ // General housekeeping TEST(TestSamsung, Housekeeping) { - ASSERT_EQ("SAMSUNG", typeToString(SAMSUNG)); - ASSERT_FALSE(hasACState(SAMSUNG)); + ASSERT_EQ("SAMSUNG", typeToString(decode_type_t::SAMSUNG)); + ASSERT_EQ(decode_type_t::SAMSUNG, strToDecodeType("SAMSUNG")); + ASSERT_FALSE(hasACState(decode_type_t::SAMSUNG)); + ASSERT_EQ(kSamsungBits, IRsend::defaultBits(decode_type_t::SAMSUNG)); } // Tests for sendSAMSUNG(). @@ -307,8 +309,12 @@ TEST(TestDecodeSamsung, FailToDecodeNonSamsungExample) { // General housekeeping TEST(TestSamsungAC, Housekeeping) { - ASSERT_EQ("SAMSUNG_AC", typeToString(SAMSUNG_AC)); - ASSERT_TRUE(hasACState(SAMSUNG_AC)); + ASSERT_EQ("SAMSUNG_AC", typeToString(decode_type_t::SAMSUNG_AC)); + ASSERT_EQ(decode_type_t::SAMSUNG_AC, strToDecodeType("SAMSUNG_AC")); + ASSERT_TRUE(hasACState(decode_type_t::SAMSUNG_AC)); + ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::SAMSUNG_AC)); + ASSERT_EQ(kSamsungAcBits, IRsend::defaultBits(decode_type_t::SAMSUNG_AC)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::SAMSUNG_AC)); } // Tests for sendSamsungAC(). @@ -1143,34 +1149,36 @@ TEST(TestSendSamsung36, SendDataOnly) { irsend.sendSamsung36(0); EXPECT_EQ( "f38000d50" - "m4480s4480" - "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560" - "m560s4480" - "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560" - "m560s560m560s560m560s560m560s560" - "m560s26880", + "m4515s4438" + "m512s490m512s490m512s490m512s490m512s490m512s490m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s490m512s490m512s490m512s490" + "m512s4438" + "m512s490m512s490m512s490m512s490m512s490m512s490m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s490m512s490m512s490m512s490" + "m512s490m512s490m512s490m512s490" + "m512s26880", irsend.outputStr()); irsend.sendSamsung36(0x400E00FF); EXPECT_EQ( "f38000d50" - "m4480s4480" - "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560" - "m560s4480" - "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s1680m560s1680m560s1680m560s1680" - "m560s1680m560s1680m560s1680m560s1680" - "m560s26880", + "m4515s4438" + "m512s490m512s490m512s490m512s490m512s490m512s1468m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s490m512s490m512s490m512s490" + "m512s4438" + "m512s1468m512s1468m512s1468m512s490m512s490m512s490m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s1468m512s1468m512s1468m512s1468" + "m512s1468m512s1468m512s1468m512s1468" + "m512s26880", irsend.outputStr()); irsend.reset(); } // General housekeeping TEST(TestSamsung36, Housekeeping) { - ASSERT_EQ("SAMSUNG36", typeToString(SAMSUNG36)); - ASSERT_FALSE(hasACState(SAMSUNG36)); + ASSERT_EQ("SAMSUNG36", typeToString(decode_type_t::SAMSUNG36)); + ASSERT_EQ(decode_type_t::SAMSUNG36, strToDecodeType("SAMSUNG36")); + ASSERT_FALSE(hasACState(decode_type_t::SAMSUNG36)); + ASSERT_EQ(kSamsung36Bits, IRsend::defaultBits(decode_type_t::SAMSUNG36)); } // Test sending with different repeats. @@ -1182,50 +1190,50 @@ TEST(TestSendSamsung36, SendWithRepeats) { irsend.sendSamsung36(0x400E00FF, kSamsung36Bits, 1); // 1 repeat. EXPECT_EQ( "f38000d50" - "m4480s4480" - "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560" - "m560s4480" - "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s1680m560s1680m560s1680m560s1680" - "m560s1680m560s1680m560s1680m560s1680" - "m560s26880" - "m4480s4480" - "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560" - "m560s4480" - "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s1680m560s1680m560s1680m560s1680" - "m560s1680m560s1680m560s1680m560s1680" - "m560s26880", + "m4515s4438" + "m512s490m512s490m512s490m512s490m512s490m512s1468m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s490m512s490m512s490m512s490" + "m512s4438" + "m512s1468m512s1468m512s1468m512s490m512s490m512s490m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s1468m512s1468m512s1468m512s1468" + "m512s1468m512s1468m512s1468m512s1468" + "m512s26880" + "m4515s4438" + "m512s490m512s490m512s490m512s490m512s490m512s1468m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s490m512s490m512s490m512s490" + "m512s4438" + "m512s1468m512s1468m512s1468m512s490m512s490m512s490m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s1468m512s1468m512s1468m512s1468" + "m512s1468m512s1468m512s1468m512s1468" + "m512s26880", irsend.outputStr()); irsend.sendSamsung36(0x400E00FF, kSamsung36Bits, 2); // 2 repeats. EXPECT_EQ( "f38000d50" - "m4480s4480" - "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560" - "m560s4480" - "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s1680m560s1680m560s1680m560s1680" - "m560s1680m560s1680m560s1680m560s1680" - "m560s26880" - "m4480s4480" - "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560" - "m560s4480" - "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s1680m560s1680m560s1680m560s1680" - "m560s1680m560s1680m560s1680m560s1680" - "m560s26880" - "m4480s4480" - "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560" - "m560s4480" - "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560" - "m560s560m560s560m560s560m560s560m560s1680m560s1680m560s1680m560s1680" - "m560s1680m560s1680m560s1680m560s1680" - "m560s26880", + "m4515s4438" + "m512s490m512s490m512s490m512s490m512s490m512s1468m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s490m512s490m512s490m512s490" + "m512s4438" + "m512s1468m512s1468m512s1468m512s490m512s490m512s490m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s1468m512s1468m512s1468m512s1468" + "m512s1468m512s1468m512s1468m512s1468" + "m512s26880" + "m4515s4438" + "m512s490m512s490m512s490m512s490m512s490m512s1468m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s490m512s490m512s490m512s490" + "m512s4438" + "m512s1468m512s1468m512s1468m512s490m512s490m512s490m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s1468m512s1468m512s1468m512s1468" + "m512s1468m512s1468m512s1468m512s1468" + "m512s26880" + "m4515s4438" + "m512s490m512s490m512s490m512s490m512s490m512s1468m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s490m512s490m512s490m512s490" + "m512s4438" + "m512s1468m512s1468m512s1468m512s490m512s490m512s490m512s490m512s490" + "m512s490m512s490m512s490m512s490m512s1468m512s1468m512s1468m512s1468" + "m512s1468m512s1468m512s1468m512s1468" + "m512s26880", irsend.outputStr()); } diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Sanyo_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Sanyo_test.cpp similarity index 53% rename from lib/IRremoteESP8266-2.7.8/test/ir_Sanyo_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Sanyo_test.cpp index c59113cda..cbdd6ba39 100644 --- a/lib/IRremoteESP8266-2.7.8/test/ir_Sanyo_test.cpp +++ b/lib/IRremoteESP8266-2.7.8.10/test/ir_Sanyo_test.cpp @@ -1,5 +1,9 @@ -// Copyright 2017 David Conran +// Copyright 2017-2020 David Conran +#include "ir_Sanyo.h" +#include "IRac.h" +#include "IRrecv.h" +#include "IRrecv_test.h" #include "IRsend.h" #include "IRsend_test.h" #include "gtest/gtest.h" @@ -257,3 +261,272 @@ TEST(TestDecodeSanyoLC7461, FailToDecodeNonSanyoLC7461Example) { irrecv.decodeSanyoLC7461(&irsend.capture, kStartOffset, kSanyoLC7461Bits, false)); } + +TEST(TestUtils, Housekeeping) { + // Sanyo LC7461 + ASSERT_EQ("SANYO_LC7461", typeToString(decode_type_t::SANYO_LC7461)); + ASSERT_EQ(decode_type_t::SANYO_LC7461, strToDecodeType("SANYO_LC7461")); + ASSERT_FALSE(hasACState(decode_type_t::SANYO_LC7461)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::SANYO_LC7461)); + ASSERT_EQ(kSanyoLC7461Bits, IRsend::defaultBits(decode_type_t::SANYO_LC7461)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::SANYO_LC7461)); + // Sanyo A/C + ASSERT_EQ("SANYO_AC", typeToString(decode_type_t::SANYO_AC)); + ASSERT_EQ(decode_type_t::SANYO_AC, strToDecodeType("SANYO_AC")); + ASSERT_TRUE(hasACState(decode_type_t::SANYO_AC)); + ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::SANYO_AC)); + ASSERT_EQ(kSanyoAcBits, IRsend::defaultBits(decode_type_t::SANYO_AC)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::SANYO_AC)); +} + +TEST(TestDecodeSanyoAc, DecodeRealExamples) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + // Ref: "On" from https://github.com/crankyoldgit/IRremoteESP8266/issues/1211#issue-650997449 + const uint16_t rawData[148] = { + 8456, 4192, + 624, 448, 584, 1508, 608, 452, 580, 1512, 628, 452, 604, 1468, 560, 1552, + 600, 472, 584, 1532, 580, 472, 528, 516, 512, 540, 576, 1516, 628, 1472, + 612, 1508, 612, 452, 580, 1512, 628, 1468, 612, 1496, 632, 444, 580, 480, + 580, 476, 580, 1496, 564, 508, 576, 480, 576, 480, 580, 476, 584, 472, + 584, 468, 584, 480, 520, 512, 580, 480, 576, 480, 580, 476, 584, 472, + 584, 472, 528, 508, 524, 1568, 600, 480, 576, 480, 584, 1492, 560, 512, + 580, 1536, 576, 480, 580, 476, 580, 476, 528, 528, 524, 1568, 580, 476, + 584, 476, 580, 476, 580, 472, 528, 512, 520, 536, 576, 480, 580, 480, + 576, 480, 576, 476, 532, 528, 520, 512, 576, 480, 584, 476, 580, 476, + 580, 480, 576, 472, 528, 1548, 600, 480, 576, 480, 576, 1520, 592, 1496, + 600, 476, 580, 480, 576}; + const uint8_t expectedState[kSanyoAcStateLength] = { + 0x6A, 0x71, 0x47, 0x00, 0x20, 0x85, 0x00, 0x00, 0x32}; + irsend.begin(); + irsend.reset(); + irsend.sendRaw(rawData, 148, 38000); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(SANYO_AC, irsend.capture.decode_type); + EXPECT_EQ(kSanyoAcBits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_FALSE(irsend.capture.repeat); + EXPECT_EQ( + "Power: On, Mode: 2 (Cool), Temp: 21C, Fan: 0 (Auto), " + "Swing(V): 5 (Upper Middle), Sleep: Off, Beep: On, Sensor: Room, " + "Sensor Temp: 11C, Off Timer: Off", + IRAcUtils::resultAcToString(&irsend.capture)); +} + +TEST(TestDecodeSanyoAc, SyntheticSelfDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + const uint8_t expectedState[kSanyoAcStateLength] = { + 0x6A, 0x71, 0x47, 0x00, 0x20, 0x85, 0x00, 0x00, 0x32}; + irsend.begin(); + irsend.reset(); + irsend.sendSanyoAc(expectedState); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(SANYO_AC, irsend.capture.decode_type); + EXPECT_EQ(kSanyoAcBits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_FALSE(irsend.capture.repeat); + EXPECT_EQ( + "Power: On, Mode: 2 (Cool), Temp: 21C, Fan: 0 (Auto), " + "Swing(V): 5 (Upper Middle), Sleep: Off, Beep: On, Sensor: Room, " + "Sensor Temp: 11C, Off Timer: Off", + IRAcUtils::resultAcToString(&irsend.capture)); + EXPECT_EQ( + "f38000d50" + "m8500s4200" + "m500s550m500s1600m500s550m500s1600m500s550m500s1600m500s1600m500s550" + "m500s1600m500s550m500s550m500s550m500s1600m500s1600m500s1600m500s550" + "m500s1600m500s1600m500s1600m500s550m500s550m500s550m500s1600m500s550" + "m500s550m500s550m500s550m500s550m500s550m500s550m500s550m500s550m500s550" + "m500s550m500s550m500s550m500s550m500s1600m500s550m500s550m500s1600" + "m500s550m500s1600m500s550m500s550m500s550m500s550m500s1600m500s550" + "m500s550m500s550m500s550m500s550m500s550m500s550m500s550m500s550m500s550" + "m500s550m500s550m500s550m500s550m500s550m500s550m500s550m500s1600" + "m500s550m500s550m500s1600m500s1600m500s550m500s550" + "m500s100000", + irsend.outputStr()); +} + +// Tests for IRSanyoAc class. + +TEST(TestSanyoAcClass, Power) { + IRSanyoAc ac(kGpioUnused); + ac.begin(); + + 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(TestSanyoAcClass, Temperature) { + IRSanyoAc ac(kGpioUnused); + ac.begin(); + + ac.setTemp(0); + EXPECT_EQ(kSanyoAcTempMin, ac.getTemp()); + + ac.setTemp(255); + EXPECT_EQ(kSanyoAcTempMax, ac.getTemp()); + + ac.setTemp(kSanyoAcTempMin); + EXPECT_EQ(kSanyoAcTempMin, ac.getTemp()); + + ac.setTemp(kSanyoAcTempMax); + EXPECT_EQ(kSanyoAcTempMax, ac.getTemp()); + + ac.setTemp(kSanyoAcTempMin - 1); + EXPECT_EQ(kSanyoAcTempMin, ac.getTemp()); + + ac.setTemp(kSanyoAcTempMax + 1); + EXPECT_EQ(kSanyoAcTempMax, ac.getTemp()); + + ac.setTemp(17); + EXPECT_EQ(17, ac.getTemp()); + + ac.setTemp(21); + EXPECT_EQ(21, ac.getTemp()); + + ac.setTemp(25); + EXPECT_EQ(25, ac.getTemp()); + + ac.setTemp(30); + EXPECT_EQ(30, ac.getTemp()); +} + +TEST(TestSanyoAcClass, OperatingMode) { + IRSanyoAc ac(kGpioUnused); + ac.begin(); + + ac.setMode(kSanyoAcAuto); + EXPECT_EQ(kSanyoAcAuto, ac.getMode()); + + ac.setMode(kSanyoAcCool); + EXPECT_EQ(kSanyoAcCool, ac.getMode()); + + ac.setMode(kSanyoAcHeat); + EXPECT_EQ(kSanyoAcHeat, ac.getMode()); + + ac.setMode(kSanyoAcDry); + EXPECT_EQ(kSanyoAcDry, ac.getMode()); + + ac.setMode(kSanyoAcAuto + 1); + EXPECT_EQ(kSanyoAcAuto, ac.getMode()); + + ac.setMode(0); + EXPECT_EQ(kSanyoAcAuto, ac.getMode()); + + ac.setMode(255); + EXPECT_EQ(kSanyoAcAuto, ac.getMode()); +} + +TEST(TestSanyoAcClass, FanSpeed) { + IRSanyoAc ac(kGpioUnused); + ac.begin(); + + ac.setFan(kSanyoAcFanAuto); + EXPECT_EQ(kSanyoAcFanAuto, ac.getFan()); + + ac.setFan(kSanyoAcFanHigh); + EXPECT_EQ(kSanyoAcFanHigh, ac.getFan()); + + ac.setFan(kSanyoAcFanLow); + EXPECT_EQ(kSanyoAcFanLow, ac.getFan()); + + ac.setFan(kSanyoAcFanMedium); + EXPECT_EQ(kSanyoAcFanMedium, ac.getFan()); +} + +TEST(TestSanyoAcClass, Sleep) { + IRSanyoAc ac(kGpioUnused); + ac.begin(); + + ac.setSleep(true); + EXPECT_TRUE(ac.getSleep()); + ac.setSleep(false); + EXPECT_FALSE(ac.getSleep()); + ac.setSleep(true); + EXPECT_TRUE(ac.getSleep()); +} + +TEST(TestSanyoAcClass, SwingV) { + IRSanyoAc ac(kGpioUnused); + ac.begin(); + + ac.setSwingV(kSanyoAcSwingVAuto); + EXPECT_EQ(kSanyoAcSwingVAuto, ac.getSwingV()); + + ac.setSwingV(kSanyoAcSwingVHigh); + EXPECT_EQ(kSanyoAcSwingVHigh, ac.getSwingV()); + + ac.setSwingV(kSanyoAcSwingVLow); + EXPECT_EQ(kSanyoAcSwingVLow, ac.getSwingV()); + + ac.setSwingV(kSanyoAcSwingVUpperMiddle); + EXPECT_EQ(kSanyoAcSwingVUpperMiddle, ac.getSwingV()); + + ac.setSwingV(0); + EXPECT_EQ(kSanyoAcSwingVAuto, ac.getSwingV()); + ac.setSwingV(255); + EXPECT_EQ(kSanyoAcSwingVAuto, ac.getSwingV()); +} + +TEST(TestSanyoAcClass, Timers) { + IRSanyoAc ac(kGpioUnused); + ac.begin(); + + ac.setOffTimer(0); + EXPECT_EQ(0, ac.getOffTimer()); + ac.setOffTimer(59); + EXPECT_EQ(0, ac.getOffTimer()); + ac.setOffTimer(60); + EXPECT_EQ(60, ac.getOffTimer()); + ac.setOffTimer(61); + EXPECT_EQ(60, ac.getOffTimer()); + ac.setOffTimer(15 * 60 + 59); + EXPECT_EQ(15 * 60, ac.getOffTimer()); + ac.setOffTimer(16 * 60); + EXPECT_EQ(15 * 60, ac.getOffTimer()); + + const uint8_t offTimer2Hr[kSanyoAcStateLength] = { + 0x6A, 0x6D, 0x4F, 0x02, 0x14, 0x85, 0x00, 0x00, 0x4A}; + ac.setRaw(offTimer2Hr); + EXPECT_EQ(2 * 60, ac.getOffTimer()); + EXPECT_EQ( + "Power: On, Mode: 1 (Heat), Temp: 17C, Fan: 0 (Auto), " + "Swing(V): 5 (Upper Middle), Sleep: Off, Beep: On, " + "Sensor: Room, Sensor Temp: 19C, Off Timer: 02:00", + ac.toString()); +} + +TEST(TestSanyoAcClass, Beep) { + IRSanyoAc ac(kGpioUnused); + ac.begin(); + + ac.setBeep(true); + EXPECT_TRUE(ac.getBeep()); + ac.setBeep(false); + EXPECT_FALSE(ac.getBeep()); + ac.setBeep(true); + EXPECT_TRUE(ac.getBeep()); + + const uint8_t beep_off[kSanyoAcStateLength] = { + 0x6A, 0x6D, 0x11, 0x00, 0x10, 0x85, 0x00, 0x00, 0x33}; + ac.setRaw(beep_off); + EXPECT_FALSE(ac.getBeep()); + const uint8_t beep_on[kSanyoAcStateLength] = { + 0x6A, 0x6E, 0x54, 0x00, 0x10, 0x83, 0x00, 0x00, 0x39}; + ac.setRaw(beep_on); + EXPECT_TRUE(ac.getBeep()); +} diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Sharp_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Sharp_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Sharp_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Sharp_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Sherwood_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Sherwood_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Sherwood_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Sherwood_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Sony_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Sony_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Sony_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Sony_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Symphony_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Symphony_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Symphony_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Symphony_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Tcl_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Tcl_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Tcl_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Tcl_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Teco_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Teco_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Teco_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Teco_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8.10/test/ir_Toshiba_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Toshiba_test.cpp new file mode 100644 index 000000000..fcd0e510e --- /dev/null +++ b/lib/IRremoteESP8266-2.7.8.10/test/ir_Toshiba_test.cpp @@ -0,0 +1,741 @@ +// Copyright 2017 David Conran +#include "ir_Toshiba.h" +#include "IRac.h" +#include "IRrecv.h" +#include "IRrecv_test.h" +#include "IRsend.h" +#include "IRsend_test.h" +#include "gtest/gtest.h" + +// Tests for Toshiba A/C methods. + +// Test sending typical data only. +TEST(TestSendToshibaAC, SendDataOnly) { + IRsendTest irsend(kGpioUnused); + irsend.begin(); + + uint8_t toshiba_code[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, + 0x00, 0x00, 0x00, 0x00}; + irsend.reset(); + irsend.sendToshibaAC(toshiba_code); + EXPECT_EQ( + "f38000d50" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s1600m580s1600" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s1600m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s7400" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s1600m580s1600" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s1600m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s7400", + irsend.outputStr()); +} + +// Test sending with repeats. +TEST(TestSendToshibaAC, SendWithRepeats) { + IRsendTest irsend(kGpioUnused); + irsend.begin(); + + irsend.reset(); + uint8_t toshiba_code[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, + 0x00, 0x00, 0x00, 0x00}; + + irsend.sendToshibaAC(toshiba_code, kToshibaACStateLength, 0); + EXPECT_EQ( + "f38000d50" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s1600m580s1600" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s1600m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s7400", + irsend.outputStr()); + + irsend.reset(); + irsend.sendToshibaAC(toshiba_code, kToshibaACStateLength, 2); + EXPECT_EQ( + "f38000d50" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s1600m580s1600" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s1600m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s7400" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s1600m580s1600" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s1600m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s7400" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s1600m580s1600" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s1600m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s7400", + irsend.outputStr()); +} + +// Tests for IRToshibaAC class. + +TEST(TestToshibaACClass, Power) { + IRToshibaAC ac(kGpioUnused); + ac.begin(); + + 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(TestToshibaACClass, Temperature) { + IRToshibaAC ac(kGpioUnused); + ac.begin(); + + ac.setTemp(0); + EXPECT_EQ(kToshibaAcMinTemp, ac.getTemp()); + + ac.setTemp(255); + EXPECT_EQ(kToshibaAcMaxTemp, ac.getTemp()); + + ac.setTemp(kToshibaAcMinTemp); + EXPECT_EQ(kToshibaAcMinTemp, ac.getTemp()); + + ac.setTemp(kToshibaAcMaxTemp); + EXPECT_EQ(kToshibaAcMaxTemp, ac.getTemp()); + + ac.setTemp(kToshibaAcMinTemp - 1); + EXPECT_EQ(kToshibaAcMinTemp, ac.getTemp()); + + ac.setTemp(kToshibaAcMaxTemp + 1); + EXPECT_EQ(kToshibaAcMaxTemp, ac.getTemp()); + + ac.setTemp(17); + EXPECT_EQ(17, ac.getTemp()); + + ac.setTemp(21); + EXPECT_EQ(21, ac.getTemp()); + + ac.setTemp(25); + EXPECT_EQ(25, ac.getTemp()); + + ac.setTemp(30); + EXPECT_EQ(30, ac.getTemp()); +} + +TEST(TestToshibaACClass, OperatingMode) { + IRToshibaAC ac(kGpioUnused); + ac.begin(); + + ac.setMode(kToshibaAcAuto); + EXPECT_EQ(kToshibaAcAuto, ac.getMode()); + + ac.setMode(kToshibaAcCool); + EXPECT_EQ(kToshibaAcCool, ac.getMode()); + + ac.setMode(kToshibaAcHeat); + EXPECT_EQ(kToshibaAcHeat, ac.getMode()); + + ac.setMode(kToshibaAcDry); + EXPECT_EQ(kToshibaAcDry, ac.getMode()); + + ac.setMode(kToshibaAcFan); + EXPECT_EQ(kToshibaAcFan, ac.getMode()); + + ac.setMode(kToshibaAcFan + 1); + EXPECT_EQ(kToshibaAcAuto, ac.getMode()); + + ac.setMode(255); + EXPECT_EQ(kToshibaAcAuto, ac.getMode()); + + // Setting the power off changes the underlying mode in the state to a special + // off mode. + ac.setPower(true); + ac.setMode(kToshibaAcCool); + EXPECT_EQ(kToshibaAcCool, ac.getMode()); + ac.setPower(false); + EXPECT_EQ(kToshibaAcCool, ac.getMode()); +} + +TEST(TestToshibaACClass, FanSpeed) { + IRToshibaAC ac(kGpioUnused); + ac.begin(); + + ac.setFan(kToshibaAcFanAuto); + EXPECT_EQ(kToshibaAcFanAuto, ac.getFan()); + + ac.setFan(255); + EXPECT_EQ(kToshibaAcFanMax, ac.getFan()); + + ac.setFan(kToshibaAcFanMax); + EXPECT_EQ(kToshibaAcFanMax, ac.getFan()); + + ac.setFan(kToshibaAcFanMax - 1); + EXPECT_EQ(kToshibaAcFanMax - 1, ac.getFan()); + + ac.setFan(1); + EXPECT_EQ(1, ac.getFan()); + + ac.setFan(2); + EXPECT_EQ(2, ac.getFan()); + + ac.setFan(3); + EXPECT_EQ(3, ac.getFan()); + + ac.setFan(4); + EXPECT_EQ(4, ac.getFan()); + + ac.setFan(kToshibaAcFanMax + 1); + EXPECT_EQ(kToshibaAcFanMax, ac.getFan()); +} + +TEST(TestToshibaACClass, RawState) { + IRToshibaAC ac(kGpioUnused); + ac.begin(); + + uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, + 0x50, 0x00, 0x00, 0x51}; + uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, + 0x00, 0xC1, 0x00, 0xC0}; + + // Verify the starting state. + EXPECT_STATE_EQ(initial_state, ac.getRaw(), kToshibaACBits); + EXPECT_TRUE(ac.getPower()); + EXPECT_EQ(kToshibaAcAuto, ac.getMode()); + EXPECT_EQ(kToshibaAcFanAuto, ac.getFan()); + + // Change some settings. + ac.setMode(kToshibaAcCool); + ac.setFan(kToshibaAcFanMax); + ac.setTemp(kToshibaAcMinTemp); + // Verify those were set. + EXPECT_EQ(kToshibaAcCool, ac.getMode()); + EXPECT_EQ(kToshibaAcFanMax, ac.getFan()); + EXPECT_EQ(kToshibaAcMinTemp, ac.getTemp()); + // Retrieve the modified state. + EXPECT_STATE_EQ(modified_state, ac.getRaw(), kToshibaACBits); + + // Set it back to the initial state. + ac.setRaw(initial_state); + + // Check the new state was set correctly. + EXPECT_TRUE(ac.getPower()); + EXPECT_EQ(kToshibaAcAuto, ac.getMode()); + EXPECT_EQ(kToshibaAcFanAuto, ac.getFan()); + EXPECT_STATE_EQ(initial_state, ac.getRaw(), kToshibaACBits); +} + +TEST(TestToshibaACClass, Checksums) { + IRToshibaAC ac(kGpioUnused); + ac.begin(); + + uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, + 0x00, 0x00, 0x00, 0x01}; + uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, + 0x00, 0xC1, 0x00, 0xC0}; + uint8_t invalid_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, + 0x00, 0x00, 0x00, 0x00}; + + EXPECT_EQ(0x01, ac.calcChecksum(initial_state)); + EXPECT_EQ(0xC0, ac.calcChecksum(modified_state)); + // Check we can call it without instantiating the object. + EXPECT_EQ(0x01, IRToshibaAC::calcChecksum(initial_state)); + // Use different lengths. + EXPECT_EQ(0x01, IRToshibaAC::calcChecksum(initial_state, + kToshibaACStateLength - 1)); + EXPECT_EQ(0xFF, IRToshibaAC::calcChecksum(initial_state, 3)); + // Minimum length that actually means anything. + EXPECT_EQ(0xF2, IRToshibaAC::calcChecksum(initial_state, 2)); + // Technically, there is no such thing as a checksum for a length of < 2 + // But test it anyway + EXPECT_EQ(0x00, IRToshibaAC::calcChecksum(initial_state, 1)); + EXPECT_EQ(0x00, IRToshibaAC::calcChecksum(initial_state, 0)); + + // Validity tests. + EXPECT_TRUE(IRToshibaAC::validChecksum(initial_state)); + EXPECT_TRUE(IRToshibaAC::validChecksum(modified_state)); + EXPECT_FALSE(IRToshibaAC::validChecksum(invalid_state)); + EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 0)); + EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 1)); + EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 2)); +} + +TEST(TestToshibaACClass, HumanReadableOutput) { + IRToshibaAC ac(kGpioUnused); + ac.begin(); + + uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, + 0x00, 0x00, 0x00, 0x01}; + uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, + 0x00, 0xC1, 0x00, 0xC0}; + + ac.setRaw(initial_state); + EXPECT_EQ("Temp: 17C, Power: On, Mode: 0 (Auto), Fan: 0 (Auto), " + "Turbo: Off, Econo: Off", + ac.toString()); + ac.setRaw(modified_state); + EXPECT_EQ("Temp: 17C, Power: On, Mode: 1 (Cool), Fan: 5 (High), " + "Turbo: Off, Econo: Off", + ac.toString()); + ac.setTemp(25); + ac.setFan(3); + ac.setMode(kToshibaAcDry); + EXPECT_EQ("Temp: 25C, Power: On, Mode: 2 (Dry), Fan: 3 (Medium), " + "Turbo: Off, Econo: Off", + ac.toString()); + ac.off(); + EXPECT_EQ("Temp: 25C, Power: Off, Fan: 3 (Medium), Turbo: Off, Econo: Off", + ac.toString()); +} + +TEST(TestToshibaACClass, MessageConstuction) { + IRToshibaAC ac(kGpioUnused); + ac.begin(); + + ac.on(); + ac.setFan(1); + ac.setMode(kToshibaAcCool); + ac.setTemp(27); + + // Check everything for kicks. + EXPECT_EQ(1, ac.getFan()); + EXPECT_EQ(kToshibaAcCool, ac.getMode()); + EXPECT_EQ(27, ac.getTemp()); + EXPECT_TRUE(ac.getPower()); + + // Turn off the power and re-check. + ac.setPower(false); + // Check everything for kicks. + EXPECT_EQ(1, ac.getFan()); + EXPECT_EQ(kToshibaAcCool, ac.getMode()); + EXPECT_EQ(27, ac.getTemp()); + EXPECT_FALSE(ac.getPower()); + + // Turn the power back on, and check nothing changed. + ac.on(); + + EXPECT_EQ(1, ac.getFan()); + EXPECT_EQ(kToshibaAcCool, ac.getMode()); + EXPECT_EQ(27, ac.getTemp()); + EXPECT_TRUE(ac.getPower()); +} + +// Decoding a message we entirely constructed based solely on a given state. +TEST(TestDecodeToshibaAC, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + uint8_t expectedState[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, + 0x00, 0x00, 0x00, 0x01}; + + irsend.reset(); + irsend.sendToshibaAC(expectedState); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); + ASSERT_EQ(kToshibaACBits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "Temp: 17C, Power: On, Mode: 0 (Auto), Fan: 0 (Auto), Turbo: Off, " + "Econo: Off", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} + +// Test decoding against captures from a real Toshiba A/C remote. +// Recorded by @mwildbolz +TEST(TestDecodeToshibaAC, RealExamples) { + IRToshibaAC ac(kGpioUnused); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + uint16_t rawData1[295] = { + 4442, 4292, 612, 1544, 616, 1544, 616, 1544, 612, 1548, 610, 468, + 612, 468, 662, 1494, 640, 438, 616, 464, 614, 464, 616, 464, + 612, 468, 610, 1544, 616, 1544, 616, 468, 612, 1544, 616, 464, + 694, 386, 616, 464, 612, 468, 612, 468, 636, 444, 610, 1546, + 616, 1544, 612, 1546, 614, 1546, 616, 1546, 740, 1420, 612, 1544, + 616, 1546, 616, 464, 610, 468, 610, 470, 612, 468, 610, 468, + 610, 470, 636, 438, 616, 464, 616, 464, 616, 1546, 636, 442, + 612, 1546, 614, 1544, 616, 464, 614, 464, 610, 468, 612, 468, + 612, 468, 612, 468, 636, 440, 614, 464, 616, 464, 616, 464, + 612, 468, 636, 442, 638, 442, 662, 418, 610, 464, 616, 464, + 616, 464, 610, 468, 612, 468, 636, 444, 610, 468, 638, 438, + 614, 1546, 612, 1548, 612, 470, 610, 468, 636, 442, 612, 468, + 612, 1544, 612, 7396, 4442, 4292, 610, 1546, 616, 1544, 612, 1548, + 612, 1546, 616, 464, 616, 464, 616, 1544, 612, 468, 662, 418, + 610, 468, 638, 442, 638, 438, 616, 1546, 616, 1544, 612, 468, + 610, 1546, 616, 464, 616, 464, 642, 438, 616, 464, 612, 468, + 610, 470, 610, 1546, 616, 1544, 612, 1546, 616, 1546, 614, 1546, + 612, 1550, 610, 1544, 616, 1546, 614, 464, 642, 438, 610, 468, + 612, 468, 612, 468, 612, 468, 610, 468, 638, 438, 614, 464, + 616, 1544, 636, 444, 636, 1520, 616, 1544, 616, 464, 616, 464, + 612, 468, 612, 468, 612, 468, 612, 468, 612, 464, 612, 470, + 636, 442, 638, 442, 612, 470, 692, 384, 614, 464, 616, 464, + 612, 468, 610, 468, 612, 468, 610, 470, 610, 464, 616, 464, + 616, 464, 616, 464, 610, 1550, 610, 1546, 640, 444, 688, 386, + 616, 464, 612, 468, 612, 1544, 642}; + + irsend.reset(); + irsend.sendRaw(rawData1, 295, 38000); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); + ASSERT_EQ(kToshibaACBits, irsend.capture.bits); + ac.setRaw(irsend.capture.state); + EXPECT_TRUE(ac.getPower()); + EXPECT_EQ(23, ac.getTemp()); + EXPECT_EQ(kToshibaAcFanAuto, ac.getFan()); + EXPECT_EQ(kToshibaAcAuto, ac.getMode()); + + uint16_t rawData2[295] = { + 4500, 4236, 636, 1520, 642, 1520, 640, 1520, 664, 1492, 642, 440, + 668, 412, 642, 1518, 638, 438, 666, 414, 640, 438, 642, 438, + 638, 442, 642, 1516, 640, 1520, 642, 438, 642, 1520, 636, 438, + 668, 412, 640, 440, 666, 412, 642, 438, 668, 412, 640, 1516, + 668, 1492, 642, 1520, 666, 1494, 638, 1520, 642, 1520, 668, 1490, + 666, 1494, 642, 438, 638, 438, 668, 412, 668, 412, 642, 438, + 642, 438, 664, 412, 642, 438, 642, 438, 642, 1518, 642, 434, + 668, 412, 642, 438, 668, 412, 692, 388, 666, 412, 642, 434, + 642, 438, 642, 1518, 668, 412, 668, 412, 640, 438, 638, 438, + 642, 438, 640, 438, 668, 1492, 642, 440, 666, 412, 640, 438, + 642, 438, 642, 434, 668, 412, 668, 412, 666, 414, 666, 1494, + 640, 438, 642, 434, 668, 412, 642, 438, 642, 438, 668, 412, + 668, 414, 640, 7362, 4474, 4262, 642, 1518, 638, 1520, 640, 1520, + 668, 1494, 640, 434, 642, 438, 640, 1520, 642, 438, 642, 438, + 642, 438, 642, 438, 642, 434, 668, 1494, 642, 1518, 638, 442, + 638, 1520, 642, 438, 642, 438, 668, 414, 664, 408, 642, 438, + 668, 412, 642, 1520, 666, 1494, 642, 1514, 642, 1518, 642, 1520, + 636, 1520, 668, 1494, 666, 1494, 638, 438, 666, 414, 640, 440, + 666, 412, 668, 412, 668, 412, 642, 434, 668, 412, 668, 412, + 668, 1494, 642, 438, 642, 434, 642, 438, 642, 438, 642, 438, + 642, 438, 642, 434, 646, 434, 642, 1518, 668, 412, 642, 438, + 642, 434, 666, 414, 640, 438, 642, 438, 642, 1518, 642, 438, + 642, 434, 668, 412, 642, 438, 642, 438, 642, 438, 642, 438, + 642, 438, 640, 1520, 636, 438, 642, 438, 642, 438, 666, 414, + 668, 412, 642, 440, 640, 438, 640}; + + irsend.reset(); + irsend.sendRaw(rawData2, 295, 38000); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); + ASSERT_EQ(kToshibaACBits, irsend.capture.bits); + ac.setRaw(irsend.capture.state); + EXPECT_TRUE(ac.getPower()); + EXPECT_EQ(17, ac.getTemp()); + EXPECT_EQ(3, ac.getFan()); + EXPECT_EQ(kToshibaAcCool, ac.getMode()); + + uint16_t rawData3[295] = { + 4474, 4262, 642, 1514, 642, 1520, 642, 1520, 642, 1514, 642, 438, + 642, 438, 642, 1520, 636, 438, 642, 438, 642, 438, 642, 438, + 642, 438, 640, 1520, 638, 1520, 642, 438, 640, 1520, 642, 438, + 642, 434, 642, 438, 642, 438, 642, 438, 668, 414, 636, 1520, + 642, 1520, 642, 1514, 642, 1520, 642, 1520, 640, 1518, 638, 1520, + 666, 1494, 642, 438, 642, 434, 642, 438, 640, 438, 642, 438, + 642, 440, 640, 434, 642, 438, 642, 438, 642, 1520, 642, 438, + 642, 1514, 642, 1520, 640, 1520, 636, 438, 642, 438, 642, 438, + 666, 414, 642, 1520, 636, 1520, 642, 438, 642, 438, 640, 438, + 642, 434, 642, 1518, 642, 1520, 642, 438, 642, 434, 640, 438, + 642, 438, 642, 438, 642, 440, 642, 438, 668, 408, 642, 1520, + 642, 438, 642, 1520, 638, 1518, 642, 438, 642, 438, 640, 1520, + 640, 438, 642, 7362, 4474, 4262, 642, 1518, 638, 1520, 640, 1520, + 642, 1520, 638, 438, 642, 438, 642, 1518, 642, 438, 638, 438, + 642, 438, 642, 438, 642, 438, 642, 1514, 642, 1520, 642, 438, + 666, 1490, 642, 438, 642, 438, 642, 440, 640, 438, 642, 434, + 640, 438, 642, 1520, 642, 1520, 636, 1520, 642, 1520, 642, 1514, + 642, 1518, 642, 1518, 640, 1516, 642, 438, 642, 438, 642, 438, + 640, 438, 638, 442, 642, 434, 642, 440, 640, 438, 642, 438, + 642, 1518, 642, 438, 642, 1514, 642, 1520, 642, 1518, 642, 438, + 642, 432, 642, 438, 642, 438, 642, 1520, 642, 1514, 642, 438, + 642, 438, 642, 438, 642, 438, 642, 1514, 642, 1520, 642, 438, + 642, 438, 638, 438, 642, 438, 642, 438, 640, 440, 642, 438, + 640, 434, 642, 1520, 642, 438, 640, 1520, 668, 1490, 666, 414, + 640, 438, 642, 1520, 642, 438, 636}; + + irsend.reset(); + irsend.sendRaw(rawData3, 295, 38000); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); + ASSERT_EQ(kToshibaACBits, irsend.capture.bits); + ac.setRaw(irsend.capture.state); + EXPECT_TRUE(ac.getPower()); + EXPECT_EQ(24, ac.getTemp()); + EXPECT_EQ(kToshibaAcFanMax, ac.getFan()); + EXPECT_EQ(kToshibaAcHeat, ac.getMode()); + + uint16_t rawData4[295] = { + 4474, 4262, 636, 1520, 640, 1520, 640, 1520, 638, 1518, 642, 438, + 642, 438, 642, 1520, 636, 438, 642, 438, 642, 438, 642, 438, + 636, 444, 636, 1520, 640, 1520, 642, 438, 638, 1524, 638, 438, + 640, 438, 642, 438, 640, 438, 642, 438, 638, 438, 642, 1518, + 642, 1520, 666, 1494, 636, 1520, 640, 1520, 640, 1520, 636, 1524, + 638, 1520, 640, 440, 640, 438, 642, 438, 636, 444, 636, 438, + 642, 438, 640, 440, 640, 438, 642, 438, 642, 1518, 638, 438, + 642, 1518, 642, 438, 640, 1520, 636, 444, 636, 438, 640, 438, + 642, 438, 668, 1494, 640, 438, 642, 1518, 636, 444, 636, 438, + 640, 1520, 642, 1518, 642, 1520, 636, 444, 636, 438, 642, 438, + 642, 438, 640, 440, 640, 438, 640, 440, 640, 438, 640, 1518, + 642, 1520, 636, 1524, 636, 1518, 642, 438, 642, 1518, 642, 1518, + 640, 438, 642, 7364, 4472, 4262, 642, 1518, 642, 1518, 638, 1518, + 642, 1520, 642, 438, 642, 438, 640, 1520, 636, 440, 640, 438, + 642, 438, 640, 438, 642, 438, 642, 1518, 636, 1524, 636, 438, + 640, 1520, 642, 438, 642, 438, 640, 438, 636, 444, 636, 438, + 668, 412, 642, 1518, 642, 1520, 642, 1520, 636, 1518, 642, 1518, + 642, 1520, 636, 1520, 668, 1494, 642, 438, 636, 444, 664, 412, + 642, 438, 668, 412, 642, 438, 636, 442, 638, 442, 638, 438, + 642, 1518, 642, 438, 642, 1518, 638, 438, 642, 1518, 642, 440, + 640, 438, 636, 444, 636, 444, 636, 1520, 642, 438, 642, 1520, + 636, 444, 636, 438, 642, 1520, 640, 1520, 636, 1520, 668, 412, + 642, 438, 642, 438, 642, 438, 638, 442, 636, 438, 642, 438, + 668, 412, 640, 1520, 638, 1524, 636, 1520, 642, 1520, 636, 444, + 638, 1522, 638, 1518, 640, 438, 642}; + + irsend.reset(); + irsend.sendRaw(rawData4, 295, 38000); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); + ASSERT_EQ(kToshibaACBits, irsend.capture.bits); + ac.setRaw(irsend.capture.state); + EXPECT_FALSE(ac.getPower()); + EXPECT_EQ(22, ac.getTemp()); + EXPECT_EQ(4, ac.getFan()); +} + +TEST(TestToshibaACClass, toCommon) { + IRToshibaAC ac(0); + ac.setPower(true); + ac.setMode(kToshibaAcCool); + ac.setTemp(20); + ac.setFan(kToshibaAcFanMax); + // Now test it. + ASSERT_EQ(decode_type_t::TOSHIBA_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); + // 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().econo); + ASSERT_FALSE(ac.toCommon().light); + ASSERT_FALSE(ac.toCommon().filter); + ASSERT_FALSE(ac.toCommon().clean); + ASSERT_FALSE(ac.toCommon().beep); + ASSERT_FALSE(ac.toCommon().quiet); + ASSERT_EQ(-1, ac.toCommon().sleep); + ASSERT_EQ(-1, ac.toCommon().clock); +} + +// Tests for CarrierAc2 +/// Decode a "real" long example message. +TEST(TestDecodeToshibaAC, RealLongExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + // Data from: + // https://github.com/crankyoldgit/IRremoteESP8266/issues/1205#issuecomment-650475434 + const uint16_t high_power_on[327] = { + 4424, 4320, + 582, 1574, 588, 1578, 582, 1574, 586, 1578, 586, 496, 582, 492, 586, 1576, + 586, 492, 586, 492, 588, 496, 584, 496, 584, 496, 584, 1626, 534, 1626, + 534, 494, 586, 1578, 582, 494, 586, 494, 586, 494, 588, 492, 586, 492, + 586, 1576, 586, 494, 588, 492, 588, 1574, 588, 1576, 584, 1578, 584, 1574, + 588, 1574, 588, 492, 588, 1572, 590, 1570, 590, 492, 588, 492, 590, 488, + 590, 494, 584, 1570, 592, 492, 586, 490, 590, 1572, 590, 490, 590, 1570, + 590, 490, 590, 1570, 590, 492, 588, 490, 588, 492, 588, 492, 590, 490, + 590, 494, 586, 490, 590, 490, 588, 490, 590, 490, 588, 492, 590, 490, + 588, 492, 590, 490, 590, 490, 590, 494, 584, 490, 590, 490, 590, 490, + 590, 490, 588, 490, 588, 492, 588, 492, 586, 492, 588, 490, 588, 492, + 588, 490, 590, 1572, 588, 494, 586, 1574, 588, 492, 588, 1572, 590, 1572, + 588, 492, 588, 492, 586, 494, 588, + 7422, + 4424, 4320, + 586, 1572, 588, 1572, 588, 1576, 584, 1574, 588, 494, 586, 492, 588, 1572, + 588, 492, 588, 492, 588, 492, 588, 494, 586, 496, 584, 1574, 586, 1578, + 582, 494, 586, 1578, 584, 494, 586, 492, 588, 492, 586, 496, 584, 494, + 586, 1578, 584, 494, 586, 494, 584, 1574, 588, 1572, 586, 1574, 588, 1574, + 588, 1572, 588, 494, 590, 1572, 588, 1574, 588, 492, 588, 492, 588, 492, + 586, 492, 588, 1572, 588, 498, 582, 492, 588, 1576, 586, 492, 588, 1572, + 588, 494, 588, 1572, 588, 492, 586, 492, 588, 492, 590, 490, 588, 492, + 586, 492, 588, 492, 590, 490, 588, 490, 588, 492, 590, 490, 588, 492, + 590, 490, 588, 490, 590, 490, 590, 490, 592, 488, 592, 494, 584, 494, + 586, 490, 590, 494, 586, 494, 588, 488, 592, 490, 588, 492, 586, 490, + 592, 490, 588, 1576, 584, 494, 586, 1570, 590, 494, 586, 1576, 582, 1572, + 590, 490, 590, 490, 588, 490, 590}; // UNKNOWN 54926187 + + const uint8_t expectedState[kToshibaACStateLengthLong] = { + 0xF2, 0x0D, 0x04, 0xFB, 0x09, 0x50, 0x00, 0x00, 0x01, 0x58}; + irsend.sendRaw(high_power_on, 327, 38000); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::TOSHIBA_AC, irsend.capture.decode_type); + EXPECT_EQ(kToshibaACBitsLong, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "Temp: 22C, Power: On, Mode: 0 (Auto), Fan: 0 (Auto), Turbo: On, " + "Econo: Off", + IRAcUtils::resultAcToString(&irsend.capture)); +} + + +/// Decode a synthetic long message. +TEST(TestDecodeToshibaAC, SyntheticLongExample) { + IRsendTest irsend(0); + IRrecv irrecv(0); + + const uint8_t expectedState[kToshibaACStateLengthLong] = { + 0xF2, 0x0D, 0x04, 0xFB, 0x09, 0x50, 0x00, 0x00, 0x01, 0x58}; + irsend.begin(); + irsend.reset(); + irsend.sendToshibaAC(expectedState, kToshibaACStateLengthLong); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::TOSHIBA_AC, irsend.capture.decode_type); + EXPECT_EQ(kToshibaACBitsLong, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "f38000d50" + // 4424 4320 + "m4400s4300" + // 582 1574 588 1578 582 1574 586 1578 586 496 582 492 586 1576 586 492 + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + // 586 492 588 496 584 496 584 496 584 1626 534 1626 534 494 586 1578 + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + // 582 494 586 494 586 494 588 492 586 492 586 1576 586 494 588 492 + "m580s490m580s490m580s490m580s490m580s490m580s1600m580s490m580s490" + // 588 1574 588 1576 584 1578 584 1574 588 1574 588 492 588 1572 590 1570 + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s490m580s1600m580s1600" + // 590 492 588 492 590 488 590 494 584 1570 592 492 586 490 590 1572 + "m580s490m580s490m580s490m580s490m580s1600m580s490m580s490m580s1600" + // 590 490 590 1570 590 490 590 1570 590 492 588 490 588 492 588 492 + "m580s490m580s1600m580s490m580s1600m580s490m580s490m580s490m580s490" + // 590 490 590 494 586 490 590 490 588 490 590 490 588 492 590 490 + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + // 588 492 590 490 590 490 590 494 584 490 590 490 590 490 590 490 + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + // 588 490 588 492 588 492 586 492 588 490 588 492 588 490 590 1572 + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s1600" + // 588 494 586 1574 588 492 588 1572 590 1572 588 492 588 492 586 494 + "m580s490m580s1600m580s490m580s1600m580s1600m580s490m580s490m580s490" + // 588 7422 + "m580s7400" + "m4400s4300" + "m580s1600m580s1600m580s1600m580s1600m580s490m580s490m580s1600m580s490" + "m580s490m580s490m580s490m580s490m580s1600m580s1600m580s490m580s1600" + "m580s490m580s490m580s490m580s490m580s490m580s1600m580s490m580s490" + "m580s1600m580s1600m580s1600m580s1600m580s1600m580s490m580s1600m580s1600" + "m580s490m580s490m580s490m580s490m580s1600m580s490m580s490m580s1600" + "m580s490m580s1600m580s490m580s1600m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s490" + "m580s490m580s490m580s490m580s490m580s490m580s490m580s490m580s1600" + "m580s490m580s1600m580s490m580s1600m580s1600m580s490m580s490m580s490" + "m580s7400", + irsend.outputStr()); +} + +/// Decode a "real" short example message. +TEST(TestDecodeToshibaAC, RealShortExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + // Data from: + // https://github.com/crankyoldgit/IRremoteESP8266/issues/1205#issuecomment-650475096 + const uint16_t air_direction[115] = { + 4424, 4318, + 588, 1574, 588, 1572, 588, 1574, 586, 1572, 590, 490, 586, 494, 586, 1574, + 588, 492, 586, 494, 586, 494, 586, 496, 584, 492, 588, 1572, 588, 1572, + 590, 492, 588, 1572, 590, 490, 588, 492, 586, 494, 588, 492, 588, 492, + 588, 494, 584, 492, 588, 1572, 588, 1574, 588, 1574, 588, 1572, 588, 1572, + 588, 1572, 588, 1574, 590, 1570, 588, 494, 586, 496, 584, 494, 588, 1572, + 588, 492, 588, 492, 588, 490, 588, 492, 590, 1572, 588, 492, 588, 496, + 586, 492, 588, 492, 586, 492, 588, 492, 588, 490, 590, 490, 588, 492, + 588, 490, 588, 1572, 588, 492, 588, 492, 588, 490, 588, 492, 588, 1572, + 586}; // UNKNOWN DEB8845C + const uint8_t expectedState[kToshibaACStateLengthShort] = { + 0xF2, 0x0D, 0x01, 0xFE, 0x21, 0x00, 0x21}; + irsend.sendRaw(air_direction, 115, 38000); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::TOSHIBA_AC, irsend.capture.decode_type); + EXPECT_EQ(kToshibaACBitsShort, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "Temp: 17C, Swing(V): 0 (Step)", + IRAcUtils::resultAcToString(&irsend.capture)); +} + +TEST(TestToshibaACClass, ConstructLongState) { + IRToshibaAC ac(kGpioUnused); + ac.setPower(true); + ac.setMode(kToshibaAcDry); + ac.setTemp(29); + ac.setFan(2); + ac.setSwing(false); + ac.setTurbo(false); + ac.setEcono(true); + EXPECT_EQ( + "Temp: 29C, Power: On, Mode: 2 (Dry), Fan: 2 (UNKNOWN), " + "Turbo: Off, Econo: On", + ac.toString()); + EXPECT_EQ(kToshibaACStateLengthLong, ac.getStateLength()); + const uint8_t expectedState[kToshibaACStateLengthLong] = { + 0xF2, 0x0D, 0x04, 0xFB, 0x09, 0xC0, 0x62, 0x00, 0x03, 0xA8}; + EXPECT_STATE_EQ(expectedState, ac.getRaw(), kToshibaACBitsLong); + EXPECT_EQ(kToshibaACStateLengthLong, ac.getStateLength()); +} diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Trotec_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Trotec_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Trotec_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Trotec_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Vestel_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Vestel_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Vestel_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Vestel_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Whirlpool_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Whirlpool_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Whirlpool_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Whirlpool_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Whynter_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Whynter_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Whynter_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Whynter_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Zepeal_test.cpp b/lib/IRremoteESP8266-2.7.8.10/test/ir_Zepeal_test.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/test/ir_Zepeal_test.cpp rename to lib/IRremoteESP8266-2.7.8.10/test/ir_Zepeal_test.cpp diff --git a/lib/IRremoteESP8266-2.7.8/tools/Makefile b/lib/IRremoteESP8266-2.7.8.10/tools/Makefile similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/Makefile rename to lib/IRremoteESP8266-2.7.8.10/tools/Makefile diff --git a/lib/IRremoteESP8266-2.7.8/tools/RawToGlobalCache.sh b/lib/IRremoteESP8266-2.7.8.10/tools/RawToGlobalCache.sh similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/RawToGlobalCache.sh rename to lib/IRremoteESP8266-2.7.8.10/tools/RawToGlobalCache.sh diff --git a/lib/IRremoteESP8266-2.7.8/tools/auto_analyse_raw_data.py b/lib/IRremoteESP8266-2.7.8.10/tools/auto_analyse_raw_data.py similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/auto_analyse_raw_data.py rename to lib/IRremoteESP8266-2.7.8.10/tools/auto_analyse_raw_data.py diff --git a/lib/IRremoteESP8266-2.7.8/tools/auto_analyse_raw_data_test.py b/lib/IRremoteESP8266-2.7.8.10/tools/auto_analyse_raw_data_test.py similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/auto_analyse_raw_data_test.py rename to lib/IRremoteESP8266-2.7.8.10/tools/auto_analyse_raw_data_test.py diff --git a/lib/IRremoteESP8266-2.7.8/tools/gc_decode.cpp b/lib/IRremoteESP8266-2.7.8.10/tools/gc_decode.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/gc_decode.cpp rename to lib/IRremoteESP8266-2.7.8.10/tools/gc_decode.cpp diff --git a/lib/IRremoteESP8266-2.7.8/tools/generate_irtext_h.sh b/lib/IRremoteESP8266-2.7.8.10/tools/generate_irtext_h.sh similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/generate_irtext_h.sh rename to lib/IRremoteESP8266-2.7.8.10/tools/generate_irtext_h.sh diff --git a/lib/IRremoteESP8266-2.7.8/tools/mkkeywords b/lib/IRremoteESP8266-2.7.8.10/tools/mkkeywords similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/mkkeywords rename to lib/IRremoteESP8266-2.7.8.10/tools/mkkeywords diff --git a/lib/IRremoteESP8266-2.7.8/tools/mode2_decode.cpp b/lib/IRremoteESP8266-2.7.8.10/tools/mode2_decode.cpp similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/mode2_decode.cpp rename to lib/IRremoteESP8266-2.7.8.10/tools/mode2_decode.cpp diff --git a/lib/IRremoteESP8266-2.7.8/tools/raw_to_pronto_code.py b/lib/IRremoteESP8266-2.7.8.10/tools/raw_to_pronto_code.py old mode 100755 new mode 100644 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/raw_to_pronto_code.py rename to lib/IRremoteESP8266-2.7.8.10/tools/raw_to_pronto_code.py diff --git a/lib/IRremoteESP8266-2.7.8/tools/raw_to_pronto_code_test.py b/lib/IRremoteESP8266-2.7.8.10/tools/raw_to_pronto_code_test.py old mode 100755 new mode 100644 similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/raw_to_pronto_code_test.py rename to lib/IRremoteESP8266-2.7.8.10/tools/raw_to_pronto_code_test.py diff --git a/lib/IRremoteESP8266-2.7.8/tools/scrape_supported_devices.py b/lib/IRremoteESP8266-2.7.8.10/tools/scrape_supported_devices.py similarity index 100% rename from lib/IRremoteESP8266-2.7.8/tools/scrape_supported_devices.py rename to lib/IRremoteESP8266-2.7.8.10/tools/scrape_supported_devices.py diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Airwell.cpp b/lib/IRremoteESP8266-2.7.8/src/ir_Airwell.cpp deleted file mode 100644 index 2bf0a2db8..000000000 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Airwell.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2020 David Conran - -#include "IRrecv.h" -#include "IRsend.h" - -/// @file -/// @brief Airwell "Manchester code" based protocol. -/// Some other Airwell products use the COOLIX protocol. - -// Supports: -// Brand: Airwell, Model: RC08W remote -// Brand: Airwell, Model: RC04 remote -// Brand: Airwell, Model: DLS 21 DCI R410 AW A/C - -const uint8_t kAirwellOverhead = 4; -const uint16_t kAirwellHalfClockPeriod = 950; // uSeconds -const uint16_t kAirwellHdrMark = 3 * kAirwellHalfClockPeriod; // uSeconds -const uint16_t kAirwellHdrSpace = 3 * kAirwellHalfClockPeriod; // uSeconds -const uint16_t kAirwellFooterMark = 5 * kAirwellHalfClockPeriod; // uSeconds - -#if SEND_AIRWELL -/// Send an Airwell Manchester Code formatted message. -/// Status: BETA / Appears to be working. -/// @param[in] data The message to be sent. -/// @param[in] nbits The number of bits of the message to be sent. -/// @param[in] repeat The number of times the command is to be repeated. -/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1069 -void IRsend::sendAirwell(uint64_t data, uint16_t nbits, uint16_t repeat) { - // Header + Data - sendManchester(kAirwellHdrMark, kAirwellHdrMark, kAirwellHalfClockPeriod, - 0, 0, data, nbits, 38000, true, repeat, kDutyDefault, false); - // Footer - mark(kAirwellHdrMark + kAirwellHalfClockPeriod); - space(kDefaultMessageGap); // A guess. -} -#endif - -#if DECODE_AIRWELL -/// Decode the supplied Airwell "Manchester code" message. -/// -/// Status: BETA / Appears to be working. -/// @param[in,out] results Ptr to the data to decode & where to store the decode -/// result. -/// @param[in] offset The starting index to use when attempting to decode the -/// raw data. Typically/Defaults to kStartOffset. -/// @param[in] nbits The number of data bits to expect. -/// @param[in] strict Flag indicating if we should perform strict matching. -/// @return A boolean. True if it can decode it, false if it can't. -/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1069 -bool IRrecv::decodeAirwell(decode_results *results, uint16_t offset, - const uint16_t nbits, const bool strict) { - if (results->rawlen < nbits + kAirwellOverhead - offset) - return false; // Too short a message to match. - - // Compliance - if (strict && nbits != kAirwellBits) - return false; // Doesn't match our protocol defn. - - // Header #1 + Data #1 + Footer #1 (There are total of 3 sections) - uint16_t used = matchManchester(results->rawbuf + offset, &results->value, - results->rawlen - offset, nbits, - kAirwellHdrMark, kAirwellHdrMark, - kAirwellHalfClockPeriod, - kAirwellHdrMark, kAirwellHdrSpace, - true, kUseDefTol, kMarkExcess, true, false); - if (used == 0) return false; - offset += used; - - // Success - results->decode_type = decode_type_t::AIRWELL; - results->bits = nbits; - results->address = 0; - results->command = 0; - return true; -} -#endif diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Sanyo.cpp b/lib/IRremoteESP8266-2.7.8/src/ir_Sanyo.cpp deleted file mode 100644 index 25baf380b..000000000 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Sanyo.cpp +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright 2009 Ken Shirriff -// Copyright 2016 marcosamarinho -// Copyright 2017 David Conran - -/// @file -/// @brief Support for Sanyo protocols. -/// Sanyo LC7461 support originally by marcosamarinho -/// Sanyo SA 8650B originally added from -/// https://github.com/shirriff/Arduino-IRremote/ -/// @see https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Sanyo.cpp -/// @see http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf -/// @see https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Sanyo.cpp -/// @see http://slydiman.narod.ru/scr/kb/sanyo.htm - -// Supports: -// Brand: Sanyo, Model: SA 8650B - disabled -// Brand: Sanyo, Model: LC7461 transmitter IC (SANYO_LC7461) - -#include -#include "IRrecv.h" -#include "IRsend.h" - - -// Constants -// Sanyo SA 8650B -const uint16_t kSanyoSa8650bHdrMark = 3500; // seen range 3500 -const uint16_t kSanyoSa8650bHdrSpace = 950; // seen 950 -const uint16_t kSanyoSa8650bOneMark = 2400; // seen 2400 -const uint16_t kSanyoSa8650bZeroMark = 700; // seen 700 -// usually see 713 - not using ticks as get number wrapround -const uint16_t kSanyoSa8650bDoubleSpaceUsecs = 800; -const uint16_t kSanyoSa8650bRptLength = 45000; - -// Sanyo LC7461 -const uint16_t kSanyoLc7461AddressMask = (1 << kSanyoLC7461AddressBits) - 1; -const uint16_t kSanyoLc7461CommandMask = (1 << kSanyoLC7461CommandBits) - 1; -const uint16_t kSanyoLc7461HdrMark = 9000; -const uint16_t kSanyoLc7461HdrSpace = 4500; -const uint16_t kSanyoLc7461BitMark = 560; // 1T -const uint16_t kSanyoLc7461OneSpace = 1690; // 3T -const uint16_t kSanyoLc7461ZeroSpace = 560; // 1T -const uint32_t kSanyoLc7461MinCommandLength = 108000; - -const uint16_t kSanyoLc7461MinGap = - kSanyoLc7461MinCommandLength - - (kSanyoLc7461HdrMark + kSanyoLc7461HdrSpace + - kSanyoLC7461Bits * (kSanyoLc7461BitMark + - (kSanyoLc7461OneSpace + kSanyoLc7461ZeroSpace) / 2) + - kSanyoLc7461BitMark); - -#if SEND_SANYO -/// Construct a Sanyo LC7461 message. -/// @param[in] address The 13 bit value of the address(Custom) portion of the -/// protocol. -/// @param[in] command The 8 bit value of the command(Key) portion of the -/// protocol. -/// @return An uint64_t with the encoded raw 42 bit Sanyo LC7461 data value. -/// @note This protocol uses the NEC protocol timings. However, data is -/// formatted as : address(13 bits), !address, command(8 bits), !command. -/// According with LIRC, this protocol is used on Sanyo, Aiwa and Chinon -uint64_t IRsend::encodeSanyoLC7461(uint16_t address, uint8_t command) { - // Mask our input values to ensure the correct bit sizes. - address &= kSanyoLc7461AddressMask; - command &= kSanyoLc7461CommandMask; - - uint64_t data = address; - address ^= kSanyoLc7461AddressMask; // Invert the 13 LSBs. - // Append the now inverted address. - data = (data << kSanyoLC7461AddressBits) | address; - // Append the command. - data = (data << kSanyoLC7461CommandBits) | command; - command ^= kSanyoLc7461CommandMask; // Invert the command. - // Append the now inverted command. - data = (data << kSanyoLC7461CommandBits) | command; - - return data; -} - -/// Send a Sanyo LC7461 message. -/// Status: BETA / Probably works. -/// @param[in] data The message to be sent. -/// @param[in] nbits The number of bits of message to be sent. -/// @param[in] repeat The number of times the command is to be repeated. -/// @note Based on \@marcosamarinho's work. -/// This protocol uses the NEC protocol timings. However, data is -/// formatted as : address(13 bits), !address, command (8 bits), !command. -/// According with LIRC, this protocol is used on Sanyo, Aiwa and Chinon -/// Information for this protocol is available at the Sanyo LC7461 datasheet. -/// Repeats are performed similar to the NEC method of sending a special -/// repeat message, rather than duplicating the entire message. -/// @see https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Sanyo.cpp -/// @see http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf -void IRsend::sendSanyoLC7461(const uint64_t data, const uint16_t nbits, - const uint16_t repeat) { - // This protocol appears to be another 42-bit variant of the NEC protocol. - sendNEC(data, nbits, repeat); -} -#endif // SEND_SANYO - -#if DECODE_SANYO -/// Decode the supplied SANYO LC7461 message. -/// Status: BETA / Probably works. -/// @param[in,out] results Ptr to the data to decode & where to store the result -/// @param[in] offset The starting index to use when attempting to decode the -/// raw data. Typically/Defaults to kStartOffset. -/// @param[in] nbits The number of data bits to expect. -/// @param[in] strict Flag indicating if we should perform strict matching. -/// @return True if it can decode it, false if it can't. -/// @note Based on \@marcosamarinho's work. -/// This protocol uses the NEC protocol. However, data is -/// formatted as : address(13 bits), !address, command (8 bits), !command. -/// According with LIRC, this protocol is used on Sanyo, Aiwa and Chinon -/// Information for this protocol is available at the Sanyo LC7461 datasheet. -/// @see http://slydiman.narod.ru/scr/kb/sanyo.htm -/// @see https://github.com/marcosamarinho/IRremoteESP8266/blob/master/ir_Sanyo.cpp -/// @see http://pdf.datasheetcatalog.com/datasheet/sanyo/LC7461.pdf -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, offset, nbits, false)) - return false; // Didn't match a NEC format (without strict) - - // Bits 30 to 42+. - uint16_t address = - results->value >> (kSanyoLC7461Bits - kSanyoLC7461AddressBits); - // Bits 9 to 16. - uint8_t command = - (results->value >> kSanyoLC7461CommandBits) & kSanyoLc7461CommandMask; - // Compliance - if (strict) { - if (results->bits != nbits) return false; - // Bits 17 to 29. - uint16_t inverted_address = - (results->value >> (kSanyoLC7461CommandBits * 2)) & - kSanyoLc7461AddressMask; - // Bits 1-8. - uint8_t inverted_command = results->value & kSanyoLc7461CommandMask; - if ((address ^ kSanyoLc7461AddressMask) != inverted_address) - return false; // Address integrity check failed. - if ((command ^ kSanyoLc7461CommandMask) != inverted_command) - return false; // Command integrity check failed. - } - - // Success - results->decode_type = SANYO_LC7461; - results->address = address; - results->command = command; - return true; -} - -/* NOTE: Disabled due to poor quality. -/// Decode the supplied Sanyo SA 8650B message. -/// Status: Depricated. -/// @depricated Disabled due to poor quality. -/// @param[in,out] results Ptr to the data to decode & where to store the result -/// @param[in] offset The starting index to use when attempting to decode the -/// raw data. Typically/Defaults to kStartOffset. -/// @param[in] nbits The number of data bits to expect. -/// @param[in] strict Flag indicating if we should perform strict matching. -/// @return True if it can decode it, false if it can't. -/// @warning This decoder looks like rubbish. Only keeping it for compatibility -/// with the Arduino IRremote library. Seriously, don't trust it. -/// If someone has a device that this is supposed to be for, please log an -/// Issue on github with a rawData dump please. We should probably remove it. -/// We think this is a Sanyo decoder - serial = SA 8650B -/// @see https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Sanyo.cpp -bool IRrecv::decodeSanyo(decode_results *results, uint16_t nbits, bool strict) { - if (results->rawlen < 2 * nbits + kHeader - 1) - return false; // Shorter than shortest possible. - if (strict && nbits != kSanyoSA8650BBits) - return false; // Doesn't match the spec. - - uint16_t offset = 0; - - // TODO(crankyoldgit): This repeat code looks like garbage, it should never - // match or if it does, it won't be reliable. We should probably just - // remove it. - if (results->rawbuf[offset++] < kSanyoSa8650bDoubleSpaceUsecs) { - results->bits = 0; - results->value = kRepeat; - results->decode_type = SANYO; - results->address = 0; - results->command = 0; - results->repeat = true; - return true; - } - - // Header - if (!matchMark(results->rawbuf[offset++], kSanyoSa8650bHdrMark)) - return false; - // NOTE: These next two lines look very wrong. Treat as suspect. - if (!matchMark(results->rawbuf[offset++], kSanyoSa8650bHdrMark)) - return false; - // Data - uint64_t data = 0; - while (offset + 1 < results->rawlen) { - if (!matchSpace(results->rawbuf[offset], kSanyoSa8650bHdrSpace)) - break; - offset++; - if (matchMark(results->rawbuf[offset], kSanyoSa8650bOneMark)) - data = (data << 1) | 1; // 1 - else if (matchMark(results->rawbuf[offset], kSanyoSa8650bZeroMark)) - data <<= 1; // 0 - else - return false; - offset++; - } - - if (strict && kSanyoSA8650BBits > (offset - 1U) / 2U) - return false; - - // Success - results->bits = (offset - 1) / 2; - results->decode_type = SANYO; - results->value = data; - results->address = 0; - results->command = 0; - return true; -} -*/ -#endif // DECODE_SANYO diff --git a/lib/IRremoteESP8266-2.7.8/src/ir_Toshiba.h b/lib/IRremoteESP8266-2.7.8/src/ir_Toshiba.h deleted file mode 100644 index 0e5022ae7..000000000 --- a/lib/IRremoteESP8266-2.7.8/src/ir_Toshiba.h +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2017 David Conran - -/// @file -/// @brief Support for Toshiba protocols. -/// @see https://github.com/r45635/HVAC-IR-Control -/// @see https://github.com/r45635/HVAC-IR-Control/blob/master/HVAC_ESP8266/HVAC_ESP8266T.ino#L77 - -// Supports: -// Brand: Toshiba, Model: RAS-B13N3KV2 -// Brand: Toshiba, Model: Akita EVO II -// Brand: Toshiba, Model: RAS-B13N3KVP-E -// Brand: Toshiba, Model: RAS 18SKP-ES -// Brand: Toshiba, Model: WH-TA04NE -// Brand: Toshiba, Model: WC-L03SE - -#ifndef IR_TOSHIBA_H_ -#define IR_TOSHIBA_H_ - -#define __STDC_LIMIT_MACROS -#include -#ifdef ARDUINO -#include -#endif -#include "IRremoteESP8266.h" -#include "IRsend.h" -#ifdef UNIT_TEST -#include "IRsend_test.h" -#endif - -// Constants -const uint8_t kToshibaAcModeOffset = 0; -const uint8_t kToshibaAcModeSize = 2; // Nr. of bits -const uint8_t kToshibaAcAuto = 0; -const uint8_t kToshibaAcCool = 1; -const uint8_t kToshibaAcDry = 2; -const uint8_t kToshibaAcHeat = 3; -const uint8_t kToshibaAcPowerOffset = 2; -const uint8_t kToshibaAcFanOffset = 5; -const uint8_t kToshibaAcFanSize = 3; // Nr. of bits -const uint8_t kToshibaAcFanAuto = 0b000; -const uint8_t kToshibaAcFanMin = 0b001; -const uint8_t kToshibaAcFanMed = 0b011; -const uint8_t kToshibaAcFanMax = 0b101; -const uint8_t kToshibaAcTempOffset = 4; -const uint8_t kToshibaAcTempSize = 4; // Nr. of bits -const uint8_t kToshibaAcMinTemp = 17; // 17C -const uint8_t kToshibaAcMaxTemp = 30; // 30C - -// Legacy defines. (Deperecated) -#define TOSHIBA_AC_AUTO kToshibaAcAuto -#define TOSHIBA_AC_COOL kToshibaAcCool -#define TOSHIBA_AC_DRY kToshibaAcDry -#define TOSHIBA_AC_HEAT kToshibaAcHeat -#define TOSHIBA_AC_POWER kToshibaAcPower -#define TOSHIBA_AC_FAN_AUTO kToshibaAcFanAuto -#define TOSHIBA_AC_FAN_MAX kToshibaAcFanMax -#define TOSHIBA_AC_MIN_TEMP kToshibaAcMinTemp -#define TOSHIBA_AC_MAX_TEMP kToshibaAcMaxTemp - -// Classes -/// Class for handling detailed Toshiba A/C messages. -class IRToshibaAC { - public: - explicit IRToshibaAC(const uint16_t pin, const bool inverted = false, - const bool use_modulation = true); - void stateReset(void); -#if SEND_TOSHIBA_AC - void send(const uint16_t repeat = kToshibaACMinRepeat); - /// Run the calibration to calculate uSec timing offsets for this platform. - /// @return The uSec timing offset needed per modulation of the IR Led. - /// @note This will produce a 65ms IR signal pulse at 38kHz. - /// Only ever needs to be run once per object instantiation, if at all. - int8_t calibrate(void) { return _irsend.calibrate(); } -#endif // SEND_TOSHIBA_AC - 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(const bool useRaw = false); - void setRaw(const uint8_t newState[]); - uint8_t* getRaw(void); - static bool validChecksum(const uint8_t state[], - const uint16_t length = kToshibaACStateLength); - uint8_t convertMode(const stdAc::opmode_t mode); - uint8_t convertFan(const stdAc::fanspeed_t speed); - static stdAc::opmode_t toCommonMode(const uint8_t mode); - static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); - stdAc::state_t toCommon(void); - String toString(void); -#ifndef UNIT_TEST - - private: - IRsend _irsend; ///< Instance of the IR send class -#else // UNIT_TEST - /// @cond IGNORE - IRsendTest _irsend; ///< Instance of the testing IR send class - /// @endcond -#endif // UNIT_TEST - uint8_t remote_state[kToshibaACStateLength]; ///< The state in IR code form. - void checksum(const uint16_t length = kToshibaACStateLength); - static uint8_t calcChecksum(const uint8_t state[], - const uint16_t length = kToshibaACStateLength); - uint8_t mode_state; -}; - -#endif // IR_TOSHIBA_H_ diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Pioneer_test.cpp b/lib/IRremoteESP8266-2.7.8/test/ir_Pioneer_test.cpp deleted file mode 100644 index 37cb56fa2..000000000 --- a/lib/IRremoteESP8266-2.7.8/test/ir_Pioneer_test.cpp +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2018 David Conran - -#include "IRsend.h" -#include "IRsend_test.h" -#include "IRutils.h" -#include "gtest/gtest.h" - -// Tests for sendPioneer(). - -// Test sending typical data only. -TEST(TestSendPioneer, SendDataOnly) { - IRsendTest irsend(0); - irsend.begin(); - irsend.sendPioneer(0); - EXPECT_EQ( - "f40000d33" - "m8544s4272" - "m534s534m534s534m534s534m534s534m534s534m534s534m534s534m534s534" - "m534s534m534s534m534s534m534s534m534s534m534s534m534s534m534s534" - "m534s534m534s534m534s534m534s534m534s534m534s534m534s534m534s534" - "m534s534m534s534m534s534m534s534m534s534m534s534m534s534m534s534" - "m534s37380" - "m8544s4272" - "m534s534m534s534m534s534m534s534m534s534m534s534m534s534m534s534" - "m534s534m534s534m534s534m534s534m534s534m534s534m534s534m534s534" - "m534s534m534s534m534s534m534s534m534s534m534s534m534s534m534s534" - "m534s534m534s534m534s534m534s534m534s534m534s534m534s534m534s534" - "m534s37380", - irsend.outputStr()); - irsend.sendPioneer(0x55FF00AAAA00FF55); - EXPECT_EQ( - "f40000d33" - "m8544s4272" - "m534s534m534s1602m534s534m534s1602m534s534m534s1602m534s534m534s1602" - "m534s1602m534s1602m534s1602m534s1602m534s1602m534s1602m534s1602m534s1602" - "m534s534m534s534m534s534m534s534m534s534m534s534m534s534m534s534" - "m534s1602m534s534m534s1602m534s534m534s1602m534s534m534s1602m534s534" - "m534s25098" - "m8544s4272" - "m534s1602m534s534m534s1602m534s534m534s1602m534s534m534s1602m534s534" - "m534s534m534s534m534s534m534s534m534s534m534s534m534s534m534s534" - "m534s1602m534s1602m534s1602m534s1602m534s1602m534s1602m534s1602m534s1602" - "m534s534m534s1602m534s534m534s1602m534s534m534s1602m534s534m534s1602" - "m534s25098", - irsend.outputStr()); -} - -// Tests for IRutils. - -TEST(TestIRUtils, TypeToString) { EXPECT_EQ("PIONEER", typeToString(PIONEER)); } - -// Tests for encodePioneer(). - -TEST(TestEncodePioneer, SimpleEncoding) { - IRsendTest irsend(0); - IRrecv irrecv(0); - - // Spotify button (A556+AF20) - // via - // https://www.pioneerelectronics.com/StaticFiles/PUSA/Files/Home%20Custom%20Install/2015%20Pioneer%20&%20Elite%20AVR%20IR%20with%20Hex_1.xls - EXPECT_EQ(0xA55A6A95F50A04FB, irsend.encodePioneer(0xA556, 0xAF20)); - - // "Source" from - // https://github.com/crankyoldgit/IRremoteESP8266/pull/547#issuecomment-429616582 - EXPECT_EQ(0x659A05FAF50AC53A, irsend.encodePioneer(0xA6A0, 0xAFA3)); -} - -// Tests for decodePioneer(). - -// Synthesised Normal Pioneer message. -TEST(TestDecodePioneer, SyntheticPioneerDecode) { - IRsendTest irsend(0); - IRrecv irrecv(0); - irsend.begin(); - - irsend.reset(); - irsend.sendPioneer(0x659A05FAF50AC53A); - irsend.makeDecodeResult(); - EXPECT_TRUE(irrecv.decode(&irsend.capture)); - EXPECT_EQ(PIONEER, irsend.capture.decode_type); - EXPECT_EQ(kPioneerBits, irsend.capture.bits); - EXPECT_EQ(0x659A05FAF50AC53A, irsend.capture.value); - EXPECT_EQ(0xA6A0, irsend.capture.address); - EXPECT_EQ(0xAFA3, irsend.capture.command); -} - -// Real long Pioneer message. -TEST(TestDecodePioneer, RealExampleLongDecodeSourceButton) { - IRsendTest irsend(0); - IRrecv irrecv(0); - irsend.begin(); - - irsend.reset(); - // "Source" button. - // https://github.com/crankyoldgit/IRremoteESP8266/pull/547#issuecomment-429616582 - uint16_t rawData[135] = { - 8552, 4184, 596, 472, 592, 1524, 594, 1524, 594, 472, 592, 472, - 598, 1520, 596, 472, 594, 1524, 592, 1524, 592, 472, 592, 472, - 596, 1520, 598, 1520, 596, 472, 592, 1524, 592, 472, 592, 476, - 592, 472, 592, 472, 592, 476, 592, 472, 592, 1524, 592, 472, - 598, 1518, 598, 1520, 596, 1520, 596, 1520, 596, 1520, 596, 1520, - 596, 472, 592, 1524, 592, 472, 598, 25282, 8552, 4182, 596, 1520, - 598, 1518, 598, 1520, 596, 1520, 596, 472, 592, 1524, 592, 472, - 598, 1520, 596, 472, 594, 472, 592, 472, 596, 472, 592, 1524, - 592, 472, 592, 1524, 596, 472, 594, 1520, 596, 1520, 598, 472, - 592, 472, 598, 472, 594, 1522, 594, 472, 592, 1524, 594, 472, - 596, 472, 594, 1524, 592, 1524, 592, 1524, 592, 472, 594, 1524, - 598, 472, 592}; - - irsend.sendRaw(rawData, 135, 38000); - irsend.makeDecodeResult(); - EXPECT_TRUE(irrecv.decode(&irsend.capture)); - EXPECT_EQ(PIONEER, irsend.capture.decode_type); - EXPECT_EQ(kPioneerBits, irsend.capture.bits); - EXPECT_EQ(0x659A05FAF50AC53A, irsend.capture.value); - EXPECT_EQ(0xA6A0, irsend.capture.address); - EXPECT_EQ(0xAFA3, irsend.capture.command); -} - -// Synthetic Pioneer message. -// For: -// https://github.com/crankyoldgit/IRremoteESP8266/pull/547#issuecomment-430800734 -TEST(TestDecodePioneer, SyntheticPioneerMessage) { - IRsendTest irsend(0); - IRrecv irrecv(0); - irsend.begin(); - - irsend.reset(); - irsend.sendPioneer(0x659A857AF50A3DC2, 64, 0); - irsend.makeDecodeResult(); - EXPECT_TRUE(irrecv.decode(&irsend.capture)); - EXPECT_EQ(PIONEER, irsend.capture.decode_type); - EXPECT_EQ(kPioneerBits, irsend.capture.bits); - EXPECT_EQ(0x659A857AF50A3DC2, irsend.capture.value); - EXPECT_EQ(0xA6A1, irsend.capture.address); - EXPECT_EQ(0xAFBC, irsend.capture.command); - - irsend.reset(); - irsend.sendPioneer(0x659A857AF50A3DC2, 64, 0); - EXPECT_EQ( - "f40000d33" - "m8544s4272" - "m534s534m534s1602m534s1602m534s534m534s534m534s1602m534s534m534s1602" - "m534s1602m534s534m534s534m534s1602m534s1602m534s534m534s1602m534s534" - "m534s1602m534s534m534s534m534s534m534s534m534s1602m534s534m534s1602" - "m534s534m534s1602m534s1602m534s1602m534s1602m534s534m534s1602m534s534" - "m534s25098" - "m8544s4272" - "m534s1602m534s1602m534s1602m534s1602m534s534m534s1602m534s534m534s1602" - "m534s534m534s534m534s534m534s534m534s1602m534s534m534s1602m534s534" - "m534s534m534s534m534s1602m534s1602m534s1602m534s1602m534s534m534s1602" - "m534s1602m534s1602m534s534m534s534m534s534m534s534m534s1602m534s534" - "m534s25098", - irsend.outputStr()); -} diff --git a/lib/IRremoteESP8266-2.7.8/test/ir_Toshiba_test.cpp b/lib/IRremoteESP8266-2.7.8/test/ir_Toshiba_test.cpp deleted file mode 100644 index e0ae82987..000000000 --- a/lib/IRremoteESP8266-2.7.8/test/ir_Toshiba_test.cpp +++ /dev/null @@ -1,706 +0,0 @@ -// Copyright 2017 David Conran -#include "ir_Toshiba.h" -#include "IRac.h" -#include "IRrecv.h" -#include "IRrecv_test.h" -#include "IRsend.h" -#include "IRsend_test.h" -#include "gtest/gtest.h" - -// Tests for Toshiba A/C methods. - -// Test sending typical data only. -TEST(TestSendToshibaAC, SendDataOnly) { - IRsendTest irsend(4); - irsend.begin(); - - uint8_t toshiba_code[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, - 0x00, 0x00, 0x00, 0x00}; - irsend.reset(); - irsend.sendToshibaAC(toshiba_code); - EXPECT_EQ( - "f38000d50" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s7048" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s7048", - irsend.outputStr()); -} - -// Test sending with repeats. -TEST(TestSendToshibaAC, SendWithRepeats) { - IRsendTest irsend(4); - irsend.begin(); - - irsend.reset(); - uint8_t toshiba_code[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, - 0x00, 0x00, 0x00, 0x00}; - - irsend.sendToshibaAC(toshiba_code, kToshibaACStateLength, 0); - EXPECT_EQ( - "f38000d50" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s7048", - irsend.outputStr()); - - irsend.reset(); - irsend.sendToshibaAC(toshiba_code, kToshibaACStateLength, 2); - EXPECT_EQ( - "f38000d50" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s7048" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s7048" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s7048", - irsend.outputStr()); -} - -// Test sending atypical sizes. -TEST(TestSendToshibaAC, SendUnexpectedSizes) { - IRsendTest irsend(4); - irsend.begin(); - - uint8_t toshiba_short_code[8] = {0x01, 0x02, 0x03, 0x04, - 0x05, 0x06, 0x07, 0x08}; - uint8_t toshiba_long_code[10] = {0x01, 0x02, 0x03, 0x04, 0x05, - 0x06, 0x07, 0x08, 0x09, 0x0A}; - irsend.reset(); - irsend.sendToshibaAC(toshiba_short_code, kToshibaACStateLength - 1); - ASSERT_EQ("", irsend.outputStr()); - - irsend.reset(); - irsend.sendToshibaAC(toshiba_long_code, kToshibaACStateLength + 1); - ASSERT_EQ( - "f38000d50" - "m4400s4300" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s1623" - "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623m543s472" - "m543s7048" - "m4400s4300" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s1623" - "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623m543s472" - "m543s7048", - irsend.outputStr()); -} - -// Tests for IRToshibaAC class. - -TEST(TestToshibaACClass, Power) { - IRToshibaAC toshiba(0); - toshiba.begin(); - - toshiba.on(); - EXPECT_TRUE(toshiba.getPower()); - - toshiba.off(); - EXPECT_FALSE(toshiba.getPower()); - - toshiba.setPower(true); - EXPECT_TRUE(toshiba.getPower()); - - toshiba.setPower(false); - EXPECT_FALSE(toshiba.getPower()); -} - -TEST(TestToshibaACClass, Temperature) { - IRToshibaAC toshiba(0); - toshiba.begin(); - - toshiba.setTemp(0); - EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp()); - - toshiba.setTemp(255); - EXPECT_EQ(kToshibaAcMaxTemp, toshiba.getTemp()); - - toshiba.setTemp(kToshibaAcMinTemp); - EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp()); - - toshiba.setTemp(kToshibaAcMaxTemp); - EXPECT_EQ(kToshibaAcMaxTemp, toshiba.getTemp()); - - toshiba.setTemp(kToshibaAcMinTemp - 1); - EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp()); - - toshiba.setTemp(kToshibaAcMaxTemp + 1); - EXPECT_EQ(kToshibaAcMaxTemp, toshiba.getTemp()); - - toshiba.setTemp(17); - EXPECT_EQ(17, toshiba.getTemp()); - - toshiba.setTemp(21); - EXPECT_EQ(21, toshiba.getTemp()); - - toshiba.setTemp(25); - EXPECT_EQ(25, toshiba.getTemp()); - - toshiba.setTemp(30); - EXPECT_EQ(30, toshiba.getTemp()); -} - -TEST(TestToshibaACClass, OperatingMode) { - IRToshibaAC toshiba(0); - toshiba.begin(); - - toshiba.setMode(kToshibaAcAuto); - EXPECT_EQ(kToshibaAcAuto, toshiba.getMode()); - - toshiba.setMode(kToshibaAcCool); - EXPECT_EQ(kToshibaAcCool, toshiba.getMode()); - - toshiba.setMode(kToshibaAcHeat); - EXPECT_EQ(kToshibaAcHeat, toshiba.getMode()); - - toshiba.setMode(kToshibaAcDry); - EXPECT_EQ(kToshibaAcDry, toshiba.getMode()); - - toshiba.setMode(kToshibaAcHeat + 1); - EXPECT_EQ(kToshibaAcAuto, toshiba.getMode()); - - toshiba.setMode(255); - EXPECT_EQ(kToshibaAcAuto, toshiba.getMode()); - - // Setting the power off changes the underlying mode in the state to heat. - toshiba.setPower(true); - toshiba.setMode(kToshibaAcCool); - EXPECT_EQ(kToshibaAcCool, toshiba.getMode()); - EXPECT_EQ(kToshibaAcCool, toshiba.getMode(true)); - toshiba.setPower(false); - EXPECT_EQ(kToshibaAcCool, toshiba.getMode()); - EXPECT_EQ(kToshibaAcHeat, toshiba.getMode(true)); -} - -TEST(TestToshibaACClass, FanSpeed) { - IRToshibaAC toshiba(0); - toshiba.begin(); - - toshiba.setFan(kToshibaAcFanAuto); - EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan()); - - toshiba.setFan(255); - EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan()); - - toshiba.setFan(kToshibaAcFanMax); - EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan()); - - toshiba.setFan(kToshibaAcFanMax - 1); - EXPECT_EQ(kToshibaAcFanMax - 1, toshiba.getFan()); - - toshiba.setFan(1); - EXPECT_EQ(1, toshiba.getFan()); - - toshiba.setFan(2); - EXPECT_EQ(2, toshiba.getFan()); - - toshiba.setFan(3); - EXPECT_EQ(3, toshiba.getFan()); - - toshiba.setFan(4); - EXPECT_EQ(4, toshiba.getFan()); - - toshiba.setFan(kToshibaAcFanMax + 1); - EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan()); -} - -TEST(TestToshibaACClass, RawState) { - IRToshibaAC toshiba(0); - toshiba.begin(); - - uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, - 0x00, 0x00, 0x00, 0x01}; - uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, - 0x00, 0xC1, 0x00, 0xC0}; - - // Verify the starting state. - EXPECT_STATE_EQ(initial_state, toshiba.getRaw(), kToshibaACBits); - EXPECT_TRUE(toshiba.getPower()); - EXPECT_EQ(kToshibaAcAuto, toshiba.getMode()); - EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan()); - - // Change some settings. - toshiba.setMode(kToshibaAcCool); - toshiba.setFan(kToshibaAcFanMax); - toshiba.setTemp(kToshibaAcMinTemp); - // Verify those were set. - EXPECT_EQ(kToshibaAcCool, toshiba.getMode()); - EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan()); - EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp()); - // Retrieve the modified state. - EXPECT_STATE_EQ(modified_state, toshiba.getRaw(), kToshibaACBits); - - // Set it back to the initial state. - toshiba.setRaw(initial_state); - - // Check the new state was set correctly. - EXPECT_TRUE(toshiba.getPower()); - EXPECT_EQ(kToshibaAcAuto, toshiba.getMode()); - EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan()); - EXPECT_STATE_EQ(initial_state, toshiba.getRaw(), kToshibaACBits); -} - -TEST(TestToshibaACClass, Checksums) { - IRToshibaAC toshiba(0); - toshiba.begin(); - - uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, - 0x00, 0x00, 0x00, 0x01}; - uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, - 0x00, 0xC1, 0x00, 0xC0}; - uint8_t invalid_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, - 0x00, 0x00, 0x00, 0x00}; - - EXPECT_EQ(0x01, toshiba.calcChecksum(initial_state)); - EXPECT_EQ(0xC0, toshiba.calcChecksum(modified_state)); - // Check we can call it without instantiating the object. - EXPECT_EQ(0x01, IRToshibaAC::calcChecksum(initial_state)); - // Use different lengths. - EXPECT_EQ(0x01, IRToshibaAC::calcChecksum(initial_state, - kToshibaACStateLength - 1)); - EXPECT_EQ(0xFF, IRToshibaAC::calcChecksum(initial_state, 3)); - // Minimum length that actually means anything. - EXPECT_EQ(0xF2, IRToshibaAC::calcChecksum(initial_state, 2)); - // Technically, there is no such thing as a checksum for a length of < 2 - // But test it anyway - EXPECT_EQ(0x00, IRToshibaAC::calcChecksum(initial_state, 1)); - EXPECT_EQ(0x00, IRToshibaAC::calcChecksum(initial_state, 0)); - - // Validity tests. - EXPECT_TRUE(IRToshibaAC::validChecksum(initial_state)); - EXPECT_TRUE(IRToshibaAC::validChecksum(modified_state)); - EXPECT_FALSE(IRToshibaAC::validChecksum(invalid_state)); - EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 0)); - EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 1)); - EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 2)); -} - -TEST(TestToshibaACClass, HumanReadableOutput) { - IRToshibaAC toshiba(0); - toshiba.begin(); - - uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, - 0x00, 0x00, 0x00, 0x01}; - uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, - 0x00, 0xC1, 0x00, 0xC0}; - - toshiba.setRaw(initial_state); - EXPECT_EQ("Power: On, Mode: 0 (Auto), Temp: 17C, Fan: 0 (Auto)", - toshiba.toString()); - toshiba.setRaw(modified_state); - EXPECT_EQ("Power: On, Mode: 1 (Cool), Temp: 17C, Fan: 5 (High)", - toshiba.toString()); - toshiba.off(); - toshiba.setTemp(25); - toshiba.setFan(3); - toshiba.setMode(kToshibaAcDry); - EXPECT_EQ("Power: Off, Mode: 2 (Dry), Temp: 25C, Fan: 3 (Medium)", - toshiba.toString()); -} - -TEST(TestToshibaACClass, MessageConstuction) { - IRToshibaAC toshiba(0); - IRsendTest irsend(4); - toshiba.begin(); - irsend.begin(); - - toshiba.setFan(1); - toshiba.setMode(kToshibaAcCool); - toshiba.setTemp(27); - toshiba.on(); - - // Check everything for kicks. - EXPECT_EQ(1, toshiba.getFan()); - EXPECT_EQ(kToshibaAcCool, toshiba.getMode()); - EXPECT_EQ(27, toshiba.getTemp()); - EXPECT_TRUE(toshiba.getPower()); - - irsend.reset(); - irsend.sendToshibaAC(toshiba.getRaw()); - EXPECT_EQ( - "f38000d50" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472" - "m543s7048" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472" - "m543s7048", - irsend.outputStr()); - - // Turn off the power and re-check. - toshiba.setPower(false); - // Check everything for kicks. - EXPECT_EQ(1, toshiba.getFan()); - EXPECT_EQ(kToshibaAcCool, toshiba.getMode()); - EXPECT_EQ(27, toshiba.getTemp()); - EXPECT_FALSE(toshiba.getPower()); - - irsend.reset(); - irsend.sendToshibaAC(toshiba.getRaw()); - EXPECT_EQ( - "f38000d50" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s1623m543s472m543s472m543s472m543s1623m543s1623m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s1623m543s472" - "m543s7048" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s1623m543s472m543s472m543s472m543s1623m543s1623m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s1623m543s472" - "m543s7048", - irsend.outputStr()); - - // Turn the power back on, and check nothing changed. - toshiba.on(); - - EXPECT_EQ(1, toshiba.getFan()); - EXPECT_EQ(kToshibaAcCool, toshiba.getMode()); - EXPECT_EQ(27, toshiba.getTemp()); - EXPECT_TRUE(toshiba.getPower()); - - irsend.reset(); - irsend.sendToshibaAC(toshiba.getRaw()); - EXPECT_EQ( - "f38000d50" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472" - "m543s7048" - "m4400s4300" - "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472" - "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623" - "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472" - "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623" - "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472" - "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472" - "m543s7048", - irsend.outputStr()); -} - -// Decoding a message we entirely constructed based solely on a given state. -TEST(TestDecodeToshibaAC, SyntheticExample) { - IRsendTest irsend(4); - IRrecv irrecv(4); - irsend.begin(); - - uint8_t expectedState[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, - 0x00, 0x00, 0x00, 0x01}; - - irsend.reset(); - irsend.sendToshibaAC(expectedState); - irsend.makeDecodeResult(); - EXPECT_TRUE(irrecv.decode(&irsend.capture)); - ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); - ASSERT_EQ(kToshibaACBits, irsend.capture.bits); - EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); - EXPECT_EQ( - "Power: On, Mode: 0 (Auto), Temp: 17C, Fan: 0 (Auto)", - IRAcUtils::resultAcToString(&irsend.capture)); - stdAc::state_t r, p; - ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); -} - -// Test decoding against captures from a real Toshiba A/C remote. -// Recorded by @mwildbolz -TEST(TestDecodeToshibaAC, RealExamples) { - IRToshibaAC toshiba(0); - IRsendTest irsend(4); - IRrecv irrecv(4); - irsend.begin(); - - uint16_t rawData1[295] = { - 4442, 4292, 612, 1544, 616, 1544, 616, 1544, 612, 1548, 610, 468, - 612, 468, 662, 1494, 640, 438, 616, 464, 614, 464, 616, 464, - 612, 468, 610, 1544, 616, 1544, 616, 468, 612, 1544, 616, 464, - 694, 386, 616, 464, 612, 468, 612, 468, 636, 444, 610, 1546, - 616, 1544, 612, 1546, 614, 1546, 616, 1546, 740, 1420, 612, 1544, - 616, 1546, 616, 464, 610, 468, 610, 470, 612, 468, 610, 468, - 610, 470, 636, 438, 616, 464, 616, 464, 616, 1546, 636, 442, - 612, 1546, 614, 1544, 616, 464, 614, 464, 610, 468, 612, 468, - 612, 468, 612, 468, 636, 440, 614, 464, 616, 464, 616, 464, - 612, 468, 636, 442, 638, 442, 662, 418, 610, 464, 616, 464, - 616, 464, 610, 468, 612, 468, 636, 444, 610, 468, 638, 438, - 614, 1546, 612, 1548, 612, 470, 610, 468, 636, 442, 612, 468, - 612, 1544, 612, 7396, 4442, 4292, 610, 1546, 616, 1544, 612, 1548, - 612, 1546, 616, 464, 616, 464, 616, 1544, 612, 468, 662, 418, - 610, 468, 638, 442, 638, 438, 616, 1546, 616, 1544, 612, 468, - 610, 1546, 616, 464, 616, 464, 642, 438, 616, 464, 612, 468, - 610, 470, 610, 1546, 616, 1544, 612, 1546, 616, 1546, 614, 1546, - 612, 1550, 610, 1544, 616, 1546, 614, 464, 642, 438, 610, 468, - 612, 468, 612, 468, 612, 468, 610, 468, 638, 438, 614, 464, - 616, 1544, 636, 444, 636, 1520, 616, 1544, 616, 464, 616, 464, - 612, 468, 612, 468, 612, 468, 612, 468, 612, 464, 612, 470, - 636, 442, 638, 442, 612, 470, 692, 384, 614, 464, 616, 464, - 612, 468, 610, 468, 612, 468, 610, 470, 610, 464, 616, 464, - 616, 464, 616, 464, 610, 1550, 610, 1546, 640, 444, 688, 386, - 616, 464, 612, 468, 612, 1544, 642}; - - irsend.reset(); - irsend.sendRaw(rawData1, 295, 38000); - irsend.makeDecodeResult(); - EXPECT_TRUE(irrecv.decode(&irsend.capture)); - ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); - ASSERT_EQ(kToshibaACBits, irsend.capture.bits); - toshiba.setRaw(irsend.capture.state); - EXPECT_TRUE(toshiba.getPower()); - EXPECT_EQ(23, toshiba.getTemp()); - EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan()); - EXPECT_EQ(kToshibaAcAuto, toshiba.getMode()); - - uint16_t rawData2[295] = { - 4500, 4236, 636, 1520, 642, 1520, 640, 1520, 664, 1492, 642, 440, - 668, 412, 642, 1518, 638, 438, 666, 414, 640, 438, 642, 438, - 638, 442, 642, 1516, 640, 1520, 642, 438, 642, 1520, 636, 438, - 668, 412, 640, 440, 666, 412, 642, 438, 668, 412, 640, 1516, - 668, 1492, 642, 1520, 666, 1494, 638, 1520, 642, 1520, 668, 1490, - 666, 1494, 642, 438, 638, 438, 668, 412, 668, 412, 642, 438, - 642, 438, 664, 412, 642, 438, 642, 438, 642, 1518, 642, 434, - 668, 412, 642, 438, 668, 412, 692, 388, 666, 412, 642, 434, - 642, 438, 642, 1518, 668, 412, 668, 412, 640, 438, 638, 438, - 642, 438, 640, 438, 668, 1492, 642, 440, 666, 412, 640, 438, - 642, 438, 642, 434, 668, 412, 668, 412, 666, 414, 666, 1494, - 640, 438, 642, 434, 668, 412, 642, 438, 642, 438, 668, 412, - 668, 414, 640, 7362, 4474, 4262, 642, 1518, 638, 1520, 640, 1520, - 668, 1494, 640, 434, 642, 438, 640, 1520, 642, 438, 642, 438, - 642, 438, 642, 438, 642, 434, 668, 1494, 642, 1518, 638, 442, - 638, 1520, 642, 438, 642, 438, 668, 414, 664, 408, 642, 438, - 668, 412, 642, 1520, 666, 1494, 642, 1514, 642, 1518, 642, 1520, - 636, 1520, 668, 1494, 666, 1494, 638, 438, 666, 414, 640, 440, - 666, 412, 668, 412, 668, 412, 642, 434, 668, 412, 668, 412, - 668, 1494, 642, 438, 642, 434, 642, 438, 642, 438, 642, 438, - 642, 438, 642, 434, 646, 434, 642, 1518, 668, 412, 642, 438, - 642, 434, 666, 414, 640, 438, 642, 438, 642, 1518, 642, 438, - 642, 434, 668, 412, 642, 438, 642, 438, 642, 438, 642, 438, - 642, 438, 640, 1520, 636, 438, 642, 438, 642, 438, 666, 414, - 668, 412, 642, 440, 640, 438, 640}; - - irsend.reset(); - irsend.sendRaw(rawData2, 295, 38000); - irsend.makeDecodeResult(); - EXPECT_TRUE(irrecv.decode(&irsend.capture)); - ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); - ASSERT_EQ(kToshibaACBits, irsend.capture.bits); - toshiba.setRaw(irsend.capture.state); - EXPECT_TRUE(toshiba.getPower()); - EXPECT_EQ(17, toshiba.getTemp()); - EXPECT_EQ(3, toshiba.getFan()); - EXPECT_EQ(kToshibaAcCool, toshiba.getMode()); - - uint16_t rawData3[295] = { - 4474, 4262, 642, 1514, 642, 1520, 642, 1520, 642, 1514, 642, 438, - 642, 438, 642, 1520, 636, 438, 642, 438, 642, 438, 642, 438, - 642, 438, 640, 1520, 638, 1520, 642, 438, 640, 1520, 642, 438, - 642, 434, 642, 438, 642, 438, 642, 438, 668, 414, 636, 1520, - 642, 1520, 642, 1514, 642, 1520, 642, 1520, 640, 1518, 638, 1520, - 666, 1494, 642, 438, 642, 434, 642, 438, 640, 438, 642, 438, - 642, 440, 640, 434, 642, 438, 642, 438, 642, 1520, 642, 438, - 642, 1514, 642, 1520, 640, 1520, 636, 438, 642, 438, 642, 438, - 666, 414, 642, 1520, 636, 1520, 642, 438, 642, 438, 640, 438, - 642, 434, 642, 1518, 642, 1520, 642, 438, 642, 434, 640, 438, - 642, 438, 642, 438, 642, 440, 642, 438, 668, 408, 642, 1520, - 642, 438, 642, 1520, 638, 1518, 642, 438, 642, 438, 640, 1520, - 640, 438, 642, 7362, 4474, 4262, 642, 1518, 638, 1520, 640, 1520, - 642, 1520, 638, 438, 642, 438, 642, 1518, 642, 438, 638, 438, - 642, 438, 642, 438, 642, 438, 642, 1514, 642, 1520, 642, 438, - 666, 1490, 642, 438, 642, 438, 642, 440, 640, 438, 642, 434, - 640, 438, 642, 1520, 642, 1520, 636, 1520, 642, 1520, 642, 1514, - 642, 1518, 642, 1518, 640, 1516, 642, 438, 642, 438, 642, 438, - 640, 438, 638, 442, 642, 434, 642, 440, 640, 438, 642, 438, - 642, 1518, 642, 438, 642, 1514, 642, 1520, 642, 1518, 642, 438, - 642, 432, 642, 438, 642, 438, 642, 1520, 642, 1514, 642, 438, - 642, 438, 642, 438, 642, 438, 642, 1514, 642, 1520, 642, 438, - 642, 438, 638, 438, 642, 438, 642, 438, 640, 440, 642, 438, - 640, 434, 642, 1520, 642, 438, 640, 1520, 668, 1490, 666, 414, - 640, 438, 642, 1520, 642, 438, 636}; - - irsend.reset(); - irsend.sendRaw(rawData3, 295, 38000); - irsend.makeDecodeResult(); - EXPECT_TRUE(irrecv.decode(&irsend.capture)); - ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); - ASSERT_EQ(kToshibaACBits, irsend.capture.bits); - toshiba.setRaw(irsend.capture.state); - EXPECT_TRUE(toshiba.getPower()); - EXPECT_EQ(24, toshiba.getTemp()); - EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan()); - EXPECT_EQ(kToshibaAcHeat, toshiba.getMode()); - - uint16_t rawData4[295] = { - 4474, 4262, 636, 1520, 640, 1520, 640, 1520, 638, 1518, 642, 438, - 642, 438, 642, 1520, 636, 438, 642, 438, 642, 438, 642, 438, - 636, 444, 636, 1520, 640, 1520, 642, 438, 638, 1524, 638, 438, - 640, 438, 642, 438, 640, 438, 642, 438, 638, 438, 642, 1518, - 642, 1520, 666, 1494, 636, 1520, 640, 1520, 640, 1520, 636, 1524, - 638, 1520, 640, 440, 640, 438, 642, 438, 636, 444, 636, 438, - 642, 438, 640, 440, 640, 438, 642, 438, 642, 1518, 638, 438, - 642, 1518, 642, 438, 640, 1520, 636, 444, 636, 438, 640, 438, - 642, 438, 668, 1494, 640, 438, 642, 1518, 636, 444, 636, 438, - 640, 1520, 642, 1518, 642, 1520, 636, 444, 636, 438, 642, 438, - 642, 438, 640, 440, 640, 438, 640, 440, 640, 438, 640, 1518, - 642, 1520, 636, 1524, 636, 1518, 642, 438, 642, 1518, 642, 1518, - 640, 438, 642, 7364, 4472, 4262, 642, 1518, 642, 1518, 638, 1518, - 642, 1520, 642, 438, 642, 438, 640, 1520, 636, 440, 640, 438, - 642, 438, 640, 438, 642, 438, 642, 1518, 636, 1524, 636, 438, - 640, 1520, 642, 438, 642, 438, 640, 438, 636, 444, 636, 438, - 668, 412, 642, 1518, 642, 1520, 642, 1520, 636, 1518, 642, 1518, - 642, 1520, 636, 1520, 668, 1494, 642, 438, 636, 444, 664, 412, - 642, 438, 668, 412, 642, 438, 636, 442, 638, 442, 638, 438, - 642, 1518, 642, 438, 642, 1518, 638, 438, 642, 1518, 642, 440, - 640, 438, 636, 444, 636, 444, 636, 1520, 642, 438, 642, 1520, - 636, 444, 636, 438, 642, 1520, 640, 1520, 636, 1520, 668, 412, - 642, 438, 642, 438, 642, 438, 638, 442, 636, 438, 642, 438, - 668, 412, 640, 1520, 638, 1524, 636, 1520, 642, 1520, 636, 444, - 638, 1522, 638, 1518, 640, 438, 642}; - - irsend.reset(); - irsend.sendRaw(rawData4, 295, 38000); - irsend.makeDecodeResult(); - EXPECT_TRUE(irrecv.decode(&irsend.capture)); - ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type); - ASSERT_EQ(kToshibaACBits, irsend.capture.bits); - toshiba.setRaw(irsend.capture.state); - EXPECT_FALSE(toshiba.getPower()); - EXPECT_EQ(22, toshiba.getTemp()); - EXPECT_EQ(4, toshiba.getFan()); - - // Confirming the quirky behaviour that the 'Power OFF' signal - // sets the mode to heat. - // The previous state the remote was in was 'AUTO' just prior to - // sending the power off message. - EXPECT_EQ(kToshibaAcHeat, toshiba.getMode()); -} - -TEST(TestToshibaACClass, toCommon) { - IRToshibaAC ac(0); - ac.setPower(true); - ac.setMode(kToshibaAcCool); - ac.setTemp(20); - ac.setFan(kToshibaAcFanMax); - // Now test it. - ASSERT_EQ(decode_type_t::TOSHIBA_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); - // 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().econo); - ASSERT_FALSE(ac.toCommon().light); - ASSERT_FALSE(ac.toCommon().filter); - ASSERT_FALSE(ac.toCommon().clean); - ASSERT_FALSE(ac.toCommon().beep); - ASSERT_FALSE(ac.toCommon().quiet); - ASSERT_EQ(-1, ac.toCommon().sleep); - ASSERT_EQ(-1, ac.toCommon().clock); -} diff --git a/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h b/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h index 90e2460b3..a301189a6 100644 --- a/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h +++ b/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h @@ -28,61 +28,73 @@ #include +/*********************************************************************************************\ + * ESP32 analogWrite emulation support +\*********************************************************************************************/ -// webcam uses channel 0, so we offset standard PWM -#define PWM_CHANNEL_OFFSET 2 -// Analog +#define PWM_SUPPORTED_CHANNELS 8 +#define PWM_CHANNEL_OFFSET 2 // Webcam uses channel 0, so we offset standard PWM -uint8_t pwm_channel[8]={99,99,99,99,99,99,99,99}; +uint8_t _pwm_channel[PWM_SUPPORTED_CHANNELS] = { 99, 99, 99, 99, 99, 99, 99, 99 }; +uint32_t _pwm_frequency = 977; // Default 977Hz +uint8_t _pwm_bit_num = 10; // Default 1023 -inline uint32_t pin2chan(uint32_t pin) { - for (uint32_t cnt=0;cnt<8;cnt++) { - if ((pwm_channel[cnt]<99) && (pwm_channel[cnt]==pin)) { - return cnt; +inline uint32_t _analog_pin2chan(uint32_t pin) { + for (uint32_t channel = 0; channel < PWM_SUPPORTED_CHANNELS; channel++) { + if ((_pwm_channel[channel] < 99) && (_pwm_channel[channel] == pin)) { + return channel; } } return 0; } -inline void analogWrite(uint8_t pin, int val) -{ - uint32_t channel=pin2chan(pin); - ledcWrite(channel+PWM_CHANNEL_OFFSET,val); - //Serial.printf("write %d - %d\n",channel,val); +inline void _analogWriteFreqRange(void) { + for (uint32_t channel = 0; channel < PWM_SUPPORTED_CHANNELS; channel++) { + if (_pwm_channel[channel] < 99) { +// uint32_t duty = ledcRead(channel + PWM_CHANNEL_OFFSET); + ledcSetup(channel + PWM_CHANNEL_OFFSET, _pwm_frequency, _pwm_bit_num); +// ledcWrite(channel + PWM_CHANNEL_OFFSET, duty); + } + } +// Serial.printf("freq - range %d - %d\n",freq,range); } -inline void analogWriteFreq(uint32_t freq) -{ +// input range is in full range, ledc needs bits +inline uint32_t _analogGetResolution(uint32_t x) { + uint32_t bits = 0; + while (x) { + bits++; + x >>= 1; + } + return bits; } -inline void analogWriteRange(uint32_t range) -{ + +inline void analogWriteRange(uint32_t range) { + _pwm_bit_num = _analogGetResolution(range); + _analogWriteFreqRange(); +} + +inline void analogWriteFreq(uint32_t freq) { + _pwm_frequency = freq; + _analogWriteFreqRange(); } inline void analogAttach(uint32_t pin, uint32_t channel) { - pwm_channel[channel&7]=pin; - ledcAttachPin(pin,channel+PWM_CHANNEL_OFFSET); - //Serial.printf("attach %d - %d\n",channel,pin); + _pwm_channel[channel &7] = pin; + ledcAttachPin(pin, channel + PWM_CHANNEL_OFFSET); + ledcSetup(channel + PWM_CHANNEL_OFFSET, _pwm_frequency, _pwm_bit_num); +// Serial.printf("attach %d - %d\n", channel, pin); } -inline uint32_t pow2(uint32_t x) { -uint32_t power = 1,bits=0; - while (power < x) { - power*=2; - bits++; - } - return bits-1; -} -// input range is in full range, ledc needs bits -inline void analogWriteFreqRange(uint32_t channel,uint32_t freq, uint32_t irange) { - uint32_t range=pow2(irange); - for (uint32_t cnt=0;cnt<8;cnt++) { - if (pwm_channel[cnt]<99) { - ledcSetup(cnt+PWM_CHANNEL_OFFSET,freq,range); - } - } - //Serial.printf("freq - range %d - %d\n",freq,range); +inline void analogWrite(uint8_t pin, int val) +{ + uint32_t channel = _analog_pin2chan(pin); + ledcWrite(channel + PWM_CHANNEL_OFFSET, val); +// Serial.printf("write %d - %d\n",channel,val); } +/*********************************************************************************************/ + #define INPUT_PULLDOWN_16 INPUT_PULLUP typedef double real64_t; diff --git a/platformio.ini b/platformio.ini index c68991444..4b7101d4d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -26,6 +26,7 @@ default_envs = ; tasmota-knx ; tasmota-sensors ; tasmota-display +; tasmota-zbbridge ; tasmota-ir ; tasmota-BG ; tasmota-BR @@ -82,7 +83,7 @@ extra_scripts = pio/strip-floats.py pio/override_copy.py [esp_defaults] -; *** Fix espressif8266@1.7.0 induced undesired all warnings +; *** remove undesired all warnings build_unflags = -Wall build_flags = -D_IR_ENABLE_DEFAULT_=false -DDECODE_HASH=true -DDECODE_NEC=true -DSEND_NEC=true @@ -106,11 +107,8 @@ build_flags = ${esp_defaults.build_flags} ; lwIP 2 - Higher Bandwidth no Features -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH ; VTABLES in Flash - -DVTABLES_IN_FLASH - ; No exception code in firmware - -fno-exceptions - -lstdc++ - ; the following removes the 4-bytes alignment for PSTR() + -DVTABLES_IN_FLASH + ; remove the 4-bytes alignment for PSTR() -DPSTR_ALIGN=1 ; restrict to minimal mime-types -DMIMETYPE_MINIMAL @@ -122,8 +120,8 @@ build_flags = -DUSE_IR_REMOTE_FULL [core] -; *** Esp8266 Tasmota modified Arduino core based on core 2.7.2 -platform = espressif8266@2.5.1 -platform_packages = framework-arduinoespressif8266 @ https://github.com/tasmota/Arduino/releases/download/2.7.2.1/esp8266-2.7.2.1.zip +; *** Esp8266 Tasmota modified Arduino core based on core 2.7.3 +platform = espressif8266@2.6.1 +platform_packages = framework-arduinoespressif8266 @ https://github.com/tasmota/Arduino/releases/download/2.7.3.2/esp8266-2.7.3.2.zip build_unflags = ${esp_defaults.build_unflags} build_flags = ${esp82xx_defaults.build_flags} diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index 57d7498cb..9e750911f 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -23,6 +23,7 @@ default_envs = ; tasmota-knx ; tasmota-sensors ; tasmota-display +; tasmota-zbbridge ; tasmota-ir ; tasmota32 ; tasmota32-webcam @@ -87,14 +88,10 @@ extra_scripts = ${scripts_defaults.extra_scripts} [tasmota_stage] ; *** Esp8266 core for Arduino version Tasmota stage -platform = espressif8266@2.5.1 -platform_packages = framework-arduinoespressif8266 @ https://github.com/Jason2866/Arduino/releases/download/2.7.3.1/esp8266-2.7.3.1.zip +platform = espressif8266@2.6.1 +platform_packages = framework-arduinoespressif8266 @ https://github.com/tasmota/Arduino/releases/download/2.7.4.1/esp8266-2.7.4.1.zip build_unflags = ${esp_defaults.build_unflags} - -std=c17 - -std=gnu++17 build_flags = ${esp82xx_defaults.build_flags} - -std=gnu99 - -std=c++11 ; *********** Alternative Options, enable only if you know exactly what you do ******** ; NONOSDK221 @@ -127,8 +124,10 @@ build_flags = ${esp82xx_defaults.build_flags} [core_stage] ; *** Esp8266 core version. Tasmota stage or Arduino stage version. Built with GCC 10.1 toolchain -platform = https://github.com/Jason2866/platform-espressif8266/releases/download/2.9.0/platform-espressif8266-2.9.0.tar.gz -platform_packages = ;framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git +platform = espressif8266@2.6.1 +platform_packages = framework-arduinoespressif8266 @ https://github.com/Jason2866/platform-espressif8266/releases/download/2.9.0/framework-arduinoespressif8266-3.20900.0.tar.gz + ;framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git + toolchain-xtensa @ ~2.100100.0 build_unflags = ${esp_defaults.build_unflags} -Wswitch-unreachable build_flags = ${esp82xx_defaults.build_flags} @@ -208,4 +207,3 @@ lib_extra_dirs = lib_ignore = cc1101 - diff --git a/platformio_tasmota_env.ini b/platformio_tasmota_env.ini index 4a447da82..d0e28b990 100644 --- a/platformio_tasmota_env.ini +++ b/platformio_tasmota_env.ini @@ -38,6 +38,9 @@ build_flags = ${common.build_flags} ${irremoteesp_full.build_flags} -DFIRMWARE_I [env:tasmota-ircustom] build_flags = ${common.build_flags} ${irremoteesp_full.build_flags} -DFIRMWARE_IR_CUSTOM +[env:tasmota-zbbridge] +build_flags = ${common.build_flags} -DFIRMWARE_ZBBRIDGE + [env:tasmota-BG] build_flags = ${common.build_flags} -DMY_LANGUAGE=bg_BG diff --git a/tasmota/CHANGELOG.md b/tasmota/CHANGELOG.md index 7dbad0a37..f850de769 100644 --- a/tasmota/CHANGELOG.md +++ b/tasmota/CHANGELOG.md @@ -1,10 +1,28 @@ ## Unreleased (development) +### 8.4.0.1 20200730 + +- Fix ESP32 PWM range +- Add Zigbee better support for IKEA Motion Sensor +- Add ESP32 Analog input support for GPIO32 to GPIO39 + +### 8.4.0 20200730 + +- Release George + ### 8.3.1.7 20200716 - Remove Arduino ESP8266 Core support for versions before 2.7.1 - Change to limited support of Arduino IDE as an increasing amount of features cannot be compiled with Arduino IDE -- Add command ``SetOption100 0/1`` to remove ``ZbReceived`` value from ``{"ZbReceived":{xxx:yyy}}`` JSON message +- Change all timer references from ``Arm`` to ``Enable`` in GUI, ``Timer`` command and JSON message +- Change Domoticz commands prefix from ``Domoticz`` to ``Dz`` +- Change ``Ping`` now reports the hostname instead of IP address (#8948) +- Change Zigbee randomizing of parameters at first run or after Reset +- Add command ``DzSend ,`` to send values or state to Domoticz +- Add command ``SetOption100 0/1`` to remove Zigbee ``ZbReceived`` value from ``{"ZbReceived":{xxx:yyy}}`` JSON message +- Add command ``SetOption101 0/1`` to add the Zigbee source endpoint as suffix to attributes, ex `Power3` instead of `Power` if sent from endpoint 3 +- Add command (``S``)``SerialSend6`` \ (#8937) +- Add support for Sonoff Zigbee Bridge as module 75 (#8583) ### 8.3.1.6 20200617 @@ -70,8 +88,6 @@ - Add support for VEML6075 UVA/UVB/UVINDEX Sensor by device111 (#8432) - Add support for VEML7700 Ambient light intensity Sensor by device111 (#8432) -## Released - ### 8.3.1 20200518 - Release Fred @@ -88,8 +104,6 @@ - Change Quick Power Cycle detection from 4 to 7 power interrupts (#4066) - Fix default state of ``SetOption73 0`` for button decoupling and send multi-press and hold MQTT messages -## Released - ### 8.3.0 20200514 - Release Fred @@ -174,8 +188,6 @@ - Add support for unreachable (unplugged) Zigbee devices in Philips Hue emulation and Alexa - Add support for 64x48 SSD1306 OLED (#6740) -## Released - ### 8.2.0 20200321 - Release Elliot diff --git a/tasmota/core_esp8266_wiring_pwm.cpp b/tasmota/core_esp8266_wiring_pwm.cpp index d81928a5d..d879a0001 100644 --- a/tasmota/core_esp8266_wiring_pwm.cpp +++ b/tasmota/core_esp8266_wiring_pwm.cpp @@ -29,15 +29,21 @@ extern "C" { static uint32_t analogMap = 0; -static int32_t analogScale = PWMRANGE; +static int32_t analogScale = 255; // Match upstream default, breaking change from 2.x.x static uint16_t analogFreq = 1000; extern void __analogWriteRange(uint32_t range) { - if (range > 0) { + if ((range >= 15) && (range <= 65535)) { analogScale = range; } } +extern void __analogWriteResolution(int res) { + if ((res >= 4) && (res <= 16)) { + analogScale = (1 << res) - 1; + } +} + extern void __analogWriteFreq(uint32_t freq) { if (freq < 40) { analogFreq = 40; @@ -61,6 +67,10 @@ extern void __analogWrite(uint8_t pin, int val) { val = analogScale; } + // Per the Arduino docs at https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/ + // val: the duty cycle: between 0 (always off) and 255 (always on). + // So if val = 0 we have digitalWrite(LOW), if we have val==range we have digitalWrite(HIGH) + if (analogMap & 1UL << pin) { analogMap &= ~(1 << pin); } @@ -79,6 +89,7 @@ extern void __analogWrite(uint8_t pin, int val) { extern void analogWrite(uint8_t pin, int val) __attribute__((weak, alias("__analogWrite"))); extern void analogWriteFreq(uint32_t freq) __attribute__((weak, alias("__analogWriteFreq"))); extern void analogWriteRange(uint32_t range) __attribute__((weak, alias("__analogWriteRange"))); +extern void analogWriteResolution(int res) __attribute__((weak, alias("__analogWriteResolution"))); }; diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 70ca42a7e..6b97badd5 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -481,7 +481,7 @@ // Commands xdrv_09_timers.ino #define D_CMND_TIMER "Timer" - #define D_JSON_TIMER_ARM "Arm" + #define D_JSON_TIMER_ARM "Enable" #define D_JSON_TIMER_MODE "Mode" #define D_JSON_TIMER_TIME "Time" #define D_JSON_TIMER_WINDOW "Window" @@ -514,6 +514,7 @@ #define D_CMND_ZIGBEE_EZSP_SEND "EZSPSend" #define D_CMND_ZIGBEE_EZSP_SEND_RAW "EZSPSendRaw" #define D_JSON_ZIGBEE_STATE "ZbState" + #define D_JSON_ZIGBEE_ROUTE_ERROR "ZbRouteError" #define D_JSON_ZIGBEEZNPRECEIVED "ZbZNPReceived" #define D_JSON_ZIGBEE_EZSP_RECEIVED "ZbEZSPReceived" #define D_JSON_ZIGBEEZNPSENT "ZbZNPSent" @@ -549,6 +550,7 @@ #define D_JSON_ZIGBEE_UNBIND "ZbUnbind" #define D_CMND_ZIGBEE_BIND_STATE "BindState" #define D_JSON_ZIGBEE_BIND_STATE "ZbBindState" +#define D_JSON_ZIGBEE_PARENT "ZbParent" #define D_CMND_ZIGBEE_PING "Ping" #define D_JSON_ZIGBEE_PING "ZbPing" #define D_JSON_ZIGBEE_IEEE "IEEEAddr" @@ -576,11 +578,13 @@ #define D_CMND_SHUTTER_OPEN "Open" #define D_CMND_SHUTTER_CLOSE "Close" #define D_CMND_SHUTTER_TOGGLE "Toggle" +#define D_CMND_SHUTTER_TOGGLEDIR "ToggleDir" #define D_CMND_SHUTTER_UP "Up" #define D_CMND_SHUTTER_DOWN "Down" #define D_CMND_SHUTTER_STOPOPEN "StopOpen" #define D_CMND_SHUTTER_STOPCLOSE "StopClose" #define D_CMND_SHUTTER_STOPTOGGLE "StopToggle" +#define D_CMND_SHUTTER_STOPTOGGLEDIR "StopToggleDir" #define D_CMND_SHUTTER_STOPPOSITION "StopPosition" #define D_CMND_SHUTTER_STOP "Stop" #define D_CMND_SHUTTER_POSITION "Position" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index ca4afb0bc..4439692f0 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "Нулиране OLED" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index b07d032e7..3bc5f33d4 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 3517251be..f4e624ed4 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 8eaff86f0..f557444de 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 98badad64..6fe834fc2 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -419,7 +419,7 @@ #define D_CONFIGURE_TIMER "Configure Timer" #define D_TIMER_PARAMETERS "Timer parameters" #define D_TIMER_ENABLE "Enable Timers" -#define D_TIMER_ARM "Arm" +#define D_TIMER_ARM "Enable" #define D_TIMER_TIME "Time" #define D_TIMER_DAYS "Days" #define D_TIMER_REPEAT "Repeat" @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 04116ea2a..8fd50b7a2 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 8aea1b4cc..7d0868aa8 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee TX" #define D_SENSOR_ZIGBEE_RXD "Zigbee RX" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 TX" #define D_SENSOR_SOLAXX1_RX "SolaxX1 RX" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index f7a721739..a34c84329 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index f521c06fd..41a6b472e 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 3d26d9f09..f03d8c06f 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) 2020 Gennaro Tortone - some mods by Antonio Fragola + Copyright (C) 2020 Gennaro Tortone - some mods by Antonio Fragola - rev. 24.07.2020 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 @@ -403,23 +403,23 @@ #define D_DOMOTICZ_KEY_IDX "Idx - chiave" #define D_DOMOTICZ_SWITCH_IDX "Idx - switch" #define D_DOMOTICZ_SENSOR_IDX "Idx - sensore" - #define D_DOMOTICZ_TEMP "Temp" - #define D_DOMOTICZ_TEMP_HUM "Temp,Umd" - #define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Umd,Baro" - #define D_DOMOTICZ_POWER_ENERGY "Alim,Energia" - #define D_DOMOTICZ_ILLUMINANCE "Illuminazione" - #define D_DOMOTICZ_COUNT "Cont/PM1" - #define D_DOMOTICZ_VOLTAGE "Tensione/PM2.5" - #define D_DOMOTICZ_CURRENT "Corrente/PM10" - #define D_DOMOTICZ_AIRQUALITY "Qualità aria" - #define D_DOMOTICZ_P1_SMART_METER "P1SmartMeter" +#define D_DOMOTICZ_TEMP "Temp" +#define D_DOMOTICZ_TEMP_HUM "Temp,Umd" +#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Umd,Baro" +#define D_DOMOTICZ_POWER_ENERGY "Alim,Energia" +#define D_DOMOTICZ_ILLUMINANCE "Illuminazione" +#define D_DOMOTICZ_COUNT "Cont/PM1" +#define D_DOMOTICZ_VOLTAGE "Tensione/PM2.5" +#define D_DOMOTICZ_CURRENT "Corrente/PM10" +#define D_DOMOTICZ_AIRQUALITY "Qualità aria" +#define D_DOMOTICZ_P1_SMART_METER "P1SmartMeter" #define D_DOMOTICZ_UPDATE_TIMER "Intervallo aggiornamento" // xdrv_09_timers.ino #define D_CONFIGURE_TIMER "Timer" #define D_TIMER_PARAMETERS "Parametri timer" #define D_TIMER_ENABLE "Abilita timer" -#define D_TIMER_ARM "Attiva" +#define D_TIMER_ARM "Abilita" #define D_TIMER_TIME "Ora" #define D_TIMER_DAYS "Giorni" #define D_TIMER_REPEAT "Ripeti" @@ -625,7 +625,7 @@ #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_MCP39F5_RST "MCP39F5 - Reset" #define D_SENSOR_CSE7766_TX "CSE7766 - TX" #define D_SENSOR_CSE7766_RX "CSE7766 - RX" #define D_SENSOR_PN532_TX "PN532 - TX" @@ -644,9 +644,10 @@ #define D_SENSOR_HRE_DATA "HRE - Dati" #define D_SENSOR_ADE7953_IRQ "ADE7953 - IRQ" #define D_SENSOR_BUZZER "Cicalino" -#define D_SENSOR_OLED_RESET "Ripristino OLED" +#define D_SENSOR_OLED_RESET "OLED - Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee - TX" #define D_SENSOR_ZIGBEE_RXD "Zigbee - RX" +#define D_SENSOR_ZIGBEE_RST "Zigbee - Reset" #define D_SENSOR_SOLAXX1_TX "SolaxX1 - TX" #define D_SENSOR_SOLAXX1_RX "SolaxX1- RX" #define D_SENSOR_IBEACON_TX "iBeacon - TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" @@ -800,7 +808,7 @@ #define D_AS3935_DISTANCE "distanza:" #define D_AS3935_DISTURBER "disturbatore:" #define D_AS3935_VRMS "µVrms:" -#define D_AS3935_APRX "apross.:" +#define D_AS3935_APRX "appross.:" #define D_AS3935_AWAY "lontano" #define D_AS3935_LIGHT "illuminazione" #define D_AS3935_OUT "illuminazione fuori intervallo" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index d635d1d65..84bd1b003 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index b024dc538..0a96682d3 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 0ecea1a77..5582fd7ea 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index be5d98464..872459542 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index c489327a7..b68d06861 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 23f160f19..5ff7697df 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index b033ebcd1..35d838d45 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 9e5cc35e0..812ea402a 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index ac416e9b5..7102eaa20 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index f402cf803..f729ff276 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 97cd77f91..df346b31a 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 10f609c64..375f25188 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 4c52eef18..f8e3f94d3 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -647,6 +647,7 @@ #define D_SENSOR_OLED_RESET "OLED Reset" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_IBEACON_TX "iBeacon TX" @@ -686,6 +687,13 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index d7dd6b2cc..b967db5b0 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -681,17 +681,11 @@ // -- Zigbee interface ---------------------------- //#define USE_ZIGBEE // Enable serial communication with Zigbee CC2530 flashed with ZNP (+49k code, +3k mem) - #define USE_ZIGBEE_ZNP // Enable ZNP protocol, needed for CC2530 based devices - // #define USE_ZIGBEE_EZSP // [EXPERIMENTAL - DO NOT USE] Enable EZSP protocol, needed for EFR32 EmberZNet based devices, like Sonoff Zigbee bridge - // Note: USE_ZIGBEE_ZNP and USE_ZIGBEE_EZSP are mutually incompatible, you must select exactly one - #define USE_ZIGBEE_PANID 0x1A63 // arbitrary PAN ID for Zigbee network, must be unique in the home - // if PANID == 0xFFFF, then the device will act as a Zigbee router, the parameters below are ignored - // if PANID == 0xFFFE, then the device will act as a Zigbee end-device (non-router), the parameters below are ignored - #define USE_ZIGBEE_EXTPANID 0xCCCCCCCCCCCCCCCCL // arbitrary extended PAN ID - #define USE_ZIGBEE_CHANNEL 11 // Zigbee Channel (11-26) - #define USE_ZIGBEE_TXRADIO_DBM 20 // Tx Radio power in dBm (only for EZSP, EFR32 can go up to 20 dBm) - #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_ZNP // Enable ZNP protocol, needed for CC2530 based devices +// #define USE_ZIGBEE_EZSP // Enable EZSP protocol, needed for EFR32 EmberZNet based devices, like Sonoff Zigbee bridge + // Note: USE_ZIGBEE_ZNP and USE_ZIGBEE_EZSP are mutually incompatible, you must select exactly one + #define USE_ZIGBEE_CHANNEL 11 // Zigbee Channel (11-26) + #define USE_ZIGBEE_TXRADIO_DBM 20 // Tx Radio power in dBm (only for EZSP, EFR32 can go up to 20 dBm) #define USE_ZIGBEE_COALESCE_ATTR_TIMER 350 // timer to coalesce attribute values (in ms) #define USE_ZIGBEE_MODELID "Tasmota Z2T" // reported "ModelId" (cluster 0000 / attribute 0005) @@ -774,6 +768,8 @@ // #define ETH_ADDR 0 // [EthAddress] 0 = PHY0 .. 31 = PHY31 // #define ETH_CLKMODE 0 // [EthClockMode] 0 = ETH_CLOCK_GPIO0_IN, 1 = ETH_CLOCK_GPIO0_OUT, 2 = ETH_CLOCK_GPIO16_OUT, 3 = ETH_CLOCK_GPIO17_OUT +#define USE_ADC // Add support for ADC on GPIO32 to GPIO39 + //#define USE_SPI // Add support for hardware SPI //#define USE_MI_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) //#define USE_WEBCAM // Add support for webcam diff --git a/tasmota/settings.h b/tasmota/settings.h index 9d4466028..880e8af80 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -120,7 +120,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t rotary_uses_rules : 1; // bit 16 (v8.3.1.6) - SetOption98 - Use rules instead of light control uint32_t zerocross_dimmer : 1; // bit 17 (v8.3.1.4) - SetOption99 - Enable zerocross dimmer on PWM DIMMER uint32_t remove_zbreceived : 1; // bit 18 (v8.3.1.7) - SetOption100 - Remove ZbReceived form JSON message - uint32_t spare19 : 1; + uint32_t zb_index_ep : 1; // bit 19 (v8.3.1.7) - SetOption101 - Add the source endpoint as suffix to attributes, ex `Power3` instead of `Power` if sent from endpoint 3 uint32_t spare20 : 1; uint32_t spare21 : 1; uint32_t spare22 : 1; @@ -422,7 +422,7 @@ struct { uint8_t light_correction; // 49D uint8_t light_dimmer; // 49E uint8_t rule_enabled; // 49F - uint8_t rule_once; // 4A0 + uint8_t rule_once; // 4A0 bit 6+7 used by xdrv_10_scripter uint8_t light_fade; // 4A1 uint8_t light_speed; // 4A2 uint8_t light_scheme; // 4A3 @@ -691,8 +691,10 @@ typedef union { } StateBitfield; // See issue https://github.com/esp8266/Arduino/issues/2913 +#ifdef ESP8266 #ifdef USE_ADC_VCC ADC_MODE(ADC_VCC); // Set ADC input for Power Supply Voltage usage #endif +#endif #endif // _SETTINGS_H_ diff --git a/tasmota/support.ino b/tasmota/support.ino index 50cc4f920..5e5a11f35 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -127,6 +127,18 @@ size_t strchrspn(const char *str1, int character) return ret; } +uint32_t ChrCount(const char *str, const char *delim) { + uint32_t count = 0; + char* read = (char*)str; + char ch = '.'; + + while (ch != '\0') { + ch = *read++; + if (ch == *delim) { count++; } + } + return count; +} + // Function to return a substring defined by a delimiter at an index char* subStr(char* dest, char* str, const char *delim, int index) { @@ -152,6 +164,8 @@ float CharToFloat(const char *str) strlcpy(strbuf, str, sizeof(strbuf)); char *pt = strbuf; + if (*pt == '\0') { return 0.0; } + while ((*pt != '\0') && isblank(*pt)) { pt++; } // Trim leading spaces signed char sign = 1; @@ -394,11 +408,13 @@ char* UpperCase_P(char* dest, const char* source) char* Trim(char* p) { - while ((*p != '\0') && isblank(*p)) { p++; } // Trim leading spaces - char* q = p + strlen(p) -1; - while ((q >= p) && isblank(*q)) { q--; } // Trim trailing spaces - q++; - *q = '\0'; + if (*p != '\0') { + while ((*p != '\0') && isblank(*p)) { p++; } // Trim leading spaces + char* q = p + strlen(p) -1; + while ((q >= p) && isblank(*q)) { q--; } // Trim trailing spaces + q++; + *q = '\0'; + } return p; } @@ -906,6 +922,17 @@ void SerialSendRaw(char *codes) } } +// values is a comma-delimited string: e.g. "72,101,108,108,111,32,87,111,114,108,100,33,10" +void SerialSendDecimal(char *values) +{ + char *p; + uint8_t code; + for (char* str = strtok_r(values, ",", &p); str; str = strtok_r(nullptr, ",", &p)) { + code = (uint8_t)atoi(str); + Serial.write(code); + } +} + uint32_t GetHash(const char *buffer, size_t size) { uint32_t hash = 0; @@ -1774,14 +1801,16 @@ void Syslog(void) void AddLog(uint32_t loglevel) { char mxtime[10]; // "13:45:21 " - snprintf_P(mxtime, sizeof(mxtime), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d "), RtcTime.hour, RtcTime.minute, RtcTime.second); - if (loglevel <= seriallog_level) { + if ((loglevel <= seriallog_level) && + (masterlog_level <= seriallog_level)) { Serial.printf("%s%s\r\n", mxtime, log_data); } #ifdef USE_WEBSERVER - if (Settings.webserver && (loglevel <= Settings.weblog_level)) { + if (Settings.webserver && + (loglevel <= Settings.weblog_level) && + (masterlog_level <= Settings.weblog_level)) { // Delimited, zero-terminated buffer of log lines. // Each entry has this format: [index][log data]['\1'] web_log_index &= 0xFF; @@ -1802,10 +1831,12 @@ void AddLog(uint32_t loglevel) #endif // USE_WEBSERVER if (Settings.flag.mqtt_enabled && // SetOption3 - Enable MQTT !global_state.mqtt_down && - (loglevel <= Settings.mqttlog_level)) { MqttPublishLogging(mxtime); } + (loglevel <= Settings.mqttlog_level) && + (masterlog_level <= Settings.mqttlog_level)) { MqttPublishLogging(mxtime); } if (!global_state.network_down && - (loglevel <= syslog_level)) { Syslog(); } + (loglevel <= syslog_level) && + (masterlog_level <= syslog_level)) { Syslog(); } prepped_loglevel = 0; } diff --git a/tasmota/support_button.ino b/tasmota/support_button.ino index e6e6e27ea..be8a4dabb 100644 --- a/tasmota/support_button.ino +++ b/tasmota/support_button.ino @@ -90,12 +90,14 @@ void ButtonInit(void) Button.present++; pinMode(Pin(GPIO_KEY1, i), bitRead(Button.no_pullup_mask, i) ? INPUT : ((16 == Pin(GPIO_KEY1, i)) ? INPUT_PULLDOWN_16 : INPUT_PULLUP)); } +#ifdef ESP8266 #ifndef USE_ADC_VCC else if ((99 == Button.adc) && ((ADC0_BUTTON == my_adc0) || (ADC0_BUTTON_INV == my_adc0))) { Button.present++; Button.adc = i; } #endif // USE_ADC_VCC +#endif // ESP8266 } } @@ -162,7 +164,18 @@ void ButtonHandler(void) button = (digitalRead(Pin(GPIO_KEY1, button_index)) != bitRead(Button.inverted_mask, button_index)); } } -#else +#ifndef USE_ADC_VCC + if (Button.adc == button_index) { + button_present = 1; + if (ADC0_BUTTON_INV == my_adc0) { + button = (AdcRead(1) < 128); + } + else if (ADC0_BUTTON == my_adc0) { + button = (AdcRead(1) > 128); + } + } +#endif // USE_ADC_VCC +#else // ESP32 if (PinUsed(GPIO_KEY1, button_index)) { button_present = 1; if (bitRead(Button.touch_mask, button_index)) { // Touch @@ -188,18 +201,7 @@ void ButtonHandler(void) button = (digitalRead(Pin(GPIO_KEY1, button_index)) != bitRead(Button.inverted_mask, button_index)); } } -#endif // ESP8266 -#ifndef USE_ADC_VCC - if (Button.adc == button_index) { - button_present = 1; - if (ADC0_BUTTON_INV == my_adc0) { - button = (AdcRead(1) < 128); - } - else if (ADC0_BUTTON == my_adc0) { - button = (AdcRead(1) > 128); - } - } -#endif // USE_ADC_VCC +#endif // ESP8266 or ESP32 if (button_present) { XdrvMailbox.index = button_index; XdrvMailbox.payload = button; @@ -333,7 +335,7 @@ void ButtonHandler(void) } } else { // 6 press start wificonfig 2 - if (!Settings.flag.button_restrict) { + if (!Settings.flag.button_restrict) { // SetOption1 - Control button multipress snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_WIFICONFIG " 2")); ExecuteCommand(scmnd, SRC_BUTTON); } diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index abd75960e..49f554b18 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -288,8 +288,7 @@ void CommandHandler(char* topicBuf, char* dataBuf, uint32_t data_len) } if (mqtt_data[0] != '\0') { - MqttPublishPrefixTopic_P(RESULT_OR_STAT, type); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, type); } fallback_topic_flag = false; } @@ -1237,29 +1236,31 @@ void CmndPwmfrequency(void) { if ((1 == XdrvMailbox.payload) || ((XdrvMailbox.payload >= PWM_MIN) && (XdrvMailbox.payload <= PWM_MAX))) { Settings.pwm_frequency = (1 == XdrvMailbox.payload) ? PWM_FREQ : XdrvMailbox.payload; -#ifdef ESP8266 analogWriteFreq(Settings.pwm_frequency); // Default is 1000 (core_esp8266_wiring_pwm.c) -#else - analogWriteFreqRange(0,Settings.pwm_frequency,Settings.pwm_range); -#endif } ResponseCmndNumber(Settings.pwm_frequency); } -void CmndPwmrange(void) -{ +void CmndPwmrange(void) { + // Support only 8 (=255), 9 (=511) and 10 (=1023) bits resolution if ((1 == XdrvMailbox.payload) || ((XdrvMailbox.payload > 254) && (XdrvMailbox.payload < 1024))) { - Settings.pwm_range = (1 == XdrvMailbox.payload) ? PWM_RANGE : XdrvMailbox.payload; + uint32_t pwm_range = XdrvMailbox.payload; + uint32_t pwm_resolution = 0; + while (pwm_range) { + pwm_resolution++; + pwm_range >>= 1; + } + pwm_range = (1 << pwm_resolution) - 1; + uint32_t old_pwm_range = Settings.pwm_range; + Settings.pwm_range = (1 == XdrvMailbox.payload) ? PWM_RANGE : pwm_range; for (uint32_t i = 0; i < MAX_PWMS; i++) { if (Settings.pwm_value[i] > Settings.pwm_range) { Settings.pwm_value[i] = Settings.pwm_range; } } -#ifdef ESP8266 - analogWriteRange(Settings.pwm_range); // Default is 1023 (Arduino.h) -#else - analogWriteFreqRange(0,Settings.pwm_frequency,Settings.pwm_range); -#endif + if (Settings.pwm_range != old_pwm_range) { // On ESP32 this prevents loss of duty state + analogWriteRange(Settings.pwm_range); // Default is 1023 (Arduino.h) + } } ResponseCmndNumber(Settings.pwm_range); } @@ -1334,7 +1335,7 @@ void CmndSerialConfig(void) void CmndSerialSend(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) { + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 6)) { SetSeriallog(LOG_LEVEL_NONE); Settings.flag.mqtt_serial = 1; // CMND_SERIALSEND and CMND_SERIALLOG Settings.flag.mqtt_serial_raw = (XdrvMailbox.index > 3) ? 1 : 0; // CMND_SERIALSEND3 @@ -1354,6 +1355,9 @@ void CmndSerialSend(void) else if (5 == XdrvMailbox.index) { SerialSendRaw(RemoveSpace(XdrvMailbox.data)); // "AA004566" as hex values } + else if (6 == XdrvMailbox.index) { + SerialSendDecimal(XdrvMailbox.data); + } ResponseCmndDone(); } } diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index 0561eac6b..8b1bb3d96 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -230,7 +230,7 @@ void GetFeatures(void) #ifdef USE_COUNTER feature_sns1 |= 0x00000001; // xsns_01_counter.ino #endif -#ifdef USE_ADC_VCC +#if defined(USE_ADC_VCC) || defined(USE_ADC) feature_sns1 |= 0x00000002; // xsns_02_analog.ino #endif #ifdef USE_ENERGY_SENSOR diff --git a/tasmota/support_jpeg.ino b/tasmota/support_jpeg.ino index 7e811cd76..e9d0b2813 100644 --- a/tasmota/support_jpeg.ino +++ b/tasmota/support_jpeg.ino @@ -153,5 +153,48 @@ char get_jpeg_size(unsigned char* data, unsigned int data_size, unsigned short * }else{ return false; } //Not a valid SOI header } + #endif // JPEG_PICTS #endif //ESP32 + +#ifdef USE_DISPLAY_DUMP +#define bytesPerPixel 3 +#define fileHeaderSize 14 +#define infoHeaderSize 40 + +void createBitmapFileHeader(uint32_t height, uint32_t width, uint8_t *fileHeader) { + int paddingSize = (4 - (width*bytesPerPixel) % 4) % 4; + + int fileSize = fileHeaderSize + infoHeaderSize + (bytesPerPixel*width+paddingSize) * height; + memset(fileHeader,0,fileHeaderSize); + fileHeader[ 0] = (unsigned char)('B'); + fileHeader[ 1] = (unsigned char)('M'); + fileHeader[ 2] = (unsigned char)(fileSize ); + fileHeader[ 3] = (unsigned char)(fileSize>> 8); + fileHeader[ 4] = (unsigned char)(fileSize>>16); + fileHeader[ 5] = (unsigned char)(fileSize>>24); + fileHeader[10] = (unsigned char)(fileHeaderSize + infoHeaderSize); + +} + +void createBitmapInfoHeader(uint32_t height, uint32_t width, uint8_t *infoHeader ) { + memset(infoHeader,0,infoHeaderSize); + + infoHeader[ 0] = (unsigned char)(infoHeaderSize); + infoHeader[ 4] = (unsigned char)(width ); + infoHeader[ 5] = (unsigned char)(width>> 8); + infoHeader[ 6] = (unsigned char)(width>>16); + infoHeader[ 7] = (unsigned char)(width>>24); + infoHeader[ 8] = (unsigned char)(height ); + infoHeader[ 9] = (unsigned char)(height>> 8); + infoHeader[10] = (unsigned char)(height>>16); + infoHeader[11] = (unsigned char)(height>>24); + infoHeader[12] = (unsigned char)(1); + infoHeader[14] = (unsigned char)(bytesPerPixel*8); + infoHeader[24] = (unsigned char)0x13; // 72 dpi + infoHeader[25] = (unsigned char)0x0b; + infoHeader[28] = (unsigned char)0x13; + infoHeader[29] = (unsigned char)0x0b; + +} +#endif // USE_DISPLAY_DUMP diff --git a/tasmota/support_rotary.ino b/tasmota/support_rotary.ino index 4fc776511..76c748203 100644 --- a/tasmota/support_rotary.ino +++ b/tasmota/support_rotary.ino @@ -136,8 +136,7 @@ void RotaryHandler(void) { #ifdef USE_LIGHT if (!Settings.flag4.rotary_uses_rules) { // SetOption98 - Use rules instead of light control ResponseLightState(0); - MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_CMND_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_CMND_STATE)); } #endif // USE_LIGHT Encoder[index].direction = 0; diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 0fbcbb615..11b544738 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -207,6 +207,7 @@ void SetDevicePower(power_t rpower, uint32_t source) XdrvMailbox.index = rpower; XdrvCall(FUNC_SET_POWER); // Signal power state + XsnsCall(FUNC_SET_POWER); // Signal power state XdrvMailbox.index = rpower; XdrvMailbox.payload = source; @@ -651,10 +652,12 @@ void MqttShowState(void) ResponseAppendTime(); ResponseAppend_P(PSTR(",\"" D_JSON_UPTIME "\":\"%s\",\"UptimeSec\":%u"), GetUptime().c_str(), UpTime()); +#ifdef ESP8266 #ifdef USE_ADC_VCC dtostrfd((double)ESP.getVcc()/1000, 3, stemp1); ResponseAppend_P(PSTR(",\"" D_JSON_VCC "\":%s"), stemp1); -#endif +#endif // USE_ADC_VCC +#endif // ESP8266 ResponseAppend_P(PSTR(",\"" D_JSON_HEAPSIZE "\":%d,\"SleepMode\":\"%s\",\"Sleep\":%u,\"LoadAvg\":%u,\"MqttCount\":%u"), ESP_getFreeHeap()/1024, GetTextIndexed(stemp1, sizeof(stemp1), Settings.flag3.sleep_normal, kSleepMode), // SetOption60 - Enable normal sleep instead of dynamic sleep @@ -969,6 +972,9 @@ void Every250mSeconds(void) SettingsSave(1); // Free flash for OTA update } if (ota_state_flag <= 0) { +#ifdef USE_COUNTER + CounterInterruptDisable(true); // Prevent OTA failures on 100Hz counter interrupts +#endif // USE_COUNTER #ifdef USE_WEBSERVER if (Settings.webserver) StopWebserver(); #endif // USE_WEBSERVER @@ -1000,15 +1006,6 @@ void Every250mSeconds(void) 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 @@ -1055,6 +1052,9 @@ void Every250mSeconds(void) ResponseAppend_P(PSTR("\"}")); // restart_flag = 2; // Restart anyway to keep memory clean webserver MqttPublishPrefixTopic_P(STAT, PSTR(D_CMND_UPGRADE)); +#ifdef USE_COUNTER + CounterInterruptDisable(false); +#endif // USE_COUNTER } } break; @@ -1432,8 +1432,7 @@ void SerialInput(void) } ResponseJsonEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SERIALRECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_SERIALRECEIVED)); serial_in_byte_counter = 0; } } @@ -1568,12 +1567,12 @@ void GpioInit(void) // AddLogBufferSize(LOG_LEVEL_DEBUG, (uint8_t*)gpio_pin, ARRAY_SIZE(gpio_pin), sizeof(gpio_pin[0])); -#ifdef ESP8266 - if ((2 == Pin(GPIO_TXD)) || (H801 == my_module_type)) { Serial.set_tx(2); } - analogWriteRange(Settings.pwm_range); // Default is 1023 (Arduino.h) analogWriteFreq(Settings.pwm_frequency); // Default is 1000 (core_esp8266_wiring_pwm.c) +#ifdef ESP8266 + if ((2 == Pin(GPIO_TXD)) || (H801 == my_module_type)) { Serial.set_tx(2); } + #ifdef USE_SPI spi_flg = (((PinUsed(GPIO_SPI_CS) && (Pin(GPIO_SPI_CS) > 14)) || (Pin(GPIO_SPI_CS) < 12)) || ((PinUsed(GPIO_SPI_DC) && (Pin(GPIO_SPI_DC) > 14)) || (Pin(GPIO_SPI_DC) < 12))); if (spi_flg) { @@ -1588,8 +1587,6 @@ void GpioInit(void) soft_spi_flg = (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_SSPI_SCLK) && (PinUsed(GPIO_SSPI_MOSI) || PinUsed(GPIO_SSPI_MISO))); #endif // USE_SPI #else // ESP32 - analogWriteFreqRange(0, Settings.pwm_frequency, Settings.pwm_range); - #ifdef USE_SPI if (PinUsed(GPIO_SPI_CS) || PinUsed(GPIO_SPI_DC)) { if ((15 == Pin(GPIO_SPI_CS)) && (!GetPin(12) && !GetPin(13) && !GetPin(14))) { // HSPI @@ -1690,12 +1687,11 @@ void GpioInit(void) for (uint32_t i = 0; i < MAX_PWMS; i++) { // Basic PWM control only if (PinUsed(GPIO_PWM1, i)) { +#ifdef ESP8266 pinMode(Pin(GPIO_PWM1, i), OUTPUT); -#ifdef ESP32 - analogAttach(Pin(GPIO_PWM1, i),i); - analogWriteFreqRange(i,Settings.pwm_frequency,Settings.pwm_range); +#else // ESP32 + analogAttach(Pin(GPIO_PWM1, i), i); #endif - 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); @@ -1753,4 +1749,5 @@ void GpioInit(void) SetLedLink(Settings.ledstate &8); XdrvCall(FUNC_PRE_INIT); + XsnsCall(FUNC_PRE_INIT); } diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index d215b96f2..5cc304943 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -85,6 +85,7 @@ const uint8_t MAX_DEV_GROUP_NAMES = 4; // Max number of Device Group names const uint8_t MAX_HUE_DEVICES = 15; // Max number of Philips Hue device per emulation const uint8_t MAX_ROTARIES = 2; // Max number of Rotary Encoders +const uint8_t MAX_ADCS = 8; // Max number of ESP32 ADC pins (ADC2 pins are unusable with Wifi enabled) const char MQTT_TOKEN_PREFIX[] PROGMEM = "%prefix%"; // To be substituted by mqtt_prefix[x] const char MQTT_TOKEN_TOPIC[] PROGMEM = "%topic%"; // To be substituted by mqtt_topic, mqtt_grptopic, mqtt_buttontopic, mqtt_switchtopic @@ -296,6 +297,9 @@ enum SettingsTextIndex { SET_OTAURL, SET_DEV_GROUP_NAME1, SET_DEV_GROUP_NAME2, SET_DEV_GROUP_NAME3, SET_DEV_GROUP_NAME4, SET_DEVICENAME, SET_TELEGRAM_TOKEN, SET_TELEGRAM_CHATID, +#ifdef ESP32 + SET_ADC_PARAM1, SET_ADC_PARAM2, SET_ADC_PARAM3, SET_ADC_PARAM4, SET_ADC_PARAM5, SET_ADC_PARAM6, SET_ADC_PARAM7, SET_ADC_PARAM8, // Relates to MAX_ADCS +#endif SET_MAX }; enum DevGroupMessageType { DGR_MSGTYP_FULL_STATUS, DGR_MSGTYP_PARTIAL_UPDATE, DGR_MSGTYP_UPDATE, DGR_MSGTYP_UPDATE_MORE_TO_COME, DGR_MSGTYP_UPDATE_DIRECT, DGR_MSGTYPE_UPDATE_COMMAND }; diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 43e019e33..0fca0cddc 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -144,6 +144,7 @@ uint8_t light_type = 0; // Light types uint8_t serial_in_byte; // Received byte uint8_t ota_retry_counter = OTA_ATTEMPTS; // OTA retry counter uint8_t devices_present = 0; // Max number of devices supported +uint8_t masterlog_level = 0; // Master log level used to override set log level uint8_t seriallog_level; // Current copy of Settings.seriallog_level uint8_t syslog_level; // Current copy of Settings.syslog_level uint8_t my_module_type; // Current copy of Settings.module or user template type diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 61baee7aa..2ee368d84 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -406,6 +406,145 @@ #undef USE_DEBUG_DRIVER // Disable debug code #endif // FIRMWARE_IR + +/*********************************************************************************************\ + * [tasmota-zbbridge.bin] + * Provide an image for the Sonoff Zigbee Bridge +\*********************************************************************************************/ + +#ifdef FIRMWARE_ZBBRIDGE // ******************************************************************* + +#undef CODE_IMAGE_STR +#define CODE_IMAGE_STR "zbbridge" + +#undef MODULE +#define MODULE SONOFF_ZB_BRIDGE // [Module] Select default module from tasmota_template.h +#undef FALLBACK_MODULE +#define FALLBACK_MODULE SONOFF_ZB_BRIDGE // [Module2] Select default module on fast reboot where USER_MODULE is user template + +#undef SERIAL_LOG_LEVEL +#define SERIAL_LOG_LEVEL LOG_LEVEL_NONE // [SerialLog] (LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE) + +#undef USE_ARDUINO_OTA // Disable support for Arduino OTA +#define 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_KNX // Disable KNX IP Protocol Support +//#undef USE_WEBSERVER // Disable Webserver +//#undef USE_WEBSEND_RESPONSE // Disable command WebSend response message (+1k code) +#define USE_EMULATION // Disable Wemo or Hue emulation +#define 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_CUSTOM // Disable Custom features +#undef USE_DISCOVERY // Disable Discovery services for both MQTT and web server +//#undef USE_TIMERS // Disable support for up to 16 timers +//#undef USE_TIMERS_WEB // Disable support for timer webpage +//#undef USE_SUNRISE // Disable support for Sunrise and sunset tools +//#undef USE_RULES // Disable support for rules +#undef USE_SCRIPT // Add support for script (+17k code) + +// -- Optional modules ------------------------- +#undef ROTARY_V1 // Disable support for MI Desk Lamp +#undef USE_SONOFF_RF // Disable support for Sonoff Rf Bridge (+3k2 code) + #undef USE_RF_FLASH // Disable support for flashing the EFM8BB1 chip on the Sonoff RF Bridge. C2CK must be connected to GPIO4, C2D to GPIO5 on the PCB +#undef USE_SONOFF_SC // Disable support for Sonoff Sc (+1k1 code) +#undef USE_TUYA_MCU // Disable support for Tuya Serial MCU +#undef USE_ARMTRONIX_DIMMERS // Disable support for Armtronix Dimmers (+1k4 code) +#undef USE_PS_16_DZ // Disable support for PS-16-DZ Dimmer and Sonoff L1 (+2k code) +#undef USE_SONOFF_IFAN // Disable support for Sonoff iFan02 and iFan03 (+2k code) +#undef USE_BUZZER // Disable support for a buzzer (+0k6 code) +#undef USE_ARILUX_RF // Disable support for Arilux RF remote controller +#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 // Enable Dimmer/Light support +#undef USE_WS2812 // Disable WS2812 Led string using library NeoPixelBus (+5k code, +1k mem, 232 iram) - Disable by // +#undef USE_MY92X1 // Disable support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas +#undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) +#undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) +#undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control +#undef USE_ELECTRIQ_MOODL // Disable support for ElectriQ iQ-wifiMOODL RGBW LED controller +#undef USE_LIGHT_PALETTE // Disable support for color palette (+0k9 code) + +#undef USE_COUNTER // Disable counters +#define USE_ADC_VCC // Display Vcc in Power status. Disable for use as Analog input on selected devices +#undef USE_DS18x20 // Disable DS18x20 sensor +//#undef USE_I2C // Enable I2C, zbbridge uses i2c EEprom +#undef USE_SPI // Disable all SPI devices +#undef USE_DISPLAY // Disable Display support +#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 +#undef USE_NOVA_SDS // Disable support for SDS011 and SDS021 particle concentration sensor +#undef USE_HPMA // Disable support for Honeywell HPMA115S0 particle concentration sensor +#undef USE_SERIAL_BRIDGE // Disable support for software Serial Bridge +#undef USE_MP3_PLAYER // Disable DFPlayer Mini MP3 Player RB-DFR-562 commands: play, volume and stop +#undef USE_AZ7798 // Disable support for AZ-Instrument 7798 CO2 datalogger +#undef USE_PN532_HSU // Disable support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem) +#undef USE_ZIGBEE // Disable serial communication with Zigbee CC2530 flashed with ZNP +#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 // (ESP8266 only) Disable support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code) +#undef USE_MI_ESP32 // (ESP32 only) Disable support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) +#undef USE_HRXL // Disable support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7) +#undef USE_TASMOTA_CLIENT // Disable support for Arduino Uno/Pro Mini via serial interface including flashing (+2k3 code, 44 mem) +#undef USE_OPENTHERM // Disable support for OpenTherm (+15k code) + +#undef USE_ENERGY_SENSOR // Disable energy sensors +#undef USE_ADE7953 // Disable ADE7953 Energy monitor as used on Shelly 2.5 (I2C address 0x38) (+1k5) +#undef USE_PZEM004T // Disable PZEM004T energy sensor +#undef USE_PZEM_AC // Disable PZEM014,016 Energy monitor +#undef USE_PZEM_DC // Disable PZEM003,017 Energy monitor +#undef USE_MCP39F501 // Disable MCP39F501 Energy monitor as used in Shelly 2 +#undef USE_SDM120 // Disable support for Eastron SDM120-Modbus energy meter +#undef USE_SDM630 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code) +#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_TELEINFO // Disable support for French Energy Provider metering telemetry + + +#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 +#undef USE_MAX31865 // Disable support for MAX31865 RTD sensors using softSPI +#undef USE_IR_REMOTE // Disable IR driver + +#undef USE_SR04 // Disable support for for HC-SR04 ultrasonic devices +#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_WINDMETER // Disable support for analog anemometer (+2k2 code) +#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) +#undef USE_A4988_STEPPER // Disable support for A4988_Stepper +#undef USE_THERMOSTAT // Disable support for Thermostat +#undef DEBUG_THEO // Disable debug code +#undef USE_DEBUG_DRIVER // Disable debug code + +#define USE_ZIGBEE +#undef USE_ZIGBEE_ZNP +#define USE_ZIGBEE_EZSP +#define USE_TCP_BRIDGE + #define USE_ZIGBEE_CHANNEL 11 // Zigbee Channel (11-26) + #define USE_ZIGBEE_COALESCE_ATTR_TIMER 350 // timer to coalesce attribute values (in ms) + + +#endif // SONOFF_ZIGBEEBRIDGE ****************************************************************** + + + /*********************************************************************************************\ * [tasmota-lite.bin] * Provide an image without sensors diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 25adf6b62..1c38f0420 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -241,6 +241,7 @@ enum UserSelectablePins { GPIO_LMT01, // LMT01 input counting pin GPIO_IEM3000_TX, // IEM3000 Serial interface GPIO_IEM3000_RX, // IEM3000 Serial interface + GPIO_ZIGBEE_RST, // Zigbee reset GPIO_SENSOR_END }; // Programmer selectable GPIO functionality @@ -335,7 +336,8 @@ const char kSensorNames[] PROGMEM = D_SENSOR_TCP_TXD "|" D_SENSOR_TCP_RXD "|" D_SENSOR_TELEINFO_RX "|" D_SENSOR_TELEINFO_ENABLE "|" D_SENSOR_LMT01_PULSE "|" - D_SENSOR_IEM3000_TX "|" D_SENSOR_IEM3000_RX + D_SENSOR_IEM3000_TX "|" D_SENSOR_IEM3000_RX "|" + D_SENSOR_ZIGBEE_RST ; const char kSensorNamesFixed[] PROGMEM = @@ -605,6 +607,7 @@ const uint8_t kGpioNiceList[] PROGMEM = { #ifdef USE_ZIGBEE GPIO_ZIGBEE_TX, // Zigbee Serial interface GPIO_ZIGBEE_RX, // Zigbee Serial interface + GPIO_ZIGBEE_RST, // Zigbee reset #endif #ifdef USE_MHZ19 GPIO_MHZ_TXD, // MH-Z19 Serial interface @@ -796,7 +799,7 @@ enum SupportedModules { SONOFF_S31, ZENGGE_ZF_WF017, SONOFF_POW_R2, SONOFF_IFAN02, BLITZWOLF_BWSHP, SHELLY1, SHELLY2, PHILIPS, NEO_COOLCAM, ESP_SWITCH, OBI, TECKIN, APLIC_WDP303075, TUYA_DIMMER, GOSUND, ARMTRONIX_DIMMERS, SK03_TUYA, PS_16_DZ, TECKIN_US, MANZOKU_EU_4, OBI2, YTF_IR_BRIDGE, DIGOO, KA10, ZX2820, MI_DESK_LAMP, SP10, WAGA, SYF05, SONOFF_L1, - SONOFF_IFAN03, EXS_DIMMER, PWM_DIMMER, SONOFF_D1, + SONOFF_IFAN03, EXS_DIMMER, PWM_DIMMER, SONOFF_D1, SONOFF_ZB_BRIDGE, MAXMODULE}; #define USER_MODULE 255 @@ -809,7 +812,7 @@ const char kModuleNames[] PROGMEM = "Sonoff S31|Zengge WF017|Sonoff Pow R2|Sonoff iFan02|BlitzWolf SHP|Shelly 1|Shelly 2|Xiaomi Philips|Neo Coolcam|ESP Switch|" "OBI Socket|Teckin|AplicWDP303075|Tuya MCU|Gosund SP1 v23|ARMTR Dimmer|SK03 Outdoor|PS-16-DZ|Teckin US|Manzoku strip|" "OBI Socket 2|YTF IR Bridge|Digoo DG-SP202|KA10|Luminea ZX2820|Mi Desk Lamp|SP10|WAGA CHCZ02MB|SYF05|Sonoff L1|" - "Sonoff iFan03|EXS Dimmer|PWM Dimmer|Sonoff D1" + "Sonoff iFan03|EXS Dimmer|PWM Dimmer|Sonoff D1|Sonoff ZbBridge" ; const uint8_t kModuleNiceList[] PROGMEM = { @@ -847,6 +850,9 @@ const uint8_t kModuleNiceList[] PROGMEM = { #endif #ifdef USE_SONOFF_RF SONOFF_BRIDGE, // Sonoff Bridge +#endif +#ifdef USE_ZIGBEE_EZSP + SONOFF_ZB_BRIDGE, #endif SONOFF_SV, // Sonoff Development Devices SONOFF_DEV, @@ -2275,6 +2281,26 @@ const mytmplt kModules[MAXMODULE] PROGMEM = { 0, // GPIO12 GPIO_LED1_INV, // GPIO13 WiFi Blue Led - Link and Power status 0, 0, 0, 0 + }, + { // SONOFF_ZB_BRIDGE - Sonoff Zigbee Bridge (ESP8266) + GPIO_LED1_INV, // GPIO00 Green Led (0 = On, 1 = Off) - Traffic between ESP and EFR + GPIO_ZIGBEE_TX, // GPIO01 Zigbee Serial control + 0, // GPIO02 + GPIO_ZIGBEE_RX, // GPIO03 Zigbee Serial control + GPIO_ZIGBEE_RST, // GPIO04 Zigbee Reset + 0, // GPIO05 EFR32 Bootloader mode (drive Low for Gecko Bootloader, inactive or high for Zigbee EmberZNet) + // GPIO06 (SD_CLK Flash) + // GPIO07 (SD_DATA0 Flash QIO/DIO/DOUT) + // GPIO08 (SD_DATA1 Flash QIO/DIO/DOUT) + 0, // GPIO09 (SD_DATA2 Flash QIO) + 0, // GPIO10 (SD_DATA3 Flash QIO) + // GPIO11 (SD_CMD Flash) + GPIO_I2C_SDA, // GPIO12 I2C SDA - connected to 512KB EEPROM + GPIO_LEDLNK_INV, // GPIO13 Blue Led (0 = On, 1 = Off) - Link status + GPIO_I2C_SCL, // GPIO14 I2C SCL - connected to 512KB EEPROM + 0, // GPIO15 connected to IO15 pad, also used for logging + GPIO_KEY1, // GPIO16 Button + 0 } }; diff --git a/tasmota/tasmota_template_ESP32.h b/tasmota/tasmota_template_ESP32.h index bb1574a77..ac422cfc6 100644 --- a/tasmota/tasmota_template_ESP32.h +++ b/tasmota/tasmota_template_ESP32.h @@ -36,7 +36,6 @@ // Not ported (yet) #undef USE_DISCOVERY -#undef USE_ADC_VCC // Needs to be ported #undef USE_DEEPSLEEP #undef USE_MY92X1 #undef USE_TUYA_MCU @@ -89,8 +88,9 @@ enum UserSelectablePins { GPIO_ARIRFRCV, GPIO_ARIRFSEL, // Arilux RF Receive input GPIO_TXD, GPIO_RXD, // Serial interface GPIO_ROT1A, GPIO_ROT1B, // Rotary switch + GPIO_ADC_JOY, // Analog joystick - GPIO_SPARE1, GPIO_SPARE2, // Spare GPIOs + GPIO_SPARE1, // Spare GPIOs GPIO_HRE_CLOCK, GPIO_HRE_DATA, // HR-E Water Meter GPIO_ADE7953_IRQ, // ADE7953 IRQ @@ -115,12 +115,12 @@ enum UserSelectablePins { GPIO_HRXL_RX, // Data from MaxBotix HRXL sonar range sensor GPIO_ELECTRIQ_MOODL_TX, // ElectriQ iQ-wifiMOODL Serial TX GPIO_AS3935, - ADC0_INPUT, // Analog input - ADC0_TEMP, // Analog Thermistor - ADC0_LIGHT, // Analog Light sensor - ADC0_BUTTON, ADC0_BUTTON_INV, // Analog Button - ADC0_RANGE, // Analog Range - ADC0_CT_POWER, // ANalog Current + GPIO_ADC_INPUT, // Analog input + GPIO_ADC_TEMP, // Analog Thermistor + GPIO_ADC_LIGHT, // Analog Light sensor + GPIO_ADC_BUTTON, GPIO_ADC_BUTTON_INV, // Analog Button + GPIO_ADC_RANGE, // Analog Range + GPIO_ADC_CT_POWER, // ANalog Current GPIO_WEBCAM_PWDN, GPIO_WEBCAM_RESET, GPIO_WEBCAM_XCLK, // Webcam GPIO_WEBCAM_SIOD, GPIO_WEBCAM_SIOC, // Webcam I2C GPIO_WEBCAM_DATA, @@ -138,6 +138,7 @@ enum UserSelectablePins { GPIO_TELEINFO_ENABLE, // Teleinfo Enable Receive Pin GPIO_LMT01, // LMT01 input counting pin GPIO_IEM3000_TX, GPIO_IEM3000_RX, // IEM3000 Serial interface + GPIO_ZIGBEE_RST, // Zigbee reset GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -193,8 +194,9 @@ const char kSensorNames[] PROGMEM = D_SENSOR_ARIRFRCV "|" D_SENSOR_ARIRFSEL "|" D_SENSOR_TXD "|" D_SENSOR_RXD "|" D_SENSOR_ROTARY "_a|" D_SENSOR_ROTARY "_b|" + D_SENSOR_ADC_JOYSTICK "|" - "Spare1|Spare2|" + "Spare1|" D_SENSOR_HRE_CLOCK "|" D_SENSOR_HRE_DATA "|" D_SENSOR_ADE7953_IRQ "|" @@ -216,11 +218,12 @@ const char kSensorNames[] PROGMEM = D_SENSOR_HRXL_RX "|" D_SENSOR_ELECTRIQ_MOODL "|" D_SENSOR_AS3935 "|" - D_ANALOG_INPUT "|" - D_TEMPERATURE "|" D_LIGHT "|" - D_SENSOR_BUTTON "|" D_SENSOR_BUTTON "_i|" - D_RANGE "|" - D_CT_POWER "|" + D_SENSOR_ADC_INPUT "|" + D_SENSOR_ADC_TEMP "|" + D_SENSOR_ADC_LIGHT "|" + D_SENSOR_ADC_BUTTON "|" D_SENSOR_ADC_BUTTON "_i|" + D_SENSOR_ADC_RANGE "|" + D_SENSOR_ADC_CT_POWER "|" D_GPIO_WEBCAM_PWDN "|" D_GPIO_WEBCAM_RESET "|" D_GPIO_WEBCAM_XCLK "|" D_GPIO_WEBCAM_SIOD "|" D_GPIO_WEBCAM_SIOC "|" D_GPIO_WEBCAM_DATA "|" @@ -235,7 +238,8 @@ const char kSensorNames[] PROGMEM = D_SENSOR_ETH_PHY_POWER "|" D_SENSOR_ETH_PHY_MDC "|" D_SENSOR_ETH_PHY_MDIO "|" D_SENSOR_TELEINFO_RX "|" D_SENSOR_TELEINFO_ENABLE "|" D_SENSOR_LMT01_PULSE "|" - D_SENSOR_IEM3000_TX "|" D_SENSOR_IEM3000_RX + D_SENSOR_IEM3000_TX "|" D_SENSOR_IEM3000_RX "|" + D_SENSOR_ZIGBEE_RST ; const char kSensorNamesFixed[] PROGMEM = @@ -451,6 +455,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { #ifdef USE_ZIGBEE AGPIO(GPIO_ZIGBEE_TX), // Zigbee Serial interface AGPIO(GPIO_ZIGBEE_RX), // Zigbee Serial interface + AGPIO(GPIO_ZIGBEE_RST), // Zigbee reset #endif #ifdef USE_MHZ19 AGPIO(GPIO_MHZ_TXD), // MH-Z19 Serial interface @@ -554,17 +559,16 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_TELEINFO_RX), AGPIO(GPIO_TELEINFO_ENABLE), #endif -/* -#ifndef USE_ADC_VCC - AGPIO(ADC0_INPUT), // Analog input - AGPIO(ADC0_TEMP), // Thermistor - AGPIO(ADC0_LIGHT), // Light sensor - AGPIO(ADC0_BUTTON), // Button - AGPIO(ADC0_BUTTON_INV), - AGPIO(ADC0_RANGE), // Range - AGPIO(ADC0_CT_POWER), // Current +#ifdef USE_ADC + AGPIO(GPIO_ADC_INPUT) + MAX_ADCS, // Analog inputs + AGPIO(GPIO_ADC_TEMP) + MAX_ADCS, // Thermistor + AGPIO(GPIO_ADC_LIGHT) + MAX_ADCS, // Light sensor + AGPIO(GPIO_ADC_BUTTON) + MAX_ADCS, // Button + AGPIO(GPIO_ADC_BUTTON_INV) + MAX_ADCS, + AGPIO(GPIO_ADC_RANGE) + MAX_ADCS, // Range + AGPIO(GPIO_ADC_CT_POWER) + MAX_ADCS, // Current + AGPIO(GPIO_ADC_JOY) + MAX_ADCS, // Joystick #endif -*/ #ifdef USE_WEBCAM AGPIO(GPIO_WEBCAM_PWDN), AGPIO(GPIO_WEBCAM_RESET), @@ -588,13 +592,28 @@ const uint16_t kGpioNiceList[] PROGMEM = { //******************************************************************************************** +// User selectable ADC functionality +enum UserSelectableAdc { + ADC_NONE, // Not used + ADC_INPUT, // Analog input + ADC_TEMP, // Thermistor + ADC_LIGHT, // Light sensor + ADC_BUTTON, // Button + ADC_BUTTON_INV, + ADC_RANGE, // Range + ADC_CT_POWER, // Current + ADC_JOY, // Joystick +// ADC_SWITCH, // Switch +// ADC_SWITCH_INV, + ADC_END }; + #define MAX_GPIO_PIN 40 // Number of supported GPIO #define MIN_FLASH_PINS 4 // Number of flash chip pins unusable for configuration (GPIO6, 7, 8 and 11) #define MAX_USER_PINS 36 // MAX_GPIO_PIN - MIN_FLASH_PINS #define WEMOS_MODULE 0 // Wemos module // 0 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839 -const char PINS_WEMOS[] PROGMEM = "IOTXIORXIOIOflashcFLFLolIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOA6A7A0IoIoA3"; +const char PINS_WEMOS[] PROGMEM = "IOTXIORXIOIOflashcFLFLolIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOAOAOIAIAIAIAIAIA"; //******************************************************************************************** diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index 23105273e..308601067 100644 --- a/tasmota/tasmota_version.h +++ b/tasmota/tasmota_version.h @@ -20,7 +20,7 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x08030107; +const uint32_t VERSION = 0x08040001; // Lowest compatible version const uint32_t VERSION_COMPATIBLE = 0x07010006; diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 112b9ac7f..65ea3497d 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -44,7 +44,7 @@ const uint16_t HTTP_OTA_RESTART_RECONNECT_TIME = 28000; // milliseconds - Allow uint8_t *efm8bb1_update = nullptr; #endif // USE_RF_FLASH -enum UploadTypes { UPL_TASMOTA, UPL_SETTINGS, UPL_EFM8BB1, UPL_TASMOTACLIENT }; +enum UploadTypes { UPL_TASMOTA, UPL_SETTINGS, UPL_EFM8BB1, UPL_TASMOTACLIENT, UPL_EFR32 }; static const char * HEADER_KEYS[] = { "User-Agent", }; @@ -1921,7 +1921,7 @@ void HandleModuleConfiguration(void) } WSContentSend_P(PSTR("\";sk(%d," STR(ADC0_PIN) ");"), Settings.my_adc0); #endif // USE_ADC_VCC -#endif // ESP8266 - ESP32 +#endif // ESP8266 WSContentSend_P(PSTR("}wl(sl);")); @@ -2600,7 +2600,7 @@ void HandleUploadDone(void) MqttRetryCounter(0); #ifdef USE_COUNTER CounterInterruptDisable(false); -#endif +#endif // USE_COUNTER WSContentStart_P(S_INFORMATION); if (!Web.upload_error) { @@ -2627,20 +2627,23 @@ void HandleUploadDone(void) WSContentSend_P(PSTR("%06x'>" D_SUCCESSFUL "
"), WebColor(COL_TEXT_SUCCESS)); WSContentSend_P(HTTP_MSG_RSTRT); ShowWebSource(SRC_WEBGUI); + restart_flag = 2; // Always restart to re-enable disabled features during update +#if defined(USE_ZIGBEE) && defined(USE_ZIGBEE_EZSP) + if (ZigbeeUploadOtaReady()) { + restart_flag = 0; // Hold restart as firmware still needs to be written to MCU EFR32 + } +#endif // USE_ZIGBEE and USE_ZIGBEE_EZSP #ifdef USE_TASMOTA_CLIENT if (TasmotaClient_GetFlagFlashing()) { - restart_flag = 0; - } else { // It was a normal firmware file, or we are ready to restart device - restart_flag = 2; + restart_flag = 0; // Hold restart as code still needs to be trasnferred to Atmega } -#else - restart_flag = 2; // Always restart to re-enable disabled features during update -#endif +#endif // USE_TASMOTA_CLIENT } SettingsBufferFree(); WSContentSend_P(PSTR("
")); WSContentSpaceButton(BUTTON_MAIN); WSContentStop(); + #ifdef USE_TASMOTA_CLIENT if (TasmotaClient_GetFlagFlashing()) { TasmotaClient_Flash(); @@ -2677,8 +2680,8 @@ void HandleUploadLoop(void) } else { MqttRetryCounter(60); #ifdef USE_COUNTER - CounterInterruptDisable(true); -#endif + CounterInterruptDisable(true); // Prevent OTA failures on 100Hz counter interrupts +#endif // USE_COUNTER #ifdef USE_EMULATION UdpDisconnect(); #endif // USE_EMULATION @@ -2707,6 +2710,19 @@ void HandleUploadLoop(void) Web.config_block_count = 0; } else { +#if defined(USE_ZIGBEE) && defined(USE_ZIGBEE_EZSP) +#ifdef ESP8266 + if ((SONOFF_ZB_BRIDGE == my_module_type) && (upload.buf[0] == 0xEB)) { // Check if this is a Zigbee bridge FW file +#else // ESP32 + if (PinUsed(GPIO_ZIGBEE_RX) && PinUsed(GPIO_ZIGBEE_TX) && (upload.buf[0] == 0xEB)) { // Check if this is a Zigbee bridge FW file +#endif // ESP8266 or ESP32 + Update.end(); // End esp8266 update session + Web.upload_file_type = UPL_EFR32; + + Web.upload_error = ZigbeeUploadInit(); // 15 + if (Web.upload_error != 0) { return; } + } else +#endif // USE_ZIGBEE and USE_ZIGBEE_EZSP #ifdef USE_RF_FLASH if ((SONOFF_BRIDGE == my_module_type) && (upload.buf[0] == ':')) { // Check if this is a RF bridge FW file Update.end(); // End esp8266 update session @@ -2750,6 +2766,15 @@ void HandleUploadLoop(void) Web.config_block_count++; } } +#if defined(USE_ZIGBEE) && defined(USE_ZIGBEE_EZSP) + else if (UPL_EFR32 == Web.upload_file_type) { + // Write buffers to MCU EFR32 + if (!ZigbeeUploadWriteBuffer(upload.buf, upload.currentSize)) { + Web.upload_error = 9; // File too large + return; + } + } +#endif // USE_ZIGBEE and USE_ZIGBEE_EZSP #ifdef USE_RF_FLASH else if (UPL_EFM8BB1 == Web.upload_file_type) { if (efm8bb1_update != nullptr) { // We have carry over data since last write, i. e. a start but not an end @@ -2844,6 +2869,13 @@ void HandleUploadLoop(void) return; } } +#if defined(USE_ZIGBEE) && defined(USE_ZIGBEE_EZSP) + else if (UPL_EFR32 == Web.upload_file_type) { + // Zigbee FW upload to ESP8266 flash is done + ZigbeeUploadDone(); // Signal upload done and ready for delayed upload to MCU EFR32 + Web.upload_file_type = UPL_TASMOTA; + } +#endif #ifdef USE_RF_FLASH else if (UPL_EFM8BB1 == Web.upload_file_type) { // RF FW flash done @@ -2876,7 +2908,7 @@ void HandleUploadLoop(void) MqttRetryCounter(0); #ifdef USE_COUNTER CounterInterruptDisable(false); -#endif +#endif // USE_COUNTER Web.upload_error = 7; // Upload aborted if (UPL_TASMOTA == Web.upload_file_type) { Update.end(); } } diff --git a/tasmota/xdrv_02_mqtt.ino b/tasmota/xdrv_02_mqtt.ino index 1f232cff8..a9038a941 100644 --- a/tasmota/xdrv_02_mqtt.ino +++ b/tasmota/xdrv_02_mqtt.ino @@ -381,10 +381,20 @@ void MqttPublishPrefixTopic_P(uint32_t prefix, const char* subtopic) MqttPublishPrefixTopic_P(prefix, subtopic, false); } +void MqttPublishPrefixTopicRulesProcess_P(uint32_t prefix, const char* subtopic, bool retained) +{ + MqttPublishPrefixTopic_P(prefix, subtopic, retained); + XdrvRulesProcess(); +} + +void MqttPublishPrefixTopicRulesProcess_P(uint32_t prefix, const char* subtopic) +{ + MqttPublishPrefixTopicRulesProcess_P(prefix, subtopic, false); +} + void MqttPublishTeleSensor(void) { - MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN } void MqttPublishPowerState(uint32_t device) diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino index f38265bb8..4d53af77c 100644 --- a/tasmota/xdrv_03_energy.ino +++ b/tasmota/xdrv_03_energy.ino @@ -110,7 +110,6 @@ struct ENERGY { #ifdef USE_ENERGY_MARGIN_DETECTION uint16_t power_history[3] = { 0 }; uint8_t power_steady_counter = 8; // Allow for power on stabilization - bool power_delta = false; bool min_power_flag = false; bool max_power_flag = false; bool min_voltage_flag = false; @@ -306,23 +305,30 @@ void EnergyMarginCheck(void) uint16_t energy_power_u = (uint16_t)(Energy.active_power[0]); + bool jsonflg = false; + Response_P(PSTR("{\"" D_RSLT_MARGINS "\":{")); + if (Settings.energy_power_delta) { - uint16_t delta = abs(Energy.power_history[0] - energy_power_u); + int16_t power_diff = energy_power_u - Energy.power_history[0]; + uint16_t delta = abs(power_diff); 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; + delta = (delta * 100) / min_power; + if (delta > Settings.energy_power_delta) { + jsonflg = true; } } else { // 101..32000 = Absolute if (delta > (Settings.energy_power_delta -100)) { - Energy.power_delta = true; + jsonflg = true; } } - if (Energy.power_delta) { + if (jsonflg) { Energy.power_history[1] = Energy.active_power[0]; // We only want one report so reset history Energy.power_history[2] = Energy.active_power[0]; + + ResponseAppend_P(PSTR("\"" D_CMND_POWERDELTA "\":%d"), power_diff); } } } @@ -336,9 +342,7 @@ void EnergyMarginCheck(void) DEBUG_DRIVER_LOG(PSTR("NRG: W %d, U %d, I %d"), energy_power_u, energy_voltage_u, energy_current_u); - Response_P(PSTR("{")); bool flag; - bool jsonflg = false; if (EnergyMargin(false, Settings.energy_min_power, energy_power_u, flag, Energy.min_power_flag)) { ResponseAppend_P(PSTR("%s\"" D_CMND_POWERLOW "\":\"%s\""), (jsonflg)?",":"", GetStateText(flag)); jsonflg = true; @@ -363,11 +367,11 @@ void EnergyMarginCheck(void) ResponseAppend_P(PSTR("%s\"" D_CMND_CURRENTHIGH "\":\"%s\""), (jsonflg)?",":"", GetStateText(flag)); jsonflg = true; } - if (jsonflg) { - ResponseJsonEnd(); - MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_MARGINS), MQTT_TELE_RETAIN); - EnergyMqttShow(); - } + } + if (jsonflg) { + ResponseJsonEndEnd(); + MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_MARGINS), MQTT_TELE_RETAIN); + EnergyMqttShow(); } #ifdef USE_ENERGY_POWER_LIMIT @@ -436,8 +440,6 @@ void EnergyMarginCheck(void) } } #endif // USE_ENERGY_POWER_LIMIT - - if (Energy.power_delta) { EnergyMqttShow(); } } void EnergyMqttShow(void) @@ -451,7 +453,6 @@ void EnergyMqttShow(void) tele_period = tele_period_save; ResponseJsonEnd(); MqttPublishTeleSensor(); - Energy.power_delta = false; } #endif // USE_ENERGY_MARGIN_DETECTION diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index ab311d6f0..908ec026e 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -1351,7 +1351,11 @@ void LightInit(void) for (uint32_t i = 0; i < light_type; i++) { Settings.pwm_value[i] = 0; // Disable direct PWM control if (PinUsed(GPIO_PWM1, i)) { +#ifdef ESP8266 pinMode(Pin(GPIO_PWM1, i), OUTPUT); +#else // ESP32 + analogAttach(Pin(GPIO_PWM1, i), i); +#endif } } if (PinUsed(GPIO_ARIRFRCV)) { @@ -1878,8 +1882,7 @@ void LightAnimate(void) Response_P(PSTR("{\"" D_CMND_WAKEUP "\":\"" D_JSON_DONE "\"")); ResponseLightState(1); ResponseJsonEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_CMND_WAKEUP)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_CMND_WAKEUP)); Light.wakeup_active = 0; Settings.light_scheme = LS_POWER; diff --git a/tasmota/xdrv_05_irremote.ino b/tasmota/xdrv_05_irremote.ino index 87a51de53..bb5ce0c3c 100644 --- a/tasmota/xdrv_05_irremote.ino +++ b/tasmota/xdrv_05_irremote.ino @@ -155,9 +155,8 @@ void IrReceiveCheck(void) } ResponseJsonEndEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_IRRECEIVED)); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_IRRECEIVED)); - XdrvRulesProcess(); #ifdef USE_DOMOTICZ if (iridx) { unsigned long value = results.value | (iridx << 28); // [Protocol:4, Data:28] diff --git a/tasmota/xdrv_05_irremote_full.ino b/tasmota/xdrv_05_irremote_full.ino index 457ff63f4..9649e87b4 100644 --- a/tasmota/xdrv_05_irremote_full.ino +++ b/tasmota/xdrv_05_irremote_full.ino @@ -232,9 +232,7 @@ void IrReceiveCheck(void) } ResponseJsonEndEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_IRRECEIVED)); - - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_IRRECEIVED)); } irrecv->resume(); @@ -475,7 +473,7 @@ uint32_t IrRemoteCmndIrSendRaw(void) for (uint32_t i = 0; i <= count; i++) { GC[i] = strtol(strtok_r(nullptr, ", ", &p), nullptr, 0); if (!GC[i]) { - return IE_INVALID_RAWDATA; + return IE_INVALID_RAWDATA; } } irsend_active = true; diff --git a/tasmota/xdrv_06_snfbridge.ino b/tasmota/xdrv_06_snfbridge.ino index 210ff87a3..af6f928bd 100644 --- a/tasmota/xdrv_06_snfbridge.ino +++ b/tasmota/xdrv_06_snfbridge.ino @@ -226,9 +226,7 @@ void SonoffBridgeReceivedRaw(void) } } ResponseAppend_P(PSTR("\"}}")); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_CMND_RFRAW)); - - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_CMND_RFRAW)); } /********************************************************************************************/ @@ -298,8 +296,7 @@ void SonoffBridgeReceived(void) } ResponseTime_P(PSTR(",\"" D_JSON_RFRECEIVED "\":{\"" D_JSON_SYNC "\":%d,\"" D_JSON_LOW "\":%d,\"" D_JSON_HIGH "\":%d,\"" D_JSON_DATA "\":%s,\"" D_CMND_RFKEY "\":%s}}"), sync_time, low_time, high_time, stemp, rfkey); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_RFRECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_RFRECEIVED)); #ifdef USE_DOMOTICZ DomoticzSensor(DZ_COUNT, received_id); // Send rid as Domoticz Counter value #endif // USE_DOMOTICZ diff --git a/tasmota/xdrv_07_domoticz.ino b/tasmota/xdrv_07_domoticz.ino index 556997bb9..2ea842491 100644 --- a/tasmota/xdrv_07_domoticz.ino +++ b/tasmota/xdrv_07_domoticz.ino @@ -21,18 +21,20 @@ #define XDRV_07 7 -#define D_PRFX_DOMOTICZ "Domoticz" +//#define D_PRFX_DOMOTICZ "Domoticz" +#define D_PRFX_DOMOTICZ "Dz" #define D_CMND_IDX "Idx" #define D_CMND_KEYIDX "KeyIdx" #define D_CMND_SWITCHIDX "SwitchIdx" #define D_CMND_SENSORIDX "SensorIdx" #define D_CMND_UPDATETIMER "UpdateTimer" +#define D_CMND_DZSEND "Send" const char kDomoticzCommands[] PROGMEM = D_PRFX_DOMOTICZ "|" // Prefix - D_CMND_IDX "|" D_CMND_KEYIDX "|" D_CMND_SWITCHIDX "|" D_CMND_SENSORIDX "|" D_CMND_UPDATETIMER ; + D_CMND_IDX "|" D_CMND_KEYIDX "|" D_CMND_SWITCHIDX "|" D_CMND_SENSORIDX "|" D_CMND_UPDATETIMER "|" D_CMND_DZSEND ; void (* const DomoticzCommand[])(void) PROGMEM = { - &CmndDomoticzIdx, &CmndDomoticzKeyIdx, &CmndDomoticzSwitchIdx, &CmndDomoticzSensorIdx, &CmndDomoticzUpdateTimer }; + &CmndDomoticzIdx, &CmndDomoticzKeyIdx, &CmndDomoticzSwitchIdx, &CmndDomoticzSensorIdx, &CmndDomoticzUpdateTimer, &CmndDomoticzSend }; const char DOMOTICZ_MESSAGE[] PROGMEM = "{\"idx\":%d,\"nvalue\":%d,\"svalue\":\"%s\",\"Battery\":%d,\"RSSI\":%d}"; @@ -44,6 +46,8 @@ const char kDomoticzSensors[] PROGMEM = D_DOMOTICZ_TEMP "|" D_DOMOTICZ_TEMP_HUM "|" D_DOMOTICZ_TEMP_HUM_BARO "|" D_DOMOTICZ_POWER_ENERGY "|" D_DOMOTICZ_ILLUMINANCE "|" D_DOMOTICZ_COUNT "|" D_DOMOTICZ_VOLTAGE "|" D_DOMOTICZ_CURRENT "|" D_DOMOTICZ_AIRQUALITY "|" D_DOMOTICZ_P1_SMART_METER "|" D_DOMOTICZ_SHUTTER ; +const char kDomoticzCommand[] PROGMEM = "switchlight|switchscene"; + char domoticz_in_topic[] = DOMOTICZ_IN_TOPIC; int domoticz_update_timer = 0; @@ -55,14 +59,14 @@ bool domoticz_update_flag = true; bool domoticz_is_shutter = false; #endif // USE_SHUTTER -int DomoticzBatteryQuality(void) -{ +int DomoticzBatteryQuality(void) { // Battery 0%: ESP 2.6V (minimum operating voltage is 2.5) // Battery 100%: ESP 3.6V (maximum operating voltage is 3.6) // Battery 101% to 200%: ESP over 3.6V (means over maximum operating voltage) int quality = 100; // Voltage range from 2,6V > 0% to 3,6V > 100% +#ifdef ESP8266 #ifdef USE_ADC_VCC uint16_t voltage = ESP.getVcc(); if (voltage <= 2600) { @@ -72,20 +76,19 @@ int DomoticzBatteryQuality(void) } else { quality = (voltage - 2600) / 10; } -#endif +#endif // USE_ADC_VCC +#endif // ESP8266 return quality; } -int DomoticzRssiQuality(void) -{ +int DomoticzRssiQuality(void) { // RSSI range: 0% to 10% (12 means disable RSSI in Domoticz) return WifiGetRssiAsQuality(WiFi.RSSI()) / 10; } #ifdef USE_SONOFF_IFAN -void MqttPublishDomoticzFanState(void) -{ +void MqttPublishDomoticzFanState(void) { if (Settings.flag.mqtt_enabled && Settings.domoticz_relay_idx[1]) { // SetOption3 - Enable MQTT char svalue[8]; // Fanspeed value @@ -98,8 +101,7 @@ void MqttPublishDomoticzFanState(void) } } -void DomoticzUpdateFanState(void) -{ +void DomoticzUpdateFanState(void) { if (domoticz_update_flag) { MqttPublishDomoticzFanState(); } @@ -107,8 +109,7 @@ void DomoticzUpdateFanState(void) } #endif // USE_SONOFF_IFAN -void MqttPublishDomoticzPowerState(uint8_t device) -{ +void MqttPublishDomoticzPowerState(uint8_t device) { if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT if (device < 1) { device = 1; } if ((device > devices_present) || (device > MAX_DOMOTICZ_IDX)) { return; } @@ -138,16 +139,14 @@ void MqttPublishDomoticzPowerState(uint8_t device) } } -void DomoticzUpdatePowerState(uint8_t device) -{ +void DomoticzUpdatePowerState(uint8_t device) { if (domoticz_update_flag) { MqttPublishDomoticzPowerState(device); } domoticz_update_flag = true; } -void DomoticzMqttUpdate(void) -{ +void DomoticzMqttUpdate(void) { if (domoticz_subscribe && (Settings.domoticz_update_timer || domoticz_update_timer)) { domoticz_update_timer--; if (domoticz_update_timer <= 0) { @@ -175,8 +174,7 @@ void DomoticzMqttUpdate(void) } } -void DomoticzMqttSubscribe(void) -{ +void DomoticzMqttSubscribe(void) { uint8_t maxdev = (devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : devices_present; for (uint32_t i = 0; i < maxdev; i++) { if (Settings.domoticz_relay_idx[i]) { @@ -217,8 +215,7 @@ void DomoticzMqttSubscribe(void) } */ -bool DomoticzMqttData(void) -{ +bool DomoticzMqttData(void) { domoticz_update_flag = true; if (strncasecmp_P(XdrvMailbox.topic, PSTR(DOMOTICZ_OUT_TOPIC), strlen(DOMOTICZ_OUT_TOPIC)) != 0) { @@ -359,15 +356,19 @@ bool DomoticzMqttData(void) /*********************************************************************************************/ -bool DomoticzSendKey(uint8_t key, uint8_t device, uint8_t state, uint8_t svalflg) -{ +void DomoticzSendSwitch(uint32_t type, uint32_t index, uint32_t state) { + char stemp[16]; // "switchlight" or "switchscene" + Response_P(PSTR("{\"command\":\"%s\",\"idx\":%d,\"switchcmd\":\"%s\"}"), + GetTextIndexed(stemp, sizeof(stemp), type, kDomoticzCommand), index, (state) ? (POWER_TOGGLE == state) ? "Toggle" : "On" : "Off"); // Domoticz case sensitive + MqttPublish(domoticz_in_topic); +} + +bool DomoticzSendKey(uint8_t key, uint8_t device, uint8_t state, uint8_t svalflg) { bool result = false; if (device <= MAX_DOMOTICZ_IDX) { if ((Settings.domoticz_key_idx[device -1] || Settings.domoticz_switch_idx[device -1]) && (svalflg)) { - Response_P(PSTR("{\"command\":\"switchlight\",\"idx\":%d,\"switchcmd\":\"%s\"}"), - (key) ? Settings.domoticz_switch_idx[device -1] : Settings.domoticz_key_idx[device -1], (state) ? (POWER_TOGGLE == state) ? "Toggle" : "On" : "Off"); - MqttPublish(domoticz_in_topic); + DomoticzSendSwitch(0, (key) ? Settings.domoticz_switch_idx[device -1] : Settings.domoticz_key_idx[device -1], state); result = true; } } @@ -391,46 +392,46 @@ bool DomoticzSendKey(uint8_t key, uint8_t device, uint8_t state, uint8_t svalflg * \*********************************************************************************************/ -uint8_t DomoticzHumidityState(float h) -{ - return (!h) ? 0 : (h < 40) ? 2 : (h > 70) ? 3 : 1; +void DomoticzSendData(uint32_t sensor_idx, uint32_t idx, char *data) { + if (DZ_AIRQUALITY == sensor_idx) { + Response_P(PSTR("{\"idx\":%d,\"nvalue\":%s,\"Battery\":%d,\"RSSI\":%d}"), + idx, data, DomoticzBatteryQuality(), DomoticzRssiQuality()); + } else { + uint8_t nvalue = 0; +#ifdef USE_SHUTTER + if (DZ_SHUTTER == sensor_idx) { + uint8_t position = atoi(data); + nvalue = position < 2 ? 0 : (position == 100 ? 1 : 2); + } +#endif // USE_SHUTTER + Response_P(DOMOTICZ_MESSAGE, + idx, nvalue, data, DomoticzBatteryQuality(), DomoticzRssiQuality()); + } + MqttPublish(domoticz_in_topic); } -void DomoticzSensor(uint8_t idx, char *data) -{ +void DomoticzSensor(uint8_t idx, char *data) { if (Settings.domoticz_sensor_idx[idx]) { char dmess[128]; // {"idx":26700,"nvalue":0,"svalue":"22330.1;10234.4;22000.5;10243.4;1006;3000","Battery":100,"RSSI":10} memcpy(dmess, mqtt_data, sizeof(dmess)); - if (DZ_AIRQUALITY == idx) { - Response_P(PSTR("{\"idx\":%d,\"nvalue\":%s,\"Battery\":%d,\"RSSI\":%d}"), - Settings.domoticz_sensor_idx[idx], data, DomoticzBatteryQuality(), DomoticzRssiQuality()); - } else { - uint8_t nvalue = 0; -#ifdef USE_SHUTTER - if (DZ_SHUTTER == idx) { - uint8_t position = atoi(data); - nvalue = position < 2 ? 0 : (position == 100 ? 1 : 2); - } -#endif // USE_SHUTTER - Response_P(DOMOTICZ_MESSAGE, - Settings.domoticz_sensor_idx[idx], nvalue, data, DomoticzBatteryQuality(), DomoticzRssiQuality()); - } - MqttPublish(domoticz_in_topic); + DomoticzSendData(idx, Settings.domoticz_sensor_idx[idx], data); memcpy(mqtt_data, dmess, sizeof(dmess)); } } -void DomoticzSensor(uint8_t idx, uint32_t value) -{ +uint8_t DomoticzHumidityState(float h) { + return (!h) ? 0 : (h < 40) ? 2 : (h > 70) ? 3 : 1; +} + +void DomoticzSensor(uint8_t idx, uint32_t value) { char data[16]; snprintf_P(data, sizeof(data), PSTR("%d"), value); DomoticzSensor(idx, data); } //void DomoticzTempHumPressureSensor(float temp, float hum, float baro = -1); -void DomoticzTempHumPressureSensor(float temp, float hum, float baro) -{ +void DomoticzTempHumPressureSensor(float temp, float hum, float baro) { char temperature[FLOATSZ]; dtostrfd(temp, 2, temperature); char humidity[FLOATSZ]; @@ -449,15 +450,13 @@ void DomoticzTempHumPressureSensor(float temp, float hum, float baro) } } -void DomoticzSensorPowerEnergy(int power, char *energy) -{ +void DomoticzSensorPowerEnergy(int power, char *energy) { char data[16]; snprintf_P(data, sizeof(data), PSTR("%d;%s"), power, energy); DomoticzSensor(DZ_POWER_ENERGY, data); } -void DomoticzSensorP1SmartMeter(char *usage1, char *usage2, char *return1, char *return2, int power) -{ +void DomoticzSensorP1SmartMeter(char *usage1, char *usage2, char *return1, char *return2, int power) { //usage1 = energy usage meter tariff 1, This is an incrementing counter //usage2 = energy usage meter tariff 2, This is an incrementing counter //return1 = energy return meter tariff 1, This is an incrementing counter @@ -478,8 +477,7 @@ void DomoticzSensorP1SmartMeter(char *usage1, char *usage2, char *return1, char * Commands \*********************************************************************************************/ -void CmndDomoticzIdx(void) -{ +void CmndDomoticzIdx(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DOMOTICZ_IDX)) { if (XdrvMailbox.payload >= 0) { Settings.domoticz_relay_idx[XdrvMailbox.index -1] = XdrvMailbox.payload; @@ -489,8 +487,7 @@ void CmndDomoticzIdx(void) } } -void CmndDomoticzKeyIdx(void) -{ +void CmndDomoticzKeyIdx(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DOMOTICZ_IDX)) { if (XdrvMailbox.payload >= 0) { Settings.domoticz_key_idx[XdrvMailbox.index -1] = XdrvMailbox.payload; @@ -499,8 +496,7 @@ void CmndDomoticzKeyIdx(void) } } -void CmndDomoticzSwitchIdx(void) -{ +void CmndDomoticzSwitchIdx(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DOMOTICZ_IDX)) { if (XdrvMailbox.payload >= 0) { Settings.domoticz_switch_idx[XdrvMailbox.index -1] = XdrvMailbox.payload; @@ -509,8 +505,7 @@ void CmndDomoticzSwitchIdx(void) } } -void CmndDomoticzSensorIdx(void) -{ +void CmndDomoticzSensorIdx(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= DZ_MAX_SENSORS)) { if (XdrvMailbox.payload >= 0) { Settings.domoticz_sensor_idx[XdrvMailbox.index -1] = XdrvMailbox.payload; @@ -519,14 +514,41 @@ void CmndDomoticzSensorIdx(void) } } -void CmndDomoticzUpdateTimer(void) -{ +void CmndDomoticzUpdateTimer(void) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 3601)) { Settings.domoticz_update_timer = XdrvMailbox.payload; } ResponseCmndNumber(Settings.domoticz_update_timer); } +void CmndDomoticzSend(void) { + // DzSend1 , - {\"idx\":,\"nvalue\":0,\"svalue\":\"\",\"Battery\":xx,\"RSSI\":yy} + // DzSend2 , - USE_SHUTTER only - {\"idx\":,\"nvalue\":,\"svalue\":\"\",\"Battery\":xx,\"RSSI\":yy} + // DzSend3 , - {\"idx\":,\"nvalue\":,\"Battery\":xx,\"RSSI\":yy} + // DzSend4 , - {\"command\":\"switchlight\",\"idx\":,\"switchcmd\":\"\"} + // DzSend5 , - {\"command\":\"switchscene\",\"idx\":,\"switchcmd\":\"\"} + + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) { + if (XdrvMailbox.data_len > 0) { + if (strstr(XdrvMailbox.data, ",") != nullptr) { // Process parameter entry + char *data; + uint32_t index = strtoul(strtok_r(XdrvMailbox.data, ",", &data), nullptr, 10); + if ((index > 0) && (data != nullptr)) { + if (XdrvMailbox.index > 3) { + uint32_t state = strtoul(data, nullptr, 10); // 0, 1 or 2 + DomoticzSendSwitch(XdrvMailbox.index -4, index, state); + } else { + uint32_t type = DZ_TEMP; + if (2 == XdrvMailbox.index) { type = DZ_SHUTTER; } + else if (3 == XdrvMailbox.index) { type = DZ_AIRQUALITY; } + DomoticzSendData(type, index, data); + } + } + } + } + } +} + /*********************************************************************************************\ * Presentation \*********************************************************************************************/ @@ -554,8 +576,7 @@ const char HTTP_FORM_DOMOTICZ_SENSOR[] PROGMEM = const char HTTP_FORM_DOMOTICZ_TIMER[] PROGMEM = "" D_DOMOTICZ_UPDATE_TIMER " (" STR(DOMOTICZ_UPDATE_TIMER) ")"; -void HandleDomoticzConfiguration(void) -{ +void HandleDomoticzConfiguration(void) { if (!HttpCheckPriviledgedAccess()) { return; } AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_DOMOTICZ); @@ -596,8 +617,7 @@ void HandleDomoticzConfiguration(void) WSContentStop(); } -void DomoticzSaveSettings(void) -{ +void DomoticzSaveSettings(void) { char stemp[20]; char ssensor_indices[6 * MAX_DOMOTICZ_SNS_IDX]; char tmp[100]; @@ -635,8 +655,7 @@ void DomoticzSaveSettings(void) * Interface \*********************************************************************************************/ -bool Xdrv07(uint8_t function) -{ +bool Xdrv07(uint8_t function) { bool result = false; if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT diff --git a/tasmota/xdrv_08_serial_bridge.ino b/tasmota/xdrv_08_serial_bridge.ino index 0dec9cb6b..210094048 100644 --- a/tasmota/xdrv_08_serial_bridge.ino +++ b/tasmota/xdrv_08_serial_bridge.ino @@ -93,8 +93,7 @@ void SerialBridgeInput(void) } ResponseJsonEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SSERIALRECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_SSERIALRECEIVED)); serial_bridge_in_byte_counter = 0; } } @@ -125,7 +124,7 @@ void SerialBridgeInit(void) void CmndSSerialSend(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) { + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 6)) { serial_bridge_raw = (XdrvMailbox.index > 3); if (XdrvMailbox.data_len > 0) { if (1 == XdrvMailbox.index) { @@ -154,6 +153,15 @@ void CmndSSerialSend(void) codes += 2; } } + else if (6 == XdrvMailbox.index) { + char *p; + uint8_t code; + char *values = XdrvMailbox.data; + for (char* str = strtok_r(values, ",", &p); str; str = strtok_r(nullptr, ",", &p)) { + code = (uint8_t)atoi(str); + SerialBridgeSerial->write(code); // "72,101,108,108" + } + } ResponseCmndDone(); } } diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index 782116fc0..47c789935 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -791,6 +791,11 @@ bool RulesProcess(void) void RulesInit(void) { + // indicates scripter not enabled + bitWrite(Settings.rule_once, 7, 0); + // and indicates scripter do not use compress + bitWrite(Settings.rule_once, 6, 0); + rules_flag.data = 0; for (uint32_t i = 0; i < MAX_RULE_SETS; i++) { if (0 == GetRuleLen(i)) { diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 922e75ebc..5e7fad736 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -388,9 +388,9 @@ WiFiUDP Script_PortUdp; #ifndef USE_DEVICE_GROUPS 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; + static char ipbuffer[16]; + sprintf_P(ipbuffer, PSTR("%u.%u.%u.%u"), ip_address[0], ip_address[1], ip_address[2], ip_address[3]); + return ipbuffer; } #endif #endif @@ -5291,6 +5291,23 @@ bool ScriptCommand(void) { execute_script(XdrvMailbox.data); } } + if ('?' == XdrvMailbox.data[0]) { + char *lp=XdrvMailbox.data; + lp++; + while (*lp==' ') lp++; + float fvar; + char str[SCRIPT_MAXSSIZE]; + glob_script_mem.glob_error=0; + GetNumericResult(lp,OPER_EQU,&fvar,0); + if (glob_script_mem.glob_error==1) { + // was string, not number + GetStringResult(lp,OPER_EQU,str,0); + snprintf_P (mqtt_data, sizeof(mqtt_data), PSTR("{\"script\":{\"%s\":\"%s\"}}"),lp,str); + } else { + dtostrfd(fvar,6,str); + snprintf_P (mqtt_data, sizeof(mqtt_data), PSTR("{\"script\":{\"%s\":%s}}"),lp,str); + } + } return serviced; } snprintf_P (mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"%s\",\"Free\":%d}"),command, GetStateText(bitRead(Settings.rule_enabled,0)),glob_script_mem.script_size-strlen(glob_script_mem.script_ram)); @@ -5606,32 +5623,54 @@ const char HTTP_SCRIPT_MIMES[] PROGMEM = "Content-type: %s\r\n\r\n"; void ScriptGetSDCard(void) { + if (!HttpCheckPriviledgedAccess()) { return; } String stmp = Webserver->uri(); - char *cp=strstr(stmp.c_str(),"/sdc/"); + char *cp=strstr_P(stmp.c_str(),PSTR("/sdc/")); // if (cp) Serial.printf(">>>%s\n",cp); if (cp) { #ifdef ESP32 - cp+=4 + cp+=4; #else cp+=5; #endif - if (fsp->exists(cp)) { + if (strstr_P(cp,PSTR("scrdmp.bmp"))) { SendFile(cp); return; + } else { + if (fsp->exists(cp)) { + SendFile(cp); + return; + } } } HandleNotFound(); } +extern uint8_t *buffer; + void SendFile(char *fname) { char buff[512]; const char *mime; + uint8_t sflg=0; char *jpg=strstr(fname,".jpg"); if (jpg) { mime="image/jpeg"; } + +#ifdef USE_DISPLAY_DUMP + char *sbmp=strstr_P(fname,PSTR("scrdmp.bmp")); + if (sbmp) { + mime="image/bmp"; + sflg=1; + } +#endif // USE_DISPLAY_DUMP + + char *bmp=strstr(fname,".bmp"); + if (bmp) { + mime="image/bmp"; + } char *html=strstr(fname,".html"); if (html) { mime="text/html"; @@ -5643,18 +5682,57 @@ char buff[512]; WSContentSend_P(HTTP_SCRIPT_MIMES,fname,mime); - - File file=fsp->open(fname,FILE_READ); - uint32_t siz = file.size(); - uint32_t len=sizeof(buff); - while (siz > 0) { + if (sflg) { +#ifdef USE_DISPLAY_DUMP + // screen copy + #define fileHeaderSize 14 + #define infoHeaderSize 40 + if (buffer) { + uint8_t *bp=buffer; + uint8_t *lbuf=(uint8_t*)calloc(Settings.display_width+2,3); + uint8_t *lbp; + uint8_t fileHeader[fileHeaderSize]; + createBitmapFileHeader(Settings.display_height , Settings.display_width , fileHeader); + Webserver->client().write((uint8_t *)fileHeader, fileHeaderSize); + uint8_t infoHeader[infoHeaderSize]; + createBitmapInfoHeader(Settings.display_height, Settings.display_width, infoHeader ); + Webserver->client().write((uint8_t *)infoHeader, infoHeaderSize); + for (uint32_t lins=0; lins>1; + } + bp++; + } + Webserver->client().write((const char*)lbuf, Settings.display_width*3); + } + if (lbuf) free(lbuf); + Webserver->client().stop(); + } +#endif // USE_DISPLAY_DUMP + } else { + File file=fsp->open(fname,FILE_READ); + uint32_t siz = file.size(); + uint32_t len=sizeof(buff); + while (siz > 0) { if (len>siz) len=siz; file.read((uint8_t *)buff,len ); Webserver->client().write((const char*)buff, len); siz -= len; + } + file.close(); } - file.close(); - Webserver->client().stop(); } #endif // USE_SCRIPT_FATFS @@ -6619,6 +6697,8 @@ bool Xdrv10(uint8_t function) glob_script_mem.script_pram=(uint8_t*)Settings.script_pram[0]; glob_script_mem.script_pram_size=PMEM_SIZE; + // indicates scripter enabled (use rules[][] as single array) + bitWrite(Settings.rule_once, 7, 1); #ifdef USE_SCRIPT_COMPRESSION int32_t len_decompressed; sprt=(char*)calloc(UNISHOXRSIZE+8,1); @@ -6627,7 +6707,12 @@ bool Xdrv10(uint8_t function) glob_script_mem.script_size=UNISHOXRSIZE; len_decompressed = SCRIPT_DECOMPRESS(Settings.rules[0], strlen(Settings.rules[0]), glob_script_mem.script_ram, glob_script_mem.script_size); if (len_decompressed>0) glob_script_mem.script_ram[len_decompressed]=0; + // indicates scripter use compression + bitWrite(Settings.rule_once, 6, 1); //AddLog_P2(LOG_LEVEL_INFO, PSTR("decompressed script len %d"),len_decompressed); +#else // USE_SCRIPT_COMPRESSION + // indicates scripter does not use compression + bitWrite(Settings.rule_once, 6, 0); #endif // USE_SCRIPT_COMPRESSION #ifdef USE_BUTTON_EVENT diff --git a/tasmota/xdrv_12_home_assistant.ino b/tasmota/xdrv_12_home_assistant.ino index df53084a8..005daadfc 100644 --- a/tasmota/xdrv_12_home_assistant.ino +++ b/tasmota/xdrv_12_home_assistant.ino @@ -108,6 +108,21 @@ const char HASS_DISCOVER_LIGHT_SCHEME[] PROGMEM = "\"fx_val_tpl\":\"{{value_json." D_CMND_SCHEME "}}\"," "\"fx_list\":[\"0\",\"1\",\"2\",\"3\",\"4\"]"; // string list with reference to scheme parameter. +const char HASS_DISCOVER_SHUTTER_BASE[] PROGMEM = + ",\"cmd_t\":\"%s\"," // cmnd/%topic%/Backlog + "\"pl_open\":\"ShutterOpen%d\"," // 1 + "\"pl_cls\":\"ShutterClose%d\"," // 1 + "\"pl_stop\":\"ShutterStop%d\"," // 1 + "\"opt\":false," + "\"ret\":false," + "\"qos\":1"; + +const char HASS_DISCOVER_SHUTTER_POS[] PROGMEM = + ",\"pos_t\":\"%s%d\"," // stat/%topic%/SHUTTER1 + "\"pos_clsd\":0," + "\"pos_open\":100," + "\"set_pos_t\":\"%s%d\""; // cmnd/%topic%/ShutterPosition1 + const char HASS_DISCOVER_SENSOR_HASS_STATUS[] PROGMEM = ",\"json_attr_t\":\"%s\"," "\"unit_of_meas\":\"%%\"," @@ -208,6 +223,7 @@ void HAssAnnounceRelayLight(void) uint8_t TuyaRel = 0; uint8_t TuyaRelInv = 0; uint8_t TuyaDim = 0; + uint8_t shutter_mask = 0; #ifdef ESP8266 if (PWM_DIMMER == my_module_type ) { PwmMod = true; } // @@ -225,6 +241,17 @@ void HAssAnnounceRelayLight(void) if (!PwmMulti) { max_lights = 2;} } +#ifdef USE_SHUTTER + if (Settings.flag3.shutter_mode) { + for (uint32_t i = 0; i < MAX_SHUTTERS; i++) { + if (Settings.shutter_startrelay[i] > 0 && Settings.shutter_startrelay[i] <= MAX_RELAYS) { + bitSet(shutter_mask, Settings.shutter_startrelay[i] -1); + bitSet(shutter_mask, Settings.shutter_startrelay[i]); + } + } + } +#endif + for (uint32_t i = 1; i <= MAX_RELAYS; i++) { @@ -248,7 +275,9 @@ void HAssAnnounceRelayLight(void) snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s/config"), (is_topic_light) ? "light" : "switch", unique_id); - if ((i < Light.device) && !RelayX) { + if (bitRead(shutter_mask, i-1)) { + // suppress shutter relays + } else if ((i < Light.device) && !RelayX) { err_flag = true; AddLog_P2(LOG_LEVEL_ERROR, PSTR("%s"), kHAssError2); } else { @@ -712,6 +741,48 @@ void HAssAnnounceSensors(void) } while (hass_xsns_index != 0); } +void HAssAnnounceShutters(void) +{ +#ifdef USE_SHUTTER + char stopic[TOPSZ]; + char stemp1[TOPSZ]; + char stemp2[TOPSZ]; + char unique_id[30]; + + for (uint32_t i = 0; i < MAX_SHUTTERS; i++) { + mqtt_data[0] = '\0'; // Clear retained message + + snprintf_P(unique_id, sizeof(unique_id), PSTR("%06X_SHT_%d"), ESP_getChipId(), i + 1); + snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/cover/%s/config"), unique_id); + + if (Settings.flag.hass_discovery && Settings.flag3.shutter_mode && Settings.shutter_startrelay[i] > 0 && Settings.shutter_startrelay[i] <= MAX_RELAYS) { + if (i > MAX_FRIENDLYNAMES) { + snprintf_P(stemp1, sizeof(stemp1), PSTR("%s Shutter %d"), SettingsText(SET_DEVICENAME), i + 1); + } else { + snprintf_P(stemp1, sizeof(stemp1), PSTR("%s"), SettingsText(SET_FRIENDLYNAME1 + i)); + } + GetTopic_P(stemp2, TELE, mqtt_topic, D_RSLT_STATE); + Response_P(HASS_DISCOVER_BASE, stemp1, stemp2); + + GetTopic_P(stemp1, TELE, mqtt_topic, S_LWT); + TryResponseAppend_P(HASS_DISCOVER_SENSOR_LWT, stemp1); + + GetTopic_P(stemp1, CMND, mqtt_topic, PSTR("Backlog")); + TryResponseAppend_P(HASS_DISCOVER_SHUTTER_BASE, stemp1, i + 1, i + 1, i + 1); + + GetTopic_P(stemp1, STAT, mqtt_topic, PSTR("SHUTTER")); + GetTopic_P(stemp2, CMND, mqtt_topic, PSTR("ShutterPosition")); + TryResponseAppend_P(HASS_DISCOVER_SHUTTER_POS, stemp1, i + 1, stemp2, i + 1); + + TryResponseAppend_P(HASS_DISCOVER_DEVICE_INFO_SHORT, unique_id, ESP_getChipId()); + TryResponseAppend_P(PSTR("}")); + } + + MqttPublish(stopic, true); + } +#endif +} + void HAssAnnounceDeviceInfoAndStatusSensor(void) { char stopic[TOPSZ]; @@ -787,6 +858,9 @@ void HAssDiscovery(void) // Send info about relays and lights HAssAnnounceRelayLight(); + // Send info about shutters + HAssAnnounceShutters(); + // Send info about status sensor HAssAnnounceDeviceInfoAndStatusSensor(); } diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index d1fc01832..c7e4fb251 100644 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -1268,7 +1268,9 @@ void DisplayInitDriver(void) // AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "Display model %d"), Settings.display_model); if (Settings.display_model) { - devices_present++; + if (!light_type) { + devices_present++; // If no PWM channel for backlight then use "normal" power control + } disp_device = devices_present; #ifndef USE_DISPLAY_MODES1TO5 diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 82bc4ef7f..b4b9a5ff4 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -808,7 +808,7 @@ void TuyaSetTime(void) { uint16_t payload_len = 8; uint8_t payload_buffer[8]; payload_buffer[0] = 0x01; - payload_buffer[1] = (uint8_t)RtcTime.year; + payload_buffer[1] = RtcTime.year %100; payload_buffer[2] = RtcTime.month; payload_buffer[3] = RtcTime.day_of_month; payload_buffer[4] = RtcTime.hour; diff --git a/tasmota/xdrv_17_rcswitch.ino b/tasmota/xdrv_17_rcswitch.ino index c5013828c..ac4111e83 100644 --- a/tasmota/xdrv_17_rcswitch.ino +++ b/tasmota/xdrv_17_rcswitch.ino @@ -69,8 +69,7 @@ void RfReceiveCheck(void) } ResponseTime_P(PSTR(",\"" D_JSON_RFRECEIVED "\":{\"" D_JSON_RF_DATA "\":%s,\"" D_JSON_RF_BITS "\":%d,\"" D_JSON_RF_PROTOCOL "\":%d,\"" D_JSON_RF_PULSE "\":%d}}"), stemp, bits, protocol, delay); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_RFRECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_RFRECEIVED)); #ifdef USE_DOMOTICZ DomoticzSensor(DZ_COUNT, data); // Send data as Domoticz Counter value #endif // USE_DOMOTICZ diff --git a/tasmota/xdrv_23_zigbee_0_constants.ino b/tasmota/xdrv_23_zigbee_0_constants.ino index ea087e70f..5ebd66087 100644 --- a/tasmota/xdrv_23_zigbee_0_constants.ino +++ b/tasmota/xdrv_23_zigbee_0_constants.ino @@ -26,6 +26,8 @@ #error "You must select one of: #define USE_ZIGBEE_ZNP or #define USE_ZIGBEE_EZSP" #endif +// #define USE_ZIGBEE_NO_READ_ATTRIBUTES // disable automatic READ ATTRIBUTES generated by Z2T - for debugging only + #define OCCUPANCY "Occupancy" // global define for Aqara #define ZIGBEE_EZSP_RESET_LED 4 // Led number to drive the EZSP Reset pin @@ -1105,12 +1107,6 @@ enum ZCL_Global_Commands { #define ZF(s) static const char ZS_ ## s[] PROGMEM = #s; #define Z(s) ZS_ ## s -typedef struct Z_StatusLine { - uint32_t status; // no need to use uint8_t since it uses 32 bits anyways - const char * status_msg; -} Z_StatusLine; - - // ZDP Enumeration, see Zigbee spec 2.4.5 String getZDPStatusMessage(uint8_t status) { static const char StatusMsg[] PROGMEM = "SUCCESS|INV_REQUESTTYPE|DEVICE_NOT_FOUND|INVALID_EP|NOT_ACTIVE|NOT_SUPPORTED" @@ -1137,6 +1133,47 @@ String getZDPStatusMessage(uint8_t status) { return String(msg); } +String getEmberStatus(uint8_t status) { + static const char StatusMsg[] PROGMEM = "SUCCESS|ERR_FATAL|BAD_ARGUMENT|EEPROM_MFG_STACK_VERSION_MISMATCH|INCOMPATIBLE_STATIC_MEMORY_DEFINITIONS|EEPROM_MFG_VERSION_MISMATCH|EEPROM_STACK_VERSION_MISMATCH" + "|NO_BUFFERS|SERIAL_INVALID_BAUD_RATE|SERIAL_INVALID_PORT|SERIAL_TX_OVERFLOW|SERIAL_RX_OVERFLOW|SERIAL_RX_FRAME_ERROR|SERIAL_RX_PARITY_ERROR|SERIAL_RX_EMPTY|SERIAL_RX_OVERRUN_ERROR" + "|MAC_TRANSMIT_QUEUE_FULL|MAC_UNKNOWN_HEADER_TYPE|MAC_SCANNING|MAC_NO_DATA|MAC_JOINED_NETWORK|MAC_BAD_SCAN_DURATION|MAC_INCORRECT_SCAN_TYPE|MAC_INVALID_CHANNEL_MASK|MAC_COMMAND_TRANSMIT_FAILURE" + "|MAC_NO_ACK_RECEIVED|MAC_INDIRECT_TIMEOUT|SIM_EEPROM_ERASE_PAGE_GREEN|SIM_EEPROM_ERASE_PAGE_RED|SIM_EEPROM_FULL|ERR_FLASH_WRITE_INHIBITED|ERR_FLASH_VERIFY_FAILED|SIM_EEPROM_INIT_1_FAILED|SIM_EEPROM_INIT_2_FAILED|SIM_EEPROM_INIT_3_FAILED|ERR_FLASH_PROG_FAIL|ERR_FLASH_ERASE_FAIL" + "|ERR_BOOTLOADER_TRAP_TABLE_BAD|ERR_BOOTLOADER_TRAP_UNKNOWN|ERR_BOOTLOADER_NO_IMAGE|DELIVERY_FAILED|BINDING_INDEX_OUT_OF_RANGE|ADDRESS_TABLE_INDEX_OUT_OF_RANGE|INVALID_BINDING_INDEX" + "|INVALID_CALL|COST_NOT_KNOWN|MAX_MESSAGE_LIMIT_REACHED|MESSAGE_TOO_LONG|BINDING_IS_ACTIVE|ADDRESS_TABLE_ENTRY_IS_ACTIVE" + "|ADC_CONVERSION_DONE|ADC_CONVERSION_BUSY|ADC_CONVERSION_DEFERRED|ADC_NO_CONVERSION_PENDING|SLEEP_INTERRUPTED|PHY_TX_UNDERFLOW|PHY_TX_INCOMPLETE|PHY_INVALID_CHANNEL|PHY_INVALID_POWER|PHY_TX_BUSY|PHY_TX_CCA_FAIL|PHY_OSCILLATOR_CHECK_FAILED|PHY_ACK_RECEIVED" + "|NETWORK_UP|NETWORK_DOWN|JOIN_FAILED|MOVE_FAILED|CANNOT_JOIN_AS_ROUTER|NODE_ID_CHANGED|PAN_ID_CHANGED|NO_BEACONS|RECEIVED_KEY_IN_THE_CLEAR|NO_NETWORK_KEY_RECEIVED|NO_LINK_KEY_RECEIVED|PRECONFIGURED_KEY_REQUIRED" + "|NOT_JOINED|INVALID_SECURITY_LEVEL|NETWORK_BUSY|INVALID_ENDPOINT|BINDING_HAS_CHANGED|INSUFFICIENT_RANDOM_DATA|APS_ENCRYPTION_ERROR|SECURITY_STATE_NOT_SET" + "|KEY_TABLE_INVALID_ADDRESS|SECURITY_CONFIGURATION_INVALID|TOO_SOON_FOR_SWITCH_KEY|KEY_NOT_AUTHORIZED|SECURITY_DATA_INVALID|SOURCE_ROUTE_FAILURE|MANY_TO_ONE_ROUTE_FAILURE" + "|STACK_AND_HARDWARE_MISMATCH|INDEX_OUT_OF_RANGE|TABLE_FULL|TABLE_ENTRY_ERASED|LIBRARY_NOT_PRESENT|OPERATION_IN_PROGRESS" + ; + static const uint8_t StatusIdx[] PROGMEM = { 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, + 0x18, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x39, 0x3A, 0x3D, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x40, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, + 0x58, 0x59, 0x5A, 0x66, 0x69, 0x6A, 0x6C, + 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, + 0x80, 0x81, 0x82, 0x84, 0x85, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x94, 0x96, 0x98, 0x99, 0x9A, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0x93, 0x95, 0xA1, 0xA3, 0xA4, 0xA5, 0xA6, 0xA8, + 0xB3, 0xB7, 0xB8, 0xBB, 0xBD, 0xA9, 0xAA, + 0xB0, 0xB1, 0xB4, 0xB6, 0xB5, 0xBA }; + + char msg[32]; + int32_t idx = -1; + for (uint32_t i = 0; i < sizeof(StatusIdx); i++) { + if (status == pgm_read_byte(&StatusIdx[i])) { + idx = i; + break; + } + } + if (idx >= 0) { + GetTextIndexed(msg, sizeof(msg), idx, StatusMsg); + } else { + *msg = 0x00; // empty string + } + return String(msg); +} + // Undocumented Zigbee ZCL code here: https://github.com/dresden-elektronik/deconz-rest-plugin/wiki/Zigbee-Error-Codes-in-the-Log String getZigbeeStatusMessage(uint8_t status) { diff --git a/tasmota/xdrv_23_zigbee_2_devices.ino b/tasmota/xdrv_23_zigbee_2_devices.ino index abcf6440c..d87fe4005 100644 --- a/tasmota/xdrv_23_zigbee_2_devices.ino +++ b/tasmota/xdrv_23_zigbee_2_devices.ino @@ -141,6 +141,7 @@ public: // Add an endpoint to a device void addEndpoint(uint16_t shortaddr, uint8_t endpoint); void clearEndpoints(uint16_t shortaddr); + uint32_t countEndpoints(uint16_t shortaddr) const; // return the number of known endpoints (0 if unknown) void setManufId(uint16_t shortaddr, const char * str); void setModelId(uint16_t shortaddr, const char * str); @@ -533,6 +534,23 @@ void Z_Devices::addEndpoint(uint16_t shortaddr, uint8_t endpoint) { } } +// +// Count the number of known endpoints +// +uint32_t Z_Devices::countEndpoints(uint16_t shortaddr) const { + uint32_t count_ep = 0; + int32_t found = findShortAddr(shortaddr); + if (found < 0) return 0; // avoid creating an entry if the device was never seen + const Z_Device &device = devicesAt(found); + + for (uint32_t i = 0; i < endpoints_max; i++) { + if (0 != device.endpoints[i]) { + count_ep++; + } + } + return count_ep; +} + // Find the first endpoint of the device uint8_t Z_Devices::findFirstEndpoint(uint16_t shortaddr) const { // When in router of end-device mode, the coordinator was not probed, in this case always talk to endpoint 1 diff --git a/tasmota/xdrv_23_zigbee_5_converters.ino b/tasmota/xdrv_23_zigbee_5_converters.ino index 26781d358..aa9d7513f 100644 --- a/tasmota/xdrv_23_zigbee_5_converters.ino +++ b/tasmota/xdrv_23_zigbee_5_converters.ino @@ -622,8 +622,7 @@ public: _frame_control, _manuf_code, _transact_seq, _cmd_id, hex_char); if (Settings.flag3.tuya_serial_mqtt_publish) { - MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR)); } else { AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "%s"), mqtt_data); } @@ -1152,15 +1151,16 @@ void ZCLFrame::parseResponse(void) { msg.reserve(100); json.printTo(msg); Response_P(PSTR("{\"" D_JSON_ZIGBEE_RESPONSE "\":%s}"), msg.c_str()); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); } // Parse non-normalized attributes void ZCLFrame::parseClusterSpecificCommand(JsonObject& json, uint8_t offset) { - convertClusterSpecific(json, _cluster_id, _cmd_id, _frame_control.b.direction, _payload); + convertClusterSpecific(json, _cluster_id, _cmd_id, _frame_control.b.direction, _srcaddr, _srcendpoint, _payload); +#ifndef USE_ZIGBEE_NO_READ_ATTRIBUTES // read attributes unless disabled sendHueUpdate(_srcaddr, _groupaddr, _cluster_id, _cmd_id, _frame_control.b.direction); +#endif } // ====================================================================== @@ -1425,6 +1425,8 @@ int32_t Z_ApplyConverter(const class ZCLFrame *zcl, uint16_t shortaddr, JsonObje } void ZCLFrame::postProcessAttributes(uint16_t shortaddr, JsonObject& json) { + // source endpoint + uint8_t src_ep = _srcendpoint; // iterate on json elements for (auto kv : json) { String key_string = kv.key; @@ -1492,6 +1494,11 @@ void ZCLFrame::postProcessAttributes(uint16_t shortaddr, JsonObject& json) { ((conv_attribute == attribute) || (conv_attribute == 0xFFFF)) ) { String new_name_str = (const __FlashStringHelper*) converter->name; if (suffix > 1) { new_name_str += suffix; } // append suffix number + // else if (Settings.flag4.zb_index_ep) { + // if (zigbee_devices.countEndpoints(shortaddr) > 0) { + // new_name_str += _srcendpoint; + // } + // } // apply the transformation int32_t drop = Z_ApplyConverter(this, shortaddr, json, key, value, new_name_str, conv_cluster, conv_attribute, conv_multiplier, conv_cb); if (drop) { diff --git a/tasmota/xdrv_23_zigbee_6_commands.ino b/tasmota/xdrv_23_zigbee_6_commands.ino index 40545f737..39da3049b 100644 --- a/tasmota/xdrv_23_zigbee_6_commands.ino +++ b/tasmota/xdrv_23_zigbee_6_commands.ino @@ -56,8 +56,8 @@ ZF(ColorTempStep) ZF(ColorTempStepUp) ZF(ColorTempStepDown) ZF(ArrowClick) ZF(ArrowHold) ZF(ArrowRelease) ZF(ZoneStatusChange) ZF(xxxx00) ZF(xxxx) ZF(01xxxx) ZF(03xxxx) ZF(00) ZF(01) ZF() ZF(xxxxyy) ZF(00190200) ZF(01190200) ZF(xxyyyy) ZF(xx) -ZF(xx000A00) ZF(xx0A00) ZF(xxyy0A00) ZF(xxxxyyyy0A00) ZF(xxxx0A00) ZF(xx0A) -ZF(xx190A00) ZF(xx19) ZF(xx190A) ZF(xxxxyyyy) ZF(xxxxyyzz) ZF(xxyyzzzz) ZF(xxyyyyzz) +ZF(xx000A00) ZF(xx0A00) ZF(xxyy0A00) ZF(xxxxyyyy0A00) ZF(xxxx0A00) ZF(xx0A) ZF(xxyy) +ZF(xx190A00) ZF(xx19) ZF(xx190A) ZF(xxxxyyyy) ZF(xxxxyyzz) ZF(xxyyzzzz) ZF(xxyyyyzz) ZF(xxyyyyzzzz) ZF(01xxxx000000000000) ZF(03xxxx000000000000) ZF(00xxxx000000000000) ZF(xxyyyy000000000000) ZF(00xx0A00) ZF(01xx0A00) ZF(03xx0A00) ZF(01xxxx0A0000000000) ZF(03xxxx0A0000000000) ZF(xxyyyy0A0000000000) @@ -84,6 +84,9 @@ const Z_CommandConverter Z_Commands[] PROGMEM = { { Z(RecallScene), 0x0005, 0x05, 0x01, Z(xxxxyy) }, { Z(GetSceneMembership),0x0005, 0x06, 0x01, Z(xxxx) }, // Light & Shutter commands + { Z(Power), 0x0006, 0x40, 0x81, Z(xxyy) }, // Power Off With Effect + { Z(Power), 0x0006, 0x41, 0x81, Z() }, // Power On With Recall Global Scene + { Z(Power), 0x0006, 0x42, 0x81, Z(xxyyyyzzzz) }, // Power On with Timed Off { Z(Power), 0x0006, 0xFF, 0x01, Z() }, // 0=Off, 1=On, 2=Toggle { Z(Dimmer), 0x0008, 0x04, 0x01, Z(xx0A00) }, // Move to Level with On/Off, xx=0..254 (255 is invalid) { Z(DimmerUp), 0x0008, 0x06, 0x01, Z(00190200) }, // Step up by 10%, 0.2 secs @@ -341,7 +344,7 @@ void sendHueUpdate(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, uin // Parse a cluster specific command, and try to convert into human readable -void convertClusterSpecific(JsonObject& json, uint16_t cluster, uint8_t cmd, bool direction, const SBuffer &payload) { +void convertClusterSpecific(JsonObject& json, uint16_t cluster, uint8_t cmd, bool direction, uint16_t shortaddr, uint8_t srcendpoint, const SBuffer &payload) { size_t hex_char_len = payload.len()*2+2; char *hex_char = (char*) malloc(hex_char_len); if (!hex_char) { return; } @@ -414,11 +417,11 @@ void convertClusterSpecific(JsonObject& json, uint16_t cluster, uint8_t cmd, boo if (command_name) { // Now try to transform into a human readable format + String command_name2 = String(command_name); // if (direction & 0x80) then specific transform if (conv_direction & 0x80) { // TODO need to create a specific command // IAS - String command_name2 = String(command_name); if ((cluster == 0x0500) && (cmd == 0x00)) { // "ZoneStatusChange" json[command_name] = xyz.x; @@ -464,12 +467,37 @@ void convertClusterSpecific(JsonObject& json, uint16_t cluster, uint8_t cmd, boo json[F("GroupId")] = xyz.z; String scene_payload = json[attrid_str]; json[F("ScenePayload")] = scene_payload.substring(8); // remove first 8 characters + } else if ((cluster == 0x0006) && (cmd == 0x40)) { + // Power Off With Effect + json[command_name] = 0; // always "Power":0 + json[command_name2 + F("Effect")] = xyz.x; + json[command_name2 + F("EffectVariant")] = xyz.y; + } else if ((cluster == 0x0006) && (cmd == 0x41)) { + // Power On With Recall Global Scene + json[command_name] = 1; // always "Power":1 + json[command_name2 + F("RecallGlobalScene")] = true; + } else if ((cluster == 0x0006) && (cmd == 0x42)) { + // Power On With Timed Off Command + json[command_name] = 1; // always "Power":1 + json[command_name2 + F("OnlyWhenOn")] = xyz.x; + json[command_name2 + F("OnTime")] = xyz.y / 10.0f; + json[command_name2 + F("OffWait")] = xyz.z / 10.0f; + } + } else { // general case + bool extended_command = false; // do we send command with endpoint suffix + // if SO101 and multiple endpoints, append endpoint number + if (Settings.flag4.zb_index_ep) { + if (zigbee_devices.countEndpoints(shortaddr) > 0) { + command_name2 += srcendpoint; + extended_command = true; + } } - } else { if (0 == xyz.x_type) { json[command_name] = true; // no parameter + if (extended_command) { json[command_name2] = true; } } else if (0 == xyz.y_type) { json[command_name] = xyz.x; // 1 parameter + if (extended_command) { json[command_name2] = xyz.x; } } else { // multiple answers, create an array JsonArray &arr = json.createNestedArray(command_name); @@ -478,6 +506,14 @@ void convertClusterSpecific(JsonObject& json, uint16_t cluster, uint8_t cmd, boo if (xyz.z_type) { arr.add(xyz.z); } + if (extended_command) { + JsonArray &arr = json.createNestedArray(command_name2); + arr.add(xyz.x); + arr.add(xyz.y); + if (xyz.z_type) { + arr.add(xyz.z); + } + } } } } diff --git a/tasmota/xdrv_23_zigbee_7_statemachine.ino b/tasmota/xdrv_23_zigbee_7_statemachine.ino index fecf68fe9..ce741c027 100644 --- a/tasmota/xdrv_23_zigbee_7_statemachine.ino +++ b/tasmota/xdrv_23_zigbee_7_statemachine.ino @@ -114,8 +114,6 @@ const uint8_t ZIGBEE_LABEL_START_ROUTER = 13; // Start ZNP as router const uint8_t ZIGBEE_LABEL_INIT_DEVICE = 14; // Init ZNP as end-device const uint8_t ZIGBEE_LABEL_START_DEVICE = 15; // Start ZNP as end-device const uint8_t ZIGBEE_LABEL_START_ROUTER_DEVICE = 16; // Start common to router and device -const uint8_t ZIGBEE_LABEL_BOOT_OK = 17; // MCU has rebooted -const uint8_t ZIGBEE_LABEL_BOOT_TIME_OUT = 18; // MCU has not rebooted const uint8_t ZIGBEE_LABEL_FACT_RESET_ROUTER_DEVICE_POST = 19; // common post configuration for router and device const uint8_t ZIGBEE_LABEL_READY = 20; // goto label 20 for main loop const uint8_t ZIGBEE_LABEL_MAIN_LOOP = 21; // main loop @@ -206,13 +204,12 @@ ZBM(ZBR_ZNPHC, Z_SRSP | Z_SYS, SYS_OSAL_NV_READ, Z_SUCCESS, 0x01 /* len */, 0x55 ZBM(ZBS_PAN, Z_SREQ | Z_SAPI, SAPI_READ_CONFIGURATION, CONF_PANID ) // 260483 ZBR(ZBR_PAN, Z_SRSP | Z_SAPI, SAPI_READ_CONFIGURATION, Z_SUCCESS, CONF_PANID, 0x02 /* len */, - Z_B0(USE_ZIGBEE_PANID), Z_B1(USE_ZIGBEE_PANID) ) // 6604008302xxxx + 0x00, 0x00 /* pan_id */ ) // 6604008302xxxx ZBM(ZBS_EXTPAN, Z_SREQ | Z_SAPI, SAPI_READ_CONFIGURATION, CONF_EXTENDED_PAN_ID ) // 26042D ZBR(ZBR_EXTPAN, Z_SRSP | Z_SAPI, SAPI_READ_CONFIGURATION, Z_SUCCESS, CONF_EXTENDED_PAN_ID, 0x08 /* len */, - Z_B0(USE_ZIGBEE_EXTPANID), Z_B1(USE_ZIGBEE_EXTPANID), Z_B2(USE_ZIGBEE_EXTPANID), Z_B3(USE_ZIGBEE_EXTPANID), - Z_B4(USE_ZIGBEE_EXTPANID), Z_B5(USE_ZIGBEE_EXTPANID), Z_B6(USE_ZIGBEE_EXTPANID), Z_B7(USE_ZIGBEE_EXTPANID), + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ext_pan_id */ ) // 6604002D08xxxxxxxxxxxxxxxx ZBM(ZBS_CHANN, Z_SREQ | Z_SAPI, SAPI_READ_CONFIGURATION, CONF_CHANLIST ) // 260484 @@ -224,10 +221,8 @@ ZBR(ZBR_CHANN, Z_SRSP | Z_SAPI, SAPI_READ_CONFIGURATION, Z_SUCCESS, CONF_CHANLIS ZBM(ZBS_PFGK, Z_SREQ | Z_SAPI, SAPI_READ_CONFIGURATION, CONF_PRECFGKEY ) // 260462 ZBR(ZBR_PFGK, Z_SRSP | Z_SAPI, SAPI_READ_CONFIGURATION, Z_SUCCESS, CONF_PRECFGKEY, 0x10 /* len */, - Z_B0(USE_ZIGBEE_PRECFGKEY_L), Z_B1(USE_ZIGBEE_PRECFGKEY_L), Z_B2(USE_ZIGBEE_PRECFGKEY_L), Z_B3(USE_ZIGBEE_PRECFGKEY_L), - Z_B4(USE_ZIGBEE_PRECFGKEY_L), Z_B5(USE_ZIGBEE_PRECFGKEY_L), Z_B6(USE_ZIGBEE_PRECFGKEY_L), Z_B7(USE_ZIGBEE_PRECFGKEY_L), - Z_B0(USE_ZIGBEE_PRECFGKEY_H), Z_B1(USE_ZIGBEE_PRECFGKEY_H), Z_B2(USE_ZIGBEE_PRECFGKEY_H), Z_B3(USE_ZIGBEE_PRECFGKEY_H), - Z_B4(USE_ZIGBEE_PRECFGKEY_H), Z_B5(USE_ZIGBEE_PRECFGKEY_H), Z_B6(USE_ZIGBEE_PRECFGKEY_H), Z_B7(USE_ZIGBEE_PRECFGKEY_H), + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* key_l */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* key_h */ /*0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0D*/ ) // 660400621001030507090B0D0F00020406080A0C0D @@ -252,13 +247,12 @@ ZBM(ZBR_WNV_OK, Z_SRSP | Z_SYS, SYS_OSAL_NV_WRITE, Z_SUCCESS ) // 610900 - NV // Factory reset ZBM(ZBS_FACTRES, Z_SREQ | Z_SAPI, SAPI_WRITE_CONFIGURATION, CONF_STARTUP_OPTION, 0x01 /* len */, 0x03 ) // 2605030103 // Write PAN ID -ZBR(ZBS_W_PAN, Z_SREQ | Z_SAPI, SAPI_WRITE_CONFIGURATION, CONF_PANID, 0x02 /* len */, Z_B0(USE_ZIGBEE_PANID), Z_B1(USE_ZIGBEE_PANID) ) // 26058302xxxx +ZBR(ZBS_W_PAN, Z_SREQ | Z_SAPI, SAPI_WRITE_CONFIGURATION, CONF_PANID, 0x02 /* len */, 0x00, 0x00 /* pan_id */ ) // 26058302xxxx // Write Universal PAN ID ZBR(ZBS_W_ALL_PAN, Z_SREQ | Z_SAPI, SAPI_WRITE_CONFIGURATION, CONF_PANID, 0x02 /* len */, Z_B0(0xFFFF), Z_B1(0xFFFF) ) // 26058302FFFF // Write EXT PAN ID ZBR(ZBS_W_EXTPAN, Z_SREQ | Z_SAPI, SAPI_WRITE_CONFIGURATION, CONF_EXTENDED_PAN_ID, 0x08 /* len */, - Z_B0(USE_ZIGBEE_EXTPANID), Z_B1(USE_ZIGBEE_EXTPANID), Z_B2(USE_ZIGBEE_EXTPANID), Z_B3(USE_ZIGBEE_EXTPANID), - Z_B4(USE_ZIGBEE_EXTPANID), Z_B5(USE_ZIGBEE_EXTPANID), Z_B6(USE_ZIGBEE_EXTPANID), Z_B7(USE_ZIGBEE_EXTPANID) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ext_pan_id */ ) // 26052D086263151D004B1200 // Write Channel ID ZBR(ZBS_W_CHANN, Z_SREQ | Z_SAPI, SAPI_WRITE_CONFIGURATION, CONF_CHANLIST, 0x04 /* len */, @@ -278,11 +272,8 @@ ZBM(ZBS_W_LOGTYP_DEVICE, Z_SREQ | Z_SAPI, SAPI_WRITE_CONFIGURATION, CONF_LOGICAL // Write precfgkey ZBR(ZBS_W_PFGK, Z_SREQ | Z_SAPI, SAPI_WRITE_CONFIGURATION, CONF_PRECFGKEY, 0x10 /* len */, - Z_B0(USE_ZIGBEE_PRECFGKEY_L), Z_B1(USE_ZIGBEE_PRECFGKEY_L), Z_B2(USE_ZIGBEE_PRECFGKEY_L), Z_B3(USE_ZIGBEE_PRECFGKEY_L), - Z_B4(USE_ZIGBEE_PRECFGKEY_L), Z_B5(USE_ZIGBEE_PRECFGKEY_L), Z_B6(USE_ZIGBEE_PRECFGKEY_L), Z_B7(USE_ZIGBEE_PRECFGKEY_L), - Z_B0(USE_ZIGBEE_PRECFGKEY_H), Z_B1(USE_ZIGBEE_PRECFGKEY_H), Z_B2(USE_ZIGBEE_PRECFGKEY_H), Z_B3(USE_ZIGBEE_PRECFGKEY_H), - Z_B4(USE_ZIGBEE_PRECFGKEY_H), Z_B5(USE_ZIGBEE_PRECFGKEY_H), Z_B6(USE_ZIGBEE_PRECFGKEY_H), Z_B7(USE_ZIGBEE_PRECFGKEY_H), - /*0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* key_l */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* key_h */ /*0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0D*/ ) // 2605621001030507090B0D0F00020406080A0C0D // Write precfgkey enable ZBM(ZBS_W_PFGKEN, Z_SREQ | Z_SAPI, SAPI_WRITE_CONFIGURATION, CONF_PRECFGKEYS_ENABLE, 0x01 /* len */, 0x00 ) // 2605630100 @@ -430,18 +421,12 @@ static const Zigbee_Instruction zb_prog[] PROGMEM = { ZI_WAIT(10500) // wait for 10 seconds for Tasmota to stabilize //ZI_MQTT_STATE(ZIGBEE_STATUS_BOOT, "Booting") - //ZI_LOG(LOG_LEVEL_INFO, D_LOG_ZIGBEE "rebooting device") - ZI_ON_TIMEOUT_GOTO(ZIGBEE_LABEL_BOOT_TIME_OUT) // give a second chance - ZI_SEND(ZBS_RESET) // reboot cc2530 just in case we rebooted ESP8266 but not cc2530 - ZI_WAIT_RECV_FUNC(5000, ZBR_RESET, &ZNP_Reboot) // timeout 5s - ZI_GOTO(ZIGBEE_LABEL_BOOT_OK) + ZI_LOG(LOG_LEVEL_INFO, D_LOG_ZIGBEE "rebooting CC2530 device") - ZI_LABEL(ZIGBEE_LABEL_BOOT_TIME_OUT) - ZI_ON_TIMEOUT_GOTO(ZIGBEE_LABEL_ABORT) - ZI_SEND(ZBS_RESET) // reboot cc2530 just in case we rebooted ESP8266 but not cc2530 + ZI_CALL(&ZNP_Reset_Device, 0) // LOW = reset + ZI_WAIT(100) // wait for .1 second + ZI_CALL(&ZNP_Reset_Device, 1) // HIGH = release reset ZI_WAIT_RECV_FUNC(5000, ZBR_RESET, &ZNP_Reboot) // timeout 5s - - ZI_LABEL(ZIGBEE_LABEL_BOOT_OK) ZI_WAIT(100) ZI_LOG(LOG_LEVEL_DEBUG, kCheckingDeviceConfiguration) // Log Debug: checking device configuration ZI_SEND(ZBS_VERSION) // check ZNP software version @@ -701,11 +686,8 @@ ZBR(ZBS_SET_SECURITY, EZSP_setInitialSecurityState, 0x00 /*high*/, // preConfiguredKey 0x5A, 0x69, 0x67, 0x42, 0x65, 0x65, 0x41, 0x6C, 0x6C, 0x69, 0x61, 0x6E, 0x63, 0x65, 0x30, 0x39, // well known key "ZigBeeAlliance09" // networkKey - Z_B0(USE_ZIGBEE_PRECFGKEY_L), Z_B1(USE_ZIGBEE_PRECFGKEY_L), Z_B2(USE_ZIGBEE_PRECFGKEY_L), Z_B3(USE_ZIGBEE_PRECFGKEY_L), - Z_B4(USE_ZIGBEE_PRECFGKEY_L), Z_B5(USE_ZIGBEE_PRECFGKEY_L), Z_B6(USE_ZIGBEE_PRECFGKEY_L), Z_B7(USE_ZIGBEE_PRECFGKEY_L), - Z_B0(USE_ZIGBEE_PRECFGKEY_H), Z_B1(USE_ZIGBEE_PRECFGKEY_H), Z_B2(USE_ZIGBEE_PRECFGKEY_H), Z_B3(USE_ZIGBEE_PRECFGKEY_H), - Z_B4(USE_ZIGBEE_PRECFGKEY_H), Z_B5(USE_ZIGBEE_PRECFGKEY_H), Z_B6(USE_ZIGBEE_PRECFGKEY_H), Z_B7(USE_ZIGBEE_PRECFGKEY_H), - 0x00 /*sequence*/, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* key_l */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* key_h */ 0x00 /*sequence*/, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*trustcenter*/ ) ZBM(ZBR_SET_SECURITY, EZSP_setInitialSecurityState, 0x00 /*high*/, 0x00 /*status*/) @@ -718,7 +700,7 @@ ZBM(ZBS_SET_POLICY_02, EZSP_setPolicy, 0x00 /*high*/, EZSP_UNICAST_REPLIES_PO ZBM(ZBS_SET_POLICY_03, EZSP_setPolicy, 0x00 /*high*/, EZSP_POLL_HANDLER_POLICY, EZSP_POLL_HANDLER_IGNORE) // 55000330 ZBM(ZBS_SET_POLICY_04, EZSP_setPolicy, 0x00 /*high*/, EZSP_MESSAGE_CONTENTS_IN_CALLBACK_POLICY, - EZSP_MESSAGE_TAG_AND_CONTENTS_IN_CALLBACK) // 55000441 + EZSP_MESSAGE_TAG_ONLY_IN_CALLBACK) // 55000440 ZBM(ZBS_SET_POLICY_05, EZSP_setPolicy, 0x00 /*high*/, EZSP_TC_KEY_REQUEST_POLICY, EZSP_ALLOW_TC_KEY_REQUESTS_AND_SEND_CURRENT_KEY) // 55000551 ZBM(ZBS_SET_POLICY_06, EZSP_setPolicy, 0x00 /*high*/, EZSP_APP_KEY_REQUEST_POLICY, @@ -731,9 +713,8 @@ ZBM(ZBR_NETWORK_INIT, EZSP_networkInit, 0x00 /*high*/, 0x00 /*status*/) // // formNetwork - i.e. start zigbee network as coordinator ZBR(ZBS_FORM_NETWORK, EZSP_formNetwork, 0x00 /*high*/, - Z_B0(USE_ZIGBEE_EXTPANID), Z_B1(USE_ZIGBEE_EXTPANID), Z_B2(USE_ZIGBEE_EXTPANID), Z_B3(USE_ZIGBEE_EXTPANID), - Z_B4(USE_ZIGBEE_EXTPANID), Z_B5(USE_ZIGBEE_EXTPANID), Z_B6(USE_ZIGBEE_EXTPANID), Z_B7(USE_ZIGBEE_EXTPANID), - Z_B0(USE_ZIGBEE_PANID), Z_B1(USE_ZIGBEE_PANID), + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ext_pan_id */ + 0x00, 0x00, // pan_id USE_ZIGBEE_TXRADIO_DBM /*radioTxPower*/, USE_ZIGBEE_CHANNEL /*channel*/, EMBER_USE_MAC_ASSOCIATION, @@ -754,9 +735,8 @@ ZBM(ZBR_GET_NETW_PARM, EZSP_getNetworkParameters, 0x00 /*high*/, 0x00 /*ok*/) ZBR(ZBR_CHECK_NETW_PARM, EZSP_getNetworkParameters, 0x00 /*high*/, 0x00 /*status*/, EMBER_COORDINATOR /*0x01*/, - Z_B0(USE_ZIGBEE_EXTPANID), Z_B1(USE_ZIGBEE_EXTPANID), Z_B2(USE_ZIGBEE_EXTPANID), Z_B3(USE_ZIGBEE_EXTPANID), - Z_B4(USE_ZIGBEE_EXTPANID), Z_B5(USE_ZIGBEE_EXTPANID), Z_B6(USE_ZIGBEE_EXTPANID), Z_B7(USE_ZIGBEE_EXTPANID), - Z_B0(USE_ZIGBEE_PANID), Z_B1(USE_ZIGBEE_PANID), + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ext_pan_id */ + 0x00, 0x00, // pan_id USE_ZIGBEE_TXRADIO_DBM /*radioTxPower*/, USE_ZIGBEE_CHANNEL /*channel*/, ) // 2800... @@ -892,7 +872,9 @@ static const Zigbee_Instruction zb_prog[] PROGMEM = { ZI_WAIT_RECV(1500, ZBR_NETWORK_UP) // wait for network to start // check if configuration is ok ZI_SEND(ZBS_GET_CURR_SEC) ZI_WAIT_RECV(500, ZBR_GET_CURR_SEC) - ZI_SEND(ZBS_GET_NETW_PARM) ZI_WAIT_RECV(500, ZBR_CHECK_NETW_PARM) + ZI_SEND(ZBS_GET_EUI64) ZI_WAIT_RECV_FUNC(500, ZBR_GET_EUI64, &EZ_GetEUI64) + ZI_SEND(ZBS_GET_NETW_PARM) ZI_WAIT_RECV_FUNC(500, ZBR_CHECK_NETW_PARM, &EZ_NetworkParameters) + // all ok, proceed to next step ZI_GOTO(ZIGBEE_LABEL_NETWORK_CONFIGURED) @@ -916,14 +898,15 @@ static const Zigbee_Instruction zb_prog[] PROGMEM = { // Query device information ZI_SEND(ZBS_GET_EUI64) ZI_WAIT_RECV_FUNC(500, ZBR_GET_EUI64, &EZ_GetEUI64) ZI_SEND(ZBS_GET_NODEID) ZI_WAIT_RECV_FUNC(500, ZBR_GET_NODEID, &EZ_GetNodeId) - ZI_SEND(ZBS_GET_NETW_PARM) ZI_WAIT_RECV_FUNC(500, ZBR_GET_NETW_PARM, &EZ_NetworkParameters) ZI_LABEL(ZIGBEE_LABEL_READY) ZI_MQTT_STATE(ZIGBEE_STATUS_OK, kStarted) ZI_LOG(LOG_LEVEL_INFO, kZigbeeStarted) ZI_CALL(&Z_State_Ready, 1) // Now accept incoming messages ZI_CALL(&Z_Load_Devices, 0) +#ifndef USE_ZIGBEE_NO_READ_ATTRIBUTES ZI_CALL(&Z_Query_Bulbs, 0) +#endif ZI_LABEL(ZIGBEE_LABEL_MAIN_LOOP) ZI_WAIT_FOREVER() @@ -1097,8 +1080,7 @@ void ZigbeeStateMachine_Run(void) { const char *f_msg = (const char*) cur_ptr1; Response_P(PSTR("{\"" D_JSON_ZIGBEE_STATE "\":{\"Status\":%d,\"Message\":\"%s\"}}"), cur_d8, f_msg); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); } break; case ZGB_INSTR_SEND: @@ -1106,7 +1088,7 @@ void ZigbeeStateMachine_Run(void) { ZigbeeZNPSend((uint8_t*) cur_ptr1, cur_d8 /* len */); #endif // USE_ZIGBEE_ZNP #ifdef USE_ZIGBEE_EZSP - ZigbeeEZSPSendCmd((uint8_t*) cur_ptr1, cur_d8 /* len */, true); // send cancel byte + ZigbeeEZSPSendCmd((uint8_t*) cur_ptr1, cur_d8 /* len */); // send cancel byte #endif // USE_ZIGBEE_EZSP break; case ZGB_INSTR_WAIT_UNTIL: diff --git a/tasmota/xdrv_23_zigbee_8_parsers.ino b/tasmota/xdrv_23_zigbee_8_parsers.ino index a94a07aeb..5814538ff 100644 --- a/tasmota/xdrv_23_zigbee_8_parsers.ino +++ b/tasmota/xdrv_23_zigbee_8_parsers.ino @@ -20,6 +20,16 @@ #ifdef USE_ZIGBEE #ifdef USE_ZIGBEE_EZSP +// +// Trying to get a uniform LQI measure, we are aligning with the definition of ZNP +// I.e. a linear projection from -87dBm to +10dB over 0..255 +// for ZNP, lqi is linear from -87 to +10 dBm (https://sunmaysky.blogspot.com/2017/02/conversion-between-rssi-and-lqi-in-z.html) +uint8_t ZNP_RSSI2Lqi(int8_t rssi) { + if (rssi < -87) { rssi = -87; } + if (rssi > 10) { rssi = 10; } + return changeUIntScale(rssi + 87, 0, 87+10, 0, 255); +} + /*********************************************************************************************\ * Parsers for incoming EZSP messages \*********************************************************************************************/ @@ -43,8 +53,7 @@ int32_t EZ_RSTACK(uint8_t reset_code) { ",\"Code\":%d}}"), ZIGBEE_STATUS_BOOT, reason_str, reset_code); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); } // EZSP: received ASH "ERROR" frame, indicating that the MCU finished boot @@ -60,8 +69,7 @@ int32_t EZ_ERROR(uint8_t error_code) { ",\"Code\":%d}}"), ZIGBEE_STATUS_ABORT, reason_str, error_code); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); } int32_t EZ_ReadAPSUnicastMessage(int32_t res, class SBuffer &buf) { @@ -112,12 +120,48 @@ int32_t EZ_NetworkParameters(int32_t res, class SBuffer &buf) { ",\"DeviceType\":%d}}"), ZIGBEE_STATUS_EZ_INFO, hex, localShortAddr, node_type); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); return res; } +// +// Handle a "incomingRouteErrorHandler" incoming message +// +int32_t EZ_RouteError(int32_t res, const class SBuffer &buf) { + uint8_t status = buf.get8(2); + uint16_t shortaddr = buf.get16(3); + + Response_P(PSTR("{\"" D_JSON_ZIGBEE_ROUTE_ERROR "\":{" + "\"ShortAddr\":\"0x%04X\",\"" D_JSON_ZIGBEE_STATUS "\":%d,\"" D_JSON_ZIGBEE_STATUS_MSG "\":\"%s\"}}"), + shortaddr, status, getEmberStatus(status).c_str()); + + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); + + return -1; +} + +// +// Handle a "permitJoining" incoming message +// +int32_t EZ_PermitJoinRsp(int32_t res, const class SBuffer &buf) { + uint8_t status = buf.get8(2); + + Response_P(PSTR("{\"" D_JSON_ZIGBEE_STATE "\":{" + "\"Status\":%d,\"Message\":\"%s"), + (0 == status) ? ZIGBEE_STATUS_PERMITJOIN_OPEN_60 : ZIGBEE_STATUS_PERMITJOIN_CLOSE, + (0 == status) ? PSTR("Pairing mode enabled") : PSTR("Pairing mode error") + ); + if (status) { + ResponseAppend_P("0x%02X", status); + } + ResponseAppend_P(PSTR("\"}}")); + + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); + + return -1; +} + #endif // USE_ZIGBEE_EZSP /*********************************************************************************************\ @@ -161,8 +205,7 @@ int32_t Z_EZSPNetworkParameters(int32_t res, class SBuffer &buf) { ",\"DeviceType\":%d}}"), ZIGBEE_STATUS_EZ_INFO, hex, localShortAddr, node_type); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); return res; } @@ -212,10 +255,8 @@ int32_t ZNP_ReceiveDeviceInfo(int32_t res, class SBuffer &buf) { ResponseAppend_P(PSTR("]")); } - ResponseJsonEnd(); // append '}' - ResponseJsonEnd(); // append '}' - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - XdrvRulesProcess(); + ResponseJsonEndEnd(); // append '}}' + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); return res; } @@ -257,8 +298,7 @@ int32_t ZNP_Reboot(int32_t res, class SBuffer &buf) { ZIGBEE_STATUS_BOOT, reason_str, major_rel, minor_rel); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); if ((0x02 == major_rel) && (0x06 == minor_rel)) { return 0; // version 2.6.x is ok @@ -289,8 +329,7 @@ int32_t ZNP_ReceiveCheckVersion(int32_t res, class SBuffer &buf) { ZIGBEE_STATUS_CC_VERSION, major_rel, minor_rel, maint_rel, revision); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); if ((0x02 == major_rel) && (0x06 == minor_rel)) { return 0; // version 2.6.x is ok @@ -318,8 +357,7 @@ int32_t EZ_ReceiveCheckVersion(int32_t res, class SBuffer &buf) { stack_type ); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); if (0x08 == protocol_version) { return 0; // protocol v8 is ok @@ -394,8 +432,7 @@ int32_t ZNP_ReceivePermitJoinStatus(int32_t res, const class SBuffer &buf) { ResponseAppend_P(message, duration); ResponseAppend_P(PSTR("\"}}")); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); return -1; } @@ -435,8 +472,7 @@ int32_t ZNP_ReceiveNodeDesc(int32_t res, const class SBuffer &buf) { complexDescriptorAvailable ? PSTR("true") : PSTR("false") ); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); } return -1; @@ -473,8 +509,7 @@ int32_t Z_ReceiveActiveEp(int32_t res, const class SBuffer &buf) { ResponseAppend_P(PSTR("\"0x%02X\""), activeEpList[i]); } ResponseAppend_P(PSTR("]}}")); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); Z_SendAFInfoRequest(nwkAddr); // probe for ModelId and ManufId @@ -515,8 +550,7 @@ int32_t Z_ReceiveIEEEAddr(int32_t res, const class SBuffer &buf) { } ResponseAppend_P(PSTR("\"}}")); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); } return -1; } @@ -534,8 +568,7 @@ int32_t ZNP_DataConfirm(int32_t res, const class SBuffer &buf) { ",\"" D_JSON_ZIGBEE_STATUS "\":%d" ",\"" D_JSON_ZIGBEE_STATUS_MSG "\":\"%s\"" "}}"), endpoint, status, getZigbeeStatusMessage(status).c_str()); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); } return -1; @@ -591,8 +624,7 @@ int32_t ZNP_ReceiveStateChange(int32_t res, const class SBuffer &buf) { ZIGBEE_STATUS_SCANNING, state, msg ); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); } if ((ZDO_DEV_END_DEVICE == state) || (ZDO_DEV_ROUTER == state) || (ZDO_DEV_ZB_COORD == state)) { @@ -637,8 +669,7 @@ int32_t Z_ReceiveEndDeviceAnnonce(int32_t res, const class SBuffer &buf) { uint32_t wait_ms = 2000; // wait for 2s Z_Query_Bulb(nwkAddr, wait_ms); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); Z_SendActiveEpReq(nwkAddr); return -1; } @@ -662,8 +693,7 @@ int32_t ZNP_ReceiveTCDevInd(int32_t res, const class SBuffer &buf) { ZIGBEE_STATUS_DEVICE_INDICATION, hex, srcAddr, parentNw ); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); return -1; } @@ -692,8 +722,7 @@ int32_t Z_BindRsp(int32_t res, const class SBuffer &buf) { ",\"" D_JSON_ZIGBEE_STATUS_MSG "\":\"%s\"" "}}"), status, msg.c_str()); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); return -1; } @@ -723,8 +752,7 @@ int32_t Z_UnbindRsp(int32_t res, const class SBuffer &buf) { ",\"" D_JSON_ZIGBEE_STATUS_MSG "\":\"%s\"" "}}"), status, msg.c_str()); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); return -1; } @@ -758,8 +786,9 @@ int32_t Z_MgmtBindRsp(int32_t res, const class SBuffer &buf) { ResponseAppend_P(PSTR(",\"" D_JSON_ZIGBEE_STATUS "\":%d" ",\"" D_JSON_ZIGBEE_STATUS_MSG "\":\"%s\"" ",\"BindingsTotal\":%d" + ",\"BindingsStart\":%d" ",\"Bindings\":[" - ), status, getZigbeeStatusMessage(status).c_str(), bind_total); + ), status, getZigbeeStatusMessage(status).c_str(), bind_total, bind_start + 1); uint32_t idx = prefix_len; for (uint32_t i = 0; i < bind_len; i++) { @@ -799,12 +828,69 @@ int32_t Z_MgmtBindRsp(int32_t res, const class SBuffer &buf) { ResponseAppend_P(PSTR("]}}")); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_BIND_STATE)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_BIND_STATE)); return -1; } +#ifdef USE_ZIGBEE_EZSP +// +// Handle Parent Annonce Rsp incoming message +// +// rsp: true = ZDO_Parent_annce_rsp, false = ZDO_Parent_annce +int32_t EZ_ParentAnnceRsp(int32_t res, const class SBuffer &buf, bool rsp) { + size_t prefix_len; + uint8_t status; + uint8_t num_children; + uint16_t shortaddr = buf.get16(buf.len()-2); + if (rsp) { + status = buf.get8(0); + num_children = buf.get8(1); + prefix_len = 2; + } else { + status = 0; + num_children = buf.get8(0); + prefix_len = 1; + } + + const char * friendlyName = zigbee_devices.getFriendlyName(shortaddr); + + Response_P(PSTR("{\"" D_JSON_ZIGBEE_PARENT "\":{\"" D_JSON_ZIGBEE_DEVICE "\":\"0x%04X\""), shortaddr); + if (friendlyName) { + ResponseAppend_P(PSTR(",\"" D_JSON_ZIGBEE_NAME "\":\"%s\""), friendlyName); + } + if (rsp) { + ResponseAppend_P(PSTR(",\"" D_JSON_ZIGBEE_STATUS "\":%d" + ",\"" D_JSON_ZIGBEE_STATUS_MSG "\":\"%s\"" + ), status, getZigbeeStatusMessage(status).c_str()); + } + ResponseAppend_P(PSTR(",\"Children\":%d" + ",\"ChildInfo\":[" + ), num_children); + + uint32_t idx = prefix_len; + for (uint32_t i = 0; i < num_children; i++) { + if (idx + 8 > buf.len()) { break; } // overflow, frame size is between 14 and 21 + + uint64_t child_ieee = buf.get64(idx); + idx += 8; + + if (i > 0) { + ResponseAppend_P(PSTR(",")); + } + char hex[20]; + Uint64toHex(child_ieee, hex, 64); + ResponseAppend_P(PSTR("\"0x%s\""), hex); + } + + ResponseAppend_P(PSTR("]}}")); + + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_BIND_STATE)); + + return -1; +} +#endif // USE_ZIGBEE_EZSP + /*********************************************************************************************\ * Send specific ZNP messages \*********************************************************************************************/ @@ -880,8 +966,7 @@ int32_t EZ_ReceiveTCJoinHandler(int32_t res, const class SBuffer &buf) { status, decision ); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEEZCL_RECEIVED)); } return -1; } @@ -987,25 +1072,46 @@ void EZ_SendZDO(uint16_t shortaddr, uint16_t cmd, const unsigned char *payload, SBuffer buf(payload_len + 22); uint8_t seq = zigbee_devices.getNextSeqNumber(0x0000); - buf.add16(EZSP_sendUnicast); + if (shortaddr < 0xFFFC) { + // send unicast + buf.add16(EZSP_sendUnicast); - buf.add8(EMBER_OUTGOING_DIRECT); // 00 - buf.add16(shortaddr); // dest addr - // ApsFrame - buf.add16(0x0000); // ZOD profile - buf.add16(cmd); // ZDO cmd in cluster - buf.add8(0); // srcEp - buf.add8(0); // dstEp - buf.add16(EMBER_APS_OPTION_ENABLE_ROUTE_DISCOVERY | EMBER_APS_OPTION_RETRY); // APS frame - buf.add16(0x0000); // groupId - buf.add8(seq); - // end of ApsFrame - buf.add8(0x01); // tag TODO - buf.add8(payload_len + 1); // insert seq number - buf.add8(seq); - buf.addBuffer(payload, payload_len); + buf.add8(EMBER_OUTGOING_DIRECT); // 00 + buf.add16(shortaddr); // dest addr + // ApsFrame + buf.add16(0x0000); // ZOD profile + buf.add16(cmd); // ZDO cmd in cluster + buf.add8(0); // srcEp + buf.add8(0); // dstEp + buf.add16(EMBER_APS_OPTION_ENABLE_ROUTE_DISCOVERY | EMBER_APS_OPTION_RETRY); // APS frame + buf.add16(0x0000); // groupId + buf.add8(seq); + // end of ApsFrame + buf.add8(0x01); // tag TODO + buf.add8(payload_len + 1); // insert seq number + buf.add8(seq); + buf.addBuffer(payload, payload_len); + } else { + // send broadcast + buf.add16(EZSP_sendBroadcast); + buf.add16(shortaddr); // dest addr + // ApsFrame + buf.add16(0x0000); // ZOD profile + buf.add16(cmd); // ZDO cmd in cluster + buf.add8(0); // srcEp + buf.add8(0); // dstEp + buf.add16(0x00); // APS frame + buf.add16(0x0000); // groupId + buf.add8(seq); + // end of ApsFrame + buf.add8(0x1E); // radius + buf.add8(0x01); // tag TODO + buf.add8(payload_len + 1); // insert seq number + buf.add8(seq); + buf.addBuffer(payload, payload_len); + } - ZigbeeEZSPSendCmd(buf.buf(), buf.len(), true); + ZigbeeEZSPSendCmd(buf.buf(), buf.len()); } /*********************************************************************************************\ @@ -1023,8 +1129,9 @@ int32_t EZ_IncomingMessage(int32_t res, const class SBuffer &buf) { bool securityuse = (apsoptions & EMBER_APS_OPTION_ENCRYPTION) ? true : false; uint16_t groupid = buf.get16(11); uint8_t seqnumber = buf.get8(13); - uint8_t linkquality = buf.get8(14); - // uint8_t linkrsssi = buf.get8(15); // probably not used as there is no equivalent in Z-Stack + // uint8_t linkquality = buf.get8(14); + int8_t linkrssi = buf.get8(15); + uint8_t linkquality = ZNP_RSSI2Lqi(linkrssi); // don't take EZSP LQI but calculate our own based on ZNP uint16_t srcaddr = buf.get16(16); // uint8_t bindingindex = buf.get8(18); // not sure we need this one as a coordinator // uint8_t addressindex = buf.get8(19); // not sure how to handle this one @@ -1051,6 +1158,14 @@ int32_t EZ_IncomingMessage(int32_t res, const class SBuffer &buf) { return Z_UnbindRsp(res, zdo_buf); case ZDO_Mgmt_Bind_rsp: return Z_MgmtBindRsp(res, zdo_buf); + case ZDO_Parent_annce: + return EZ_ParentAnnceRsp(res, zdo_buf, false); + case ZDO_Parent_annce_rsp: + return EZ_ParentAnnceRsp(res, zdo_buf, true); + default: + // TODO move later to LOG_LEVEL_DEBUG + AddLog_P2(LOG_LEVEL_INFO, PSTR("ZIG: Internal ZDO message 0x%04X sent from 0x%04X %s"), clusterid, srcaddr, wasbroadcast ? PSTR("(broadcast)") : ""); + break; } } else { bool defer_attributes = false; // do we defer attributes reporting to coalesce @@ -1065,14 +1180,18 @@ int32_t EZ_IncomingMessage(int32_t res, const class SBuffer &buf) { } // -// Callback for loading Zigbee configuration from Flash, called by the state machine +// Callback for resetting the NCP, called by the state machine // // value = 0 : drive reset pin and halt MCU // value = 1 : release the reset pin, restart int32_t EZ_Reset_Device(uint8_t value) { +/* // we use Led4i to drive the reset pin. Since it is reverted we need to pass 1 to start reset, and 0 to release reset if (PinUsed(GPIO_LED1, ZIGBEE_EZSP_RESET_LED - 1)) { SetLedPowerIdx(ZIGBEE_EZSP_RESET_LED - 1, value ? 0 : 1); +*/ + if (PinUsed(GPIO_ZIGBEE_RST)) { + digitalWrite(Pin(GPIO_ZIGBEE_RST), value); } else { // no GPIO so we use software Reset instead if (value) { // send reset only when we are supposed to release reset @@ -1102,6 +1221,12 @@ int32_t EZ_Recv_Default(int32_t res, const class SBuffer &buf) { case EZSP_trustCenterJoinHandler: return EZ_ReceiveTCJoinHandler(res, buf); break; + case EZSP_incomingRouteErrorHandler: + return EZ_RouteError(res, buf); + break; + case EZSP_permitJoining: + return EZ_PermitJoinRsp(res, buf); + break; } return -1; } @@ -1147,6 +1272,30 @@ int32_t Z_PublishAttributes(uint16_t shortaddr, uint16_t groupaddr, uint16_t clu #ifdef USE_ZIGBEE_ZNP +// +// Callback for resetting the NCP, called by the state machine +// +// value = 0 : drive reset pin and halt MCU +// value = 1 : release the reset pin, restart +int32_t ZNP_Reset_Device(uint8_t value) { +/* + // we use Led4i to drive the reset pin. Since it is reverted we need to pass 1 to start reset, and 0 to release reset + if (PinUsed(GPIO_LED1, ZIGBEE_EZSP_RESET_LED - 1)) { + SetLedPowerIdx(ZIGBEE_EZSP_RESET_LED - 1, value ? 0 : 1); +*/ + if (PinUsed(GPIO_ZIGBEE_RST)) { + digitalWrite(Pin(GPIO_ZIGBEE_RST), value); + } else { + // no GPIO so we use software Reset instead + if (value) { // send reset only when we are supposed to release reset + // flush the serial buffer, sending 0xFF 256 times. + ZigbeeZNPFlush(); + ZigbeeZNPSend(ZBS_RESET, sizeof(ZBS_RESET)); + } + } + return 0; // continue +} + int32_t ZNP_ReceiveAfIncomingMessage(int32_t res, const class SBuffer &buf) { uint16_t groupid = buf.get16(2); uint16_t clusterid = buf.get16(4); @@ -1178,30 +1327,6 @@ int32_t ZNP_ReceiveAfIncomingMessage(int32_t res, const class SBuffer &buf) { * Global dispatcher for incoming messages \*********************************************************************************************/ -int32_t Z_ReceiveAfIncomingMessage(int32_t res, const class SBuffer &buf) { - uint16_t groupid = buf.get16(2); - uint16_t clusterid = buf.get16(4); - uint16_t srcaddr = buf.get16(6); - uint8_t srcendpoint = buf.get8(8); - uint8_t dstendpoint = buf.get8(9); - uint8_t wasbroadcast = buf.get8(10); - uint8_t linkquality = buf.get8(11); - uint8_t securityuse = buf.get8(12); - // uint32_t timestamp = buf.get32(13); - uint8_t seqnumber = buf.get8(17); - - bool defer_attributes = false; // do we defer attributes reporting to coalesce - - ZCLFrame zcl_received = ZCLFrame::parseRawFrame(buf, 19, buf.get8(18), clusterid, groupid, - srcaddr, - srcendpoint, dstendpoint, wasbroadcast, - linkquality, securityuse, seqnumber); - // - Z_IncomingMessage(zcl_received); - - return -1; -} - #ifdef USE_ZIGBEE_ZNP // Structure for the Dispatcher callbacks table diff --git a/tasmota/xdrv_23_zigbee_9_serial.ino b/tasmota/xdrv_23_zigbee_9_serial.ino index aeefe8ae4..c8a9953a1 100644 --- a/tasmota/xdrv_23_zigbee_9_serial.ino +++ b/tasmota/xdrv_23_zigbee_9_serial.ino @@ -36,11 +36,15 @@ const uint32_t ZIGBEE_LED_SEND = 0; // LED<2> blinks when receiving class EZSP_Serial_t { public: - uint8_t to_ack = 0; // 0..7, frame number of next id to send + uint8_t to_send = 0; // 0..7, frame number of next packet to send, nothing to send if equal to to_end + uint8_t to_end = 0; // 0..7, frame number of next packet to send + uint8_t to_ack = 0; // 0..7, frame number of last packet acknowledged + 1 uint8_t from_ack = 0; // 0..7, frame to ack uint8_t ezsp_seq = 0; // 0..255, EZSP sequence number + SBuffer *to_packets[8] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; }; + EZSP_Serial_t EZSP_Serial; #endif // USE_ZIGBEE_EZSP @@ -114,7 +118,7 @@ void ZigbeeInputLoop(void) { char hex_char[(zigbee_buffer->len() * 2) + 2]; ToHex_P((unsigned char*)zigbee_buffer->getBuffer(), zigbee_buffer->len(), hex_char, sizeof(hex_char)); - AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ZIGBEE "Bytes follow_read_metric = %0d"), ZigbeeSerial->getLoopReadMetric()); + // AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ZIGBEE "Bytes follow_read_metric = %0d"), ZigbeeSerial->getLoopReadMetric()); // buffer received, now check integrity if (zigbee_buffer->len() != zigbee_frame_len) { // Len is not correct, log and reject frame @@ -131,8 +135,7 @@ void ZigbeeInputLoop(void) { ToHex_P((unsigned char*)znp_buffer.getBuffer(), znp_buffer.len(), hex_char, sizeof(hex_char)); Response_P(PSTR("{\"" D_JSON_ZIGBEEZNPRECEIVED "\":\"%s\"}"), hex_char); if (Settings.flag3.tuya_serial_mqtt_publish) { - MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR)); } else { AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "%s"), mqtt_data); } @@ -160,7 +163,7 @@ void ZigbeeInputLoop(void) { yield(); uint8_t zigbee_in_byte = ZigbeeSerial->read(); - AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: ZbInput byte=0x%02X len=%d"), zigbee_in_byte, zigbee_buffer->len()); + // AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: ZbInput byte=0x%02X len=%d"), zigbee_in_byte, zigbee_buffer->len()); // if (0 == zigbee_buffer->len()) { // make sure all variables are correctly initialized // escape = false; @@ -172,13 +175,13 @@ void ZigbeeInputLoop(void) { } if (ZIGBEE_EZSP_ESCAPE == zigbee_in_byte) { - AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: Escape byte received")); + // AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: Escape byte received")); escape = true; continue; } if (ZIGBEE_EZSP_CANCEL == zigbee_in_byte) { - AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: ZbInput byte=0x1A, cancel byte received, discarding %d bytes"), zigbee_buffer->len()); + // AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: ZbInput byte=0x1A, cancel byte received, discarding %d bytes"), zigbee_buffer->len()); zigbee_buffer->setLen(0); // empty buffer escape = false; frame_complete = false; @@ -194,7 +197,7 @@ void ZigbeeInputLoop(void) { if (zigbee_buffer->len() < ZIGBEE_BUFFER_SIZE) { if (escape) { // invert bit 5 - zigbee_in_byte ^= 0x20; + zigbee_in_byte ^= 0x20; escape = false; } @@ -212,7 +215,7 @@ void ZigbeeInputLoop(void) { char hex_char[frame_len * 2 + 2]; ToHex_P((unsigned char*)zigbee_buffer->getBuffer(), zigbee_buffer->len(), hex_char, sizeof(hex_char)); - AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ZIGBEE "Bytes follow_read_metric = %0d"), ZigbeeSerial->getLoopReadMetric()); + // AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ZIGBEE "Bytes follow_read_metric = %0d"), ZigbeeSerial->getLoopReadMetric()); if ((frame_complete) && (frame_len >= 3)) { // frame received and has at least 3 bytes (without EOF), checking CRC // AddLog_P2(LOG_LEVEL_INFO, PSTR(D_JSON_ZIGBEE_EZSP_RECEIVED ": received raw frame %s"), hex_char); @@ -250,13 +253,7 @@ void ZigbeeInputLoop(void) { } ToHex_P((unsigned char*)ezsp_buffer.getBuffer(), ezsp_buffer.len(), hex_char, sizeof(hex_char)); - Response_P(PSTR("{\"" D_JSON_ZIGBEE_EZSP_RECEIVED "2\":\"%s\"}"), hex_char); - if (Settings.flag3.tuya_serial_mqtt_publish) { - MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR)); - XdrvRulesProcess(); - } else { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "%s"), mqtt_data); // TODO move to LOG_LEVEL_DEBUG when stable - } + AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ZIGBEE "{\"" D_JSON_ZIGBEE_EZSP_RECEIVED "2\":\"%s\"}"), hex_char); // now process the message ZigbeeProcessInputRaw(ezsp_buffer); } @@ -294,6 +291,12 @@ void ZigbeeInitSerial(void) zigbee_buffer = new SBuffer(ZIGBEE_BUFFER_SIZE); // AddLog_P2(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem3 = %d"), ESP_getFreeHeap()); } + + if (PinUsed(GPIO_ZIGBEE_RST)) { + pinMode(Pin(GPIO_ZIGBEE_RST), OUTPUT); + digitalWrite(Pin(GPIO_ZIGBEE_RST), 1); + } + zigbee.active = true; zigbee.init_phase = true; // start the state machine zigbee.state_machine = true; // start the state machine @@ -304,6 +307,16 @@ void ZigbeeInitSerial(void) #ifdef USE_ZIGBEE_ZNP +// flush any ongoing frame, sending 256 times 0xFF +void ZigbeeZNPFlush(void) { + if (ZigbeeSerial) { + for (uint32_t i = 0; i < 256; i++) { + ZigbeeSerial->write(0xFF); + } + AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE D_JSON_ZIGBEEZNPSENT " 0xFF x 255")); + } +} + void ZigbeeZNPSend(const uint8_t *msg, size_t len) { if ((len < 2) || (len > 252)) { // abort, message cannot be less than 2 bytes for CMD1 and CMD2 @@ -435,7 +448,7 @@ void ZigbeeEZSPSendRaw(const uint8_t *msg, size_t len, bool send_cancel) { bool data_frame = (0 == (msg[0] & 0x80)); uint8_t rand = 0x42; // pseudo-randomizer initial value uint16_t crc = 0xFFFF; // CRC16 CCITT initialization - + for (uint32_t i=0; iset8(0, control_byte); // change control_byte // send - ZigbeeEZSPSendRaw(buf.getBuffer(), buf.len(), send_cancel); + ZigbeeEZSPSendRaw(buf->getBuffer(), buf->len(), send_cancel); } -// Receive a high-level EZSP command/response, starting with 16-bits frame ID +// Send an EZSP DATA frame, automatically calculating the correct frame numbers +void ZigbeeEZSPSendDATA(const uint8_t *msg, size_t len) { + // prepare buffer by adding 1 byte prefix + SBuffer *buf = new SBuffer(len+1); // prepare for control_byte prefix + buf->add8(0x00); // placeholder for control_byte + buf->addBuffer(msg, len); + // + AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: adding packet to_send, to_ack:%d, to_send:%d, to_end:%d"), + EZSP_Serial.to_ack, EZSP_Serial.to_send, EZSP_Serial.to_end); + uint8_t to_frm = EZSP_Serial.to_end; + if (EZSP_Serial.to_packets[to_frm]) { + delete EZSP_Serial.to_packets[to_frm]; + EZSP_Serial.to_packets[to_frm] = nullptr; + } + EZSP_Serial.to_packets[to_frm] = buf; + EZSP_Serial.to_end = (to_frm + 1) & 0x07; // move cursor + + // ZigbeeEZSPSendDATA_frm(send_cancel, to_frm, EZSP_Serial.from_ack); + + // increment to_frame + //EZSP_Serial.to_ack = (EZSP_Serial.to_ack + 1) & 0x07; + //EZSP_Serial.to_frm = (EZSP_Serial.to_frm + 1) & 0x07; +} + +// Receive a high-level EZSP command/response, starting with 16-bits frame ID int32_t ZigbeeProcessInputEZSP(class SBuffer &buf) { // verify errors in first 2 bytes. // TODO @@ -534,40 +572,82 @@ int32_t ZigbeeProcessInputEZSP(class SBuffer &buf) { ToHex_P((unsigned char*)buf.getBuffer(), buf.len(), hex_char, sizeof(hex_char)); Response_P(PSTR("{\"" D_JSON_ZIGBEE_EZSP_RECEIVED "\":\"%s\"}"), hex_char); if (Settings.flag3.tuya_serial_mqtt_publish) { - MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR)); } else { - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "%s"), mqtt_data); // TODO move to LOG_LEVEL_DEBUG when stable + // demote less interesting messages to LOG_LEVEL_DEBUG + uint32_t log_level = LOG_LEVEL_INFO; + switch (buf.get16(0)) { + case EZSP_version: // 0000 + case EZSP_addEndpoint: // 0200 + case EZSP_setConcentrator: // 1000 + case EZSP_networkInit: // 1700 + case EZSP_stackStatusHandler: // 1900 + case EZSP_permitJoining: // 2200 + case EZSP_getEui64: // 2600 + case EZSP_getNodeId: // 2700 + case EZSP_getNetworkParameters: // 2800 + case EZSP_sendUnicast: // 3400 + case EZSP_sendBroadcast: // 3600 + case EZSP_messageSentHandler: // 3F00 + case EZSP_setConfigurationValue: // 5300 + case EZSP_setPolicy: // 5500 + case EZSP_setMulticastTableEntry: // 6400 + case EZSP_setInitialSecurityState: // 6800 + case EZSP_getCurrentSecurityState: // 6900 + log_level = LOG_LEVEL_DEBUG; + break; + } + AddLog_P2(log_level, PSTR(D_LOG_ZIGBEE "%s"), mqtt_data); // TODO move to LOG_LEVEL_DEBUG when stable } // Pass message to state machine ZigbeeProcessInput(buf); } +// Check if we advanced in the ACKed frames, and free from memory packets acknowledged +void EZSP_HandleAck(uint8_t new_ack) { + if (EZSP_Serial.to_ack != new_ack) { // new ack receveid + AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: new ack/data received, was %d now %d"), EZSP_Serial.to_ack, new_ack); + uint32_t i = EZSP_Serial.to_ack; + do { + if (EZSP_Serial.to_packets[i]) { + delete EZSP_Serial.to_packets[i]; + EZSP_Serial.to_packets[i] = nullptr; + } + AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: freeing packet %d from memory"), i); + i = (i + 1) & 0x07; + } while (i != new_ack); + EZSP_Serial.to_ack = new_ack; + } +} // Receive raw ASH frame (CRC was removed, data unstuffed) but still contains frame numbers int32_t ZigbeeProcessInputRaw(class SBuffer &buf) { uint8_t control_byte = buf.get8(0); uint8_t ack_num = control_byte & 0x07; // keep 3 LSB - if (control_byte & 0x80) { + if (control_byte & 0x80) { // non DATA frame - // non DATA frame uint8_t frame_type = control_byte & 0xE0; // keep 3 MSB if (frame_type == 0x80) { // ACK - EZSP_Serial.from_ack = ack_num; // update ack num + EZSP_HandleAck(ack_num); } else if (frame_type == 0xA0) { // NAK - AddLog_P2(LOG_LEVEL_INFO, PSTR("ZIG: Received NAK %d, resending not implemented"), ack_num); + AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: Received NAK %d, to_ack:%d, to_send:%d, to_end:%d"), + ack_num, EZSP_Serial.to_ack, EZSP_Serial.to_send, EZSP_Serial.to_end); + EZSP_Serial.to_send = ack_num; + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("ZIG: NAK, resending packet %d"), ack_num); } else if (control_byte == 0xC1) { - + // RSTACK // received just after boot, either because of Power up, hardware reset or RST EZ_RSTACK(buf.get8(2)); EZSP_Serial.from_ack = 0; EZSP_Serial.to_ack = 0; + EZSP_Serial.to_end = 0; + EZSP_Serial.to_send = 0; // pass it to state machine with a special 0xFFFE frame code (EZSP_RSTACK_ID) buf.set8(0, Z_B0(EZSP_rstAck)); @@ -576,7 +656,7 @@ int32_t ZigbeeProcessInputRaw(class SBuffer &buf) { buf.setLen(3); ZigbeeProcessInput(buf); } else if (control_byte == 0xC2) { - + // ERROR EZ_ERROR(buf.get8(2)); zigbee.active = false; // stop all zigbee activities @@ -585,14 +665,12 @@ int32_t ZigbeeProcessInputRaw(class SBuffer &buf) { // Unknown AddLog_P2(LOG_LEVEL_DEBUG, PSTR("ZIG: Received unknown control byte 0x%02X"), control_byte); } - } else { + } else { // DATA Frame + + // adjust to latest acked packet + uint8_t new_ack = control_byte & 0x07; + EZSP_HandleAck(new_ack); - // DATA Frame - // check the frame number, and send ACK or NAK - if ((control_byte & 0x07) != EZSP_Serial.to_ack) { - AddLog_P2(LOG_LEVEL_INFO, PSTR("ZIG: wrong ack, received %d, expected %d"), control_byte & 0x07, EZSP_Serial.to_ack); - //EZSP_Serial.to_ack = control_byte & 0x07; - } // MCU acknowledged the correct frame // we acknowledge the frame too EZSP_Serial.from_ack = ((control_byte >> 4) + 1) & 0x07; @@ -638,10 +716,10 @@ void CmndZbEZSPSendOrReceive(bool send) } if (send) { // Command was `ZbEZSPSend` - if (2 == XdrvMailbox.index) { ZigbeeEZSPSendDATA(buf.getBuffer(), buf.len(), true); } + if (2 == XdrvMailbox.index) { ZigbeeEZSPSendDATA(buf.getBuffer(), buf.len()); } else if (3 == XdrvMailbox.index) { ZigbeeEZSPSendRaw(buf.getBuffer(), buf.len(), true); } - else { ZigbeeEZSPSendCmd(buf.getBuffer(), buf.len(), true); } - + else { ZigbeeEZSPSendCmd(buf.getBuffer(), buf.len()); } + } else { // Command was `ZbEZSPReceive` if (2 == XdrvMailbox.index) { ZigbeeProcessInput(buf); } @@ -772,7 +850,25 @@ void ZigbeeZCLSend_Raw(uint16_t shortaddr, uint16_t groupaddr, uint16_t clusterI } } - ZigbeeEZSPSendCmd(buf.buf(), buf.len(), true); + ZigbeeEZSPSendCmd(buf.buf(), buf.len()); +#endif // USE_ZIGBEE_EZSP +} + +// +// Send any buffered data to the NCP +// +// Used only with EZSP, as there is no replay of procotol control with ZNP +void ZigbeeOutputLoop(void) { +#ifdef USE_ZIGBEE_EZSP + // while (EZSP_Serial.to_send != EZSP_Serial.to_end) { + if (EZSP_Serial.to_send != EZSP_Serial.to_end) { // we send only one packet per tick to lower the chance of NAK + AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("ZIG: Something to_send, to_ack:%d, to_send:%d, to_end:%d"), + EZSP_Serial.to_ack, EZSP_Serial.to_send, EZSP_Serial.to_end); + // we have a frame waiting to be sent + ZigbeeEZSPSendDATA_frm(true, EZSP_Serial.to_send, EZSP_Serial.from_ack); + // increment sent counter + EZSP_Serial.to_send = (EZSP_Serial.to_send + 1) & 0x07; + } #endif // USE_ZIGBEE_EZSP } diff --git a/tasmota/xdrv_23_zigbee_9a_upload.ino b/tasmota/xdrv_23_zigbee_9a_upload.ino new file mode 100644 index 000000000..7c2feed26 --- /dev/null +++ b/tasmota/xdrv_23_zigbee_9a_upload.ino @@ -0,0 +1,475 @@ +/* + xdrv_23_zigbee_9a_upload.ino - zigbee: serial xmodem upload to MCU + + 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 + 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_ZIGBEE + +#ifdef USE_ZIGBEE_EZSP +/*********************************************************************************************\ + * MCU EFR32 firmware upload using xmodem + * + * Step 1 - Upload MCU firmware in ESP8266 flash free space (current size is about 200k) + * Step 2 - Upload MCU firmware from ESP8266 flash to MCU EFR32 using XMODEM protocol + * Step 3 - Restart +\*********************************************************************************************/ + +//#define ZIGBEE_BOOTLOADER_SOFTWARE_RESET_FIRST + +#define XM_SOH 0x01 +#define XM_EOT 0x04 +#define XM_ACK 0x06 +#define XM_CR 0x0d +#define XM_NAK 0x15 +#define XM_CAN 0x18 +#define XM_SUB 0x1a + +enum ZbUploadSteps { ZBU_IDLE, ZBU_INIT, + ZBU_SOFTWARE_RESET, ZBU_SOFTWARE_SEND, ZBU_HARDWARE_RESET, ZBU_PROMPT, + ZBU_SYNC, ZBU_UPLOAD, ZBU_EOT, ZBU_COMPLETE, ZBU_DONE, ZBU_FINISH }; + +const uint8_t PIN_ZIGBEE_BOOTLOADER = 5; + +struct ZBUPLOAD { + uint32_t ota_size = 0; + uint32_t sector_cursor = 0; + uint32_t sector_counter = 0; + uint32_t byte_counter = 0; + char *buffer; + uint8_t ota_step = ZBU_IDLE; + uint8_t bootloader = 0; +} ZbUpload; + +/*********************************************************************************************\ + * Flash +\*********************************************************************************************/ + +uint32_t ZigbeeUploadFlashStart(void) { + return (ESP.getSketchSize() / SPI_FLASH_SEC_SIZE) + 2; +} + +uint32_t ZigbeeUploadAvailable(void) { + int available = ZbUpload.ota_size - ZbUpload.byte_counter; + if (available < 0) { available = 0; } + return available; +} + +char ZigbeeUploadFlashRead(void) { + if (0 == ZbUpload.byte_counter) { + if (!(ZbUpload.buffer = (char *)malloc(SPI_FLASH_SEC_SIZE))) { + return (-1); // Not enough (memory) space + } + ZbUpload.sector_counter = ZigbeeUploadFlashStart(); + } + + uint32_t index = ZbUpload.byte_counter % SPI_FLASH_SEC_SIZE; + if (0 == index) { + ESP.flashRead(ZbUpload.sector_counter * SPI_FLASH_SEC_SIZE, (uint32_t*)ZbUpload.buffer, SPI_FLASH_SEC_SIZE); + ZbUpload.sector_counter++; + } + + char data = ZbUpload.buffer[index]; + ZbUpload.byte_counter++; + + if (ZbUpload.byte_counter > ZbUpload.ota_size) { + // When the source device reaches the last XModem data block, it should be padded to 128 bytes + // of data using SUB (ASCII 0x1A) characters. + data = XM_SUB; +// if (ZbUpload.buffer) { free(ZbUpload.buffer); } // Don't in case of retries + } + return data; +} + +/*********************************************************************************************\ + * XModem protocol +\*********************************************************************************************/ + +// Number of seconds until giving up hope of receiving sync packets from host. +const uint8_t XMODEM_SYNC_TIMEOUT = 30; +// Number of times we try to send a packet to the host until we give up sending.. +const uint8_t XMODEM_MAX_RETRY = 30; +// Packet size +const uint8_t XMODEM_PACKET_SIZE = 128; + +struct XMODEM { + uint32_t timeout = 0; + uint32_t delay = 0; + uint32_t filepos = 0; + int crcBuf = 0; + uint8_t packetNo = 1; + uint8_t checksumBuf = 0; + bool oldChecksum; +} XModem; + +// Send out a byte of payload data, includes checksumming +void XModemOutputByte(uint8_t out_char) { + XModem.checksumBuf += out_char; + + XModem.crcBuf = XModem.crcBuf ^ (int) out_char << 8; + for (uint32_t i = 0; i < 8; i++) { + if (XModem.crcBuf & 0x8000) { + XModem.crcBuf = XModem.crcBuf << 1 ^ 0x1021; + } else { + XModem.crcBuf = XModem.crcBuf << 1; + } + } + + ZigbeeSerial->write(out_char); +} + +// Wait for the remote to acknowledge or cancel. +// Returns the received char if no timeout occured or a CAN was received. In this cases, it returns -1. +char XModemWaitACK(void) +{ + char in_char; + do { + uint8_t i = 0; + while (!ZigbeeSerial->available()) { + delayMicroseconds(100); + i++; + if (i > 200) { return -1; } + } + in_char = ZigbeeSerial->read(); + if (XM_CAN == in_char) { return XM_CAN; } + } while ((in_char != XM_NAK) && (in_char != XM_ACK) && (in_char != 'C')); + return in_char; +} + +bool XModemSendPacket(uint32_t packet_no) { + XModem.filepos = ZbUpload.byte_counter; + + // Sending a packet will be retried + uint32_t retries = 0; + char in_char; + do { + // Seek to start of current data block, + // will advance through the file as block will be acked.. + ZbUpload.byte_counter = XModem.filepos; + + // Reset checksum stuff + XModem.checksumBuf = 0x00; + XModem.crcBuf = 0x00; + + // Try to send packet, so header first + ZigbeeSerial->write(XM_SOH); + ZigbeeSerial->write(packet_no); + ZigbeeSerial->write(~packet_no); + for (uint32_t i = 0; i < XMODEM_PACKET_SIZE; i++) { + in_char = ZigbeeUploadFlashRead(); + XModemOutputByte(in_char); + } + // Send out checksum, either CRC-16 CCITT or classical inverse of sum of bytes. + // Depending on how the received introduced himself + if (XModem.oldChecksum) { + ZigbeeSerial->write((char)XModem.checksumBuf); + } else { + ZigbeeSerial->write((char)(XModem.crcBuf >> 8)); + ZigbeeSerial->write((char)(XModem.crcBuf & 0xFF)); + } + in_char = XModemWaitACK(); + if (XM_CAN == in_char) { return false; } + retries++; + if (retries > XMODEM_MAX_RETRY) { return false; } + } while (in_char != XM_ACK); + return true; +} + +/*********************************************************************************************\ + * Step 2 - Upload MCU firmware from ESP8266 flash to MCU EFR32 using XMODEM protocol + * + * https://www.silabs.com/documents/public/application-notes/an760-using-legacy-standalone-bootloader.pdf +\*********************************************************************************************/ + +void ZigbeeUploadSetSoftwareBootloader() { + // https://github.com/arendst/Tasmota/issues/8583#issuecomment-663967883 + SBuffer buf(4); + buf.add16(EZSP_launchStandaloneBootloader); + buf.add8(0x01); + ZigbeeEZSPSendCmd(buf.getBuffer(), buf.len()); // Send software bootloader init +} + +void ZigbeeUploadSetBootloader(uint8_t state) { + pinMode(PIN_ZIGBEE_BOOTLOADER, OUTPUT); + digitalWrite(PIN_ZIGBEE_BOOTLOADER, state); // Toggle Gecko bootloader + digitalWrite(Pin(GPIO_ZIGBEE_RST), 0); + delay(100); // Need to experiment to find a value as low as possible + digitalWrite(Pin(GPIO_ZIGBEE_RST), 1); // Reboot MCU EFR32 +} + +bool ZigbeeUploadBootloaderPrompt(void) { + // Scripts that interact with the bootloader should use only the “BL >” prompt to determine + // when the bootloader is ready for input. While current menu options should remain functionally + // unchanged, the menu title and options text is liable to change, and new options might be added. + while (ZigbeeSerial->available()) { + yield(); + char bootloader_byte = ZigbeeSerial->read(); + switch (ZbUpload.byte_counter) { + case 0: + if ('B' == bootloader_byte) { ZbUpload.byte_counter++; } break; + case 1: + if ('L' == bootloader_byte) { ZbUpload.byte_counter++; } break; + case 2: + if (' ' == bootloader_byte) { ZbUpload.byte_counter++; } break; + case 3: + if ('>' == bootloader_byte) { ZbUpload.byte_counter++; } + } + } + return (4 == ZbUpload.byte_counter); +} + +bool ZigbeeUploadXmodem(void) { + switch (ZbUpload.ota_step) { + case ZBU_IDLE: { // *** Upload disabled + return false; + } +#ifdef ZIGBEE_BOOTLOADER_SOFTWARE_RESET_FIRST + case ZBU_INIT: { // *** Init ESF32 bootloader + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Init bootloader")); + ZbUpload.ota_step = ZBU_SOFTWARE_RESET; + return false; // Keep Zigbee serial active + } + case ZBU_SOFTWARE_RESET: { + SBuffer buf(4); + buf.add16(EZSP_launchStandaloneBootloader); + buf.add8(0x01); + ZigbeeEZSPSendCmd(buf.getBuffer(), buf.len()); // Send software bootloader init + XModem.timeout = millis() + (10 * 1000); // Allow 10 seconds to send Zigbee command + ZbUpload.ota_step = ZBU_SOFTWARE_SEND; + return false; // Keep Zigbee serial active + } + case ZBU_SOFTWARE_SEND: { + if (millis() > XModem.timeout) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Bootloader software reset send timeout")); + ZbUpload.ota_step = ZBU_HARDWARE_RESET; + return true; + } + if (EZSP_Serial.to_send == EZSP_Serial.to_end) { + ZbUpload.bootloader = ZBU_SOFTWARE_RESET; + XModem.timeout = millis() + (10 * 1000); // Allow 10 seconds to receive EBL prompt + XModem.delay = millis() + 500; + ZbUpload.byte_counter = 0; + ZbUpload.ota_step = ZBU_PROMPT; + } + break; + } + case ZBU_HARDWARE_RESET: { + ZbUpload.bootloader = ZBU_HARDWARE_RESET; + ZigbeeUploadSetBootloader(0); // Reboot MCU EFR32 which returns below text + XModem.timeout = millis() + (30 * 1000); // Allow 30 seconds to receive EBL prompt + XModem.delay = millis() + 500; + ZbUpload.byte_counter = 0; + ZbUpload.ota_step = ZBU_PROMPT; + break; + } + case ZBU_PROMPT: { // *** Wait for prompt and select option upload ebl + if (millis() > XModem.timeout) { + if (ZBU_SOFTWARE_RESET == ZbUpload.bootloader) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Bootloader software reset timeout")); + ZbUpload.ota_step = ZBU_HARDWARE_RESET; + } else { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Bootloader hardware reset timeout")); + ZbUpload.ota_step = ZBU_DONE; + } + return true; + } +#else // No ZIGBEE_BOOTLOADER_SOFTWARE_RESET_FIRST + case ZBU_INIT: { // *** Init ESF32 bootloader + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Init bootloader")); + ZigbeeUploadSetBootloader(0); // Reboot MCU EFR32 which returns below text + XModem.timeout = millis() + (30 * 1000); // Allow 30 seconds to receive EBL prompt + XModem.delay = millis() + 500; + ZbUpload.byte_counter = 0; + ZbUpload.ota_step = ZBU_PROMPT; + break; + } + case ZBU_PROMPT: { // *** Wait for prompt and select option upload ebl + if (millis() > XModem.timeout) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Bootloader timeout")); + ZbUpload.ota_step = ZBU_DONE; + return true; + } +#endif // ZIGBEE_BOOTLOADER_SOFTWARE_RESET_FIRST + else if (!ZigbeeSerial->available()) { + // The target device’s bootloader sends output over its serial port after it receives a + // carriage return from the source device + if (millis() > XModem.delay) { + ZigbeeSerial->write(XM_CR); + XModem.delay = millis() + 500; + } + } else { + // After the bootloader receives a carriage return from the target device, it displays a menu + // Gecko Bootloader v1.A.3 + // 1. upload gbl + // 2. run + // 3. ebl info + // BL > + if (ZigbeeUploadBootloaderPrompt()) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Init sync")); + ZigbeeSerial->flush(); + ZigbeeSerial->write('1'); // upload ebl + if (ssleep > 0) { + ssleep = 1; // Speed up loop used for xmodem upload + } + XModem.timeout = millis() + (XMODEM_SYNC_TIMEOUT * 1000); + ZbUpload.ota_step = ZBU_SYNC; + } + } + break; + } + case ZBU_SYNC: { // *** Handle file upload using XModem - sync + if (millis() > XModem.timeout) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: SYNC timeout")); + ZbUpload.ota_step = ZBU_DONE; + return true; + } + // Wait for either C or NACK as a sync packet. Determines protocol details, checksum algorithm. + if (ZigbeeSerial->available()) { + char xmodem_sync = ZigbeeSerial->read(); + if (('C' == xmodem_sync) || (XM_NAK == xmodem_sync)) { + // Determine which checksum algorithm to use + XModem.oldChecksum = (xmodem_sync == XM_NAK); + XModem.packetNo = 1; + ZbUpload.byte_counter = 0; + ZbUpload.ota_step = ZBU_UPLOAD; + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Init packet send")); + } + } + break; + } + case ZBU_UPLOAD: { // *** Handle file upload using XModem - upload + if (ZigbeeUploadAvailable()) { + if (!XModemSendPacket(XModem.packetNo)) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Packet send failed")); + ZbUpload.ota_step = ZBU_DONE; + return true; + } + XModem.packetNo++; + } else { + // Once the last block is ACKed by the target, the transfer should be finalized by an + // EOT (ASCII 0x04) packet from the source. Once this packet is confirmed via XModem ACK + // from the target, the device will reboot, causing the new firmware to be launched. + ZigbeeSerial->write(XM_EOT); + XModem.timeout = millis() + (30 * 1000); // Allow 30 seconds to receive EOT ACK + ZbUpload.ota_step = ZBU_EOT; + } + break; + } + case ZBU_EOT: { // *** Send EOT and wait for ACK + // The ACK for the last XModem data packet may take much longer (1-3 seconds) than prior + // data packets to be received. This is due to the CRC32 checksum being performed across + // the received EBL file data prior to sending the ACK. The source device must ensure that + // its XModem state machine waits a sufficient amount of time to allow this checksum process + // to occur without timing out on the response just before the EOT is sent. + if (millis() > XModem.timeout) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: EOT ACK timeout")); + ZbUpload.ota_step = ZBU_DONE; + return true; + } + if (ZigbeeSerial->available()) { + char xmodem_ack = XModemWaitACK(); + if (XM_ACK == xmodem_ack) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: " D_SUCCESSFUL)); + XModem.timeout = millis() + (30 * 1000); // Allow 30 seconds to receive EBL prompt + ZbUpload.byte_counter = 0; + ZbUpload.ota_step = ZBU_COMPLETE; +// ZbUpload.ota_step = ZBU_DONE; // Skip prompt for now + } + } + break; + } + case ZBU_COMPLETE: { // *** Wait for Serial upload complete EBL prompt + if (millis() > XModem.timeout) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: Bootloader timeout")); + ZbUpload.ota_step = ZBU_DONE; + return true; + } else { + // After an image successfully uploads, the XModem transaction completes and the bootloader displays + // ‘Serial upload complete’ before redisplaying the menu + // Serial upload complete + // Gecko Bootloader v1.A.3 + // 1. upload gbl + // 2. run + // 3. ebl info + // BL > + if (ZigbeeUploadBootloaderPrompt()) { + ZbUpload.ota_step = ZBU_DONE; + } + } + break; + } + case ZBU_DONE: { // *** Clean up and restart to disable bootloader and use new firmware + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("XMD: " D_RESTARTING)); + ZigbeeUploadSetBootloader(1); // Disable bootloader and reset MCU - should happen at restart + if (1 == ssleep) { + ssleep = Settings.sleep; // Restore loop sleep + } + restart_flag = 2; // Restart to disable bootloader and use new firmware + ZbUpload.ota_step = ZBU_FINISH; // Never return to zero without a restart to get a sane Zigbee environment + break; + } + case ZBU_FINISH: { // *** Wait for restart making sure not to start Zigbee serial again + // Wait for restart + break; + } + } + return true; +} + +/*********************************************************************************************\ + * Step 1 - Upload MCU firmware in ESP8266 flash free space (current size is about 200k) +\*********************************************************************************************/ + +bool ZigbeeUploadOtaReady(void) { + return (ZBU_INIT == ZbUpload.ota_step); +} + +uint8_t ZigbeeUploadInit(void) { + if (!PinUsed(GPIO_ZIGBEE_RST) && (ZigbeeSerial == nullptr)) { return 1; } // Wrong pin configuration - No file selected + + ZbUpload.sector_counter = ZigbeeUploadFlashStart(); + ZbUpload.sector_cursor = 0; + ZbUpload.ota_size = 0; + ZbUpload.ota_step = ZBU_IDLE; + return 0; +} + +bool ZigbeeUploadWriteBuffer(uint8_t *buf, size_t size) { + // Read complete file into ESP8266 flash + // Current files are about 200k + if (0 == ZbUpload.sector_cursor) { // Starting a new sector write so we need to erase it first + ESP.flashEraseSector(ZbUpload.sector_counter); + } + ZbUpload.sector_cursor++; + ESP.flashWrite((ZbUpload.sector_counter * SPI_FLASH_SEC_SIZE) + ((ZbUpload.sector_cursor-1) * 2048), (uint32_t*)buf, size); + ZbUpload.ota_size += size; + if (2 == ZbUpload.sector_cursor) { // The web upload sends 2048 bytes at a time so keep track of the cursor position to reset it for the next flash sector erase + ZbUpload.sector_cursor = 0; + ZbUpload.sector_counter++; + if (ZbUpload.sector_counter > (SPIFFS_END -2)) { + return false; // File too large - Not enough free space + } + } + return true; +} + +void ZigbeeUploadDone(void) { + ZbUpload.ota_step = ZBU_INIT; +} + +#endif // USE_ZIGBEE_EZSP + +#endif // USE_ZIGBEE diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino index e46d847eb..13b7bb749 100644 --- a/tasmota/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/xdrv_23_zigbee_A_impl.ino @@ -57,14 +57,29 @@ void (* const ZigbeeCommand[])(void) PROGMEM = { void ZigbeeInit(void) { // Check if settings in Flash are set - if (0 == Settings.zb_channel) { - AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Initializing Zigbee parameters from defaults")); - Settings.zb_ext_panid = USE_ZIGBEE_EXTPANID; - Settings.zb_precfgkey_l = USE_ZIGBEE_PRECFGKEY_L; - Settings.zb_precfgkey_h = USE_ZIGBEE_PRECFGKEY_H; - Settings.zb_pan_id = USE_ZIGBEE_PANID; - Settings.zb_channel = USE_ZIGBEE_CHANNEL; - Settings.zb_txradio_dbm = USE_ZIGBEE_TXRADIO_DBM; + if (PinUsed(GPIO_ZIGBEE_RX) && PinUsed(GPIO_ZIGBEE_TX)) { + if (0 == Settings.zb_channel) { + AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Randomizing Zigbee parameters, please check with 'ZbConfig'")); + uint64_t mac64 = 0; // stuff mac address into 64 bits + WiFi.macAddress((uint8_t*) &mac64); + uint32_t esp_id = ESP_getChipId(); +#ifdef ESP8266 + uint32_t flash_id = ESP.getFlashChipId(); +#else // ESP32 + uint32_t flash_id = 0; +#endif // ESP8266 or ESP32 + + uint16_t pan_id = (mac64 & 0x3FFF); + if (0x0000 == pan_id) { pan_id = 0x0001; } // avoid extreme values + if (0x3FFF == pan_id) { pan_id = 0x3FFE; } // avoid extreme values + Settings.zb_pan_id = pan_id; + + Settings.zb_ext_panid = 0xCCCCCCCC00000000L | (mac64 & 0x00000000FFFFFFFFL); + Settings.zb_precfgkey_l = (mac64 << 32) | (esp_id << 16) | flash_id; + Settings.zb_precfgkey_h = (mac64 << 32) | (esp_id << 16) | flash_id; + Settings.zb_channel = USE_ZIGBEE_CHANNEL; + Settings.zb_txradio_dbm = USE_ZIGBEE_TXRADIO_DBM; + } } // update commands with the current settings @@ -164,7 +179,9 @@ void zigbeeZCLSendStr(uint16_t shortaddr, uint16_t groupaddr, uint8_t endpoint, ZigbeeZCLSend_Raw(shortaddr, groupaddr, cluster, endpoint, cmd, clusterSpecific, manuf, buf.getBuffer(), buf.len(), true, zigbee_devices.getNextSeqNumber(shortaddr)); // now set the timer, if any, to read back the state later if (clusterSpecific) { +#ifndef USE_ZIGBEE_NO_READ_ATTRIBUTES // read back attribute value unless it is disabled zigbeeSetCommandTimer(shortaddr, groupaddr, cluster, endpoint); +#endif } } @@ -715,7 +732,7 @@ void ZbBindUnbind(bool unbind) { // false = bind, true = unbind #ifdef USE_ZIGBEE_EZSP SBuffer buf(24); - + // ZDO message payload (see Zigbee spec 2.4.3.2.2) buf.add64(srcLongAddr); buf.add8(endpoint); @@ -751,18 +768,20 @@ void CmndZbUnbind(void) { // // Command `ZbBindState` +// `ZbBindState` as index if it does not fit. If default, `1` starts at the beginning // void CmndZbBindState(void) { if (zigbee.init_phase) { ResponseCmndChar_P(PSTR(D_ZIGBEE_NOT_STARTED)); return; } uint16_t shortaddr = zigbee_devices.parseDeviceParam(XdrvMailbox.data); if (BAD_SHORTADDR == shortaddr) { ResponseCmndChar_P(PSTR("Unknown device")); return; } + uint8_t index = XdrvMailbox.index - 1; // change default 1 to 0 #ifdef USE_ZIGBEE_ZNP SBuffer buf(10); buf.add8(Z_SREQ | Z_ZDO); // 25 buf.add8(ZDO_MGMT_BIND_REQ); // 33 buf.add16(shortaddr); // shortaddr - buf.add8(0); // StartIndex = 0 + buf.add8(index); // StartIndex = 0 ZigbeeZNPSend(buf.getBuffer(), buf.len()); #endif // USE_ZIGBEE_ZNP @@ -770,7 +789,7 @@ void CmndZbBindState(void) { #ifdef USE_ZIGBEE_EZSP // ZDO message payload (see Zigbee spec 2.4.3.3.4) - uint8_t buf[] = { 0x00 }; // index = 0 + uint8_t buf[] = { index }; // index = 0 EZ_SendZDO(shortaddr, ZDO_Mgmt_Bind_req, buf, sizeof(buf)); #endif // USE_ZIGBEE_EZSP @@ -895,8 +914,7 @@ void CmndZbLight(void) { String dump = zigbee_devices.dumpLightState(shortaddr); Response_P(PSTR("{\"" D_PRFX_ZB D_CMND_ZIGBEE_LIGHT "\":%s}"), dump.c_str()); - MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_PRFX_ZB D_CMND_ZIGBEE_LIGHT)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_ZB D_CMND_ZIGBEE_LIGHT)); ResponseCmndDone(); } @@ -993,12 +1011,14 @@ void CmndZbPermitJoin(void) { if (payload <= 0) { duration = 0; - } else if (99 == payload) { - duration = 0xFF; // unlimited time } // ZNP Version #ifdef USE_ZIGBEE_ZNP + if (99 == payload) { + duration = 0xFF; // unlimited time + } + uint16_t dstAddr = 0xFFFC; // default addr SBuffer buf(34); @@ -1015,10 +1035,20 @@ void CmndZbPermitJoin(void) { // EZSP VERSION #ifdef USE_ZIGBEE_EZSP + if (99 == payload) { + ResponseCmndChar_P(PSTR("Unlimited time not supported")); return; + } + SBuffer buf(3); buf.add16(EZSP_permitJoining); buf.add8(duration); - ZigbeeEZSPSendCmd(buf.getBuffer(), buf.len(), true); + ZigbeeEZSPSendCmd(buf.getBuffer(), buf.len()); + + // send ZDO_Mgmt_Permit_Joining_req to all routers + buf.setLen(0); + buf.add8(duration); + buf.add8(0x01); // TC_Significance - This field shall always have a value of 1, indicating a request to change the Trust Center policy. If a frame is received with a value of 0, it shall be treated as having a value of 1. + EZ_SendZDO(0xFFFC, ZDO_Mgmt_Permit_Joining_req, buf.buf(), buf.len()); #endif // USE_ZIGBEE_EZSP ResponseCmndDone(); @@ -1041,14 +1071,14 @@ void CmndZbEZSPListen(void) { } else if (group > 0xFFFF) { group = 0xFFFF; } - + SBuffer buf(8); buf.add16(EZSP_setMulticastTableEntry); buf.add8(index); buf.add16(group); // group buf.add8(0x01); // endpoint buf.add8(0x00); // network index - ZigbeeEZSPSendCmd(buf.getBuffer(), buf.len(), true); + ZigbeeEZSPSendCmd(buf.getBuffer(), buf.len()); ResponseCmndDone(); } @@ -1229,10 +1259,18 @@ bool Xdrv23(uint8_t function) } break; case FUNC_LOOP: - if (ZigbeeSerial) { ZigbeeInputLoop(); } - if (zigbee.state_machine) { +#ifdef USE_ZIGBEE_EZSP + if (ZigbeeUploadXmodem()) { + return false; + } +#endif + if (ZigbeeSerial) { + ZigbeeInputLoop(); + ZigbeeOutputLoop(); // send any outstanding data + } + if (zigbee.state_machine) { ZigbeeStateMachine_Run(); - } + } break; #ifdef USE_WEBSERVER case FUNC_WEB_SENSOR: diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 6d0c6e5ce..8bf783680 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -37,18 +37,18 @@ enum ShutterModes { SHT_OFF_OPEN__OFF_CLOSE, SHT_OFF_ON__OPEN_CLOSE, SHT_PULSE_O enum ShutterButtonStates { SHT_NOT_PRESSED, SHT_PRESSED_MULTI, SHT_PRESSED_HOLD, SHT_PRESSED_IMMEDIATE, SHT_PRESSED_EXT_HOLD, SHT_PRESSED_MULTI_SIMULTANEOUS, SHT_PRESSED_HOLD_SIMULTANEOUS, SHT_PRESSED_EXT_HOLD_SIMULTANEOUS,}; const char kShutterCommands[] PROGMEM = D_PRFX_SHUTTER "|" - D_CMND_SHUTTER_OPEN "|" D_CMND_SHUTTER_CLOSE "|" D_CMND_SHUTTER_TOGGLE "|" D_CMND_SHUTTER_STOP "|" D_CMND_SHUTTER_POSITION "|" + D_CMND_SHUTTER_OPEN "|" D_CMND_SHUTTER_CLOSE "|" D_CMND_SHUTTER_TOGGLE "|" D_CMND_SHUTTER_TOGGLEDIR "|" D_CMND_SHUTTER_STOP "|" D_CMND_SHUTTER_POSITION "|" D_CMND_SHUTTER_OPENTIME "|" D_CMND_SHUTTER_CLOSETIME "|" D_CMND_SHUTTER_RELAY "|" D_CMND_SHUTTER_SETHALFWAY "|" D_CMND_SHUTTER_SETCLOSE "|" D_CMND_SHUTTER_SETOPEN "|" D_CMND_SHUTTER_INVERT "|" D_CMND_SHUTTER_CLIBRATION "|" D_CMND_SHUTTER_MOTORDELAY "|" D_CMND_SHUTTER_FREQUENCY "|" D_CMND_SHUTTER_BUTTON "|" D_CMND_SHUTTER_LOCK "|" D_CMND_SHUTTER_ENABLEENDSTOPTIME "|" D_CMND_SHUTTER_INVERTWEBBUTTONS "|" - D_CMND_SHUTTER_STOPOPEN "|" D_CMND_SHUTTER_STOPCLOSE "|" D_CMND_SHUTTER_STOPTOGGLE "|" D_CMND_SHUTTER_STOPPOSITION; + D_CMND_SHUTTER_STOPOPEN "|" D_CMND_SHUTTER_STOPCLOSE "|" D_CMND_SHUTTER_STOPTOGGLE "|" D_CMND_SHUTTER_STOPTOGGLEDIR "|" D_CMND_SHUTTER_STOPPOSITION; void (* const ShutterCommand[])(void) PROGMEM = { - &CmndShutterOpen, &CmndShutterClose, &CmndShutterToggle, &CmndShutterStop, &CmndShutterPosition, + &CmndShutterOpen, &CmndShutterClose, &CmndShutterToggle, &CmndShutterToggleDir, &CmndShutterStop, &CmndShutterPosition, &CmndShutterOpenTime, &CmndShutterCloseTime, &CmndShutterRelay, &CmndShutterSetHalfway, &CmndShutterSetClose, &CmndShutterSetOpen, &CmndShutterInvert, &CmndShutterCalibration , &CmndShutterMotorDelay, &CmndShutterFrequency, &CmndShutterButton, &CmndShutterLock, &CmndShutterEnableEndStopTime, &CmndShutterInvertWebButtons, - &CmndShutterStopOpen, &CmndShutterStopClose, &CmndShutterStopToggle, &CmndShutterStopPosition}; + &CmndShutterStopOpen, &CmndShutterStopClose, &CmndShutterStopToggle, &CmndShutterStopToggleDir, &CmndShutterStopPosition}; const char JSON_SHUTTER_POS[] PROGMEM = "\"" D_PRFX_SHUTTER "%d\":{\"Position\":%d,\"Direction\":%d,\"Target\":%d}"; const char JSON_SHUTTER_BUTTON[] PROGMEM = "\"" D_PRFX_SHUTTER "%d\":{\"Button%d\":%d}"; @@ -70,6 +70,7 @@ struct SHUTTER { uint16_t close_time[MAX_SHUTTERS]; // duration to close the shutter. 112 = 11.2sec uint16_t close_velocity[MAX_SHUTTERS]; // in relation to open velocity. higher value = faster int8_t direction[MAX_SHUTTERS]; // 1 == UP , 0 == stop; -1 == down + int8_t lastdirection[MAX_SHUTTERS]; // last direction (1 == UP , -1 == down) uint8_t mode = 0; // operation mode definition. see enum type above SHT_OFF_OPEN__OFF_CLOSE, SHT_OFF_ON__OPEN_CLOSE, SHT_PULSE_OPEN__PULSE_CLOSE int16_t motordelay[MAX_SHUTTERS]; // initial motorstarttime in 0.05sec. int16_t pwm_frequency[MAX_SHUTTERS]; // frequency of PWN for stepper motors @@ -237,6 +238,7 @@ void ShutterInit(void) //Shutter.real_position[i] = Settings.shutter_position[i] <= 5 ? Settings.shuttercoeff[2][i] * Settings.shutter_position[i] : Settings.shuttercoeff[1][i] * Settings.shutter_position[i] + Settings.shuttercoeff[0,i]; Shutter.start_position[i] = Shutter.target_position[i] = Shutter.real_position[i]; Shutter.motordelay[i] = Settings.shutter_motordelay[i]; + Shutter.lastdirection[i] = (50 < Settings.shutter_position[i]) ? 1 : -1; char shutter_open_chr[10]; dtostrfd((float)Shutter.open_time[i] / 10 , 1, shutter_open_chr); @@ -279,8 +281,7 @@ void ShutterReportPosition(bool always, uint32_t index) } ResponseJsonEnd(); if (always || (rules_flag.shutter_moving)) { - MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_PRFX_SHUTTER)); - XdrvRulesProcess(); //RulesProcess() now re-entry protected + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_SHUTTER)); // RulesProcess() now re-entry protected } //AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: rules_flag.shutter_moving: %d, moved %d"), rules_flag.shutter_moving, rules_flag.shutter_moved); @@ -402,6 +403,9 @@ void ShutterUpdatePosition(void) Response_P("%d", (Settings.shutter_options[i] & 1) ? 100 - Settings.shutter_position[i]: Settings.shutter_position[i]); MqttPublish(stopic, Settings.flag.mqtt_power_retain); // CMND_POWERRETAIN + if (Shutter.direction[i] != 0) { + Shutter.lastdirection[i] = Shutter.direction[i]; + } Shutter.direction[i] = 0; ShutterReportPosition(true, i); rules_flag.shutter_moved = 1; @@ -716,8 +720,7 @@ void ShutterButtonHandler(void) Response_P(PSTR("{")); ResponseAppend_P(JSON_SHUTTER_BUTTON, shutter_index+1, (buttonState <= SHT_PRESSED_EXT_HOLD) ? (button_index+1) : 0, press_index); ResponseJsonEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_PRFX_SHUTTER)); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_SHUTTER)); } } @@ -728,6 +731,26 @@ void ShutterSetPosition(uint32_t device, uint32_t position) ExecuteCommand(svalue, SRC_IGNORE); } +void ShutterToggle(bool dir) +{ + //AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SHT: Payload toggle: %d, i %d"), XdrvMailbox.payload, XdrvMailbox.index); + if ((1 == XdrvMailbox.index) && (XdrvMailbox.payload != -99)) { + XdrvMailbox.index = XdrvMailbox.payload; + } + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= shutters_present)) { + uint32_t index = XdrvMailbox.index-1; + if (dir) { + XdrvMailbox.payload = (Shutter.lastdirection[index] > 0) ? 0 : 100; + } + else { + XdrvMailbox.payload = (50 < ShutterRealToPercentPosition(Shutter.real_position[index], index)) ? 0 : 100; + } + XdrvMailbox.data_len = 0; + last_source = SRC_WEBGUI; + CmndShutterPosition(); + } +} + /*********************************************************************************************\ * Commands \*********************************************************************************************/ @@ -781,17 +804,12 @@ void CmndShutterStopClose(void) void CmndShutterToggle(void) { - //AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SHT: Payload toggle: %d, i %d"), XdrvMailbox.payload, XdrvMailbox.index); - if ((1 == XdrvMailbox.index) && (XdrvMailbox.payload != -99)) { - XdrvMailbox.index = XdrvMailbox.payload; - } - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= shutters_present)) { - uint32_t index = XdrvMailbox.index-1; - XdrvMailbox.payload = (50 < ShutterRealToPercentPosition(Shutter.real_position[index], index)) ? 0 : 100; - XdrvMailbox.data_len = 0; - last_source = SRC_WEBGUI; - CmndShutterPosition(); - } + ShutterToggle(false); +} + +void CmndShutterToggleDir(void) +{ + ShutterToggle(true); } void CmndShutterStopToggle(void) @@ -806,6 +824,18 @@ void CmndShutterStopToggle(void) } } +void CmndShutterStopToggleDir(void) +{ + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= shutters_present)) { + uint32_t index = XdrvMailbox.index-1; + if (Shutter.direction[index]) { + CmndShutterStop(); + } else { + CmndShutterToggleDir(); + } + } +} + void CmndShutterStop(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= shutters_present)) { @@ -858,6 +888,10 @@ void CmndShutterPosition(void) CmndShutterToggle(); return; } + if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_TOGGLEDIR)) { + CmndShutterToggleDir(); + return; + } if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOP) || ((Shutter.direction[index]) && (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPOPEN) || !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPCLOSE)))) { XdrvMailbox.payload = -99; CmndShutterStop(); diff --git a/tasmota/xdrv_31_tasmota_client.ino b/tasmota/xdrv_31_tasmota_client.ino index 3fdbad076..86121475c 100644 --- a/tasmota/xdrv_31_tasmota_client.ino +++ b/tasmota/xdrv_31_tasmota_client.ino @@ -539,8 +539,7 @@ void TasmotaClient_ProcessIn(void) { Response_P(PSTR("{\"TasmotaClient\":")); ResponseAppend_P("%s", inbuf); ResponseJsonEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, mqtt_data); - XdrvRulesProcess(); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, mqtt_data); } if (CMND_EXECUTE_CMND == TClientCommand.command) { // We need to execute the incoming command ExecuteCommand(inbuf, SRC_IGNORE); diff --git a/tasmota/xdrv_38_ping.ino b/tasmota/xdrv_38_ping.ino index d30c0093d..af6b634d5 100644 --- a/tasmota/xdrv_38_ping.ino +++ b/tasmota/xdrv_38_ping.ino @@ -35,7 +35,7 @@ void (* const PingCommand[])(void) PROGMEM = { }; extern "C" { - + extern uint32 system_relative_time(uint32 time); extern void ets_bzero(void *s, size_t n); @@ -58,6 +58,7 @@ extern "C" { uint32_t sum_time; // cumulated time in ms for all successful responses (used to compute the average) bool done; // indicates the ping campaign is finished bool fast; // fast mode, i.e. stop pings when first successful response + String hostname; // original hostname before convertion to IP address } Ping_t; // globals @@ -130,7 +131,7 @@ extern "C" { if ((p->len == p->tot_len) && (p->next == nullptr)) { ip_addr_t ping_target; struct icmp_echo_hdr *iecho; - + ping_target.addr = ping->ip; iecho = (struct icmp_echo_hdr *) p->payload; @@ -177,7 +178,7 @@ extern "C" { iecho = (struct icmp_echo_hdr *)p->payload; if ((iecho->id == Ping_ID) && (iecho->seqno == htons(ping->seq_num)) && iecho->type == ICMP_ER) { - + if (iecho->seqno != ping->seqno){ // debounce already received packet /* do some ping result processing */ sys_untimeout(t_ping_timeout, ping); // remove time-out handler @@ -229,10 +230,22 @@ extern "C" { // ================================================================================ // Start pings // ================================================================================ - bool t_ping_start(uint32_t ip, uint32_t count) { + // returns: + // 0: OK + // -1: ping already ongoing for this address + // -2: unable to resolve address + int32_t t_ping_start(const char *hostname, uint32_t count) { + IPAddress ipfull; + if (!WiFi.hostByName(hostname, ipfull)) { + return -2; + } + + uint32_t ip = ipfull; + if (0xFFFFFFFF == ip) { return -2; } // invalid address + // check if pings are already ongoing for this IP if (t_ping_find(ip)) { - return false; + return -1; } Ping_t *ping = new Ping_t(); @@ -243,6 +256,7 @@ extern "C" { ping->min_time = UINT32_MAX; ping->ip = ip; ping->to_send_count = count - 1; + ping->hostname = hostname; // add to Linked List from head ping->next = ping_head; @@ -254,6 +268,8 @@ extern "C" { // set timers for time-out and cadence sys_timeout(Ping_timeout_ms, t_ping_timeout, ping); sys_timeout(Ping_coarse, t_ping_coarse_tmr, ping); + + return 0; } } @@ -268,23 +284,26 @@ void PingResponsePoll(void) { uint32_t success = ping->success_count; uint32_t ip = ping->ip; - Response_P(PSTR("{\"" D_JSON_PING "\":{\"%d.%d.%d.%d\":{" + Response_P(PSTR("{\"" D_JSON_PING "\":{\"%s\":{" "\"Reachable\":%s" + ",\"IP\":\"%d.%d.%d.%d\"" ",\"Success\":%d" ",\"Timeout\":%d" ",\"MinTime\":%d" ",\"MaxTime\":%d" ",\"AvgTime\":%d" "}}}"), - ip & 0xFF, (ip >> 8) & 0xFF, (ip >> 16) & 0xFF, ip >> 24, + ping->hostname.c_str(), success ? "true" : "false", - success, ping->timeout_count, - success ? ping->min_time : 0, ping->max_time, + ip & 0xFF, (ip >> 8) & 0xFF, (ip >> 16) & 0xFF, ip >> 24, + success, + ping->timeout_count, + success ? ping->min_time : 0, + ping->max_time, success ? ping->sum_time / success : 0 ); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_PING)); - XdrvRulesProcess(); - + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_PING)); + // remove from linked list *prev_link = ping->next; // don't increment prev_link @@ -304,18 +323,15 @@ void PingResponsePoll(void) { void CmndPing(void) { uint32_t count = XdrvMailbox.index; - IPAddress ip; RemoveSpace(XdrvMailbox.data); if (count > 10) { count = 8; } // max 8 seconds - if (WiFi.hostByName(XdrvMailbox.data, ip)) { - bool ok = t_ping_start(ip, count); - if (ok) { - ResponseCmndDone(); - } else { - ResponseCmndChar_P(PSTR("Ping already ongoing for this IP")); - } + int32_t res = t_ping_start(XdrvMailbox.data, count); + if (0 == res) { + ResponseCmndDone(); + } else if (-1 == res) { + ResponseCmndChar_P(PSTR("Ping already ongoing for this IP")); } else { ResponseCmndChar_P(PSTR("Unable to resolve IP address")); } diff --git a/tasmota/xdrv_40_telegram.ino b/tasmota/xdrv_40_telegram.ino index a7beb5005..92fca7c90 100644 --- a/tasmota/xdrv_40_telegram.ino +++ b/tasmota/xdrv_40_telegram.ino @@ -57,7 +57,7 @@ BearSSL::WiFiClientSecure_light *telegramClient = nullptr; static const uint8_t Telegram_Fingerprint[] PROGMEM = USE_TELEGRAM_FINGERPRINT; struct { - String message[3][6]; // amount of messages read per time (update_id, name_id, name, lastname, chat_id, text) + String message[3][6]; // Amount of messages read per time (update_id, name_id, name, lastname, chat_id, text) uint8_t state = 0; uint8_t index = 0; uint8_t retry = 0; @@ -67,6 +67,7 @@ struct { bool recv_enable = false; bool echo_enable = false; bool recv_busy = false; + bool skip = true; // Skip first telegram if restarted } Telegram; bool TelegramInit(void) { @@ -172,7 +173,7 @@ void TelegramGetUpdates(String offset) { // } // ]} -// AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: Response %s"), response.c_str()); + AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("TGM: Response %s"), response.c_str()); // parsing of reply from Telegram into separate received messages int i = 0; //messages received counter @@ -349,10 +350,14 @@ void TelegramLoop(void) { Telegram.state++; } } else { - if (Telegram.message[0][0].toInt() && (Telegram.message[Telegram.index][5].length() > 0)) { - String logging = TelegramExecuteCommand(Telegram.message[Telegram.index][5].c_str()); - if (logging.length() > 0) { - TelegramSendMessage(Telegram.message[Telegram.index][4], logging); + if (Telegram.skip) { // Skip first update after restart as it may be a restart (again) + Telegram.skip = false; + } else { + if (Telegram.message[0][0].toInt() && (Telegram.message[Telegram.index][5].length() > 0)) { + String logging = TelegramExecuteCommand(Telegram.message[Telegram.index][5].c_str()); + if (logging.length() > 0) { + TelegramSendMessage(Telegram.message[Telegram.index][4], logging); + } } } Telegram.message[0][0] = ""; // All messages have been replied - reset new messages diff --git a/tasmota/xlgt_03_sm16716.ino b/tasmota/xlgt_03_sm16716.ino index 314122a8b..0c6866ada 100644 --- a/tasmota/xlgt_03_sm16716.ino +++ b/tasmota/xlgt_03_sm16716.ino @@ -148,7 +148,11 @@ void Sm16716ModuleSelected(void) for (uint32_t i = 0; i < Light.subtype; i++) { Settings.pwm_value[i] = 0; // Disable direct PWM control if (PinUsed(GPIO_PWM1, i)) { +#ifdef ESP8266 pinMode(Pin(GPIO_PWM1, i), OUTPUT); +#else // ESP32 + analogAttach(Pin(GPIO_PWM1, i), i); +#endif } } */ diff --git a/tasmota/xsns_01_counter.ino b/tasmota/xsns_01_counter.ino index 73c19322e..5b6de4e4c 100644 --- a/tasmota/xsns_01_counter.ino +++ b/tasmota/xsns_01_counter.ino @@ -49,7 +49,6 @@ struct COUNTER { uint32_t last_cycle; uint32_t cycle_time; -//void ICACHE_RAM_ATTR CounterUpdate(uint8_t index) { void ICACHE_RAM_ATTR CounterIsrArg(void *arg) { uint32_t index = *static_cast(arg); @@ -94,15 +93,15 @@ void ICACHE_RAM_ATTR CounterIsrArg(void *arg) { // add 100.000 cpu ticks to ensure right step calculation uint32_t steps = (current_cycle-last_cycle+100000)/(clockCyclesPerMicrosecond() * 10000); cycle_time = (current_cycle-last_cycle)/steps; - #ifdef ESP8266 +#ifdef ESP8266 pinMode(Pin(GPIO_PWM1, index), OUTPUT); uint32_t high = (cycle_time * 5) / 1023; uint32_t low = cycle_time - high; // 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 startWaveformClockCycles(Pin(GPIO_PWM1, index), high, low, 0, -1, 0, true); - #else +#else // ESP32 analogWrite(Pin(GPIO_PWM1, index), 5); - #endif +#endif // ESP8266 - ESP32 } last_cycle = current_cycle; } @@ -120,27 +119,7 @@ void ICACHE_RAM_ATTR CounterIsrArg(void *arg) { } } } -/* -void ICACHE_RAM_ATTR CounterUpdate1(void) -{ - CounterUpdate(0); -} -void ICACHE_RAM_ATTR CounterUpdate2(void) -{ - CounterUpdate(1); -} - -void ICACHE_RAM_ATTR CounterUpdate3(void) -{ - CounterUpdate(2); -} - -void ICACHE_RAM_ATTR CounterUpdate4(void) -{ - CounterUpdate(3); -} -*/ /********************************************************************************************/ void CounterInterruptDisable(bool state) { @@ -172,20 +151,15 @@ bool CounterPinState(void) void CounterInit(void) { -// typedef void (*function) () ; -// function counter_callbacks[] = { CounterUpdate1, CounterUpdate2, CounterUpdate3, CounterUpdate4 }; - for (uint32_t i = 0; i < MAX_COUNTERS; i++) { if (PinUsed(GPIO_CNTR1, i)) { Counter.any_counter = true; pinMode(Pin(GPIO_CNTR1, i), bitRead(Counter.no_pullup, i) ? INPUT : INPUT_PULLUP); if ((0 == Settings.pulse_counter_debounce_low) && (0 == Settings.pulse_counter_debounce_high) && !Settings.flag4.zerocross_dimmer) { Counter.pin_state = 0; -// attachInterrupt(Pin(GPIO_CNTR1, i), counter_callbacks[i], FALLING); attachInterruptArg(Pin(GPIO_CNTR1, i), CounterIsrArg, &ctr_index[i], FALLING); } else { Counter.pin_state = 0x8f; -// attachInterrupt(Pin(GPIO_CNTR1, i), counter_callbacks[i], CHANGE); attachInterruptArg(Pin(GPIO_CNTR1, i), CounterIsrArg, &ctr_index[i], CHANGE); } } diff --git a/tasmota/xsns_02_analog.ino b/tasmota/xsns_02_analog.ino index 235a91bdd..963406b3f 100644 --- a/tasmota/xsns_02_analog.ino +++ b/tasmota/xsns_02_analog.ino @@ -17,6 +17,7 @@ along with this program. If not, see . */ +#ifdef ESP8266 #ifndef USE_ADC_VCC /*********************************************************************************************\ * ADC support @@ -455,4 +456,5 @@ bool Xsns02(uint8_t function) return result; } -#endif // USE_ADC_VCC \ No newline at end of file +#endif // USE_ADC_VCC +#endif // ESP8266 diff --git a/tasmota/xsns_02_analog_esp32.ino b/tasmota/xsns_02_analog_esp32.ino new file mode 100644 index 000000000..a47db706a --- /dev/null +++ b/tasmota/xsns_02_analog_esp32.ino @@ -0,0 +1,562 @@ +/* + xsns_02_analog_esp32.ino - ESP32 ADC support 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 . +*/ + +#ifdef ESP32 +#ifdef USE_ADC +/*********************************************************************************************\ + * ADC support for up to 8 channels on GPIO32 to GPIO39 +\*********************************************************************************************/ + +#define XSNS_02 2 + +#define ANALOG_RESOLUTION 12 // 12 = 4095, 11 = 2047, 10 = 1023 +#define ANALOG_RANGE 4095 + +#define TO_CELSIUS(x) ((x) - 273.15) +#define TO_KELVIN(x) ((x) + 273.15) + +// Parameters for equation +#define ANALOG_V33 3.3 // ESP8266 Analog voltage +#define ANALOG_T0 TO_KELVIN(25.0) // 25 degrees Celcius in Kelvin (= 298.15) + +// Shelly 2.5 NTC Thermistor +// 3V3 --- ANALOG_NTC_BRIDGE_RESISTANCE ---v--- NTC --- Gnd +// | +// ADC0 +#define ANALOG_NTC_BRIDGE_RESISTANCE 32000 // NTC Voltage bridge resistor +#define ANALOG_NTC_RESISTANCE 10000 // NTC Resistance +#define ANALOG_NTC_B_COEFFICIENT 3350 // NTC Beta Coefficient + +// LDR parameters +// 3V3 --- LDR ---v--- ANALOG_LDR_BRIDGE_RESISTANCE --- Gnd +// | +// ADC0 +#define ANALOG_LDR_BRIDGE_RESISTANCE 10000 // LDR Voltage bridge resistor +#define ANALOG_LDR_LUX_CALC_SCALAR 12518931 // Experimental +#define ANALOG_LDR_LUX_CALC_EXPONENT -1.4050 // Experimental + +// CT Based Apparrent Power Measurement Parameters +// 3V3 --- R1 ----v--- R1 --- Gnd +// | +// CT+ CT- +// | +// ADC0 +// Default settings for a 20A/1V Current Transformer. +// Analog peak to peak range is measured and converted to RMS current using ANALOG_CT_MULTIPLIER +#define ANALOG_CT_FLAGS 0 // (uint32_t) reserved for possible future use +#define ANALOG_CT_MULTIPLIER 2146 // (uint32_t) Multiplier*100000 to convert raw ADC peak to peak range 0..ANALOG_RANGE to RMS current in Amps. Value of 100000 corresponds to 1 +#define ANALOG_CT_VOLTAGE 2300 // (int) Convert current in Amps to apparrent power in Watts using voltage in Volts*10. Value of 2200 corresponds to 220V + +#define CT_FLAG_ENERGY_RESET (1 << 0) // Reset energy total + +struct { + uint8_t present = 0; + uint8_t type = 0; +} Adcs; + +struct { + float temperature = 0; + float current = 0; + float energy = 0; + uint32_t param1 = 0; + uint32_t param2 = 0; + int param3 = 0; + int param4 = 0; + uint32_t previous_millis = 0; + uint16_t last_value = 0; + uint8_t type = 0; + uint8_t pin = 0; +} Adc[MAX_ADCS]; + +void AdcSaveSettings(uint32_t idx) { + char parameters[32]; + snprintf_P(parameters, sizeof(parameters), PSTR("%d,%d,%d,%d,%d"), + Adc[idx].type, Adc[idx].param1, Adc[idx].param2, Adc[idx].param3, Adc[idx].param4); + SettingsUpdateText(SET_ADC_PARAM1 + idx, parameters); +} + +void AdcGetSettings(uint32_t idx) { + char parameters[32]; + Adcs.type = 0; + Adc[idx].param1 = 0; + Adc[idx].param2 = 0; + Adc[idx].param3 = 0; + Adc[idx].param4 = 0; + if (strstr(SettingsText(SET_ADC_PARAM1 + idx), ",") != nullptr) { + Adcs.type = atoi(subStr(parameters, SettingsText(SET_ADC_PARAM1 + idx), ",", 1)); + Adc[idx].param1 = atoi(subStr(parameters, SettingsText(SET_ADC_PARAM1 + idx), ",", 2)); + Adc[idx].param2 = atoi(subStr(parameters, SettingsText(SET_ADC_PARAM1 + idx), ",", 3)); + Adc[idx].param3 = atoi(subStr(parameters, SettingsText(SET_ADC_PARAM1 + idx), ",", 4)); + Adc[idx].param4 = atoi(subStr(parameters, SettingsText(SET_ADC_PARAM1 + idx), ",", 5)); + } +} + +void AdcInitParams(uint8_t idx) { + if ((Adcs.type != Adc[idx].type) || (Adc[idx].param1 > 1000000)) { + if (ADC_TEMP == Adc[idx].type) { + // Default Shelly 2.5 and 1PM parameters + Adc[idx].param1 = ANALOG_NTC_BRIDGE_RESISTANCE; + Adc[idx].param2 = ANALOG_NTC_RESISTANCE; + Adc[idx].param3 = ANALOG_NTC_B_COEFFICIENT * 10000; + } + else if (ADC_LIGHT == Adc[idx].type) { + Adc[idx].param1 = ANALOG_LDR_BRIDGE_RESISTANCE; + Adc[idx].param2 = ANALOG_LDR_LUX_CALC_SCALAR; + Adc[idx].param3 = ANALOG_LDR_LUX_CALC_EXPONENT * 10000; + } + else if (ADC_RANGE == Adc[idx].type) { + Adc[idx].param1 = 0; + Adc[idx].param2 = ANALOG_RANGE; + Adc[idx].param3 = 0; + Adc[idx].param4 = 100; + } + else if (ADC_CT_POWER == Adc[idx].type) { + Adc[idx].param1 = ANALOG_CT_FLAGS; //(uint32_t) 0 + Adc[idx].param2 = ANALOG_CT_MULTIPLIER; //(uint32_t) 100000 + Adc[idx].param3 = ANALOG_CT_VOLTAGE; //(int) 10 + } + else if (ADC_JOY == Adc[idx].type) { + Adc[idx].param1 = (ANALOG_RANGE / 2) -128; + } + } +} + +void AdcAttach(uint8_t pin, uint8_t type) { + Adc[Adcs.present].pin = pin; + if (adcAttachPin(Adc[Adcs.present].pin)) { + Adc[Adcs.present].type = type; +// analogSetPinAttenuation(Adc[Adcs.present].pin, ADC_11db); // Default + Adcs.present++; + } +} + +void AdcInit(void) { + Adcs.present = 0; + for (uint32_t i = 0; i < MAX_ADCS; i++) { + if (PinUsed(GPIO_ADC_INPUT, i)) { + AdcAttach(Pin(GPIO_ADC_INPUT, i), ADC_INPUT); + } + if (PinUsed(GPIO_ADC_TEMP, i)) { + AdcAttach(Pin(GPIO_ADC_TEMP, i), ADC_TEMP); + } + if (PinUsed(GPIO_ADC_LIGHT, i)) { + AdcAttach(Pin(GPIO_ADC_LIGHT, i), ADC_LIGHT); + } + if (PinUsed(GPIO_ADC_BUTTON, i)) { + AdcAttach(Pin(GPIO_ADC_BUTTON, i), ADC_BUTTON); + } + if (PinUsed(GPIO_ADC_BUTTON_INV, i)) { + AdcAttach(Pin(GPIO_ADC_BUTTON_INV, i), ADC_BUTTON_INV); + } + if (PinUsed(GPIO_ADC_RANGE, i)) { + AdcAttach(Pin(GPIO_ADC_RANGE, i), ADC_RANGE); + } + if (PinUsed(GPIO_ADC_CT_POWER, i)) { + AdcAttach(Pin(GPIO_ADC_CT_POWER, i), ADC_CT_POWER); + } + if (PinUsed(GPIO_ADC_JOY, i)) { + AdcAttach(Pin(GPIO_ADC_JOY, i), ADC_JOY); + } + } + if (Adcs.present) { + analogSetClockDiv(1); // Default 1 + analogSetWidth(ANALOG_RESOLUTION); // Default 12 bits (0 - 4095) + analogSetAttenuation(ADC_11db); // Default 11db + for (uint32_t idx = 0; idx < Adcs.present; idx++) { + AdcGetSettings(idx); + AdcInitParams(idx); + AdcSaveSettings(idx); + } + } +} + +uint16_t AdcRead(uint32_t pin, uint32_t factor) { + // factor 1 = 2 samples + // factor 2 = 4 samples + // factor 3 = 8 samples + // factor 4 = 16 samples + // factor 5 = 32 samples + uint32_t samples = 1 << factor; + uint32_t analog = 0; + for (uint32_t i = 0; i < samples; i++) { + analog += analogRead(pin); + delay(1); + } + analog >>= factor; + return analog; +} + +#ifdef USE_RULES +void AdcEvery250ms(void) { + for (uint32_t idx = 0; idx < Adcs.present; idx++) { + if (ADC_INPUT == Adc[idx].type) { + uint16_t new_value = AdcRead(Adc[idx].pin, 5); + if ((new_value < Adc[idx].last_value -10) || (new_value > Adc[idx].last_value +10)) { + Adc[idx].last_value = new_value; + uint16_t value = Adc[idx].last_value / 10; + Response_P(PSTR("{\"ANALOG\":{\"A%ddiv10\":%d}}"), idx +1, (value > 99) ? 100 : value); + XdrvRulesProcess(); + } + } + else if (ADC_JOY == Adc[idx].type) { + uint16_t new_value = AdcRead(Adc[idx].pin, 1); + if (new_value && (new_value != Adc[idx].last_value)) { + Adc[idx].last_value = new_value; + uint16_t value = new_value / Adc[idx].param1; + Response_P(PSTR("{\"ANALOG\":{\"Joy%d\":%d}}"), idx +1, value); + XdrvRulesProcess(); + } else { + Adc[idx].last_value = 0; + } + } + } +} +#endif // USE_RULES + +uint16_t AdcGetLux(uint32_t idx) { + int adc = AdcRead(Adc[idx].pin, 2); + // Source: https://www.allaboutcircuits.com/projects/design-a-luxmeter-using-a-light-dependent-resistor/ + double resistorVoltage = ((double)adc / ANALOG_RANGE) * ANALOG_V33; + double ldrVoltage = ANALOG_V33 - resistorVoltage; + double ldrResistance = ldrVoltage / resistorVoltage * (double)Adc[idx].param1; + double ldrLux = (double)Adc[idx].param2 * FastPrecisePow(ldrResistance, (double)Adc[idx].param3 / 10000); + + return (uint16_t)ldrLux; +} + +uint16_t AdcGetRange(uint32_t idx) { + // formula for calibration: value, fromLow, fromHigh, toLow, toHigh + // Example: 514, 632, 236, 0, 100 + // int( (( - ) / ( - ) ) * ( - ) ) + ) + int adc = AdcRead(Adc[idx].pin, 2); + double adcrange = ( ((double)Adc[idx].param2 - (double)adc) / ( ((double)Adc[idx].param2 - (double)Adc[idx].param1)) * ((double)Adc[idx].param3 - (double)Adc[idx].param4) + (double)Adc[idx].param4 ); + return (uint16_t)adcrange; +} + +void AdcGetCurrentPower(uint8_t idx, uint8_t factor) { + // factor 1 = 2 samples + // factor 2 = 4 samples + // factor 3 = 8 samples + // factor 4 = 16 samples + // factor 5 = 32 samples + uint8_t samples = 1 << factor; + uint16_t analog = 0; + uint16_t analog_min = ANALOG_RANGE; + uint16_t analog_max = 0; + + if (0 == Adc[idx].param1) { + for (uint32_t i = 0; i < samples; i++) { + analog = analogRead(Adc[idx].pin); + if (analog < analog_min) { + analog_min = analog; + } + if (analog > analog_max) { + analog_max = analog; + } + delay(1); + } + Adc[idx].current = (float)(analog_max-analog_min) * ((float)(Adc[idx].param2) / 100000); + } + else { + analog = AdcRead(Adc[idx].pin, 5); + if (analog > Adc[idx].param1) { + Adc[idx].current = ((float)(analog) - (float)Adc[idx].param1) * ((float)(Adc[idx].param2) / 100000); + } + else { + Adc[idx].current = 0; + } + } + + float power = Adc[idx].current * (float)(Adc[idx].param3) / 10; + uint32_t current_millis = millis(); + Adc[idx].energy = Adc[idx].energy + ((power * (current_millis - Adc[idx].previous_millis)) / 3600000000); + Adc[idx].previous_millis = current_millis; +} + +void AdcEverySecond(void) { + for (uint32_t idx = 0; idx < Adcs.present; idx++) { + if (ADC_TEMP == Adc[idx].type) { + int adc = AdcRead(Adc[idx].pin, 2); + // Steinhart-Hart equation for thermistor as temperature sensor + double Rt = (adc * Adc[idx].param1) / (1024.0 * ANALOG_V33 - (double)adc); + double BC = (double)Adc[idx].param3 / 10000; + double T = BC / (BC / ANALOG_T0 + TaylorLog(Rt / (double)Adc[idx].param2)); + Adc[idx].temperature = ConvertTemp(TO_CELSIUS(T)); + } + else if (ADC_CT_POWER == Adc[idx].type) { + AdcGetCurrentPower(idx, 5); + } + } +} + +void AdcShowContinuation(bool *jsonflg) { + if (*jsonflg) { + ResponseAppend_P(PSTR(",")); + } else { + ResponseAppend_P(PSTR(",\"ANALOG\":{")); + *jsonflg = true; + } +} + +void AdcShow(bool json) { + bool domo_flag[ADC_END] = { false }; + char adc_name[10]; // ANALOG8 + + bool jsonflg = false; + for (uint32_t idx = 0; idx < Adcs.present; idx++) { + snprintf_P(adc_name, sizeof(adc_name), PSTR("Analog%d"), idx +1); + + switch (Adc[idx].type) { + case ADC_INPUT: { + uint16_t analog = AdcRead(Adc[idx].pin, 5); + + if (json) { + AdcShowContinuation(&jsonflg); + ResponseAppend_P(PSTR("\"A%d\":%d"), idx +1, analog); +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_ANALOG, "", idx +1, analog); +#endif // USE_WEBSERVER + } + break; + } + case ADC_TEMP: { + char temperature[33]; + dtostrfd(Adc[idx].temperature, Settings.flag2.temperature_resolution, temperature); + + if (json) { + AdcShowContinuation(&jsonflg); + ResponseAppend_P(PSTR("\"" D_JSON_TEMPERATURE "%d\":%s"), idx +1, temperature); + if ((0 == tele_period) && (!domo_flag[ADC_TEMP])) { +#ifdef USE_DOMOTICZ + DomoticzSensor(DZ_TEMP, temperature); + domo_flag[ADC_TEMP] = true; +#endif // USE_DOMOTICZ +#ifdef USE_KNX + KnxSensor(KNX_TEMPERATURE, Adc[idx].temperature); +#endif // USE_KNX + } +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_TEMP, adc_name, temperature, TempUnit()); +#endif // USE_WEBSERVER + } + break; + } + case ADC_LIGHT: { + uint16_t adc_light = AdcGetLux(idx); + + if (json) { + AdcShowContinuation(&jsonflg); + ResponseAppend_P(PSTR("\"" D_JSON_ILLUMINANCE "%d\":%d"), idx +1, adc_light); +#ifdef USE_DOMOTICZ + if ((0 == tele_period) && (!domo_flag[ADC_LIGHT])) { + DomoticzSensor(DZ_ILLUMINANCE, adc_light); + domo_flag[ADC_LIGHT] = true; + } +#endif // USE_DOMOTICZ +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_ILLUMINANCE, adc_name, adc_light); +#endif // USE_WEBSERVER + } + break; + } + case ADC_RANGE: { + uint16_t adc_range = AdcGetRange(idx); + + if (json) { + AdcShowContinuation(&jsonflg); + ResponseAppend_P(PSTR("\"" D_JSON_RANGE "%d\":%d"), idx +1, adc_range); +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_RANGE, adc_name, adc_range); +#endif // USE_WEBSERVER + } + break; + } + case ADC_CT_POWER: { + AdcGetCurrentPower(idx, 5); + + float voltage = (float)(Adc[idx].param3) / 10; + char voltage_chr[FLOATSZ]; + dtostrfd(voltage, Settings.flag2.voltage_resolution, voltage_chr); + char current_chr[FLOATSZ]; + dtostrfd(Adc[idx].current, Settings.flag2.current_resolution, current_chr); + char power_chr[FLOATSZ]; + dtostrfd(voltage * Adc[idx].current, Settings.flag2.wattage_resolution, power_chr); + char energy_chr[FLOATSZ]; + dtostrfd(Adc[idx].energy, Settings.flag2.energy_resolution, energy_chr); + + if (json) { + AdcShowContinuation(&jsonflg); + ResponseAppend_P(PSTR("\"CTEnergy%d\":{\"" D_JSON_ENERGY "\":%s,\"" D_JSON_POWERUSAGE "\":%s,\"" D_JSON_VOLTAGE "\":%s,\"" D_JSON_CURRENT "\":%s}"), + idx +1, energy_chr, power_chr, voltage_chr, current_chr); +#ifdef USE_DOMOTICZ + if ((0 == tele_period) && (!domo_flag[ADC_CT_POWER])) { + DomoticzSensor(DZ_POWER_ENERGY, power_chr); + DomoticzSensor(DZ_VOLTAGE, voltage_chr); + DomoticzSensor(DZ_CURRENT, current_chr); + domo_flag[ADC_CT_POWER] = true; + } +#endif // USE_DOMOTICZ +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_VOLTAGE, voltage_chr); + WSContentSend_PD(HTTP_SNS_CURRENT, current_chr); + WSContentSend_PD(HTTP_SNS_POWER, power_chr); + WSContentSend_PD(HTTP_SNS_ENERGY_TOTAL, energy_chr); +#endif // USE_WEBSERVER + } + break; + } + case ADC_JOY: { + uint16_t new_value = AdcRead(Adc[idx].pin, 1); + uint16_t value = new_value / Adc[idx].param1; + if (json) { + AdcShowContinuation(&jsonflg); + ResponseAppend_P(PSTR("\"Joy%d\":%d"), idx +1, value); + } + break; + } + } + } + if (jsonflg) { + ResponseJsonEnd(); + } +} + +/*********************************************************************************************\ + * Commands +\*********************************************************************************************/ + +const char kAdcCommands[] PROGMEM = "|" // No prefix + D_CMND_ADCPARAM; + +void (* const AdcCommand[])(void) PROGMEM = { + &CmndAdcParam }; + +void CmndAdcParam(void) { + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_ADCS)) { + uint8_t idx = XdrvMailbox.index -1; + if (XdrvMailbox.data_len) { + if ((ADC_TEMP == XdrvMailbox.payload) || + (ADC_LIGHT == XdrvMailbox.payload) || + (ADC_RANGE == XdrvMailbox.payload) || + (ADC_CT_POWER == XdrvMailbox.payload) || + (ADC_JOY == XdrvMailbox.payload)) { + AdcGetSettings(idx); + if (ChrCount(XdrvMailbox.data, ",") > 2) { // Process parameter entry + char sub_string[XdrvMailbox.data_len +1]; + // AdcParam 2, 32000, 10000, 3350 + // AdcParam 3, 10000, 12518931, -1.405 + // AdcParam 6, 0, ANALOG_RANGE, 0, 100 + // AdcParam 7, 0, 2146, 0.23 + // AdcParam 8, 1000, 0, 0 + Adc[idx].type = XdrvMailbox.payload; + Adc[idx].param1 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); + Adc[idx].param2 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 3), nullptr, 10); + if (ADC_RANGE == XdrvMailbox.payload) { + Adc[idx].param3 = abs(strtol(subStr(sub_string, XdrvMailbox.data, ",", 4), nullptr, 10)); + Adc[idx].param4 = abs(strtol(subStr(sub_string, XdrvMailbox.data, ",", 5), nullptr, 10)); + } else { + Adc[idx].param3 = (int)(CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 4)) * 10000); + } + if (ADC_CT_POWER == XdrvMailbox.payload) { + if (((1 == Adc[idx].param1) & CT_FLAG_ENERGY_RESET) > 0) { + for (uint32_t idx = 0; idx < MAX_ADCS; idx++) { + Adc[idx].energy = 0; + } + Adc[idx].param1 ^= CT_FLAG_ENERGY_RESET; // Cancel energy reset flag + } + } + } else { // Set default values based on current adc type + // AdcParam 2 + // AdcParam 3 + // AdcParam 6 + // AdcParam 7 + // AdcParam 8 + Adcs.type = 0; + AdcInitParams(idx); + } + AdcSaveSettings(idx); + } + } + + // AdcParam + AdcGetSettings(idx); + Response_P(PSTR("{\"" D_CMND_ADCPARAM "%d\":[%d,%d,%d"), idx +1, Adcs.type, Adc[idx].param1, Adc[idx].param2); + if (ADC_RANGE == Adc[idx].type) { + ResponseAppend_P(PSTR(",%d,%d"), Adc[idx].param3, Adc[idx].param4); + } else { + int value = Adc[idx].param3; + uint8_t precision; + for (precision = 4; precision > 0; precision--) { + if (value % 10) { break; } + value /= 10; + } + char param3[33]; + dtostrfd(((double)Adc[idx].param3)/10000, precision, param3); + ResponseAppend_P(PSTR(",%s"), param3); + } + ResponseAppend_P(PSTR("]}")); + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns02(uint8_t function) { + bool result = false; + + switch (function) { + case FUNC_COMMAND: + result = DecodeCommand(kAdcCommands, AdcCommand); + break; + case FUNC_INIT: + AdcInit(); + break; + default: + if (Adcs.present) { + switch (function) { +#ifdef USE_RULES + case FUNC_EVERY_250_MSECOND: + AdcEvery250ms(); + break; +#endif // USE_RULES + case FUNC_EVERY_SECOND: + AdcEverySecond(); + break; + case FUNC_JSON_APPEND: + AdcShow(1); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + AdcShow(0); + break; +#endif // USE_WEBSERVER + } + } + } + return result; +} + +#endif // USE_ADC +#endif // ESP32 diff --git a/tasmota/xsns_29_mcp230xx.ino b/tasmota/xsns_29_mcp230xx.ino index 208fbcdd8..b12eceeff 100644 --- a/tasmota/xsns_29_mcp230xx.ino +++ b/tasmota/xsns_29_mcp230xx.ino @@ -45,6 +45,10 @@ uint8_t MCP230xx_GPIO = 0x09; uint8_t mcp230xx_type = 0; uint8_t mcp230xx_pincount = 0; +uint8_t mcp230xx_oldoutpincount = 0; +#ifdef USE_MCP230xx_OUTPUT +uint8_t mcp230xx_outpinmapping[16]; +#endif uint8_t mcp230xx_int_en = 0; uint8_t mcp230xx_int_prio_counter = 0; uint8_t mcp230xx_int_counter_en = 0; @@ -192,9 +196,16 @@ void MCP230xx_ApplySettings(void) I2cWrite8(USE_MCP230xx_ADDR, MCP230xx_GPIO+mcp230xx_port, reg_portpins); #endif // USE_MCP230xx_OUTPUT } + devices_present -= mcp230xx_oldoutpincount; + mcp230xx_oldoutpincount = 0; for (uint32_t idx=0;idx= 5) { + mcp230xx_outpinmapping[mcp230xx_oldoutpincount] = idx; + mcp230xx_oldoutpincount++; + } int_millis[idx]=millis(); } + devices_present += mcp230xx_oldoutpincount; mcp230xx_int_en = int_en; MCP230xx_CheckForIntCounter(); // update register on whether or not we should be counting interrupts MCP230xx_CheckForIntRetainer(); // update register on whether or not we should be retaining interrupt events for teleperiod @@ -331,11 +342,31 @@ void MCP230xx_Show(bool json) uint8_t gpio = MCP230xx_readGPIO(0); ResponseAppend_P(PSTR(",\"MCP230XX\":{\"D0\":%i,\"D1\":%i,\"D2\":%i,\"D3\":%i,\"D4\":%i,\"D5\":%i,\"D6\":%i,\"D7\":%i"), (gpio>>0)&1,(gpio>>1)&1,(gpio>>2)&1,(gpio>>3)&1,(gpio>>4)&1,(gpio>>5)&1,(gpio>>6)&1,(gpio>>7)&1); + uint8_t gpiob = 0; if (2 == mcp230xx_type) { - gpio = MCP230xx_readGPIO(1); + gpiob = MCP230xx_readGPIO(1); ResponseAppend_P(PSTR(",\"D8\":%i,\"D9\":%i,\"D10\":%i,\"D11\":%i,\"D12\":%i,\"D13\":%i,\"D14\":%i,\"D15\":%i"), - (gpio>>0)&1,(gpio>>1)&1,(gpio>>2)&1,(gpio>>3)&1,(gpio>>4)&1,(gpio>>5)&1,(gpio>>6)&1,(gpio>>7)&1); + (gpiob>>0)&1, (gpiob>>1)&1, (gpiob>>2)&1, (gpiob>>3)&1, (gpiob>>4)&1, (gpiob>>5)&1, (gpiob>>6)&1, (gpiob>>7)&1); } + +#ifdef USE_MCP230xx_OUTPUT + uint8_t outputcount = 0; + for (uint32_t pinx = 0; pinx < mcp230xx_pincount; pinx++) { + if (Settings.mcp230xx_config[pinx].pinmode >= 5) { outputcount++; } + } + if (outputcount) { + uint16_t gpiototal = ((uint16_t)gpiob << 8) | gpio; + ResponseAppend_P(PSTR(",\"MCP230_OUT\":{")); + char stt[7]; + for (uint32_t pinx = 0; pinx < mcp230xx_pincount; pinx++) { + if (Settings.mcp230xx_config[pinx].pinmode >= 5) { + sprintf(stt, ConvertNumTxt(((gpiototal>>pinx)&1), Settings.mcp230xx_config[pinx].pinmode)); + ResponseAppend_P(PSTR("\"OUT_D%i\":\"%s\","), pinx, stt); + } + } + ResponseAppend_P(PSTR("\"END\":1}")); + } +#endif // USE_MCP230xx_OUTPUT ResponseJsonEnd(); } } @@ -351,27 +382,13 @@ void MCP230xx_SetOutPin(uint8_t pin,uint8_t pinstate) { char cmnd[7], stt[4]; if (pin > 7) { port = 1; } portpins = MCP230xx_readGPIO(port); - if (interlock && (pinmo == Settings.mcp230xx_config[pin+pinadd].pinmode)) { - if (pinstate < 2) { - if (6 == pinmo) { - if (pinstate) portpins |= (1 << (pin-(port*8))); else portpins |= (1 << (pin+pinadd-(port*8))),portpins &= ~(1 << (pin-(port*8))); - } else { - if (pinstate) portpins &= ~(1 << (pin+pinadd-(port*8))),portpins |= (1 << (pin-(port*8))); else portpins &= ~(1 << (pin-(port*8))); - } - } else { - if (6 == pinmo) { - portpins |= (1 << (pin+pinadd-(port*8))),portpins ^= (1 << (pin-(port*8))); - } else { - portpins &= ~(1 << (pin+pinadd-(port*8))),portpins ^= (1 << (pin-(port*8))); - } - } + + if (pinstate < 2) { + if (pinstate) portpins |= (1 << (pin-(port*8))); else portpins &= ~(1 << (pin-(port*8))); } else { - if (pinstate < 2) { - if (pinstate) portpins |= (1 << (pin-(port*8))); else portpins &= ~(1 << (pin-(port*8))); - } else { - portpins ^= (1 << (pin-(port*8))); - } + portpins ^= (1 << (pin-(port*8))); } + I2cWrite8(USE_MCP230xx_ADDR, MCP230xx_GPIO + port, portpins); if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart - Firmware configured to save last known state in settings Settings.mcp230xx_config[pin].saved_state=portpins>>(pin-(port*8))&1; @@ -628,16 +645,21 @@ bool MCP230xx_Command(void) #ifdef USE_MCP230xx_OUTPUT if (Settings.mcp230xx_config[pin].pinmode >= 5) { uint8_t pincmd = Settings.mcp230xx_config[pin].pinmode - 5; + uint8_t relay_no = 0; + for (relay_no = 0; relay_no < mcp230xx_pincount ; relay_no ++) { + if ( mcp230xx_outpinmapping[relay_no] == pin) break; + } + relay_no = devices_present - mcp230xx_oldoutpincount + relay_no +1; if ((!strcmp(subStr(sub_string, XdrvMailbox.data, ",", 2), "ON")) || (!strcmp(subStr(sub_string, XdrvMailbox.data, ",", 2), "1"))) { - MCP230xx_SetOutPin(pin,abs(pincmd-1)); + ExecuteCommandPower(relay_no, 1, SRC_IGNORE); return serviced; } if ((!strcmp(subStr(sub_string, XdrvMailbox.data, ",", 2), "OFF")) || (!strcmp(subStr(sub_string, XdrvMailbox.data, ",", 2), "0"))) { - MCP230xx_SetOutPin(pin,pincmd); + ExecuteCommandPower(relay_no, 0, SRC_IGNORE); return serviced; } if ((!strcmp(subStr(sub_string, XdrvMailbox.data, ",", 2), "T")) || (!strcmp(subStr(sub_string, XdrvMailbox.data, ",", 2), "2"))) { - MCP230xx_SetOutPin(pin,2); + ExecuteCommandPower(relay_no, 2, SRC_IGNORE); return serviced; } } @@ -714,6 +736,7 @@ void MCP230xx_UpdateWebData(void) #endif // USE_MCP230xx_DISPLAYOUTPUT +/* #ifdef USE_MCP230xx_OUTPUT void MCP230xx_OutputTelemetry(void) @@ -743,6 +766,7 @@ void MCP230xx_OutputTelemetry(void) } #endif // USE_MCP230xx_OUTPUT +*/ void MCP230xx_Interrupt_Counter_Report(void) { ResponseTime_P(PSTR(",\"MCP230_INTTIMER\":{")); @@ -771,6 +795,25 @@ void MCP230xx_Interrupt_Retain_Report(void) { MqttPublishTeleSensor(); } +#ifdef USE_MCP230xx_OUTPUT +void MCP230xx_SwitchRelay() { + for (uint32_t i = devices_present - mcp230xx_oldoutpincount; i < devices_present; i++) { + uint8_t pin = mcp230xx_outpinmapping[i - (devices_present - mcp230xx_oldoutpincount)]; + uint8_t pincmd = Settings.mcp230xx_config[pin].pinmode - 5; + uint8_t relay_state = bitRead(XdrvMailbox.index, i); + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("MCP: relay %d pin_no %d state %d"), i,pin, relay_state); + switch (relay_state) { + case 1: + MCP230xx_SetOutPin(pin,abs(pincmd-1)); + break; + case 0: + MCP230xx_SetOutPin(pin,pincmd); + break; + } + } +} +#endif // USE_MCP230xx_OUTPUT + /*********************************************************************************************\ Interface \*********************************************************************************************/ @@ -781,7 +824,7 @@ bool Xsns29(uint8_t function) bool result = false; - if (FUNC_INIT == function) { + if (FUNC_PRE_INIT == function) { MCP230xx_Detect(); } else if (mcp230xx_type) { @@ -806,11 +849,18 @@ bool Xsns29(uint8_t function) if (mcp230xx_int_retainer_en) { // We have pins configured for interrupt retain reporting MCP230xx_Interrupt_Retain_Report(); } +/* #ifdef USE_MCP230xx_OUTPUT MCP230xx_OutputTelemetry(); #endif // USE_MCP230xx_OUTPUT +*/ } break; +#ifdef USE_MCP230xx_OUTPUT + case FUNC_SET_POWER: + MCP230xx_SwitchRelay(); + break; +#endif // USE_MCP230xx_OUTPUT case FUNC_JSON_APPEND: MCP230xx_Show(1); break; diff --git a/tasmota/xsns_32_mpu6050.ino b/tasmota/xsns_32_mpu6050.ino index 702d23224..c1f792ae7 100644 --- a/tasmota/xsns_32_mpu6050.ino +++ b/tasmota/xsns_32_mpu6050.ino @@ -181,7 +181,7 @@ void MPU_6050Show(bool json) { MPU_6050PerformReading(); - double tempConv = (MPU_6050_temperature / 340.0 + 35.53); + float tempConv = ConvertTemp(MPU_6050_temperature / 340.0 + 35.53); char temperature[33]; dtostrfd(tempConv, Settings.flag2.temperature_resolution, temperature); char axis_ax[33]; diff --git a/tasmota/xsns_62_MI_ESP32.ino b/tasmota/xsns_62_MI_ESP32.ino index fbdc5bf6b..0204b0462 100644 --- a/tasmota/xsns_62_MI_ESP32.ino +++ b/tasmota/xsns_62_MI_ESP32.ino @@ -20,6 +20,8 @@ -------------------------------------------------------------------------------------------- Version yyyymmdd Action Description -------------------------------------------------------------------------------------------- + 0.9.1.2 20200802 changed - add MHO-C303 + ------- 0.9.1.1 20200715 changed - add MHO-C401, refactoring ------- 0.9.1.0 20200712 changed - add lights and yeerc, add pure passive mode with decryption, @@ -66,14 +68,21 @@ struct { uint32_t willReadBatt:1; uint32_t shallSetUnit:1; uint32_t willSetUnit:1; + uint32_t shallTriggerTele:1; uint32_t triggeredTele:1; - uint32_t shallClearResults:1; - uint32_t directMQTT:1; // TODO: direct bridging of every single sensor message + uint32_t shallClearResults:1; // BLE scan results } mode; struct { uint8_t sensor; // points to to the number 0...255 } state; + struct { + uint32_t allwaysAggregate:1; + uint32_t showRSSI:1; + uint32_t ignoreBogusBattery:1; + uint32_t noSummary:1; + uint32_t minimalSummary:1; + } option; } MI32; #pragma pack(1) // byte-aligned structures to read the sensor data @@ -162,8 +171,39 @@ struct mi_sensor_t{ uint8_t lastCnt; //device generated counter of the packet uint8_t shallSendMQTT; uint8_t MAC[6]; + union { + struct { + uint32_t temp:1; + uint32_t hum:1; + uint32_t tempHum:1; //every hum sensor has temp too, easier to use Tasmota dew point functions + uint32_t lux:1; + uint32_t moist:1; + uint32_t fert:1; + uint32_t bat:1; + uint32_t NMT:1; + uint32_t PIR:1; + uint32_t Btn:1; + }; + uint32_t raw; + } feature; + union { + struct { + uint32_t temp:1; + uint32_t hum:1; + uint32_t tempHum:1; //can be combined from the sensor + uint32_t lux:1; + uint32_t moist:1; + uint32_t fert:1; + uint32_t bat:1; + uint32_t NMT:1; + uint32_t motion:1; + uint32_t noMotion:1; + uint32_t Btn:1; + }; + uint32_t raw; + } eventType; + int rssi; - // uint8_t showedUp; uint32_t lastTime; uint32_t lux; float temp; //Flora, MJ_HT_V1, LYWSD0x, CGx @@ -179,7 +219,6 @@ struct mi_sensor_t{ struct { uint16_t events; //"alarms" since boot uint32_t NMT; // no motion time in seconds for the MJYD2S - uint8_t eventType; //internal type of actual event for the MJYD2S -> 1: PIR, 2: No PIR, 3: NMT }; uint16_t Btn; }; @@ -213,10 +252,11 @@ const char kMI32_Commands[] PROGMEM = "Period|Time|Page|Battery|Unit #define MJYD2S 8 #define YEERC 9 #define MHOC401 10 +#define MHOC303 11 -#define MI_TYPES 10 //count this manually +#define MI32_TYPES 11 //count this manually -const uint16_t kMI32DeviceID[MI_TYPES]={ 0x0098, // Flora +const uint16_t kMI32DeviceID[MI32_TYPES]={ 0x0098, // Flora 0x01aa, // MJ_HT_V1 0x045b, // LYWSD02 0x055b, // LYWSD03 @@ -225,7 +265,8 @@ const uint16_t kMI32DeviceID[MI_TYPES]={ 0x0098, // Flora 0x03dd, // NLIGHT 0x07f6, // MJYD2S 0x0153, // yee-rc - 0x0387 // MHO-C401 + 0x0387, // MHO-C401 + 0x06d3 // MHO-C303 }; const char kMI32DeviceType1[] PROGMEM = "Flora"; @@ -238,7 +279,8 @@ const char kMI32DeviceType7[] PROGMEM = "NLIGHT"; const char kMI32DeviceType8[] PROGMEM = "MJYD2S"; const char kMI32DeviceType9[] PROGMEM = "YEERC"; const char kMI32DeviceType10[] PROGMEM ="MHOC401"; -const char * kMI32DeviceType[] PROGMEM = {kMI32DeviceType1,kMI32DeviceType2,kMI32DeviceType3,kMI32DeviceType4,kMI32DeviceType5,kMI32DeviceType6,kMI32DeviceType7,kMI32DeviceType8,kMI32DeviceType9,kMI32DeviceType10}; +const char kMI32DeviceType11[] PROGMEM ="MHOC303"; +const char * kMI32DeviceType[] PROGMEM = {kMI32DeviceType1,kMI32DeviceType2,kMI32DeviceType3,kMI32DeviceType4,kMI32DeviceType5,kMI32DeviceType6,kMI32DeviceType7,kMI32DeviceType8,kMI32DeviceType9,kMI32DeviceType10,kMI32DeviceType11}; /*********************************************************************************************\ * enumerations @@ -493,7 +535,7 @@ uint32_t MIBLEgetSensorSlot(uint8_t (&_MAC)[6], uint16_t _type, uint8_t counter) DEBUG_SENSOR_LOG(PSTR("%s: will test ID-type: %x"),D_CMND_MI32, _type); bool _success = false; - for (uint32_t i=0;idisconnect(); // NimBLEDevice::deleteClient(MI32Client); MI32.mode.willConnect = 0; + MI32.mode.willReadBatt = 0; //could be a "battery task" for LYWSD03MMC or MHO-C401 vTaskDelay(100/ portTICK_PERIOD_MS); vTaskDelete( NULL ); } @@ -786,12 +864,11 @@ void MI32StartTimeTask(){ } void MI32TimeTask(void *pvParameters){ - if (MIBLEsensors[MI32.state.sensor].type != LYWSD02) { + if (MIBLEsensors[MI32.state.sensor].type != LYWSD02 && MIBLEsensors[MI32.state.sensor].type != MHOC303) { MI32.mode.shallSetTime = 0; vTaskDelete( NULL ); } - - if(MI32ConnectActiveSensor()){ + if(MI32ConnectActiveSensor()){ uint32_t timer = 0; while (MI32.mode.connected == 0){ if (timer>1000){ @@ -852,7 +929,7 @@ void MI32StartUnitTask(){ } void MI32UnitTask(void *pvParameters){ - if (MIBLEsensors[MI32.state.sensor].type != LYWSD02) { + if (MIBLEsensors[MI32.state.sensor].type != LYWSD02 && MIBLEsensors[MI32.state.sensor].type != MHOC303) { MI32.mode.shallSetUnit = 0; vTaskDelete( NULL ); } @@ -1054,7 +1131,7 @@ void MI32parseMiBeacon(char * _buf, uint32_t _slot, uint16_t _bufSize){ // MIBLEsensors[_slot].lastTime = millis(); // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("MI32: MJYD2S secondary PIR")); // MIBLEsensors[_slot].NMT = 0; - // MI32triggerTele(); + // MI32.mode.shallTriggerTele = 1; // } } break; @@ -1067,56 +1144,63 @@ if (MIBLEsensors[_slot].type==NLIGHT){ } if(MIBLEsensors[_slot].type==6){ - DEBUG_SENSOR_LOG(PSTR("LYWSD03 and CGD1 no support for MiBeacon, type %u"),MIBLEsensors[_slot].type); + DEBUG_SENSOR_LOG(PSTR("CGD1 no support for MiBeacon, type %u"),MIBLEsensors[_slot].type); return; } AddLog_P2(LOG_LEVEL_DEBUG,PSTR("%s at slot %u"), kMI32DeviceType[MIBLEsensors[_slot].type-1],_slot); switch(_beacon.type){ case 0x01: MIBLEsensors[_slot].Btn=_beacon.Btn.num + (_beacon.Btn.longPress/2)*6; - MIBLEsensors[_slot].shallSendMQTT = 1; - MI32triggerTele(); + MIBLEsensors[_slot].eventType.Btn = 1; // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("Mode 1: U16: %u Button"), MIBLEsensors[_slot].Btn ); break; case 0x04: _tempFloat=(float)(_beacon.temp)/10.0f; if(_tempFloat<60){ - MIBLEsensors[_slot].temp=_tempFloat; - DEBUG_SENSOR_LOG(PSTR("Mode 4: temp updated")); + MIBLEsensors[_slot].temp=_tempFloat; + MIBLEsensors[_slot].eventType.temp = 1; + DEBUG_SENSOR_LOG(PSTR("Mode 4: temp updated")); } // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("Mode 4: U16: %u Temp"), _beacon.temp ); break; case 0x06: _tempFloat=(float)(_beacon.hum)/10.0f; if(_tempFloat<101){ - MIBLEsensors[_slot].hum=_tempFloat; - DEBUG_SENSOR_LOG(PSTR("Mode 6: hum updated")); + MIBLEsensors[_slot].hum=_tempFloat; + MIBLEsensors[_slot].eventType.hum = 1; + DEBUG_SENSOR_LOG(PSTR("Mode 6: hum updated")); } // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("Mode 6: U16: %u Hum"), _beacon.hum); break; case 0x07: MIBLEsensors[_slot].lux=_beacon.lux & 0x00ffffff; if(MIBLEsensors[_slot].type==MJYD2S){ - MIBLEsensors[_slot].eventType = 2; //No PIR - MIBLEsensors[_slot].shallSendMQTT = 1; - MIBLEsensors[_slot].lastTime = millis(); - MI32triggerTele(); + MIBLEsensors[_slot].eventType.noMotion = 1; } + MIBLEsensors[_slot].eventType.lux = 1; // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("Mode 7: U24: %u Lux"), _beacon.lux & 0x00ffffff); break; case 0x08: - MIBLEsensors[_slot].moisture=_beacon.moist; - DEBUG_SENSOR_LOG(PSTR("Mode 8: moisture updated")); + MIBLEsensors[_slot].moisture=_beacon.moist; + MIBLEsensors[_slot].eventType.moist = 1; + DEBUG_SENSOR_LOG(PSTR("Mode 8: moisture updated")); // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("Mode 8: U8: %u Moisture"), _beacon.moist); break; case 0x09: MIBLEsensors[_slot].fertility=_beacon.fert; + MIBLEsensors[_slot].eventType.fert = 1; DEBUG_SENSOR_LOG(PSTR("Mode 9: fertility updated")); // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("Mode 9: U16: %u Fertility"), _beacon.fert); break; case 0x0a: + if(MI32.option.ignoreBogusBattery){ + if(MIBLEsensors[_slot].type==LYWSD03MMC || MIBLEsensors[_slot].type==MHOC401){ + break; + } + } if(_beacon.bat<101){ MIBLEsensors[_slot].bat = _beacon.bat; + MIBLEsensors[_slot].eventType.bat = 1; DEBUG_SENSOR_LOG(PSTR("Mode a: bat updated")); } // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("Mode a: U8: %u %%"), _beacon.bat); @@ -1132,40 +1216,39 @@ if (MIBLEsensors[_slot].type==NLIGHT){ MIBLEsensors[_slot].hum = _tempFloat; DEBUG_SENSOR_LOG(PSTR("Mode d: hum updated")); } + MIBLEsensors[_slot].eventType.tempHum = 1; // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("Mode d: U16: %x Temp U16: %x Hum"), _beacon.HT.temp, _beacon.HT.hum); break; #ifdef USE_MI_DECRYPTION case 0x0f: if (_beacon.ten!=0) break; - MIBLEsensors[_slot].eventType = 1; //PIR - MIBLEsensors[_slot].shallSendMQTT = 1; + MIBLEsensors[_slot].eventType.motion = 1; MIBLEsensors[_slot].lastTime = millis(); MIBLEsensors[_slot].events++; MIBLEsensors[_slot].lux = _beacon.lux; + MIBLEsensors[_slot].eventType.lux = 1; MIBLEsensors[_slot].NMT = 0; // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("PIR: primary"),MIBLEsensors[_slot].lux ); - MI32triggerTele(); break; case 0x17: MIBLEsensors[_slot].NMT = _beacon.NMT; - MIBLEsensors[_slot].eventType = 3; // NMT - MIBLEsensors[_slot].shallSendMQTT = 1; + MIBLEsensors[_slot].eventType.NMT = 1; // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("Mode 17: NMT: %u seconds"), _beacon.NMT); - MI32triggerTele(); break; #endif //USE_MI_DECRYPTION default: if (MIBLEsensors[_slot].type==NLIGHT){ - MIBLEsensors[_slot].eventType = 1; //PIR - MIBLEsensors[_slot].shallSendMQTT = 1; + MIBLEsensors[_slot].eventType.motion = 1; //PIR MIBLEsensors[_slot].events++; MIBLEsensors[_slot].NMT = 0; MIBLEsensors[_slot].lastTime = millis(); // AddLog_P2(LOG_LEVEL_DEBUG,PSTR("PIR: primary"),MIBLEsensors[_slot].lux ); - MI32triggerTele(); } break; } + if(MIBLEsensors[_slot].eventType.raw == 0) return; + MIBLEsensors[_slot].shallSendMQTT = 1; + MI32.mode.shallTriggerTele = 1; } void MI32parseCGD1Packet(char * _buf, uint32_t length, uint8_t addr[6], int rssi){ // no MiBeacon @@ -1183,11 +1266,13 @@ void MI32parseCGD1Packet(char * _buf, uint32_t length, uint8_t addr[6], int rssi _tempFloat=(float)(_packet.temp)/10.0f; if(_tempFloat<60){ MIBLEsensors.at(_slot).temp = _tempFloat; + MIBLEsensors[_slot].eventType.temp = 1; DEBUG_SENSOR_LOG(PSTR("CGD1: temp updated")); } _tempFloat=(float)(_packet.hum)/10.0f; if(_tempFloat<100){ MIBLEsensors.at(_slot).hum = _tempFloat; + MIBLEsensors[_slot].eventType.hum = 1; DEBUG_SENSOR_LOG(PSTR("CGD1: hum updated")); } DEBUG_SENSOR_LOG(PSTR("CGD1: U16: %x Temp U16: %x Hum"), _packet.temp, _packet.hum); @@ -1195,12 +1280,16 @@ void MI32parseCGD1Packet(char * _buf, uint32_t length, uint8_t addr[6], int rssi case 0x0102: if(_packet.bat<101){ MIBLEsensors.at(_slot).bat = _packet.bat; + MIBLEsensors[_slot].eventType.bat = 1; DEBUG_SENSOR_LOG(PSTR("Mode a: bat updated")); } break; default: DEBUG_SENSOR_LOG(PSTR("MI32: unexpected CGD1-packet")); } + if(MIBLEsensors[_slot].eventType.raw == 0) return; + MIBLEsensors[_slot].shallSendMQTT = 1; + MI32.mode.shallTriggerTele = 1; } void MI32ParseResponse(char *buf, uint16_t bufsize, uint8_t addr[6], int rssi) { @@ -1241,9 +1330,14 @@ void MI32readHT_LY(char *_buf){ MIBLEsensors[_slot].hum = _tempFloat; DEBUG_SENSOR_LOG(PSTR("LYWSD0x: hum updated")); } + MIBLEsensors[_slot].eventType.tempHum = 1; if (MIBLEsensors[_slot].type == LYWSD03MMC || MIBLEsensors[_slot].type == MHOC401){ MIBLEsensors[_slot].bat = ((float)LYWSD0x_HT.volt-2100.0f)/12.0f; + MI32.mode.willReadBatt = 0; + MIBLEsensors[_slot].eventType.bat = 1; } + MIBLEsensors[_slot].shallSendMQTT = 1; + MI32.mode.shallTriggerTele = 1; } } @@ -1260,12 +1354,27 @@ bool MI32readBat(char *_buf){ MIBLEsensors[_slot].firmware[5] = '\0'; AddLog_P2(LOG_LEVEL_DEBUG,PSTR("%s: Firmware: %s"),D_CMND_MI32,MIBLEsensors[_slot].firmware); } - return true; + MIBLEsensors[_slot].eventType.bat = 1; + MIBLEsensors[_slot].shallSendMQTT = 1; + MI32.mode.shallTriggerTele = 1; + return true; } } return false; } +/** + * @brief Launch functions from Core 1 to make race conditions less likely + * + */ + +void MI32Every50mSecond(){ + if(MI32.mode.shallTriggerTele){ + MI32.mode.shallTriggerTele = 0; + MI32triggerTele(); + } +} + /** * @brief Main loop of the driver, "high level"-loop * @@ -1392,7 +1501,7 @@ bool MI32Cmd(void) { case CMND_MI32_TIME: if (XdrvMailbox.data_len > 0) { if(MIBLEsensors.size()>XdrvMailbox.payload){ - if(MIBLEsensors[XdrvMailbox.payload].type == LYWSD02){ + if(MIBLEsensors[XdrvMailbox.payload].type == LYWSD02 || MIBLEsensors[XdrvMailbox.payload].type == MHOC303){ AddLog_P2(LOG_LEVEL_DEBUG,PSTR("%s: will set Time"),D_CMND_MI32); MI32.state.sensor = XdrvMailbox.payload; MI32.mode.canScan = 0; @@ -1407,7 +1516,7 @@ bool MI32Cmd(void) { case CMND_MI32_UNIT: if (XdrvMailbox.data_len > 0) { if(MIBLEsensors.size()>XdrvMailbox.payload){ - if(MIBLEsensors[XdrvMailbox.payload].type == LYWSD02){ + if(MIBLEsensors[XdrvMailbox.payload].type == LYWSD02 || MIBLEsensors[XdrvMailbox.payload].type == MHOC303){ AddLog_P2(LOG_LEVEL_DEBUG,PSTR("%s: will set Unit"),D_CMND_MI32); MI32.state.sensor = XdrvMailbox.payload; MI32.mode.canScan = 0; @@ -1473,71 +1582,117 @@ void MI32Show(bool json) if (json) { if(!MI32.mode.triggeredTele){ MI32.mode.shallClearResults=1; + if(MI32.option.noSummary) return; // no message at TELEPERIOD } - for (uint32_t i = 0; i < MIBLEsensors.size(); i++) { - switch(MIBLEsensors[i].type){ - case NLIGHT: case MJYD2S: case YEERC: - if(MIBLEsensors[i].shallSendMQTT==0) continue; - break; - default: - if(MI32.mode.triggeredTele) continue; - break; - } - ResponseAppend_P(PSTR(",\"%s-%02x%02x%02x\":{"), + for (uint32_t i = 0; i < MIBLEsensors.size(); i++) { + if(MI32.mode.triggeredTele && MIBLEsensors[i].eventType.raw == 0) continue; + if(MI32.mode.triggeredTele && MIBLEsensors[i].shallSendMQTT==0) continue; + + ResponseAppend_P(PSTR(",\"%s-%02x%02x%02x\":"), // do not add the '{' now ... kMI32DeviceType[MIBLEsensors[i].type-1], MIBLEsensors[i].MAC[3], MIBLEsensors[i].MAC[4], MIBLEsensors[i].MAC[5]); - ResponseAppend_P(PSTR("\"RSSI\":%d"), MIBLEsensors[i].rssi); + uint32_t _positionCurlyBracket = strlen(mqtt_data); // ... this will be a ',' first, but later be replaced - if (MIBLEsensors[i].type == FLORA) { - if (!isnan(MIBLEsensors[i].temp)) { - char temperature[FLOATSZ]; // all sensors have temperature - dtostrfd(MIBLEsensors[i].temp, Settings.flag2.temperature_resolution, temperature); - ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE "\":%s"), temperature); + if((!MI32.mode.triggeredTele && !MI32.option.minimalSummary)||MI32.mode.triggeredTele){ + bool tempHumSended = false; + if(MIBLEsensors[i].feature.tempHum){ + if(MIBLEsensors[i].eventType.tempHum || !MI32.mode.triggeredTele || MI32.option.allwaysAggregate){ + if (!isnan(MIBLEsensors[i].hum) && !isnan(MIBLEsensors[i].temp)) { + ResponseAppend_P(PSTR(",")); + ResponseAppendTHD(MIBLEsensors[i].temp, MIBLEsensors[i].hum); + tempHumSended = true; + } + } } - if (MIBLEsensors[i].lux!=0x0ffffff) { // this is the error code -> no lux - ResponseAppend_P(PSTR(",\"" D_JSON_ILLUMINANCE "\":%u"), MIBLEsensors[i].lux); + if(MIBLEsensors[i].feature.temp && !tempHumSended){ + if(MIBLEsensors[i].eventType.temp || !MI32.mode.triggeredTele || MI32.option.allwaysAggregate) { + if (!isnan(MIBLEsensors[i].temp)) { + char temperature[FLOATSZ]; + dtostrfd(MIBLEsensors[i].temp, Settings.flag2.temperature_resolution, temperature); + ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE "\":%s"), temperature); + } + } } - if (MIBLEsensors[i].moisture!=0xff) { - ResponseAppend_P(PSTR(",\"" D_JSON_MOISTURE "\":%u"), MIBLEsensors[i].moisture); + if(MIBLEsensors[i].feature.hum && !tempHumSended){ + if(MIBLEsensors[i].eventType.hum || !MI32.mode.triggeredTele || MI32.option.allwaysAggregate) { + if (!isnan(MIBLEsensors[i].hum)) { + char hum[FLOATSZ]; + dtostrfd(MIBLEsensors[i].hum, Settings.flag2.humidity_resolution, hum); + ResponseAppend_P(PSTR(",\"" D_JSON_HUMIDITY "\":%s"), hum); + } + } } - if (MIBLEsensors[i].fertility!=0xffff) { - ResponseAppend_P(PSTR(",\"Fertility\":%u"), MIBLEsensors[i].fertility); + if (MIBLEsensors[i].feature.lux){ + if(MIBLEsensors[i].eventType.lux || !MI32.mode.triggeredTele || MI32.option.allwaysAggregate){ + if (MIBLEsensors[i].lux!=0x0ffffff) { // this is the error code -> no lux + ResponseAppend_P(PSTR(",\"" D_JSON_ILLUMINANCE "\":%u"), MIBLEsensors[i].lux); + } + } } + if (MIBLEsensors[i].feature.moist){ + if(MIBLEsensors[i].eventType.moist || !MI32.mode.triggeredTele || MI32.option.allwaysAggregate){ + if (MIBLEsensors[i].moisture!=0xff) { + ResponseAppend_P(PSTR(",\"" D_JSON_MOISTURE "\":%u"), MIBLEsensors[i].moisture); + } + } + } + if (MIBLEsensors[i].feature.fert){ + if(MIBLEsensors[i].eventType.fert || !MI32.mode.triggeredTele || MI32.option.allwaysAggregate){ + if (MIBLEsensors[i].fertility!=0xffff) { + ResponseAppend_P(PSTR(",\"Fertility\":%u"), MIBLEsensors[i].fertility); + } + } + } + if (MIBLEsensors[i].feature.Btn){ + if(MIBLEsensors[i].eventType.Btn){ + ResponseAppend_P(PSTR(",\"Btn\":%u"),MIBLEsensors[i].Btn); + } + } + } // minimal summary + if (MIBLEsensors[i].feature.PIR){ + if(MIBLEsensors[i].eventType.motion || !MI32.mode.triggeredTele){ + if(MI32.mode.triggeredTele) ResponseAppend_P(PSTR(",\"PIR\":1")); // only real-time + ResponseAppend_P(PSTR(",\"Events\":%u"),MIBLEsensors[i].events); + } + else if(MIBLEsensors[i].eventType.noMotion && MI32.mode.triggeredTele){ + ResponseAppend_P(PSTR(",\"PIR\":0")); + } + } + + if (MIBLEsensors[i].type == FLORA && !MI32.mode.triggeredTele) { if (MIBLEsensors[i].firmware[0] != '\0') { // this is the error code -> no firmware ResponseAppend_P(PSTR(",\"Firmware\":\"%s\""), MIBLEsensors[i].firmware); } } - if (MIBLEsensors[i].type > FLORA){ - if (!isnan(MIBLEsensors[i].hum) && !isnan(MIBLEsensors[i].temp)) { - ResponseAppend_P(PSTR(",")); - ResponseAppendTHD(MIBLEsensors[i].temp, MIBLEsensors[i].hum); + + if (MIBLEsensors[i].feature.NMT || !MI32.mode.triggeredTele){ + if(MIBLEsensors[i].eventType.NMT){ + ResponseAppend_P(PSTR(",\"NMT\":%u"), MIBLEsensors[i].NMT); } } -#ifdef USE_MI_DECRYPTION - if (MIBLEsensors[i].type == MJYD2S){ - ResponseAppend_P(PSTR(",\"Events\":%u"),MIBLEsensors[i].events); - if(MIBLEsensors[i].shallSendMQTT && MIBLEsensors[i].eventType<3) ResponseAppend_P(PSTR(",\"PIR\":%u"), 2 - MIBLEsensors[i].eventType); - if(MIBLEsensors[i].eventType==3) ResponseAppend_P(PSTR(",\"NMT\":%u"), MIBLEsensors[i].NMT); - MIBLEsensors[i].eventType=0; - if(MIBLEsensors[i].lux!=0x0ffffff) ResponseAppend_P(PSTR(",\"" D_JSON_ILLUMINANCE "\":%u"), MIBLEsensors[i].lux); - } -#endif //USE_MI_DECRYPTION - if (MIBLEsensors[i].type == NLIGHT){ - ResponseAppend_P(PSTR(",\"Events\":%u"),MIBLEsensors[i].events); - if(MIBLEsensors[i].shallSendMQTT) ResponseAppend_P(PSTR(",\"PIR\":1")); - } - if (MIBLEsensors[i].type == YEERC){ - if(MIBLEsensors[i].shallSendMQTT) ResponseAppend_P(PSTR(",\"Btn\":%u"),MIBLEsensors[i].Btn); - } - if (MIBLEsensors[i].bat != 0x00) { // this is the error code -> no battery - ResponseAppend_P(PSTR(",\"Battery\":%u"), MIBLEsensors[i].bat); + if (MIBLEsensors[i].feature.bat){ + if(MIBLEsensors[i].eventType.bat || !MI32.mode.triggeredTele || MI32.option.allwaysAggregate){ + if (MIBLEsensors[i].bat != 0x00) { // this is the error code -> no battery + ResponseAppend_P(PSTR(",\"Battery\":%u"), MIBLEsensors[i].bat); + } + } } + if (MI32.option.showRSSI && MI32.mode.triggeredTele) ResponseAppend_P(PSTR(",\"RSSI\":%d"), MIBLEsensors[i].rssi); + + + if(_positionCurlyBracket==strlen(mqtt_data)) ResponseAppend_P(PSTR(",")); // write some random char, to be overwritten in the next step ResponseAppend_P(PSTR("}")); - MIBLEsensors[i].shallSendMQTT = 0; - MI32.mode.triggeredTele = 0; + mqtt_data[_positionCurlyBracket] = '{'; + MIBLEsensors[i].eventType.raw = 0; + if(MIBLEsensors[i].shallSendMQTT==1){ + MIBLEsensors[i].shallSendMQTT = 0; + break; + } } + MI32.mode.triggeredTele = 0; + // ResponseAppend_P(PSTR("}")); #ifdef USE_WEBSERVER } else { static uint16_t _page = 0; @@ -1618,6 +1773,9 @@ bool Xsns62(uint8_t function) if (MI32.mode.init) { switch (function) { + case FUNC_EVERY_50_MSECOND: + MI32Every50mSecond(); + break; case FUNC_EVERY_SECOND: MI32EverySecond(false); break; diff --git a/tasmota/xsns_interface.ino b/tasmota/xsns_interface.ino index b6abce101..0c85854de 100644 --- a/tasmota/xsns_interface.ino +++ b/tasmota/xsns_interface.ino @@ -868,6 +868,11 @@ void XsnsSensorState(void) bool XsnsNextCall(uint8_t Function, uint8_t &xsns_index) { + if (0 == xsns_present) { + xsns_index = 0; + return false; + } + xsns_index++; if (xsns_index == xsns_present) { xsns_index = 0; } diff --git a/tools/decode-status.py b/tools/decode-status.py index 22329c5f6..7539aa37a 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -152,7 +152,9 @@ a_setoption = [[ "Enable Ethernet (ESP32)", "Set Baud rate for TuyaMCU serial communication (0 = 9600 or 1 = 115200)", "Rotary encoder uses rules instead of light control", - "","","", + "Enable zerocross dimmer on PWM DIMMER", + "Remove ZbReceived form JSON message", + "Add the source endpoint as suffix to attributes", "","","","", "","","","", "","","","" @@ -239,7 +241,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v20200714 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v20200721 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) diff --git a/tools/fw_efm8bb1/RF-Bridge-EFM8BB1-20190220.hex b/tools/fw_efm8bb1/RF-Bridge-EFM8BB1-20190220.hex new file mode 100644 index 000000000..7840f347d --- /dev/null +++ b/tools/fw_efm8bb1/RF-Bridge-EFM8BB1-20190220.hex @@ -0,0 +1,484 @@ +:020000040000FA +:100000000210D8A2029290A2029280AD40AC3F7F33 +:100010000A7E0012002E12001DA202B322E59120DA +:10002000E2FB220210487597A5222202141B8E4182 +:100030008F428C438D4412163112188EE54424BF32 +:100040009000E8F0E54334FF9000E7F09000E3E52E +:1000500041F0A3E542F043910422220211671219F4 +:100060002253D87853DAFE1218F3E4900087F02276 +:10007000D2DE2202146E1217C0C290C296C280E471 +:10008000FBFD7F101218DA12053174A4F0D2AF1202 +:10009000170AD2969000ECE004F070069000EBE0B6 +:1000A00004F09000EBE0B427E9A3E0B410E4C296BA +:1000B0001200263003091216B18E228F2380067596 +:1000C0002201752300E5237004E522640170469047 +:1000D00000DEE0700612170B0202959000EBE4754B +:1000E000F001120807FED3E5F09410EE94274002C9 +:1000F000D296D39000ECE094309000EBE0947550F1 +:1001000003020295E4F0A3F09000DEF0900099F075 +:10011000C29602029512170A9000DEE014602A14BB +:1001200070030202591470030202171470030202D2 +:100130003024046003020295E52364AA60030202EE +:10014000959000DE04F0020295E523900099F0906E +:1001500000DE7402F0E52312092F0201A0017FA145 +:10016000018BA501A9A601BDA701C6A801DDA901B2 +:10017000CCB001D5B1019DC00295FF0000020C1268 +:10018000051EE490008AF07FA1806512054E900064 +:10019000EA7408F0E4F52575240902029512054E6B +:1001A000E4F52575240202029590008A7401F07F1F +:1001B000A61215A690007974A6F0020295120531D8 +:1001C00074A4F00202959000EA7408F09000DE74C6 +:1001D00003F00202957FB112056202029512051E1C +:1001E00090008AE09000E9F090008A7401F07FA905 +:1001F0001205627D307C757F017E00121797020226 +:100200009512056B900079EFF0E48005E490009979 +:10021000F09000DEF0807EE4F525E523F524E5246A +:10022000D39400402C12005E9000DE7404F08065D0 +:1002300074032525F582E43400F583E523F00525D4 +:10024000E525B52402800AE525C39470404775244E +:10025000709000DE7402F0803CE5236455703690A7 +:1002600000DEF0C203900099E02460601B24FC6073 +:100270001224FE600E14600B24F760101460042436 +:100280001070127FA0121875D2038009900004E04C +:10029000049000EAF0900099E012092F02BEA10339 +:1002A00033A40377A50333A60447A802BEA9047CA0 +:1002B000B004E5B1041EC00442FF000000B090008D +:1002C00086E030E73F7DC87C0012053F900099E052 +:1002D0002457600E2408701F12056B7FA31215ECC3 +:1002E00080159000E9E090008AF0900079E0FF121C +:1002F00015A67FAB12057CE4900086F043DA01D2AC +:10030000030200B01218EB50207DE87C0312053F79 +:10031000900099E02457600C240860030200B07F2D +:10032000A20204D77FAA0204D71205744003020078 +:10033000B0802E900086E030E71F900099E0245AAC +:10034000600F240260030204F17FA41215EC020482 +:10035000F17FA612057C0204F1120574400302002D +:10036000B01216E7C006C0071216F69200D007D0EA +:10037000061209810200B09000DEE060030200B0C6 +:100380001217127003020411240560030200B01258 +:100390000558900005E0FFA3E090008BCFF0A3EF9D +:1003A000F0900007E0FFA3E090008DCFF0A3EFF006 +:1003B000900003E0FFA3E090008FCFF0A3EFF07B6D +:1003C000017A00798B9019FAE493FC740193FD9003 +:1003D00019FCE493F52E1217028E2FF5309019FFB9 +:1003E000E493F5311217028E32F533901A02E4933A +:1003F000F5341217028E35F536901A05E493F53769 +:10040000A3E493F538753900753A09120EBC020061 +:10041000B09000EAE07063C2807FA00204D7900031 +:10042000DEE060030200B0900003E0FCA3E0FD7F8B +:10043000017E00121797D29612001DC2967FA0026D +:1004400004D77F030204D79000DEE060030200B00F +:100450001217126019240560030200B012055890AB +:100460000003E0FF7C007D041213570200B09000EF +:10047000EAE07006C2807FA0805D80619000DEE0CF +:1004800060030200B01217126043240560030200EB +:10049000B09000EAE014F012005E7E007F05C00616 +:1004A000C007900003E0FB25E0FFE433FE74052F56 +:1004B000F58274003EAD82FCEB25E0FFE52424FECE +:1004C000C39FFBD007D006120FA70200B09000EA2E +:1004D000E0700AC2807FA01218680200B0E49000A9 +:1004E00087F00200B0900086E030E7107FB1121173 +:1004F000ECE4900086F043DA010200B07E007FED6C +:1005000012151040030200B01216E7C006C0071211 +:1005100016F69200D007D006120D160200B07D32FA +:100520007C007F017E00121797D29612001DC296A2 +:1005300022E490008AF07FA41215A6900079227F11 +:10054000017E00121797D29612001DC29622120049 +:100550005E9000DE7404F0229000EAE014F01200D5 +:100560005E221215A6900079EFF022900079E0FF4C +:100570001215A6227E007FED12151022900086E053 +:10058000547FFD12155B228F29E4F536EF25E02517 +:10059000E02468F8E6701EEF25E025E02469F8768F +:1005A000087E007F707D007B017A00790312095577 +:1005B000E490007AF0AB2CAA2DA92EC001120B6793 +:1005C0002466F9E7540F120CA3120B86D001121403 +:1005D000C1503D120B672466F9E7540FFF120CA3BC +:1005E000120C90300101B34031EF700A900077E5B2 +:1005F0002AF0A3E52BF0120B67120CAF2401FFEFDA +:10060000FEEC54F04EFEEDFF120B67120C9A800ABE +:10061000120B672466F874F056F6AB2CAA2DA92E9F +:10062000C001120B67120CBB120BD1120CC7120BBC +:1006300086D0011214C15052120B67120CBB120B60 +:10064000D1FF120CC75408FE120C92300101B340C6 +:1006500043EF700A900088E52AF0A3E52BF0120B17 +:1006600067120BC22401FFE433FEEFC4F8540FC835 +:1006700068FFEEC454F048FEED540FFDEC4EFEED65 +:100680004FFF120B67120C9A800A120B672467F84F +:10069000740F56F6120B67120CAFFB700F120BCAD9 +:1006A000700A120B4D2469F8E4F6C322120B67247A +:1006B00068F8E53514667003753601C3E531953683 +:1006C0006B7020D290120B672466F874F056F674A3 +:1006D0000F0856120B662468F806120B672469F897 +:1006E00016804C120B67120BC2FFC3E53495366FB0 +:1006F000703DD290120B672466F8EC54F0FEED5476 +:100700000FA60608120B662468F806120B67246908 +:10071000F816120B67120BD8E0FF120B672469F86A +:10072000E6FE7401A806088002C333D8FC4FF0121D +:100730000B672469F8E67017120B67120BD8120CBE +:100740004CFF12182DEFF0120B672469F87608128F +:100750000B672468F8E6C3953540311218E350055D +:10076000E4900085F0120C4960181218F37D207C8B +:10077000037F017E0012176E120CD3A3E529F0440B +:1007800080F0120B4D2469F8E4F6D322C322BB019A +:100790000689828A83F0225002F722BBFE01F322EF +:1007A000EF8DF0A4A8F0CF8CF0A428CE8DF0A42E6D +:1007B000FE22BC000BBE0029EF8DF084FFADF022BD +:1007C000E4CCF875F008EF2FFFEE33FEEC33FCEECF +:1007D0009DEC984005FCEE9DFE0FD5F0E9E4CEFDC2 +:1007E00022EDF8F5F0EE8420D21CFEADF075F00895 +:1007F000EF2FFFED33FD4007985006D5F0F222C3EE +:1008000098FD0FD5F0EA22C5F0F8A3E028F0C5F076 +:10081000F8E582158270021583E038F022BB0110E2 +:10082000E58229F582E5833AF583E0F5F0A3E0223D +:100830005009E92582F886F008E622BBFE0AE92580 +:1008400082F8E2F5F008E222E5832AF583E993F5E0 +:10085000F0A3E9932275F008758200EF2FFFEE33C5 +:10086000FECD33CDCC33CCC58233C5829BED9AEC23 +:1008700099E58298400CF582EE9BFEED9AFDEC998D +:10088000FC0FD5F0D6E4CEFBE4CDFAE4CCF9A88297 +:1008900022B800C1B90059BA002DEC8BF084CFCE3C +:1008A000CDFCE5F0CBF97818EF2FFFEE33FEED33FA +:1008B000FDEC33FCEB33FB10D703994004EB99FBC1 +:1008C0000FD8E5E4F9FA227818EF2FFFEE33FEEDAA +:1008D00033FDEC33FCC933C910D7059BE99A4007B7 +:1008E000EC9BFCE99AF90FD8E0E4C9FAE4CCFB22CE +:1008F00075F010EF2FFFEE33FEED33FDCC33CCC897 +:1009000033C810D7079BEC9AE899400AED9BFDECA1 +:100910009AFCE899F80FD5F0DAE4CDFBE4CCFAE4E0 +:10092000C8F922A42582F582E5F03583F58322D02B +:1009300083D082F8E4937012740193700DA3A39393 +:10094000F8740193F5828883E4737402936860EF0E +:10095000A3A3A380DFEF4E6012EF60010EEDBB0199 +:100960000B89828A83F0A3DFFCDEFA2289F050072C +:10097000F709DFFCA9F022BBFEFCF309DFFCA9F0BC +:10098000228E268F27E4F528C3E5279464E5269474 +:10099000005017E4F528E528120B922469F8E4F6D4 +:1009A0000528E528B40EEFC2902290008AE014706A +:1009B00003020A6F046003020B4C7866E6C4540F0E +:1009C000F97065D3E5279494E52694115003020B42 +:1009D0004C300003020B4CE9120C32E6540FFC08B9 +:1009E000E6FDEC4E18F6ED08F618120C29EC540F43 +:1009F0004E18F6ED08F6900001E526F0A3E527F085 +:100A0000AE26FF7C007D1F1207B290008BEEF0A394 +:100A1000EFF07C007D031207A0A3EEF0A3EFF0A39C +:100A2000E526F0A3E527F0227866E6C4540F6402B9 +:100A30006003020B4C120CEB752C01752D00752E0A +:100A40008B901B9F93FE7401938E2FF530901BA10A +:100A5000E493F531A3120BBB8E32F533901BA4E463 +:100A600093F534901BA8E493F535E4FF020587E481 +:100A7000F528120BA8120D0CFFE528120C54F9EF03 +:100A8000C399506EE528120C16F5828C832FF582DF +:100A9000E43583F583E493FF120C90300001B350EA +:100AA00003020B40E528C454F02499F582E4341B7A +:100AB000120C20F5828C83EF540775F00212092383 +:100AC000120C22FDAF27AE261214CBE528501925B3 +:100AD000E025E02466F8120C29EC540F4EFEEDFFE1 +:100AE000120BA8120C9A8058120B922469F8E4F6A3 +:100AF000804E120BA8120D0C697045120CEBE52804 +:100B0000120BAFAA06752CFF8A2DF52EE528120CC4 +:100B1000F6120BB98E2FF530E528120C63F531E58E +:100B200028120D01120BB98E32F533E528120C7222 +:100B3000F534E528120C81F535AF28120587400CF5 +:100B40000528E528C3940E5003020A7222C290E5DC +:100B50002925E025E02466F8E4F608F6E52925E0F5 +:100B600025E02468F8E4F6E52925E025E022F58370 +:100B7000E493FF5408FE131313541F24FF9202AB97 +:100B800029AA2AA92BEF540775F002A4F58285F053 +:100B9000832225E025E02466F8E4F608F6E528251A +:100BA000E025E02468F8E4F6E52825E025E022C405 +:100BB00054F02499F582E4341BF583E493FE740128 +:100BC00093222466F8E6FC08E6FDECC4F854F0C86D +:100BD000EDC4540F48540F222468F8E6141313137D +:100BE000541F2403F582E43400F58322E529252BE4 +:100BF000F582E43528F583E022A200E433C43333E0 +:100C00003354804526FFE527900074CFF0A3EFF022 +:100C1000E490007BF022C454F0249CF582E4341B61 +:100C2000F583E493FC74019322E6FC08E6FDECC432 +:100C3000540F2401FFEFC454F0FE22E52E25E024DA +:100C40008BF582E43400F58322900085E0FF90006C +:100C50007AE06F22C454F0249EF582E4341BF583BD +:100C6000E49322C454F024A1F582E4341BF583E418 +:100C70009322C454F024A4F582E4341BF583E49356 +:100C800022C454F024A8F582E4341BF583E49322B3 +:100C90005408131313541F24FF222466F8A60608D1 +:100CA000A607222530F582E4352FF583E49322242C +:100CB00066F8E6FC08E6FDEC540F222466F9E7C46A +:100CC000F854F0C809E7222533F582E43532F5837C +:100CD000E4932290007AE0900085F053DAFE22251A +:100CE000E0247DF582E43400F58322A200920185A0 +:100CF000262A85272B22C454F0249FF582E4341B36 +:100D000022C454F024A2F582E4341B222466F8E6BF +:100D1000FEEEC4540F228E268F27C3E5279464E588 +:100D20002694005003020EAA900087E024FE60255E +:100D3000147003020DB724036003020EAFC290AF1C +:100D400027AE2612185A4003020EAF120BF990007C +:100D5000877402F022120EB0503090007BE09404B1 +:100D60004021D290E4900000F0900073F0C2049013 +:100D7000007CF090007AF0900003F09000877403FC +:100D8000F08025E4900087F0801E900074E0547F8E +:100D9000FEA3E0FFD3E5279FE5269E4005120BF951 +:100DA000800690007BE004F090007BE0C394E0506C +:100DB00003020EAF020EAA90007CE004F090007BCC +:100DC000E0FFA3E0D39F4003020E587B007A007936 +:100DD00028AF27AE261212DF4022900000E0FF125B +:100DE0000C3DE526F0A3E527F08F28900000E004F5 +:100DF000F0E0D394074005E4900087F030041DA292 +:100E000000E433C43333335480FFE528C454F04F37 +:100E1000FF900073E0120BE2EFF08039900073E076 +:100E2000FF120BE2E0FEA200E43333333354F84503 +:100E300028FDEE4DF074032F120BE4120C4CFF1240 +:100E4000182DEFF0900073E004F0E0D394704005AB +:100E5000E4900087F0B20422120EB0504D1218E355 +:100E60005005E4900085F0120C49603A1218F37DA9 +:100E7000207C037F017E0012176E120CD3900003BA +:100E8000E0FD900074E05480FF900000E0C454F056 +:100E90004FFFED4F900003F0900074E0547FF0900E +:100EA0000086E04480F0C2908000E4900087F02249 +:100EB000A2009201AF27AE26121744228B298A2A5C +:100EC000892B8C2C8D2DE4F53D753E80F53BE53B63 +:100ED000C3952E5010E52D253BF582E4352C120FDD +:100EE0006C053B80E9E4F53BE53BC395385057E59D +:100EF0003A253DF582E43539F583E0553E7019F524 +:100F00003CE53CC39531502DE530253CF582E43578 +:100F10002F120F6C053C80E9E4F53CE53CC39534A9 +:100F20005013E533253CF582E43532120B6E120F77 +:100F30009B053C80E6E53EC313F53E7005053D7517 +:100F40003E80053B80A2E4F53BE53BC3953750135B +:100F5000E536253BF582E43535120B6E120F9B0505 +:100F60003B80E6C2909000877405F022F583E493FD +:100F7000FF5408FE131313541F24FF9202AB29AA37 +:100F80002AA92BEF540775F002A4F58285F083128D +:100F9000081DF54085F03F1200032212081DF540A0 +:100FA00085F03F120003228E268F278C288D298BF7 +:100FB0002AD200C201852982852883E05488D394EF +:100FC000004003D38001C39201E4F52BE52BC395C8 +:100FD0002A505930010D120BECC413131354012481 +:100FE000FF8002A2009202852782852683C083C0EB +:100FF00082120BECFFC45407D082D083121035301C +:10100000010C120BECFF131313541F138002A200E8 +:101010009202852782852683C083C082120BEC54FE +:1010200007D082D083121035052B80A0C29090008B +:10103000877405F02275F002120923E0F53FA3E062 +:10104000F540120003920022C0E0C0F0C083C082CD +:10105000C0D075D000C000C001C002C003C004C031 +:1010600005C006C007E5985403F545F45298E545D8 +:1010700030E01712192B9000DD121739EFF09000B5 +:10108000DDE004F0E0B44002E4F0E54530E12E900C +:1010900000E0E0D39400401A9000DCE02446F8E63B +:1010A000FF1219289000DCE004F09000E0E014F05A +:1010B0008002D2059000DCE0B42002E4F0D007D03A +:1010C00006D005D004D003D002D001D000D0D0D0BB +:1010D00082D083D0F0D0E03212005A787FE4F6D884 +:1010E000FD75819D021122020076E493A3F8E4933A +:1010F000A34003F68001F208DFF48029E493A3F80B +:101100005407240CC8C333C4540F4420C88340047C +:10111000F456800146F6DFE4800B0102040810203B +:101120004080901266E47E019360BCA3FF543F3080 +:10113000E509541FFEE493A360010ECF54C025E0DF +:1011400060A840B8E493A3FAE493A3F8E493A3C897 +:10115000C582C8CAC583CAF0A3C8C582C8CAC58328 +:10116000CADFE9DEE780BEC0E0C0F0C083C082C055 +:10117000D075D000C000C001C002C003C004C005CB +:10118000C006C007E5D85487F521F452D8E5F730FA +:10119000E508E5F730E60312193253F7DFE52130B1 +:1011A000E708E5D930E003121931E52130E008E520 +:1011B000DA30E003121675E52130E108E5DB30E0B6 +:1011C00003121933E52130E208E5DC30E00312199F +:1011D00034D007D006D005D004D003D002D001D03F +:1011E00000D0D0D082D083D0F0D0E032AE07E4F58A +:1011F0002612180A900000E004FF12181112125F64 +:10120000900000E0FFE526C39F501412172BE05416 +:101210007FFF12181112172B121725052680E19057 +:101220000074E0547FFF12181190007412172512F9 +:10123000125FE4F526900073E0FFE526C39F501788 +:10124000740325261217190526E526541F70E61289 +:10125000192512191E80DE7F551218110219251248 +:10126000192512191E224200E500004200E100008B +:101270004200E700004200E30000C1834100860015 +:101280004100870041008A004100790042000100CE +:101290000042008800004200770000C10441007352 +:1012A000004100850041007A004100000048007DB7 +:1012B0000000000000000000410076004100DD0059 +:1012C0004100DF004100DB004100DC004100E000A4 +:1012D0004100DA00C1054100DE0041009900008EA6 +:1012E000298F2A8B2B8A2C892DE4F52E900000E083 +:1012F000FFE52EC39F505EE52AAE297803CEC313C7 +:10130000CE13D8F9FDAC06E52AAE297802CEC31378 +:10131000CE13D8F92DFFEE3CAB07FA120C3BE0FEE2 +:10132000A3E0FFC39BEE9A50028004AE02AF03AA73 +:1013300006AB07120C3BE0FCA3E0FDAF2AAE29127E +:1013400017E7500DAB2BAA2CA92DE52E12078ED333 +:1013500022052E8097C3228F268C278D28EF120B13 +:10136000AFAA06F97BFFEF120C16FDEF120C54F535 +:101370002EEF120CF6120BB98E2FF530EF120C6314 +:10138000F531EF120D01120BB98E32F533EF120C5D +:1013900072F534EFC454F024A5F582E4341B120B2B +:1013A000B98E35F536EFC454F024A7F582E4341B2A +:1013B000F583E493F537EF120C81F53885273985ED +:1013C000283A020EBC900076E0FDC4540F2401FBC5 +:1013D000E433FAED540FF96B7001EA603DE97010E7 +:1013E000E0C4540F2401FDE433FCED64044C602A96 +:1013F000900076E0C4540FFD540F120CDFEEF0A302 +:10140000EFF0ED04C454F049900076F0E0FFC454CE +:101410000FC394044004EF540FF022C0E0C083C017 +:1014200082C0D075D000C004C005C006C00753C834 +:101430007F9000E5E0FEA3E0FF4E700353C8FB90F1 +:1014400000E112166A50099000E5E4F0A3F0800D67 +:10145000C39000E6E09DF09000E5E09CF0D007D05E +:1014600006D005D004D0D0D082D083D0E032C0E006 +:10147000C083C082C0D075D000C004C005C006C003 +:101480000753917F9000E7E0FEA3E0FF4E70035307 +:1014900091FB9000E312166A50099000E7E4F0A374 +:1014A000F0800DC39000E8E09DF09000E7E09CF034 +:1014B000D007D006D005D004D0D0D082D083D0E0E1 +:1014C0003212081DFDACF0AF2BAE2A8F828E83AF97 +:1014D00005AE041218A6AB07AA06D3EB94F4EA945F +:1014E0000140067E017FF48004AE02AF03AA06AB82 +:1014F00007C3EB9464EA940050067E007F64800486 +:10150000AE02AF03AA06AB07AF82AE831217E72283 +:10151000AD07AC06ABDA900076E0FEC4540FFFEEE8 +:10152000540FFEB50702C32253DAFE900076E0FAAC +:10153000EE120CDFE0FFA3E08D828C83CFF0A3EFEF +:10154000F0EA54F0FF900076E0044FF0540FC3949B +:10155000044004E054F0F08BDAD322AE05AD07E48A +:10156000FCFB7FAA121811AF05121811EEC454F03B +:10157000244AF582E4341DF583E493FFECC39F50C5 +:101580000774082CFC0B80F4EB04FF12180CE4FC2D +:10159000ECC39B500974032C1217190C80F27F5571 +:1015A0001218110219258F26900079E0F5277E0088 +:1015B0007F387D007B007A0079661209557F0B1217 +:1015C000192E43DA011200707D0A7C007F017E0033 +:1015D00012179712001DE4900087F0900086F0909B +:1015E0000099E526F0900079F0AF2722AE07E4FDE0 +:1015F000F52612180A900001E0FF12181190000160 +:10160000121725900077E0FF12181190007712173B +:1016100025900088E0FF1218119000881217257499 +:10162000032D1217190DBD03F67F5512181102195B +:1016300025AB07AA06E4F9F87F407E427D0FFC1235 +:101640000891A804A905AA06AB077F207ED77D755F +:101650007C01120891C3E49FFFE49EFE22AB07AA1F +:1016600006E4F9F87FE87E03FD22E0FCA3E0FDC379 +:10167000EF9DEE9C22AFFBAEFC7C007D0A1207A022 +:10168000AD07AC06AFD953D9BFE4F5FAF5F98FD958 +:10169000C3EC948050157F002093027F01EFC43388 +:1016A000333354804CFEEDFF0213C5E4900076F016 +:1016B000229000DDE0FF9000DBE0B507057E017FB2 +:1016C00000229000DB121739E0FD7C009000DBE087 +:1016D00004F0E0B44002E4F09000DAE0FEEE4204F0 +:1016E000E4F0AE04AF05229000EDE0FCA3E0FDECD9 +:1016F000547FFEAF0522EC5480C41313135401240D +:10170000FF22A3E493FE74019322E49000EBF0A384 +:10171000F022900087E024FB22F582E43400F58378 +:10172000E0FF021811A3E0FF021811E52625E024CE +:101730008BF582E43400F58322E0249AF582E434C8 +:1017400000F58322AD07AC06900074E0FAA3E0FB3D +:10175000EA5480C413131354017005300102C322EC +:10176000AF05AE04EA547FFCAD031214CB228E37D2 +:101770008F388C398D3A12165D12163E12188290EF +:1017800000E5E539F0A3E53AF09000E1E537F0A394 +:10179000E538F043C804228E288F298C2A8D2B121D +:1017A000165D12163E12188E9000E7E52AF0A3E5AA +:1017B0002BF09000E3E528F0A3E529F04391042203 +:1017C00012002A1218FA1219011218B2121916125E +:1017D00018441218D01218BC1218C612189A1219EE +:1017E0000812191A02190FC3ED9BF582EC9AF583C2 +:1017F000C3E5829FE5839E500FED2BFDEC3AFCC3C1 +:10180000EF9DEE9C50028001C3227FAA121811AFF7 +:1018100006C2059000DFE0B42002E4F09000DFE0B3 +:101820002446F8A607E004F0A3E004F0227E1DE4BD +:10183000FDEF30E70625E06EFF8004EF25E0FF0DA9 +:10184000BD08EE22AF885388AF758CA0758DCBEFA5 +:101850005440FEEF54104E428822C3EF942CEE9475 +:10186000014003D38001C322121875D2039000797E +:10187000E0FF0215A6AE0712180A7F5512181102D2 +:101880001925AD07AC06ECF5CBAF058FCA22AD0725 +:10189000AC06ECF593AF058F9222C2DE75D90575C3 +:1018A000F9FF75960122EF7802CEC313CE13D8F953 +:1018B000FF2275E34075E10175E20122E5915404D0 +:1018C0005391FB429122758E547589224388502290 +:1018D000E5C8540453C8FB42C82253984FEB4F4D00 +:1018E000F59822E5C8C320E201D322E591C320E2A6 +:1018F00001D32253C8FB53C87F2275A41175D4CFDE +:101900002275A54175D5772253F77F75DA30227598 +:10191000E69075A8B022E4F5A9224398102230057C +:10192000FD22C2DE22D299228F9922AF99228F8C7A +:101930002222222222015E041A2A620802080109D8 +:1019400000017202E412C005DC20D00A030801097C +:101950000004017C044C0BB823280A030801090089 +:1019600001F403E805DC733C030A0108010190045B +:10197000B00BB81C520A030801090001C2038428F5 +:101980006E02080009010800D201A41D88020800A7 +:1019900009010800C8017C1B260208000901080192 +:1019A0005E028A32C8020800090108015E02BC3DDD +:1019B00022020800090108028A1E82071C0F8C08F7 +:1019C0000108020803016802D012C005DC0A0308FE +:1019D000010900024E05DC01AE348A0A0308010940 +:1019E00000012C0A00008C047E27F6080108030879 +:1019F00002080208030804193503193B02193D02C5 +:101A0000193F0200000018194105194B02194D0237 +:101A1000194F0219510128195204195A02195C026E +:101A2000195E0200000018196004196801196902A2 +:101A3000196B0200000047196D041975021977022D +:101A400019790200000018197B0319810219830219 +:101A500019850200000018198703198D02198F02D9 +:101A60001991020000000C199303199902199B02A5 +:101A7000199D020000000C199F0319A50219A70265 +:101A800019A9020000000C19AB0319B10219B30225 +:101A900019B5020000001219B70419BF0219C102DA +:101AA00019C3020000002819C50419CD0219CF027C +:101AB00019D1020000002819D30419DB0219DD0234 +:101AC00019DF020000001819E10519EB0219ED04F5 +:101AD00019F10419F50220015E041A2A62080208AD +:101AE000010900017202E412C005DC20D00A0308DB +:101AF00001090004017C044C0BB823280A030801E7 +:101B0000090001F403E805DC733C030A0108010144 +:101B10009004B00BB81C520A030801090001C2036B +:101B200084286E02080009010800D201A41D880261 +:101B3000080009010800C8017C1B260208000901F1 +:101B400008015E028A32C8020800090108015E022B +:101B5000BC3D22020800090108028A1E82071C0FF0 +:101B60008C080108020803016802D012C005DC0AD3 +:101B70000308010900024E05DC01AE348A0A03089D +:101B8000010900012C0A00008C047E27F6080108D8 +:101B90000308020802080308041AD7031ADD021A10 +:101BA000DF021AE102000000181AE3051AED021A1A +:101BB000EF021AF1021AF301281AF4041AFC021AAD +:101BC000FE021B0002000000181B02041B0A011B7E +:101BD0000B021B0D02000000471B0F041B17021B0A +:101BE00019021B1B02000000181B1D031B23021BF4 +:101BF00025021B2702000000181B29031B2F021BB4 +:101C000031021B33020000000C1B35031B3B021B7F +:101C10003D021B3F020000000C1B41031B47021B3F +:101C200049021B4B020000000C1B4D031B53021BFF +:101C300055021B5702000000121B59041B61021BB6 +:101C400063021B6502000000281B67041B6F021B58 +:101C500071021B7302000000281B75041B7D021B10 +:101C60007F021B8102000000181B83051B8D021BD5 +:101C70008F041B93041B970220015E041A2A62083A +:101C80000208010900017202E412C005DC20D00A3A +:101C9000030801090004017C044C0BB823280A0343 +:101CA0000801090001F403E805DC733C030A01089C +:101CB00001019004B00BB81C520A0308010900018D +:101CC000C20384286E02080009010800D201A41D85 +:101CD0008802080009010800C8017C1B26020800D0 +:101CE000090108015E028A32C802080009010801E0 +:101CF0005E02BC3D22020800090108028A1E82071A +:101D00001C0F8C080108020803016802D012C005EC +:101D1000DC0A0308010900024E05DC01AE348A0A20 +:101D20000308010900012C0A00008C047E27F60834 +:101D300001080308020802080308041C79031C7F39 +:101D4000021C81021C8302000000181C85051C8FE8 +:101D5000021C91021C93021C9501281C96041C9ED7 +:101D6000021CA0021CA202000000181CA4041CAC4F +:101D7000011CAD021CAF02000000471CB1041CB9DD +:101D8000021CBB021CBD02000000181CBF031CC5C6 +:101D9000021CC7021CC902000000181CCB031CD186 +:101DA000021CD3021CD5020000000C1CD7031CDD52 +:101DB000021CDF021CE1020000000C1CE3031CE912 +:101DC000021CEB021CED020000000C1CEF031CF5D2 +:101DD000021CF7021CF902000000121CFB041D0388 +:101DE000021D05021D0702000000281D09041D1127 +:101DF000021D13021D1502000000281D17041D1FDF +:101E0000021D21021D2302000000181D25051D2FA3 +:0B1E1000021D31041D35041D390220A5 +:00000001FF diff --git a/tools/fw_zbbridge/ncp-uart-sw_6.5.5_115200.ota b/tools/fw_zbbridge/ncp-uart-sw_6.5.5_115200.ota new file mode 100644 index 000000000..3655bf8a4 Binary files /dev/null and b/tools/fw_zbbridge/ncp-uart-sw_6.5.5_115200.ota differ diff --git a/tools/fw_zbbridge/ncp-uart-sw_6.7.6_115200.ota b/tools/fw_zbbridge/ncp-uart-sw_6.7.6_115200.ota new file mode 100644 index 000000000..e8fed03b0 Binary files /dev/null and b/tools/fw_zbbridge/ncp-uart-sw_6.7.6_115200.ota differ diff --git a/tools/fw_zbbridge/readme.txt b/tools/fw_zbbridge/readme.txt new file mode 100644 index 000000000..38049cf62 --- /dev/null +++ b/tools/fw_zbbridge/readme.txt @@ -0,0 +1,2 @@ +The ncp-uart-sw_6.7.6_115200.ota is for EZSP v8 compatible hosts +The ncp-uart-sw_6.5.5_115200.ota its for older like current ZHA