Merge remote-tracking branch 'upstream/development' into mpu6050_full_output

This commit is contained in:
Philip Barclay 2019-12-03 21:10:14 +13:00
commit 24ddae4001
29 changed files with 2003 additions and 6493 deletions

View File

@ -1,31 +1,32 @@
---
name: Bug report
name: Problem report
about: Create a report to help us improve
---
> **GUIDE**
>
> This BUG issue template is meant to REPORT Tasmota software BUGS ONLY>
>
> Please DO NOT OPEN AN ISSUE:
> - If your Tasmota version is not the latest from the development branch, please update your device before submitting your issue. Your problem might already be solved. The latest precompiled binaries of Tasmota can be downloaded from http://thehackbox.org/tasmota/
> - If you have a issue when flashing was done via Tuya Convert
> - If your issue is a flashing issue, please address it to the [Tasmota Support Chat](https://discord.gg/Ks2Kzd4)
> - If your issue is compilation problem, please address it to the [Tasmota Support Chat](https://discord.gg/Ks2Kzd4)
> - If your issue has been addressed before (i.e., duplicated issue), please ask in the original issue
> - If your issue is a Wi-Fi problem or MQTT problem, please try the steps provided in the [FAQ](https://github.com/arendst/Tasmota/wiki/FAQ) and troubleshooting wiki articles
>
> Please take a few minutes to complete the requested information below. Our ability to provide assistance is greatly hampered without it. The details requested potentially affect which options to pursue. The small amount of time you spend completing the template will also help the volunteers providing the assistance to you to reduce the time required to help you.
<!-- Thanks for reporting a problem for this project. READ THIS FIRST:
### BUG DESCRIPTION
_A clear and concise description of what the bug is._
This issue template is meant to REPORT Tasmota software PROBLEMS ONLY
Please DO NOT OPEN AN ISSUE:
- If your Tasmota version is not the latest from the development branch, please update your device before submitting your issue. Your problem might already be solved. The latest precompiled binaries of Tasmota can be downloaded from http://thehackbox.org/tasmota/
- If you have an issue when flashing was done via Tuya Convert, please address it to Tuya Convert Team
- If your issue is a flashing issue, please address it to the [Tasmota Support Chat](https://discord.gg/Ks2Kzd4)
- If your issue is compilation problem, please address it to the [Tasmota Support Chat](https://discord.gg/Ks2Kzd4)
- If your issue has been addressed before (i.e., duplicated issue), please ask in the original issue
- If your issue is a Wi-Fi problem or MQTT problem, please try the steps provided in the [FAQ](https://tasmota.github.io/docs/#/help/FAQ) and [Troubleshooting](https://tasmota.github.io/docs/#/help/Troubleshooting)
Please take a few minutes to complete the requested information below. Our ability to provide assistance is greatly hampered without it. The details requested potentially affect which options to pursue. The small amount of time you spend completing the template will also help the volunteers providing the assistance to you to reduce the time required to help you.
DO NOT DELETE ANY TEXT from this template! Otherwise the issue will be auto-closed.
-->
### PROBLEM DESCRIPTION
_A clear and concise description of what the problem is._
### REQUESTED INFORMATION
_Make sure your have performed every step and checked the applicable boxes before submitting your issue. Thank you!_
**FAILURE TO COMPLETE THE REQUESTED INFORMATION WILL RESULT IN YOUR ISSUE BEING CLOSED**
- [ ] Read the [Contributing Guide and Policy](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md) and [the Code of Conduct](https://github.com/arendst/Tasmota/blob/development/CODE_OF_CONDUCT.md)
- [ ] Searched the problem in [issues](https://github.com/arendst/Tasmota/issues)
- [ ] Searched the problem in the [wiki](https://github.com/arendst/Tasmota/wiki/Troubleshooting)

View File

@ -1,67 +0,0 @@
---
name: Troubleshooting
about: Users Troubleshooting Help
---
> **GUIDE**
>
> This troubleshooting issue template is meant to help Tasmota users with difficult problems. It is aimed to be opened if using the wiki and the support chat could not solve the issue. The Github Issue tracker is NOT a general discussion forum!
>
> Please DO NOT OPEN AN ISSUE:
> - If you have general questions or you need help on Tasmota usage, go to the [Tasmota Support Chat](https://discord.gg/Ks2Kzd4)
> - If your Tasmota version is not the latest from the development branch, please update your device before submitting your issue. Your problem might already be solved. The latest precompiled binaries of Tasmota can be downloaded from http://thehackbox.org/tasmota/
> - If your issue is about a new device, please use the Tasmota [Template](../wiki/Templates) feature.
> - If your issue is a flashing issue, please address it to the [Tasmota Support Chat](https://discord.gg/Ks2Kzd4)
> - If your issue is compilation problem, please address it to the [Tasmota Support Chat](https://discord.gg/Ks2Kzd4)
> - If your issue has been addressed before (i.e., duplicated issue), please ask in the original issue
> - If your issue is a Wi-Fi problem or MQTT problem, please try the steps provided in the [FAQ](https://github.com/arendst/Tasmota/wiki/FAQ) and troubleshooting wiki articles
>
> Please take a few minutes to complete the requested information below. Our ability to provide assistance is greatly hampered without it. The details requested potentially affect which options to pursue. The small amount of time you spend completing the template will also help the volunteers providing the assistance to you to reduce the time required to help you.
### ISSUE DESCRIPTION - TROUBLESHOOTING
_A clear description of what the issue is and be as extensive as possible_
### REQUESTED INFORMATION
_Make sure these boxes are checked before submitting your issue. Thank you_
**FAILURE TO COMPLETE THE REQUESTED INFORMATION WILL RESULT IN YOUR ISSUE BEING CLOSED**
- [ ] Read the [Contributing Guide and Policy](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md) and [the Code of Conduct](https://github.com/arendst/Tasmota/blob/development/CODE_OF_CONDUCT.md)
- [ ] Searched the problem in issues (https://github.com/arendst/Tasmota/issues)
- [ ] Searched the problem in the wiki (https://github.com/arendst/Tasmota/wiki/Troubleshooting)
- [ ] Searched the problem in the forum (https://groups.google.com/d/forum/sonoffusers)
- [ ] Searched the problem in the chat (https://discord.gg/Ks2Kzd4)
- [ ] Device used (e.g., Sonoff Basic): _____
- [ ] Tasmota binary firmware version number used: _____
- [ ] Pre-compiled
- [ ] Self-compiled
- [ ] IDE / Compiler used: _____
- [ ] Flashing tools used: _____
- [ ] Provide the output of this command: ``Backlog Template; Module; GPIO``:
```
Configuration output here:
```
- [ ] If using rules, provide the output of this command: ``Backlog Rule1; Rule2; Rule3``:
```
Rules output here:
```
- [ ] Provide the output of this command: ``Status 0``:
```
STATUS 0 output here:
```
- [ ] Provide the output of the Console log output when you experience your issue; if applicable:
_(Please use_ ``weblog 4`` _for more debug information)_
```
Console output here:
```
**(Please, remember to close the issue when the problem has been addressed)**

View File

@ -3,7 +3,12 @@ name: Feature request
about: Suggest an idea for this project
---
> Please take a few minutes to complete the requested information below. Our ability to provide assistance is greatly hampered without it. The details requested potentially affect which options to pursue. The small amount of time you spend completing the template will also help the volunteers providing the assistance to you to reduce the time required to help you.
<!-- Thanks for suggesting an idea for this project. READ THIS FIRST:
Please take a few minutes to complete the requested information below. Our ability to provide assistance is greatly hampered without it. The details requested potentially affect which options to pursue. The small amount of time you spend completing the template will also help the volunteers providing the assistance to you to reduce the time required to help you.
DO NOT DELETE ANY TEXT from this template! Otherwise the issue will be auto-closed.
-->
**Have you looked for this feature in other issues and in the wiki?**

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Tasmota Docs
url: https://tasmota.github.io/docs/#/
about: All the information related to Tasmota
- name: Tasmota Support Chat
url: https://discord.gg/Ks2Kzd4
about: Chat for feedback, questions and troubleshooting.

11
.github/config.yml vendored Normal file
View File

@ -0,0 +1,11 @@
# Configuration for sentiment-bot - https://github.com/behaviorbot/sentiment-bot
# *Required* toxicity threshold between 0 and .99 with the higher numbers being the most toxic
# Anything higher than this threshold will be marked as toxic and commented on
sentimentBotToxicityThreshold: .7
# *Required* Comment to reply with
sentimentBotReplyComment: >
Please be sure to review the code of conduct and be respectful of other users.
# Note: the bot will only work if your repository has a Code of Conduct

54
.github/issue-close-app.yml vendored Normal file
View File

@ -0,0 +1,54 @@
# CLOSE ISSUE BOT
# ---------------
# A bot which helps you to close issues that don't include some specific contents.
# See how to use it in https://github.com/offu/close-issue-app.
# Comment that will be sent if an issue is judged to be closed.
comment: >-
This issue has been automatically closed because the issue template is missing or incomplete.
Filling the template is required so standard questions don't need to be asked again each time.
Our ability to provide assistance is greatly hampered if few minutes are not taken to complete the issue template
with the requested information. The details requested potentially affect which options to pursue. The small amount
of time you will spend completing the template will also help the volunteers, providing assistance to you, to reduce
the time required to help you.
Please, could you be so kind on completing the [issue template](https://github.com/arendst/Tasmota/issues/new/choose) in order to have more information so as to properly help you?
Thank you for taking the time to report, hopefully it can be resolved soon.
[Support Information](https://github.com/arendst/Sonoff-Tasmota/blob/development/SUPPORT.md)
[Wiki](https://tasmota.github.io/docs/#/) for more information.
[Chat](https://discord.gg/Ks2Kzd4) for more user experience.
[Community](https://groups.google.com/d/forum/sonoffusers) for forum.
[Code of Conduct](https://github.com/arendst/Sonoff-Tasmota/blob/development/CODE_OF_CONDUCT.md)
[Contributing Guideline and Policy](https://github.com/arendst/Sonoff-Tasmota/blob/development/CONTRIBUTING.md)
issueConfigs:
# There can be several configs for different kind of issues.
- content:
# template 1: bug report
- "PROBLEM DESCRIPTION"
- "REQUESTED INFORMATION"
- "TO REPRODUCE"
- "EXPECTED BEHAVIOUR"
- content:
# template 2: feature request
- "Have you looked for this feature in other issues and in the wiki"
- "Describe the solution you'd like"
# Optional configuration:
#
# whether the keywords are case-insensitive
# default value is false, which means keywords are case-sensitive
caseInsensitive: true
# the label that will be added when the bot close an issue
# The bot will only add a label if this property is set.
label: "template missing/incomplete"
# The issue is judged to be legal if it includes all keywords from any of these two configs.
# Or it will be closed by the app.

80
MODULES.md Normal file
View File

@ -0,0 +1,80 @@
## Supported Modules
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 RGBWW 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 Tuya Dimmer | MIUO (and other Tuya based) Wifi Dimmer for Incandescent Lights and Led
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 Infra Red Wifi 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
Over 600 additional devices are supported using [templates](TEMPLATES.md).

View File

@ -20,7 +20,7 @@ In addition to the [release webpage](https://github.com/arendst/Tasmota/releases
## Development
[![Dev Version](https://img.shields.io/badge/development%20version-v7.0.0.x-blue.svg)](https://github.com/arendst/Tasmota)
[![Dev Version](https://img.shields.io/badge/development%20version-v7.1.1.x-blue.svg)](https://github.com/arendst/Tasmota)
[![Download Dev](https://img.shields.io/badge/download-development-yellow.svg)](http://thehackbox.org/tasmota/)
[![Build Status](https://img.shields.io/travis/arendst/Tasmota.svg)](https://travis-ci.org/arendst/Tasmota)
@ -28,7 +28,7 @@ See [tasmota/CHANGELOG.md](tasmota/CHANGELOG.md) for detailed change information
Unless your Tasmota powered device exhibits a problem or you need to make use of a feature that is not available in the Tasmota version currently installed on your device, leave your device alone - it works so don't make unnecessary changes! If the release version (i.e., the master branch) exhibits unexpected behaviour for your device and configuration, you should upgrade to the latest development version instead to see if your problem is resolved as some bugs in previous releases or development builds may already have been resolved.
The Tasmota development codebase is checked every 1-2 hours for changes. If new commits have been merged and they compile successfuly, new binary files for every variant (excluding non-English languages) will be posted at http://thehackbox.org/tasmota/ (this web address can be used for OTA updates too). The last compiled commit number is also indicated on the same page. It is important to note that these binaries are based on the current development codebase. These commits are tested as much as is possible and are typically quite stable. However, it is infeasible to test on the hundreds of different types of devices with all the available configuration options permitted.
The Tasmota development codebase is checked every 1-2 hours for changes. If new commits have been merged and they compile successfuly, new binary files for every variant will be posted at http://thehackbox.org/tasmota/ (this web address can be used for OTA updates too). The last compiled commit number is also indicated on the same page. It is important to note that these binaries are based on the current development codebase. These commits are tested as much as is possible and are typically quite stable. However, it is infeasible to test on the hundreds of different types of devices with all the available configuration options permitted.
Note that there is a chance, as with any upgrade, that the device may not function as expected. You must always account for the possibility that you may need to flash the device via the serial programming interface if the OTA upgrade fails. Even with the master release, you should always attempt to test the device or a similar prototype before upgrading a device which is in production or is hard to reach. And, as always, make a backup of the device configuration before beginning any firmware update.
@ -74,9 +74,26 @@ See [wiki migration path](https://tasmota.github.io/docs/#/Upgrading?id=migratio
For a database of supported devices see [Tasmota Device Templates Repository](https://blakadder.github.io/templates)
See [Wiki](https://tasmota.github.io/docs) for use instructions and how-to's.
See [Community](https://groups.google.com/d/forum/sonoffusers) for forum.
Visit [Discord Chat](https://discord.gg/Ks2Kzd4) for discussions and troubleshooting.
If you're looking for support on **Tasmota** there are some options available:
### Documentation
* [Documentation Site](https://tasmota.github.io/docs): For information on how to flash Tasmota, configure, use and expand it
* [FAQ and Troubleshooting](https://tasmota.github.io/docs/#/help/): For information on common problems and solutions.
* [Commands Information](https://tasmota.github.io/docs/#/Commands): For information on all the commands supported by Tasmota.
### Support's Community
* [Tasmota Forum](https://groups.google.com/d/forum/sonoffusers): For usage and discussions.
* [Tasmota Support Chat](https://discord.gg/Ks2Kzd4): For support, troubleshooting and general questions. You have better chances to get fast answers from members of the Tasmota Community.
* [Search in Issues](https://github.com/arendst/Tasmota/issues): You might find an answer to your question by searching current or closed issues.
### Developers' Community
* [Bug Report](https://github.com/arendst/Tasmota/issues/new?template=Bug_report.md): For reporting Bugs of Tasmota Software.
* [Feature Request](https://github.com/arendst/Tasmota/issues/new?template=Feature_request.md): For requesting features/functions to Tasmota Software.
* [Troubleshooting](https://github.com/arendst/Tasmota/issues/new?template=Custom.md): As a last resort, you can open new *Troubleshooting* issue on GitHub if the solution could not be found using the other channels. Just remember: the more info you provide the more chances you'll have to get an accurate answer.
* [Issue a question](https://github.com/arendst/Tasmota/issues/new/choose): As a last resort, you can open a new *Question* issue on GitHub if the answer could not be found using the other channels. Just remember: the more info you provide the more chances you'll have to get an accurate answer.
## Contribute

View File

@ -28,87 +28,6 @@ To save resources when TLS is enabled mDNS needs to be disabled. In addition to
For initial configuration this release supports Webserver based **WifiManager** or **Serial** based command interface only. Support for **WPS** and **SmartConfig** has been removed.
## Supported Modules
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 RGBWW 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 Tuya Dimmer | MIUO (and other Tuya based) Wifi Dimmer for Incandescent Lights and Led
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 Infra Red Wifi 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
Over 500 additional devices are supported using [templates](TEMPLATES.md).
## Provided Binary Downloads
The following binary downloads have been compiled with ESP8266/Arduino library core version **2.6.1**.
@ -122,45 +41,14 @@ The following binary downloads have been compiled with ESP8266/Arduino library c
- **tasmota-display.bin** = The Display version without Energy Monitoring but adds display support.
- **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.
[Complete list](BUILDS.md) of available feature and sensors.
## Changelog
### Version 7.1.0 Betty
### Version 7.1.2 Betty
- Remove update support for versions before 6.0
- Remove driver xsns_12_ads1115_i2cdev replaced by xsns_12_ads1115
- Remove most IR protocols from non dedicated IR firmware except NEC, RC5 and RC6
- Change repository name from Sonoff-Tasmota to Tasmota and all code references from Sonoff to Tasmota
- Change documentation from wiki to [documentation repository](https://tasmota.github.io/docs/) by @Blakadder
- Change default GUI to dark theme
- Change ArduinoSlave to TasmotaSlave
- Change IRremoteESP8266 library to v2.7.1
- Change supported PCF8574 I2C address range to 0x20 - 0x26 allowing other I2C devices with address 0x27 to be used at the same time
- Change supported PCF8574A I2C address range to 0x39 - 0x3F allowing other I2C devices with address 0x38 to be used at the same time
- Change supported MCP230xx I2C address range to 0x20 - 0x26 allowing other I2C devices with address 0x27 to be used at the same time
- Change Reset erase end address from as seen by SDK (getFlashChipSize) to full flash size (getFlashChipRealSize)
- Change new Fade system much smoother, Speed now up to 40 (#6942, #3714)
- Fix better control of RGB/White when ``SetOption37`` >128, added ``Dimmer1`` and ``Dimmer2`` commands (#6714)
- Fix random crash caused by UPNP flood
- Fix check deepsleep for valid values in Settings (#6961)
- Fix Wifi instability when light is on, due to ``Sleep 0`` (#6961, #6608)
- Fix auto-power on/off when setting channel to non-zero or zero value, when ``SetOption68 1``
- Fix postpone saving settings to flash until Fade is complete, avoids pause in Fade
- Add support for Tuya battery powered devices (#6735)
- Add support for Honeywell I2C HIH series Humidity and Temperetaure sensor (#6808)
- Add support for Honeywell HPMA115S0 particle concentration sensor by David Hunt (#6843)
- Add support for I2C sensor TLS2591 Light Intensity sensor (#6873)
- Add command ``SetOption73 0/1`` to re-enable HTTP Cross-Origin Resource Sharing (CORS) now default disabled (#6767)
- Add command ``SetOption74 0/1`` to enable DS18x20 internal pull-up and remove define DS18B20_INTERNAL_PULLUP (#6795)
- Add command ``SetOption75 0/1`` to switch between grouptopic (0) using fulltopic replacing %topic% or (1) is cmnd/\<grouptopic\> (#6779)
- Add command ``SetOption76 0/1`` to enable incrementing bootcount when deepsleep is enabled (#6930)
- Add command ``I2cDriver`` for I2C driver runtime control using document I2CDEVICES.md
- Add command ``TempOffset -12.6 .. 12.6`` to set global temperature sensor offset (#6958)
- Add command ``WebColor19`` to control color of Module and Name (#6811)
- Add command ``WifiPower 0 .. 20.5`` to set Wifi Output Power which will be default set to 17dBm
- Add frequency to ADE7953 energy monitor as used in Shelly 2.5 by ljakob (#6778)
- Add hide Alexa objects with friendlyname starting with '$' (#6722, #6762)
- Add Zigbee command support, considered as v1.0 for full Zigbee support
- Add hardware detection to be overruled with ``SetOption51`` (#6969)
- Add Colorpicker to WebUI by Christian Staars (#6984)
- Fix lost functionality of GPIO9 and GPIO10 on some devices (#7080)
- Fix Zigbee uses Hardware Serial if GPIO 1/3 or GPIO 13/15 and SerialLog 0 (#7071)
- Change light color schemes 2, 3 and 4 from color wheel to Hue driven

View File

@ -1,24 +0,0 @@
<img src="/tools/logo/TASMOTA_FullLogo_Vector.svg" style="margin:5px;float:right;width:50"></img>
# Support
If you're looking for support on **Tasmota** there are some options available:
## Documentation:
* [Documentation Site](https://tasmota.github.io/docs): For information on how to flash Tasmota, configure, use and expand it
* [FAQ and Troubleshooting](https://tasmota.github.io/docs/#/help/): For information on common problems and solutions.
* [Commands Information](https://tasmota.github.io/docs/#/Commands): For information on all the commands supported by Tasmota.
## Support's Community:
* [Tasmota Forum](https://groups.google.com/d/forum/sonoffusers): For usage and discussions.
* [Tasmota Support Chat](https://discord.gg/Ks2Kzd4): For support, troubleshooting and general questions. You have better chances to get fast answers from members of the Tasmota Community.
* [Search in Issues](https://github.com/arendst/Tasmota/issues): You might find an answer to your question by searching current or closed issues.
## Developers' Community:
* [Bug Report](https://github.com/arendst/Tasmota/issues/new?template=Bug_report.md): For reporting Bugs of Tasmota Software.
* [Feature Request](https://github.com/arendst/Tasmota/issues/new?template=Feature_request.md): For requesting features/functions to Tasmota Software.
* [Troubleshooting](https://github.com/arendst/Tasmota/issues/new?template=Custom.md): As a last resort, you can open new *Troubleshooting* issue on GitHub if the solution could not be found using the other channels. Just remember: the more info you provide the more chances you'll have to get an accurate answer.
* [Issue a question](https://github.com/arendst/Tasmota/issues/new/choose): As a last resort, you can open a new *Question* issue on GitHub if the answer could not be found using the other channels. Just remember: the more info you provide the more chances you'll have to get an accurate answer.

View File

@ -11,7 +11,8 @@
src_dir = tasmota
build_dir = .pioenvs
build_cache_dir = .cache
extra_configs = platformio_override.ini
extra_configs = platformio_tasmota_env.ini
platformio_override.ini
; *** Build/upload environment
default_envs =
@ -45,6 +46,11 @@ default_envs =
; tasmota-TR
; tasmota-TW
; tasmota-UK
;
; *** alternatively can be done in: platformio_override.ini
; *** See example: platformio_override_sample.ini
; *********************************************************************
[common]
framework = arduino
@ -57,611 +63,47 @@ build_flags = ${core_active.build_flags}
; *********************************************************************
; *** Uncomment, by deleting ";" in line below, to use custom settings from file user_config_override.h
; -DUSE_CONFIG_OVERRIDE
;
; *** alternatively can be done in: platformio_override.ini
; *** See example: platformio_override_sample.ini
; *********************************************************************
; *** Optional Debug messages
; -DDEBUG_TASMOTA_CORE
; -DDEBUG_TASMOTA_DRIVER
; -DDEBUG_TASMOTA_SENSOR
; *** Optional Firmware configurations
; -DFIRMWARE_MINIMAL
; -DFIRMWARE_SENSORS
; -DFIRMWARE_BASIC
; -DFIRMWARE_KNX_NO_EMULATION
; -DFIRMWARE_DISPLAYS
; -DFIRMWARE_IR
; -DFIRMWARE_IR_CUSTOM
; *** Fix espressif8266@1.7.0 induced undesired all warnings
build_unflags = -Wall
; set CPU frequency to 80MHz (default) or 160MHz
board_build.f_cpu = 80000000L
;board_build.f_cpu = 160000000L
monitor_speed = 115200
upload_speed = 115200
upload_resetmethod = nodemcu
; *** Upload Serial reset method for Wemos and NodeMCU
upload_resetmethod = nodemcu
upload_port = COM5
extra_scripts = ${scripts_defaults.extra_scripts}
[scripts_defaults]
extra_scripts = pio/strip-floats.py
pio/name-firmware.py
; pio/obj-dump.py
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
;extra_scripts = pio/strip-floats.py, pio/sftp-uploader.py
; *** Upload file to OTA server in folder api/arduino using HTTP
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/strip-floats.py, pio/http-uploader.py
[core_active]
; Select one core set for platform and build_flags
platform = ${core_2_6_1.platform}
build_flags = ${core_2_6_1.build_flags}
;platform = ${core_2_6_2.platform}
;build_flags = ${core_2_6_2.build_flags}
;platform = ${core_stage.platform}
;build_flags = ${core_stage.build_flags}
; *********************************************************************
[esp82xx_defaults]
build_flags = -D NDEBUG
-mtarget-align
-Wl,-Map,firmware.map
[core_active]
platform = ${core_2_6_1.platform}
build_flags = ${core_2_6_1.build_flags}
[core_2_6_1]
; *** Esp8266 core for Arduino version 2.6.1
platform = espressif8266@2.3.0
build_flags = ${esp82xx_defaults.build_flags}
-Wl,-Teagle.flash.1m.ld
-DBEARSSL_SSL_BASIC
; NONOSDK221
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221
; NONOSDK22x_190313
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190313
; NONOSDK22x_190703 = 2.2.2-dev(38a443e) (Tasmota default)
; NONOSDK22x_190703 = 2.2.2-dev(38a443e)
-DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703
; NONOSDK22x_191024 = 2.2.2-dev(5ab15d1)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191024
; NONOSDK22x_191105 = 2.2.2-dev(bb83b9b)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191105
; NONOSDK3V0 (known issues)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK3
; lwIP 1.4
; -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH
; lwIP 2 - Low Memory
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY
; lwIP 2 - Higher Bandwidth
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
; lwIP 2 - Higher Bandwidth Low Memory no Features
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY_LOW_FLASH
; lwIP 2 - Higher Bandwidth no Features (Tasmota default)
; lwIP 2 - Higher Bandwidth no Features
-DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH
; lwIP 2 - Higher Bandwidth IPv6 (use ONLY if you need IPv6, experimental!)
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_IPV6_HIGHER_BANDWIDTH
; VTABLES in Flash (Tasmota default)
; VTABLES in Flash
-DVTABLES_IN_FLASH
; VTABLES in Heap
; -DVTABLES_IN_DRAM
; VTABLES in IRAM
; -DVTABLES_IN_IRAM
; enable one option set -> No exception recommended
; No exception code in firmware
-fno-exceptions
-lstdc++
; Exception code in firmware /needs much space! 90k
; -fexceptions
; -lstdc++-exc
[core_2_6_2]
; *** Esp8266 core for Arduino version 2.6.2
platform = espressif8266@2.3.1
build_flags = ${esp82xx_defaults.build_flags}
-Wl,-Teagle.flash.1m.ld
-DBEARSSL_SSL_BASIC
; NONOSDK221
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221
; NONOSDK22x_190313
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190313
; NONOSDK22x_190703 = 2.2.2-dev(38a443e) (Tasmota default)
-DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703
; NONOSDK22x_191024 = 2.2.2-dev(5ab15d1)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191024
; NONOSDK22x_191105 = 2.2.2-dev(bb83b9b)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191105
; NONOSDK3V0 (known issues)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK3
; lwIP 1.4
; -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH
; lwIP 2 - Low Memory
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY
; lwIP 2 - Higher Bandwidth
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
; lwIP 2 - Higher Bandwidth Low Memory no Features
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY_LOW_FLASH
; lwIP 2 - Higher Bandwidth no Features (Tasmota default)
-DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH
; lwIP 2 - Higher Bandwidth IPv6 (use ONLY if you need IPv6, experimental!)
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_IPV6_HIGHER_BANDWIDTH
; VTABLES in Flash (Tasmota default)
-DVTABLES_IN_FLASH
; VTABLES in Heap
; -DVTABLES_IN_DRAM
; VTABLES in IRAM
; -DVTABLES_IN_IRAM
; enable one option set -> No exception recommended
; No exception code in firmware
-fno-exceptions
-lstdc++
; Exception code in firmware /needs much space! 90k
; -fexceptions
; -lstdc++-exc
[core_stage]
; *** Esp8266 core for Arduino version latest beta
platform = https://github.com/platformio/platform-espressif8266.git#feature/stage
build_flags = ${esp82xx_defaults.build_flags}
-Wl,-Teagle.flash.1m.ld
-DBEARSSL_SSL_BASIC
; NONOSDK221
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221
; NONOSDK22x_190313
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190313
; NONOSDK22x_190703 (Tasmota default)
-DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703
; NONOSDK22x_191024
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191024
; NONOSDK22x_191105
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191105
; NONOSDK3V0 (known issues)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK3
; lwIP 1.4
; -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH
; lwIP 2 - Low Memory
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY
; lwIP 2 - Higher Bandwidth
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
; lwIP 2 - Higher Bandwidth Low Memory no Features
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY_LOW_FLASH
; lwIP 2 - Higher Bandwidth no Features (Tasmota default)
-DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH
; VTABLES in Flash (Tasmota default)
-DVTABLES_IN_FLASH
; VTABLES in Heap
; -DVTABLES_IN_DRAM
; VTABLES in IRAM
; -DVTABLES_IN_IRAM
; enable one option set -> No exception recommended
; No exception code in firmware
-fno-exceptions
-lstdc++
; Exception code in firmware /needs much space! 90k
; -fexceptions
; -lstdc++-exc
[env:tasmota]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags}
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
; *** Debug version used for PlatformIO Home Project Inspection
[env:tasmota-debug]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_type = debug
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags}
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-minimal]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DFIRMWARE_MINIMAL
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-basic]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DFIRMWARE_BASIC
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-knx]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DFIRMWARE_KNX_NO_EMULATION
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-sensors]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DFIRMWARE_SENSORS
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-display]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DFIRMWARE_DISPLAYS
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-ir]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DUSE_IR_REMOTE_FULL -DFIRMWARE_IR
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-ircustom]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DUSE_IR_REMOTE_FULL
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-BG]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=bg-BG
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-BR]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=pt-BR
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-CN]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=zh-CN
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-CZ]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=cs-CZ
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-DE]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=de-DE
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-ES]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=es-ES
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-FR]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=fr-FR
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-GR]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=el-GR
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-HE]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=he-HE
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-HU]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=hu-HU
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-IT]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=it-IT
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-KO]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=ko-KO
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-NL]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=nl-NL
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-PL]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=pl-PL
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-PT]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=pt-PT
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-RU]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=ru-RU
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-SE]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=sv-SE
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-SK]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=sk-SK
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-TR]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=tr-TR
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-TW]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=zh-TW
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota-UK]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} -DMY_LANGUAGE=uk-UK
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}

View File

@ -1,16 +1,19 @@
; PlatformIO Project Configuration Override File
; *** Example PlatformIO Project Configuration Override File ***
; *** Changes done here override settings in platformio.ini ***
;
; Build options: build flags, source filter, extra scripting
; Upload options: custom port, speed and extra flags
; Library options: dependencies, extra library storages
; *****************************************************************
; *** to activate rename this file to platformio_override.ini ***
; *****************************************************************
;
; Please visit documentation for the other options and examples
; Please visit documentation for the options and examples
; http://docs.platformio.org/en/stable/projectconf.html
;
[platformio]
; *** Build/upload environment
default_envs =
default_envs =
; *** Uncomment the line(s) below to select version(s)
tasmota
; tasmota-debug
@ -24,14 +27,185 @@ default_envs =
[common]
; *** Use settings from file user_config_override.h
platform = ${core_active.platform}
build_flags = ${core_active.build_flags}
; *** Use settings from file user_config_override.h
-DUSE_CONFIG_OVERRIDE
; *** Optional Firmware configurations
; -DFIRMWARE_MINIMAL
; -DFIRMWARE_SENSORS
; -DFIRMWARE_BASIC
; -DFIRMWARE_KNX_NO_EMULATION
; -DFIRMWARE_DISPLAYS
; -DFIRMWARE_IR
; -DFIRMWARE_IR_CUSTOM
; *** Optional Debug messages
; -DDEBUG_TASMOTA_CORE
; -DDEBUG_TASMOTA_DRIVER
; -DDEBUG_TASMOTA_SENSOR
; set CPU frequency to 80MHz (default) or 160MHz
;board_build.f_cpu = 160000000L
; *** Upload Serial reset method for Wemos and NodeMCU
upload_port = COM5
[core_active]
extra_scripts = ${scripts_defaults.extra_scripts}
pio/obj-dump.py
platform = ${core_2_6_2.platform}
build_flags = ${core_2_6_2.build_flags}
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
;extra_scripts = ${scripts_defaults.extra_scripts}
; pio/strip-floats.py, pio/sftp-uploader.py
; *** Upload file to OTA server in folder api/arduino using HTTP
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = ${scripts_defaults.extra_scripts}
; pio/strip-floats.py, pio/http-uploader.py
[core_active]
; Select one core set for platform and build_flags
platform = ${core_2_6_1.platform}
build_flags = ${core_2_6_1.build_flags}
;platform = ${core_2_6_2.platform}
;build_flags = ${core_2_6_2.build_flags}
;platform = ${core_stage.platform}
;build_flags = ${core_stage.build_flags}
[core_2_6_1]
; *** Esp8266 core for Arduino version 2.6.1
platform = espressif8266@2.3.0
build_flags = ${esp82xx_defaults.build_flags}
-Wl,-Teagle.flash.1m.ld
-DBEARSSL_SSL_BASIC
; NONOSDK221
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221
; NONOSDK22x_190313
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190313
; NONOSDK22x_190703 = 2.2.2-dev(38a443e) (Tasmota default)
-DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703
; NONOSDK22x_191024 = 2.2.2-dev(5ab15d1)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191024
; NONOSDK22x_191105 = 2.2.2-dev(bb83b9b)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191105
; NONOSDK3V0 (known issues)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK3
; lwIP 1.4
; -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH
; lwIP 2 - Low Memory
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY
; lwIP 2 - Higher Bandwidth
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
; lwIP 2 - Higher Bandwidth Low Memory no Features
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY_LOW_FLASH
; lwIP 2 - Higher Bandwidth no Features (Tasmota default)
-DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH
; lwIP 2 - Higher Bandwidth IPv6 (use ONLY if you need IPv6, experimental!)
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_IPV6_HIGHER_BANDWIDTH
; VTABLES in Flash (Tasmota default)
-DVTABLES_IN_FLASH
; VTABLES in Heap
; -DVTABLES_IN_DRAM
; VTABLES in IRAM
; -DVTABLES_IN_IRAM
; enable one option set -> No exception recommended
; No exception code in firmware
-fno-exceptions
-lstdc++
; Exception code in firmware /needs much space! 90k
; -fexceptions
; -lstdc++-exc
[core_2_6_2]
; *** Esp8266 core for Arduino version 2.6.2
platform = espressif8266@2.3.1
build_flags = ${esp82xx_defaults.build_flags}
-Wl,-Teagle.flash.1m.ld
-DBEARSSL_SSL_BASIC
; NONOSDK221
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221
; NONOSDK22x_190313
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190313
; NONOSDK22x_190703 = 2.2.2-dev(38a443e) (Tasmota default)
-DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703
; NONOSDK22x_191024 = 2.2.2-dev(5ab15d1)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191024
; NONOSDK22x_191105 = 2.2.2-dev(bb83b9b)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191105
; NONOSDK3V0 (known issues)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK3
; lwIP 1.4
; -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH
; lwIP 2 - Low Memory
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY
; lwIP 2 - Higher Bandwidth
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
; lwIP 2 - Higher Bandwidth Low Memory no Features
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY_LOW_FLASH
; lwIP 2 - Higher Bandwidth no Features (Tasmota default)
-DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH
; lwIP 2 - Higher Bandwidth IPv6 (use ONLY if you need IPv6, experimental!)
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_IPV6_HIGHER_BANDWIDTH
; VTABLES in Flash (Tasmota default)
-DVTABLES_IN_FLASH
; VTABLES in Heap
; -DVTABLES_IN_DRAM
; VTABLES in IRAM
; -DVTABLES_IN_IRAM
; enable one option set -> No exception recommended
; No exception code in firmware
-fno-exceptions
-lstdc++
; Exception code in firmware /needs much space! 90k
; -fexceptions
; -lstdc++-exc
[core_stage]
; *** Esp8266 core for Arduino version latest beta
platform = https://github.com/platformio/platform-espressif8266.git#feature/stage
build_flags = ${esp82xx_defaults.build_flags}
-Wl,-Teagle.flash.1m.ld
-DBEARSSL_SSL_BASIC
; NONOSDK221
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221
; NONOSDK22x_190313
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190313
; NONOSDK22x_190703 (Tasmota default)
-DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703
; NONOSDK22x_191024
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191024
; NONOSDK22x_191105
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191105
; NONOSDK3V0 (known issues)
; -DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK3
; lwIP 1.4
; -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH
; lwIP 2 - Low Memory
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY
; lwIP 2 - Higher Bandwidth
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
; lwIP 2 - Higher Bandwidth Low Memory no Features
; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY_LOW_FLASH
; lwIP 2 - Higher Bandwidth no Features (Tasmota default)
-DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH
; VTABLES in Flash (Tasmota default)
-DVTABLES_IN_FLASH
; VTABLES in Heap
; -DVTABLES_IN_DRAM
; VTABLES in IRAM
; -DVTABLES_IN_IRAM
; enable one option set -> No exception recommended
; No exception code in firmware
-fno-exceptions
-lstdc++
; Exception code in firmware /needs much space! 90k
; -fexceptions
; -lstdc++-exc
; *** Debug version used for PlatformIO Home Project Inspection
[env:tasmota-debug]
build_type = debug

View File

@ -0,0 +1,99 @@
[env]
platform = ${common.platform}
framework = ${common.framework}
board = ${common.board}
board_build.flash_mode = ${common.board_build.flash_mode}
board_build.f_cpu = ${common.board_build.f_cpu}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags}
monitor_speed = ${common.monitor_speed}
upload_port = ${common.upload_port}
upload_resetmethod = ${common.upload_resetmethod}
upload_speed = ${common.upload_speed}
extra_scripts = ${common.extra_scripts}
[env:tasmota]
[env:tasmota-minimal]
build_flags = ${common.build_flags} -DFIRMWARE_MINIMAL
[env:tasmota-basic]
build_flags = ${common.build_flags} -DFIRMWARE_BASIC
[env:tasmota-knx]
build_flags = ${common.build_flags} -DFIRMWARE_KNX_NO_EMULATION
[env:tasmota-sensors]
build_flags = ${common.build_flags} -DFIRMWARE_SENSORS
[env:tasmota-display]
build_flags = ${common.build_flags} -DFIRMWARE_DISPLAYS
[env:tasmota-ir]
build_flags = ${common.build_flags} -DUSE_IR_REMOTE_FULL -DFIRMWARE_IR
[env:tasmota-ircustom]
build_flags = ${common.build_flags} -DUSE_IR_REMOTE_FULL
[env:tasmota-BG]
build_flags = ${common.build_flags} -DMY_LANGUAGE=bg-BG
[env:tasmota-BR]
build_flags = ${common.build_flags} -DMY_LANGUAGE=pt-BR
[env:tasmota-CN]
build_flags = ${common.build_flags} -DMY_LANGUAGE=zh-CN
[env:tasmota-CZ]
build_flags = ${common.build_flags} -DMY_LANGUAGE=cs-CZ
[env:tasmota-DE]
build_flags = ${common.build_flags} -DMY_LANGUAGE=de-DE
[env:tasmota-ES]
build_flags = ${common.build_flags} -DMY_LANGUAGE=es-ES
[env:tasmota-FR]
build_flags = ${common.build_flags} -DMY_LANGUAGE=fr-FR
[env:tasmota-GR]
build_flags = ${common.build_flags} -DMY_LANGUAGE=el-GR
[env:tasmota-HE]
build_flags = ${common.build_flags} -DMY_LANGUAGE=he-HE
[env:tasmota-HU]
build_flags = ${common.build_flags} -DMY_LANGUAGE=hu-HU
[env:tasmota-IT]
build_flags = ${common.build_flags} -DMY_LANGUAGE=it-IT
[env:tasmota-KO]
build_flags = ${common.build_flags} -DMY_LANGUAGE=ko-KO
[env:tasmota-NL]
build_flags = ${common.build_flags} -DMY_LANGUAGE=nl-NL
[env:tasmota-PL]
build_flags = ${common.build_flags} -DMY_LANGUAGE=pl-PL
[env:tasmota-PT]
build_flags = ${common.build_flags} -DMY_LANGUAGE=pt-PT
[env:tasmota-RU]
build_flags = ${common.build_flags} -DMY_LANGUAGE=ru-RU
[env:tasmota-SE]
build_flags = ${common.build_flags} -DMY_LANGUAGE=sv-SE
[env:tasmota-SK]
build_flags = ${common.build_flags} -DMY_LANGUAGE=sk-SK
[env:tasmota-TR]
build_flags = ${common.build_flags} -DMY_LANGUAGE=tr-TR
[env:tasmota-TW]
build_flags = ${common.build_flags} -DMY_LANGUAGE=zh-TW
[env:tasmota-UK]
build_flags = ${common.build_flags} -DMY_LANGUAGE=uk-UK

View File

@ -1,5 +1,29 @@
## Unreleased (development)
### 7.1.1.1 20191201
- Fix lost functionality of GPIO9 and GPIO10 on some devices (#7080)
- Fix Zigbee uses Hardware Serial if GPIO 1/3 or GPIO 13/15 and SerialLog 0 (#7071)
- Fix WS2812 power control (#7090)
- Change light color schemes 2, 3 and 4 from color wheel to Hue driven
## Released
### 7.1.1 20191201
- Maintenance Release
### 7.1.0.1 20191130
- Fix slider for devices with one or two channels like only white or white/yellow
- Fix TasmotaSlave buffer overrun on Tele
- Fix light scheme 4 speed (#7072)
- Add support for TasmotaSlave executing commands on Tasmota
### 7.1.0 20191129
- Release
### 7.0.0.6 20191122
- Add colorpicker to WebUI by Christian Staars (#6984)
@ -8,6 +32,7 @@
- Change update lib IRremoteESP8266 updated to v2.7.1, -2.7k flash and -1.5k RAM for Tasmota-IR
- Fix auto--power on/off when setting channel to non-zero or zero value, when SetOption68 1
- Fix postpone saving settings to flash until Fade is complete, avoids pause in Fade
- Add command ``SetOption77 0/1`` to keep power on when slider is far left
### 7.0.0.5 20191118
@ -64,8 +89,6 @@
- Add support for Tuya battery powered devices (#6735)
- Change repository name from Sonoff-Tasmota to Tasmota and all code references from Sonoff to Tasmota
## Released
### 6.7.1 20191026
- Release

View File

@ -90,7 +90,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t ds18x20_internal_pullup : 1; // bit 24 (v7.0.0.1) - SetOption74 - Enable internal pullup for single DS18x20 sensor
uint32_t grouptopic_mode : 1; // bit 25 (v7.0.0.1) - SetOption75 - GroupTopic replaces %topic% (0) or fixed topic cmnd/grouptopic (1)
uint32_t bootcount_update : 1; // bit 26 (v7.0.0.4) - SetOption76 - Enable incrementing bootcount when deepsleep is enabled
uint32_t spare27 : 1;
uint32_t slider_dimmer_stay_on : 1; // bit 27 (v7.0.0.6) - SetOption77 - Do not power off if slider moved to far left
uint32_t spare28 : 1;
uint32_t spare29 : 1;
uint32_t shutter_mode : 1; // bit 30 (v6.6.0.14) - SetOption80 - Enable shutter support

View File

@ -521,7 +521,7 @@ char* GetPowerDevice(char* dest, uint32_t idx, size_t size)
return GetPowerDevice(dest, idx, size, 0);
}
bool IsEsp8285(void)
void GetEspHardwareType(void)
{
// esptool.py get_efuses
uint32_t efuse1 = *(uint32_t*)(0x3FF00050);
@ -529,17 +529,16 @@ bool IsEsp8285(void)
// uint32_t efuse3 = *(uint32_t*)(0x3FF00058);
// uint32_t efuse4 = *(uint32_t*)(0x3FF0005C);
bool is_8285 = ( (efuse1 & (1 << 4)) || (efuse2 & (1 << 16)) );
is_8285 = ( (efuse1 & (1 << 4)) || (efuse2 & (1 << 16)) );
if (is_8285 && (ESP.getFlashChipRealSize() > 1048576)) {
is_8285 = false; // ESP8285 can only have 1M flash
}
return is_8285;
}
String GetDeviceHardware(void)
{
char buff[10];
if (IsEsp8285()) {
if (is_8285) {
strcpy_P(buff, PSTR("ESP8285"));
} else {
strcpy_P(buff, PSTR("ESP8266EX"));
@ -1034,18 +1033,18 @@ bool FlashPin(uint32_t pin)
uint8_t ValidPin(uint32_t pin, uint32_t gpio)
{
uint8_t result = gpio;
if (FlashPin(pin)) {
result = GPIO_NONE; // Disable flash pins GPIO6, GPIO7, GPIO8 and GPIO11
return GPIO_NONE; // Disable flash pins GPIO6, GPIO7, GPIO8 and GPIO11
}
if (!IsEsp8285() && !Settings.flag3.user_esp8285_enable) { // SetOption51 - Enable ESP8285 user GPIO's
// if (!is_8285 && !Settings.flag3.user_esp8285_enable) { // SetOption51 - Enable ESP8285 user GPIO's
if ((WEMOS == Settings.module) && !Settings.flag3.user_esp8285_enable) { // SetOption51 - Enable ESP8285 user GPIO's
if ((pin == 9) || (pin == 10)) {
result = GPIO_NONE; // Disable possible flash GPIO9 and GPIO10
return GPIO_NONE; // Disable possible flash GPIO9 and GPIO10
}
}
return result;
return gpio;
}
bool ValidGPIO(uint32_t pin, uint32_t gpio)

1339
tasmota/support_tasmota.ino Normal file

File diff suppressed because it is too large Load Diff

View File

@ -118,8 +118,10 @@ void WifiSetMode(WiFiMode_t wifi_mode)
delay(100);
}
if (!WiFi.mode(wifi_mode)) {
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI "Cannot set Mode"));
uint32_t retry = 2;
while (!WiFi.mode(wifi_mode) && retry--) {
AddLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR("Retry set Mode..."));
delay(100);
}
if (wifi_mode == WIFI_OFF) {

File diff suppressed because it is too large Load Diff

View File

@ -20,6 +20,6 @@
#ifndef _TASMOTA_VERSION_H_
#define _TASMOTA_VERSION_H_
const uint32_t VERSION = 0x07000006;
const uint32_t VERSION = 0x07010101;
#endif // _TASMOTA_VERSION_H_

View File

@ -154,9 +154,11 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM =
const char HTTP_SCRIPT_ROOT_PART2[] PROGMEM =
"function lc(v,i,p){"
"if(v=='h'||v=='d'){" // Hue or Brightness changed so change Saturation colors too
"var sl=eb('sl4').value;"
"eb('s').style.background='linear-gradient(to right,rgb('+sl+'%%,'+sl+'%%,'+sl+'%%),hsl('+eb('sl2').value+',100%%,50%%))';"
"if(eb('s')){" // Check if Saturation is in DOM otherwise javascript fails on la()
"if(v=='h'||v=='d'){" // Hue or Brightness changed so change Saturation colors too
"var sl=eb('sl4').value;"
"eb('s').style.background='linear-gradient(to right,rgb('+sl+'%%,'+sl+'%%,'+sl+'%%),hsl('+eb('sl2').value+',100%%,50%%))';"
"}"
"}"
"la('&'+v+i+'='+p);"
"}"
@ -1065,7 +1067,7 @@ void HandleRoot(void)
"c", // c - Unique HTML id
"#000", "#fff", // Black to White
4, // sl4 - Unique range HTML id - Used as source for Saturation begin color
0, 100, // Range 0 to 100%
Settings.flag3.slider_dimmer_stay_on, 100, // Range 0/1 to 100%
Settings.light_dimmer,
'd', 0); // d0 - Value id is related to lc("d0", value) and WebGetArg("d0", tmp, sizeof(tmp));
} else { // Settings.flag3.pwm_multi_channels - SetOption68 1 - Enable multi-channels PWM instead of Color PWM

View File

@ -242,6 +242,7 @@ struct LIGHT {
uint8_t color_remap[LST_MAX];
uint8_t wheel = 0;
uint8_t random = 0;
uint8_t subtype = 0; // LST_ subtype
uint8_t device = 0;
uint8_t old_power = 1;
@ -1509,58 +1510,27 @@ void LightPreparePower(power_t channels = 0xFFFFFFFF) { // 1 = only RGB, 2 =
LightState(0);
}
void LightWheel(uint8_t wheel_pos)
{
wheel_pos = 255 - wheel_pos;
if (wheel_pos < 85) {
Light.entry_color[0] = 255 - wheel_pos * 3;
Light.entry_color[1] = 0;
Light.entry_color[2] = wheel_pos * 3;
} else if (wheel_pos < 170) {
wheel_pos -= 85;
Light.entry_color[0] = 0;
Light.entry_color[1] = wheel_pos * 3;
Light.entry_color[2] = 255 - wheel_pos * 3;
} else {
wheel_pos -= 170;
Light.entry_color[0] = wheel_pos * 3;
Light.entry_color[1] = 255 - wheel_pos * 3;
Light.entry_color[2] = 0;
}
Light.entry_color[3] = 0;
Light.entry_color[4] = 0;
float dimmer = 100 / (float)Settings.light_dimmer;
for (uint32_t i = 0; i < LST_RGB; i++) {
float temp = (float)Light.entry_color[i] / dimmer + 0.5f;
Light.entry_color[i] = (uint8_t)temp;
}
}
void LightCycleColor(int8_t direction)
{
if (Light.strip_timer_counter % (Settings.light_speed * 2)) {
return;
}
Light.wheel += direction;
LightWheel(Light.wheel);
memcpy(Light.new_color, Light.entry_color, sizeof(Light.new_color));
}
void LightRandomColor(void)
{
bool update = false;
for (uint32_t i = 0; i < LST_RGB; i++) {
if (Light.new_color[i] != Light.current_color[i]) {
update = true;
if (0 == direction) {
if (Light.random == Light.wheel) {
Light.random = random(255);
}
direction = (Light.random < Light.wheel) ? -1 : 1;
}
if (!update) {
Light.wheel = random(255);
LightWheel(Light.wheel);
memcpy(Light.current_color, Light.entry_color, sizeof(Light.current_color));
}
Light.wheel += direction;
uint16_t hue = changeUIntScale(Light.wheel, 0, 255, 0, 359); // Scale to hue to keep amount of steps low (max 255 instead of 359)
memcpy(Light.new_color, Light.current_color, sizeof(Light.new_color));
// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DBG: random %d, wheel %d, hue %d"), Light.random, Light.wheel, hue);
uint8_t sat;
light_state.getHSB(nullptr, &sat, nullptr); // Allow user control over Saturation
light_state.setHS(hue, sat);
light_controller.calcLevels(Light.new_color);
}
void LightSetPower(void)
@ -1601,6 +1571,7 @@ void LightAnimate(void)
{
uint8_t cur_col[LST_MAX];
uint16_t light_still_on = 0;
bool power_off = false;
Light.strip_timer_counter++;
if (!Light.power) { // All channels powered off
@ -1608,6 +1579,9 @@ void LightAnimate(void)
if (!Light.fade_running) {
sleep = Settings.sleep;
}
if (Settings.light_scheme >= LS_MAX) {
power_off = true;
}
} else {
if (Settings.sleep > PWM_MAX_SLEEP) {
sleep = PWM_MAX_SLEEP; // set a maxumum value of 50 milliseconds to ensure that animations are smooth
@ -1652,14 +1626,14 @@ void LightAnimate(void)
LightCycleColor(-1);
break;
case LS_RANDOM:
LightRandomColor();
LightCycleColor(0);
break;
default:
XlgtCall(FUNC_SET_SCHEME);
}
}
if (Settings.light_scheme < LS_MAX) { // exclude WS281X Neopixel
if ((Settings.light_scheme < LS_MAX) || power_off) { // exclude WS281X Neopixel schemes
// Apply power modifiers to Light.new_color
LightApplyPower(Light.new_color, Light.power);
@ -1744,7 +1718,7 @@ void LightAnimate(void)
cur_col_10bits[i] = orig_col_10bits[Light.color_remap[i]];
}
if (!Settings.light_fade) { // no fade
if (!Settings.light_fade || power_off) { // no fade
// record the current value for a future Fade
memcpy(Light.fade_start_8, cur_col, sizeof(Light.fade_start_8));
memcpy(Light.fade_start_10, cur_col_10bits, sizeof(Light.fade_start_10));

View File

@ -25,16 +25,8 @@ const uint32_t ZIGBEE_BUFFER_SIZE = 256; // Max ZNP frame is SOF+LEN+CMD1+CMD2+
const uint8_t ZIGBEE_SOF = 0xFE;
const uint8_t ZIGBEE_SOF_ALT = 0xFF;
//#define Z_USE_SOFTWARE_SERIAL
#ifdef Z_USE_SOFTWARE_SERIAL
#include <SoftwareSerial.h>
SoftwareSerial *ZigbeeSerial = nullptr;
#else
#include <TasmotaSerial.h>
TasmotaSerial *ZigbeeSerial = nullptr;
#endif
const char kZigbeeCommands[] PROGMEM = "|"
D_CMND_ZIGBEEZNPSEND "|" D_CMND_ZIGBEE_PERMITJOIN "|"
@ -185,9 +177,7 @@ void ZigbeeInput(void)
char hex_char[(zigbee_buffer->len() * 2) + 2];
ToHex_P((unsigned char*)zigbee_buffer->getBuffer(), zigbee_buffer->len(), hex_char, sizeof(hex_char));
#ifndef Z_USE_SOFTWARE_SERIAL
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ZIGBEE "Bytes follow_read_metric = %0d"), ZigbeeSerial->getLoopReadMetric());
#endif
// buffer received, now check integrity
if (zigbee_buffer->len() != zigbee_frame_len) {
// Len is not correct, log and reject frame
@ -224,21 +214,16 @@ void ZigbeeInit(void)
zigbee.active = false;
if ((pin[GPIO_ZIGBEE_RX] < 99) && (pin[GPIO_ZIGBEE_TX] < 99)) {
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("Zigbee: GPIOs Rx:%d Tx:%d"), pin[GPIO_ZIGBEE_RX], pin[GPIO_ZIGBEE_TX]);
#ifdef Z_USE_SOFTWARE_SERIAL
ZigbeeSerial = new SoftwareSerial();
ZigbeeSerial->begin(115200, pin[GPIO_ZIGBEE_RX], pin[GPIO_ZIGBEE_TX], SWSERIAL_8N1, false, 256); // ZNP is 115200, RTS/CTS (ignored), 8N1
ZigbeeSerial->enableIntTx(false);
zigbee_buffer = new SBuffer(ZIGBEE_BUFFER_SIZE);
#else
ZigbeeSerial = new TasmotaSerial(pin[GPIO_ZIGBEE_RX], pin[GPIO_ZIGBEE_TX], 0, 0, 256); // set a receive buffer of 256 bytes
// if seriallog_level is 0, we allow GPIO 13/15 to switch to Hardware Serial
ZigbeeSerial = new TasmotaSerial(pin[GPIO_ZIGBEE_RX], pin[GPIO_ZIGBEE_TX], seriallog_level ? 1 : 2, 0, 256); // set a receive buffer of 256 bytes
ZigbeeSerial->begin(115200);
if (ZigbeeSerial->hardwareSerial()) {
ClaimSerial();
zigbee_buffer = new PreAllocatedSBuffer(sizeof(serial_in_buffer), serial_in_buffer);
uint32_t aligned_buffer = ((uint32_t)serial_in_buffer + 3) & ~3;
zigbee_buffer = new PreAllocatedSBuffer(sizeof(serial_in_buffer) - 3, (char*) aligned_buffer);
} else {
zigbee_buffer = new SBuffer(ZIGBEE_BUFFER_SIZE);
}
#endif
zigbee.active = true;
zigbee.init_phase = true; // start the state machine
zigbee.state_machine = true; // start the state machine

View File

@ -76,10 +76,10 @@ struct SHUTTER {
uint16_t open_time[MAX_SHUTTERS]; // duration to open the shutter
uint16_t close_time[MAX_SHUTTERS]; // duration to close the shutter
uint16_t close_velocity[MAX_SHUTTERS]; // in relation to open velocity. higher value = faster
uint16_t operations[MAX_SHUTTERS];
int8_t direction[MAX_SHUTTERS]; // 1 == UP , 0 == stop; -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
uint8_t motordelay[MAX_SHUTTERS]; // initial motorstarttime in 0.05sec.
uint16_t pwm_frequency;
} Shutter;
void ShutterRtc50mS(void)
@ -237,45 +237,32 @@ void ShutterUpdatePosition(void)
{
char scommand[CMDSZ];
char stopic[TOPSZ];
char stemp2[10];
for (uint32_t i = 0; i < shutters_present; i++) {
if (Shutter.direction[i] != 0) {
//char stemp1[20];
if (pin[GPIO_PWM1]+i < 99 && Shutter.pwm_frequency != 1000) {
Shutter.pwm_frequency += 100;
Shutter.pwm_frequency = (Shutter.pwm_frequency > 1000 ? 1000 : Shutter.pwm_frequency);
analogWriteFreq(Shutter.pwm_frequency);
analogWrite(pin[GPIO_PWM1]+i, 50);
}
Shutter.real_position[i] = Shutter.start_position[i] + ( (Shutter.time[i] - Shutter.motordelay[i]) * (Shutter.direction[i] > 0 ? 100 : -Shutter.close_velocity[i]));
// avoid real position leaving the boundaries.
Shutter.real_position[i] = Shutter.real_position[i] < 0 ? 0 : (Shutter.real_position[i] > Shutter.open_max[i] ? Shutter.open_max[i] : Shutter.real_position[i]) ;
if (Shutter.real_position[i] < 0 || Shutter.real_position[i] > Shutter.open_max[i]) {
dtostrfd((float)Shutter.time[i] / 20, 1, stemp2);
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SHT: ShutterTEMP %d: Real Pos. %d, Stoppos: %ld, direction %d, rtcshutter: %s [s]"), i, Shutter.real_position[i], Settings.shutter_position[i], Shutter.direction[i], stemp2);
// Add additional runtime, if shutter did not reach the endstop for some time.
if (Shutter.target_position[i] == Shutter.real_position[i] && Shutter.target_position[i] == 0) {
// for every operation add 5x50ms = 250ms to stop position
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SHT: Adding additional runtime"));
Shutter.real_position[i] += 500 * Shutter.operations[i] ;
Shutter.operations[i] = 0;
Shutter.real_position[i] = Shutter.real_position[i] < 0 ? 0 : (Shutter.real_position[i] > Shutter.open_max[i] ? Shutter.open_max[i] : Shutter.real_position[i]) ;
}
if (Shutter.real_position[i] * Shutter.direction[i] >= Shutter.target_position[i] * Shutter.direction[i] ) {
// calculate relay number responsible for current movement.
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SHT: Stop Condition detected: real: %d, Target: %d, direction: %d"),Shutter.real_position[i], Shutter.target_position[i],Shutter.direction[i]);
uint8_t cur_relay = Settings.shutter_startrelay[i] + (Shutter.direction[i] == 1 ? 0 : 1) ;
char stemp2[10];
Settings.shutter_position[i] = ShutterRealToPercentPosition(Shutter.real_position[i], i);
//Settings.shutter_position[i] = Settings.shuttercoeff[2][i] * 5 > Shutter.real_position[i] ? (Shutter.real_position[i] * 10 / Settings.shuttercoeff[2][i] + 4)/10 : ((Shutter.real_position[i]-Settings.shuttercoeff[0,i]) *10 / Settings.shuttercoeff[1][i] +4) / 10;
if (0 < Settings.shutter_position[i] && Settings.shutter_position[i] < 100) {
Shutter.operations[i]++;
} else {
Shutter.operations[i] = 0;
}
dtostrfd((float)Shutter.time[i] / 20, 1, stemp2);
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SHT: Shutter %d: Real Pos. %d, Stoppos: %ld, relay: %d, direction %d, pulsetimer: %d, rtcshutter: %s [s], operationtime %d"), i, Shutter.real_position[i], Settings.shutter_position[i], cur_relay -1, Shutter.direction[i], Settings.pulse_timer[cur_relay -1], stemp2, Shutter.operations[i]);
Shutter.start_position[i] = Shutter.real_position[i];
// sending MQTT result to broker
snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1);
GetTopic_P(stopic, STAT, mqtt_topic, scommand);
Response_P("%d", Settings.shutter_invert[i] ? 100 - Settings.shutter_position[i]: Settings.shutter_position[i]);
MqttPublish(stopic, Settings.flag.mqtt_power_retain); // CMND_POWERRETAIN
switch (Shutter.mode) {
case SHT_PULSE_OPEN__PULSE_CLOSE:
@ -288,8 +275,21 @@ void ShutterUpdatePosition(void)
break;
case SHT_OFF_ON__OPEN_CLOSE:
// This is a failsafe configuration. Relay1 ON/OFF Relay2 -1/1 direction
if (pin[GPIO_PWM1 ]+i < 99) {
Shutter.pwm_frequency = 0;
//slow down for acurate position
analogWriteFreq(500);
analogWrite(pin[GPIO_PWM1]+i, 50);
analogWriteFreq(0);
while (RtcSettings.pulse_counter[i] < (Shutter.target_position[i]-Shutter.start_position[i])*Shutter.direction[i]/2) {
delay(1);
}
analogWrite(pin[GPIO_PWM1]+i, 0);
Shutter.real_position[i] = RtcSettings.pulse_counter[i]*Shutter.direction[i]*2+Shutter.start_position[i];
}
if ((1 << (Settings.shutter_startrelay[i]-1)) & power) {
ExecuteCommandPower(Settings.shutter_startrelay[i], 0, SRC_SHUTTER);
ExecuteCommandPower(Settings.shutter_startrelay[i]+1, 0, SRC_SHUTTER);
}
break;
case SHT_OFF_OPEN__OFF_CLOSE:
@ -300,6 +300,18 @@ void ShutterUpdatePosition(void)
}
break;
}
Settings.shutter_position[i] = ShutterRealToPercentPosition(Shutter.real_position[i], i);
dtostrfd((float)Shutter.time[i] / 20, 1, stemp2);
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SHT: Shutter %d: Real Pos. %d, Stoppos: %ld, relay: %d, direction %d, pulsetimer: %d, rtcshutter: %s [s]"), i, Shutter.real_position[i], Settings.shutter_position[i], cur_relay -1, Shutter.direction[i], Settings.pulse_timer[cur_relay -1], stemp2);
Shutter.start_position[i] = Shutter.real_position[i];
// sending MQTT result to broker
snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1);
GetTopic_P(stopic, STAT, mqtt_topic, scommand);
Response_P("%d", Settings.shutter_invert[i] ? 100 - Settings.shutter_position[i]: Settings.shutter_position[i]);
MqttPublish(stopic, Settings.flag.mqtt_power_retain); // CMND_POWERRETAIN
Shutter.direction[i] = 0;
uint8_t position = Settings.shutter_invert[i] ? 100 - Settings.shutter_position[i]: Settings.shutter_position[i];
Response_P(PSTR("{"));
@ -326,6 +338,12 @@ void ShutterStartInit(uint8_t index, uint8_t direction, int32_t target_pos)
Shutter.target_position[index] = target_pos;
Shutter.start_position[index] = Shutter.real_position[index];
Shutter.time[index] = 0;
if (pin[GPIO_PWM1]+index < 99) {
Shutter.pwm_frequency = 0;
analogWriteFreq(Shutter.pwm_frequency);
analogWrite(pin[GPIO_PWM1]+index, 0);
RtcSettings.pulse_counter[index] = 0;
}
//AddLog_P2(LOG_LEVEL_INFO, PSTR("SHT: Start shutter: %d from %d to %d in directin %d"), index, Shutter.start_position[index], Shutter.target_position[index], Shutter.direction[index]);
}
@ -426,7 +444,6 @@ void ShutterSetPosition(uint8_t device, uint8_t position)
void CmndShutterOpen(void)
{
XdrvMailbox.payload = 100;
XdrvMailbox.data_len = 3;
last_source = SRC_WEBGUI;
CmndShutterPosition();
}
@ -434,7 +451,7 @@ void CmndShutterOpen(void)
void CmndShutterClose(void)
{
XdrvMailbox.payload = 0;
XdrvMailbox.data_len = 1;
XdrvMailbox.data_len = 0;
last_source = SRC_WEBGUI;
CmndShutterPosition();
}
@ -445,7 +462,7 @@ void CmndShutterStop(void)
uint32_t index = XdrvMailbox.index -1;
if (Shutter.direction[index] != 0) {
//AddLog_P2(LOG_LEVEL_INFO, PSTR("SHT: Stop moving shutter %d: direction: %d"), XdrvMailbox.index, Shutter.direction[index]);
AddLog_P2(LOG_LEVEL_INFO, PSTR("SHT: Stop moving shutter %d: direction: %d"), XdrvMailbox.index, Shutter.direction[index]);
int32_t temp_realpos = Shutter.start_position[index] + ( (Shutter.time[index]+10) * (Shutter.direction[index] > 0 ? 100 : -Shutter.close_velocity[index]));
XdrvMailbox.payload = ShutterRealToPercentPosition(temp_realpos, index);
@ -472,7 +489,7 @@ void CmndShutterPosition(void)
if (!strcmp(XdrvMailbox.data,"STOP")) { CmndShutterStop(); }
return;
}
int8_t target_pos_percent = XdrvMailbox.payload < 0 ? 0 : (XdrvMailbox.payload > 100 ? 100 : XdrvMailbox.payload);
// webgui still send also on inverted shutter the native position.
target_pos_percent = Settings.shutter_invert[index] && SRC_WEBGUI != last_source ? 100 - target_pos_percent : target_pos_percent;
@ -497,7 +514,6 @@ void CmndShutterPosition(void)
}
if (Shutter.direction[index] != new_shutterdirection ) {
ShutterStartInit(index, new_shutterdirection, Shutter.target_position[index]);
Shutter.operations[index]++;
if (Shutter.mode == SHT_OFF_ON__OPEN_CLOSE) {
ExecuteCommandPower(Settings.shutter_startrelay[index], 0, SRC_SHUTTER);
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SHT: Delay5 5s, xdrv %d"), XdrvMailbox.payload);
@ -556,7 +572,7 @@ void CmndShutterMotorDelay(void)
ShutterInit();
}
char time_chr[10];
dtostrfd((float)(Settings.shutter_motordelay[XdrvMailbox.index -1]) / 20, 1, time_chr);
dtostrfd((float)(Settings.shutter_motordelay[XdrvMailbox.index -1]) / 20, 2, time_chr);
ResponseCmndIdxChar(time_chr);
}
}

View File

@ -47,6 +47,7 @@
#define CMND_FUNC_EVERY_100_MSECOND 0x04
#define CMND_SLAVE_SEND 0x05
#define CMND_PUBLISH_TELE 0x06
#define CMND_EXECUTE_CMND 0x07
#define PARAM_DATA_START 0xFE
#define PARAM_DATA_END 0xFF
@ -142,6 +143,7 @@ struct TSLAVE {
bool flashing = false;
bool SerialEnabled = false;
uint8_t waitstate = 0; // We use this so that features detection does not slow down other stuff on startup
bool unsupported = false;
} TSlave;
typedef union {
@ -461,9 +463,14 @@ void TasmotaSlave_Init(void)
TasmotaSlave_Serial->readBytesUntil(char(PARAM_DATA_START), buffer, sizeof(buffer));
uint8_t len = TasmotaSlave_Serial->readBytesUntil(char(PARAM_DATA_END), buffer, sizeof(buffer));
memcpy(&TSlaveSettings, &buffer, sizeof(TSlaveSettings));
if (20191101 == TSlaveSettings.features_version) {
if (20191129 == TSlaveSettings.features_version) {
TSlave.type = true;
AddLog_P2(LOG_LEVEL_INFO, PSTR("Tasmota Slave Version %u"), TSlaveSettings.features_version);
} else {
if ((!TSlave.unsupported) && (TSlaveSettings.features_version > 0)) {
AddLog_P2(LOG_LEVEL_INFO, PSTR("Tasmota Slave Version %u not supported!"), TSlaveSettings.features_version);
TSlave.unsupported = true;
}
}
}
}
@ -506,8 +513,9 @@ void (* const TasmotaSlaveCommand[])(void) PROGMEM = {
void CmndTasmotaSlaveReset(void)
{
TasmotaSlave_Reset();
TSlave.type = false; // Force redetection
TSlave.waitstate = 7; // give it at least 3 seconds to restart from bootloader
TSlave.type = false; // Force redetection
TSlave.waitstate = 7; // give it at least 3 seconds to restart from bootloader
TSlave.unsupported = false; // Reset unsupported flag
ResponseCmndDone();
}
@ -536,21 +544,25 @@ void TasmotaSlave_ProcessIn(void)
}
TasmotaSlave_Serial->read(); // read trailing byte of command
memcpy(&TSlaveCommand, &buffer, sizeof(TSlaveCommand));
char inbuf[TSlaveCommand.parameter+1];
TasmotaSlave_waitForSerialData(TSlaveCommand.parameter, 50);
TasmotaSlave_Serial->read(); // Read leading byte
for (uint8_t idx = 0; idx < TSlaveCommand.parameter; idx++) {
inbuf[idx] = TasmotaSlave_Serial->read();
}
TasmotaSlave_Serial->read(); // Read trailing byte
inbuf[TSlaveCommand.parameter] = '\0';
if (CMND_PUBLISH_TELE == TSlaveCommand.command) { // We need to publish stat/ with incoming stream as content
char inbuf[sizeof(TSlaveCommand.parameter)+1];
TasmotaSlave_waitForSerialData(TSlaveCommand.parameter, 50);
TasmotaSlave_Serial->read(); // Read leading byte
for (uint8_t idx = 0; idx < TSlaveCommand.parameter; idx++) {
inbuf[idx] = TasmotaSlave_Serial->read();
}
TasmotaSlave_Serial->read(); // Read trailing byte
inbuf[TSlaveCommand.parameter] = '\0';
Response_P(PSTR("{\"TasmotaSlave\":"));
ResponseAppend_P("%s", inbuf);
ResponseJsonEnd();
MqttPublishPrefixTopic_P(RESULT_OR_TELE, mqtt_data);
XdrvRulesProcess();
}
if (CMND_EXECUTE_CMND == TSlaveCommand.command) { // We need to execute the incoming command
ExecuteCommand(inbuf, SRC_IGNORE);
}
break;
default:
break;

View File

@ -1,407 +1,3 @@
# decode-config.py
_decode-config.py_ is able to backup and restore Tasmota configuration.
A tool to backup and restore the configuration of [Tasmota](http://tasmota.com/)-devices.
In comparison with the Tasmota build-in "Backup/Restore Configuration" function _decode-config.py_
* uses human readable and editable [JSON](http://www.json.org/)-format for backup/restore,
* can restore previously backup and changed [JSON](http://www.json.org/)-format files,
* is able to create Tasmota compatible command list with related config parameter
Comparing backup files created by *decode-config.py* and *.dmp files created by Tasmota "Backup/Restore Configuration":
| &nbsp; | decode-config.py<br />*.json file | Tasmota<br />*.dmp file |
|-------------------------|:-------------------------------:|:-----------------------------------:|
| Encrypted | No | Yes |
| Readable | Yes | No |
| Simply editable | Yes | No |
| Simply batch processing | Yes | No |
_decode-config.py_ is compatible with Tasmota version from v5.10.0 up to now.
# Content
* [Prerequisite](decode-config.md#prerequisite)
* [File Types](decode-config.md#file-types)
* [.dmp File Format](decode-config.md#-dmp-format)
* [.json File Format](decode-config.md#-json-format)
* [.bin File Format](decode-config.md#-bin-format)
* [File extensions](decode-config.md#file-extensions)
* [Usage](decode-config.md#usage)
* [Basics](decode-config.md#basics)
* [Save backup file](decode-config.md#save-backup-file)
* [Restore backup file](decode-config.md#restore-backup-file)
* [Output to screen](decode-config.md#output-to-screen)
* [JSON output](decode-config.md#json-output)
* [Tasmota command output](decode-config.md#tasmota-command-output)
* [Filter data](decode-config.md#filter-data)
* [Configuration file](decode-config.md#configuration-file)
* [More program arguments](decode-config.md#more-program-arguments)
* [Examples](decode-config.md#examples)
* [Config file](decode-config.md#config-file)
* [Using Tasmota binary configuration files](decode-config.md#using-tasmota-binary-configuration-files)
* [Use batch processing](decode-config.md#use-batch-processing)
* [Notes](decode-config.md#notes)
## Prerequisite
* This program is written in [Python](https://en.wikipedia.org/wiki/Python_(programming_language)) so you need to install a working python environment for your operating system.
### Linux
```
sudo apt-get install python python-pip libcurl4-openssl-dev libssl-dev
```
```
pip install pycurl configargparse
```
### Windows 10
Install [Python 2.7](https://www.python.org/download/releases/2.7/) then install dependencies. For PyCurl you need to [download pycurl7.43.0.3cp27cp27mwin_amd64.whl](https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl) for Windows 10 64bit.
```
pip install pycurl-7.43.0.3-cp27-cp27m-win_amd64.whl
// run the command from the folder where you downloaded the file
pip install configargparse
```
* [Tasmota](https://github.com/arendst/Tasmota) [Firmware](https://github.com/arendst/Tasmota/releases) with Web-Server enabled:
* To backup or restore configurations from or to a Tasmota device you need a firmare with enabled web-server in admin mode (command [WebServer 2](https://tasmota.github.io/docs/#/Commands#wifi)). This is the Tasmota default.
* If using your own compiled firmware be aware to enable the web-server (`#define USE_WEBSERVER` and `#define WEB_SERVER 2`).
## File Types
_decode-config.py_ can handle the following backup file types:
### .dmp Format
Configuration data as used by Tasmota "Backup/Restore Configuration" web interface.
This format is binary and encrypted.
### .json Format
Configuration data in [JSON](http://www.json.org/)-format.
This format is decrypted, human readable and editable and can also be used for the `--restore-file` parameter.
This file will be created by _decode-config.py_ using the `--backup-file` with `--backup-type json` parameter, this is the default.
### .bin Format
Configuration data in binary format.
This format is binary decryptet, editable (e.g. using a hex editor) and can also be used for `--restore-file` command.
It will be created by _decode-config.py_ using `--backup-file` with `--backup-type bin`.
Note:
The .bin file contains the same information as the original .dmp file from Tasmota "Backup/Restore Configuration" but it is decrpted and 4 byte longer than an original (it is a prefix header at the beginning). .bin file data starting at address 4 contains the same as the **struct SYSCFG** from Tasmota [settings.h](https://github.com/arendst/Tasmota/blob/master/tasmota/settings.h) in decrypted format.
#### File extensions
You don't need to append exensions for your file name as _decode-config.py_ uses auto extension as default. The extension will be choose based on file contents and `--backup-type` parameter.
If you do not want using auto extensions use the `--no-extension` parameter.
## Usage
After download don't forget to set the executable flag under linux with `chmod +x decode-config.py` or call the program using `python decode-config.py...`.
### Basics
At least pass a source where you want to read the configuration data from using `-f <filename>` or `-d <host>`:
The source can be either
* a Tasmota device hostname or IP using the `-d <host>` parameter
* a Tasmota `*.dmp` configuration file using `-f <filename>` parameter
Example:
decode-config.py -d tasmota-4281
will output a human readable configuration in [JSON](http://www.json.org/)-format:
{
"altitude": 112,
"baudrate": 115200,
"blinkcount": 10,
"blinktime": 10,
...
"ws_width": [
1,
3,
5
]
}
### Save backup file
To save the output as backup file use `--backup-file <filename>`, you can use placeholder for Version, Friendlyname and Hostname:
decode-config.py -d tasmota-4281 --backup-file Config_@f_@v
If you have setup a WebPassword within Tasmota, use
decode-config.py -d tasmota-4281 -p <yourpassword> --backup-file Config_@f_@v
will create a file like `Config_Tasmota_6.4.0.json` (the part `Tasmota` and `6.4.0` will choosen related to your device configuration). Because the default backup file format is JSON, you can read and change it with any raw text editor.
### Restore backup file
Reading back a saved (and possible changed) backup file use the `--restore-file <filename>` parameter. This will read the (changed) configuration data from this file and send it back to the source device or filename.
To restore the previously save backup file `Config_Tasmota_6.2.1.json` to device `tasmota-4281` use:
decode-config.py -d tasmota-4281 --restore-file Config_Tasmota_6.2.1.json
with password set by WebPassword:
decode-config.py -d tasmota-4281 -p <yourpassword> --restore-file Config_Tasmota_6.2.1.json
### Output to screen
To force screen output use the `--output` parameter.
Output to screen is default enabled when calling the program with a source parameter (-f or -d) but without any backup or restore parameter.
#### JSON output
The default output format is [JSON](decode-config.md#-json-format). You can force JSON output using the `--output-format json` parameter.
Example:
decode-config.py -d tasmota-4281 -c my.conf -x Wifi --output-format json
{
...
"hostname": "%s-%04d",
"ip_address": [
"0.0.0.0",
"192.168.12.1",
"255.255.255.0",
"192.168.12.1"
],
"ntp_server": [
"ntp.localnet.home",
"ntp2.localnet.home",
"192.168.12.1"
],
"sta_active": 0,
"sta_config": 5,
"sta_pwd": [
"myWlAnPaszxwo!z",
"myWlAnPaszxwo!z2"
],
"sta_ssid": [
"wlan.1",
"my-wlan"
],
"web_password": "myPaszxwo!z",
"webserver": 2
...
}
Note: JSON output always contains all configuration data like the backup file except you are using `--group` arg.
#### Tasmota command output
_decode-config.py_ is able to translate the configuration data to (most all) Tasmota commands. To output your configuration as Tasmota commands use `--output-format cmnd` or `--output-format command`.
Example:
decode-config.py -d tasmota-4281 -c my.conf -g Wifi --output-format cmnd
# Wifi:
AP 0
Hostname %s-%04d
IPAddress1 0.0.0.0
IPAddress2 192.168.12.1
IPAddress3 255.255.255.0
IPAddress4 192.168.12.1
NtpServer1 ntp.localnet.home
NtpServer2 ntp2.localnet.home
NtpServer3 192.168.12.1
Password1 myWlAnPaszxwo!z
Password2 myWlAnPaszxwo!z2
SSId1 wlan.1
SSId2 wlan.1
WebPassword myPaszxwo!z
WebServer 2
WifiConfig 5
Note: A few very specific module commands like MPC230xx, KNX and some Display commands are not supported. These are still available by JSON output.
### Filter data
The huge number of Tasmota configuration data can be overstrained and confusing, so the most of the configuration data are grouped into categories.
With _decode-config.py_ the following categories are available: `Display`, `Domoticz`, `Internal`, `KNX`, `Led`, `Logging`, `MCP230xx`, `MQTT`, `Main`, `Management`, `Pow`, `Sensor`, `Serial`, `SetOption`, `RF`, `System`, `Timers`, `Wifi`
These are similary to the categories on [https://tasmota.github.io/docs/#/Commands](Tasmota Command Wiki).
To filter outputs to a subset of groups use the `-g` or `--group` arg concatenating the grooup you want, e. g.
decode-config.py -d tasmota-4281 -c my.conf --output-format cmnd --group Main MQTT Management Wifi
### Configuration file
Each argument that start with `--` (eg. `--file`) can also be set in a config file (specified via -c). Config file syntax allows: key=value, flag=true, stuff=[a,b,c] (for details, see syntax at [https://pypi.org/project/ConfigArgParse](https://pypi.org/project/ConfigArgParse/)).
If an argument is specified in more than one place, then commandline values override config file values which override defaults. This is usefull if you always use the same argument or a basic set of arguments.
The http authentication credentials `--username` and `--password` is predestinated to store it in a file instead using it on your command line as argument:
e.g. my.conf:
[source]
username = admin
password = myPaszxwo!z
To make a backup file from example above you can now pass the config file instead using the password on command line:
decode-config.py -d tasmota-4281 -c my.conf --backup-file Config_@f_@v
### More program arguments
For better reading each short written arg (minus sign `-`) has a corresponding long version (two minus signs `--`), eg. `--device` for `-d` or `--file` for `-f` (note: not even all `--` arg has a corresponding `-` one).
A short list of possible program args is displayed using `-h` or `--help`.
For advanced help use `-H` or `--full-help`:
usage: decode-config.py [-f <filename>] [-d <host>] [-P <port>]
[-u <username>] [-p <password>] [-i <filename>]
[-o <filename>] [-t json|bin|dmp] [-E] [-e] [-F]
[--json-indent <indent>] [--json-compact]
[--json-hide-pw] [--json-show-pw]
[--cmnd-indent <indent>] [--cmnd-groups]
[--cmnd-nogroups] [--cmnd-sort] [--cmnd-unsort]
[-c <filename>] [-S] [-T json|cmnd|command]
[-g {Control,Devices,Display,Domoticz,Internal,Knx,Light,Management,Mqtt,Power,Rf,Rules,Sensor,Serial,Setoption,Shutter,System,Timer,Wifi} [{Control,Devices,Display,Domoticz,Internal,Knx,Light,Management,Mqtt,Power,Rf,Rules,Sensor,Serial,Setoption,Shutter,System,Timer,Wifi} ...]]
[--ignore-warnings] [-h] [-H] [-v] [-V]
Backup/Restore Tasmota configuration data. Args that start with '--'
(eg. -f) can also be set in a config file (specified via -c). Config file
syntax allows: key=value, flag=true, stuff=[a,b,c] (for details, see syntax at
https://goo.gl/R74nmi). If an arg is specified in more than one place, then
commandline values override config file values which override defaults.
Source:
Read/Write Tasmota configuration from/to
-f, --file, --tasmota-file <filename>
file to retrieve/write Tasmota configuration from/to
(default: None)'
-d, --device, --host <host>
hostname or IP address to retrieve/send Tasmota
configuration from/to (default: None)
-P, --port <port> TCP/IP port number to use for the host connection
(default: 80)
-u, --username <username>
host HTTP access username (default: admin)
-p, --password <password>
host HTTP access password (default: None)
Backup/Restore:
Backup & restore specification
-i, --restore-file <filename>
file to restore configuration from (default: None).
Replacements: @v=firmware version from config,
@f=device friendly name from config, @h=device
hostname from config, @H=device hostname from device
(-d arg only)
-o, --backup-file <filename>
file to backup configuration to (default: None).
Replacements: @v=firmware version from config,
@f=device friendly name from config, @h=device
hostname from config, @H=device hostname from device
(-d arg only)
-t, --backup-type json|bin|dmp
backup filetype (default: 'json')
-E, --extension append filetype extension for -i and -o filename
(default)
-e, --no-extension do not append filetype extension, use -i and -o
filename as passed
-F, --force-restore force restore even configuration is identical
JSON output:
JSON format specification
--json-indent <indent>
pretty-printed JSON output using indent level
(default: 'None'). -1 disables indent.
--json-compact compact JSON output by eliminate whitespace
--json-hide-pw hide passwords
--json-show-pw, --json-unhide-pw
unhide passwords (default)
Tasmota command output:
Tasmota command output format specification
--cmnd-indent <indent>
Tasmota command grouping indent level (default: '2').
0 disables indent
--cmnd-groups group Tasmota commands (default)
--cmnd-nogroups leave Tasmota commands ungrouped
--cmnd-sort sort Tasmota commands (default)
--cmnd-unsort leave Tasmota commands unsorted
Common:
Optional arguments
-c, --config <filename>
program config file - can be used to set default
command args (default: None)
-S, --output display output regardsless of backup/restore usage
(default do not output on backup or restore usage)
-T, --output-format json|cmnd|command
display output format (default: 'json')
-g, --group {Control,Devices,Display,Domoticz,Internal,Knx,Light,Management,Mqtt,Power,Rf,Rules,Sensor,Serial,Setoption,Shutter,System,Timer,Wifi}
limit data processing to command groups (default no
filter)
--ignore-warnings do not exit on warnings. Not recommended, used by your
own responsibility!
Info:
Extra information
-h, --help show usage help message and exit
-H, --full-help show full help message and exit
-v, --verbose produce more output about what the program does
-V, --version show program's version number and exit
Either argument -d <host> or -f <filename> must be given.
### Program parameter notes
_decode-config.py_
### Examples
The most of the examples are for linux command line. Under Windows call the program using `python decode-config.py ...`.
#### Config file
Note: The example contains .ini style sections `[...]`. Sections are always treated as comment and serves as clarity only.
For further details of config file syntax see [https://pypi.org/project/ConfigArgParse](https://pypi.org/project/ConfigArgParse/).
*my.conf*
[Source]
username = admin
password = myPaszxwo!z
[JSON]
json-indent 2
#### Using Tasmota binary configuration files
1. Restore a Tasmota configuration file
`decode-config.py -c my.conf -d tasmota --restore-file Config_Tasmota_6.2.1.dmp`
2. Backup device using Tasmota configuration compatible format
a) use file extension to choice the file format
`decode-config.py -c my.conf -d tasmota --backup-file Config_@f_@v.dmp`
b) use args to choice the file format
`decode-config.py -c my.conf -d tasmota --backup-type dmp --backup-file Config_@f_@v`
#### Use batch processing
for device in tasmota1 tasmota2 tasmota3; do ./decode-config.py -c my.conf -d $device -o Config_@f_@v
or under windows
for device in (tasmota1 tasmota2 tasmota3) do python decode-config.py -c my.conf -d %device -o Config_@f_@v
will produce JSON configuration files for host tasmota1, tasmota2 and tasmota3 using friendly name and Tasmota firmware version for backup filenames.
## Notes
Some general notes:
* Filename replacement macros **@h** and **@H**:
* **@h**
The **@h** replacement macro uses the hostname configured with the Tasomta Wifi `Hostname <host>` command (defaults to `%s-%04d`). It will not use the network hostname of your device because this is not available when working with files only (e.g. `--file <filename>` as source).
To prevent having a useless % in your filename, **@h** will not replaced by configuration data hostname if this contains '%' characters.
* **@H**
If you want to use the network hostname within your filename, use the **@H** replacement macro instead - but be aware this will only replaced if you are using a network device as source (`-d`, `--device`, `--host`); it will not work when using a file as source (`-f`, `--file`)
## decode-config has moved to [https://github.com/tasmota/decode-config](https://github.com/tasmota/decode-config)

File diff suppressed because it is too large Load Diff

View File

@ -129,7 +129,8 @@ a_setoption = [[
"Enable HTTP CORS",
"Enable internal pullup for single DS18x20 sensor",
"GroupTopic replaces %topic% (0) or fixed topic cmnd/grouptopic (1)",
"","",
"Enable incrementing bootcount when deepsleep is enabled",
"Do not power off if slider moved to far left",
"","",
"Enable shutter support",
"Invert PCF8574 ports"

View File

@ -1,491 +0,0 @@
: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
:1003C000017A00798B901A0EE493FC740193FD90EE
:1003D0001A10E493F52E1217028E2FF530901A138F
:1003E000E493F5311217028E32F533901A16E49326
:1003F000F5341217028E35F536901A19E493F53755
: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
:1009A0000528E528B40FEFC2902290008AE0147069
:1009B00003020A6F046003020B4C7866E6C4540F0E
:1009C000F97065D3E5279494E52694115003020B42
:1009D0004C300003020B4CE9120C32E6540FFC08B9
:1009E000E6FDEC4E18F6ED08F618120C29EC540F43
:1009F0004E18F6ED08F6900001E526F0A3E527F085
:100A0000AE26FF7C007D1F1207B290008BEEF0A394
:100A1000EFF07C007D031207A0A3EEF0A3EFF0A39C
:100A2000E526F0A3E527F0227866E6C4540F6402B9
:100A30006003020B4C120CEB752C01752D00752E0A
:100A40008B901BD793FE7401938E2FF530901BD99A
:100A5000E493F531A3120BBB8E32F533901BDCE42B
:100A600093F534901BE0E493F535E4FF020587E449
:100A7000F528120BA8120D0CFFE528120C54F9EF03
:100A8000C399506EE528120C16F5828C832FF582DF
:100A9000E43583F583E493FF120C90300001B350EA
:100AA00003020B40E528C454F024D1F582E4341B42
:100AB000120C20F5828C83EF540775F00212092383
:100AC000120C22FDAF27AE261214CBE528501925B3
:100AD000E025E02466F8120C29EC540F4EFEEDFFE1
:100AE000120BA8120C9A8058120B922469F8E4F6A3
:100AF000804E120BA8120D0C697045120CEBE52804
:100B0000120BAFAA06752CFF8A2DF52EE528120CC4
:100B1000F6120BB98E2FF530E528120C63F531E58E
:100B200028120D01120BB98E32F533E528120C7222
:100B3000F534E528120C81F535AF28120587400CF5
:100B40000528E528C3940F5003020A7222C290E5DB
:100B50002925E025E02466F8E4F608F6E52925E0F5
:100B600025E02468F8E4F6E52925E025E022F58370
:100B7000E493FF5408FE131313541F24FF9202AB97
:100B800029AA2AA92BEF540775F002A4F58285F053
:100B9000832225E025E02466F8E4F608F6E528251A
:100BA000E025E02468F8E4F6E52825E025E022C405
:100BB00054F024D1F582E4341BF583E493FE7401F0
:100BC00093222466F8E6FC08E6FDECC4F854F0C86D
:100BD000EDC4540F48540F222468F8E6141313137D
:100BE000541F2403F582E43400F58322E529252BE4
:100BF000F582E43528F583E022A200E433C43333E0
:100C00003354804526FFE527900074CFF0A3EFF022
:100C1000E490007BF022C454F024D4F582E4341B29
:100C2000F583E493FC74019322E6FC08E6FDECC432
:100C3000540F2401FFEFC454F0FE22E52E25E024DA
:100C40008BF582E43400F58322900085E0FF90006C
:100C50007AE06F22C454F024D6F582E4341BF58385
:100C6000E49322C454F024D9F582E4341BF583E4E0
:100C70009322C454F024DCF582E4341BF583E4931E
:100C800022C454F024E0F582E4341BF583E493227B
:100C90005408131313541F24FF222466F8A60608D1
:100CA000A607222530F582E4352FF583E49322242C
:100CB00066F8E6FC08E6FDEC540F222466F9E7C46A
:100CC000F854F0C809E7222533F582E43532F5837C
:100CD000E4932290007AE0900085F053DAFE22251A
:100CE000E0247DF582E43400F58322A200920185A0
:100CF000262A85272B22C454F024D7F582E4341BFE
:100D000022C454F024DAF582E4341B222466F8E687
: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
:1010E000FD7581A1021122020076E493A3F8E49336
: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
:1013900072F534EFC454F024DDF582E4341B120BF3
:1013A000B98E35F536EFC454F024DFF582E4341BF2
: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
:1015700024A6F582E4341DF583E493FFECC39F5069
:101580000774082CFC0B80F4EB04FF12180CE4FC2D
:10159000ECC39B500974032C1217190C80F27F5571
:1015A0001218110219258F26900079E0F5277E0088
:1015B0007F3C7D007B007A0079661209557F0B1213
: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
:1019400000019004B00BB81C520A03080109000101
:10195000C20384286E020800090108014A02762A9F
:101960004E020800090108028A1E82071C0F8C081B
:101970000108020803016802D012C005DC0A03084E
:10198000010900024E05DC01AE348A0A0308010990
:1019900000012C0A00008C047E27F60801080308C9
:1019A0000208020803080401040A9A051428A00882
:1019B000010800080208020800080301720438192F
:1019C00082020801080009029407D00FA02328080A
:1019D00003080108020801061802D000D208010A13
:1019E0000109020A0101D603FC0BFE0208010800EE
:1019F00009019002D0132E010A00090108023007E4
:101A0000760F322274030801080208193503193BC6
:101A100002193D02193F020000001819410419493A
:101A200002194B02194D0200000018194F031955F5
:101A30000219570219590200000018195B031961B5
:101A4000021963021965020000000C196704196F7E
:101A50000219710219730200000028197504197D1A
:101A600002197F0219810200000028198304198BD2
:101A700002198D02198F0200000018199105199B97
:101A800002199D0419A10419A5022019A70419AF70
:101A90000219B10419B50419B9022019BB0319C1FF
:101AA0000219C30219C5020000001119C70419CF99
:101AB0000219D10219D30219D5022419D70319DD4D
:101AC0000219DF0219E10219E3022819E50319EBF3
:101AD0000219ED0219EF020000001419F10319F7C1
:101AE0000219F90219FB020000002719FD041A056A
:101AF000021A07021A090200000024015E041A2AD1
:101B000062080208010900019004B00BB81C520AD7
:101B1000030801090001C20384286E0208000901BC
:101B200008014A02762A4E020800090108028A1EAC
:101B300082071C0F8C080108020803016802D012FA
:101B4000C005DC0A0308010900024E05DC01AE34C1
:101B50008A0A0308010900012C0A00008C047E2770
:101B6000F608010803080208020803080401040A31
:101B70009A051428A00801080008020802080008B5
:101B8000030172043819820208010800090294074F
:101B9000D00FA02328080308010802080106180234
:101BA000D000D208010A0109020A0101D603FC0B88
:101BB000FE020801080009019002D0132E010A005C
:101BC000090108023007760F322274030801080267
:101BD000081AFB031B01021B03021B050200000085
:101BE000181B07041B0F021B11021B13020000002D
:101BF000181B15031B1B021B1D021B1F02000000EC
:101C0000181B21031B27021B29021B2B02000000AB
:101C10000C1B2D041B35021B37021B390200000070
:101C2000281B3B041B43021B45021B47020000000C
:101C3000281B49041B51021B53021B5502000000C4
:101C4000181B57051B61021B63041B67041B6B02F7
:101C5000201B6D041B75021B77041B7B041B7F027A
:101C6000201B81031B87021B89021B8B02000000C3
:101C7000111B8D041B95021B97021B99021B9B02D3
:101C8000241B9D031BA3021BA5021BA7021BA90269
:101C9000281BAB031BB1021BB3021BB502000000E3
:101CA000141BB7031BBD021BBF021BC102000000B7
:101CB000271BC3041BCB021BCD021BCF020000005D
:101CC00024015E041A2A6208020801090001900436
:101CD000B00BB81C520A030801090001C203842892
:101CE0006E020800090108014A02762A4E02080025
:101CF000090108028A1E82071C0F8C0801080208CD
:101D000003016802D012C005DC0A030801090002C1
:101D10004E05DC01AE348A0A0308010900012C0AD1
:101D200000008C047E27F608010803080208020858
:101D300003080401040A9A051428A00801080008F1
:101D4000020802080008030172043819820208011F
:101D5000080009029407D00FA023280803080108EF
:101D6000020801061802D000D208010A0109020A7D
:101D70000101D603FC0BFE020801080009019002D4
:101D8000D0132E010A00090108023007760F322213
:101D9000740308010802081CC1031CC7021CC90205
:101DA0001CCB02000000181CCD041CD5021CD7025D
:101DB0001CD902000000181CDB031CE1021CE3021A
:101DC0001CE502000000181CE7031CED021CEF02DA
:101DD0001CF1020000000C1CF3041CFB021CFD02A1
:101DE0001CFF02000000281D01041D09021D0B023A
:101DF0001D0D02000000281D0F041D17021D1902F1
:101E00001D1B02000000181D1D051D27021D2904B1
:101E10001D2D041D3102201D33041D3B021D3D04F8
:101E20001D41041D4502201D47031D4D021D4F028B
:101E30001D5102000000111D53041D5B021D5D02B7
:101E40001D5F021D6102241D63031D69021D6B02DB
:101E50001D6D021D6F02281D71031D77021D790281
:101E60001D7B02000000141D7D031D83021D8502E1
:101E70001D8702000000271D89041D91021D930289
:071E80001D95020000002483
:00000001FF