diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index 0d3d5f7f5..373d518cb 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -6,14 +6,14 @@ 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/Sonoff-Tasmota/wiki/FAQ) and troubleshooting wiki articles +> - 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. @@ -26,9 +26,9 @@ _Make sure your have performed every step and checked the applicable boxes befor **FAILURE TO COMPLETE THE REQUESTED INFORMATION WILL RESULT IN YOUR ISSUE BEING CLOSED** -- [ ] Read the [Contributing Guide and Policy](https://github.com/arendst/Sonoff-Tasmota/blob/development/CONTRIBUTING.md) and [the Code of Conduct](https://github.com/arendst/Sonoff-Tasmota/blob/development/CODE_OF_CONDUCT.md) -- [ ] Searched the problem in [issues](https://github.com/arendst/Sonoff-Tasmota/issues) -- [ ] Searched the problem in the [wiki](https://github.com/arendst/Sonoff-Tasmota/wiki/Troubleshooting) +- [ ] 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): _____ @@ -40,27 +40,27 @@ _Make sure your have performed every step and checked the applicable boxes befor - [ ] Provide the output of 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: - - + + ``` ### TO REPRODUCE diff --git a/.github/ISSUE_TEMPLATE/Custom.md b/.github/ISSUE_TEMPLATE/Custom.md index f0d6fafe0..3b30c5f18 100644 --- a/.github/ISSUE_TEMPLATE/Custom.md +++ b/.github/ISSUE_TEMPLATE/Custom.md @@ -3,33 +3,33 @@ name: Troubleshooting about: Users Troubleshooting Help --- -> **GUIDE** +> **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: +> +> 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 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/Sonoff-Tasmota/wiki/FAQ) and troubleshooting wiki articles +> - 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/Sonoff-Tasmota/blob/development/CONTRIBUTING.md) and [the Code of Conduct](https://github.com/arendst/Sonoff-Tasmota/blob/development/CODE_OF_CONDUCT.md) -- [ ] Searched the problem in issues (https://github.com/arendst/Sonoff-Tasmota/issues) -- [ ] Searched the problem in the wiki (https://github.com/arendst/Sonoff-Tasmota/wiki/Troubleshooting) +- [ ] 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): _____ @@ -41,27 +41,27 @@ _Make sure these boxes are checked before submitting your issue. Thank you_ - [ ] 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)** diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 53b64f906..1dfaa83e5 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,6 @@ ## Description: -**Related issue (if applicable):** fixes # +**Related issue (if applicable):** fixes # ## Checklist: - [ ] The pull request is done against the latest dev branch @@ -8,4 +8,4 @@ - [ ] Only one feature/fix was added per PR. - [ ] The code change is tested and works on core pre-2.6 - [ ] The code change pass travis tests. **Your PR cannot be merged unless tests pass** - - [ ] I accept the [CLA](https://github.com/arendst/Sonoff-Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). + - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). diff --git a/.gitignore b/.gitignore index acdd5c610..ebf64d03f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ .clang_complete .gcc-flags.json .cache -sonoff/user_config_override.h +tasmota/user_config_override.h build firmware.map firmware.asm diff --git a/API.md b/API.md index dc3a7f6e3..ef74a1af6 100644 --- a/API.md +++ b/API.md @@ -2,7 +2,7 @@ # Basic API information -Sonoff-Tasmota can easily be extended by developers using provided function pointers as callback Ids. This document lists the available callback function Ids. See the wiki (https://github.com/arendst/Sonoff-Tasmota/wiki/Sensor-API) for more information. +Tasmota can easily be extended by developers using provided function pointers as callback Ids. This document lists the available callback function Ids. See the wiki (https://github.com/arendst/Tasmota/wiki/Sensor-API) for more information. Callback availability can be checked by searching for either XdrvCall, XsnsCall, XdspCall and XnrgCall. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 96e1c3173..1bda5243a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,11 +4,11 @@ **Any contribution helps our team and makes Tasmota better for the entire community!** -Everybody is welcome and invited to contribute to Sonoff-Tasmota Project by: +Everybody is welcome and invited to contribute to Tasmota Project by: * Testing newly released features and reporting issues. * Providing Pull Requests (Features, Proof of Concepts, Language files or Fixes) -* Contributing missing documentation for features and devices on our [Wiki](https://github.com/arendst/Sonoff-Tasmota/wiki/Contributing) +* Contributing missing documentation for features and devices on our [Wiki](https://github.com/arendst/Tasmota/wiki/Contributing) This document describes rules that are in effect for this repository, meant for handling issues by contributors in the issue tracker and PRs. @@ -44,10 +44,10 @@ A Pull Request (PR) is the process where code modifications are managed in GitHu The process is straight-forward. - Read [How to get faster PR reviews](https://github.com/kubernetes/community/blob/master/contributors/guide/pull-requests.md#best-practices-for-faster-reviews) by Kubernetes (but skip step 0) - - Fork the Sonoff-Tasmota Repository [git repository](https://github.com/arendst/Sonoff-Tasmota). + - Fork the Tasmota Repository [git repository](https://github.com/arendst/Tasmota). - Write/Change the code in your Fork for a new feature, bug fix, new sensor, optimization, etc. - Ensure tests work. - - Create a Pull Request against the [**dev**](https://github.com/arendst/Sonoff-Tasmota/tree/dev) branch of Sonoff-Tasmota. + - Create a Pull Request against the [**dev**](https://github.com/arendst/Tasmota/tree/dev) branch of Tasmota. 1. All pull requests must be done against the dev branch. 2. Only relevant files should be touched (Also beware if your editor has auto-formatting feature enabled). diff --git a/Doxyfile b/Doxyfile index 2df4d1c2c..0d2d7031d 100644 --- a/Doxyfile +++ b/Doxyfile @@ -32,13 +32,13 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = Sonoff-Tasmota +PROJECT_NAME = Tasmota # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = +PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -51,7 +51,7 @@ PROJECT_BRIEF = "Provide ESP8266 based itead Sonoff with Web, MQTT and # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = +PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is @@ -162,7 +162,7 @@ FULL_PATH_NAMES = NO # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. -STRIP_FROM_PATH = +STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which @@ -171,7 +171,7 @@ STRIP_FROM_PATH = # specify the list of include paths that are normally passed to the compiler # using the -I flag. -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't @@ -250,7 +250,7 @@ ALIASES = "abstract=" \ # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. -TCL_SUBST = +TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For @@ -654,7 +654,7 @@ GENERATE_DEPRECATEDLIST= YES # sections, marked by \if ... \endif and \cond # ... \endcond blocks. -ENABLED_SECTIONS = +ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the @@ -696,7 +696,7 @@ SHOW_NAMESPACES = YES # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated @@ -709,7 +709,7 @@ FILE_VERSION_FILTER = # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. -LAYOUT_FILE = +LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib @@ -719,7 +719,7 @@ LAYOUT_FILE = # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. -CITE_BIB_FILES = +CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages @@ -784,7 +784,7 @@ WARN_FORMAT = "$file:$line: $text" # messages should be written. If left blank the output is written to standard # error (stderr). -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files @@ -881,7 +881,7 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -908,13 +908,13 @@ EXCLUDE_PATTERNS = */.git* # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* -EXCLUDE_SYMBOLS = +EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = +EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and @@ -934,7 +934,7 @@ EXAMPLE_RECURSIVE = NO # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = +IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -955,7 +955,7 @@ IMAGE_PATH = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -INPUT_FILTER = +INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the @@ -968,7 +968,7 @@ INPUT_FILTER = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -FILTER_PATTERNS = +FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for @@ -983,14 +983,14 @@ FILTER_SOURCE_FILES = NO # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. -FILTER_SOURCE_PATTERNS = +FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = +USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing @@ -1102,7 +1102,7 @@ COLS_IN_ALPHA_INDEX = 5 # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output @@ -1146,7 +1146,7 @@ HTML_FILE_EXTENSION = .xhtml # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_HEADER = +HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard @@ -1156,7 +1156,7 @@ HTML_HEADER = # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FOOTER = +HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of @@ -1168,7 +1168,7 @@ HTML_FOOTER = # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_STYLESHEET = +HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets @@ -1181,7 +1181,7 @@ HTML_STYLESHEET = # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1191,7 +1191,7 @@ HTML_EXTRA_STYLESHEET = # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to @@ -1331,7 +1331,7 @@ GENERATE_HTMLHELP = NO # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_FILE = +CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, @@ -1339,7 +1339,7 @@ CHM_FILE = # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -HHC_LOCATION = +HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the master .chm file (NO). @@ -1352,7 +1352,7 @@ GENERATE_CHI = NO # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_INDEX_ENCODING = +CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it @@ -1383,7 +1383,7 @@ GENERATE_QHP = NO # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. -QCH_FILE = +QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace @@ -1406,28 +1406,28 @@ QHP_VIRTUAL_FOLDER = doc # Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_ATTRS = +QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_SECT_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. -QHG_LOCATION = +QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To @@ -1560,7 +1560,7 @@ MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/ # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_EXTENSIONS = +MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site @@ -1568,7 +1568,7 @@ MATHJAX_EXTENSIONS = # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_CODEFILE = +MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and @@ -1628,7 +1628,7 @@ EXTERNAL_SEARCH = NO # Searching" for details. # This tag requires that the tag SEARCHENGINE is set to YES. -SEARCHENGINE_URL = +SEARCHENGINE_URL = # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed # search data is written to a file for indexing by an external tool. With the @@ -1644,7 +1644,7 @@ SEARCHDATA_FILE = searchdata.xml # projects and redirect the results back to the right project. # This tag requires that the tag SEARCHENGINE is set to YES. -EXTERNAL_SEARCH_ID = +EXTERNAL_SEARCH_ID = # The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen # projects other than the one defined by this configuration file, but that are @@ -1654,7 +1654,7 @@ EXTERNAL_SEARCH_ID = # EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... # This tag requires that the tag SEARCHENGINE is set to YES. -EXTRA_SEARCH_MAPPINGS = +EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- # Configuration options related to the LaTeX output @@ -1718,7 +1718,7 @@ PAPER_TYPE = a4 # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. -EXTRA_PACKAGES = +EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for the # generated LaTeX document. The header should contain everything until the first @@ -1734,7 +1734,7 @@ EXTRA_PACKAGES = # to HTML_HEADER. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_HEADER = +LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the # generated LaTeX document. The footer should contain everything after the last @@ -1745,7 +1745,7 @@ LATEX_HEADER = # Note: Only use a user-defined footer if you know what you are doing! # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_FOOTER = +LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created @@ -1756,7 +1756,7 @@ LATEX_FOOTER = # list). # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_STYLESHEET = # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the LATEX_OUTPUT output @@ -1764,7 +1764,7 @@ LATEX_EXTRA_STYLESHEET = # markers available. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EXTRA_FILES = +LATEX_EXTRA_FILES = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is # prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will @@ -1872,14 +1872,14 @@ RTF_HYPERLINKS = NO # default style sheet that doxygen normally uses. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_STYLESHEET_FILE = +RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is # similar to doxygen's config file. A template extensions file can be generated # using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_EXTENSIONS_FILE = +RTF_EXTENSIONS_FILE = # If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code # with syntax highlighting in the RTF output. @@ -1924,7 +1924,7 @@ MAN_EXTENSION = .3 # MAN_EXTENSION with the initial . removed. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_SUBDIR = +MAN_SUBDIR = # If the MAN_LINKS tag is set to YES and doxygen generates man output, then it # will generate one additional man file for each entity documented in the real @@ -2037,7 +2037,7 @@ PERLMOD_PRETTY = YES # overwrite each other's variables. # This tag requires that the tag GENERATE_PERLMOD is set to YES. -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor @@ -2078,7 +2078,7 @@ SEARCH_INCLUDES = YES # preprocessor. # This tag requires that the tag SEARCH_INCLUDES is set to YES. -INCLUDE_PATH = +INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the @@ -2086,7 +2086,7 @@ INCLUDE_PATH = # used. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -INCLUDE_FILE_PATTERNS = +INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that are # defined before the preprocessor is started (similar to the -D option of e.g. @@ -2096,7 +2096,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = +PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The @@ -2105,7 +2105,7 @@ PREDEFINED = # definition found in the source code. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will # remove all references to function-like macros that are alone on a line, have @@ -2134,13 +2134,13 @@ SKIP_FUNCTION_MACROS = YES # the path). If a tag file is not located in the directory in which doxygen is # run, you must also specify the path to the tagfile here. -TAGFILES = +TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create a # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. -GENERATE_TAGFILE = +GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES, all external class will be listed in # the class index. If set to NO, only the inherited external classes will be @@ -2189,14 +2189,14 @@ CLASS_DIAGRAMS = YES # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. -MSCGEN_PATH = +MSCGEN_PATH = # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. # If left empty dia is assumed to be found in the default search path. -DIA_PATH = +DIA_PATH = # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. @@ -2245,7 +2245,7 @@ DOT_FONTSIZE = 10 # the path where dot can find it using this tag. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTPATH = +DOT_FONTPATH = # If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for # each documented class showing the direct and indirect inheritance relations. @@ -2389,26 +2389,26 @@ INTERACTIVE_SVG = YES # found. If left blank, it is assumed the dot tool can be found in the path. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_PATH = +DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the \dotfile # command). # This tag requires that the tag HAVE_DOT is set to YES. -DOTFILE_DIRS = +DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the \mscfile # command). -MSCFILE_DIRS = +MSCFILE_DIRS = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile # command). -DIAFILE_DIRS = +DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the # path where java can find the plantuml.jar file. If left blank, it is assumed @@ -2416,17 +2416,17 @@ DIAFILE_DIRS = # generate a warning when it encounters a \startuml command in this case and # will not generate output for the diagram. -PLANTUML_JAR_PATH = +PLANTUML_JAR_PATH = # When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a # configuration file for plantuml. -PLANTUML_CFG_FILE = +PLANTUML_CFG_FILE = # When using plantuml, the specified paths are searched for files specified by # the !include statement in a plantuml block. -PLANTUML_INCLUDE_PATH = +PLANTUML_INCLUDE_PATH = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes diff --git a/README.md b/README.md index a4b7482a5..e3435a83c 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,29 @@ Logo -# Sonoff-Tasmota +# Tasmota Alternative firmware for _ESP8266 based devices_ like [iTead](https://www.itead.cc/) _**Sonoff**_ with **web UI, rules and timers, OTA updates, custom device templates and sensor support**. Allows control over **MQTT**, **HTTP**, **Serial** and **KNX** for integrations with smart home systems. Written for Arduino IDE and PlatformIO. -[![GitHub version](https://img.shields.io/github/release/arendst/Sonoff-Tasmota.svg)](https://github.com/arendst/Sonoff-Tasmota/releases/latest) -[![GitHub download](https://img.shields.io/github/downloads/arendst/Sonoff-Tasmota/total.svg)](https://github.com/arendst/Sonoff-Tasmota/releases/latest) -[![License](https://img.shields.io/github/license/arendst/Sonoff-Tasmota.svg)](https://github.com/arendst/Sonoff-Tasmota/blob/development/LICENSE.txt) +[![GitHub version](https://img.shields.io/github/release/arendst/Tasmota.svg)](https://github.com/arendst/Tasmota/releases/latest) +[![GitHub download](https://img.shields.io/github/downloads/arendst/Tasmota/total.svg)](https://github.com/arendst/Tasmota/releases/latest) +[![License](https://img.shields.io/github/license/arendst/Tasmota.svg)](https://github.com/arendst/Tasmota/blob/development/LICENSE.txt) [![Chat](https://img.shields.io/discord/479389167382691863.svg)](https://discord.gg/Ks2Kzd4) -If you like **Sonoff-Tasmota**, give it a star, or fork it, and contribute! +If you like **Tasmota**, give it a star, or fork it, and contribute! -[![GitHub stars](https://img.shields.io/github/stars/arendst/Sonoff-Tasmota.svg?style=social&label=Star)](https://github.com/arendst/Sonoff-Tasmota/stargazers) -[![GitHub forks](https://img.shields.io/github/forks/arendst/Sonoff-Tasmota.svg?style=social&label=Fork)](https://github.com/arendst/Sonoff-Tasmota/network) +[![GitHub stars](https://img.shields.io/github/stars/arendst/Tasmota.svg?style=social&label=Star)](https://github.com/arendst/Tasmota/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/arendst/Tasmota.svg?style=social&label=Fork)](https://github.com/arendst/Tasmota/network) [![donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://paypal.me/tasmota) -See [RELEASENOTES.md](https://github.com/arendst/Sonoff-Tasmota/blob/development/RELEASENOTES.md) for release information. +See [RELEASENOTES.md](https://github.com/arendst/Tasmota/blob/development/RELEASENOTES.md) for release information. -In addition to the [release webpage](https://github.com/arendst/Sonoff-Tasmota/releases/latest) the binaries can also be downloaded from http://thehackbox.org/tasmota/release/ +In addition to the [release webpage](https://github.com/arendst/Tasmota/releases/latest) the binaries can also be downloaded from http://thehackbox.org/tasmota/release/ ## Development -[![Dev Version](https://img.shields.io/badge/development%20version-v6.7.1.x-blue.svg)](https://github.com/arendst/Sonoff-Tasmota) +[![Dev Version](https://img.shields.io/badge/development%20version-v6.7.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/Sonoff-Tasmota.svg)](https://travis-ci.org/arendst/Sonoff-Tasmota) +[![Build Status](https://img.shields.io/travis/arendst/Tasmota.svg)](https://travis-ci.org/arendst/Tasmota) -See [sonoff/_changelog.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_changelog.ino) for detailed change information. +See [sonoff/_changelog.ino](https://github.com/arendst/Tasmota/blob/development/sonoff/_changelog.ino) 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. @@ -39,23 +39,23 @@ An ESP82xx Wi-Fi device is not a toy. It uses Mains AC so there is a danger of e We don't take any responsibility nor liability for using this software nor for the installation or any tips, advice, videos, etc. given by any member of this site or any related site. ## Note -Please do not ask to add new devices unless it requires additional code for new features. If the device is not listed as a module, try using [Templates](https://github.com/arendst/Sonoff-Tasmota/wiki/Templates) first. If it is not listed in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates) create your own [Template](https://github.com/arendst/Sonoff-Tasmota/wiki/Templates#creating-your-template-). +Please do not ask to add new devices unless it requires additional code for new features. If the device is not listed as a module, try using [Templates](https://github.com/arendst/Tasmota/wiki/Templates) first. If it is not listed in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates) create your own [Template](https://github.com/arendst/Tasmota/wiki/Templates#creating-your-template-). ## Quick Install -Download one of the released binaries from https://github.com/arendst/Sonoff-Tasmota/releases and flash it to your hardware as [documented in the wiki](https://github.com/arendst/Sonoff-Tasmota/wiki/Flashing). +Download one of the released binaries from https://github.com/arendst/Tasmota/releases and flash it to your hardware as [documented in the wiki](https://github.com/arendst/Tasmota/wiki/Flashing). ## Important User Compilation Information -If you want to compile Sonoff-Tasmota yourself keep in mind the following: +If you want to compile Tasmota yourself keep in mind the following: -- Only Flash Mode **DOUT** is supported. Do not use Flash Mode DIO / QIO / QOUT as it might seem to brick your device. See [Wiki](https://github.com/arendst/Sonoff-Tasmota/wiki/Flashing) for background information. -- Sonoff-Tasmota uses a 1M linker script WITHOUT spiffs **1M (no SPIFFS)** for optimal code space. -- To make compile time changes to Sonoff-Tasmota it can use the ``user_config_override.h`` file. It assures keeping your settings when you download and compile a new version. To use ``user_config.override.h`` you will have to make a copy of the provided ``user_config_override_sample.h`` file and add your setting overrides. To enable the override file you will need to use a compile define as documented in the ``user_config_override_sample.h`` file. +- Only Flash Mode **DOUT** is supported. Do not use Flash Mode DIO / QIO / QOUT as it might seem to brick your device. See [Wiki](https://github.com/arendst/Tasmota/wiki/Flashing) for background information. +- Tasmota uses a 1M linker script WITHOUT spiffs **1M (no SPIFFS)** for optimal code space. +- To make compile time changes to Tasmota it can use the ``user_config_override.h`` file. It assures keeping your settings when you download and compile a new version. To use ``user_config.override.h`` you will have to make a copy of the provided ``user_config_override_sample.h`` file and add your setting overrides. To enable the override file you will need to use a compile define as documented in the ``user_config_override_sample.h`` file. ## Configuration Information -Please refer to the Installation and configuration articles in the [wiki](https://github.com/arendst/Sonoff-Tasmota/wiki). +Please refer to the Installation and configuration articles in the [wiki](https://github.com/arendst/Tasmota/wiki). ## Migration Information -See [wiki migration path](https://github.com/arendst/Sonoff-Tasmota/wiki/Upgrade#migration-path) for instructions how to migrate to a major version. Pay attention to the following version breaks due to dynamic settings updates: +See [wiki migration path](https://github.com/arendst/Tasmota/wiki/Upgrade#migration-path) for instructions how to migrate to a major version. Pay attention to the following version breaks due to dynamic settings updates: 1. Migrate to **Sonoff-Tasmota 3.9.x** 2. Migrate to **Sonoff-Tasmota 4.x** @@ -67,23 +67,23 @@ See [wiki migration path](https://github.com/arendst/Sonoff-Tasmota/wiki/Upgrade For a database of supported devices see [Tasmota Device Templates Repository](https://blakadder.github.io/templates) -See [Wiki](https://github.com/arendst/Sonoff-Tasmota/wiki) for use instructions and how-to's.
+See [Wiki](https://github.com/arendst/Tasmota/wiki) 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. ## Contribute -You can contribute to Sonoff-Tasmota by +You can contribute to Tasmota by - providing Pull Requests (Features, Proof of Concepts, Language files or Fixes) - testing new released features and report issues - donating to acquire hardware for testing and implementing or out of gratitude -- contributing missing documentation for features and devices on our [Wiki](https://github.com/arendst/Sonoff-Tasmota/wiki) +- contributing missing documentation for features and devices on our [Wiki](https://github.com/arendst/Tasmota/wiki) [![donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://paypal.me/tasmota) ## Credits ### Libraries Used -Libraries used with Sonoff-Tasmota are: +Libraries used with Tasmota are: - [ESP8266 core for Arduino](https://github.com/esp8266/Arduino) - [Adafruit CCS811](https://github.com/adafruit/Adafruit_CCS811) - [Adafruit ILI9341](https://github.com/adafruit/Adafruit_ILI9341) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 747baccca..86abd9678 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,9 +1,9 @@ -Logo +Logo # RELEASE NOTES ## Migration Information -See [wiki migration path](https://github.com/arendst/Sonoff-Tasmota/wiki/Upgrade#migration-path) for instructions how to migrate to a major version. Pay attention to the following version breaks due to dynamic settings updates: +See [wiki migration path](https://github.com/arendst/Tasmota/wiki/Upgrade#migration-path) for instructions how to migrate to a major version. Pay attention to the following version breaks due to dynamic settings updates: 1. Migrate to **Sonoff-Tasmota 3.9.x** 2. Migrate to **Sonoff-Tasmota 4.x** @@ -16,7 +16,7 @@ This release will be supported from ESP8266/Arduino library Core version **pre-2 Although it might still compile on previous Core versions all support will be removed starting in the next Release. ## Support of TLS -To save resources when TLS is enabled mDNS needs to be disabled. In addition to TLS using fingerprints now also user supplied CA certs and AWS IoT is supported. See full documentation on https://github.com/arendst/Sonoff-Tasmota/wiki/AWS-IoT +To save resources when TLS is enabled mDNS needs to be disabled. In addition to TLS using fingerprints now also user supplied CA certs and AWS IoT is supported. See full documentation on https://github.com/arendst/Tasmota/wiki/AWS-IoT ## Initial configuration tools For initial configuration this release supports Webserver based **WifiManager** or **Serial** based command interface only. Support for **WPS** and **SmartConfig** has been removed. diff --git a/SUPPORT.md b/SUPPORT.md index 389c03002..ab4bc743a 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -2,24 +2,24 @@ # Support -If you're looking for support on **Sonoff-Tasmota** there are some options available: +If you're looking for support on **Tasmota** there are some options available: ## Documentation: -* [Wiki Pages](https://github.com/arendst/Sonoff-Tasmota/wiki): For information on how to Flash Tasmota, configure and use it. -* [FAQ](https://github.com/arendst/Sonoff-Tasmota/wiki/FAQ): For information on common problems and solutions. -* [Troubleshooting Information](https://github.com/arendst/Sonoff-Tasmota/wiki/Troubleshooting): For ways to debug and troubleshoot. -* [Commands Information](https://github.com/arendst/Sonoff-Tasmota/wiki/Commands): For information on all the commands supported by Tasmota. +* [Wiki Pages](https://github.com/arendst/Tasmota/wiki): For information on how to Flash Tasmota, configure and use it. +* [FAQ](https://github.com/arendst/Tasmota/wiki/FAQ): For information on common problems and solutions. +* [Troubleshooting Information](https://github.com/arendst/Tasmota/wiki/Troubleshooting): For ways to debug and troubleshoot. +* [Commands Information](https://github.com/arendst/Tasmota/wiki/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/Sonoff-Tasmota/issues): You might find an answer to your question by searching current or closed issues. +* [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/Sonoff-Tasmota/issues/new?template=Bug_report.md): For reporting Bugs of Tasmota Software. -* [Feature Request](https://github.com/arendst/Sonoff-Tasmota/issues/new?template=Feature_request.md): For requesting features/functions to Tasmota Software. -* [Troubleshooting](https://github.com/arendst/Sonoff-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/Sonoff-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. +* [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. diff --git a/build-container/README.md b/build-container/README.md index a02f1860e..b89a84892 100644 --- a/build-container/README.md +++ b/build-container/README.md @@ -1,5 +1,5 @@ # Docker container for tasmota builds -This Container will setup a proper build environment for [Sonoff-Tasmota](https://github.com/arendst/Sonoff-Tasmota) +This Container will setup a proper build environment for [Tasmota](https://github.com/arendst/Tasmota) ## Create container `docker build -t mytasmota:latest .` @@ -8,19 +8,19 @@ This Container will setup a proper build environment for [Sonoff-Tasmota](https: Use instead of the container `mytasmota:latest` the published container `eddyhub/docker-tasmota:latest` from docker hub. ## Build all development binaries -`git clone https://github.com/arendst/Sonoff-Tasmota.git` -`docker run -ti --rm -v $(pwd)/Sonoff-Tasmota:/tasmota -u $UID:$GID mytasmota:latest` +`git clone https://github.com/arendst/Tasmota.git` +`docker run -ti --rm -v $(pwd)/Tasmota:/tasmota -u $UID:$GID mytasmota:latest` ## Build a specific binary with custom options -Checkout Sonoff-Tasmota: `git clone https://github.com/arendst/Sonoff-Tasmota.git` -Mount the source as volume in `/tasmota`. **Prefix** any parameter available in `Sonoff-Tasmota/sonoff/my_user_config.h` with `TASMOTA_` as a environment variable for the container. **Also don't forget to escape what needs to be escaped in your shell.** **Strings** should be in **double quotes**. My config example: -`docker run -ti --rm -v $(pwd)/Sonoff-Tasmota:/tasmota -e TASMOTA_STA_SSID1='"my-wifi"' -e TASMOTA_STA_PASS1='"my-wifi-password"' -e TASMOTA_MQTT_HOST='my-mqtt-host' -e TASMOTA_MQTT_USER='"my-mqtt-user"' -e TASMOTA_MQTT_PASS='"my-mqtt-password"' -e TASMOTA_WEB_PASSWORD='"my-web-password"' -u $UID:$GID mytasmota:latest --environment sonoff-DE +Checkout Tasmota: `git clone https://github.com/arendst/Tasmota.git` +Mount the source as volume in `/tasmota`. **Prefix** any parameter available in `Tasmota/sonoff/my_user_config.h` with `TASMOTA_` as a environment variable for the container. **Also don't forget to escape what needs to be escaped in your shell.** **Strings** should be in **double quotes**. My config example: +`docker run -ti --rm -v $(pwd)/Tasmota:/tasmota -e TASMOTA_STA_SSID1='"my-wifi"' -e TASMOTA_STA_PASS1='"my-wifi-password"' -e TASMOTA_MQTT_HOST='my-mqtt-host' -e TASMOTA_MQTT_USER='"my-mqtt-user"' -e TASMOTA_MQTT_PASS='"my-mqtt-password"' -e TASMOTA_WEB_PASSWORD='"my-web-password"' -u $UID:$GID mytasmota:latest --environment sonoff-DE -Now you should have the file Sonoff-Tasmota/.pioenvs/sonoff-DE/firmware.bin which can be flashed on your device. +Now you should have the file Tasmota/.pioenvs/sonoff-DE/firmware.bin which can be flashed on your device. ## Build a specific version of tasmota Checkout out the needed version before using the build instructions above: -- `git clone https://github.com/arendst/Sonoff-Tasmota.git` -- `git -C Sonoff-Tasmota checkout v6.6.0` +- `git clone https://github.com/arendst/Tasmota.git` +- `git -C Tasmota checkout v6.6.0` Build it: -- `docker run -ti --rm -v $(pwd)/Sonoff-Tasmota:/tasmota -u $UID:$GID mytasmota:latest` +- `docker run -ti --rm -v $(pwd)/Tasmota:/tasmota -u $UID:$GID mytasmota:latest` diff --git a/lib/I2Cdevlib-MPU6050/MPU6050.cpp b/lib/I2Cdevlib-MPU6050/MPU6050.cpp index 378a2c0ab..6b1466139 100644 --- a/lib/I2Cdevlib-MPU6050/MPU6050.cpp +++ b/lib/I2Cdevlib-MPU6050/MPU6050.cpp @@ -3,7 +3,7 @@ // 8/24/2011 by Jeff Rowberg // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib // -// Adapted for Sonoff-Tasmota by Oliver Welter 02-04-2018 +// Adapted for Tasmota by Oliver Welter 02-04-2018 // // Changelog: // ... - ongoing debug release @@ -871,7 +871,7 @@ void MPU6050::setMasterClockSpeed(uint8_t speed) { * operation, and if it is cleared, then it's a write operation. The remaining * bits (6-0) are the 7-bit device address of the slave device. * - * In read mode, the result of the read is placed in the lowest available + * In read mode, the result of the read is placed in the lowest available * EXT_SENS_DATA register. For further information regarding the allocation of * read results, please refer to the EXT_SENS_DATA register description * (Registers 73 - 96). @@ -2957,7 +2957,7 @@ void MPU6050::readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, ui // read the chunk of data as specified I2Cdev::readBytes(devAddr, MPU6050_RA_MEM_R_W, chunkSize, data + i); - + // increase byte index by [chunkSize] i += chunkSize; @@ -2991,7 +2991,7 @@ bool MPU6050::writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t b // make sure this chunk doesn't go past the bank boundary (256 bytes) if (chunkSize > 256 - address) chunkSize = 256 - address; - + if (useProgMem) { // write the chunk of data as specified for (j = 0; j < chunkSize; j++) progBuffer[j] = pgm_read_byte(data + i + j); @@ -3105,7 +3105,7 @@ bool MPU6050::writeDMPConfigurationSet(const uint8_t *data, uint16_t dataSize, b Serial.println(" found...");*/ if (special == 0x01) { // enable DMP-related interrupts - + //setIntZeroMotionEnabled(true); //setIntFIFOBufferOverflowEnabled(true); //setIntDMPEnabled(true); @@ -3117,7 +3117,7 @@ bool MPU6050::writeDMPConfigurationSet(const uint8_t *data, uint16_t dataSize, b success = false; } } - + if (!success) { if (useProgMem) free(progBuffer); return false; // uh oh diff --git a/lib/I2Cdevlib-MPU6050/MPU6050.h b/lib/I2Cdevlib-MPU6050/MPU6050.h index 2d7dfd7b4..669743e63 100644 --- a/lib/I2Cdevlib-MPU6050/MPU6050.h +++ b/lib/I2Cdevlib-MPU6050/MPU6050.h @@ -4,7 +4,7 @@ // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib // -// Adapted for Sonoff-Tasmota by Oliver Welter 02-04-2018 +// Adapted for Tasmota by Oliver Welter 02-04-2018 // // Changelog: // ... - ongoing debug release @@ -408,7 +408,7 @@ class MPU6050 { void initialize(); bool testConnection(); - + // Patch for Tasmota void setAddr(uint8_t address); @@ -682,9 +682,9 @@ class MPU6050 { // WHO_AM_I register uint8_t getDeviceID(); void setDeviceID(uint8_t id); - + // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ======== - + // XG_OFFS_TC register uint8_t getOTPBankValid(); void setOTPBankValid(bool enabled); @@ -734,13 +734,13 @@ class MPU6050 { // ZG_OFFS_USR* register int16_t getZGyroOffset(); void setZGyroOffset(int16_t offset); - + // INT_ENABLE register (DMP functions) bool getIntPLLReadyEnabled(); void setIntPLLReadyEnabled(bool enabled); bool getIntDMPEnabled(); void setIntDMPEnabled(bool enabled); - + // DMP_INT_STATUS bool getDMPInt5Status(); bool getDMPInt4Status(); @@ -752,18 +752,18 @@ class MPU6050 { // INT_STATUS register (DMP functions) bool getIntPLLReadyStatus(); bool getIntDMPStatus(); - + // USER_CTRL register (DMP functions) bool getDMPEnabled(); void setDMPEnabled(bool enabled); void resetDMP(); - + // BANK_SEL register void setMemoryBank(uint8_t bank, bool prefetchEnabled=false, bool userBank=false); - + // MEM_START_ADDR register void setMemoryStartAddress(uint8_t address); - + // MEM_R_W register uint8_t readMemoryByte(); void writeMemoryByte(uint8_t data); @@ -795,12 +795,12 @@ class MPU6050 { uint8_t dmpGetSampleStepSizeMS(); uint8_t dmpGetSampleFrequency(); int32_t dmpDecodeTemperature(int8_t tempReg); - + // Register callbacks after a packet of FIFO data is processed //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority); //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func); uint8_t dmpRunFIFORateProcesses(); - + // Setup FIFO for various output uint8_t dmpSendQuaternion(uint_fast16_t accuracy); uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy); @@ -860,7 +860,7 @@ class MPU6050 { uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0); uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0); uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0); - + uint8_t dmpGetEuler(float *data, Quaternion *q); uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity); @@ -896,12 +896,12 @@ class MPU6050 { uint8_t dmpGetSampleStepSizeMS(); uint8_t dmpGetSampleFrequency(); int32_t dmpDecodeTemperature(int8_t tempReg); - + // Register callbacks after a packet of FIFO data is processed //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority); //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func); uint8_t dmpRunFIFORateProcesses(); - + // Setup FIFO for various output uint8_t dmpSendQuaternion(uint_fast16_t accuracy); uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy); @@ -962,7 +962,7 @@ class MPU6050 { uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0); uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0); uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0); - + uint8_t dmpGetEuler(float *data, Quaternion *q); uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity); diff --git a/lib/I2Cdevlib-MPU6050/MPU6050_6Axis_MotionApps20.h b/lib/I2Cdevlib-MPU6050/MPU6050_6Axis_MotionApps20.h index 90704f0c7..69ab1b968 100644 --- a/lib/I2Cdevlib-MPU6050/MPU6050_6Axis_MotionApps20.h +++ b/lib/I2Cdevlib-MPU6050/MPU6050_6Axis_MotionApps20.h @@ -3,7 +3,7 @@ // 5/20/2013 by Jeff Rowberg // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib // -// Adapted for Sonoff-Tasmota by Oliver Welter 02-04-2018 +// Adapted for Tasmota by Oliver Welter 02-04-2018 // // Changelog: // ... - ongoing debug release @@ -71,16 +71,16 @@ THE SOFTWARE. typedef uint16_t prog_uint16_t; typedef int32_t prog_int32_t; typedef uint32_t prog_uint32_t; - + #define strcpy_P(dest, src) strcpy((dest), (src)) #define strcat_P(dest, src) strcat((dest), (src)) #define strcmp_P(a, b) strcmp((a), (b)) - + #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) #define pgm_read_word(addr) (*(const unsigned short *)(addr)) #define pgm_read_dword(addr) (*(const unsigned long *)(addr)) #define pgm_read_float(addr) (*(const float *)(addr)) - + #define pgm_read_byte_near(addr) pgm_read_byte(addr) #define pgm_read_word_near(addr) pgm_read_word(addr) #define pgm_read_dword_near(addr) pgm_read_dword(addr) @@ -732,7 +732,7 @@ uint8_t MPU6050::dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *proces // process packet if ((status = dmpProcessFIFOPacket(buf)) > 0) return status; - + // increment external process count variable, if supplied if (processed != 0) *processed++; } diff --git a/lib/I2Cdevlib-MPU6050/MPU6050_9Axis_MotionApps41.h b/lib/I2Cdevlib-MPU6050/MPU6050_9Axis_MotionApps41.h index 73f3dff9d..f4a88b433 100644 --- a/lib/I2Cdevlib-MPU6050/MPU6050_9Axis_MotionApps41.h +++ b/lib/I2Cdevlib-MPU6050/MPU6050_9Axis_MotionApps41.h @@ -3,7 +3,7 @@ // 6/18/2012 by Jeff Rowberg // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib // -// Adapted for Sonoff-Tasmota by Oliver Welter 02-04-2018 +// Adapted for Tasmota by Oliver Welter 02-04-2018 // // Changelog: // ... - ongoing debug release @@ -67,16 +67,16 @@ THE SOFTWARE. typedef uint16_t prog_uint16_t; typedef int32_t prog_int32_t; typedef uint32_t prog_uint32_t; - + #define strcpy_P(dest, src) strcpy((dest), (src)) #define strcat_P(dest, src) strcat((dest), (src)) #define strcmp_P(a, b) strcmp((a), (b)) - + #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) #define pgm_read_word(addr) (*(const unsigned short *)(addr)) #define pgm_read_dword(addr) (*(const unsigned long *)(addr)) #define pgm_read_float(addr) (*(const float *)(addr)) - + #define pgm_read_byte_near(addr) pgm_read_byte(addr) #define pgm_read_word_near(addr) pgm_read_word(addr) #define pgm_read_dword_near(addr) pgm_read_dword(addr) @@ -159,7 +159,7 @@ const prog_uchar dmpMemory[MPU6050_DMP_CODE_SIZE] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4D, 0x00, 0x2F, 0x70, 0x6D, 0x00, 0x00, 0x05, 0xAE, 0x00, 0x0C, 0x02, 0xD0, - + // bank 2, 256 bytes 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x54, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, @@ -177,7 +177,7 @@ const prog_uchar dmpMemory[MPU6050_DMP_CODE_SIZE] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x78, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - + // bank 3, 256 bytes 0xD8, 0xDC, 0xF4, 0xD8, 0xB9, 0xAB, 0xF3, 0xF8, 0xFA, 0xF1, 0xBA, 0xA2, 0xDE, 0xB2, 0xB8, 0xB4, 0xA8, 0x81, 0x98, 0xF7, 0x4A, 0x90, 0x7F, 0x91, 0x6A, 0xF3, 0xF9, 0xDB, 0xA8, 0xF9, 0xB0, 0xBA, @@ -195,7 +195,7 @@ const prog_uchar dmpMemory[MPU6050_DMP_CODE_SIZE] PROGMEM = { 0x7D, 0xAF, 0x83, 0xB5, 0x93, 0xF0, 0x00, 0x28, 0x50, 0xF5, 0xBA, 0xAD, 0x8F, 0x9F, 0x28, 0x54, 0x7C, 0xB9, 0xF1, 0xA3, 0x86, 0x9F, 0x61, 0xA6, 0xDA, 0xDE, 0xDF, 0xDB, 0xB2, 0xB6, 0x8E, 0x9D, 0xAE, 0xF5, 0x60, 0x68, 0x70, 0xB1, 0xB5, 0xF1, 0xDA, 0xA6, 0xDF, 0xD9, 0xA6, 0xFA, 0xA3, 0x86, - + // bank 4, 256 bytes 0x96, 0xDB, 0x31, 0xA6, 0xD9, 0xF8, 0xDF, 0xBA, 0xA6, 0x8F, 0xC2, 0xC5, 0xC7, 0xB2, 0x8C, 0xC1, 0xB8, 0xA2, 0xDF, 0xDF, 0xDF, 0xA3, 0xDF, 0xDF, 0xDF, 0xD8, 0xD8, 0xF1, 0xB8, 0xA8, 0xB2, 0x86, @@ -213,7 +213,7 @@ const prog_uchar dmpMemory[MPU6050_DMP_CODE_SIZE] PROGMEM = { 0x32, 0xD8, 0x70, 0x5D, 0xDA, 0x3A, 0xD8, 0x58, 0x79, 0xD9, 0x3A, 0xD8, 0x78, 0x93, 0xA3, 0x4D, 0xDA, 0x2A, 0xD8, 0x48, 0x69, 0xD9, 0x2A, 0xD8, 0x68, 0x55, 0xDA, 0x32, 0xD8, 0x50, 0x71, 0xD9, 0x32, 0xD8, 0x70, 0x5D, 0xDA, 0x3A, 0xD8, 0x58, 0x79, 0xD9, 0x3A, 0xD8, 0x78, 0xA8, 0x8A, 0x9A, - + // bank 5, 256 bytes 0xF0, 0x28, 0x50, 0x78, 0x9E, 0xF3, 0x88, 0x18, 0xF1, 0x9F, 0x1D, 0x98, 0xA8, 0xD9, 0x08, 0xD8, 0xC8, 0x9F, 0x12, 0x9E, 0xF3, 0x15, 0xA8, 0xDA, 0x12, 0x10, 0xD8, 0xF1, 0xAF, 0xC8, 0x97, 0x87, @@ -249,7 +249,7 @@ const prog_uchar dmpMemory[MPU6050_DMP_CODE_SIZE] PROGMEM = { 0x81, 0xAD, 0xD9, 0x01, 0xD8, 0xF2, 0xAE, 0xDA, 0x26, 0xD8, 0x8E, 0x91, 0x29, 0x83, 0xA7, 0xD9, 0xAD, 0xAD, 0xAD, 0xAD, 0xF3, 0x2A, 0xD8, 0xD8, 0xF1, 0xB0, 0xAC, 0x89, 0x91, 0x3E, 0x5E, 0x76, 0xF3, 0xAC, 0x2E, 0x2E, 0xF1, 0xB1, 0x8C, 0x5A, 0x9C, 0xAC, 0x2C, 0x28, 0x28, 0x28, 0x9C, 0xAC, - + // bank 7, 170 bytes (remainder) 0x30, 0x18, 0xA8, 0x98, 0x81, 0x28, 0x34, 0x3C, 0x97, 0x24, 0xA7, 0x28, 0x34, 0x3C, 0x9C, 0x24, 0xF2, 0xB0, 0x89, 0xAC, 0x91, 0x2C, 0x4C, 0x6C, 0x8A, 0x9B, 0x2D, 0xD9, 0xD8, 0xD8, 0x51, 0xD9, @@ -381,9 +381,9 @@ uint8_t MPU6050::dmpInitialize() { DEBUG_PRINTLN(ygOffset); DEBUG_PRINT(F("Z gyro offset = ")); DEBUG_PRINTLN(zgOffset); - + I2Cdev::readByte(devAddr, MPU6050_RA_USER_CTRL, buffer); // ? - + DEBUG_PRINTLN(F("Enabling interrupt latch, clear on any read, AUX bypass enabled")); I2Cdev::writeByte(devAddr, MPU6050_RA_INT_PIN_CFG, 0x32); @@ -572,7 +572,7 @@ uint8_t MPU6050::dmpInitialize() { DEBUG_PRINTLN(F("Writing final memory update 11/19 (function unknown)...")); for (j = 0; j < 4 || j < dmpUpdate[2] + 3; j++, pos++) dmpUpdate[j] = pgm_read_byte(&dmpUpdates[pos]); writeMemoryBlock(dmpUpdate + 3, dmpUpdate[2], dmpUpdate[0], dmpUpdate[1]); - + DEBUG_PRINTLN(F("Reading final memory update 12/19 (function unknown)...")); for (j = 0; j < 4 || j < dmpUpdate[2] + 3; j++, pos++) dmpUpdate[j] = pgm_read_byte(&dmpUpdates[pos]); readMemoryBlock(dmpUpdate + 3, dmpUpdate[2], dmpUpdate[0], dmpUpdate[1]); @@ -831,7 +831,7 @@ uint8_t MPU6050::dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *proces // process packet if ((status = dmpProcessFIFOPacket(buf)) > 0) return status; - + // increment external process count variable, if supplied if (processed != 0) *processed++; } diff --git a/lib/I2Cdevlib-MPU6050/helper_3dmath.h b/lib/I2Cdevlib-MPU6050/helper_3dmath.h index 5dafb54cf..b49aa801a 100644 --- a/lib/I2Cdevlib-MPU6050/helper_3dmath.h +++ b/lib/I2Cdevlib-MPU6050/helper_3dmath.h @@ -2,7 +2,7 @@ // 6/5/2012 by Jeff Rowberg // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib // -// Adapted for Sonoff-Tasmota by Oliver Welter 02-04-2018 +// Adapted for Tasmota by Oliver Welter 02-04-2018 // // Changelog: // 2012-06-05 - add 3D math helper file to DMP6 example sketch @@ -40,14 +40,14 @@ class Quaternion { float x; float y; float z; - + Quaternion() { w = 1.0f; x = 0.0f; y = 0.0f; z = 0.0f; } - + Quaternion(float nw, float nx, float ny, float nz) { w = nw; x = nx; @@ -71,11 +71,11 @@ class Quaternion { Quaternion getConjugate() { return Quaternion(w, -x, -y, -z); } - + float getMagnitude() { return sqrt(w*w + x*x + y*y + z*z); } - + void normalize() { float m = getMagnitude(); w /= m; @@ -83,7 +83,7 @@ class Quaternion { y /= m; z /= m; } - + Quaternion getNormalized() { Quaternion r(w, x, y, z); r.normalize(); @@ -102,7 +102,7 @@ class VectorInt16 { y = 0; z = 0; } - + VectorInt16(int16_t nx, int16_t ny, int16_t nz) { x = nx; y = ny; @@ -119,19 +119,19 @@ class VectorInt16 { y /= m; z /= m; } - + VectorInt16 getNormalized() { VectorInt16 r(x, y, z); r.normalize(); return r; } - + void rotate(Quaternion *q) { // http://www.cprogramming.com/tutorial/3d/quaternions.html // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/transforms/index.htm // http://content.gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotation // ^ or: http://webcache.googleusercontent.com/search?q=cache:xgJAp3bDNhQJ:content.gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotation&hl=en&gl=us&strip=1 - + // P_out = q * P_in * conj(q) // - P_out is the output vector // - q is the orientation quaternion @@ -169,7 +169,7 @@ class VectorFloat { y = 0; z = 0; } - + VectorFloat(float nx, float ny, float nz) { x = nx; y = ny; @@ -186,13 +186,13 @@ class VectorFloat { y /= m; z /= m; } - + VectorFloat getNormalized() { VectorFloat r(x, y, z); r.normalize(); return r; } - + void rotate(Quaternion *q) { Quaternion p(0, x, y, z); diff --git a/lib/NeoPixelBus-2.5.0.09/.github/ISSUE_TEMPLATE/bug_report.md b/lib/NeoPixelBus-2.5.0.09/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..9680fde4d --- /dev/null +++ b/lib/NeoPixelBus-2.5.0.09/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,34 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +**NOTE: If you are seeking help or have questions, this is NOT the place to do it.** For questions and support, jump on Gitter and ask away. +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Makuna/NeoPixelBus?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Development environment (please complete the following information):** + - OS: [e.g. Win10] + - Build Environment [e.g. Arduino IDE v.1.8.10] + - Board target [e.g. AVR Mege 2560, v 1.10.31 ] - you will need to check the board manager for this. + - Library version [e.g. v2.3.4] - you will need to check the library manager for this. If you used github to clone it, mention this and include the reference. + +**Minimal Sketch that reproduced the problem:** +If an example will demonstrate the problem, list which example you used. +If its your sketch, take the time to remove unneeded parts and minimize it to the smallest sketch that reproduces the problem. Then include the sketch here using `code` markup. Start with a line with three single left quotes and then end with a line with three single left quotes. + +**Additional context** +Add any other context about the problem here. diff --git a/lib/NeoPixelBus-2.5.0.09/.github/ISSUE_TEMPLATE/feature_request.md b/lib/NeoPixelBus-2.5.0.09/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..6daf08040 --- /dev/null +++ b/lib/NeoPixelBus-2.5.0.09/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**NOTE: If you are seeking help or have questions, this is NOT the place to do it.** For questions and support, jump on Gitter and ask away. +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Makuna/NeoPixelBus?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/lib/TasmotaModbus-1.2.0/library.json b/lib/TasmotaModbus-1.2.0/library.json index c9639e164..6de11d0e0 100644 --- a/lib/TasmotaModbus-1.2.0/library.json +++ b/lib/TasmotaModbus-1.2.0/library.json @@ -8,7 +8,7 @@ "repository": { "type": "git", - "url": "https://github.com/arendst/Sonoff-Tasmota/lib/TasmotaModbus" + "url": "https://github.com/arendst/Tasmota/lib/TasmotaModbus" }, "frameworks": "arduino", "platforms": "espressif8266" diff --git a/lib/TasmotaSerial-2.4.1/library.json b/lib/TasmotaSerial-2.4.1/library.json index 554d9ea9e..64cde09c9 100644 --- a/lib/TasmotaSerial-2.4.1/library.json +++ b/lib/TasmotaSerial-2.4.1/library.json @@ -8,7 +8,7 @@ "repository": { "type": "git", - "url": "https://github.com/arendst/Sonoff-Tasmota/lib/TasmotaSerial" + "url": "https://github.com/arendst/Tasmota/lib/TasmotaSerial" }, "frameworks": "arduino", "platforms": "espressif8266" diff --git a/lib/readme.txt b/lib/readme.txt deleted file mode 100644 index dbadc3d63..000000000 --- a/lib/readme.txt +++ /dev/null @@ -1,36 +0,0 @@ - -This directory is intended for the project specific (private) libraries. -PlatformIO will compile them to static libraries and link to executable file. - -The source code of each library should be placed in separate directory, like -"lib/private_lib/[here are source files]". - -For example, see how can be organized `Foo` and `Bar` libraries: - -|--lib -| |--Bar -| | |--docs -| | |--examples -| | |--src -| | |- Bar.c -| | |- Bar.h -| |--Foo -| | |- Foo.c -| | |- Foo.h -| |- readme.txt --> THIS FILE -|- platformio.ini -|--src - |- main.c - -Then in `src/main.c` you should use: - -#include -#include - -// rest H/C/CPP code - -PlatformIO will find your libraries automatically, configure preprocessor's -include paths and build them. - -More information about PlatformIO Library Dependency Finder -- http://docs.platformio.org/page/librarymanager/ldf.html diff --git a/platformio.ini b/platformio.ini index 65f11515d..4ea6d30d6 100755 --- a/platformio.ini +++ b/platformio.ini @@ -8,7 +8,7 @@ ; http://docs.platformio.org/en/stable/projectconf.html [platformio] -src_dir = sonoff +src_dir = tasmota build_dir = .pioenvs build_cache_dir = .cache diff --git a/sonoff/Parsing.cpp b/tasmota/Parsing.cpp similarity index 96% rename from sonoff/Parsing.cpp rename to tasmota/Parsing.cpp index 6c68a3af4..145b72572 100644 --- a/sonoff/Parsing.cpp +++ b/tasmota/Parsing.cpp @@ -1,623 +1,623 @@ -/* - Parsing.cpp - HTTP request parsing. - - Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Modified 8 May 2015 by Hristo Gochkov (proper post and file upload handling) -*/ - -// Use patched Parsing.cpp to fix ALEXA parsing issue in v2.4.2 -#include -#if defined(ARDUINO_ESP8266_RELEASE_2_4_2) -#warning **** Tasmota is using v2.4.2 patched Parsing.cpp as planned **** - -#include -#include "WiFiServer.h" -#include "WiFiClient.h" -#include "ESP8266WebServer.h" -#include "detail/mimetable.h" - -//#define DEBUG_ESP_HTTP_SERVER -#ifdef DEBUG_ESP_PORT -#define DEBUG_OUTPUT DEBUG_ESP_PORT -#else -#define DEBUG_OUTPUT Serial -#endif - -static const char Content_Type[] PROGMEM = "Content-Type"; -static const char filename[] PROGMEM = "filename"; - -static char* readBytesWithTimeout(WiFiClient& client, size_t maxLength, size_t& dataLength, int timeout_ms) -{ - char *buf = nullptr; - dataLength = 0; - while (dataLength < maxLength) { - int tries = timeout_ms; - size_t newLength; - while (!(newLength = client.available()) && tries--) delay(1); - if (!newLength) { - break; - } - if (!buf) { - buf = (char *) malloc(newLength + 1); - if (!buf) { - return nullptr; - } - } - else { - char* newBuf = (char *) realloc(buf, dataLength + newLength + 1); - if (!newBuf) { - free(buf); - return nullptr; - } - buf = newBuf; - } - client.readBytes(buf + dataLength, newLength); - dataLength += newLength; - buf[dataLength] = '\0'; - } - return buf; -} - -bool ESP8266WebServer::_parseRequest(WiFiClient& client) { - // Read the first line of HTTP request - String req = client.readStringUntil('\r'); - client.readStringUntil('\n'); - //reset header value - for (int i = 0; i < _headerKeysCount; ++i) { - _currentHeaders[i].value =String(); - } - - // First line of HTTP request looks like "GET /path HTTP/1.1" - // Retrieve the "/path" part by finding the spaces - int addr_start = req.indexOf(' '); - int addr_end = req.indexOf(' ', addr_start + 1); - if (addr_start == -1 || addr_end == -1) { -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("Invalid request: "); - DEBUG_OUTPUT.println(req); -#endif - return false; - } - - String methodStr = req.substring(0, addr_start); - String url = req.substring(addr_start + 1, addr_end); - String versionEnd = req.substring(addr_end + 8); - _currentVersion = atoi(versionEnd.c_str()); - String searchStr = ""; - int hasSearch = url.indexOf('?'); - if (hasSearch != -1){ - searchStr = url.substring(hasSearch + 1); - url = url.substring(0, hasSearch); - } - _currentUri = url; - _chunked = false; - - HTTPMethod method = HTTP_GET; - if (methodStr == F("POST")) { - method = HTTP_POST; - } else if (methodStr == F("DELETE")) { - method = HTTP_DELETE; - } else if (methodStr == F("OPTIONS")) { - method = HTTP_OPTIONS; - } else if (methodStr == F("PUT")) { - method = HTTP_PUT; - } else if (methodStr == F("PATCH")) { - method = HTTP_PATCH; - } - _currentMethod = method; - -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("method: "); - DEBUG_OUTPUT.print(methodStr); - DEBUG_OUTPUT.print(" url: "); - DEBUG_OUTPUT.print(url); - DEBUG_OUTPUT.print(" search: "); - DEBUG_OUTPUT.println(searchStr); -#endif - - //attach handler - RequestHandler* handler; - for (handler = _firstHandler; handler; handler = handler->next()) { - if (handler->canHandle(_currentMethod, _currentUri)) - break; - } - _currentHandler = handler; - - String formData; - // below is needed only when POST type request - if (method == HTTP_POST || method == HTTP_PUT || method == HTTP_PATCH || method == HTTP_DELETE){ - String boundaryStr; - String headerName; - String headerValue; - bool isForm = false; - bool isEncoded = false; - uint32_t contentLength = 0; - //parse headers - while(1){ - req = client.readStringUntil('\r'); - client.readStringUntil('\n'); - if (req == "") break;//no moar headers - int headerDiv = req.indexOf(':'); - if (headerDiv == -1){ - break; - } - headerName = req.substring(0, headerDiv); - headerValue = req.substring(headerDiv + 1); - headerValue.trim(); - _collectHeader(headerName.c_str(),headerValue.c_str()); - - #ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("headerName: "); - DEBUG_OUTPUT.println(headerName); - DEBUG_OUTPUT.print("headerValue: "); - DEBUG_OUTPUT.println(headerValue); - #endif - - if (headerName.equalsIgnoreCase(FPSTR(Content_Type))){ - using namespace mime; - if (headerValue.startsWith(FPSTR(mimeTable[txt].mimeType))){ - isForm = false; - } else if (headerValue.startsWith(F("application/x-www-form-urlencoded"))){ - isForm = false; - isEncoded = true; - } else if (headerValue.startsWith(F("multipart/"))){ - boundaryStr = headerValue.substring(headerValue.indexOf('=') + 1); - boundaryStr.replace("\"",""); - isForm = true; - } - } else if (headerName.equalsIgnoreCase(F("Content-Length"))){ - contentLength = headerValue.toInt(); - } else if (headerName.equalsIgnoreCase(F("Host"))){ - _hostHeader = headerValue; - } - } - - if (!isForm){ - size_t plainLength; - char* plainBuf = readBytesWithTimeout(client, contentLength, plainLength, HTTP_MAX_POST_WAIT); - if (plainLength < contentLength) { - free(plainBuf); - return false; - } - if (contentLength > 0) { - if(isEncoded){ - //url encoded form - if (searchStr != "") searchStr += '&'; - searchStr += plainBuf; - } - _parseArguments(searchStr); - if(!isEncoded||(0==_currentArgCount)){ // @20180124OF01: Workarround for Alexa Bug - //plain post json or other data - RequestArgument& arg = _currentArgs[_currentArgCount++]; - arg.key = F("plain"); - arg.value = String(plainBuf); - } - - #ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("Plain: "); - DEBUG_OUTPUT.println(plainBuf); - #endif - free(plainBuf); - } else { - // No content - but we can still have arguments in the URL. - _parseArguments(searchStr); - } - } - - if (isForm){ - _parseArguments(searchStr); - if (!_parseForm(client, boundaryStr, contentLength)) { - return false; - } - } - } else { - String headerName; - String headerValue; - //parse headers - while(1){ - req = client.readStringUntil('\r'); - client.readStringUntil('\n'); - if (req == "") break;//no moar headers - int headerDiv = req.indexOf(':'); - if (headerDiv == -1){ - break; - } - headerName = req.substring(0, headerDiv); - headerValue = req.substring(headerDiv + 2); - _collectHeader(headerName.c_str(),headerValue.c_str()); - - #ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("headerName: "); - DEBUG_OUTPUT.println(headerName); - DEBUG_OUTPUT.print("headerValue: "); - DEBUG_OUTPUT.println(headerValue); - #endif - - if (headerName.equalsIgnoreCase("Host")){ - _hostHeader = headerValue; - } - } - _parseArguments(searchStr); - } - client.flush(); - -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("Request: "); - DEBUG_OUTPUT.println(url); - DEBUG_OUTPUT.print(" Arguments: "); - DEBUG_OUTPUT.println(searchStr); -#endif - - return true; -} - -bool ESP8266WebServer::_collectHeader(const char* headerName, const char* headerValue) { - for (int i = 0; i < _headerKeysCount; i++) { - if (_currentHeaders[i].key.equalsIgnoreCase(headerName)) { - _currentHeaders[i].value=headerValue; - return true; - } - } - return false; -} - -void ESP8266WebServer::_parseArguments(String data) { -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("args: "); - DEBUG_OUTPUT.println(data); -#endif - if (_currentArgs) - delete[] _currentArgs; - _currentArgs = 0; - if (data.length() == 0) { - _currentArgCount = 0; - _currentArgs = new RequestArgument[1]; - return; - } - _currentArgCount = 1; - - for (int i = 0; i < (int)data.length(); ) { - i = data.indexOf('&', i); - if (i == -1) - break; - ++i; - ++_currentArgCount; - } -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("args count: "); - DEBUG_OUTPUT.println(_currentArgCount); -#endif - - _currentArgs = new RequestArgument[_currentArgCount+1]; - int pos = 0; - int iarg; - for (iarg = 0; iarg < _currentArgCount;) { - int equal_sign_index = data.indexOf('=', pos); - int next_arg_index = data.indexOf('&', pos); -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("pos "); - DEBUG_OUTPUT.print(pos); - DEBUG_OUTPUT.print("=@ "); - DEBUG_OUTPUT.print(equal_sign_index); - DEBUG_OUTPUT.print(" &@ "); - DEBUG_OUTPUT.println(next_arg_index); -#endif - if ((equal_sign_index == -1) || ((equal_sign_index > next_arg_index) && (next_arg_index != -1))) { -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("arg missing value: "); - DEBUG_OUTPUT.println(iarg); -#endif - if (next_arg_index == -1) - break; - pos = next_arg_index + 1; - continue; - } - RequestArgument& arg = _currentArgs[iarg]; - arg.key = urlDecode(data.substring(pos, equal_sign_index)); - arg.value = urlDecode(data.substring(equal_sign_index + 1, next_arg_index)); -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("arg "); - DEBUG_OUTPUT.print(iarg); - DEBUG_OUTPUT.print(" key: "); - DEBUG_OUTPUT.print(arg.key); - DEBUG_OUTPUT.print(" value: "); - DEBUG_OUTPUT.println(arg.value); -#endif - ++iarg; - if (next_arg_index == -1) - break; - pos = next_arg_index + 1; - } - _currentArgCount = iarg; -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("args count: "); - DEBUG_OUTPUT.println(_currentArgCount); -#endif - -} - -void ESP8266WebServer::_uploadWriteByte(uint8_t b){ - if (_currentUpload->currentSize == HTTP_UPLOAD_BUFLEN){ - if(_currentHandler && _currentHandler->canUpload(_currentUri)) - _currentHandler->upload(*this, _currentUri, *_currentUpload); - _currentUpload->totalSize += _currentUpload->currentSize; - _currentUpload->currentSize = 0; - } - _currentUpload->buf[_currentUpload->currentSize++] = b; -} - -uint8_t ESP8266WebServer::_uploadReadByte(WiFiClient& client){ - int res = client.read(); - if(res == -1){ - while(!client.available() && client.connected()) - yield(); - res = client.read(); - } - return (uint8_t)res; -} - -bool ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t len){ - (void) len; -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("Parse Form: Boundary: "); - DEBUG_OUTPUT.print(boundary); - DEBUG_OUTPUT.print(" Length: "); - DEBUG_OUTPUT.println(len); -#endif - String line; - int retry = 0; - do { - line = client.readStringUntil('\r'); - ++retry; - } while (line.length() == 0 && retry < 3); - - client.readStringUntil('\n'); - //start reading the form - if (line == ("--"+boundary)){ - RequestArgument* postArgs = new RequestArgument[32]; - int postArgsLen = 0; - while(1){ - String argName; - String argValue; - String argType; - String argFilename; - bool argIsFile = false; - - line = client.readStringUntil('\r'); - client.readStringUntil('\n'); - if (line.length() > 19 && line.substring(0, 19).equalsIgnoreCase(F("Content-Disposition"))){ - int nameStart = line.indexOf('='); - if (nameStart != -1){ - argName = line.substring(nameStart+2); - nameStart = argName.indexOf('='); - if (nameStart == -1){ - argName = argName.substring(0, argName.length() - 1); - } else { - argFilename = argName.substring(nameStart+2, argName.length() - 1); - argName = argName.substring(0, argName.indexOf('"')); - argIsFile = true; -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("PostArg FileName: "); - DEBUG_OUTPUT.println(argFilename); -#endif - //use GET to set the filename if uploading using blob - if (argFilename == F("blob") && hasArg(FPSTR(filename))) - argFilename = arg(FPSTR(filename)); - } -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("PostArg Name: "); - DEBUG_OUTPUT.println(argName); -#endif - using namespace mime; - argType = FPSTR(mimeTable[txt].mimeType); - line = client.readStringUntil('\r'); - client.readStringUntil('\n'); - if (line.length() > 12 && line.substring(0, 12).equalsIgnoreCase(FPSTR(Content_Type))){ - argType = line.substring(line.indexOf(':')+2); - //skip next line - client.readStringUntil('\r'); - client.readStringUntil('\n'); - } -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("PostArg Type: "); - DEBUG_OUTPUT.println(argType); -#endif - if (!argIsFile){ - while(1){ - line = client.readStringUntil('\r'); - client.readStringUntil('\n'); - if (line.startsWith("--"+boundary)) break; - if (argValue.length() > 0) argValue += "\n"; - argValue += line; - } -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("PostArg Value: "); - DEBUG_OUTPUT.println(argValue); - DEBUG_OUTPUT.println(); -#endif - - RequestArgument& arg = postArgs[postArgsLen++]; - arg.key = argName; - arg.value = argValue; - - if (line == ("--"+boundary+"--")){ -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.println("Done Parsing POST"); -#endif - break; - } - } else { - _currentUpload.reset(new HTTPUpload()); - _currentUpload->status = UPLOAD_FILE_START; - _currentUpload->name = argName; - _currentUpload->filename = argFilename; - _currentUpload->type = argType; - _currentUpload->totalSize = 0; - _currentUpload->currentSize = 0; -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("Start File: "); - DEBUG_OUTPUT.print(_currentUpload->filename); - DEBUG_OUTPUT.print(" Type: "); - DEBUG_OUTPUT.println(_currentUpload->type); -#endif - if(_currentHandler && _currentHandler->canUpload(_currentUri)) - _currentHandler->upload(*this, _currentUri, *_currentUpload); - _currentUpload->status = UPLOAD_FILE_WRITE; - uint8_t argByte = _uploadReadByte(client); -readfile: - while(argByte != 0x0D){ - if (!client.connected()) return _parseFormUploadAborted(); - _uploadWriteByte(argByte); - argByte = _uploadReadByte(client); - } - - argByte = _uploadReadByte(client); - if (!client.connected()) return _parseFormUploadAborted(); - if (argByte == 0x0A){ - argByte = _uploadReadByte(client); - if (!client.connected()) return _parseFormUploadAborted(); - if ((char)argByte != '-'){ - //continue reading the file - _uploadWriteByte(0x0D); - _uploadWriteByte(0x0A); - goto readfile; - } else { - argByte = _uploadReadByte(client); - if (!client.connected()) return _parseFormUploadAborted(); - if ((char)argByte != '-'){ - //continue reading the file - _uploadWriteByte(0x0D); - _uploadWriteByte(0x0A); - _uploadWriteByte((uint8_t)('-')); - goto readfile; - } - } - - uint8_t endBuf[boundary.length()]; - client.readBytes(endBuf, boundary.length()); - - if (strstr((const char*)endBuf, boundary.c_str()) != nullptr){ - if(_currentHandler && _currentHandler->canUpload(_currentUri)) - _currentHandler->upload(*this, _currentUri, *_currentUpload); - _currentUpload->totalSize += _currentUpload->currentSize; - _currentUpload->status = UPLOAD_FILE_END; - if(_currentHandler && _currentHandler->canUpload(_currentUri)) - _currentHandler->upload(*this, _currentUri, *_currentUpload); -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("End File: "); - DEBUG_OUTPUT.print(_currentUpload->filename); - DEBUG_OUTPUT.print(" Type: "); - DEBUG_OUTPUT.print(_currentUpload->type); - DEBUG_OUTPUT.print(" Size: "); - DEBUG_OUTPUT.println(_currentUpload->totalSize); -#endif - line = client.readStringUntil(0x0D); - client.readStringUntil(0x0A); - if (line == "--"){ -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.println("Done Parsing POST"); -#endif - break; - } - continue; - } else { - _uploadWriteByte(0x0D); - _uploadWriteByte(0x0A); - _uploadWriteByte((uint8_t)('-')); - _uploadWriteByte((uint8_t)('-')); - uint32_t i = 0; - while(i < boundary.length()){ - _uploadWriteByte(endBuf[i++]); - } - argByte = _uploadReadByte(client); - goto readfile; - } - } else { - _uploadWriteByte(0x0D); - goto readfile; - } - break; - } - } - } - } - - int iarg; - int totalArgs = ((32 - postArgsLen) < _currentArgCount)?(32 - postArgsLen):_currentArgCount; - for (iarg = 0; iarg < totalArgs; iarg++){ - RequestArgument& arg = postArgs[postArgsLen++]; - arg.key = _currentArgs[iarg].key; - arg.value = _currentArgs[iarg].value; - } - if (_currentArgs) delete[] _currentArgs; - _currentArgs = new RequestArgument[postArgsLen]; - for (iarg = 0; iarg < postArgsLen; iarg++){ - RequestArgument& arg = _currentArgs[iarg]; - arg.key = postArgs[iarg].key; - arg.value = postArgs[iarg].value; - } - _currentArgCount = iarg; - if (postArgs) - delete[] postArgs; - return true; - } -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.print("Error: line: "); - DEBUG_OUTPUT.println(line); -#endif - return false; -} - -String ESP8266WebServer::urlDecode(const String& text) -{ - String decoded = ""; - char temp[] = "0x00"; - unsigned int len = text.length(); - unsigned int i = 0; - while (i < len) - { - char decodedChar; - char encodedChar = text.charAt(i++); - if ((encodedChar == '%') && (i + 1 < len)) - { - temp[2] = text.charAt(i++); - temp[3] = text.charAt(i++); - - decodedChar = strtol(temp, NULL, 16); - } - else { - if (encodedChar == '+') - { - decodedChar = ' '; - } - else { - decodedChar = encodedChar; // normal ascii char - } - } - decoded += decodedChar; - } - return decoded; -} - -bool ESP8266WebServer::_parseFormUploadAborted(){ - _currentUpload->status = UPLOAD_FILE_ABORTED; - if(_currentHandler && _currentHandler->canUpload(_currentUri)) - _currentHandler->upload(*this, _currentUri, *_currentUpload); - return false; -} - +/* + Parsing.cpp - HTTP request parsing. + + Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Modified 8 May 2015 by Hristo Gochkov (proper post and file upload handling) +*/ + +// Use patched Parsing.cpp to fix ALEXA parsing issue in v2.4.2 +#include +#if defined(ARDUINO_ESP8266_RELEASE_2_4_2) +#warning **** Tasmota is using v2.4.2 patched Parsing.cpp as planned **** + +#include +#include "WiFiServer.h" +#include "WiFiClient.h" +#include "ESP8266WebServer.h" +#include "detail/mimetable.h" + +//#define DEBUG_ESP_HTTP_SERVER +#ifdef DEBUG_ESP_PORT +#define DEBUG_OUTPUT DEBUG_ESP_PORT +#else +#define DEBUG_OUTPUT Serial +#endif + +static const char Content_Type[] PROGMEM = "Content-Type"; +static const char filename[] PROGMEM = "filename"; + +static char* readBytesWithTimeout(WiFiClient& client, size_t maxLength, size_t& dataLength, int timeout_ms) +{ + char *buf = nullptr; + dataLength = 0; + while (dataLength < maxLength) { + int tries = timeout_ms; + size_t newLength; + while (!(newLength = client.available()) && tries--) delay(1); + if (!newLength) { + break; + } + if (!buf) { + buf = (char *) malloc(newLength + 1); + if (!buf) { + return nullptr; + } + } + else { + char* newBuf = (char *) realloc(buf, dataLength + newLength + 1); + if (!newBuf) { + free(buf); + return nullptr; + } + buf = newBuf; + } + client.readBytes(buf + dataLength, newLength); + dataLength += newLength; + buf[dataLength] = '\0'; + } + return buf; +} + +bool ESP8266WebServer::_parseRequest(WiFiClient& client) { + // Read the first line of HTTP request + String req = client.readStringUntil('\r'); + client.readStringUntil('\n'); + //reset header value + for (int i = 0; i < _headerKeysCount; ++i) { + _currentHeaders[i].value =String(); + } + + // First line of HTTP request looks like "GET /path HTTP/1.1" + // Retrieve the "/path" part by finding the spaces + int addr_start = req.indexOf(' '); + int addr_end = req.indexOf(' ', addr_start + 1); + if (addr_start == -1 || addr_end == -1) { +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("Invalid request: "); + DEBUG_OUTPUT.println(req); +#endif + return false; + } + + String methodStr = req.substring(0, addr_start); + String url = req.substring(addr_start + 1, addr_end); + String versionEnd = req.substring(addr_end + 8); + _currentVersion = atoi(versionEnd.c_str()); + String searchStr = ""; + int hasSearch = url.indexOf('?'); + if (hasSearch != -1){ + searchStr = url.substring(hasSearch + 1); + url = url.substring(0, hasSearch); + } + _currentUri = url; + _chunked = false; + + HTTPMethod method = HTTP_GET; + if (methodStr == F("POST")) { + method = HTTP_POST; + } else if (methodStr == F("DELETE")) { + method = HTTP_DELETE; + } else if (methodStr == F("OPTIONS")) { + method = HTTP_OPTIONS; + } else if (methodStr == F("PUT")) { + method = HTTP_PUT; + } else if (methodStr == F("PATCH")) { + method = HTTP_PATCH; + } + _currentMethod = method; + +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("method: "); + DEBUG_OUTPUT.print(methodStr); + DEBUG_OUTPUT.print(" url: "); + DEBUG_OUTPUT.print(url); + DEBUG_OUTPUT.print(" search: "); + DEBUG_OUTPUT.println(searchStr); +#endif + + //attach handler + RequestHandler* handler; + for (handler = _firstHandler; handler; handler = handler->next()) { + if (handler->canHandle(_currentMethod, _currentUri)) + break; + } + _currentHandler = handler; + + String formData; + // below is needed only when POST type request + if (method == HTTP_POST || method == HTTP_PUT || method == HTTP_PATCH || method == HTTP_DELETE){ + String boundaryStr; + String headerName; + String headerValue; + bool isForm = false; + bool isEncoded = false; + uint32_t contentLength = 0; + //parse headers + while(1){ + req = client.readStringUntil('\r'); + client.readStringUntil('\n'); + if (req == "") break;//no moar headers + int headerDiv = req.indexOf(':'); + if (headerDiv == -1){ + break; + } + headerName = req.substring(0, headerDiv); + headerValue = req.substring(headerDiv + 1); + headerValue.trim(); + _collectHeader(headerName.c_str(),headerValue.c_str()); + + #ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("headerName: "); + DEBUG_OUTPUT.println(headerName); + DEBUG_OUTPUT.print("headerValue: "); + DEBUG_OUTPUT.println(headerValue); + #endif + + if (headerName.equalsIgnoreCase(FPSTR(Content_Type))){ + using namespace mime; + if (headerValue.startsWith(FPSTR(mimeTable[txt].mimeType))){ + isForm = false; + } else if (headerValue.startsWith(F("application/x-www-form-urlencoded"))){ + isForm = false; + isEncoded = true; + } else if (headerValue.startsWith(F("multipart/"))){ + boundaryStr = headerValue.substring(headerValue.indexOf('=') + 1); + boundaryStr.replace("\"",""); + isForm = true; + } + } else if (headerName.equalsIgnoreCase(F("Content-Length"))){ + contentLength = headerValue.toInt(); + } else if (headerName.equalsIgnoreCase(F("Host"))){ + _hostHeader = headerValue; + } + } + + if (!isForm){ + size_t plainLength; + char* plainBuf = readBytesWithTimeout(client, contentLength, plainLength, HTTP_MAX_POST_WAIT); + if (plainLength < contentLength) { + free(plainBuf); + return false; + } + if (contentLength > 0) { + if(isEncoded){ + //url encoded form + if (searchStr != "") searchStr += '&'; + searchStr += plainBuf; + } + _parseArguments(searchStr); + if(!isEncoded||(0==_currentArgCount)){ // @20180124OF01: Workarround for Alexa Bug + //plain post json or other data + RequestArgument& arg = _currentArgs[_currentArgCount++]; + arg.key = F("plain"); + arg.value = String(plainBuf); + } + + #ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("Plain: "); + DEBUG_OUTPUT.println(plainBuf); + #endif + free(plainBuf); + } else { + // No content - but we can still have arguments in the URL. + _parseArguments(searchStr); + } + } + + if (isForm){ + _parseArguments(searchStr); + if (!_parseForm(client, boundaryStr, contentLength)) { + return false; + } + } + } else { + String headerName; + String headerValue; + //parse headers + while(1){ + req = client.readStringUntil('\r'); + client.readStringUntil('\n'); + if (req == "") break;//no moar headers + int headerDiv = req.indexOf(':'); + if (headerDiv == -1){ + break; + } + headerName = req.substring(0, headerDiv); + headerValue = req.substring(headerDiv + 2); + _collectHeader(headerName.c_str(),headerValue.c_str()); + + #ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("headerName: "); + DEBUG_OUTPUT.println(headerName); + DEBUG_OUTPUT.print("headerValue: "); + DEBUG_OUTPUT.println(headerValue); + #endif + + if (headerName.equalsIgnoreCase("Host")){ + _hostHeader = headerValue; + } + } + _parseArguments(searchStr); + } + client.flush(); + +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("Request: "); + DEBUG_OUTPUT.println(url); + DEBUG_OUTPUT.print(" Arguments: "); + DEBUG_OUTPUT.println(searchStr); +#endif + + return true; +} + +bool ESP8266WebServer::_collectHeader(const char* headerName, const char* headerValue) { + for (int i = 0; i < _headerKeysCount; i++) { + if (_currentHeaders[i].key.equalsIgnoreCase(headerName)) { + _currentHeaders[i].value=headerValue; + return true; + } + } + return false; +} + +void ESP8266WebServer::_parseArguments(String data) { +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("args: "); + DEBUG_OUTPUT.println(data); +#endif + if (_currentArgs) + delete[] _currentArgs; + _currentArgs = 0; + if (data.length() == 0) { + _currentArgCount = 0; + _currentArgs = new RequestArgument[1]; + return; + } + _currentArgCount = 1; + + for (int i = 0; i < (int)data.length(); ) { + i = data.indexOf('&', i); + if (i == -1) + break; + ++i; + ++_currentArgCount; + } +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("args count: "); + DEBUG_OUTPUT.println(_currentArgCount); +#endif + + _currentArgs = new RequestArgument[_currentArgCount+1]; + int pos = 0; + int iarg; + for (iarg = 0; iarg < _currentArgCount;) { + int equal_sign_index = data.indexOf('=', pos); + int next_arg_index = data.indexOf('&', pos); +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("pos "); + DEBUG_OUTPUT.print(pos); + DEBUG_OUTPUT.print("=@ "); + DEBUG_OUTPUT.print(equal_sign_index); + DEBUG_OUTPUT.print(" &@ "); + DEBUG_OUTPUT.println(next_arg_index); +#endif + if ((equal_sign_index == -1) || ((equal_sign_index > next_arg_index) && (next_arg_index != -1))) { +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("arg missing value: "); + DEBUG_OUTPUT.println(iarg); +#endif + if (next_arg_index == -1) + break; + pos = next_arg_index + 1; + continue; + } + RequestArgument& arg = _currentArgs[iarg]; + arg.key = urlDecode(data.substring(pos, equal_sign_index)); + arg.value = urlDecode(data.substring(equal_sign_index + 1, next_arg_index)); +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("arg "); + DEBUG_OUTPUT.print(iarg); + DEBUG_OUTPUT.print(" key: "); + DEBUG_OUTPUT.print(arg.key); + DEBUG_OUTPUT.print(" value: "); + DEBUG_OUTPUT.println(arg.value); +#endif + ++iarg; + if (next_arg_index == -1) + break; + pos = next_arg_index + 1; + } + _currentArgCount = iarg; +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("args count: "); + DEBUG_OUTPUT.println(_currentArgCount); +#endif + +} + +void ESP8266WebServer::_uploadWriteByte(uint8_t b){ + if (_currentUpload->currentSize == HTTP_UPLOAD_BUFLEN){ + if(_currentHandler && _currentHandler->canUpload(_currentUri)) + _currentHandler->upload(*this, _currentUri, *_currentUpload); + _currentUpload->totalSize += _currentUpload->currentSize; + _currentUpload->currentSize = 0; + } + _currentUpload->buf[_currentUpload->currentSize++] = b; +} + +uint8_t ESP8266WebServer::_uploadReadByte(WiFiClient& client){ + int res = client.read(); + if(res == -1){ + while(!client.available() && client.connected()) + yield(); + res = client.read(); + } + return (uint8_t)res; +} + +bool ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t len){ + (void) len; +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("Parse Form: Boundary: "); + DEBUG_OUTPUT.print(boundary); + DEBUG_OUTPUT.print(" Length: "); + DEBUG_OUTPUT.println(len); +#endif + String line; + int retry = 0; + do { + line = client.readStringUntil('\r'); + ++retry; + } while (line.length() == 0 && retry < 3); + + client.readStringUntil('\n'); + //start reading the form + if (line == ("--"+boundary)){ + RequestArgument* postArgs = new RequestArgument[32]; + int postArgsLen = 0; + while(1){ + String argName; + String argValue; + String argType; + String argFilename; + bool argIsFile = false; + + line = client.readStringUntil('\r'); + client.readStringUntil('\n'); + if (line.length() > 19 && line.substring(0, 19).equalsIgnoreCase(F("Content-Disposition"))){ + int nameStart = line.indexOf('='); + if (nameStart != -1){ + argName = line.substring(nameStart+2); + nameStart = argName.indexOf('='); + if (nameStart == -1){ + argName = argName.substring(0, argName.length() - 1); + } else { + argFilename = argName.substring(nameStart+2, argName.length() - 1); + argName = argName.substring(0, argName.indexOf('"')); + argIsFile = true; +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("PostArg FileName: "); + DEBUG_OUTPUT.println(argFilename); +#endif + //use GET to set the filename if uploading using blob + if (argFilename == F("blob") && hasArg(FPSTR(filename))) + argFilename = arg(FPSTR(filename)); + } +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("PostArg Name: "); + DEBUG_OUTPUT.println(argName); +#endif + using namespace mime; + argType = FPSTR(mimeTable[txt].mimeType); + line = client.readStringUntil('\r'); + client.readStringUntil('\n'); + if (line.length() > 12 && line.substring(0, 12).equalsIgnoreCase(FPSTR(Content_Type))){ + argType = line.substring(line.indexOf(':')+2); + //skip next line + client.readStringUntil('\r'); + client.readStringUntil('\n'); + } +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("PostArg Type: "); + DEBUG_OUTPUT.println(argType); +#endif + if (!argIsFile){ + while(1){ + line = client.readStringUntil('\r'); + client.readStringUntil('\n'); + if (line.startsWith("--"+boundary)) break; + if (argValue.length() > 0) argValue += "\n"; + argValue += line; + } +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("PostArg Value: "); + DEBUG_OUTPUT.println(argValue); + DEBUG_OUTPUT.println(); +#endif + + RequestArgument& arg = postArgs[postArgsLen++]; + arg.key = argName; + arg.value = argValue; + + if (line == ("--"+boundary+"--")){ +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.println("Done Parsing POST"); +#endif + break; + } + } else { + _currentUpload.reset(new HTTPUpload()); + _currentUpload->status = UPLOAD_FILE_START; + _currentUpload->name = argName; + _currentUpload->filename = argFilename; + _currentUpload->type = argType; + _currentUpload->totalSize = 0; + _currentUpload->currentSize = 0; +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("Start File: "); + DEBUG_OUTPUT.print(_currentUpload->filename); + DEBUG_OUTPUT.print(" Type: "); + DEBUG_OUTPUT.println(_currentUpload->type); +#endif + if(_currentHandler && _currentHandler->canUpload(_currentUri)) + _currentHandler->upload(*this, _currentUri, *_currentUpload); + _currentUpload->status = UPLOAD_FILE_WRITE; + uint8_t argByte = _uploadReadByte(client); +readfile: + while(argByte != 0x0D){ + if (!client.connected()) return _parseFormUploadAborted(); + _uploadWriteByte(argByte); + argByte = _uploadReadByte(client); + } + + argByte = _uploadReadByte(client); + if (!client.connected()) return _parseFormUploadAborted(); + if (argByte == 0x0A){ + argByte = _uploadReadByte(client); + if (!client.connected()) return _parseFormUploadAborted(); + if ((char)argByte != '-'){ + //continue reading the file + _uploadWriteByte(0x0D); + _uploadWriteByte(0x0A); + goto readfile; + } else { + argByte = _uploadReadByte(client); + if (!client.connected()) return _parseFormUploadAborted(); + if ((char)argByte != '-'){ + //continue reading the file + _uploadWriteByte(0x0D); + _uploadWriteByte(0x0A); + _uploadWriteByte((uint8_t)('-')); + goto readfile; + } + } + + uint8_t endBuf[boundary.length()]; + client.readBytes(endBuf, boundary.length()); + + if (strstr((const char*)endBuf, boundary.c_str()) != nullptr){ + if(_currentHandler && _currentHandler->canUpload(_currentUri)) + _currentHandler->upload(*this, _currentUri, *_currentUpload); + _currentUpload->totalSize += _currentUpload->currentSize; + _currentUpload->status = UPLOAD_FILE_END; + if(_currentHandler && _currentHandler->canUpload(_currentUri)) + _currentHandler->upload(*this, _currentUri, *_currentUpload); +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("End File: "); + DEBUG_OUTPUT.print(_currentUpload->filename); + DEBUG_OUTPUT.print(" Type: "); + DEBUG_OUTPUT.print(_currentUpload->type); + DEBUG_OUTPUT.print(" Size: "); + DEBUG_OUTPUT.println(_currentUpload->totalSize); +#endif + line = client.readStringUntil(0x0D); + client.readStringUntil(0x0A); + if (line == "--"){ +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.println("Done Parsing POST"); +#endif + break; + } + continue; + } else { + _uploadWriteByte(0x0D); + _uploadWriteByte(0x0A); + _uploadWriteByte((uint8_t)('-')); + _uploadWriteByte((uint8_t)('-')); + uint32_t i = 0; + while(i < boundary.length()){ + _uploadWriteByte(endBuf[i++]); + } + argByte = _uploadReadByte(client); + goto readfile; + } + } else { + _uploadWriteByte(0x0D); + goto readfile; + } + break; + } + } + } + } + + int iarg; + int totalArgs = ((32 - postArgsLen) < _currentArgCount)?(32 - postArgsLen):_currentArgCount; + for (iarg = 0; iarg < totalArgs; iarg++){ + RequestArgument& arg = postArgs[postArgsLen++]; + arg.key = _currentArgs[iarg].key; + arg.value = _currentArgs[iarg].value; + } + if (_currentArgs) delete[] _currentArgs; + _currentArgs = new RequestArgument[postArgsLen]; + for (iarg = 0; iarg < postArgsLen; iarg++){ + RequestArgument& arg = _currentArgs[iarg]; + arg.key = postArgs[iarg].key; + arg.value = postArgs[iarg].value; + } + _currentArgCount = iarg; + if (postArgs) + delete[] postArgs; + return true; + } +#ifdef DEBUG_ESP_HTTP_SERVER + DEBUG_OUTPUT.print("Error: line: "); + DEBUG_OUTPUT.println(line); +#endif + return false; +} + +String ESP8266WebServer::urlDecode(const String& text) +{ + String decoded = ""; + char temp[] = "0x00"; + unsigned int len = text.length(); + unsigned int i = 0; + while (i < len) + { + char decodedChar; + char encodedChar = text.charAt(i++); + if ((encodedChar == '%') && (i + 1 < len)) + { + temp[2] = text.charAt(i++); + temp[3] = text.charAt(i++); + + decodedChar = strtol(temp, NULL, 16); + } + else { + if (encodedChar == '+') + { + decodedChar = ' '; + } + else { + decodedChar = encodedChar; // normal ascii char + } + } + decoded += decodedChar; + } + return decoded; +} + +bool ESP8266WebServer::_parseFormUploadAborted(){ + _currentUpload->status = UPLOAD_FILE_ABORTED; + if(_currentHandler && _currentHandler->canUpload(_currentUri)) + _currentHandler->upload(*this, _currentUri, *_currentUpload); + return false; +} + #endif // ARDUINO_ESP8266_RELEASE \ No newline at end of file diff --git a/sonoff/StackThunk_light.cpp b/tasmota/StackThunk_light.cpp similarity index 100% rename from sonoff/StackThunk_light.cpp rename to tasmota/StackThunk_light.cpp diff --git a/sonoff/StackThunk_light.h b/tasmota/StackThunk_light.h similarity index 100% rename from sonoff/StackThunk_light.h rename to tasmota/StackThunk_light.h diff --git a/sonoff/WiFiClientSecureLightBearSSL.cpp b/tasmota/WiFiClientSecureLightBearSSL.cpp similarity index 100% rename from sonoff/WiFiClientSecureLightBearSSL.cpp rename to tasmota/WiFiClientSecureLightBearSSL.cpp diff --git a/sonoff/WiFiClientSecureLightBearSSL.h b/tasmota/WiFiClientSecureLightBearSSL.h similarity index 100% rename from sonoff/WiFiClientSecureLightBearSSL.h rename to tasmota/WiFiClientSecureLightBearSSL.h diff --git a/sonoff/_changelog.ino b/tasmota/_changelog.ino similarity index 99% rename from sonoff/_changelog.ino rename to tasmota/_changelog.ino index 02591fac0..33d77decc 100644 --- a/sonoff/_changelog.ino +++ b/tasmota/_changelog.ino @@ -233,7 +233,7 @@ * Add command SetOption64 0/1 to switch between "-" or "_" as sensor index separator impacting DS18X20, DHT, BMP and SHT3X sensor names (#5689) * Add command SetOption65 0/1 and more Tuya Serial based device support (#5815) * Add command WebColor to change GUI colors on the fly - * Add support for AWS IoT with TLS 1.2 on core 2.4.2 and up. Full doc here: https://github.com/arendst/Sonoff-Tasmota/wiki/AWS-IoT + * Add support for AWS IoT with TLS 1.2 on core 2.4.2 and up. Full doc here: https://github.com/arendst/Tasmota/wiki/AWS-IoT * Add support for Badger HR-E Water Meter (#5539) * Add support for Shelly 2.5 Energy and overtemp Monitoring (#5592) * Add support for color and colortone for Philips Hue emulation via Alexa (#5600 #4809) @@ -583,7 +583,7 @@ * Revert sonoff-minimal removals causing failure of wifi connection (#3177) * * 6.1.0 20180706 - * Remove version 3, 4 and pre 5.2 settings auto-upgrade. See https://github.com/arendst/Sonoff-Tasmota/wiki/Upgrade#migration-path + * Remove version 3, 4 and pre 5.2 settings auto-upgrade. See https://github.com/arendst/Tasmota/wiki/Upgrade#migration-path * Change default CFG_HOLDER from 0x20161209 to 4617 (=0x1209) - no impact on default upgrades * Change number of supported switches from 4 to 8 (#2885, #3086) * Change BME680 driver from Adafruit to Bosch BME680 library (#2969) @@ -1175,7 +1175,7 @@ * 5.0.5 20170508 * Add command FullTopic with tokens %topic% (replaced by command Topic value) and * %prefix% (replaced by command Prefix values) for more flexible topic definitions (#244) - * See wiki > MQTT Features https://github.com/arendst/Sonoff-Tasmota/wiki/MQTT-Features for more information + * See wiki > MQTT Features https://github.com/arendst/Tasmota/wiki/MQTT-Features for more information * * 5.0.4 20170505 * Add Sonoff Pow Energy Total up to 40 MWh diff --git a/sonoff/core_esp8266_timer.c b/tasmota/core_esp8266_timer.c similarity index 100% rename from sonoff/core_esp8266_timer.c rename to tasmota/core_esp8266_timer.c diff --git a/sonoff/core_esp8266_wiring_digital.c b/tasmota/core_esp8266_wiring_digital.c similarity index 100% rename from sonoff/core_esp8266_wiring_digital.c rename to tasmota/core_esp8266_wiring_digital.c diff --git a/sonoff/core_esp8266_wiring_pwm.c b/tasmota/core_esp8266_wiring_pwm.c similarity index 100% rename from sonoff/core_esp8266_wiring_pwm.c rename to tasmota/core_esp8266_wiring_pwm.c diff --git a/sonoff/i18n.h b/tasmota/i18n.h similarity index 100% rename from sonoff/i18n.h rename to tasmota/i18n.h diff --git a/sonoff/language/bg-BG.h b/tasmota/language/bg-BG.h similarity index 100% rename from sonoff/language/bg-BG.h rename to tasmota/language/bg-BG.h diff --git a/sonoff/language/cs-CZ.h b/tasmota/language/cs-CZ.h similarity index 100% rename from sonoff/language/cs-CZ.h rename to tasmota/language/cs-CZ.h diff --git a/sonoff/language/de-DE.h b/tasmota/language/de-DE.h similarity index 100% rename from sonoff/language/de-DE.h rename to tasmota/language/de-DE.h diff --git a/sonoff/language/el-GR.h b/tasmota/language/el-GR.h similarity index 100% rename from sonoff/language/el-GR.h rename to tasmota/language/el-GR.h diff --git a/sonoff/language/en-GB.h b/tasmota/language/en-GB.h similarity index 100% rename from sonoff/language/en-GB.h rename to tasmota/language/en-GB.h diff --git a/sonoff/language/es-ES.h b/tasmota/language/es-ES.h similarity index 100% rename from sonoff/language/es-ES.h rename to tasmota/language/es-ES.h diff --git a/sonoff/language/fr-FR.h b/tasmota/language/fr-FR.h similarity index 100% rename from sonoff/language/fr-FR.h rename to tasmota/language/fr-FR.h diff --git a/sonoff/language/he-HE.h b/tasmota/language/he-HE.h similarity index 100% rename from sonoff/language/he-HE.h rename to tasmota/language/he-HE.h diff --git a/sonoff/language/hu-HU.h b/tasmota/language/hu-HU.h similarity index 100% rename from sonoff/language/hu-HU.h rename to tasmota/language/hu-HU.h diff --git a/sonoff/language/it-IT.h b/tasmota/language/it-IT.h similarity index 100% rename from sonoff/language/it-IT.h rename to tasmota/language/it-IT.h diff --git a/sonoff/language/ko-KO.h b/tasmota/language/ko-KO.h similarity index 97% rename from sonoff/language/ko-KO.h rename to tasmota/language/ko-KO.h index 82832fdbb..ffe507144 100644 --- a/sonoff/language/ko-KO.h +++ b/tasmota/language/ko-KO.h @@ -1,727 +1,727 @@ -/* - ko-KO.h - localization for Korean - Korean for Tasmota - - Copyright (C) 2019 Theo Arends (translated by NyaamZ) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _LANGUAGE_KO_KO_H_ -#define _LANGUAGE_KO_KO_H_ - -/*************************** ATTENTION *******************************\ - * - * Due to memory constraints only UTF-8 is supported. - * To save code space keep text as short as possible. - * Time and Date provided by SDK can not be localized (yet). - * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. - * Use online command Prefix to translate cmnd, stat and tele. - * - * Updated until v6.2.1.11 -\*********************************************************************/ - -//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) -// https://www.science.co.il/language/Locale-codes.php -#define LANGUAGE_LCID 1042 -// HTML (ISO 639-1) Language Code -#define D_HTML_LANGUAGE "ko" - -// "2017-03-07T11:08:02" - ISO8601:2004 -#define D_YEAR_MONTH_SEPARATOR "-" -#define D_MONTH_DAY_SEPARATOR "-" -#define D_DATE_TIME_SEPARATOR "T" -#define D_HOUR_MINUTE_SEPARATOR ":" -#define D_MINUTE_SECOND_SEPARATOR ":" - -#define D_DAY3LIST "일 월 화 수 목 금 토 " -#define D_MONTH3LIST "1월 2월 3월 4월 5월 6월 7월 8월 9월 10월11월12월" - -// Non JSON decimal separator -#define D_DECIMAL_SEPARATOR "." - -// Common -#define D_ADMIN "Admin" -#define D_AIR_QUALITY "공기질" -#define D_AP "AP" // Access Point -#define D_AS "as" -#define D_AUTO "자동" -#define D_BLINK "깜박임" -#define D_BLINKOFF "깜박임 끄기" -#define D_BOOT_COUNT "가동횟수" -#define D_BRIGHTLIGHT "밝기" -#define D_BSSID "BSSId" -#define D_BUTTON "버튼" -#define D_BY "by" // Written by me -#define D_BYTES "Bytes" -#define D_CELSIUS "섭씨" -#define D_CHANNEL "채널" -#define D_CO2 "이산화탄소" -#define D_CODE "코드" // Button code -#define D_COLDLIGHT "차갑게" -#define D_COMMAND "명령" -#define D_CONNECTED "연결됨" -#define D_COUNT "횟수" -#define D_COUNTER "Counter" -#define D_CURRENT "전류" // As in Voltage and Current -#define D_DATA "데이터" -#define D_DARKLIGHT "어둡게" -#define D_DEBUG "디버그" -#define D_DISABLED "사용 불가" -#define D_DISTANCE "거리" -#define D_DNS_SERVER "DNS 서버" -#define D_DONE "완료" -#define D_DST_TIME "DST" -#define D_ECO2 "eCO2" -#define D_EMULATION "에뮬레이션" -#define D_ENABLED "사용 가능" -#define D_ERASE "삭제" -#define D_ERROR "에러" -#define D_FAHRENHEIT "화씨" -#define D_FAILED "실패" -#define D_FALLBACK "Fallback" -#define D_FALLBACK_TOPIC "Fallback Topic" -#define D_FALSE "거짓" -#define D_FILE "파일" -#define D_FLOW_RATE "Flow rate" -#define D_FREE_MEMORY "남은 메모리" -#define D_FREQUENCY "빈도" -#define D_GAS "가스" -#define D_GATEWAY "게이트웨이" -#define D_GROUP "그룹" -#define D_HOST "호스트" -#define D_HOSTNAME "호스트이름" -#define D_HUMIDITY "습도" -#define D_ILLUMINANCE "조도" -#define D_IMMEDIATE "immediate" // Button immediate -#define D_INDEX "인덱스" -#define D_INFO "정보" -#define D_INFRARED "적외선" -#define D_INITIALIZED "초기화 완료" -#define D_IP_ADDRESS "IP 주소" -#define D_LIGHT "밝게" -#define D_LWT "LWT" -#define D_MODULE "모듈" -#define D_MQTT "MQTT" -#define D_MULTI_PRESS "multi-press" -#define D_NOISE "소음" -#define D_NONE "없음" -#define D_OFF "꺼짐" -#define D_OFFLINE "오프라인" -#define D_OK "Ok" -#define D_ON "켜짐" -#define D_ONLINE "온라인" -#define D_PASSWORD "비밀번호" -#define D_PORT "포트" -#define D_POWER_FACTOR "Power Factor" -#define D_POWERUSAGE "전원" -#define D_POWERUSAGE_ACTIVE "Active Power" -#define D_POWERUSAGE_APPARENT "Apparent Power" -#define D_POWERUSAGE_REACTIVE "Reactive Power" -#define D_PRESSURE "기압" -#define D_PRESSUREATSEALEVEL "해수면기압" -#define D_PROGRAM_FLASH_SIZE "플래시 용량" -#define D_PROGRAM_SIZE "프로그램 용량" -#define D_PROJECT "프로젝트" -#define D_RAIN "비" -#define D_RECEIVED "받음" -#define D_RESTART "재시작" -#define D_RESTARTING "재시작 중" -#define D_RESTART_REASON "재시작 이유" -#define D_RESTORE "복구" -#define D_RETAINED "보류" -#define D_RULE "규칙" -#define D_SAVE "저장" -#define D_SENSOR "센서" -#define D_SSID "SSId" -#define D_START "시작" -#define D_STD_TIME "STD" -#define D_STOP "정지" -#define D_SUBNET_MASK "서브넷 마스크" -#define D_SUBSCRIBE_TO "구독" -#define D_UNSUBSCRIBE_FROM "구독 해제" -#define D_SUCCESSFUL "성공" -#define D_SUNRISE "일출" -#define D_SUNSET "일몰" -#define D_TEMPERATURE "온도" -#define D_TO "to" -#define D_TOGGLE "전환" -#define D_TOPIC "Topic" -#define D_TOTAL_USAGE "Total Usage" -#define D_TRANSMIT "전송" -#define D_TRUE "참" -#define D_TVOC "TVOC" -#define D_UPGRADE "업그레이드" -#define D_UPLOAD "업로드" -#define D_UPTIME "가동시간" -#define D_USER "User" -#define D_UTC_TIME "UTC" -#define D_UV_INDEX "UV 색인" -#define D_UV_INDEX_1 "낮음" -#define D_UV_INDEX_2 "보통" -#define D_UV_INDEX_3 "높음" -#define D_UV_INDEX_4 "위험" -#define D_UV_INDEX_5 "BurnL1/2" -#define D_UV_INDEX_6 "BurnL3" -#define D_UV_INDEX_7 "OoR" // Out of Range -#define D_UV_LEVEL "UV 레벨" -#define D_UV_POWER "UV 파워" -#define D_VERSION "버전" -#define D_VOLTAGE "전압" -#define D_WEIGHT "무게" -#define D_WARMLIGHT "따뜻하게" -#define D_WEB_SERVER "웹 서버" - -// sonoff.ino -#define D_WARNING_MINIMAL_VERSION "경고: 이 버전은 영구 설정을 지원하지 않습니다" -#define D_LEVEL_10 "level 1-0" -#define D_LEVEL_01 "level 0-1" -#define D_SERIAL_LOGGING_DISABLED "Serial log 사용 안함" -#define D_SYSLOG_LOGGING_REENABLED "Syslog log 다시 사용" - -#define D_SET_BAUDRATE_TO "Set Baudrate to" -#define D_RECEIVED_TOPIC "Received Topic" -#define D_DATA_SIZE "데이터 용량" -#define D_ANALOG_INPUT "아날로그" - -// support.ino -#define D_OSWATCH "osWatch" -#define D_BLOCKED_LOOP "Blocked Loop" -#define D_WPS_FAILED_WITH_STATUS "WPS설정 실패" -#define D_ACTIVE_FOR_3_MINUTES "3분동안 활성화" -#define D_FAILED_TO_START "시작 실패" -#define D_PATCH_ISSUE_2186 "Patch issue 2186" -#define D_CONNECTING_TO_AP "AP에 연결 중" -#define D_IN_MODE "in mode" -#define D_CONNECT_FAILED_NO_IP_ADDRESS "IP 주소가 수신되지 않아 연결이 실패했습니다" -#define D_CONNECT_FAILED_AP_NOT_REACHED "연결이 닿지 않아 AP에 연결할 수 없습니다" -#define D_CONNECT_FAILED_WRONG_PASSWORD "비밀번호가 틀려 AP에 연결할 수 없습니다" -#define D_CONNECT_FAILED_AP_TIMEOUT "시간초과로 AP에 연결할 수 없습니다" -#define D_ATTEMPTING_CONNECTION "연결 시도 중..." -#define D_CHECKING_CONNECTION "연결 체크 중..." -#define D_QUERY_DONE "쿼리 완료. MQTT 서비스 발견" -#define D_MQTT_SERVICE_FOUND "MQTT 서비스 발견" -#define D_FOUND_AT "다음에서 발견" -#define D_SYSLOG_HOST_NOT_FOUND "Syslog 호스트가 발견되지 않았습니다" - -// settings.ino -#define D_SAVED_TO_FLASH_AT "플래시에 저장" -#define D_LOADED_FROM_FLASH_AT "플래시에서 로드" -#define D_USE_DEFAULTS "디폴트 사용" -#define D_ERASED_SECTOR "삭제된 섹터" - -// xdrv_02_webserver.ino -#define D_NOSCRIPT "Tasmota를 사용하려면 JavaScript를 활성화 하십시오." -#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware
업그레이드가 필요합니다" -#define D_WEBSERVER_ACTIVE_ON "Web 서버 작동 중" -#define D_WITH_IP_ADDRESS "IP 주소" -#define D_WEBSERVER_STOPPED "Web 서버 멈춤" -#define D_FILE_NOT_FOUND "파일을 찾을 수 없습니다" -#define D_REDIRECTED "인증 페이지로 리디렉션" -#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "와이파이 매니저가 AccessPoint와 keep Station을 설정" -#define D_WIFIMANAGER_SET_ACCESSPOINT "와이파이 매니저가 AccessPoint를 설정" -#define D_TRYING_TO_CONNECT "장치를 네트워크에 연결하려고 시도 중" - -#define D_RESTART_IN "재시작" -#define D_SECONDS "초" -#define D_DEVICE_WILL_RESTART "이 장치는 몇 초 후 재시작됩니다" -#define D_BUTTON_TOGGLE "켜기/끄기" -#define D_CONFIGURATION "설정" -#define D_INFORMATION "정보" -#define D_FIRMWARE_UPGRADE "펌웨어 업그레이드" -#define D_CONSOLE "콘솔" -#define D_CONFIRM_RESTART "재시작" - -#define D_CONFIGURE_MODULE "모듈 설정" -#define D_CONFIGURE_WIFI "WiFi 설정" -#define D_CONFIGURE_MQTT "MQTT 설정" -#define D_CONFIGURE_DOMOTICZ "Domoticz 설정" -#define D_CONFIGURE_LOGGING "로그 설정" -#define D_CONFIGURE_OTHER "기타 설정" -#define D_CONFIRM_RESET_CONFIGURATION "설정 초기화 확인" -#define D_RESET_CONFIGURATION "설정 초기화" -#define D_BACKUP_CONFIGURATION "백업 설정" -#define D_RESTORE_CONFIGURATION "복원 설정" -#define D_MAIN_MENU "메인 메뉴" - -#define D_MODULE_PARAMETERS "모듈 상세" -#define D_MODULE_TYPE "모듈 타입" -#define D_PULLUP_ENABLE "No Button/Switch pull-up" -#define D_ADC "ADC" -#define D_GPIO "GPIO" -#define D_SERIAL_IN "Serial In" -#define D_SERIAL_OUT "Serial Out" - -#define D_WIFI_PARAMETERS "Wifi 상세" -#define D_SCAN_FOR_WIFI_NETWORKS "Wifi 네트워크를 검색 중" -#define D_SCAN_DONE "검색 완료" -#define D_NO_NETWORKS_FOUND "발견된 네트워크가 없습니다" -#define D_REFRESH_TO_SCAN_AGAIN "검색 재시도" -#define D_DUPLICATE_ACCESSPOINT "중복된 AccessPoint" -#define D_SKIPPING_LOW_QUALITY "약한 네트워크 신호 무시" -#define D_RSSI "RSSI" -#define D_WEP "WEP" -#define D_WPA_PSK "WPA PSK" -#define D_WPA2_PSK "WPA2 PSK" -#define D_AP1_SSID "AP1 SSId" -#define D_AP1_PASSWORD "AP1 비밀번호" -#define D_AP2_SSID "AP2 SSId" -#define D_AP2_PASSWORD "AP2 비밀번호" - -#define D_MQTT_PARAMETERS "MQTT 상세" -#define D_CLIENT "클라이언트" -#define D_FULL_TOPIC "Full Topic" - -#define D_LOGGING_PARAMETERS "로그 상세" -#define D_SERIAL_LOG_LEVEL "시리얼 로그 레벨" -#define D_MQTT_LOG_LEVEL "Mqtt log level" -#define D_WEB_LOG_LEVEL "Web 로그 레벨" -#define D_SYS_LOG_LEVEL "Syslog 로그 레벨" -#define D_MORE_DEBUG "More debug" -#define D_SYSLOG_HOST "Syslog 호스트" -#define D_SYSLOG_PORT "Syslog 포트" -#define D_TELEMETRY_PERIOD "보고 주기" - -#define D_OTHER_PARAMETERS "기타 상세" -#define D_TEMPLATE "템플릿" -#define D_ACTIVATE "활성" -#define D_WEB_ADMIN_PASSWORD "Web Admin 비밀번호" -#define D_MQTT_ENABLE "MQTT 사용" -#define D_FRIENDLY_NAME "별칭" -#define D_BELKIN_WEMO "Belkin WeMo" -#define D_HUE_BRIDGE "Hue Bridge" -#define D_SINGLE_DEVICE "single device" -#define D_MULTI_DEVICE "multi device" - -#define D_CONFIGURE_TEMPLATE "템플릿 설정" -#define D_TEMPLATE_PARAMETERS "템플릿 상세" -#define D_TEMPLATE_NAME "이름" -#define D_BASE_TYPE "Based on" -#define D_TEMPLATE_FLAGS "옵션" - -#define D_SAVE_CONFIGURATION "설정 저장" -#define D_CONFIGURATION_SAVED "설정 저장 완료" -#define D_CONFIGURATION_RESET "설정 초기화" - -#define D_PROGRAM_VERSION "프로그램 버전" -#define D_BUILD_DATE_AND_TIME "빌드 날짜" -#define D_CORE_AND_SDK_VERSION "Core/SDK 버전" -#define D_FLASH_WRITE_COUNT "플래시 쓰기 횟수" -#define D_MAC_ADDRESS "MAC 주소" -#define D_MQTT_HOST "MQTT 호스트" -#define D_MQTT_PORT "MQTT 포트" -#define D_MQTT_CLIENT "MQTT 클라이언트" -#define D_MQTT_USER "MQTT 아이디" -#define D_MQTT_TOPIC "MQTT Topic" -#define D_MQTT_GROUP_TOPIC "MQTT Group Topic" -#define D_MQTT_FULL_TOPIC "MQTT Full Topic" -#define D_MDNS_DISCOVERY "mDNS Discovery" -#define D_MDNS_ADVERTISE "mDNS Advertise" -#define D_ESP_CHIP_ID "ESP Chip Id" -#define D_FLASH_CHIP_ID "Flash Chip Id" -#define D_FLASH_CHIP_SIZE "Flash 용량" -#define D_FREE_PROGRAM_SPACE "여유 프로그램 공간" - -#define D_UPGRADE_BY_WEBSERVER "웹 서버에서 업그레이드" -#define D_OTA_URL "OTA Url" -#define D_START_UPGRADE "업그레이드 시작" -#define D_UPGRADE_BY_FILE_UPLOAD "업로드 된 파일로 업그레이드" -#define D_UPLOAD_STARTED "업로드 시작됨" -#define D_UPGRADE_STARTED "업그레이드 시작됨" -#define D_UPLOAD_DONE "업그레이드 완료" -#define D_UPLOAD_ERR_1 "파일이 선택되지 않았습니다" -#define D_UPLOAD_ERR_2 "용량이 충분하지 않습니다" -#define D_UPLOAD_ERR_3 "Magic 바이트가 0xE9가 아닙니다" -#define D_UPLOAD_ERR_4 "플래시 프로그램이 실제 플래시 용량보다 큽니다" -#define D_UPLOAD_ERR_5 "업로드 버퍼가 일치하지 않습니다" -#define D_UPLOAD_ERR_6 "업로드 실패. 로그 3 사용" -#define D_UPLOAD_ERR_7 "업로드 중단" -#define D_UPLOAD_ERR_8 "파일이 유효하지 않습니다" -#define D_UPLOAD_ERR_9 "용량이 초과되었습니다" -#define D_UPLOAD_ERR_10 "RF chip 초기화 실패" -#define D_UPLOAD_ERR_11 "RF chip 삭제 실패" -#define D_UPLOAD_ERR_12 "RF chip 쓰기 실패" -#define D_UPLOAD_ERR_13 "RF 펌웨어 decode 실패" -#define D_UPLOAD_ERROR_CODE "업로드 에러 코드" - -#define D_ENTER_COMMAND "명령 입력" -#define D_ENABLE_WEBLOG_FOR_RESPONSE "응답이 있다면 Weblog 2를 사용" -#define D_NEED_USER_AND_PASSWORD "user=<아이디>&password=<비밀번호> 필요" - -// xdrv_01_mqtt.ino -#define D_FINGERPRINT "TLS 지문 확인..." -#define D_TLS_CONNECT_FAILED_TO "TLS 연결 실패" -#define D_RETRY_IN "재시도 중" -#define D_VERIFIED "지문 확인 완료" -#define D_INSECURE "유효하지 않은 지문으로 연결이 되지 않았습니다" -#define D_CONNECT_FAILED_TO "연결 실패" - -// xplg_wemohue.ino -#define D_MULTICAST_DISABLED "Multicast 사용 불가" -#define D_MULTICAST_REJOINED "Multicast (다시)가입됨" -#define D_MULTICAST_JOIN_FAILED "Multicast 가입 실패" -#define D_FAILED_TO_SEND_RESPONSE "요청 전송 실패" - -#define D_WEMO "WeMo" -#define D_WEMO_BASIC_EVENT "WeMo 기본 이벤트" -#define D_WEMO_EVENT_SERVICE "WeMo 이벤트 서비스" -#define D_WEMO_META_SERVICE "WeMo meta 서비스" -#define D_WEMO_SETUP "WeMo 설정" -#define D_RESPONSE_SENT "요청 전송됨" - -#define D_HUE "Hue" -#define D_HUE_BRIDGE_SETUP "Hue 설정" -#define D_HUE_API_NOT_IMPLEMENTED "Hue API가 포함되지 않음" -#define D_HUE_API "Hue API" -#define D_HUE_POST_ARGS "Hue POST args" -#define D_3_RESPONSE_PACKETS_SENT "3 요청 패킷이 전송됨" - -// xdrv_07_domoticz.ino -#define D_DOMOTICZ_PARAMETERS "Domoticz 상세" -#define D_DOMOTICZ_IDX "Idx" -#define D_DOMOTICZ_KEY_IDX "Key idx" -#define D_DOMOTICZ_SWITCH_IDX "스위치 idx" -#define D_DOMOTICZ_SENSOR_IDX "센서 idx" - #define D_DOMOTICZ_TEMP "온도" - #define D_DOMOTICZ_TEMP_HUM "온도,습도" - #define D_DOMOTICZ_TEMP_HUM_BARO "온도,습도,기압" - #define D_DOMOTICZ_POWER_ENERGY "전력,전력량" - #define D_DOMOTICZ_ILLUMINANCE "조도" - #define D_DOMOTICZ_COUNT "횟수/PM1" - #define D_DOMOTICZ_VOLTAGE "전압/PM2.5" - #define D_DOMOTICZ_CURRENT "전류/PM10" - #define D_DOMOTICZ_AIRQUALITY "공기질" - #define D_DOMOTICZ_P1_SMART_METER "P1SmartMeter" -#define D_DOMOTICZ_UPDATE_TIMER "타이머 갱신" - -// xdrv_09_timers.ino -#define D_CONFIGURE_TIMER "타이머 설정" -#define D_TIMER_PARAMETERS "타이머 상세" -#define D_TIMER_ENABLE "타이머 사용" -#define D_TIMER_ARM "Arm" -#define D_TIMER_TIME "시간" -#define D_TIMER_DAYS "일" -#define D_TIMER_REPEAT "반복" -#define D_TIMER_OUTPUT "출력" -#define D_TIMER_ACTION "행동" - -// xdrv_10_knx.ino -#define D_CONFIGURE_KNX "KNX 설정" -#define D_KNX_PARAMETERS "KNX 상세" -#define D_KNX_GENERAL_CONFIG "일반" -#define D_KNX_PHYSICAL_ADDRESS "물리적 주소" -#define D_KNX_PHYSICAL_ADDRESS_NOTE "( KNX 네트워크 상에서 반드시 고유한 이름이어야 합니다 )" -#define D_KNX_ENABLE "KNX 사용" -#define D_KNX_GROUP_ADDRESS_TO_WRITE "그룹 주소로 데이타를 보냅니다" -#define D_ADD "추가" -#define D_DELETE "삭제" -#define D_REPLY "응답" -#define D_KNX_GROUP_ADDRESS_TO_READ "받은 데이터의 그룹 주소" -#define D_LOG_KNX "KNX: " -#define D_RECEIVED_FROM "다음에서 받음" -#define D_KNX_COMMAND_WRITE "쓰기" -#define D_KNX_COMMAND_READ "읽기" -#define D_KNX_COMMAND_OTHER "기타" -#define D_SENT_TO "다음으로 보내기" -#define D_KNX_WARNING "그룹 주소 ( 0 / 0 / 0 )은 예약되어 사용할 수 없습니다" -#define D_KNX_ENHANCEMENT "커뮤니케이션 강화" -#define D_KNX_TX_SLOT "KNX TX" -#define D_KNX_RX_SLOT "KNX RX" - -// xdrv_03_energy.ino -#define D_ENERGY_TODAY "금일 전력 사용량" -#define D_ENERGY_YESTERDAY "어제 전력 사용량" -#define D_ENERGY_TOTAL "총 전력 사용량" - -// xdrv_27_shutter.ino -#define D_OPEN "Open" -#define D_CLOSE "Close" -#define D_DOMOTICZ_SHUTTER "Shutter" - -// xdrv_28_pcf8574.ino -#define D_CONFIGURE_PCF8574 "Configure PCF8574" -#define D_PCF8574_PARAMETERS "PCF8574 parameters" -#define D_INVERT_PORTS "Invert Ports" -#define D_DEVICE "Device" -#define D_DEVICE_INPUT "Input" -#define D_DEVICE_OUTPUT "Output" - -// xsns_05_ds18b20.ino -#define D_SENSOR_BUSY "센서가 사용 중" -#define D_SENSOR_CRC_ERROR "센서 CRC 에러" -#define D_SENSORS_FOUND "센서 발견" - -// xsns_06_dht.ino -#define D_TIMEOUT_WAITING_FOR "대기 시간 초과" -#define D_START_SIGNAL_LOW "시작 신호 낮음" -#define D_START_SIGNAL_HIGH "시작 신호 높음" -#define D_PULSE "pulse" -#define D_CHECKSUM_FAILURE "체크섬 실패" - -// xsns_07_sht1x.ino -#define D_SENSOR_DID_NOT_ACK_COMMAND "센서가 ACK 명령을 수행하지 않음" -#define D_SHT1X_FOUND "SHT1X 발견" - -// xsns_18_pms5003.ino -#define D_STANDARD_CONCENTRATION "CF-1 PM" // Standard Particle CF-1 Particle Matter -#define D_ENVIRONMENTAL_CONCENTRATION "PM" // Environmetal Particle Matter -#define D_PARTICALS_BEYOND "입자" - -// xsns_32_mpu6050.ino -#define D_AX_AXIS "Accel. X-Axis" -#define D_AY_AXIS "Accel. Y-Axis" -#define D_AZ_AXIS "Accel. Z-Axis" -#define D_GX_AXIS "Gyro X-Axis" -#define D_GY_AXIS "Gyro Y-Axis" -#define D_GZ_AXIS "Gyro Z-Axis" - -// xsns_34_hx711.ino -#define D_HX_CAL_REMOVE "중량 제거" -#define D_HX_CAL_REFERENCE "참조 중량 로드" -#define D_HX_CAL_DONE "교정됨" -#define D_HX_CAL_FAIL "교정 실패" -#define D_RESET_HX711 "스케일 초기화" -#define D_CONFIGURE_HX711 "스케일 설정" -#define D_HX711_PARAMETERS "스케일 상세" -#define D_ITEM_WEIGHT "아이템 중량" -#define D_REFERENCE_WEIGHT "참조 중량" -#define D_CALIBRATE "교정" -#define D_CALIBRATION "교정" - -//xsns_35_tx20.ino -#define D_TX20_WIND_DIRECTION "풍향" -#define D_TX20_WIND_SPEED "풍속" -#define D_TX20_WIND_SPEED_AVG "평균 풍속" -#define D_TX20_WIND_SPEED_MAX "최대 풍속" -#define D_TX20_NORTH "N" -#define D_TX20_EAST "E" -#define D_TX20_SOUTH "S" -#define D_TX20_WEST "W" - -//xsns_43_hre.ino -#define D_LOG_HRE "HRE: " - -// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box -#define D_SENSOR_NONE "없음" -#define D_SENSOR_USER "User" -#define D_SENSOR_DHT11 "DHT11" -#define D_SENSOR_AM2301 "AM2301" -#define D_SENSOR_SI7021 "SI7021" -#define D_SENSOR_DS18X20 "DS18x20" -#define D_SENSOR_I2C_SCL "I2C SCL" -#define D_SENSOR_I2C_SDA "I2C SDA" -#define D_SENSOR_WS2812 "WS2812" -#define D_SENSOR_DFR562 "MP3 Player" -#define D_SENSOR_IRSEND "IRsend" -#define D_SENSOR_SWITCH "Switch" // Suffix "1" -#define D_SENSOR_BUTTON "Button" // Suffix "1" -#define D_SENSOR_RELAY "Relay" // Suffix "1i" -#define D_SENSOR_LED "Led" // Suffix "1i" -#define D_SENSOR_LED_LINK "LedLink" // Suffix "i" -#define D_SENSOR_PWM "PWM" // Suffix "1" -#define D_SENSOR_COUNTER "Counter" // Suffix "1" -#define D_SENSOR_IRRECV "IRrecv" -#define D_SENSOR_MHZ_RX "MHZ Rx" -#define D_SENSOR_MHZ_TX "MHZ Tx" -#define D_SENSOR_PZEM004_RX "PZEM004 Rx" -#define D_SENSOR_PZEM016_RX "PZEM016 Rx" -#define D_SENSOR_PZEM017_RX "PZEM017 Rx" -#define D_SENSOR_PZEM0XX_TX "PZEM0XX Tx" -#define D_SENSOR_SAIR_RX "SAir Rx" -#define D_SENSOR_SAIR_TX "SAir Tx" -#define D_SENSOR_SPI_CS "SPI CS" -#define D_SENSOR_SPI_DC "SPI DC" -#define D_SENSOR_SPI_MISO "SPI MISO" -#define D_SENSOR_SPI_MOSI "SPI MOSI" -#define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" -#define D_SENSOR_PMS5003 "PMS5003" -#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" -#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" -#define D_SENSOR_SBR_RX "SerBr Rx" -#define D_SENSOR_SBR_TX "SerBr Tx" -#define D_SENSOR_SR04_TRIG "SR04 Tri" -#define D_SENSOR_SR04_ECHO "SR04 Ech" -#define D_SENSOR_SDM120_TX "SDMx20 Tx" -#define D_SENSOR_SDM120_RX "SDMx20 Rx" -#define D_SENSOR_SDM630_TX "SDM630 Tx" -#define D_SENSOR_SDM630_RX "SDM630 Rx" -#define D_SENSOR_TM1638_CLK "TM16 CLK" -#define D_SENSOR_TM1638_DIO "TM16 DIO" -#define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_HX711_SCK "HX711 SCK" -#define D_SENSOR_HX711_DAT "HX711 DAT" -#define D_SENSOR_TX20_TX "TX20" -#define D_SENSOR_RFSEND "RFSend" -#define D_SENSOR_RFRECV "RFrecv" -#define D_SENSOR_TUYA_TX "Tuya Tx" -#define D_SENSOR_TUYA_RX "Tuya Rx" -#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr" -#define D_SENSOR_MGC3130_RESET "MGC3130 Rst" -#define D_SENSOR_SSPI_MISO "SSPI MISO" -#define D_SENSOR_SSPI_MOSI "SSPI MOSI" -#define D_SENSOR_SSPI_SCLK "SSPI SCLK" -#define D_SENSOR_SSPI_CS "SSPI CS" -#define D_SENSOR_SSPI_DC "SSPI DC" -#define D_SENSOR_RF_SENSOR "RF Sensor" -#define D_SENSOR_AZ_RX "AZ Rx" -#define D_SENSOR_AZ_TX "AZ Tx" -#define D_SENSOR_MAX31855_CS "MX31855 CS" -#define D_SENSOR_MAX31855_CLK "MX31855 CLK" -#define D_SENSOR_MAX31855_DO "MX31855 DO" -#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i" -#define D_SENSOR_NRG_CF1 "HLWBL CF1" -#define D_SENSOR_HLW_CF "HLW8012 CF" -#define D_SENSOR_HJL_CF "BL0937 CF" -#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx" -#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx" -#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst" -#define D_SENSOR_CSE7766_TX "CSE7766 Tx" -#define D_SENSOR_CSE7766_RX "CSE7766 Rx" -#define D_SENSOR_PN532_TX "PN532 Tx" -#define D_SENSOR_PN532_RX "PN532 Rx" -#define D_SENSOR_SM16716_CLK "SM16716 CLK" -#define D_SENSOR_SM16716_DAT "SM16716 DAT" -#define D_SENSOR_SM16716_POWER "SM16716 PWR" -#define D_SENSOR_MY92X1_DI "MY92x1 DI" -#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI" -#define D_SENSOR_ARIRFRCV "ALux IrRcv" -#define D_SENSOR_ARIRFSEL "ALux IrSel" -#define D_SENSOR_TXD "Serial Tx" -#define D_SENSOR_RXD "Serial Rx" -#define D_SENSOR_ROTARY "Rotary" // Suffix "1A" -#define D_SENSOR_HRE_CLOCK "HRE Clock" -#define D_SENSOR_HRE_DATA "HRE Data" -#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ" -#define D_SENSOR_BUZZER "Buzzer" -#define D_SENSOR_OLED_RESET "OLED Reset" -#define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" -#define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" -#define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" -#define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" -#define D_SENSOR_IBEACON_TX "iBeacon TX" -#define D_SENSOR_IBEACON_RX "iBeacon RX" -#define D_SENSOR_RDM6300_RX "RDM6300 RX" -#define D_SENSOR_CC1101_CS "CC1101 CS" -#define D_SENSOR_A4988_DIR "A4988 DIR" -#define D_SENSOR_A4988_STP "A4988 STP" -#define D_SENSOR_A4988_ENA "A4988 ENA" -#define D_SENSOR_A4988_MS1 "A4988 MS1" -#define D_SENSOR_A4988_MS2 "A4988 MS2" -#define D_SENSOR_A4988_MS3 "A4988 MS3" -#define D_SENSOR_DDS2382_TX "DDS238-2 Tx" -#define D_SENSOR_DDS2382_RX "DDS238-2 Rx" -#define D_SENSOR_DDSU666_TX "DDSU666 Tx" -#define D_SENSOR_DDSU666_RX "DDSU666 Rx" -#define D_SENSOR_SM2135_CLK "SM2135 Clk" -#define D_SENSOR_SM2135_DAT "SM2135 Dat" -#define D_SENSOR_DEEPSLEEP "DeepSleep" -#define D_SENSOR_EXS_ENABLE "EXS Enable" -#define D_SENSOR_SLAVE_TX "Slave TX" -#define D_SENSOR_SLAVE_RX "Slave RX" -#define D_SENSOR_SLAVE_RESET "Slave RST" - -// Units -#define D_UNIT_AMPERE "A" -#define D_UNIT_CENTIMETER "cm" -#define D_UNIT_HERTZ "Hz" -#define D_UNIT_HOUR "시" -#define D_UNIT_GALLONS "gal" -#define D_UNIT_GALLONS_PER_MIN "g/m" -#define D_UNIT_INCREMENTS "inc" -#define D_UNIT_KILOGRAM "kg" -#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h" -#define D_UNIT_KILOOHM "kOhm" -#define D_UNIT_KILOWATTHOUR "kWh" -#define D_UNIT_LUX "lx" -#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3" -#define D_UNIT_MICROMETER "마이크로미터" -#define D_UNIT_MICROSECOND "마이크로초" -#define D_UNIT_MILLIAMPERE "mA" -#define D_UNIT_MILLIMETER "mm" -#define D_UNIT_MILLIMETER_MERCURY "mmHg" -#define D_UNIT_MILLISECOND "밀리초" -#define D_UNIT_MINUTE "분" -#define D_UNIT_PARTS_PER_BILLION "ppb" -#define D_UNIT_PARTS_PER_DECILITER "ppd" -#define D_UNIT_PARTS_PER_MILLION "ppm" -#define D_UNIT_PRESSURE "hPa" -#define D_UNIT_SECOND "초" -#define D_UNIT_SECTORS "섹터" -#define D_UNIT_VA "VA" -#define D_UNIT_VAR "VAr" -#define D_UNIT_VOLT "V" -#define D_UNIT_WATT "W" -#define D_UNIT_WATTHOUR "Wh" -#define D_UNIT_WATT_METER_QUADRAT "W/m²" - -// Log message prefix -#define D_LOG_APPLICATION "APP: " // Application -#define D_LOG_BRIDGE "BRG: " // Bridge -#define D_LOG_CONFIG "CFG: " // Settings -#define D_LOG_COMMAND "CMD: " // Command -#define D_LOG_DEBUG "DBG: " // Debug -#define D_LOG_DHT "DHT: " // DHT sensor -#define D_LOG_DOMOTICZ "DOM: " // Domoticz -#define D_LOG_DSB "DSB: " // DS18xB20 sensor -#define D_LOG_HTTP "HTP: " // HTTP webserver -#define D_LOG_I2C "I2C: " // I2C -#define D_LOG_IRR "IRR: " // Infra Red Received -#define D_LOG_LOG "LOG: " // Logging -#define D_LOG_MODULE "MOD: " // Module -#define D_LOG_MDNS "DNS: " // mDNS -#define D_LOG_MQTT "MQT: " // MQTT -#define D_LOG_OTHER "OTH: " // Other -#define D_LOG_RESULT "RSL: " // Result -#define D_LOG_RFR "RFR: " // RF Received -#define D_LOG_SERIAL "SER: " // Serial -#define D_LOG_SHT1 "SHT: " // SHT1x sensor -#define D_LOG_UPLOAD "UPL: " // Upload -#define D_LOG_UPNP "UPP: " // UPnP -#define D_LOG_WIFI "WIF: " // Wifi - -//SDM220 -#define D_PHASE_ANGLE "Phase Angle" -#define D_IMPORT_ACTIVE "Import Active" -#define D_EXPORT_ACTIVE "Export Active" -#define D_IMPORT_REACTIVE "Import Reactive" -#define D_EXPORT_REACTIVE "Export Reactive" -#define D_TOTAL_REACTIVE "Total Reactive" -#define D_UNIT_KWARH "kVArh" -#define D_UNIT_ANGLE "Deg" - -//SOLAXX1 -#define D_PV1_VOLTAGE "PV1 Voltage" -#define D_PV1_CURRENT "PV1 Current" -#define D_PV1_POWER "PV1 Power" -#define D_PV2_VOLTAGE "PV2 Voltage" -#define D_PV2_CURRENT "PV2 Current" -#define D_PV2_POWER "PV2 Power" -#define D_SOLAR_POWER "Solar Power" -#define D_INVERTER_POWER "Inverter Power" -#define D_STATUS "Status" -#define D_WAITING "Waiting" -#define D_CHECKING "Checking" -#define D_WORKING "Working" -#define D_FAILURE "Failure" -#define D_SOLAX_ERROR_0 "No Error Code" -#define D_SOLAX_ERROR_1 "Grid Lost Fault" -#define D_SOLAX_ERROR_2 "Grid Voltage Fault" -#define D_SOLAX_ERROR_3 "Grid Frequency Fault" -#define D_SOLAX_ERROR_4 "Pv Voltage Fault" -#define D_SOLAX_ERROR_5 "Isolation Fault" -#define D_SOLAX_ERROR_6 "Over Temperature Fault" -#define D_SOLAX_ERROR_7 "Fan Fault" -#define D_SOLAX_ERROR_8 "Other Device Fault" - -#endif // _LANGUAGE_KO_KO_H_ +/* + ko-KO.h - localization for Korean - Korean for Tasmota + + Copyright (C) 2019 Theo Arends (translated by NyaamZ) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _LANGUAGE_KO_KO_H_ +#define _LANGUAGE_KO_KO_H_ + +/*************************** ATTENTION *******************************\ + * + * Due to memory constraints only UTF-8 is supported. + * To save code space keep text as short as possible. + * Time and Date provided by SDK can not be localized (yet). + * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. + * Use online command Prefix to translate cmnd, stat and tele. + * + * Updated until v6.2.1.11 +\*********************************************************************/ + +//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) +// https://www.science.co.il/language/Locale-codes.php +#define LANGUAGE_LCID 1042 +// HTML (ISO 639-1) Language Code +#define D_HTML_LANGUAGE "ko" + +// "2017-03-07T11:08:02" - ISO8601:2004 +#define D_YEAR_MONTH_SEPARATOR "-" +#define D_MONTH_DAY_SEPARATOR "-" +#define D_DATE_TIME_SEPARATOR "T" +#define D_HOUR_MINUTE_SEPARATOR ":" +#define D_MINUTE_SECOND_SEPARATOR ":" + +#define D_DAY3LIST "일 월 화 수 목 금 토 " +#define D_MONTH3LIST "1월 2월 3월 4월 5월 6월 7월 8월 9월 10월11월12월" + +// Non JSON decimal separator +#define D_DECIMAL_SEPARATOR "." + +// Common +#define D_ADMIN "Admin" +#define D_AIR_QUALITY "공기질" +#define D_AP "AP" // Access Point +#define D_AS "as" +#define D_AUTO "자동" +#define D_BLINK "깜박임" +#define D_BLINKOFF "깜박임 끄기" +#define D_BOOT_COUNT "가동횟수" +#define D_BRIGHTLIGHT "밝기" +#define D_BSSID "BSSId" +#define D_BUTTON "버튼" +#define D_BY "by" // Written by me +#define D_BYTES "Bytes" +#define D_CELSIUS "섭씨" +#define D_CHANNEL "채널" +#define D_CO2 "이산화탄소" +#define D_CODE "코드" // Button code +#define D_COLDLIGHT "차갑게" +#define D_COMMAND "명령" +#define D_CONNECTED "연결됨" +#define D_COUNT "횟수" +#define D_COUNTER "Counter" +#define D_CURRENT "전류" // As in Voltage and Current +#define D_DATA "데이터" +#define D_DARKLIGHT "어둡게" +#define D_DEBUG "디버그" +#define D_DISABLED "사용 불가" +#define D_DISTANCE "거리" +#define D_DNS_SERVER "DNS 서버" +#define D_DONE "완료" +#define D_DST_TIME "DST" +#define D_ECO2 "eCO2" +#define D_EMULATION "에뮬레이션" +#define D_ENABLED "사용 가능" +#define D_ERASE "삭제" +#define D_ERROR "에러" +#define D_FAHRENHEIT "화씨" +#define D_FAILED "실패" +#define D_FALLBACK "Fallback" +#define D_FALLBACK_TOPIC "Fallback Topic" +#define D_FALSE "거짓" +#define D_FILE "파일" +#define D_FLOW_RATE "Flow rate" +#define D_FREE_MEMORY "남은 메모리" +#define D_FREQUENCY "빈도" +#define D_GAS "가스" +#define D_GATEWAY "게이트웨이" +#define D_GROUP "그룹" +#define D_HOST "호스트" +#define D_HOSTNAME "호스트이름" +#define D_HUMIDITY "습도" +#define D_ILLUMINANCE "조도" +#define D_IMMEDIATE "immediate" // Button immediate +#define D_INDEX "인덱스" +#define D_INFO "정보" +#define D_INFRARED "적외선" +#define D_INITIALIZED "초기화 완료" +#define D_IP_ADDRESS "IP 주소" +#define D_LIGHT "밝게" +#define D_LWT "LWT" +#define D_MODULE "모듈" +#define D_MQTT "MQTT" +#define D_MULTI_PRESS "multi-press" +#define D_NOISE "소음" +#define D_NONE "없음" +#define D_OFF "꺼짐" +#define D_OFFLINE "오프라인" +#define D_OK "Ok" +#define D_ON "켜짐" +#define D_ONLINE "온라인" +#define D_PASSWORD "비밀번호" +#define D_PORT "포트" +#define D_POWER_FACTOR "Power Factor" +#define D_POWERUSAGE "전원" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" +#define D_PRESSURE "기압" +#define D_PRESSUREATSEALEVEL "해수면기압" +#define D_PROGRAM_FLASH_SIZE "플래시 용량" +#define D_PROGRAM_SIZE "프로그램 용량" +#define D_PROJECT "프로젝트" +#define D_RAIN "비" +#define D_RECEIVED "받음" +#define D_RESTART "재시작" +#define D_RESTARTING "재시작 중" +#define D_RESTART_REASON "재시작 이유" +#define D_RESTORE "복구" +#define D_RETAINED "보류" +#define D_RULE "규칙" +#define D_SAVE "저장" +#define D_SENSOR "센서" +#define D_SSID "SSId" +#define D_START "시작" +#define D_STD_TIME "STD" +#define D_STOP "정지" +#define D_SUBNET_MASK "서브넷 마스크" +#define D_SUBSCRIBE_TO "구독" +#define D_UNSUBSCRIBE_FROM "구독 해제" +#define D_SUCCESSFUL "성공" +#define D_SUNRISE "일출" +#define D_SUNSET "일몰" +#define D_TEMPERATURE "온도" +#define D_TO "to" +#define D_TOGGLE "전환" +#define D_TOPIC "Topic" +#define D_TOTAL_USAGE "Total Usage" +#define D_TRANSMIT "전송" +#define D_TRUE "참" +#define D_TVOC "TVOC" +#define D_UPGRADE "업그레이드" +#define D_UPLOAD "업로드" +#define D_UPTIME "가동시간" +#define D_USER "User" +#define D_UTC_TIME "UTC" +#define D_UV_INDEX "UV 색인" +#define D_UV_INDEX_1 "낮음" +#define D_UV_INDEX_2 "보통" +#define D_UV_INDEX_3 "높음" +#define D_UV_INDEX_4 "위험" +#define D_UV_INDEX_5 "BurnL1/2" +#define D_UV_INDEX_6 "BurnL3" +#define D_UV_INDEX_7 "OoR" // Out of Range +#define D_UV_LEVEL "UV 레벨" +#define D_UV_POWER "UV 파워" +#define D_VERSION "버전" +#define D_VOLTAGE "전압" +#define D_WEIGHT "무게" +#define D_WARMLIGHT "따뜻하게" +#define D_WEB_SERVER "웹 서버" + +// sonoff.ino +#define D_WARNING_MINIMAL_VERSION "경고: 이 버전은 영구 설정을 지원하지 않습니다" +#define D_LEVEL_10 "level 1-0" +#define D_LEVEL_01 "level 0-1" +#define D_SERIAL_LOGGING_DISABLED "Serial log 사용 안함" +#define D_SYSLOG_LOGGING_REENABLED "Syslog log 다시 사용" + +#define D_SET_BAUDRATE_TO "Set Baudrate to" +#define D_RECEIVED_TOPIC "Received Topic" +#define D_DATA_SIZE "데이터 용량" +#define D_ANALOG_INPUT "아날로그" + +// support.ino +#define D_OSWATCH "osWatch" +#define D_BLOCKED_LOOP "Blocked Loop" +#define D_WPS_FAILED_WITH_STATUS "WPS설정 실패" +#define D_ACTIVE_FOR_3_MINUTES "3분동안 활성화" +#define D_FAILED_TO_START "시작 실패" +#define D_PATCH_ISSUE_2186 "Patch issue 2186" +#define D_CONNECTING_TO_AP "AP에 연결 중" +#define D_IN_MODE "in mode" +#define D_CONNECT_FAILED_NO_IP_ADDRESS "IP 주소가 수신되지 않아 연결이 실패했습니다" +#define D_CONNECT_FAILED_AP_NOT_REACHED "연결이 닿지 않아 AP에 연결할 수 없습니다" +#define D_CONNECT_FAILED_WRONG_PASSWORD "비밀번호가 틀려 AP에 연결할 수 없습니다" +#define D_CONNECT_FAILED_AP_TIMEOUT "시간초과로 AP에 연결할 수 없습니다" +#define D_ATTEMPTING_CONNECTION "연결 시도 중..." +#define D_CHECKING_CONNECTION "연결 체크 중..." +#define D_QUERY_DONE "쿼리 완료. MQTT 서비스 발견" +#define D_MQTT_SERVICE_FOUND "MQTT 서비스 발견" +#define D_FOUND_AT "다음에서 발견" +#define D_SYSLOG_HOST_NOT_FOUND "Syslog 호스트가 발견되지 않았습니다" + +// settings.ino +#define D_SAVED_TO_FLASH_AT "플래시에 저장" +#define D_LOADED_FROM_FLASH_AT "플래시에서 로드" +#define D_USE_DEFAULTS "디폴트 사용" +#define D_ERASED_SECTOR "삭제된 섹터" + +// xdrv_02_webserver.ino +#define D_NOSCRIPT "Tasmota를 사용하려면 JavaScript를 활성화 하십시오." +#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware
업그레이드가 필요합니다" +#define D_WEBSERVER_ACTIVE_ON "Web 서버 작동 중" +#define D_WITH_IP_ADDRESS "IP 주소" +#define D_WEBSERVER_STOPPED "Web 서버 멈춤" +#define D_FILE_NOT_FOUND "파일을 찾을 수 없습니다" +#define D_REDIRECTED "인증 페이지로 리디렉션" +#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "와이파이 매니저가 AccessPoint와 keep Station을 설정" +#define D_WIFIMANAGER_SET_ACCESSPOINT "와이파이 매니저가 AccessPoint를 설정" +#define D_TRYING_TO_CONNECT "장치를 네트워크에 연결하려고 시도 중" + +#define D_RESTART_IN "재시작" +#define D_SECONDS "초" +#define D_DEVICE_WILL_RESTART "이 장치는 몇 초 후 재시작됩니다" +#define D_BUTTON_TOGGLE "켜기/끄기" +#define D_CONFIGURATION "설정" +#define D_INFORMATION "정보" +#define D_FIRMWARE_UPGRADE "펌웨어 업그레이드" +#define D_CONSOLE "콘솔" +#define D_CONFIRM_RESTART "재시작" + +#define D_CONFIGURE_MODULE "모듈 설정" +#define D_CONFIGURE_WIFI "WiFi 설정" +#define D_CONFIGURE_MQTT "MQTT 설정" +#define D_CONFIGURE_DOMOTICZ "Domoticz 설정" +#define D_CONFIGURE_LOGGING "로그 설정" +#define D_CONFIGURE_OTHER "기타 설정" +#define D_CONFIRM_RESET_CONFIGURATION "설정 초기화 확인" +#define D_RESET_CONFIGURATION "설정 초기화" +#define D_BACKUP_CONFIGURATION "백업 설정" +#define D_RESTORE_CONFIGURATION "복원 설정" +#define D_MAIN_MENU "메인 메뉴" + +#define D_MODULE_PARAMETERS "모듈 상세" +#define D_MODULE_TYPE "모듈 타입" +#define D_PULLUP_ENABLE "No Button/Switch pull-up" +#define D_ADC "ADC" +#define D_GPIO "GPIO" +#define D_SERIAL_IN "Serial In" +#define D_SERIAL_OUT "Serial Out" + +#define D_WIFI_PARAMETERS "Wifi 상세" +#define D_SCAN_FOR_WIFI_NETWORKS "Wifi 네트워크를 검색 중" +#define D_SCAN_DONE "검색 완료" +#define D_NO_NETWORKS_FOUND "발견된 네트워크가 없습니다" +#define D_REFRESH_TO_SCAN_AGAIN "검색 재시도" +#define D_DUPLICATE_ACCESSPOINT "중복된 AccessPoint" +#define D_SKIPPING_LOW_QUALITY "약한 네트워크 신호 무시" +#define D_RSSI "RSSI" +#define D_WEP "WEP" +#define D_WPA_PSK "WPA PSK" +#define D_WPA2_PSK "WPA2 PSK" +#define D_AP1_SSID "AP1 SSId" +#define D_AP1_PASSWORD "AP1 비밀번호" +#define D_AP2_SSID "AP2 SSId" +#define D_AP2_PASSWORD "AP2 비밀번호" + +#define D_MQTT_PARAMETERS "MQTT 상세" +#define D_CLIENT "클라이언트" +#define D_FULL_TOPIC "Full Topic" + +#define D_LOGGING_PARAMETERS "로그 상세" +#define D_SERIAL_LOG_LEVEL "시리얼 로그 레벨" +#define D_MQTT_LOG_LEVEL "Mqtt log level" +#define D_WEB_LOG_LEVEL "Web 로그 레벨" +#define D_SYS_LOG_LEVEL "Syslog 로그 레벨" +#define D_MORE_DEBUG "More debug" +#define D_SYSLOG_HOST "Syslog 호스트" +#define D_SYSLOG_PORT "Syslog 포트" +#define D_TELEMETRY_PERIOD "보고 주기" + +#define D_OTHER_PARAMETERS "기타 상세" +#define D_TEMPLATE "템플릿" +#define D_ACTIVATE "활성" +#define D_WEB_ADMIN_PASSWORD "Web Admin 비밀번호" +#define D_MQTT_ENABLE "MQTT 사용" +#define D_FRIENDLY_NAME "별칭" +#define D_BELKIN_WEMO "Belkin WeMo" +#define D_HUE_BRIDGE "Hue Bridge" +#define D_SINGLE_DEVICE "single device" +#define D_MULTI_DEVICE "multi device" + +#define D_CONFIGURE_TEMPLATE "템플릿 설정" +#define D_TEMPLATE_PARAMETERS "템플릿 상세" +#define D_TEMPLATE_NAME "이름" +#define D_BASE_TYPE "Based on" +#define D_TEMPLATE_FLAGS "옵션" + +#define D_SAVE_CONFIGURATION "설정 저장" +#define D_CONFIGURATION_SAVED "설정 저장 완료" +#define D_CONFIGURATION_RESET "설정 초기화" + +#define D_PROGRAM_VERSION "프로그램 버전" +#define D_BUILD_DATE_AND_TIME "빌드 날짜" +#define D_CORE_AND_SDK_VERSION "Core/SDK 버전" +#define D_FLASH_WRITE_COUNT "플래시 쓰기 횟수" +#define D_MAC_ADDRESS "MAC 주소" +#define D_MQTT_HOST "MQTT 호스트" +#define D_MQTT_PORT "MQTT 포트" +#define D_MQTT_CLIENT "MQTT 클라이언트" +#define D_MQTT_USER "MQTT 아이디" +#define D_MQTT_TOPIC "MQTT Topic" +#define D_MQTT_GROUP_TOPIC "MQTT Group Topic" +#define D_MQTT_FULL_TOPIC "MQTT Full Topic" +#define D_MDNS_DISCOVERY "mDNS Discovery" +#define D_MDNS_ADVERTISE "mDNS Advertise" +#define D_ESP_CHIP_ID "ESP Chip Id" +#define D_FLASH_CHIP_ID "Flash Chip Id" +#define D_FLASH_CHIP_SIZE "Flash 용량" +#define D_FREE_PROGRAM_SPACE "여유 프로그램 공간" + +#define D_UPGRADE_BY_WEBSERVER "웹 서버에서 업그레이드" +#define D_OTA_URL "OTA Url" +#define D_START_UPGRADE "업그레이드 시작" +#define D_UPGRADE_BY_FILE_UPLOAD "업로드 된 파일로 업그레이드" +#define D_UPLOAD_STARTED "업로드 시작됨" +#define D_UPGRADE_STARTED "업그레이드 시작됨" +#define D_UPLOAD_DONE "업그레이드 완료" +#define D_UPLOAD_ERR_1 "파일이 선택되지 않았습니다" +#define D_UPLOAD_ERR_2 "용량이 충분하지 않습니다" +#define D_UPLOAD_ERR_3 "Magic 바이트가 0xE9가 아닙니다" +#define D_UPLOAD_ERR_4 "플래시 프로그램이 실제 플래시 용량보다 큽니다" +#define D_UPLOAD_ERR_5 "업로드 버퍼가 일치하지 않습니다" +#define D_UPLOAD_ERR_6 "업로드 실패. 로그 3 사용" +#define D_UPLOAD_ERR_7 "업로드 중단" +#define D_UPLOAD_ERR_8 "파일이 유효하지 않습니다" +#define D_UPLOAD_ERR_9 "용량이 초과되었습니다" +#define D_UPLOAD_ERR_10 "RF chip 초기화 실패" +#define D_UPLOAD_ERR_11 "RF chip 삭제 실패" +#define D_UPLOAD_ERR_12 "RF chip 쓰기 실패" +#define D_UPLOAD_ERR_13 "RF 펌웨어 decode 실패" +#define D_UPLOAD_ERROR_CODE "업로드 에러 코드" + +#define D_ENTER_COMMAND "명령 입력" +#define D_ENABLE_WEBLOG_FOR_RESPONSE "응답이 있다면 Weblog 2를 사용" +#define D_NEED_USER_AND_PASSWORD "user=<아이디>&password=<비밀번호> 필요" + +// xdrv_01_mqtt.ino +#define D_FINGERPRINT "TLS 지문 확인..." +#define D_TLS_CONNECT_FAILED_TO "TLS 연결 실패" +#define D_RETRY_IN "재시도 중" +#define D_VERIFIED "지문 확인 완료" +#define D_INSECURE "유효하지 않은 지문으로 연결이 되지 않았습니다" +#define D_CONNECT_FAILED_TO "연결 실패" + +// xplg_wemohue.ino +#define D_MULTICAST_DISABLED "Multicast 사용 불가" +#define D_MULTICAST_REJOINED "Multicast (다시)가입됨" +#define D_MULTICAST_JOIN_FAILED "Multicast 가입 실패" +#define D_FAILED_TO_SEND_RESPONSE "요청 전송 실패" + +#define D_WEMO "WeMo" +#define D_WEMO_BASIC_EVENT "WeMo 기본 이벤트" +#define D_WEMO_EVENT_SERVICE "WeMo 이벤트 서비스" +#define D_WEMO_META_SERVICE "WeMo meta 서비스" +#define D_WEMO_SETUP "WeMo 설정" +#define D_RESPONSE_SENT "요청 전송됨" + +#define D_HUE "Hue" +#define D_HUE_BRIDGE_SETUP "Hue 설정" +#define D_HUE_API_NOT_IMPLEMENTED "Hue API가 포함되지 않음" +#define D_HUE_API "Hue API" +#define D_HUE_POST_ARGS "Hue POST args" +#define D_3_RESPONSE_PACKETS_SENT "3 요청 패킷이 전송됨" + +// xdrv_07_domoticz.ino +#define D_DOMOTICZ_PARAMETERS "Domoticz 상세" +#define D_DOMOTICZ_IDX "Idx" +#define D_DOMOTICZ_KEY_IDX "Key idx" +#define D_DOMOTICZ_SWITCH_IDX "스위치 idx" +#define D_DOMOTICZ_SENSOR_IDX "센서 idx" + #define D_DOMOTICZ_TEMP "온도" + #define D_DOMOTICZ_TEMP_HUM "온도,습도" + #define D_DOMOTICZ_TEMP_HUM_BARO "온도,습도,기압" + #define D_DOMOTICZ_POWER_ENERGY "전력,전력량" + #define D_DOMOTICZ_ILLUMINANCE "조도" + #define D_DOMOTICZ_COUNT "횟수/PM1" + #define D_DOMOTICZ_VOLTAGE "전압/PM2.5" + #define D_DOMOTICZ_CURRENT "전류/PM10" + #define D_DOMOTICZ_AIRQUALITY "공기질" + #define D_DOMOTICZ_P1_SMART_METER "P1SmartMeter" +#define D_DOMOTICZ_UPDATE_TIMER "타이머 갱신" + +// xdrv_09_timers.ino +#define D_CONFIGURE_TIMER "타이머 설정" +#define D_TIMER_PARAMETERS "타이머 상세" +#define D_TIMER_ENABLE "타이머 사용" +#define D_TIMER_ARM "Arm" +#define D_TIMER_TIME "시간" +#define D_TIMER_DAYS "일" +#define D_TIMER_REPEAT "반복" +#define D_TIMER_OUTPUT "출력" +#define D_TIMER_ACTION "행동" + +// xdrv_10_knx.ino +#define D_CONFIGURE_KNX "KNX 설정" +#define D_KNX_PARAMETERS "KNX 상세" +#define D_KNX_GENERAL_CONFIG "일반" +#define D_KNX_PHYSICAL_ADDRESS "물리적 주소" +#define D_KNX_PHYSICAL_ADDRESS_NOTE "( KNX 네트워크 상에서 반드시 고유한 이름이어야 합니다 )" +#define D_KNX_ENABLE "KNX 사용" +#define D_KNX_GROUP_ADDRESS_TO_WRITE "그룹 주소로 데이타를 보냅니다" +#define D_ADD "추가" +#define D_DELETE "삭제" +#define D_REPLY "응답" +#define D_KNX_GROUP_ADDRESS_TO_READ "받은 데이터의 그룹 주소" +#define D_LOG_KNX "KNX: " +#define D_RECEIVED_FROM "다음에서 받음" +#define D_KNX_COMMAND_WRITE "쓰기" +#define D_KNX_COMMAND_READ "읽기" +#define D_KNX_COMMAND_OTHER "기타" +#define D_SENT_TO "다음으로 보내기" +#define D_KNX_WARNING "그룹 주소 ( 0 / 0 / 0 )은 예약되어 사용할 수 없습니다" +#define D_KNX_ENHANCEMENT "커뮤니케이션 강화" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" + +// xdrv_03_energy.ino +#define D_ENERGY_TODAY "금일 전력 사용량" +#define D_ENERGY_YESTERDAY "어제 전력 사용량" +#define D_ENERGY_TOTAL "총 전력 사용량" + +// xdrv_27_shutter.ino +#define D_OPEN "Open" +#define D_CLOSE "Close" +#define D_DOMOTICZ_SHUTTER "Shutter" + +// xdrv_28_pcf8574.ino +#define D_CONFIGURE_PCF8574 "Configure PCF8574" +#define D_PCF8574_PARAMETERS "PCF8574 parameters" +#define D_INVERT_PORTS "Invert Ports" +#define D_DEVICE "Device" +#define D_DEVICE_INPUT "Input" +#define D_DEVICE_OUTPUT "Output" + +// xsns_05_ds18b20.ino +#define D_SENSOR_BUSY "센서가 사용 중" +#define D_SENSOR_CRC_ERROR "센서 CRC 에러" +#define D_SENSORS_FOUND "센서 발견" + +// xsns_06_dht.ino +#define D_TIMEOUT_WAITING_FOR "대기 시간 초과" +#define D_START_SIGNAL_LOW "시작 신호 낮음" +#define D_START_SIGNAL_HIGH "시작 신호 높음" +#define D_PULSE "pulse" +#define D_CHECKSUM_FAILURE "체크섬 실패" + +// xsns_07_sht1x.ino +#define D_SENSOR_DID_NOT_ACK_COMMAND "센서가 ACK 명령을 수행하지 않음" +#define D_SHT1X_FOUND "SHT1X 발견" + +// xsns_18_pms5003.ino +#define D_STANDARD_CONCENTRATION "CF-1 PM" // Standard Particle CF-1 Particle Matter +#define D_ENVIRONMENTAL_CONCENTRATION "PM" // Environmetal Particle Matter +#define D_PARTICALS_BEYOND "입자" + +// xsns_32_mpu6050.ino +#define D_AX_AXIS "Accel. X-Axis" +#define D_AY_AXIS "Accel. Y-Axis" +#define D_AZ_AXIS "Accel. Z-Axis" +#define D_GX_AXIS "Gyro X-Axis" +#define D_GY_AXIS "Gyro Y-Axis" +#define D_GZ_AXIS "Gyro Z-Axis" + +// xsns_34_hx711.ino +#define D_HX_CAL_REMOVE "중량 제거" +#define D_HX_CAL_REFERENCE "참조 중량 로드" +#define D_HX_CAL_DONE "교정됨" +#define D_HX_CAL_FAIL "교정 실패" +#define D_RESET_HX711 "스케일 초기화" +#define D_CONFIGURE_HX711 "스케일 설정" +#define D_HX711_PARAMETERS "스케일 상세" +#define D_ITEM_WEIGHT "아이템 중량" +#define D_REFERENCE_WEIGHT "참조 중량" +#define D_CALIBRATE "교정" +#define D_CALIBRATION "교정" + +//xsns_35_tx20.ino +#define D_TX20_WIND_DIRECTION "풍향" +#define D_TX20_WIND_SPEED "풍속" +#define D_TX20_WIND_SPEED_AVG "평균 풍속" +#define D_TX20_WIND_SPEED_MAX "최대 풍속" +#define D_TX20_NORTH "N" +#define D_TX20_EAST "E" +#define D_TX20_SOUTH "S" +#define D_TX20_WEST "W" + +//xsns_43_hre.ino +#define D_LOG_HRE "HRE: " + +// sonoff_template.h - keep them as short as possible to be able to fit them in GUI drop down box +#define D_SENSOR_NONE "없음" +#define D_SENSOR_USER "User" +#define D_SENSOR_DHT11 "DHT11" +#define D_SENSOR_AM2301 "AM2301" +#define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_DS18X20 "DS18x20" +#define D_SENSOR_I2C_SCL "I2C SCL" +#define D_SENSOR_I2C_SDA "I2C SDA" +#define D_SENSOR_WS2812 "WS2812" +#define D_SENSOR_DFR562 "MP3 Player" +#define D_SENSOR_IRSEND "IRsend" +#define D_SENSOR_SWITCH "Switch" // Suffix "1" +#define D_SENSOR_BUTTON "Button" // Suffix "1" +#define D_SENSOR_RELAY "Relay" // Suffix "1i" +#define D_SENSOR_LED "Led" // Suffix "1i" +#define D_SENSOR_LED_LINK "LedLink" // Suffix "i" +#define D_SENSOR_PWM "PWM" // Suffix "1" +#define D_SENSOR_COUNTER "Counter" // Suffix "1" +#define D_SENSOR_IRRECV "IRrecv" +#define D_SENSOR_MHZ_RX "MHZ Rx" +#define D_SENSOR_MHZ_TX "MHZ Tx" +#define D_SENSOR_PZEM004_RX "PZEM004 Rx" +#define D_SENSOR_PZEM016_RX "PZEM016 Rx" +#define D_SENSOR_PZEM017_RX "PZEM017 Rx" +#define D_SENSOR_PZEM0XX_TX "PZEM0XX Tx" +#define D_SENSOR_SAIR_RX "SAir Rx" +#define D_SENSOR_SAIR_TX "SAir Tx" +#define D_SENSOR_SPI_CS "SPI CS" +#define D_SENSOR_SPI_DC "SPI DC" +#define D_SENSOR_SPI_MISO "SPI MISO" +#define D_SENSOR_SPI_MOSI "SPI MOSI" +#define D_SENSOR_SPI_CLK "SPI CLK" +#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" +#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" +#define D_SENSOR_SBR_RX "SerBr Rx" +#define D_SENSOR_SBR_TX "SerBr Tx" +#define D_SENSOR_SR04_TRIG "SR04 Tri" +#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SDM120_TX "SDMx20 Tx" +#define D_SENSOR_SDM120_RX "SDMx20 Rx" +#define D_SENSOR_SDM630_TX "SDM630 Tx" +#define D_SENSOR_SDM630_RX "SDM630 Rx" +#define D_SENSOR_TM1638_CLK "TM16 CLK" +#define D_SENSOR_TM1638_DIO "TM16 DIO" +#define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_HX711_SCK "HX711 SCK" +#define D_SENSOR_HX711_DAT "HX711 DAT" +#define D_SENSOR_TX20_TX "TX20" +#define D_SENSOR_RFSEND "RFSend" +#define D_SENSOR_RFRECV "RFrecv" +#define D_SENSOR_TUYA_TX "Tuya Tx" +#define D_SENSOR_TUYA_RX "Tuya Rx" +#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr" +#define D_SENSOR_MGC3130_RESET "MGC3130 Rst" +#define D_SENSOR_SSPI_MISO "SSPI MISO" +#define D_SENSOR_SSPI_MOSI "SSPI MOSI" +#define D_SENSOR_SSPI_SCLK "SSPI SCLK" +#define D_SENSOR_SSPI_CS "SSPI CS" +#define D_SENSOR_SSPI_DC "SSPI DC" +#define D_SENSOR_RF_SENSOR "RF Sensor" +#define D_SENSOR_AZ_RX "AZ Rx" +#define D_SENSOR_AZ_TX "AZ Tx" +#define D_SENSOR_MAX31855_CS "MX31855 CS" +#define D_SENSOR_MAX31855_CLK "MX31855 CLK" +#define D_SENSOR_MAX31855_DO "MX31855 DO" +#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i" +#define D_SENSOR_NRG_CF1 "HLWBL CF1" +#define D_SENSOR_HLW_CF "HLW8012 CF" +#define D_SENSOR_HJL_CF "BL0937 CF" +#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx" +#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx" +#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst" +#define D_SENSOR_CSE7766_TX "CSE7766 Tx" +#define D_SENSOR_CSE7766_RX "CSE7766 Rx" +#define D_SENSOR_PN532_TX "PN532 Tx" +#define D_SENSOR_PN532_RX "PN532 Rx" +#define D_SENSOR_SM16716_CLK "SM16716 CLK" +#define D_SENSOR_SM16716_DAT "SM16716 DAT" +#define D_SENSOR_SM16716_POWER "SM16716 PWR" +#define D_SENSOR_MY92X1_DI "MY92x1 DI" +#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI" +#define D_SENSOR_ARIRFRCV "ALux IrRcv" +#define D_SENSOR_ARIRFSEL "ALux IrSel" +#define D_SENSOR_TXD "Serial Tx" +#define D_SENSOR_RXD "Serial Rx" +#define D_SENSOR_ROTARY "Rotary" // Suffix "1A" +#define D_SENSOR_HRE_CLOCK "HRE Clock" +#define D_SENSOR_HRE_DATA "HRE Data" +#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ" +#define D_SENSOR_BUZZER "Buzzer" +#define D_SENSOR_OLED_RESET "OLED Reset" +#define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" +#define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" +#define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" +#define D_SENSOR_IBEACON_TX "iBeacon TX" +#define D_SENSOR_IBEACON_RX "iBeacon RX" +#define D_SENSOR_RDM6300_RX "RDM6300 RX" +#define D_SENSOR_CC1101_CS "CC1101 CS" +#define D_SENSOR_A4988_DIR "A4988 DIR" +#define D_SENSOR_A4988_STP "A4988 STP" +#define D_SENSOR_A4988_ENA "A4988 ENA" +#define D_SENSOR_A4988_MS1 "A4988 MS1" +#define D_SENSOR_A4988_MS2 "A4988 MS2" +#define D_SENSOR_A4988_MS3 "A4988 MS3" +#define D_SENSOR_DDS2382_TX "DDS238-2 Tx" +#define D_SENSOR_DDS2382_RX "DDS238-2 Rx" +#define D_SENSOR_DDSU666_TX "DDSU666 Tx" +#define D_SENSOR_DDSU666_RX "DDSU666 Rx" +#define D_SENSOR_SM2135_CLK "SM2135 Clk" +#define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_DEEPSLEEP "DeepSleep" +#define D_SENSOR_EXS_ENABLE "EXS Enable" +#define D_SENSOR_SLAVE_TX "Slave TX" +#define D_SENSOR_SLAVE_RX "Slave RX" +#define D_SENSOR_SLAVE_RESET "Slave RST" + +// Units +#define D_UNIT_AMPERE "A" +#define D_UNIT_CENTIMETER "cm" +#define D_UNIT_HERTZ "Hz" +#define D_UNIT_HOUR "시" +#define D_UNIT_GALLONS "gal" +#define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCREMENTS "inc" +#define D_UNIT_KILOGRAM "kg" +#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h" +#define D_UNIT_KILOOHM "kOhm" +#define D_UNIT_KILOWATTHOUR "kWh" +#define D_UNIT_LUX "lx" +#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3" +#define D_UNIT_MICROMETER "마이크로미터" +#define D_UNIT_MICROSECOND "마이크로초" +#define D_UNIT_MILLIAMPERE "mA" +#define D_UNIT_MILLIMETER "mm" +#define D_UNIT_MILLIMETER_MERCURY "mmHg" +#define D_UNIT_MILLISECOND "밀리초" +#define D_UNIT_MINUTE "분" +#define D_UNIT_PARTS_PER_BILLION "ppb" +#define D_UNIT_PARTS_PER_DECILITER "ppd" +#define D_UNIT_PARTS_PER_MILLION "ppm" +#define D_UNIT_PRESSURE "hPa" +#define D_UNIT_SECOND "초" +#define D_UNIT_SECTORS "섹터" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" +#define D_UNIT_VOLT "V" +#define D_UNIT_WATT "W" +#define D_UNIT_WATTHOUR "Wh" +#define D_UNIT_WATT_METER_QUADRAT "W/m²" + +// Log message prefix +#define D_LOG_APPLICATION "APP: " // Application +#define D_LOG_BRIDGE "BRG: " // Bridge +#define D_LOG_CONFIG "CFG: " // Settings +#define D_LOG_COMMAND "CMD: " // Command +#define D_LOG_DEBUG "DBG: " // Debug +#define D_LOG_DHT "DHT: " // DHT sensor +#define D_LOG_DOMOTICZ "DOM: " // Domoticz +#define D_LOG_DSB "DSB: " // DS18xB20 sensor +#define D_LOG_HTTP "HTP: " // HTTP webserver +#define D_LOG_I2C "I2C: " // I2C +#define D_LOG_IRR "IRR: " // Infra Red Received +#define D_LOG_LOG "LOG: " // Logging +#define D_LOG_MODULE "MOD: " // Module +#define D_LOG_MDNS "DNS: " // mDNS +#define D_LOG_MQTT "MQT: " // MQTT +#define D_LOG_OTHER "OTH: " // Other +#define D_LOG_RESULT "RSL: " // Result +#define D_LOG_RFR "RFR: " // RF Received +#define D_LOG_SERIAL "SER: " // Serial +#define D_LOG_SHT1 "SHT: " // SHT1x sensor +#define D_LOG_UPLOAD "UPL: " // Upload +#define D_LOG_UPNP "UPP: " // UPnP +#define D_LOG_WIFI "WIF: " // Wifi + +//SDM220 +#define D_PHASE_ANGLE "Phase Angle" +#define D_IMPORT_ACTIVE "Import Active" +#define D_EXPORT_ACTIVE "Export Active" +#define D_IMPORT_REACTIVE "Import Reactive" +#define D_EXPORT_REACTIVE "Export Reactive" +#define D_TOTAL_REACTIVE "Total Reactive" +#define D_UNIT_KWARH "kVArh" +#define D_UNIT_ANGLE "Deg" + +//SOLAXX1 +#define D_PV1_VOLTAGE "PV1 Voltage" +#define D_PV1_CURRENT "PV1 Current" +#define D_PV1_POWER "PV1 Power" +#define D_PV2_VOLTAGE "PV2 Voltage" +#define D_PV2_CURRENT "PV2 Current" +#define D_PV2_POWER "PV2 Power" +#define D_SOLAR_POWER "Solar Power" +#define D_INVERTER_POWER "Inverter Power" +#define D_STATUS "Status" +#define D_WAITING "Waiting" +#define D_CHECKING "Checking" +#define D_WORKING "Working" +#define D_FAILURE "Failure" +#define D_SOLAX_ERROR_0 "No Error Code" +#define D_SOLAX_ERROR_1 "Grid Lost Fault" +#define D_SOLAX_ERROR_2 "Grid Voltage Fault" +#define D_SOLAX_ERROR_3 "Grid Frequency Fault" +#define D_SOLAX_ERROR_4 "Pv Voltage Fault" +#define D_SOLAX_ERROR_5 "Isolation Fault" +#define D_SOLAX_ERROR_6 "Over Temperature Fault" +#define D_SOLAX_ERROR_7 "Fan Fault" +#define D_SOLAX_ERROR_8 "Other Device Fault" + +#endif // _LANGUAGE_KO_KO_H_ diff --git a/sonoff/language/nl-NL.h b/tasmota/language/nl-NL.h similarity index 100% rename from sonoff/language/nl-NL.h rename to tasmota/language/nl-NL.h diff --git a/sonoff/language/pl-PL.h b/tasmota/language/pl-PL.h similarity index 100% rename from sonoff/language/pl-PL.h rename to tasmota/language/pl-PL.h diff --git a/sonoff/language/pt-BR.h b/tasmota/language/pt-BR.h similarity index 100% rename from sonoff/language/pt-BR.h rename to tasmota/language/pt-BR.h diff --git a/sonoff/language/pt-PT.h b/tasmota/language/pt-PT.h similarity index 100% rename from sonoff/language/pt-PT.h rename to tasmota/language/pt-PT.h diff --git a/sonoff/language/ru-RU.h b/tasmota/language/ru-RU.h similarity index 100% rename from sonoff/language/ru-RU.h rename to tasmota/language/ru-RU.h diff --git a/sonoff/language/sk-SK.h b/tasmota/language/sk-SK.h similarity index 100% rename from sonoff/language/sk-SK.h rename to tasmota/language/sk-SK.h diff --git a/sonoff/language/sv-SE.h b/tasmota/language/sv-SE.h similarity index 100% rename from sonoff/language/sv-SE.h rename to tasmota/language/sv-SE.h diff --git a/sonoff/language/tr-TR.h b/tasmota/language/tr-TR.h old mode 100755 new mode 100644 similarity index 100% rename from sonoff/language/tr-TR.h rename to tasmota/language/tr-TR.h diff --git a/sonoff/language/uk-UK.h b/tasmota/language/uk-UK.h similarity index 100% rename from sonoff/language/uk-UK.h rename to tasmota/language/uk-UK.h diff --git a/sonoff/language/zh-CN.h b/tasmota/language/zh-CN.h similarity index 100% rename from sonoff/language/zh-CN.h rename to tasmota/language/zh-CN.h diff --git a/sonoff/language/zh-TW.h b/tasmota/language/zh-TW.h similarity index 100% rename from sonoff/language/zh-TW.h rename to tasmota/language/zh-TW.h diff --git a/sonoff/my_user_config.h b/tasmota/my_user_config.h similarity index 98% rename from sonoff/my_user_config.h rename to tasmota/my_user_config.h index 48be22390..6a46a15bb 100644 --- a/sonoff/my_user_config.h +++ b/tasmota/my_user_config.h @@ -47,10 +47,10 @@ #define CFG_HOLDER 4617 // [Reset 1] Change this value (max 32000) to load SECTION1 configuration parameters to flash // -- Project ------------------------------------- -#define PROJECT "sonoff" // PROJECT is used as the default topic delimiter +#define PROJECT "tasmota" // PROJECT is used as the default topic delimiter // If not selected the default will be SONOFF_BASIC -//#define MODULE SONOFF_BASIC // [Module] Select default model from sonoff_template.h +//#define MODULE SONOFF_BASIC // [Module] Select default model from tasmota_template.h #define SAVE_DATA 1 // [SaveData] Save changed parameters to Flash (0 = disable, 1 - 3600 seconds) #define SAVE_STATE 1 // [SetOption0] Save changed power state to Flash (0 = disable, 1 = enable) @@ -106,13 +106,13 @@ #define MQTT_FULLTOPIC "%prefix%/%topic%/" // [FullTopic] Subscribe and Publish full topic name - Legacy topic // %prefix% token options -#define SUB_PREFIX "cmnd" // [Prefix1] Sonoff devices subscribe to %prefix%/%topic% being SUB_PREFIX/MQTT_TOPIC and SUB_PREFIX/MQTT_GRPTOPIC -#define PUB_PREFIX "stat" // [Prefix2] Sonoff devices publish to %prefix%/%topic% being PUB_PREFIX/MQTT_TOPIC -#define PUB_PREFIX2 "tele" // [Prefix3] Sonoff devices publish telemetry data to %prefix%/%topic% being PUB_PREFIX2/MQTT_TOPIC/UPTIME, POWER and TIME +#define SUB_PREFIX "cmnd" // [Prefix1] Tasmota devices subscribe to %prefix%/%topic% being SUB_PREFIX/MQTT_TOPIC and SUB_PREFIX/MQTT_GRPTOPIC +#define PUB_PREFIX "stat" // [Prefix2] Tasmota devices publish to %prefix%/%topic% being PUB_PREFIX/MQTT_TOPIC +#define PUB_PREFIX2 "tele" // [Prefix3] Tasmota devices publish telemetry data to %prefix%/%topic% being PUB_PREFIX2/MQTT_TOPIC/UPTIME, POWER and TIME // May be named the same as PUB_PREFIX // %topic% token options (also ButtonTopic and SwitchTopic) #define MQTT_TOPIC PROJECT // [Topic] (unique) MQTT device topic, set to 'PROJECT "_%06X"' for unique topic including device MAC address -#define MQTT_GRPTOPIC "sonoffs" // [GroupTopic] MQTT Group topic +#define MQTT_GRPTOPIC "tasmotas" // [GroupTopic] MQTT Group topic #define MQTT_BUTTON_TOPIC "0" // [ButtonTopic] MQTT button topic, "0" = same as MQTT_TOPIC, set to 'PROJECT "_BTN_%06X"' for unique topic including device MAC address #define MQTT_SWITCH_TOPIC "0" // [SwitchTopic] MQTT button topic, "0" = same as MQTT_TOPIC, set to 'PROJECT "_SW_%06X"' for unique topic including device MAC address #define MQTT_CLIENT_ID "DVES_%06X" // [MqttClient] Also fall back topic using Chip Id = last 6 characters of MAC address @@ -130,7 +130,7 @@ // -- HTTP ---------------------------------------- #define WEB_SERVER 2 // [WebServer] Web server (0 = Off, 1 = Start as User, 2 = Start as Admin) #define WEB_PASSWORD "" // [WebPassword] Web server Admin mode Password for WEB_USERNAME (empty string = Disable) -#define FRIENDLY_NAME "Sonoff" // [FriendlyName] Friendlyname up to 32 characters used by webpages and Alexa +#define FRIENDLY_NAME "Tasmota" // [FriendlyName] Friendlyname up to 32 characters used by webpages and Alexa #define EMULATION EMUL_NONE // [Emulation] Select Belkin WeMo (single relay/light) or Hue Bridge emulation (multi relay/light) (EMUL_NONE, EMUL_WEMO or EMUL_HUE) // HTML hex color codes. Only 3 and 6 digit hex string values are supported!! See https://www.w3schools.com/colors/colors_hex.asp #define COLOR_TEXT "#000" // [WebColor1] Global text color - Black @@ -263,7 +263,7 @@ // #define USE_MQTT_TLS_CA_CERT // Force full CA validation instead of fingerprints, slower, but simpler to use (+2.2k code, +1.9k mem during connection handshake) // #define USE_MQTT_TLS_FORCE_EC_CIPHER // Force Elliptic Curve cipher (higher security) required by some servers (automatically enabled with USE_MQTT_AWS_IOT) (+11.4k code, +0.4k mem) // #define USE_MQTT_AWS_IOT // Enable MQTT for AWS IoT - requires a private key (+11.9k code, +0.4k mem) - // Note: you need to generate a private key + certificate per device and update 'sonoff/sonoff_aws_iot.cpp' + // Note: you need to generate a private key + certificate per device and update 'tasmota/tasmota_aws_iot.cpp' // Full documentation here: https://github.com/arendst/Tasmota/wiki/AWS-IoT // -- KNX IP Protocol ----------------------------- @@ -551,7 +551,7 @@ /*********************************************************************************************\ * Optional firmware configurations - * Select none or just one for optional features and sensors as configured in sonoff_post.h + * Select none or just one for optional features and sensors as configured in tasmota_post.h * See RELEASENOTES.md for selected features \*********************************************************************************************/ diff --git a/sonoff/sendemail.h b/tasmota/sendemail.h old mode 100755 new mode 100644 similarity index 100% rename from sonoff/sendemail.h rename to tasmota/sendemail.h diff --git a/sonoff/sendemail.ino b/tasmota/sendemail.ino old mode 100755 new mode 100644 similarity index 100% rename from sonoff/sendemail.ino rename to tasmota/sendemail.ino diff --git a/sonoff/settings.h b/tasmota/settings.h similarity index 100% rename from sonoff/settings.h rename to tasmota/settings.h diff --git a/sonoff/settings.ino b/tasmota/settings.ino similarity index 100% rename from sonoff/settings.ino rename to tasmota/settings.ino diff --git a/sonoff/support.ino b/tasmota/support.ino similarity index 100% rename from sonoff/support.ino rename to tasmota/support.ino diff --git a/sonoff/support_button.ino b/tasmota/support_button.ino similarity index 100% rename from sonoff/support_button.ino rename to tasmota/support_button.ino diff --git a/sonoff/support_command.ino b/tasmota/support_command.ino similarity index 100% rename from sonoff/support_command.ino rename to tasmota/support_command.ino diff --git a/sonoff/support_features.ino b/tasmota/support_features.ino similarity index 100% rename from sonoff/support_features.ino rename to tasmota/support_features.ino diff --git a/sonoff/support_float.ino b/tasmota/support_float.ino similarity index 100% rename from sonoff/support_float.ino rename to tasmota/support_float.ino diff --git a/sonoff/support_rotary.ino b/tasmota/support_rotary.ino similarity index 100% rename from sonoff/support_rotary.ino rename to tasmota/support_rotary.ino diff --git a/sonoff/support_rtc.ino b/tasmota/support_rtc.ino similarity index 100% rename from sonoff/support_rtc.ino rename to tasmota/support_rtc.ino diff --git a/sonoff/support_static_buffer.ino b/tasmota/support_static_buffer.ino similarity index 100% rename from sonoff/support_static_buffer.ino rename to tasmota/support_static_buffer.ino diff --git a/sonoff/support_switch.ino b/tasmota/support_switch.ino similarity index 100% rename from sonoff/support_switch.ino rename to tasmota/support_switch.ino diff --git a/sonoff/support_udp.ino b/tasmota/support_udp.ino similarity index 100% rename from sonoff/support_udp.ino rename to tasmota/support_udp.ino diff --git a/sonoff/support_wifi.ino b/tasmota/support_wifi.ino similarity index 100% rename from sonoff/support_wifi.ino rename to tasmota/support_wifi.ino diff --git a/sonoff/sonoff.h b/tasmota/tasmota.h similarity index 99% rename from sonoff/sonoff.h rename to tasmota/tasmota.h index 2b2d12048..73fc192a8 100644 --- a/sonoff/sonoff.h +++ b/tasmota/tasmota.h @@ -1,5 +1,5 @@ /* - sonoff.h - Master header file for Tasmota + tasmota.h - Master header file for Tasmota Copyright (C) 2019 Theo Arends @@ -17,8 +17,8 @@ along with this program. If not, see . */ -#ifndef _SONOFF_H_ -#define _SONOFF_H_ +#ifndef _TASMOTA_H_ +#define _TASMOTA_H_ /*********************************************************************************************\ * Performance ROM (PROGMEM) vs RAM (RODATA) @@ -285,4 +285,4 @@ const char kCommandSource[] PROGMEM = "I|MQTT|Restart|Button|Switch|Backlog|Seri const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 }; -#endif // _SONOFF_H_ +#endif // _TASMOTA_H_ diff --git a/sonoff/sonoff.ino b/tasmota/tasmota.ino old mode 100755 new mode 100644 similarity index 99% rename from sonoff/sonoff.ino rename to tasmota/tasmota.ino index c369f20a1..c4526a808 --- a/sonoff/sonoff.ino +++ b/tasmota/tasmota.ino @@ -1,5 +1,5 @@ /* - sonoff.ino - Tasmota firmware for iTead Sonoff, Wemos and NodeMCU hardware + tasmota.ino - Tasmota firmware for iTead Sonoff, Wemos and NodeMCU hardware Copyright (C) 2019 Theo Arends @@ -27,15 +27,15 @@ // Location specific includes #include // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0) -#include "sonoff_version.h" // Tasmota version information -#include "sonoff.h" // Enumeration used in my_user_config.h +#include "tasmota_version.h" // Tasmota version information +#include "tasmota.h" // Enumeration used in my_user_config.h #include "my_user_config.h" // Fixed user configurable options #ifdef USE_MQTT_TLS - #include // we need to include before "sonoff_post.h" to take precedence over the BearSSL version in Arduino + #include // we need to include before "tasmota_post.h" to take precedence over the BearSSL version in Arduino #endif // USE_MQTT_TLS -#include "sonoff_post.h" // Configuration overrides for all previous includes +#include "tasmota_post.h" // Configuration overrides for all previous includes #include "i18n.h" // Language support configured by my_user_config.h -#include "sonoff_template.h" // Hardware configuration +#include "tasmota_template.h" // Hardware configuration #ifdef ARDUINO_ESP8266_RELEASE_2_4_0 @@ -102,7 +102,7 @@ int baudrate = APP_BAUDRATE; // Serial interface baud rate int serial_in_byte_counter = 0; // Index in receive buffer int ota_state_flag = 0; // OTA state flag int ota_result = 0; // OTA result -int restart_flag = 0; // Sonoff restart flag +int restart_flag = 0; // Tasmota restart flag int wifi_state_flag = WIFI_RESTART; // Wifi state flag int tele_period = 1; // Tele period timer int blinks = 201; // Number of LED blinks diff --git a/sonoff/sonoff_ca.ino b/tasmota/tasmota_ca.ino similarity index 98% rename from sonoff/sonoff_ca.ino rename to tasmota/tasmota_ca.ino index f34b87dec..3df65c9b9 100644 --- a/sonoff/sonoff_ca.ino +++ b/tasmota/tasmota_ca.ino @@ -1,5 +1,5 @@ /* - sonoff_ca.ino - Certificate authorities for Tasmota, LetsEncrypt and AWS + tasmota_ca.ino - Certificate authorities for Tasmota, LetsEncrypt and AWS Copyright (C) 2019 Theo Arends diff --git a/sonoff/sonoff_post.h b/tasmota/tasmota_post.h similarity index 99% rename from sonoff/sonoff_post.h rename to tasmota/tasmota_post.h index 309cc4e32..09620c320 100644 --- a/sonoff/sonoff_post.h +++ b/tasmota/tasmota_post.h @@ -1,5 +1,5 @@ /* - sonoff_post.h - Post header file for Tasmota + tasmota_post.h - Post header file for Tasmota Copyright (C) 2019 Theo Arends @@ -17,8 +17,8 @@ along with this program. If not, see . */ -#ifndef _SONOFF_POST_H_ -#define _SONOFF_POST_H_ +#ifndef _TASMOTA_POST_H_ +#define _TASMOTA_POST_H_ /*********************************************************************************************\ * Function declarations @@ -664,4 +664,4 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c #define DEBUG_SENSOR_LOG(...) #endif -#endif // _SONOFF_POST_H_ +#endif // _TASMOTA_POST_H_ diff --git a/sonoff/sonoff_template.h b/tasmota/tasmota_template.h similarity index 99% rename from sonoff/sonoff_template.h rename to tasmota/tasmota_template.h index a930dbd27..b63118bf3 100644 --- a/sonoff/sonoff_template.h +++ b/tasmota/tasmota_template.h @@ -1,5 +1,5 @@ /* - sonoff_template.h - template settings for Tasmota + tasmota_template.h - template settings for Tasmota Copyright (C) 2019 Theo Arends @@ -17,8 +17,8 @@ along with this program. If not, see . */ -#ifndef _SONOFF_TEMPLATE_H_ -#define _SONOFF_TEMPLATE_H_ +#ifndef _TASMOTA_TEMPLATE_H_ +#define _TASMOTA_TEMPLATE_H_ // User selectable GPIO functionality // ATTENTION: Only add at the end of this list just before GPIO_SENSOR_END @@ -2163,4 +2163,4 @@ const mytmplt kModules[MAXMODULE] PROGMEM = { } }; -#endif // _SONOFF_TEMPLATE_H_ +#endif // _TASMOTA_TEMPLATE_H_ diff --git a/sonoff/sonoff_version.h b/tasmota/tasmota_version.h similarity index 83% rename from sonoff/sonoff_version.h rename to tasmota/tasmota_version.h index 21ceb7cd4..695d14146 100644 --- a/sonoff/sonoff_version.h +++ b/tasmota/tasmota_version.h @@ -1,5 +1,5 @@ /* - sonoff_version.h - Version header file for Tasmota + tasmota_version.h - Version header file for Tasmota Copyright (C) 2019 Theo Arends @@ -17,9 +17,9 @@ along with this program. If not, see . */ -#ifndef _SONOFF_VERSION_H_ -#define _SONOFF_VERSION_H_ +#ifndef _TASMOTA_VERSION_H_ +#define _TASMOTA_VERSION_H_ const uint32_t VERSION = 0x06070101; -#endif // _SONOFF_VERSION_H_ +#endif // _TASMOTA_VERSION_H_ diff --git a/sonoff/user_config_override_sample.h b/tasmota/user_config_override_sample.h similarity index 100% rename from sonoff/user_config_override_sample.h rename to tasmota/user_config_override_sample.h diff --git a/sonoff/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino similarity index 100% rename from sonoff/xdrv_01_webserver.ino rename to tasmota/xdrv_01_webserver.ino diff --git a/sonoff/xdrv_02_mqtt.ino b/tasmota/xdrv_02_mqtt.ino similarity index 100% rename from sonoff/xdrv_02_mqtt.ino rename to tasmota/xdrv_02_mqtt.ino diff --git a/sonoff/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino similarity index 100% rename from sonoff/xdrv_03_energy.ino rename to tasmota/xdrv_03_energy.ino diff --git a/sonoff/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino similarity index 100% rename from sonoff/xdrv_04_light.ino rename to tasmota/xdrv_04_light.ino diff --git a/sonoff/xdrv_05_irremote.ino b/tasmota/xdrv_05_irremote.ino similarity index 100% rename from sonoff/xdrv_05_irremote.ino rename to tasmota/xdrv_05_irremote.ino diff --git a/sonoff/xdrv_05_irremote_full.ino b/tasmota/xdrv_05_irremote_full.ino similarity index 100% rename from sonoff/xdrv_05_irremote_full.ino rename to tasmota/xdrv_05_irremote_full.ino diff --git a/sonoff/xdrv_06_snfbridge.ino b/tasmota/xdrv_06_snfbridge.ino similarity index 100% rename from sonoff/xdrv_06_snfbridge.ino rename to tasmota/xdrv_06_snfbridge.ino diff --git a/sonoff/xdrv_07_domoticz.ino b/tasmota/xdrv_07_domoticz.ino similarity index 100% rename from sonoff/xdrv_07_domoticz.ino rename to tasmota/xdrv_07_domoticz.ino diff --git a/sonoff/xdrv_08_serial_bridge.ino b/tasmota/xdrv_08_serial_bridge.ino similarity index 100% rename from sonoff/xdrv_08_serial_bridge.ino rename to tasmota/xdrv_08_serial_bridge.ino diff --git a/sonoff/xdrv_09_timers.ino b/tasmota/xdrv_09_timers.ino similarity index 100% rename from sonoff/xdrv_09_timers.ino rename to tasmota/xdrv_09_timers.ino diff --git a/sonoff/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino similarity index 100% rename from sonoff/xdrv_10_rules.ino rename to tasmota/xdrv_10_rules.ino diff --git a/sonoff/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino similarity index 100% rename from sonoff/xdrv_10_scripter.ino rename to tasmota/xdrv_10_scripter.ino diff --git a/sonoff/xdrv_11_knx.ino b/tasmota/xdrv_11_knx.ino similarity index 100% rename from sonoff/xdrv_11_knx.ino rename to tasmota/xdrv_11_knx.ino diff --git a/sonoff/xdrv_12_home_assistant.ino b/tasmota/xdrv_12_home_assistant.ino similarity index 100% rename from sonoff/xdrv_12_home_assistant.ino rename to tasmota/xdrv_12_home_assistant.ino diff --git a/sonoff/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino old mode 100755 new mode 100644 similarity index 100% rename from sonoff/xdrv_13_display.ino rename to tasmota/xdrv_13_display.ino diff --git a/sonoff/xdrv_14_mp3.ino b/tasmota/xdrv_14_mp3.ino similarity index 100% rename from sonoff/xdrv_14_mp3.ino rename to tasmota/xdrv_14_mp3.ino diff --git a/sonoff/xdrv_15_pca9685.ino b/tasmota/xdrv_15_pca9685.ino similarity index 100% rename from sonoff/xdrv_15_pca9685.ino rename to tasmota/xdrv_15_pca9685.ino diff --git a/sonoff/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino similarity index 100% rename from sonoff/xdrv_16_tuyamcu.ino rename to tasmota/xdrv_16_tuyamcu.ino diff --git a/sonoff/xdrv_17_rcswitch.ino b/tasmota/xdrv_17_rcswitch.ino similarity index 100% rename from sonoff/xdrv_17_rcswitch.ino rename to tasmota/xdrv_17_rcswitch.ino diff --git a/sonoff/xdrv_18_armtronix_dimmers.ino b/tasmota/xdrv_18_armtronix_dimmers.ino similarity index 100% rename from sonoff/xdrv_18_armtronix_dimmers.ino rename to tasmota/xdrv_18_armtronix_dimmers.ino diff --git a/sonoff/xdrv_19_ps16dz_dimmer.ino b/tasmota/xdrv_19_ps16dz_dimmer.ino similarity index 100% rename from sonoff/xdrv_19_ps16dz_dimmer.ino rename to tasmota/xdrv_19_ps16dz_dimmer.ino diff --git a/sonoff/xdrv_20_hue.ino b/tasmota/xdrv_20_hue.ino similarity index 100% rename from sonoff/xdrv_20_hue.ino rename to tasmota/xdrv_20_hue.ino diff --git a/sonoff/xdrv_21_wemo.ino b/tasmota/xdrv_21_wemo.ino similarity index 100% rename from sonoff/xdrv_21_wemo.ino rename to tasmota/xdrv_21_wemo.ino diff --git a/sonoff/xdrv_22_sonoff_ifan.ino b/tasmota/xdrv_22_sonoff_ifan.ino similarity index 100% rename from sonoff/xdrv_22_sonoff_ifan.ino rename to tasmota/xdrv_22_sonoff_ifan.ino diff --git a/sonoff/xdrv_23_zigbee_0_constants.ino b/tasmota/xdrv_23_zigbee_0_constants.ino similarity index 100% rename from sonoff/xdrv_23_zigbee_0_constants.ino rename to tasmota/xdrv_23_zigbee_0_constants.ino diff --git a/sonoff/xdrv_23_zigbee_3_devices.ino b/tasmota/xdrv_23_zigbee_3_devices.ino similarity index 100% rename from sonoff/xdrv_23_zigbee_3_devices.ino rename to tasmota/xdrv_23_zigbee_3_devices.ino diff --git a/sonoff/xdrv_23_zigbee_5_converters.ino b/tasmota/xdrv_23_zigbee_5_converters.ino similarity index 100% rename from sonoff/xdrv_23_zigbee_5_converters.ino rename to tasmota/xdrv_23_zigbee_5_converters.ino diff --git a/sonoff/xdrv_23_zigbee_6_commands.ino b/tasmota/xdrv_23_zigbee_6_commands.ino similarity index 100% rename from sonoff/xdrv_23_zigbee_6_commands.ino rename to tasmota/xdrv_23_zigbee_6_commands.ino diff --git a/sonoff/xdrv_23_zigbee_7_statemachine.ino b/tasmota/xdrv_23_zigbee_7_statemachine.ino similarity index 100% rename from sonoff/xdrv_23_zigbee_7_statemachine.ino rename to tasmota/xdrv_23_zigbee_7_statemachine.ino diff --git a/sonoff/xdrv_23_zigbee_8_parsers.ino b/tasmota/xdrv_23_zigbee_8_parsers.ino similarity index 100% rename from sonoff/xdrv_23_zigbee_8_parsers.ino rename to tasmota/xdrv_23_zigbee_8_parsers.ino diff --git a/sonoff/xdrv_23_zigbee_9_impl.ino b/tasmota/xdrv_23_zigbee_9_impl.ino similarity index 100% rename from sonoff/xdrv_23_zigbee_9_impl.ino rename to tasmota/xdrv_23_zigbee_9_impl.ino diff --git a/sonoff/xdrv_24_buzzer.ino b/tasmota/xdrv_24_buzzer.ino similarity index 100% rename from sonoff/xdrv_24_buzzer.ino rename to tasmota/xdrv_24_buzzer.ino diff --git a/sonoff/xdrv_25_A4988_Stepper.ino b/tasmota/xdrv_25_A4988_Stepper.ino similarity index 100% rename from sonoff/xdrv_25_A4988_Stepper.ino rename to tasmota/xdrv_25_A4988_Stepper.ino diff --git a/sonoff/xdrv_26_ariluxrf.ino b/tasmota/xdrv_26_ariluxrf.ino similarity index 100% rename from sonoff/xdrv_26_ariluxrf.ino rename to tasmota/xdrv_26_ariluxrf.ino diff --git a/sonoff/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino similarity index 100% rename from sonoff/xdrv_27_shutter.ino rename to tasmota/xdrv_27_shutter.ino diff --git a/sonoff/xdrv_28_pcf8574.ino b/tasmota/xdrv_28_pcf8574.ino similarity index 100% rename from sonoff/xdrv_28_pcf8574.ino rename to tasmota/xdrv_28_pcf8574.ino diff --git a/sonoff/xdrv_29_deepsleep.ino b/tasmota/xdrv_29_deepsleep.ino similarity index 100% rename from sonoff/xdrv_29_deepsleep.ino rename to tasmota/xdrv_29_deepsleep.ino diff --git a/sonoff/xdrv_30_exs_dimmer.ino b/tasmota/xdrv_30_exs_dimmer.ino similarity index 100% rename from sonoff/xdrv_30_exs_dimmer.ino rename to tasmota/xdrv_30_exs_dimmer.ino diff --git a/sonoff/xdrv_31_tasmota_slave.ino b/tasmota/xdrv_31_tasmota_slave.ino similarity index 100% rename from sonoff/xdrv_31_tasmota_slave.ino rename to tasmota/xdrv_31_tasmota_slave.ino diff --git a/sonoff/xdrv_99_debug.ino b/tasmota/xdrv_99_debug.ino similarity index 100% rename from sonoff/xdrv_99_debug.ino rename to tasmota/xdrv_99_debug.ino diff --git a/sonoff/xdrv_interface.ino b/tasmota/xdrv_interface.ino similarity index 100% rename from sonoff/xdrv_interface.ino rename to tasmota/xdrv_interface.ino diff --git a/sonoff/xdsp_01_lcd.ino b/tasmota/xdsp_01_lcd.ino similarity index 100% rename from sonoff/xdsp_01_lcd.ino rename to tasmota/xdsp_01_lcd.ino diff --git a/sonoff/xdsp_02_ssd1306.ino b/tasmota/xdsp_02_ssd1306.ino old mode 100755 new mode 100644 similarity index 100% rename from sonoff/xdsp_02_ssd1306.ino rename to tasmota/xdsp_02_ssd1306.ino diff --git a/sonoff/xdsp_03_matrix.ino b/tasmota/xdsp_03_matrix.ino similarity index 100% rename from sonoff/xdsp_03_matrix.ino rename to tasmota/xdsp_03_matrix.ino diff --git a/sonoff/xdsp_04_ili9341.ino b/tasmota/xdsp_04_ili9341.ino similarity index 100% rename from sonoff/xdsp_04_ili9341.ino rename to tasmota/xdsp_04_ili9341.ino diff --git a/sonoff/xdsp_05_epaper_29.ino b/tasmota/xdsp_05_epaper_29.ino similarity index 100% rename from sonoff/xdsp_05_epaper_29.ino rename to tasmota/xdsp_05_epaper_29.ino diff --git a/sonoff/xdsp_06_epaper_42.ino b/tasmota/xdsp_06_epaper_42.ino similarity index 100% rename from sonoff/xdsp_06_epaper_42.ino rename to tasmota/xdsp_06_epaper_42.ino diff --git a/sonoff/xdsp_07_sh1106.ino b/tasmota/xdsp_07_sh1106.ino similarity index 100% rename from sonoff/xdsp_07_sh1106.ino rename to tasmota/xdsp_07_sh1106.ino diff --git a/sonoff/xdsp_08_ILI9488.ino b/tasmota/xdsp_08_ILI9488.ino similarity index 100% rename from sonoff/xdsp_08_ILI9488.ino rename to tasmota/xdsp_08_ILI9488.ino diff --git a/sonoff/xdsp_09_SSD1351.ino b/tasmota/xdsp_09_SSD1351.ino similarity index 100% rename from sonoff/xdsp_09_SSD1351.ino rename to tasmota/xdsp_09_SSD1351.ino diff --git a/sonoff/xdsp_10_RA8876.ino b/tasmota/xdsp_10_RA8876.ino similarity index 100% rename from sonoff/xdsp_10_RA8876.ino rename to tasmota/xdsp_10_RA8876.ino diff --git a/sonoff/xdsp_interface.ino b/tasmota/xdsp_interface.ino similarity index 100% rename from sonoff/xdsp_interface.ino rename to tasmota/xdsp_interface.ino diff --git a/sonoff/xlgt_01_ws2812.ino b/tasmota/xlgt_01_ws2812.ino similarity index 100% rename from sonoff/xlgt_01_ws2812.ino rename to tasmota/xlgt_01_ws2812.ino diff --git a/sonoff/xlgt_02_my92x1.ino b/tasmota/xlgt_02_my92x1.ino similarity index 100% rename from sonoff/xlgt_02_my92x1.ino rename to tasmota/xlgt_02_my92x1.ino diff --git a/sonoff/xlgt_03_sm16716.ino b/tasmota/xlgt_03_sm16716.ino similarity index 100% rename from sonoff/xlgt_03_sm16716.ino rename to tasmota/xlgt_03_sm16716.ino diff --git a/sonoff/xlgt_04_sm2135.ino b/tasmota/xlgt_04_sm2135.ino similarity index 100% rename from sonoff/xlgt_04_sm2135.ino rename to tasmota/xlgt_04_sm2135.ino diff --git a/sonoff/xlgt_05_sonoff_l1.ino b/tasmota/xlgt_05_sonoff_l1.ino similarity index 100% rename from sonoff/xlgt_05_sonoff_l1.ino rename to tasmota/xlgt_05_sonoff_l1.ino diff --git a/sonoff/xlgt_interface.ino b/tasmota/xlgt_interface.ino similarity index 100% rename from sonoff/xlgt_interface.ino rename to tasmota/xlgt_interface.ino diff --git a/sonoff/xnrg_01_hlw8012.ino b/tasmota/xnrg_01_hlw8012.ino similarity index 100% rename from sonoff/xnrg_01_hlw8012.ino rename to tasmota/xnrg_01_hlw8012.ino diff --git a/sonoff/xnrg_02_cse7766.ino b/tasmota/xnrg_02_cse7766.ino similarity index 100% rename from sonoff/xnrg_02_cse7766.ino rename to tasmota/xnrg_02_cse7766.ino diff --git a/sonoff/xnrg_03_pzem004t.ino b/tasmota/xnrg_03_pzem004t.ino similarity index 100% rename from sonoff/xnrg_03_pzem004t.ino rename to tasmota/xnrg_03_pzem004t.ino diff --git a/sonoff/xnrg_04_mcp39f501.ino b/tasmota/xnrg_04_mcp39f501.ino similarity index 100% rename from sonoff/xnrg_04_mcp39f501.ino rename to tasmota/xnrg_04_mcp39f501.ino diff --git a/sonoff/xnrg_05_pzem_ac.ino b/tasmota/xnrg_05_pzem_ac.ino similarity index 100% rename from sonoff/xnrg_05_pzem_ac.ino rename to tasmota/xnrg_05_pzem_ac.ino diff --git a/sonoff/xnrg_06_pzem_dc.ino b/tasmota/xnrg_06_pzem_dc.ino similarity index 100% rename from sonoff/xnrg_06_pzem_dc.ino rename to tasmota/xnrg_06_pzem_dc.ino diff --git a/sonoff/xnrg_07_ade7953.ino b/tasmota/xnrg_07_ade7953.ino similarity index 100% rename from sonoff/xnrg_07_ade7953.ino rename to tasmota/xnrg_07_ade7953.ino diff --git a/sonoff/xnrg_08_sdm120.ino b/tasmota/xnrg_08_sdm120.ino similarity index 100% rename from sonoff/xnrg_08_sdm120.ino rename to tasmota/xnrg_08_sdm120.ino diff --git a/sonoff/xnrg_09_dds2382.ino b/tasmota/xnrg_09_dds2382.ino similarity index 100% rename from sonoff/xnrg_09_dds2382.ino rename to tasmota/xnrg_09_dds2382.ino diff --git a/sonoff/xnrg_10_sdm630.ino b/tasmota/xnrg_10_sdm630.ino similarity index 100% rename from sonoff/xnrg_10_sdm630.ino rename to tasmota/xnrg_10_sdm630.ino diff --git a/sonoff/xnrg_11_ddsu666.ino b/tasmota/xnrg_11_ddsu666.ino similarity index 100% rename from sonoff/xnrg_11_ddsu666.ino rename to tasmota/xnrg_11_ddsu666.ino diff --git a/sonoff/xnrg_12_solaxX1.ino b/tasmota/xnrg_12_solaxX1.ino similarity index 100% rename from sonoff/xnrg_12_solaxX1.ino rename to tasmota/xnrg_12_solaxX1.ino diff --git a/sonoff/xnrg_interface.ino b/tasmota/xnrg_interface.ino similarity index 100% rename from sonoff/xnrg_interface.ino rename to tasmota/xnrg_interface.ino diff --git a/sonoff/xsns_01_counter.ino b/tasmota/xsns_01_counter.ino similarity index 100% rename from sonoff/xsns_01_counter.ino rename to tasmota/xsns_01_counter.ino diff --git a/sonoff/xsns_02_analog.ino b/tasmota/xsns_02_analog.ino similarity index 100% rename from sonoff/xsns_02_analog.ino rename to tasmota/xsns_02_analog.ino diff --git a/sonoff/xsns_04_snfsc.ino b/tasmota/xsns_04_snfsc.ino similarity index 100% rename from sonoff/xsns_04_snfsc.ino rename to tasmota/xsns_04_snfsc.ino diff --git a/sonoff/xsns_05_ds18x20.ino b/tasmota/xsns_05_ds18x20.ino similarity index 100% rename from sonoff/xsns_05_ds18x20.ino rename to tasmota/xsns_05_ds18x20.ino diff --git a/sonoff/xsns_06_dht.ino b/tasmota/xsns_06_dht.ino similarity index 100% rename from sonoff/xsns_06_dht.ino rename to tasmota/xsns_06_dht.ino diff --git a/sonoff/xsns_07_sht1x.ino b/tasmota/xsns_07_sht1x.ino similarity index 100% rename from sonoff/xsns_07_sht1x.ino rename to tasmota/xsns_07_sht1x.ino diff --git a/sonoff/xsns_08_htu21.ino b/tasmota/xsns_08_htu21.ino similarity index 100% rename from sonoff/xsns_08_htu21.ino rename to tasmota/xsns_08_htu21.ino diff --git a/sonoff/xsns_09_bmp.ino b/tasmota/xsns_09_bmp.ino old mode 100755 new mode 100644 similarity index 100% rename from sonoff/xsns_09_bmp.ino rename to tasmota/xsns_09_bmp.ino diff --git a/sonoff/xsns_10_bh1750.ino b/tasmota/xsns_10_bh1750.ino similarity index 100% rename from sonoff/xsns_10_bh1750.ino rename to tasmota/xsns_10_bh1750.ino diff --git a/sonoff/xsns_11_veml6070.ino b/tasmota/xsns_11_veml6070.ino similarity index 100% rename from sonoff/xsns_11_veml6070.ino rename to tasmota/xsns_11_veml6070.ino diff --git a/sonoff/xsns_12_ads1115.ino b/tasmota/xsns_12_ads1115.ino similarity index 100% rename from sonoff/xsns_12_ads1115.ino rename to tasmota/xsns_12_ads1115.ino diff --git a/sonoff/xsns_12_ads1115_i2cdev.ino b/tasmota/xsns_12_ads1115_i2cdev.ino similarity index 100% rename from sonoff/xsns_12_ads1115_i2cdev.ino rename to tasmota/xsns_12_ads1115_i2cdev.ino diff --git a/sonoff/xsns_13_ina219.ino b/tasmota/xsns_13_ina219.ino similarity index 100% rename from sonoff/xsns_13_ina219.ino rename to tasmota/xsns_13_ina219.ino diff --git a/sonoff/xsns_14_sht3x.ino b/tasmota/xsns_14_sht3x.ino old mode 100755 new mode 100644 similarity index 100% rename from sonoff/xsns_14_sht3x.ino rename to tasmota/xsns_14_sht3x.ino diff --git a/sonoff/xsns_15_mhz19.ino b/tasmota/xsns_15_mhz19.ino similarity index 100% rename from sonoff/xsns_15_mhz19.ino rename to tasmota/xsns_15_mhz19.ino diff --git a/sonoff/xsns_16_tsl2561.ino b/tasmota/xsns_16_tsl2561.ino similarity index 100% rename from sonoff/xsns_16_tsl2561.ino rename to tasmota/xsns_16_tsl2561.ino diff --git a/sonoff/xsns_17_senseair.ino b/tasmota/xsns_17_senseair.ino similarity index 100% rename from sonoff/xsns_17_senseair.ino rename to tasmota/xsns_17_senseair.ino diff --git a/sonoff/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino similarity index 100% rename from sonoff/xsns_18_pms5003.ino rename to tasmota/xsns_18_pms5003.ino diff --git a/sonoff/xsns_19_mgs.ino b/tasmota/xsns_19_mgs.ino similarity index 100% rename from sonoff/xsns_19_mgs.ino rename to tasmota/xsns_19_mgs.ino diff --git a/sonoff/xsns_20_novasds.ino b/tasmota/xsns_20_novasds.ino similarity index 100% rename from sonoff/xsns_20_novasds.ino rename to tasmota/xsns_20_novasds.ino diff --git a/sonoff/xsns_21_sgp30.ino b/tasmota/xsns_21_sgp30.ino similarity index 100% rename from sonoff/xsns_21_sgp30.ino rename to tasmota/xsns_21_sgp30.ino diff --git a/sonoff/xsns_22_sr04.ino b/tasmota/xsns_22_sr04.ino similarity index 100% rename from sonoff/xsns_22_sr04.ino rename to tasmota/xsns_22_sr04.ino diff --git a/sonoff/xsns_24_si1145.ino b/tasmota/xsns_24_si1145.ino similarity index 100% rename from sonoff/xsns_24_si1145.ino rename to tasmota/xsns_24_si1145.ino diff --git a/sonoff/xsns_26_lm75ad.ino b/tasmota/xsns_26_lm75ad.ino similarity index 100% rename from sonoff/xsns_26_lm75ad.ino rename to tasmota/xsns_26_lm75ad.ino diff --git a/sonoff/xsns_27_apds9960.ino b/tasmota/xsns_27_apds9960.ino similarity index 100% rename from sonoff/xsns_27_apds9960.ino rename to tasmota/xsns_27_apds9960.ino diff --git a/sonoff/xsns_28_tm1638.ino b/tasmota/xsns_28_tm1638.ino similarity index 100% rename from sonoff/xsns_28_tm1638.ino rename to tasmota/xsns_28_tm1638.ino diff --git a/sonoff/xsns_29_mcp230xx.ino b/tasmota/xsns_29_mcp230xx.ino similarity index 100% rename from sonoff/xsns_29_mcp230xx.ino rename to tasmota/xsns_29_mcp230xx.ino diff --git a/sonoff/xsns_30_mpr121.ino b/tasmota/xsns_30_mpr121.ino similarity index 100% rename from sonoff/xsns_30_mpr121.ino rename to tasmota/xsns_30_mpr121.ino diff --git a/sonoff/xsns_31_ccs811.ino b/tasmota/xsns_31_ccs811.ino similarity index 100% rename from sonoff/xsns_31_ccs811.ino rename to tasmota/xsns_31_ccs811.ino diff --git a/sonoff/xsns_32_mpu6050.ino b/tasmota/xsns_32_mpu6050.ino similarity index 100% rename from sonoff/xsns_32_mpu6050.ino rename to tasmota/xsns_32_mpu6050.ino diff --git a/sonoff/xsns_33_ds3231.ino b/tasmota/xsns_33_ds3231.ino similarity index 100% rename from sonoff/xsns_33_ds3231.ino rename to tasmota/xsns_33_ds3231.ino diff --git a/sonoff/xsns_34_hx711.ino b/tasmota/xsns_34_hx711.ino similarity index 100% rename from sonoff/xsns_34_hx711.ino rename to tasmota/xsns_34_hx711.ino diff --git a/sonoff/xsns_35_tx20.ino b/tasmota/xsns_35_tx20.ino similarity index 100% rename from sonoff/xsns_35_tx20.ino rename to tasmota/xsns_35_tx20.ino diff --git a/sonoff/xsns_36_mgc3130.ino b/tasmota/xsns_36_mgc3130.ino similarity index 100% rename from sonoff/xsns_36_mgc3130.ino rename to tasmota/xsns_36_mgc3130.ino diff --git a/sonoff/xsns_37_rfsensor.ino b/tasmota/xsns_37_rfsensor.ino similarity index 100% rename from sonoff/xsns_37_rfsensor.ino rename to tasmota/xsns_37_rfsensor.ino diff --git a/sonoff/xsns_38_az7798.ino b/tasmota/xsns_38_az7798.ino similarity index 100% rename from sonoff/xsns_38_az7798.ino rename to tasmota/xsns_38_az7798.ino diff --git a/sonoff/xsns_39_max31855.ino b/tasmota/xsns_39_max31855.ino similarity index 100% rename from sonoff/xsns_39_max31855.ino rename to tasmota/xsns_39_max31855.ino diff --git a/sonoff/xsns_40_pn532.ino b/tasmota/xsns_40_pn532.ino similarity index 100% rename from sonoff/xsns_40_pn532.ino rename to tasmota/xsns_40_pn532.ino diff --git a/sonoff/xsns_41_max44009.ino b/tasmota/xsns_41_max44009.ino similarity index 100% rename from sonoff/xsns_41_max44009.ino rename to tasmota/xsns_41_max44009.ino diff --git a/sonoff/xsns_42_scd30.ino b/tasmota/xsns_42_scd30.ino similarity index 100% rename from sonoff/xsns_42_scd30.ino rename to tasmota/xsns_42_scd30.ino diff --git a/sonoff/xsns_43_hre.ino b/tasmota/xsns_43_hre.ino similarity index 100% rename from sonoff/xsns_43_hre.ino rename to tasmota/xsns_43_hre.ino diff --git a/sonoff/xsns_44_sps30.ino b/tasmota/xsns_44_sps30.ino similarity index 100% rename from sonoff/xsns_44_sps30.ino rename to tasmota/xsns_44_sps30.ino diff --git a/sonoff/xsns_45_vl53l0x.ino b/tasmota/xsns_45_vl53l0x.ino old mode 100755 new mode 100644 similarity index 100% rename from sonoff/xsns_45_vl53l0x.ino rename to tasmota/xsns_45_vl53l0x.ino diff --git a/sonoff/xsns_46_MLX90614.ino b/tasmota/xsns_46_MLX90614.ino similarity index 100% rename from sonoff/xsns_46_MLX90614.ino rename to tasmota/xsns_46_MLX90614.ino diff --git a/sonoff/xsns_47_max31865.ino b/tasmota/xsns_47_max31865.ino similarity index 100% rename from sonoff/xsns_47_max31865.ino rename to tasmota/xsns_47_max31865.ino diff --git a/sonoff/xsns_48_chirp.ino b/tasmota/xsns_48_chirp.ino similarity index 100% rename from sonoff/xsns_48_chirp.ino rename to tasmota/xsns_48_chirp.ino diff --git a/sonoff/xsns_50_paj7620.ino b/tasmota/xsns_50_paj7620.ino similarity index 100% rename from sonoff/xsns_50_paj7620.ino rename to tasmota/xsns_50_paj7620.ino diff --git a/sonoff/xsns_51_rdm6300.ino b/tasmota/xsns_51_rdm6300.ino similarity index 100% rename from sonoff/xsns_51_rdm6300.ino rename to tasmota/xsns_51_rdm6300.ino diff --git a/sonoff/xsns_52_ibeacon.ino b/tasmota/xsns_52_ibeacon.ino similarity index 100% rename from sonoff/xsns_52_ibeacon.ino rename to tasmota/xsns_52_ibeacon.ino diff --git a/sonoff/xsns_53_sml.ino b/tasmota/xsns_53_sml.ino similarity index 100% rename from sonoff/xsns_53_sml.ino rename to tasmota/xsns_53_sml.ino diff --git a/sonoff/xsns_54_ina226.ino b/tasmota/xsns_54_ina226.ino similarity index 100% rename from sonoff/xsns_54_ina226.ino rename to tasmota/xsns_54_ina226.ino diff --git a/sonoff/xsns_interface.ino b/tasmota/xsns_interface.ino similarity index 100% rename from sonoff/xsns_interface.ino rename to tasmota/xsns_interface.ino diff --git a/tools/decode-config.html b/tools/decode-config.html index d5cff4c3a..ccd05b514 100644 --- a/tools/decode-config.html +++ b/tools/decode-config.html @@ -1,5 +1,5 @@

decode-config.py

-

decode-config.py is able to backup and restore Sonoff-Tasmota configuration.

+

decode-config.py is able to backup and restore Tasmota configuration.

In comparison with the Tasmota build-in "Backup/Restore Configuration" function decode-config.py

  • uses human readable and editable JSON-format for backup/restore,
  • @@ -12,7 +12,7 @@   decode-config.py
    *.json file -Sonoff-Tasmota
    *.dmp file +Tasmota
    *.dmp file @@ -77,9 +77,9 @@
    • Python)
      This program is written in Python) so you need to install a working python environment (for details see Python Setup and Usage)

    • -
    • Sonoff-Tasmota Firmware with Web-Server enabled:

      +
    • Tasmota Firmware with Web-Server enabled:

        -
      • To backup or restore configurations from or to a Sonoff-Tasmota device you need a firmare with enabled web-server in admin mode (command WebServer 2). This is the Tasmota default.
      • +
      • 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). 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).
    • @@ -91,7 +91,7 @@

      .json Format

      Configuration data in JSON-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 in decrypted 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 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.

      @@ -108,14 +108,14 @@ If you do not want using auto extensions use the --no-extension par
      decode-config.py -d sonoff-4281
       

      will output a human readable configuration in JSON-format:

      {
      -  "altitude": 112, 
      -  "baudrate": 115200, 
      -  "blinkcount": 10, 
      -  "blinktime": 10, 
      +  "altitude": 112,
      +  "baudrate": 115200,
      +  "blinkcount": 10,
      +  "blinktime": 10,
       ...
         "ws_width": [
      -    1, 
      -    3, 
      +    1,
      +    3,
           5
         ]
       }
      @@ -141,29 +141,29 @@ If you do not want using auto extensions use the --no-extension par
       
       {
         ...
      -  "hostname": "%s-%04d", 
      +  "hostname": "%s-%04d",
         "ip_address": [
      -    "0.0.0.0", 
      -    "192.168.12.1", 
      -    "255.255.255.0", 
      +    "0.0.0.0",
      +    "192.168.12.1",
      +    "255.255.255.0",
           "192.168.12.1"
      -  ], 
      +  ],
         "ntp_server": [
      -    "ntp.localnet.home", 
      -    "ntp2.localnet.home", 
      +    "ntp.localnet.home",
      +    "ntp2.localnet.home",
           "192.168.12.1"
      -  ], 
      -  "sta_active": 0, 
      -  "sta_config": 5, 
      +  ],
      +  "sta_active": 0,
      +  "sta_config": 5,
         "sta_pwd": [
      -    "myWlAnPaszxwo!z", 
      +    "myWlAnPaszxwo!z",
           "myWlAnPaszxwo!z2"
      -  ], 
      +  ],
         "sta_ssid": [
      -    "wlan.1", 
      +    "wlan.1",
           "my-wlan"
      -  ], 
      -  "web_password": "myPaszxwo!z", 
      +  ],
      +  "web_password": "myPaszxwo!z",
         "webserver": 2
         ...
       }
      @@ -194,7 +194,7 @@ If you do not want using auto extensions use the --no-extension par
       

      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, SonoffRF, System, Timers, Wifi

      -

      These are similary to the categories on https://github.com/arendst/Sonoff-Tasmota/wiki/Commands.

      +

      These are similary to the categories on https://github.com/arendst/Tasmota/wiki/Commands.

      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 sonoff-4281 -c my.conf --output-format cmnd --group Main MQTT Management Wifi
       

      Configuration file

      @@ -222,7 +222,7 @@ If you do not want using auto extensions use the --no-extension par [-g {Control,Devices,Display,Domoticz,Internal,KNX,Light,MQTT,Management,Power,Rules,Sensor,Serial,SetOption,SonoffRF,System,Timer,Wifi} [{Control,Devices,Display,Domoticz,Internal,KNX,Light,MQTT,Management,Power,Rules,Sensor,Serial,SetOption,SonoffRF,System,Timer,Wifi} ...]] [--ignore-warnings] [-h] [-H] [-v] [-V] -Backup/Restore Sonoff-Tasmota configuration data. Args that start with '--' +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 diff --git a/tools/decode-config.md b/tools/decode-config.md index 883467dfa..2b0f8c62e 100644 --- a/tools/decode-config.md +++ b/tools/decode-config.md @@ -1,14 +1,14 @@ # decode-config.py -_decode-config.py_ is able to backup and restore Sonoff-Tasmota configuration. +_decode-config.py_ is able to backup and restore Tasmota configuration. 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": +Comparing backup files created by *decode-config.py* and *.dmp files created by Tasmota "Backup/Restore Configuration": -|   | decode-config.py
      *.json file | Sonoff-Tasmota
      *.dmp file | +|   | decode-config.py
      *.json file | Tasmota
      *.dmp file | |-------------------------|:-------------------------------:|:-----------------------------------:| | Encrypted | No | Yes | | Readable | Yes | No | @@ -41,28 +41,28 @@ _decode-config.py_ is compatible with Tasmota version from v5.10.0 up to now. * [Notes](decode-config.md#notes) ## Prerequisite -* [Python](https://en.wikipedia.org/wiki/Python_(programming_language)) +* [Python](https://en.wikipedia.org/wiki/Python_(programming_language)) This program is written in [Python](https://en.wikipedia.org/wiki/Python_(programming_language)) so you need to install a working python environment (for details see [Python Setup and Usage](https://docs.python.org/2.7/using/index.html)) -* [Sonoff-Tasmota](https://github.com/arendst/Sonoff-Tasmota) [Firmware](https://github.com/arendst/Sonoff-Tasmota/releases) with Web-Server enabled: - * To backup or restore configurations from or to a Sonoff-Tasmota device you need a firmare with enabled web-server in admin mode (command [WebServer 2](https://github.com/arendst/Sonoff-Tasmota/wiki/Commands#wifi)). This is the Tasmota default. +* [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://github.com/arendst/Tasmota/wiki/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: +_decode-config.py_ can handle the following backup file types: ### .dmp Format -Configuration data as used by Tasmota "Backup/Restore Configuration" web interface. +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. +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/Sonoff-Tasmota/blob/master/sonoff/settings.h) in decrypted 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/sonoff/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. @@ -74,35 +74,35 @@ After download don't forget to set the executable flag under linux with `chmod + ### Basics At least pass a source where you want to read the configuration data from using `-f ` or `-d `: -The source can be either +The source can be either * a Tasmota device hostname or IP using the `-d ` parameter * a Tasmota `*.dmp` configuration file using `-f ` parameter -Example: +Example: decode-config.py -d sonoff-4281 will output a human readable configuration in [JSON](http://www.json.org/)-format: { - "altitude": 112, - "baudrate": 115200, - "blinkcount": 10, - "blinktime": 10, + "altitude": 112, + "baudrate": 115200, + "blinkcount": 10, + "blinktime": 10, ... "ws_width": [ - 1, - 3, + 1, + 3, 5 ] } ### Save backup file -To save the output as backup file use `--backup-file `, you can use placeholder for Version, Friendlyname and Hostname: +To save the output as backup file use `--backup-file `, you can use placeholder for Version, Friendlyname and Hostname: decode-config.py -d sonoff-4281 --backup-file Config_@f_@v - + If you have setup a WebPassword within Tasmota, use decode-config.py -d sonoff-4281 -p --backup-file Config_@f_@v @@ -112,10 +112,10 @@ will create a file like `Config_Sonoff_6.4.0.json` (the part `Sonoff` and `6.4.0 ### Restore backup file Reading back a saved (and possible changed) backup file use the `--restore-file ` 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_Sonoff_6.2.1.json` to device `sonoff-4281` use: +To restore the previously save backup file `Config_Sonoff_6.2.1.json` to device `sonoff-4281` use: decode-config.py -d sonoff-4281 --restore-file Config_Sonoff_6.2.1.json - + with password set by WebPassword: decode-config.py -d sonoff-4281 -p --restore-file Config_Sonoff_6.2.1.json @@ -134,29 +134,29 @@ Example: { ... - "hostname": "%s-%04d", + "hostname": "%s-%04d", "ip_address": [ - "0.0.0.0", - "192.168.12.1", - "255.255.255.0", + "0.0.0.0", + "192.168.12.1", + "255.255.255.0", "192.168.12.1" - ], + ], "ntp_server": [ - "ntp.localnet.home", - "ntp2.localnet.home", + "ntp.localnet.home", + "ntp2.localnet.home", "192.168.12.1" - ], - "sta_active": 0, - "sta_config": 5, + ], + "sta_active": 0, + "sta_config": 5, "sta_pwd": [ - "myWlAnPaszxwo!z", + "myWlAnPaszxwo!z", "myWlAnPaszxwo!z2" - ], + ], "sta_ssid": [ - "wlan.1", + "wlan.1", "my-wlan" - ], - "web_password": "myPaszxwo!z", + ], + "web_password": "myPaszxwo!z", "webserver": 2 ... } @@ -192,11 +192,11 @@ Example: 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. +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`, `SonoffRF`, `System`, `Timers`, `Wifi` -These are similary to the categories on [https://github.com/arendst/Sonoff-Tasmota/wiki/Commands](Tasmota Command Wiki). +These are similary to the categories on [https://github.com/arendst/Tasmota/wiki/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. @@ -240,7 +240,7 @@ For advanced help use `-H` or `--full-help`: [-g {Control,Devices,Display,Domoticz,Internal,Knx,Light,Management,Mqtt,Power,Rules,Sensor,Serial,Setoption,Shutter,Sonoffrf,System,Timer,Wifi} [{Control,Devices,Display,Domoticz,Internal,Knx,Light,Management,Mqtt,Power,Rules,Sensor,Serial,Setoption,Shutter,Sonoffrf,System,Timer,Wifi} ...]] [--ignore-warnings] [-h] [-H] [-v] [-V] - Backup/Restore Sonoff-Tasmota configuration data. Args that start with '--' + 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 @@ -383,8 +383,8 @@ will produce JSON configuration files for host sonoff1, sonoff2 and sonoff3 usin ## Notes Some general notes: * Filename replacement macros **@h** and **@H**: - * **@h** -The **@h** replacement macro uses the hostname configured with the Tasomta Wifi `Hostname ` 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 ` as source). + * **@h** +The **@h** replacement macro uses the hostname configured with the Tasomta Wifi `Hostname ` 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 ` as source). To prevent having a useless % in your filename, **@h** will not replaced by configuration data hostname if this contains '%' characters. - * **@H** + * **@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`) diff --git a/tools/decode-config.py b/tools/decode-config.py index 12ce09baa..450c1d1cb 100755 --- a/tools/decode-config.py +++ b/tools/decode-config.py @@ -3,7 +3,7 @@ VER = '2.3.0036' """ - decode-config.py - Backup/Restore Sonoff-Tasmota configuration data + decode-config.py - Backup/Restore Tasmota configuration data Copyright (C) 2019 Norbert Richter @@ -29,7 +29,7 @@ Requirements: Instructions: Execute command with option -d to retrieve config data from a host or use -f to read a configuration file saved using Tasmota Web-UI - + For further information read 'decode-config.md' For help execute command with argument -h (or -H for advanced help) @@ -46,7 +46,7 @@ Usage: decode-config.py [-f ] [-d ] [-P ] [-g {Control,Devices,Display,Domoticz,Internal,Knx,Light,Management,Mqtt,Power,Rules,Sensor,Serial,Setoption,Shutter,Sonoffrf,System,Timer,Wifi} [{Control,Devices,Display,Domoticz,Internal,Knx,Light,Management,Mqtt,Power,Rules,Sensor,Serial,Setoption,Shutter,Sonoffrf,System,Timer,Wifi} ...]] [--ignore-warnings] [-h] [-H] [-v] [-V] - Backup/Restore Sonoff-Tasmota configuration data. Args that start with '--' + 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 @@ -263,7 +263,7 @@ exitcode = 0 Settings dictionary describes the config file fields definition: = { : } - + : "string" a python valid dictionary key (string) @@ -333,12 +333,12 @@ Settings dictionary describes the config file fields definition: to convert value from JSON back to binary object Common definitions - + : | | None function to be called or string to evaluate: : A function name will be called with one or two parameter: - The value to be processed + The value to be processed (optional) the current array index (1,n) A string will be evaluate as is. The following @@ -358,7 +358,7 @@ Settings dictionary describes the config file fields definition: numbers in the range -2147483648 through 2147483647 : unsigned integer numbers in the range 0 through 4294967295 - + """ # ---------------------------------------------------------------------- # Settings helper @@ -370,16 +370,16 @@ def passwordwrite(value): def bitsRead(x, n=0, c=1): """ Reads bit(s) of a number - + @param x: the number from which to read - + @param n: which bit position to read - + @param c: how many bits to read (1 if omitted) - + @return: the bit value(s) """ @@ -396,7 +396,7 @@ def bitsRead(x, n=0, c=1): x &= (1<= 2: print >> sys.stderr, "SetFieldValue(): fielddef {}, addr 0x{:04x} value {} formatcnt {} singletype {} bitsize {} ".format(fielddef,addr,value,formatcnt,singletype,bitsize) if not format_[-1:].lower() in ['s','p']: @@ -2309,10 +2309,10 @@ def SetFieldValue(fielddef, dobj, addr, value): try: struct.pack_into(singletype, dobj, addr, val) except struct.error as e: - exit(ExitCode.RESTORE_DATA_ERROR, - "Single type {} [fielddef={}, addr=0x{:04x}, value={}] - skipped!".format(e,fielddef,addr,val), - type_=LogType.WARNING, - doexit=not args.ignorewarning, + exit(ExitCode.RESTORE_DATA_ERROR, + "Single type {} [fielddef={}, addr=0x{:04x}, value={}] - skipped!".format(e,fielddef,addr,val), + type_=LogType.WARNING, + doexit=not args.ignorewarning, line=inspect.getlineno(inspect.currentframe())) value >>= bitsize else: @@ -2321,10 +2321,10 @@ def SetFieldValue(fielddef, dobj, addr, value): try: struct.pack_into(format_, dobj, addr, value) except struct.error as e: - exit(ExitCode.RESTORE_DATA_ERROR, - "String type {} [fielddef={}, addr=0x{:04x}, value={}} - skipped!".format(e,fielddef,addr,value), - type_=LogType.WARNING, - doexit=not args.ignorewarning, + exit(ExitCode.RESTORE_DATA_ERROR, + "String type {} [fielddef={}, addr=0x{:04x}, value={}} - skipped!".format(e,fielddef,addr,value), + type_=LogType.WARNING, + doexit=not args.ignorewarning, line=inspect.getlineno(inspect.currentframe())) return dobj @@ -2372,7 +2372,7 @@ def GetField(dobj, fieldname, fielddef, raw=False, addroffset=0): value = GetField(dobj, fieldname, subfielddef, raw=raw, addroffset=addroffset+offset) valuemapping.append(value) offset += length - + # contains a dict elif isinstance(format_, dict): mapping_value = {} @@ -2567,7 +2567,7 @@ def SetField(dobj, fieldname, fielddef, restore, addroffset=0, filename=""): curvalue = GetFieldValue(fielddef, dobj, baseaddr+addroffset) if prevvalue != curvalue and args.verbose: message("Value for '{}' changed from {} to {}".format(fieldname, prevvalue, curvalue), type_=LogType.INFO) - else: + else: if args.debug >= 2: print >> sys.stderr, "SetField(): Special field '{}' using '{}'/{}{} @{} skipped".format(fieldname, format_, arraydef, bits, hex(baseaddr+addroffset)) else: @@ -2757,14 +2757,14 @@ def Mapping2Bin(decode_cfg, jsonconfig, filename=""): restore data mapping @param filename: name of the restore file (for error output only) - + @return: changed binary config data (decrypted) or None on error """ if isinstance(decode_cfg, str): decode_cfg = bytearray(decode_cfg) - + # get binary header data to use the correct version template from device version, size, setting = GetTemplateSetting(decode_cfg) @@ -2807,13 +2807,13 @@ def Mapping2Cmnd(decode_cfg, valuemapping, filename=""): data mapping @param filename: name of the restore file (for error output only) - + @return: Tasmota command mapping {group: [cmnd <,cmnd <,...>>]} """ if isinstance(decode_cfg, str): decode_cfg = bytearray(decode_cfg) - + # get binary header data to use the correct version template from device version, size, setting = GetTemplateSetting(decode_cfg) @@ -2984,7 +2984,7 @@ def Restore(restorefile, backupfileformat, encode_cfg, decode_cfg, configmapping version, size, setting = GetTemplateSetting(new_decode_cfg) # get config file version cfg_version = GetField(new_decode_cfg, 'version', setting['version'], raw=True) - message("Config file contains data of Sonoff-Tasmota {}".format(GetVersionStr(cfg_version)), type_=LogType.INFO) + message("Config file contains data of Tasmota {}".format(GetVersionStr(cfg_version)), type_=LogType.INFO) if args.forcerestore or new_encode_cfg != encode_cfg: # write config direct to device via http if args.device is not None: @@ -3040,7 +3040,7 @@ def OutputTasmotaCmnds(tasmotacmnds): print print "# {}:".format(group) OutputTasmotaSubCmnds(cmnds) - + else: cmnds = [] for group in groups: @@ -3051,12 +3051,12 @@ def OutputTasmotaCmnds(tasmotacmnds): def ParseArgs(): """ Program argument parser - + @return: configargparse.parse_args() result """ global parser - parser = configargparse.ArgumentParser(description='Backup/Restore Sonoff-Tasmota configuration data.', + parser = configargparse.ArgumentParser(description='Backup/Restore Tasmota configuration data.', epilog='Either argument -d or -f must be given.', add_help=False, formatter_class=lambda prog: CustomHelpFormatter(prog)) @@ -3293,7 +3293,7 @@ if __name__ == "__main__": # decode into mappings dictionary configmapping = Bin2Mapping(decode_cfg) if args.verbose and 'version' in configmapping: - message("{} '{}' is using Sonoff-Tasmota {}".format('File' if args.tasmotafile is not None else 'Device', + message("{} '{}' is using Tasmota {}".format('File' if args.tasmotafile is not None else 'Device', args.tasmotafile if args.tasmotafile is not None else args.device, GetVersionStr(configmapping['version'])), type_=LogType.INFO) @@ -3314,5 +3314,5 @@ if __name__ == "__main__": if args.outputformat == 'cmnd' or args.outputformat == 'command': tasmotacmnds = Mapping2Cmnd(decode_cfg, configmapping) OutputTasmotaCmnds(tasmotacmnds) - + sys.exit(exitcode) diff --git a/tools/decode-status.py b/tools/decode-status.py index 10deefede..fcf65c7db 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ - decode-status.py - decode status for Sonoff-Tasmota + decode-status.py - decode status for Tasmota Copyright (C) 2019 Theo Arends diff --git a/tools/fw_server/fw-server.py b/tools/fw_server/fw-server.py index 4d70f0f5e..df246f5b9 100644 --- a/tools/fw_server/fw-server.py +++ b/tools/fw_server/fw-server.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # coding=utf-8 """ -fw-server.py - firmware server for Sonoff-Tasmota OTA upgrade +fw-server.py - firmware server for Tasmota OTA upgrade Copyright (C) 2019 Gennaro Tortone @@ -24,12 +24,12 @@ Requirements: - pip install netifaces flask Instructions: - Copy Sonoff-Tasmota firmware binary files in 'fw' directory or + Copy Tasmota firmware binary files in 'fw' directory or specify a different directory with -f parameter. - A set of prebuilt files can be downloaded by Sonoff-Tasmota release page: - https://github.com/arendst/Sonoff-Tasmota/releases + A set of prebuilt files can be downloaded by Tasmota release page: + https://github.com/arendst/Tasmota/releases - Configure your Sonoff-Tasmota device with your fw-server URL: + Configure your Tasmota device with your fw-server URL: Firmware Upgrade -> Upgrade by web server http://:5000/sonoff-minimal.bin diff --git a/tools/fw_server/fw/README b/tools/fw_server/fw/README index c29367442..62274f362 100644 --- a/tools/fw_server/fw/README +++ b/tools/fw_server/fw/README @@ -1,3 +1,3 @@ -Copy Sonoff-Tasmota firmware binary files in this directory. -A set of prebuilt files can be downloaded by Sonoff-Tasmota release page: -https://github.com/arendst/Sonoff-Tasmota/releases \ No newline at end of file +Copy Tasmota firmware binary files in this directory. +A set of prebuilt files can be downloaded by Tasmota release page: +https://github.com/arendst/Tasmota/releases \ No newline at end of file