Merge pull request #6 from arendst/development

update repo
This commit is contained in:
Vic 2021-01-02 23:33:24 +00:00 committed by GitHub
commit 0ebe687b5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
346 changed files with 6518 additions and 3152 deletions

View File

@ -3,7 +3,7 @@
**Related issue (if applicable):** fixes #<Tasmota issue number goes here>
## Checklist:
- [ ] The pull request is done against the latest dev branch
- [ ] The pull request is done against the latest development branch
- [ ] Only relevant files were touched
- [ ] Only one feature/fix was added per PR and the code change compiles without warnings
- [ ] The code change is tested and works on Tasmota core ESP8266 V.2.7.4.9

View File

@ -1,6 +1,6 @@
name: Tasmota CI
on:
on:
pull_request:
jobs:
@ -16,7 +16,7 @@ jobs:
pip install -U platformio
platformio upgrade --dev
platformio update
- name: Run PlatformIO
- name: Run PlatformIO
run: platformio run -e tasmota
- uses: actions/upload-artifact@v2
with:
@ -79,7 +79,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota-sensors:
runs-on: ubuntu-latest
steps:
@ -156,6 +156,25 @@ jobs:
name: firmware
path: ./build_output/firmware
tasmota-AF:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up Python
uses: actions/setup-python@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U platformio
platformio upgrade --dev
platformio update
- name: Run PlatformIO
run: platformio run -e tasmota-AF
- uses: actions/upload-artifact@v2
with:
name: firmware
path: ./build_output/firmware
tasmota-BG:
runs-on: ubuntu-latest
steps:
@ -174,7 +193,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota-BR:
runs-on: ubuntu-latest
steps:
@ -250,7 +269,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota-ES:
runs-on: ubuntu-latest
steps:
@ -269,7 +288,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota-FR:
runs-on: ubuntu-latest
steps:
@ -326,7 +345,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota-HU:
runs-on: ubuntu-latest
steps:
@ -402,7 +421,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota-PL:
runs-on: ubuntu-latest
steps:
@ -478,7 +497,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota-SE:
runs-on: ubuntu-latest
steps:
@ -554,7 +573,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota-UK:
runs-on: ubuntu-latest
steps:

View File

@ -23,7 +23,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota32-webcam:
runs-on: ubuntu-latest
steps:
@ -44,6 +44,26 @@ jobs:
name: firmware
path: ./build_output/firmware
tasmota32-odroidgo:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up Python
uses: actions/setup-python@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U platformio
platformio upgrade --dev
platformio update
- name: Run PlatformIO
run: |
platformio run -e tasmota32-odroidgo
- uses: actions/upload-artifact@v2
with:
name: firmware
path: ./build_output/firmware
tasmota32-minimal:
runs-on: ubuntu-latest
steps:
@ -103,7 +123,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota32-sensors:
runs-on: ubuntu-latest
steps:
@ -164,6 +184,26 @@ jobs:
name: firmware
path: ./build_output/firmware
tasmota32-AF:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up Python
uses: actions/setup-python@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U platformio
platformio upgrade --dev
platformio update
- name: Run PlatformIO
run: |
platformio run -e tasmota32-AF
- uses: actions/upload-artifact@v2
with:
name: firmware
path: ./build_output/firmware
tasmota32-BG:
runs-on: ubuntu-latest
steps:
@ -183,7 +223,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota32-BR:
runs-on: ubuntu-latest
steps:
@ -263,7 +303,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota32-ES:
runs-on: ubuntu-latest
steps:
@ -343,7 +383,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota32-HU:
runs-on: ubuntu-latest
steps:
@ -423,7 +463,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota32-PL:
runs-on: ubuntu-latest
steps:
@ -503,7 +543,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota32-SE:
runs-on: ubuntu-latest
steps:
@ -583,7 +623,7 @@ jobs:
with:
name: firmware
path: ./build_output/firmware
tasmota32-UK:
runs-on: ubuntu-latest
steps:

View File

@ -230,6 +230,30 @@ jobs:
name: firmware
path: ./build_output/firmware
tasmota-AF:
needs: tasmota_pull
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v1
- name: Set up Python
uses: actions/setup-python@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U platformio
platformio upgrade --dev
platformio update
- name: Run PlatformIO
run: |
platformio run -e tasmota-AF
- uses: actions/upload-artifact@v2
with:
name: firmware
path: ./build_output/firmware
tasmota-BG:
needs: tasmota_pull
runs-on: ubuntu-latest
@ -851,6 +875,29 @@ jobs:
path: ./build_output/firmware
tasmota32-odroidgo:
needs: tasmota_pull
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v1
- name: Set up Python
uses: actions/setup-python@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U platformio
platformio upgrade --dev
platformio update
- name: Run PlatformIO
run: |
platformio run -e tasmota32-odroidgo
- uses: actions/upload-artifact@v2
with:
name: firmware
path: ./build_output/firmware
tasmota32-knx:
needs: tasmota_pull
runs-on: ubuntu-latest
@ -966,6 +1013,29 @@ jobs:
path: ./build_output/firmware
tasmota32-AF:
needs: tasmota_pull
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v1
- name: Set up Python
uses: actions/setup-python@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U platformio
platformio upgrade --dev
platformio update
- name: Run PlatformIO
run: |
platformio run -e tasmota32-AF
- uses: actions/upload-artifact@v2
with:
name: firmware
path: ./build_output/firmware
tasmota32-BG:
needs: tasmota_pull
runs-on: ubuntu-latest
@ -1513,6 +1583,7 @@ jobs:
mkdir -p ./firmware/tasmota/languages
mkdir -p ./firmware/tasmota32/languages
mkdir -p ./firmware/tasmota32/ESP32_needed_files/
mkdir -p ./firmware/tasmota32/Odroid_go_needed_files/
[ ! -f ./mv_firmware/tasmota.* ] || mv ./mv_firmware/tasmota.* ./firmware/tasmota/
[ ! -f ./mv_firmware/tasmota-sensors.* ] || mv ./mv_firmware/tasmota-sensors.* ./firmware/tasmota/
[ ! -f ./mv_firmware/tasmota-minimal.* ] || mv ./mv_firmware/tasmota-minimal.* ./firmware/tasmota/
@ -1528,12 +1599,14 @@ jobs:
[ ! -f ./mv_firmware/tasmota32-ir*.* ] || mv ./mv_firmware/tasmota32-ir*.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32-display.* ] || mv ./mv_firmware/tasmota32-display.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32-web*.* ] || mv ./mv_firmware/tasmota32-web*.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/tasmota32-odroidgo.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32-knx.* ] || mv ./mv_firmware/tasmota32-knx.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32* ] || mv ./mv_firmware/tasmota32* ./firmware/tasmota32/languages/
[ ! -f ./mv_firmware/* ] || mv ./mv_firmware/* ./firmware/tasmota/languages/
rm ./firmware/tasmota32/*.gz
rm ./firmware/tasmota32/languages/*.gz
[ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/
[ ! -f ./tools/Esptool/Odroid_go/*.* ] || mv ./tools/Esptool/Odroid_go/*.* ./firmware/tasmota32/Odroid_go_needed_files/
[ ! -f ./FIRMWARE.md ] || mv -f ./FIRMWARE.md ./README.md
- name: Commit files # transfer the new binaries back into the repository
run: |

View File

@ -230,6 +230,30 @@ jobs:
name: firmware
path: ./build_output/firmware
tasmota-AF:
needs: tasmota_pull
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v1
- name: Set up Python
uses: actions/setup-python@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U platformio
platformio upgrade --dev
platformio update
- name: Run PlatformIO
run: |
platformio run -e tasmota-AF
- uses: actions/upload-artifact@v2
with:
name: firmware
path: ./build_output/firmware
tasmota-BG:
needs: tasmota_pull
runs-on: ubuntu-latest
@ -851,6 +875,29 @@ jobs:
path: ./build_output/firmware
tasmota32-odroidgo:
needs: tasmota_pull
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v1
- name: Set up Python
uses: actions/setup-python@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U platformio
platformio upgrade --dev
platformio update
- name: Run PlatformIO
run: |
platformio run -e tasmota32-odroidgo
- uses: actions/upload-artifact@v2
with:
name: firmware
path: ./build_output/firmware
tasmota32-knx:
needs: tasmota_pull
runs-on: ubuntu-latest
@ -966,6 +1013,29 @@ jobs:
path: ./build_output/firmware
tasmota32-AF:
needs: tasmota_pull
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v1
- name: Set up Python
uses: actions/setup-python@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U platformio
platformio upgrade --dev
platformio update
- name: Run PlatformIO
run: |
platformio run -e tasmota32-AF
- uses: actions/upload-artifact@v2
with:
name: firmware
path: ./build_output/firmware
tasmota32-BG:
needs: tasmota_pull
runs-on: ubuntu-latest
@ -1513,6 +1583,7 @@ jobs:
mkdir -p ./firmware/tasmota/languages
mkdir -p ./firmware/tasmota32/languages
mkdir -p ./firmware/tasmota32/ESP32_needed_files/
mkdir -p ./firmware/tasmota32/Odroid_go_needed_files/
[ ! -f ./mv_firmware/tasmota.* ] || mv ./mv_firmware/tasmota.* ./firmware/tasmota/
[ ! -f ./mv_firmware/tasmota-sensors.* ] || mv ./mv_firmware/tasmota-sensors.* ./firmware/tasmota/
[ ! -f ./mv_firmware/tasmota-minimal.* ] || mv ./mv_firmware/tasmota-minimal.* ./firmware/tasmota/
@ -1520,7 +1591,7 @@ jobs:
[ ! -f ./mv_firmware/tasmota-ir*.* ] || mv ./mv_firmware/tasmota-ir*.* ./firmware/tasmota/
[ ! -f ./mv_firmware/tasmota-display.* ] || mv ./mv_firmware/tasmota-display.* ./firmware/tasmota/
[ ! -f ./mv_firmware/tasmota-knx.* ] || mv ./mv_firmware/tasmota-knx.* ./firmware/tasmota/
[ ! -f ./mv_firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/tasmota-zbbridge.* ./firmware/tasmota/
[ ! -f ./mv_firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/tasmota-zbbridge.* ./firmware/tasmota/
[ ! -f ./mv_firmware/tasmota32.* ] || mv ./mv_firmware/tasmota32.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32-sensors.* ] || mv ./mv_firmware/tasmota32-sensors.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32-minimal.* ] || mv ./mv_firmware/tasmota32-minimal.* ./firmware/tasmota32/
@ -1528,12 +1599,14 @@ jobs:
[ ! -f ./mv_firmware/tasmota32-ir*.* ] || mv ./mv_firmware/tasmota32-ir*.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32-display.* ] || mv ./mv_firmware/tasmota32-display.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32-web*.* ] || mv ./mv_firmware/tasmota32-web*.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/tasmota32-odroidgo.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32-knx.* ] || mv ./mv_firmware/tasmota32-knx.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/tasmota32* ] || mv ./mv_firmware/tasmota32* ./firmware/tasmota32/languages/
[ ! -f ./mv_firmware/* ] || mv ./mv_firmware/* ./firmware/tasmota/languages/
rm ./firmware/tasmota32/*.gz
rm ./firmware/tasmota32/languages/*.gz
[ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/
[ ! -f ./tools/Esptool/Odroid_go/*.* ] || mv ./tools/Esptool/Odroid_go/*.* ./firmware/tasmota32/Odroid_go_needed_files/
[ ! -f ./FIRMWARE.md ] || mv -f ./RELEASENOTES.md ./README.md
- name: Commit files # transfer the new binaries back into the repository
run: |

View File

@ -201,15 +201,17 @@
| USE_DISPLAY_ILI9341 | - | - | - | - | - | - | x |
| USE_DISPLAY_EPAPER_29 | - | - | - | - | - | - | x |
| USE_DISPLAY_EPAPER_42 | - | - | - | - | - | - | x |
| USE_DISPLAY_ILI9488 | - | - | - | - | - | - | - |
| USE_DISPLAY_SSD1351 | - | - | - | - | - | - | - |
| USE_DISPLAY_RA8876 | - | - | - | - | - | - | - |
| USE_DISPLAY_ILI9488 | - | - | - | - | - | - | x |
| USE_DISPLAY_SSD1351 | - | - | - | - | - | - | x |
| USE_DISPLAY_RA8876 | - | - | - | - | - | - | x |
| USE_DISPLAY_ST7789 | - | - | - | - | - | - | x |
## Additional Features and Sensors on ESP32
| Feature or Sensor | minimal | lite | tasmota | knx | sensors | ir | display | webcam | Remarks
|-----------------------|---------|-------|--------|-----|---------|----|---------|--------|--------
| USE_MI_ESP32 | - | - | - | - | - | - | - | - |
| USE_MI_ESP32 | - | - | X | - | X | - | - | - | See SetOption115
| USE_IBEACON_ESP32 | - | - | - | - | - | - | - | - |
| USE_WEBCAM | - | - | - | - | - | - | - | x |
| USE_ETHERNET | - | - | - | - | - | - | - | - |
| USE_I2S_AUDIO | - | - | - | - | - | - | - | - |

View File

@ -3,16 +3,43 @@ All notable changes to this project will be documented in this file.
## [Unreleased] - Development
## [9.2.0.1]
## [9.2.0.2]
### Added
- Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin (#8630)
- Command ``CTRange`` to specify the visible CT range the bulb is capable of (#10311)
- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels (#10311)
- Disable `USE_LIGHT`` light support for ZBBridge (saves 17.6kb)
### Breaking Changed
- Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``SPI CS`` by ``RC522 CS``
- Replaced NRF24L01 GPIO selection from ``SPI CS`` by ``NRF24 CS`` and ``SPI DC`` by ``NRF24 DC``
- Replaced ILI9341 GPIO selection from ``SPI CS`` by ``ILI9341 CS`` and ``SPI DC`` by ``ILI9341 DC``
- Replaced ST7789 GPIO selection from ``SPI CS`` by ``ST7789 CS`` and ``SPI DC`` by ``ST7789 DC``
- Replaced ILI9488 GPIO selection from ``SPI CS`` by ``ILI9488_CS``
- Replaced EPaper29 GPIO selection from ``SPI CS`` by ``EPaper29 CS``
- Replaced EPaper42 GPIO selection from ``SPI CS`` by ``EPaper42 CS``
- Replaced SSD1351 GPIO selection from ``SPI CS`` by ``SSD1351 CS``
- Replaced RA8876 GPIO selection from ``SPI CS`` by ``RA8876 CS``
### Changed
- Maximum chars in AddLog_P logging reduced from 700 to 128 (LOGSZ) to enhance stability
## [9.2.0.1] 20201229
### Added
- Milliseconds to console output (#10152)
- Support for P9813 RGB Led MOSFET controller (#10104)
- Support for GPIO option selection
- Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs (#10196)
- Support for FTC532 8-button touch controller by Peter Franck (#10222)
- Support character `#` to be replaced by `space`-character in command ``Publish`` topic (#10258)
- BSSID and Signal Strength Indicator to GUI wifi scan result (#10253)
- Support for Afrikaans language translations by Christiaan Heerze
- Support for IR inverted leds using ``#define IR_SEND_INVERTED true`` (#10301)
- Support for disabling 38kHz IR modulation using ``#define IR_SEND_USE_MODULATION false`` (#10301)
- Support for SPI display driver for ST7789 TFT by Gerhard Mutz (#9037)
### Changed
- Logging from fixed global memory buffer to stack buffer freeing 700 bytes RAM
- Logging from heap to stack freeing 700 bytes RAM
### Fixed
- Redesign syslog and mqttlog using log buffer (#10164)

View File

@ -47,13 +47,13 @@ The process is straight-forward.
- 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/Tasmota/tree/dev) branch of Tasmota.
- Create a Pull Request against the [**development**](https://github.com/arendst/Tasmota/tree/development) branch of Tasmota.
1. All pull requests must be done against the dev branch.
1. All pull requests must be done against the development branch.
2. Only relevant files should be touched (Also beware if your editor has auto-formatting feature enabled).
3. Only one feature/fix should be added per PR.
4. If adding a new functionality (new hardware, new library support) not related to an existing component move it to it's own modules (.ino file).
5. PRs that don't compile (fail in CI Tests) or cause coding errors will not be merged. Please fix the issue. Same goes for PRs that are raised against older commit in dev - you might need to rebase and resolve conflicts.
5. PRs that don't compile (fail in CI Tests) or cause coding errors will not be merged. Please fix the issue. Same goes for PRs that are raised against older commit in development - you might need to rebase and resolve conflicts.
6. All pull requests should undergo peer review by at least one contributor other than the creator, excepts for the owner.
7. All pull requests should consider updates to the documentation.
8. Pull requests that address an outstanding issue, particularly an issue deemed to be severe, should be given priority.

View File

@ -56,16 +56,36 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
[Complete list](BUILDS.md) of available feature and sensors.
## Changelog v9.2.0.1
## Changelog v9.2.0.2
### Added
- Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311)
- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels [#10311](https://github.com/arendst/Tasmota/issues/10311)
- Milliseconds to console output [#10152](https://github.com/arendst/Tasmota/issues/10152)
- Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196)
- BSSID and Signal Strength Indicator to GUI wifi scan result [#10253](https://github.com/arendst/Tasmota/issues/10253)
- Support for P9813 RGB Led MOSFET controller [#10104](https://github.com/arendst/Tasmota/issues/10104)
- Support for GPIO option selection
- Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196)
- Support for FTC532 8-button touch controller by Peter Franck [#10222](https://github.com/arendst/Tasmota/issues/10222)
- Support character `#` to be replaced by `space`-character in command ``Publish`` topic [#10258](https://github.com/arendst/Tasmota/issues/10258)
- Support for Afrikaans language translations by Christiaan Heerze
- Support for IR inverted leds using ``#define IR_SEND_INVERTED true`` [#10301](https://github.com/arendst/Tasmota/issues/10301)
- Support for disabling 38kHz IR modulation using ``#define IR_SEND_USE_MODULATION false`` [#10301](https://github.com/arendst/Tasmota/issues/10301)
- Support for SPI display driver for ST7789 TFT by Gerhard Mutz [#9037](https://github.com/arendst/Tasmota/issues/9037)
- Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin [#8630](https://github.com/arendst/Tasmota/issues/8630)
### Breaking Changed
- Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``SPI CS`` by ``RC522 CS``
- Replaced NRF24L01 GPIO selection from ``SPI CS`` by ``NRF24 CS`` and ``SPI DC`` by ``NRF24 DC``
- Replaced ILI9341 GPIO selection from ``SPI CS`` by ``ILI9341 CS`` and ``SPI DC`` by ``ILI9341 DC``
- Replaced ST7789 GPIO selection from ``SPI CS`` by ``ST7789 CS`` and ``SPI DC`` by ``ST7789 DC``
- Replaced ILI9488 GPIO selection from ``SPI CS`` by ``ILI9488_CS``
- Replaced EPaper29 GPIO selection from ``SPI CS`` by ``EPaper29 CS``
- Replaced EPaper42 GPIO selection from ``SPI CS`` by ``EPaper42 CS``
- Replaced SSD1351 GPIO selection from ``SPI CS`` by ``SSD1351 CS``
- Replaced RA8876 GPIO selection from ``SPI CS`` by ``RA8876 CS``
### Changed
- Logging from fixed global memory buffer to stack buffer freeing 700 bytes RAM
- Logging from heap to stack freeing 700 bytes RAM
### Fixed
- Redesign syslog and mqttlog using log buffer [#10164](https://github.com/arendst/Tasmota/issues/10164)

View File

@ -1,7 +1,7 @@
/*
TasmotaSerial.cpp - Implementation of software serial with hardware serial fallback for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This library is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
TasmotaSerial.h - Implementation of software serial with hardware serial fallback for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This library is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
UdpListener.h - webserver for Tasmota
Copyright (C) 2020 Theo Arends & Stephan Hadinger
Copyright (C) 2021 Theo Arends & Stephan Hadinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
UnishoxStrings.c - support library for compressed strings in Flash
Copyright (C) 2020 Theo Arends and Stephan Hadinger
Copyright (C) 2021 Theo Arends and Stephan Hadinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
UnishoxStrings.c - support library for compressed strings in Flash
Copyright (C) 2020 Theo Arends and Stephan Hadinger
Copyright (C) 2021 Theo Arends and Stephan Hadinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -28,18 +28,18 @@
/*******************************************************************************************/
/*
* UnishoxStrings compressed literal strings
*
*
* To be typically used for web UI to have multiple strings like JS, CSS, HTML
* compressed in a single list of small strings. This is where Unishox shines.
*
*
* Strings before compression are separated with NULL chars, which makes them ready to use
* once you know the offset in the global array.
*
*
* The list of string is marked by an empty stings, i.e. two consecutive NULL chars
*
*
* To distinguish from uncompressed templates, and to indicate the global size
* the compressed array is prefixed with NULL and the uncompressed size * 16 bytes.
*
*
* Compressed format:
* - Byte 00 : \00 - if non-null, then it is not compressed
* - Byte 01 : <size16> - uncompressed size is <size16> * 16 bytes (always rounded up)
@ -54,22 +54,22 @@
* This class is initialzed with either a PMEM uncompressed list of strings
* or a PMEM unishox-compressed list of strings; in this case RAM is allocated
* to hold the uncompressed data, until the class gets out of scope.
*
*
* To encode, use https://tasmota.hadinger.fr/util
* and use the "Compress strings template with unishox"
* past the C code for the strings, and copy/paste the result
* (don't foget to rename the variable).
*
*
* Input:
* Each string must be terminated with an explicit NULL char "\0". The list is hence
* terminated with a double-NULL.
*
*
* Each string is then indexed as its byte offset in the whole template.
* The offsets are computed at the same time as the compressed version.
* You need to use the online compressor even if you don't use the comrpessed version.
*
*
* Indexes are marked as C++ comments starting with "//="
*
*
* Example input:
* con
* // start of strings

View File

@ -1,7 +1,7 @@
/*
JsonGenerator.cpp - lightweight JSON parser
Copyright (C) 2020 Stephan Hadinger
Copyright (C) 2021 Stephan Hadinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
JsonGenerator.h - lightweight JSON generator
Copyright (C) 2020 Stephan Hadinger
Copyright (C) 2021 Stephan Hadinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
JsonParser.cpp - lightweight JSON parser
Copyright (C) 2020 Stephan Hadinger
Copyright (C) 2021 Stephan Hadinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
JsonParser.h - lightweight JSON parser
Copyright (C) 2020 Stephan Hadinger
Copyright (C) 2021 Stephan Hadinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -228,7 +228,7 @@ public:
// destructor
~JsonParser();
// set the current buffer for attribute access (i.e. set the global)
void setCurrent(void) { k_current_json_buffer = _json; }

View File

@ -1,7 +1,7 @@
/*
TasmotaModbus.cpp - Basic modbus wrapper for TasmotaSerial for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This library is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
TasmotaModbus.h - Basic modbus wrapper for TasmotaSerial for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This library is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -27,7 +27,7 @@ uint16_t Arduino_ST7789::GetColorFromIndex(uint8_t index) {
}
static const uint8_t PROGMEM
cmd_240x240[] = { // Initialization commands for 7789 screens
init_cmd[] = { // Initialization commands for 7789 screens
10, // 9 commands in list:
ST7789_SWRESET, ST_CMD_DELAY, // 1: Software reset, no args, w/delay
150, // 150 ms delay
@ -38,14 +38,6 @@ static const uint8_t PROGMEM
10, // 10 ms delay
ST7789_MADCTL , 1, // 4: Memory access ctrl (directions), 1 arg:
0x00, // Row addr/col addr, bottom to top refresh
ST7789_CASET , 4, // 5: Column addr set, 4 args, no delay:
0x00, ST7789_240x240_XSTART, // XSTART = 0
(ST7789_TFTWIDTH+ST7789_240x240_XSTART) >> 8,
(ST7789_TFTWIDTH+ST7789_240x240_XSTART) & 0xFF, // XEND = 240
ST7789_RASET , 4, // 6: Row addr set, 4 args, no delay:
0x00, ST7789_240x240_YSTART, // YSTART = 0
(ST7789_TFTHEIGHT+ST7789_240x240_YSTART) >> 8,
(ST7789_TFTHEIGHT+ST7789_240x240_YSTART) & 0xFF, // YEND = 240
ST7789_INVON , ST_CMD_DELAY, // 7: Inversion ON
10,
ST7789_NORON , ST_CMD_DELAY, // 8: Normal display on, no args, w/delay
@ -75,7 +67,7 @@ inline uint16_t swapcolor(uint16_t x) {
// Constructor when using software SPI. All output pins are configurable.
Arduino_ST7789::Arduino_ST7789(int8_t dc, int8_t rst, int8_t sid, int8_t sclk, int8_t cs, int8_t bp)
: Renderer(ST7789_TFTWIDTH, ST7789_TFTHEIGHT)
: Renderer(_width, _height)
{
_cs = cs;
_dc = dc;
@ -91,7 +83,7 @@ Arduino_ST7789::Arduino_ST7789(int8_t dc, int8_t rst, int8_t sid, int8_t sclk, i
// Constructor when using hardware SPI. Faster, but must use SPI pins
// specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.)
Arduino_ST7789::Arduino_ST7789(int8_t dc, int8_t rst, int8_t cs, int8_t bp)
: Renderer(ST7789_TFTWIDTH, ST7789_TFTHEIGHT) {
: Renderer(_width, _height) {
_cs = cs;
_dc = dc;
_rst = rst;
@ -335,29 +327,59 @@ void Arduino_ST7789::setRotation(uint8_t m) {
case 0:
writedata(ST7789_MADCTL_MX | ST7789_MADCTL_MY | ST7789_MADCTL_RGB);
_xstart = _colstart;
// _ystart = _rowstart;
_ystart = 80;
_xstart = 0;
_ystart = 0;
if (_width==240 && _height==240) {
_xstart = ST7789_240x240_XSTART_R0;
_ystart = ST7789_240x240_YSTART_R0;
}
if (_width==135 && _height==240) {
_xstart = ST7789_135x240_XSTART_R0;
_ystart = ST7789_135x240_YSTART_R0;
}
break;
case 1:
writedata(ST7789_MADCTL_MY | ST7789_MADCTL_MV | ST7789_MADCTL_RGB);
_ystart = _colstart;
// _xstart = _rowstart;
_xstart = 80;
_ystart = 0;
_xstart = 0;
if (_width==240 && _height==240) {
_xstart = ST7789_240x240_XSTART_R1;
_ystart = ST7789_240x240_YSTART_R1;
}
if (_width==240 && _height==135) {
_xstart = ST7789_135x240_XSTART_R1;
_ystart = ST7789_135x240_YSTART_R1;
}
break;
case 2:
writedata(ST7789_MADCTL_RGB);
_xstart = _colstart;
_ystart = _rowstart;
_xstart = 0;
_ystart = 0;
if (_width==240 && _height==240) {
_xstart = ST7789_240x240_XSTART_R2;
_ystart = ST7789_240x240_YSTART_R2;
}
if (_width==135 && _height==240) {
_xstart = ST7789_135x240_XSTART_R2;
_ystart = ST7789_135x240_YSTART_R2;
}
break;
case 3:
writedata(ST7789_MADCTL_MX | ST7789_MADCTL_MV | ST7789_MADCTL_RGB);
_ystart = _colstart;
_xstart = _rowstart;
_xstart = 0;
_ystart = 0;
if (_width==240 && _height==240) {
_xstart = ST7789_240x240_XSTART_R3;
_ystart = ST7789_240x240_YSTART_R3;
}
if (_width==240 && _height==135) {
_xstart = ST7789_135x240_XSTART_R3;
_ystart = ST7789_135x240_YSTART_R3;
}
break;
}
}
@ -533,12 +555,10 @@ inline void Arduino_ST7789::DC_LOW(void) {
void Arduino_ST7789::init(uint16_t width, uint16_t height) {
commonInit(NULL);
_colstart = ST7789_240x240_XSTART;
_rowstart = ST7789_240x240_YSTART;
_height = height;
_width = width;
displayInit(cmd_240x240);
displayInit(init_cmd);
setRotation(2);

View File

@ -39,11 +39,23 @@
//#define SPI_HAS_TRANSACTION // already defined in SPI.h
#define ST7789_TFTWIDTH 240
#define ST7789_TFTHEIGHT 240
#define ST7789_240x240_XSTART_R0 0
#define ST7789_240x240_YSTART_R0 80
#define ST7789_240x240_XSTART_R1 80
#define ST7789_240x240_YSTART_R1 0
#define ST7789_240x240_XSTART_R2 0
#define ST7789_240x240_YSTART_R2 0
#define ST7789_240x240_XSTART_R3 0
#define ST7789_240x240_YSTART_R3 0
#define ST7789_240x240_XSTART 0
#define ST7789_240x240_YSTART 0
#define ST7789_135x240_XSTART_R0 53
#define ST7789_135x240_YSTART_R0 40
#define ST7789_135x240_XSTART_R1 40
#define ST7789_135x240_YSTART_R1 52
#define ST7789_135x240_XSTART_R2 52
#define ST7789_135x240_YSTART_R2 40
#define ST7789_135x240_XSTART_R3 40
#define ST7789_135x240_YSTART_R3 53
#define ST_CMD_DELAY 0x80 // special signifier for command lists

View File

@ -268,8 +268,8 @@ int BM8563_RTC::SetAlarmIRQ(const RTC_TimeTypeDef &RTC_TimeStruct)
out_buf[1] = ByteToBcd2(RTC_TimeStruct.Hours) & 0x3f;
}
out_buf[2] = 0x00;
out_buf[3] = 0x00;
//out_buf[2] = 0x00;
//out_buf[3] = 0x00;
uint8_t reg_value = ReadReg(0x01);

View File

@ -1,7 +1,7 @@
/*
WiFi compat with ESP32
Copyright (C) 2020 Theo Arends / Jörg Schüler-Maroldt
Copyright (C) 2021 Theo Arends / Jörg Schüler-Maroldt
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

View File

@ -1,7 +1,7 @@
/*
WiFi compat with ESP32
Copyright (C) 2020 Theo Arends / Jörg Schüler-Maroldt
Copyright (C) 2021 Theo Arends / Jörg Schüler-Maroldt
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

View File

@ -21,6 +21,7 @@ default_envs =
; tasmota-display
; tasmota-zbbridge
; tasmota-ir
; tasmota-AF
; tasmota-BG
; tasmota-BR
; tasmota-CN

View File

@ -36,6 +36,7 @@ default_envs =
; tasmota32-ir
; tasmota32-ircustom
; tasmota32solo1
; tasmota32-odroidgo
[common]

View File

@ -8,6 +8,7 @@ default_envs = ${build_envs.default_envs}
; *** Uncomment by deleting ";" in the line(s) below to select version(s)
; tasmota32
; tasmota32-webcam
; tasmota32-odroidgo
; tasmota32-minimal
; tasmota32-lite
; tasmota32-knx
@ -15,6 +16,7 @@ default_envs = ${build_envs.default_envs}
; tasmota32-display
; tasmota32-ir
; tasmota32-ircustom
; tasmota32-AF
; tasmota32-BG
; tasmota32-BR
; tasmota32-CN

View File

@ -67,6 +67,9 @@ build_flags = ${common.build_flags} -DFIRMWARE_ZBBRIDGE
board_build.f_cpu = 160000000L
lib_extra_dirs = lib/lib_ssl
[env:tasmota-AF]
build_flags = ${common.build_flags} -DMY_LANGUAGE=af_AF
[env:tasmota-BG]
build_flags = ${common.build_flags} -DMY_LANGUAGE=bg_BG

View File

@ -36,6 +36,14 @@ board_build.f_cpu = 240000000L
build_flags = ${common32.build_flags} -DFIRMWARE_WEBCAM
lib_extra_dirs = lib/libesp32, lib/lib_basic
[env:tasmota32-odroidgo]
extends = env:tasmota32
board = odroid_esp32
board_build.f_cpu = 240000000L
board_build.partitions = esp32_partition_app1984k_ffat12M.csv
build_flags = ${common32.build_flags} -DBOARD_HAS_PSRAM=true -DFIRMWARE_ODROID_GO
lib_extra_dirs = lib/libesp32, lib/lib_basic, lib/lib_i2c, lib/lib_rf, lib/lib_div, lib/lib_ssl, lib/lib_display
[env:tasmota32-minimal]
extends = env:tasmota32
build_flags = ${common32.build_flags} -DFIRMWARE_MINIMAL
@ -70,6 +78,10 @@ lib_extra_dirs = lib/libesp32, lib/lib_basic
extends = env:tasmota32
build_flags = ${common32.build_flags} ${irremoteesp_full.build_flags} -DFIRMWARE_IR_CUSTOM
[env:tasmota32-AF]
extends = env:tasmota32
build_flags = ${common32.build_flags} -DMY_LANGUAGE=af_AF
[env:tasmota32-BG]
extends = env:tasmota32
build_flags = ${common32.build_flags} -DMY_LANGUAGE=bg_BG

View File

@ -7,7 +7,7 @@
between a secondary, user-allocated stack on the heap and the real
stack.
Copyright (c) 2017 Earle F. Philhower, III. All rights reserved.
Copyright (C) 2021 Earle F. Philhower, III. 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

View File

@ -7,7 +7,7 @@
between a secondary, user-allocated stack on the heap and the real
stack.
Copyright (c) 2017 Earle F. Philhower, III. All rights reserved.
Copyright (C) 2021 Earle F. Philhower, III. 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

View File

@ -3,7 +3,7 @@
- Mostly compatible with Arduino WiFi shield library and standard
WiFiClient/ServerSecure (except for certificate handling).
Copyright (c) 2018 Earle F. Philhower, III
Copyright (C) 2021 Earle F. Philhower, III
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -57,8 +57,8 @@ extern "C" {
#include "coredecls.h"
#define LOG_HEAP_SIZE(a) _Log_heap_size(a)
void _Log_heap_size(const char *msg) {
register uint32_t *sp asm("a1");
int freestack = 4 * (sp - g_pcont->stack);
register uint32_t *sp asm("a1");
int freestack = 4 * (sp - g_pcont->stack);
Serial.printf("%s %d, Fragmentation=%d, Thunkstack=%d, Free stack=%d, FreeContStack=%d\n",
msg, ESP.getFreeHeap(), ESP.getHeapFragmentation(), stack_thunk_light_get_max_usage(),
freestack, ESP.getFreeContStack());
@ -98,60 +98,60 @@ make_stack_thunk_light(br_ssl_engine_sendrec_buf);
// unless the Thunk was initialized. Thanks to AES128 GCM, we can keep
// symetric processing on the stack
void min_br_ssl_engine_recvapp_ack(br_ssl_engine_context *cc, size_t len) {
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_recvapp_ack(cc, len);
} else {
return br_ssl_engine_recvapp_ack(cc, len);
}
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_recvapp_ack(cc, len);
} else {
return br_ssl_engine_recvapp_ack(cc, len);
}
}
unsigned char *min_br_ssl_engine_recvapp_buf(const br_ssl_engine_context *cc, size_t *len) {
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_recvapp_buf(cc, len);
} else {
return br_ssl_engine_recvapp_buf(cc, len);
}
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_recvapp_buf(cc, len);
} else {
return br_ssl_engine_recvapp_buf(cc, len);
}
}
void min_br_ssl_engine_recvrec_ack(br_ssl_engine_context *cc, size_t len) {
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_recvrec_ack(cc, len);
} else {
return br_ssl_engine_recvrec_ack(cc, len);
}
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_recvrec_ack(cc, len);
} else {
return br_ssl_engine_recvrec_ack(cc, len);
}
}
unsigned char *min_br_ssl_engine_recvrec_buf(const br_ssl_engine_context *cc, size_t *len) {
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_recvrec_buf(cc, len);
} else {
return br_ssl_engine_recvrec_buf(cc, len);
}
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_recvrec_buf(cc, len);
} else {
return br_ssl_engine_recvrec_buf(cc, len);
}
}
void min_br_ssl_engine_sendapp_ack(br_ssl_engine_context *cc, size_t len) {
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_sendapp_ack(cc, len);
} else {
return br_ssl_engine_sendapp_ack(cc, len);
}
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_sendapp_ack(cc, len);
} else {
return br_ssl_engine_sendapp_ack(cc, len);
}
}
unsigned char *min_br_ssl_engine_sendapp_buf(const br_ssl_engine_context *cc, size_t *len) {
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_sendapp_buf(cc, len);
} else {
return br_ssl_engine_sendapp_buf(cc, len);
}
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_sendapp_buf(cc, len);
} else {
return br_ssl_engine_sendapp_buf(cc, len);
}
}
void min_br_ssl_engine_sendrec_ack(br_ssl_engine_context *cc, size_t len) {
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_sendrec_ack(cc, len);
} else {
return br_ssl_engine_sendrec_ack(cc, len);
}
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_sendrec_ack(cc, len);
} else {
return br_ssl_engine_sendrec_ack(cc, len);
}
}
unsigned char *min_br_ssl_engine_sendrec_buf(const br_ssl_engine_context *cc, size_t *len) {
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_sendrec_buf(cc, len);
} else {
return br_ssl_engine_sendrec_buf(cc, len);
}
if (stack_thunk_light_get_refcnt()) {
return thunk_light_br_ssl_engine_sendrec_buf(cc, len);
} else {
return br_ssl_engine_sendrec_buf(cc, len);
}
}
// Use min_ instead of original thunk_
@ -176,7 +176,7 @@ namespace BearSSL {
void WiFiClientSecure_light::_clear() {
// TLS handshake may take more than the 5 second default timeout
_timeout = 10000; // 10 seconds max, it should never go over 6 seconds
_timeout = 10000; // 10 seconds max, it should never go over 6 seconds
_sc = nullptr;
_ctx_present = false;
@ -185,17 +185,17 @@ void WiFiClientSecure_light::_clear() {
_iobuf_out = nullptr;
setBufferSizes(1024, 1024); // reasonable minimum
_handshake_done = false;
_last_error = 0;
_last_error = 0;
_recvapp_buf = nullptr;
_recvapp_len = 0;
_fingerprint_any = true; // by default accept all fingerprints
_fingerprint1 = nullptr;
_fingerprint2 = nullptr;
_chain_P = nullptr;
_sk_ec_P = nullptr;
_ta_P = nullptr;
_fingerprint_any = true; // by default accept all fingerprints
_fingerprint1 = nullptr;
_fingerprint2 = nullptr;
_chain_P = nullptr;
_sk_ec_P = nullptr;
_ta_P = nullptr;
_ta_size = 0;
_max_thunkstack_use = 0;
_max_thunkstack_use = 0;
}
// Constructor
@ -221,24 +221,24 @@ WiFiClientSecure_light::~WiFiClientSecure_light() {
void WiFiClientSecure_light::allocateBuffers(void) {
// We prefer to allocate all buffers at start, rather than lazy allocation and deallocation
// in the long run it avoids heap fragmentation and improves stability
LOG_HEAP_SIZE("allocateBuffers before");
LOG_HEAP_SIZE("allocateBuffers before");
_sc = std::make_shared<br_ssl_client_context>();
LOG_HEAP_SIZE("allocateBuffers ClientContext");
LOG_HEAP_SIZE("allocateBuffers ClientContext");
_iobuf_in = std::shared_ptr<unsigned char>(new unsigned char[_iobuf_in_size], std::default_delete<unsigned char[]>());
_iobuf_out = std::shared_ptr<unsigned char>(new unsigned char[_iobuf_out_size], std::default_delete<unsigned char[]>());
LOG_HEAP_SIZE("allocateBuffers after");
LOG_HEAP_SIZE("allocateBuffers after");
}
void WiFiClientSecure_light::setClientECCert(const br_x509_certificate *cert, const br_ec_private_key *sk,
unsigned allowed_usages, unsigned cert_issuer_key_type) {
_chain_P = cert;
_sk_ec_P = sk;
unsigned allowed_usages, unsigned cert_issuer_key_type) {
_chain_P = cert;
_sk_ec_P = sk;
_allowed_usages = allowed_usages;
_cert_issuer_key_type = cert_issuer_key_type;
}
void WiFiClientSecure_light::setTrustAnchor(const br_x509_trust_anchor *ta, size_t ta_size) {
_ta_P = ta;
_ta_P = ta;
_ta_size = ta_size;
}
@ -271,9 +271,9 @@ bool WiFiClientSecure_light::flush(unsigned int maxWaitMs) {
int WiFiClientSecure_light::connect(IPAddress ip, uint16_t port) {
DEBUG_BSSL("connect(%s,%d)", ip.toString().c_str(), port);
clearLastError();
clearLastError();
if (!WiFiClient::connect(ip, port)) {
setLastError(ERR_TCP_CONNECT);
setLastError(ERR_TCP_CONNECT);
return 0;
}
return _connectSSL(nullptr);
@ -282,19 +282,19 @@ int WiFiClientSecure_light::connect(IPAddress ip, uint16_t port) {
int WiFiClientSecure_light::connect(const char* name, uint16_t port) {
DEBUG_BSSL("connect(%s,%d)\n", name, port);
IPAddress remote_addr;
clearLastError();
clearLastError();
if (!WiFi.hostByName(name, remote_addr)) {
DEBUG_BSSL("connect: Name loopup failure\n");
setLastError(ERR_CANT_RESOLVE_IP);
setLastError(ERR_CANT_RESOLVE_IP);
return 0;
}
DEBUG_BSSL("connect(%s,%d)\n", remote_addr.toString().c_str(), port);
if (!WiFiClient::connect(remote_addr, port)) {
DEBUG_BSSL("connect: Unable to connect TCP socket\n");
_last_error = ERR_TCP_CONNECT;
_last_error = ERR_TCP_CONNECT;
return 0;
}
LOG_HEAP_SIZE("Before calling _connectSSL");
LOG_HEAP_SIZE("Before calling _connectSSL");
return _connectSSL(name);
}
@ -355,7 +355,7 @@ size_t WiFiClientSecure_light::_write(const uint8_t *buf, size_t size, bool pmem
}
} while (size);
LOG_HEAP_SIZE("_write");
LOG_HEAP_SIZE("_write");
return sent_bytes;
}
@ -399,7 +399,7 @@ int WiFiClientSecure_light::read(uint8_t *buf, size_t size) {
int avail = available();
bool conn = connected();
if (!avail && conn) {
return 0; // We're still connected, but nothing to read
return 0; // We're still connected, but nothing to read
}
if (!avail && !conn) {
DEBUG_BSSL("read: Not connected, none left available\n");
@ -434,7 +434,7 @@ int WiFiClientSecure_light::read() {
int WiFiClientSecure_light::available() {
if (_recvapp_buf) {
return _recvapp_len; // Anything from last call?
return _recvapp_len; // Anything from last call?
}
_recvapp_buf = nullptr;
_recvapp_len = 0;
@ -443,7 +443,7 @@ int WiFiClientSecure_light::available() {
}
int st = br_ssl_engine_current_state(_eng);
if (st == BR_SSL_CLOSED) {
return 0; // Nothing leftover, SSL is closed
return 0; // Nothing leftover, SSL is closed
}
if (st & BR_SSL_RECVAPP) {
_recvapp_buf = br_ssl_engine_recvapp_buf(_eng, &_recvapp_len);
@ -620,24 +620,24 @@ static uint8_t htoi (unsigned char c)
extern "C" {
// see https://stackoverflow.com/questions/6357031/how-do-you-convert-a-byte-array-to-a-hexadecimal-string-in-c
void tohex(unsigned char * in, size_t insz, char * out, size_t outsz) {
unsigned char * pin = in;
static const char * hex = "0123456789ABCDEF";
char * pout = out;
for(; pin < in+insz; pout +=3, pin++){
pout[0] = hex[(*pin>>4) & 0xF];
pout[1] = hex[ *pin & 0xF];
pout[2] = ':';
if (pout + 3 - out > outsz){
/* Better to truncate output string than overflow buffer */
/* it would be still better to either return a status */
/* or ensure the target buffer is large enough and it never happen */
break;
}
}
pout[-1] = 0;
}
// see https://stackoverflow.com/questions/6357031/how-do-you-convert-a-byte-array-to-a-hexadecimal-string-in-c
void tohex(unsigned char * in, size_t insz, char * out, size_t outsz) {
unsigned char * pin = in;
static const char * hex = "0123456789ABCDEF";
char * pout = out;
for(; pin < in+insz; pout +=3, pin++){
pout[0] = hex[(*pin>>4) & 0xF];
pout[1] = hex[ *pin & 0xF];
pout[2] = ':';
if (pout + 3 - out > outsz){
/* Better to truncate output string than overflow buffer */
/* it would be still better to either return a status */
/* or ensure the target buffer is large enough and it never happen */
break;
}
}
pout[-1] = 0;
}
// BearSSL doesn't define a true insecure decoder, so we make one ourselves
@ -648,12 +648,12 @@ extern "C" {
// Private x509 decoder state
struct br_x509_pubkeyfingerprint_context {
const br_x509_class *vtable;
bool done_cert; // did we parse the first cert already?
bool fingerprint_all;
uint8_t *pubkey_recv_fingerprint;
bool done_cert; // did we parse the first cert already?
bool fingerprint_all;
uint8_t *pubkey_recv_fingerprint;
const uint8_t *fingerprint1;
const uint8_t *fingerprint2;
unsigned usages; // pubkey usage
unsigned usages; // pubkey usage
br_x509_decoder_context ctx; // defined in BearSSL
};
@ -662,15 +662,15 @@ extern "C" {
br_x509_pubkeyfingerprint_context *xc = (br_x509_pubkeyfingerprint_context *)ctx;
// Don't process anything but the first certificate in the chain
if (!xc->done_cert) {
br_x509_decoder_init(&xc->ctx, nullptr, nullptr, nullptr, nullptr);
}
(void)server_name; // ignore server name
br_x509_decoder_init(&xc->ctx, nullptr, nullptr, nullptr, nullptr);
}
(void)server_name; // ignore server name
}
// Callback for each certificate present in the chain (but only operates
// on the first one by design).
static void pubkeyfingerprint_start_cert(const br_x509_class **ctx, uint32_t length) {
(void) ctx; // do nothing
(void) ctx; // do nothing
(void) length;
}
@ -686,7 +686,7 @@ extern "C" {
// Callback on individual cert end.
static void pubkeyfingerprint_end_cert(const br_x509_class **ctx) {
br_x509_pubkeyfingerprint_context *xc = (br_x509_pubkeyfingerprint_context *)ctx;
xc->done_cert = true; // first cert already processed
xc->done_cert = true; // first cert already processed
}
// **** Start patch Castellucci
@ -743,18 +743,18 @@ extern "C" {
pubkeyfingerprint_pubkey_fingerprint(&sha1_context, xc->ctx.pkey.key.rsa);
br_sha1_out(&sha1_context, xc->pubkey_recv_fingerprint); // copy to fingerprint
if (!xc->fingerprint_all) {
if (0 == memcmp_P(xc->pubkey_recv_fingerprint, xc->fingerprint1, 20)) {
return 0;
}
if (0 == memcmp_P(xc->pubkey_recv_fingerprint, xc->fingerprint2, 20)) {
return 0;
}
return 1; // no match, error
} else {
// Default (no validation at all) or no errors in prior checks = success.
return 0;
}
if (!xc->fingerprint_all) {
if (0 == memcmp_P(xc->pubkey_recv_fingerprint, xc->fingerprint1, 20)) {
return 0;
}
if (0 == memcmp_P(xc->pubkey_recv_fingerprint, xc->fingerprint2, 20)) {
return 0;
}
return 1; // no match, error
} else {
// Default (no validation at all) or no errors in prior checks = success.
return 0;
}
*/
// set fingerprint status byte to zero
// FIXME: find a better way to pass this information
@ -796,7 +796,7 @@ extern "C" {
xc->pubkey_recv_fingerprint[20] |= 2; // mark for update
}
if (!xc->pubkey_recv_fingerprint[20]) {
return 1; // not marked for update because no match, error
return 1; // not marked for update because no match, error
}
// the old fingerprint format matched, recompute new one for update
@ -822,9 +822,9 @@ extern "C" {
// Set up the x509 insecure data structures for BearSSL core to use.
void br_x509_pubkeyfingerprint_init(br_x509_pubkeyfingerprint_context *ctx,
const uint8_t *fingerprint1, const uint8_t *fingerprint2,
uint8_t *recv_fingerprint,
bool fingerprint_all) {
const uint8_t *fingerprint1, const uint8_t *fingerprint2,
uint8_t *recv_fingerprint,
bool fingerprint_all) {
static const br_x509_class br_x509_pubkeyfingerprint_vtable PROGMEM = {
sizeof(br_x509_pubkeyfingerprint_context),
pubkeyfingerprint_start_chain,
@ -838,26 +838,26 @@ extern "C" {
memset(ctx, 0, sizeof * ctx);
ctx->vtable = &br_x509_pubkeyfingerprint_vtable;
ctx->done_cert = false;
ctx->fingerprint1 = fingerprint1;
ctx->fingerprint2 = fingerprint2;
ctx->pubkey_recv_fingerprint = recv_fingerprint;
ctx->fingerprint_all = fingerprint_all;
ctx->fingerprint1 = fingerprint1;
ctx->fingerprint2 = fingerprint2;
ctx->pubkey_recv_fingerprint = recv_fingerprint;
ctx->fingerprint_all = fingerprint_all;
}
// We limit to a single cipher to reduce footprint
// We limit to a single cipher to reduce footprint
// we reference it, don't put in PROGMEM
static const uint16_t suites[] = {
#ifdef USE_MQTT_TLS_FORCE_EC_CIPHER
BR_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
BR_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
#else
BR_TLS_RSA_WITH_AES_128_GCM_SHA256
BR_TLS_RSA_WITH_AES_128_GCM_SHA256
#endif
};
// Default initializion for our SSL clients
static void br_ssl_client_base_init(br_ssl_client_context *cc) {
br_ssl_client_zero(cc);
// forbid SSL renegociation, as we free the Private Key after handshake
// forbid SSL renegotiation, as we free the Private Key after handshake
br_ssl_engine_add_flags(&cc->eng, BR_OPT_NO_RENEGOTIATION);
br_ssl_engine_set_versions(&cc->eng, BR_TLS12, BR_TLS12);
@ -869,14 +869,14 @@ extern "C" {
br_ssl_engine_set_hash(&cc->eng, br_sha256_ID, &br_sha256_vtable);
br_ssl_engine_set_prf_sha256(&cc->eng, &br_tls12_sha256_prf);
// AES CTR/GCM small version, not contstant time (we don't really care here as there is no TPM anyways)
br_ssl_engine_set_gcm(&cc->eng, &br_sslrec_in_gcm_vtable, &br_sslrec_out_gcm_vtable);
br_ssl_engine_set_aes_ctr(&cc->eng, &br_aes_small_ctr_vtable);
br_ssl_engine_set_ghash(&cc->eng, &br_ghash_ctmul32);
// AES CTR/GCM small version, not contstant time (we don't really care here as there is no TPM anyways)
br_ssl_engine_set_gcm(&cc->eng, &br_sslrec_in_gcm_vtable, &br_sslrec_out_gcm_vtable);
br_ssl_engine_set_aes_ctr(&cc->eng, &br_aes_small_ctr_vtable);
br_ssl_engine_set_ghash(&cc->eng, &br_ghash_ctmul32);
#ifdef USE_MQTT_TLS_FORCE_EC_CIPHER
// we support only P256 EC curve for AWS IoT, no EC curve for Letsencrypt unless forced
br_ssl_engine_set_ec(&cc->eng, &br_ec_p256_m15); // TODO
// we support only P256 EC curve for AWS IoT, no EC curve for Letsencrypt unless forced
br_ssl_engine_set_ec(&cc->eng, &br_ec_p256_m15); // TODO
#endif
static const char * alpn_mqtt = "mqtt";
br_ssl_engine_set_protocol_names(&cc->eng, &alpn_mqtt, 1);
@ -886,110 +886,110 @@ extern "C" {
// Called by connect() to do the actual SSL setup and handshake.
// Returns if the SSL handshake succeeded.
bool WiFiClientSecure_light::_connectSSL(const char* hostName) {
// Validation context, either full CA validation or checking only fingerprints
// Validation context, either full CA validation or checking only fingerprints
#ifdef USE_MQTT_TLS_CA_CERT
br_x509_minimal_context *x509_minimal;
br_x509_minimal_context *x509_minimal;
#else
br_x509_pubkeyfingerprint_context *x509_insecure;
#endif
LOG_HEAP_SIZE("_connectSSL.start");
LOG_HEAP_SIZE("_connectSSL.start");
do { // used to exit on Out of Memory error and keep all cleanup code at the same place
// ============================================================
// allocate Thunk stack, move to alternate stack and initialize
stack_thunk_light_add_ref();
LOG_HEAP_SIZE("Thunk allocated");
DEBUG_BSSL("_connectSSL: start connection\n");
_freeSSL();
clearLastError();
if (!stack_thunk_light_get_stack_bot()) break;
do { // used to exit on Out of Memory error and keep all cleanup code at the same place
// ============================================================
// allocate Thunk stack, move to alternate stack and initialize
stack_thunk_light_add_ref();
LOG_HEAP_SIZE("Thunk allocated");
DEBUG_BSSL("_connectSSL: start connection\n");
_freeSSL();
clearLastError();
if (!stack_thunk_light_get_stack_bot()) break;
_ctx_present = true;
_eng = &_sc->eng; // Allocation/deallocation taken care of by the _sc shared_ptr
_ctx_present = true;
_eng = &_sc->eng; // Allocation/deallocation taken care of by the _sc shared_ptr
br_ssl_client_base_init(_sc.get());
br_ssl_client_base_init(_sc.get());
// ============================================================
// Allocatte and initialize Decoder Context
LOG_HEAP_SIZE("_connectSSL before DecoderContext allocation");
// Only failure possible in the installation is OOM
#ifdef USE_MQTT_TLS_CA_CERT
x509_minimal = (br_x509_minimal_context*) malloc(sizeof(br_x509_minimal_context));
if (!x509_minimal) break;
br_x509_minimal_init(x509_minimal, &br_sha256_vtable, _ta_P, _ta_size);
br_x509_minimal_set_rsa(x509_minimal, br_ssl_engine_get_rsavrfy(_eng));
br_x509_minimal_set_hash(x509_minimal, br_sha256_ID, &br_sha256_vtable);
br_ssl_engine_set_x509(_eng, &x509_minimal->vtable);
// ============================================================
// Allocatte and initialize Decoder Context
LOG_HEAP_SIZE("_connectSSL before DecoderContext allocation");
// Only failure possible in the installation is OOM
#ifdef USE_MQTT_TLS_CA_CERT
x509_minimal = (br_x509_minimal_context*) malloc(sizeof(br_x509_minimal_context));
if (!x509_minimal) break;
br_x509_minimal_init(x509_minimal, &br_sha256_vtable, _ta_P, _ta_size);
br_x509_minimal_set_rsa(x509_minimal, br_ssl_engine_get_rsavrfy(_eng));
br_x509_minimal_set_hash(x509_minimal, br_sha256_ID, &br_sha256_vtable);
br_ssl_engine_set_x509(_eng, &x509_minimal->vtable);
uint32_t now = UtcTime();
uint32_t cfg_time = CfgTime();
if (cfg_time > now) { now = cfg_time; }
br_x509_minimal_set_time(x509_minimal, now / 86400 + 719528, now % 86400);
#else
x509_insecure = (br_x509_pubkeyfingerprint_context*) malloc(sizeof(br_x509_pubkeyfingerprint_context));
//x509_insecure = std::unique_ptr<br_x509_pubkeyfingerprint_context>(new br_x509_pubkeyfingerprint_context);
if (!x509_insecure) break;
br_x509_pubkeyfingerprint_init(x509_insecure, _fingerprint1, _fingerprint2, _recv_fingerprint, _fingerprint_any);
br_ssl_engine_set_x509(_eng, &x509_insecure->vtable);
#endif
LOG_HEAP_SIZE("_connectSSL after DecoderContext allocation");
#else
x509_insecure = (br_x509_pubkeyfingerprint_context*) malloc(sizeof(br_x509_pubkeyfingerprint_context));
//x509_insecure = std::unique_ptr<br_x509_pubkeyfingerprint_context>(new br_x509_pubkeyfingerprint_context);
if (!x509_insecure) break;
br_x509_pubkeyfingerprint_init(x509_insecure, _fingerprint1, _fingerprint2, _recv_fingerprint, _fingerprint_any);
br_ssl_engine_set_x509(_eng, &x509_insecure->vtable);
#endif
LOG_HEAP_SIZE("_connectSSL after DecoderContext allocation");
// ============================================================
// Set send/receive buffers
br_ssl_engine_set_buffers_bidi(_eng, _iobuf_in.get(), _iobuf_in_size, _iobuf_out.get(), _iobuf_out_size);
// ============================================================
// Set send/receive buffers
br_ssl_engine_set_buffers_bidi(_eng, _iobuf_in.get(), _iobuf_in_size, _iobuf_out.get(), _iobuf_out_size);
// ============================================================
// allocate Private key if needed, only if USE_MQTT_AWS_IOT
LOG_HEAP_SIZE("_connectSSL before PrivKey allocation");
#ifdef USE_MQTT_AWS_IOT
// ============================================================
// Set the EC Private Key, only USE_MQTT_AWS_IOT
// limited to P256 curve
br_ssl_client_set_single_ec(_sc.get(), _chain_P, 1,
_sk_ec_P, _allowed_usages,
_cert_issuer_key_type, &br_ec_p256_m15, br_ecdsa_sign_asn1_get_default());
#endif // USE_MQTT_AWS_IOT
// ============================================================
// allocate Private key if needed, only if USE_MQTT_AWS_IOT
LOG_HEAP_SIZE("_connectSSL before PrivKey allocation");
#ifdef USE_MQTT_AWS_IOT
// ============================================================
// Set the EC Private Key, only USE_MQTT_AWS_IOT
// limited to P256 curve
br_ssl_client_set_single_ec(_sc.get(), _chain_P, 1,
_sk_ec_P, _allowed_usages,
_cert_issuer_key_type, &br_ec_p256_m15, br_ecdsa_sign_asn1_get_default());
#endif // USE_MQTT_AWS_IOT
// ============================================================
// Start TLS connection, ALL
if (!br_ssl_client_reset(_sc.get(), hostName, 0)) break;
// ============================================================
// Start TLS connection, ALL
if (!br_ssl_client_reset(_sc.get(), hostName, 0)) break;
auto ret = _wait_for_handshake();
#ifdef DEBUG_ESP_SSL
if (!ret) {
DEBUG_BSSL("Couldn't connect. Error = %d\n", getLastError());
} else {
DEBUG_BSSL("Connected! MFLNStatus = %d\n", getMFLNStatus());
}
#endif
LOG_HEAP_SIZE("_connectSSL.end");
_max_thunkstack_use = stack_thunk_light_get_max_usage();
stack_thunk_light_del_ref();
//stack_thunk_light_repaint();
LOG_HEAP_SIZE("_connectSSL.end, freeing StackThunk");
auto ret = _wait_for_handshake();
#ifdef DEBUG_ESP_SSL
if (!ret) {
DEBUG_BSSL("Couldn't connect. Error = %d\n", getLastError());
} else {
DEBUG_BSSL("Connected! MFLNStatus = %d\n", getMFLNStatus());
}
#endif
LOG_HEAP_SIZE("_connectSSL.end");
_max_thunkstack_use = stack_thunk_light_get_max_usage();
stack_thunk_light_del_ref();
//stack_thunk_light_repaint();
LOG_HEAP_SIZE("_connectSSL.end, freeing StackThunk");
#ifdef USE_MQTT_TLS_CA_CERT
free(x509_minimal);
#else
free(x509_insecure);
#endif
LOG_HEAP_SIZE("_connectSSL after release of Priv Key");
return ret;
} while (0);
#ifdef USE_MQTT_TLS_CA_CERT
free(x509_minimal);
#else
free(x509_insecure);
#endif
LOG_HEAP_SIZE("_connectSSL after release of Priv Key");
return ret;
} while (0);
// ============================================================
// if we arrived here, this means we had an OOM error, cleaning up
setLastError(ERR_OOM);
DEBUG_BSSL("_connectSSL: Out of memory\n");
stack_thunk_light_del_ref();
// ============================================================
// if we arrived here, this means we had an OOM error, cleaning up
setLastError(ERR_OOM);
DEBUG_BSSL("_connectSSL: Out of memory\n");
stack_thunk_light_del_ref();
#ifdef USE_MQTT_TLS_CA_CERT
free(x509_minimal);
free(x509_minimal);
#else
free(x509_insecure);
free(x509_insecure);
#endif
LOG_HEAP_SIZE("_connectSSL clean_on_error");
return false;
LOG_HEAP_SIZE("_connectSSL clean_on_error");
return false;
}
};

View File

@ -3,7 +3,7 @@
- Mostly compatible with Arduino WiFi shield library and standard
WiFiClient/ServerSecure (except for certificate handling).
Copyright (c) 2018 Earle F. Philhower, III
Copyright (C) 2021 Earle F. Philhower, III
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public

View File

@ -0,0 +1,22 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_HEADER1_SIZE = 371;
const char HTTP_HEADER1_COMPRESSED[] PROGMEM = "\x3D\x0F\xE1\x10\x98\x1D\x19\x0C\x64\x85\x50\xD0\x8F\xC3\xD0\x55\x0D\x09\x05\x7C"
"\x3C\x7C\x3D\x87\xD7\x8F\x62\x0C\x2B\xF7\x8F\x87\xB0\xF6\x1F\x87\xA0\xA7\x62\x1F"
"\x87\xA0\xD7\x56\x83\x15\x7F\xF3\xA3\xE1\xF6\x2E\x8C\x1D\x67\x3E\x7D\x90\x21\x52"
"\xEB\x1A\xCF\x87\xB0\xCF\x58\xF8\xCC\xFD\x1E\xC4\x1E\x75\x3E\xA3\xE1\xEC\x1F\xD1"
"\x28\x51\xF0\x46\x67\xA1\xB3\xAC\x7F\x44\xA1\x47\x56\xF6\xD6\xD8\x47\x5F\x83\xB0"
"\x99\xF0\xE4\x3A\x88\x5F\x9F\xCE\xBF\x07\x61\x58\xE0\x99\xF3\xB0\xF6\x1D\x87\xE1"
"\xE9\x5B\x41\x33\xF0\xFA\xF2\x3A\xD1\xF5\xE3\xD0\xEC\x04\x19\x67\xA7\x83\xFE\x8C"
"\xA3\xF0\xCE\xFE\x8D\x87\xCE\x16\x10\x47\x50\x54\x75\x56\x1D\x54\x30\xEA\x18\x19"
"\xF0\xFB\x3E\xCF\x0C\x71\xF3\xC7\xC3\xF0\x4C\x0C\x58\xD7\xD4\x74\x1E\x74\x4C\x26"
"\x35\xF5\x10\xE3\x22\xD1\x0E\xEF\x8E\xF1\xE0\xD5\xE0\x48\xBA\x6A\x16\xFE\x64\x5E"
"\x61\x30\xEB\x3E\x77\x7C\x77\x8F\x1E\x18\x7C\xD3\xE1\xF8\xC7\x1D\xDD\x3B\xC7\x4A"
"\x32\x18\xCF\x87\x74\x11\xA4\x1F\x0F\x87\xDD\x33\x65\x1F\x67\x68\xFB\x19\x7E\xF0"
"\xFE\x7C\x43\xEC\xF3\x04\x19\xC7\x78\xF0\x3E\x11\xF0\xC1\xF0\xFC\x1F\xDE\x13\x07"
"\xCE\x96\x20\x84\xCC\xDF\x51\x05\xBE\xA7\xCF\xE7\x74\xFB\x0B\x2C\x43\xEC\xEA\x30"
"\x77\x8F\x06";
#define HTTP_HEADER1 Decompress(HTTP_HEADER1_COMPRESSED,HTTP_HEADER1_SIZE).c_str()

View File

@ -0,0 +1,22 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_HEADER1_SIZE = 425;
const char HTTP_HEADER1_COMPRESSED[] PROGMEM = "\x3D\x0F\xE1\x10\x98\x1D\x19\x0C\x64\x85\x50\xD0\x8F\xC3\xD0\x55\x0D\x09\x05\x7C"
"\x3C\x7C\x3D\x87\xD7\x8F\x62\x0C\x2B\xF7\x8F\x87\xB0\xF6\x1F\x87\xA0\xA7\x62\x1F"
"\x87\xA0\xD7\x56\x83\x15\x7F\xF3\xA3\xE1\xF6\x2E\x8C\x1D\x67\x3E\x7D\x90\x21\x52"
"\xEB\x1A\xCF\x87\xB0\xCF\x58\xF8\xCC\xFD\x1E\xC4\x1E\x75\x3E\xA3\xE1\xEC\x1F\xD1"
"\x28\x51\xF0\x46\x67\xA1\xB3\xAC\x7F\x44\xA1\x47\x56\xF6\xD6\xD8\x47\x5F\x83\xB0"
"\x99\xF0\xE4\x3A\x88\x5F\x9F\xCE\xBF\x07\x61\x58\xE0\x99\xF3\xB0\xF6\x1D\x87\xE1"
"\xE9\x5B\x41\x33\xF0\xFA\xF2\x3A\xD1\xF5\xE3\xD0\xEC\x04\x19\x67\xA7\x83\xFE\x8C"
"\xA3\xF0\xCE\xFE\x8D\x87\xCE\x16\x10\x47\x50\x54\x75\x56\x1D\x54\x30\xEA\x18\x19"
"\xF0\xFB\x3E\xCF\x06\x05\xF0\x75\xB9\xC9\x8E\x3B\xBE\x3B\xC7\xB7\xEE\x85\xFF\x90"
"\x98\x18\xB1\xAF\xA8\xE8\x3C\xE8\x98\x4C\x6B\xEA\x21\xC6\x45\xA2\x1D\xDF\x1D\xE3"
"\xC1\xEE\x04\x4C\x38\xD5\xE0\x4F\xC3\x8D\x42\xDF\xCC\x8B\xCC\x26\x1D\x67\xC1\x27"
"\x0D\xF0\xC3\xBB\xA7\x78\xF6\xB1\xC7\x77\x4E\xF1\xD2\x8C\x86\x33\xE1\xDD\x04\x69"
"\x07\xC3\xE1\xF7\x4C\xD9\x47\xD9\xDA\x3E\xC6\x5F\xBC\x3F\x9F\x10\xFB\x3C\xC1\x06"
"\x70\x23\xE3\xE3\xE1\x1D\xD3\x07\x78\xF6\x8F\xEF\x09\x83\xE7\x4B\x10\x42\x66\x6F"
"\xA8\x82\xDF\x53\xE7\xF3\xBA\x7D\x85\x96\x21\xF6\x75\x18\x3B\xC7\x83\xDC";
#define HTTP_HEADER1 Decompress(HTTP_HEADER1_COMPRESSED,HTTP_HEADER1_SIZE).c_str()

View File

@ -0,0 +1,16 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_HEAD_LAST_SCRIPT_SIZE = 226;
const char HTTP_HEAD_LAST_SCRIPT_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x46\xB1\x0E\xE9\xDE\x3D\xA6\x77\xF5\x47\xC3\x8C\xEA\x2D\x3E"
"\x09\x81\x8B\x1A\xFA\x8E\x86\xA1\x6F\xE6\x45\xE6\x13\x0E\xB3\xE5\x61\x04\x77\x4F"
"\xBD\xE1\x82\xE8\xEA\x1C\x2E\xAB\x38\xEA\xA6\x6C\xAB\xFB\xB3\xAB\xCC\x26\x1D\x1F"
"\x67\x78\xF0\x3E\x2B\x42\x67\x77\x4E\x81\x3E\x1E\xA1\x47\xE1\xF2\x8E\xF1\xED\xD3"
"\x07\x77\x4F\x7A\x8F\x7C\xEF\x1E\xDD\x3D\xEA\x3D\xF3\xDE\x3E\xFA\xC6\xB3\xEC\xF7"
"\xCF\x87\x77\x4F\x7A\x8F\x7C\xE8\x2A\x2B\xFC\x57\x55\xFD\x1C\x2E\x99\xDD\x3E\xF4"
"\x43\xEC\xEF\x1F\xA3\xF4\x77\x4F\xE0\x27\x57\xEB\x1A\xCF\xB3\xBC\x77\x8E\xF1\xDA"
"\x04\x1C\x87\x44\x3E\xCF\x7C\xF3\x04\x7C\xB0\xF0\x7B\xA8\xED\x9D\xB3\xC1\xEE\x3D"
"\xC3\xE1\x1D\xD3\x58\x87\x78\xF0\x7A\x1D\x9E\x0F\xFA\x32\x8F\xC3";
#define HTTP_HEAD_LAST_SCRIPT Decompress(HTTP_HEAD_LAST_SCRIPT_COMPRESSED,HTTP_HEAD_LAST_SCRIPT_SIZE).c_str()

View File

@ -0,0 +1,24 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_HEAD_STYLE1_SIZE = 591;
const char HTTP_HEAD_STYLE1_COMPRESSED[] PROGMEM = "\x3D\x3D\x46\x41\x33\xF0\x4D\x33\x3A\x8C\x6B\x08\x4F\x3A\x3A\xB7\x86\x0B\xA3\xAB"
"\xCC\x26\x1D\x1E\xD1\x96\x20\x9B\xC3\xC7\x99\xCD\x21\x86\xC3\xC1\x8C\xEA\x3A\xFD"
"\xA6\xD6\x79\x9C\x84\xC6\x9E\x0F\x70\x21\xE1\xA7\xB4\x75\x86\x68\x3D\xFC\x17\xC2"
"\x1E\x67\x91\xF4\x71\xF1\x1B\x0F\x07\xB8\x61\xED\x1B\x7F\x1E\xDE\x3C\xCE\x33\xA6"
"\x93\x1A\x8E\x33\xC1\xEE\x2D\xE1\x82\xE8\xF6\x8F\xE8\x94\x28\xF3\x39\x1B\x3E\x8F"
"\xA3\xC1\x0E\xC3\x61\xD7\xED\x36\xEF\x0F\x1E\x63\xB3\xE2\x3F\x9D\x63\xB0\xD8\x78"
"\x3A\xC7\xD8\xE3\x4D\xA3\xAC\x14\xAD\x0D\xC3\x68\x29\x57\x04\xCD\x84\x3C\x0B\x3E"
"\x08\x7B\x6E\xF0\xC1\x74\x7B\xD4\x64\x31\x9F\x03\x14\xC3\x34\x1D\x86\xC3\xDF\x04"
"\x1E\x11\x41\x06\x8F\xEC\x4D\xC3\xDF\x04\x3D\xF1\x8D\x3C\x02\x0F\x03\x87\x5F\xF4"
"\x78\x55\x1E\x67\x38\x86\x1B\x0F\x06\x6F\xF5\xA1\xD8\x47\x5D\x85\xA3\xDC\x79\x9D"
"\x67\x21\x0C\x04\x9C\xCF\xF7\xC3\xCC\x10\xF1\xE3\x89\x1F\x47\xD1\xE0\xF7\x10\x21"
"\x71\x3E\x09\x1C\x28\x82\xC7\x2A\x01\x54\xCD\x95\x7F\x76\x7B\x7E\xFD\xA6\xD6\x79"
"\x82\x1E\xA0\x78\x04\x2C\xC8\xE7\xCF\xA3\xE8\xF0\x42\x9E\x8F\x0A\xA3\xCC\xE5\xCF"
"\x90\xC3\x61\xE0\x11\xF8\xFA\xC3\x37\xF3\x01\x60\xF9\xE7\x62\xEB\x01\x6B\x45\x1D"
"\x82\x19\x1E\xDA\x66\xCA\x04\x2E\x0A\x83\x7D\x4F\xE0\x83\xC9\xE9\x8B\x1B\xA1\x19"
"\x1E\x66\x6F\xE2\x5F\x59\xD5\xEB\xEF\x1D\x7E\x7F\xD3\x2A\x01\x9B\x98\x1E\xEA\x10"
"\x11\x39\x7D\x38\xC8\x61\xB0\xF0\x7B\x8D";
#define HTTP_HEAD_STYLE1 Decompress(HTTP_HEAD_STYLE1_COMPRESSED,HTTP_HEAD_STYLE1_SIZE).c_str()

View File

@ -0,0 +1,20 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_HEAD_STYLE2_SIZE = 478;
const char HTTP_HEAD_STYLE2_COMPRESSED[] PROGMEM = "\x1C\x2E\xAB\x38\xF6\x8E\xCF\x88\xFE\x79\x9C\x67\x82\x04\x18\xA7\x5F\xEC\x4D\x17"
"\xE3\xCC\xE3\x3A\x59\x7D\x8D\x3C\x0E\xB0\xCD\x07\xBF\x82\xF8\x43\xCC\xF2\x3E\x8E"
"\x3E\x23\x61\xE0\x3C\x0B\x3E\x08\x52\x02\xDE\x67\x58\xA7\xA3\xC2\xA8\xF3\x39\x47"
"\x4C\x2F\xB1\xA7\x83\x19\xD4\x75\xFB\x4D\xAC\xF3\x39\x0E\x94\x5F\x63\x4F\x03\xFA"
"\x25\x0A\x3C\xCE\x46\xCF\xA3\xE8\xF0\x75\x90\xFB\x1C\x69\xB4\x75\xD7\xEF\xBD\xB5"
"\xB9\xC7\x58\x82\xFF\x75\xB9\xC7\x99\xC6\x74\xC2\xF1\xE0\x15\x2A\x2B\x86\x2F\xFE"
"\xCF\x9E\x63\x33\x7A\x9F\xCF\x07\xB8\x10\x78\x18\x3C\xC5\x61\x9B\xF9\xED\x04\xCE"
"\x2A\x01\x0F\x71\xD0\x77\xD8\x80\xA7\x50\x15\xB1\x21\xEF\xF0\x29\xD4\x05\x4C\x4A"
"\xCF\x68\x23\xF0\xDF\x4C\xD9\x47\x58\x8C\x3C\x04\x2E\x06\xBB\x39\x9E\x0F\x71\xD0"
"\x61\xED\x30\x16\x5D\x1E\x61\x33\x14\x08\x38\x05\x85\xA3\xDC\x08\x33\x0F\x71\xD0"
"\xD4\x08\x56\xFF\xA3\xC2\x81\x22\xE0\x20\xCD\x3D\xC7\x4F\x82\x17\x20\x60\x8D\xC7"
"\xD3\x1A\x78\x19\x62\x09\xBC\x3C\x79\x9C\xA2\x18\x6C\x3C\x0D\xBF\x8F\x6F\x1E\x67"
"\x38\x86\x1B\x11\xCA\x21\x86\xC3\xC1\xEE";
#define HTTP_HEAD_STYLE2 Decompress(HTTP_HEAD_STYLE2_COMPRESSED,HTTP_HEAD_STYLE2_SIZE).c_str()

View File

@ -0,0 +1,19 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_HEAD_STYLE_ZIGBEE_SIZE = 363;
const char HTTP_HEAD_STYLE_ZIGBEE_COMPRESSED[] PROGMEM = "\x3A\x0E\xA3\xDA\x3B\x0D\x87\x5F\xB4\xDB\xBC\x3C\x79\x8E\xCF\x88\xFE\x75\x8E\xC3"
"\x61\xE0\x66\x7B\x6B\x73\x8F\x3F\xB0\xAE\xB4\xCD\x9E\x04\xDF\x0C\x0A\xCC\x8F\x3D"
"\xE0\xB7\x99\xD6\x38\x2C\x0C\xD0\xF0\x3F\xA2\x50\xA3\xCC\xE5\x32\x18\x6C\x3C\x0A"
"\x7A\x3C\x2A\x2B\x8F\x33\x92\x88\x61\xB0\xF0\x08\x39\x29\xE6\x72\x88\x61\xB1\x7B"
"\x02\xD1\x01\x0A\x69\xD7\xFB\x13\x45\xF8\xF3\x39\x64\x30\xD8\x78\x1B\x7F\x1E\xDE"
"\x3A\xC2\x66\x28\xF3\x3A\xCE\x59\x0C\x36\x1E\xE3\xA0\xEA\x3C\xCF\x3B\x31\x4F\xE7"
"\x51\xD0\x75\x1E\x67\x98\xE6\x63\x3E\xCF\x68\x79\xD4\xFA\x8F\x33\xD8\x7B\x01\x13"
"\x5E\x04\x1D\x5C\x16\xB8\x14\xB1\xDE\xC0\x85\xD3\x04\x3D\xD0\xE7\x10\xC3\x61\xE0"
"\x75\x86\x68\x3D\xFC\x17\xC2\x1E\x61\x8B\xFF\xDF\x51\x07\x81\x67\xCF\x15\x83\x0F"
"\x33\x90\x81\x0F\x5F\x04\x2D\x53\xFA\x3C\x2A\x2B\x8F\x33\xAC\xE6\x10\x22\x70\x54"
"\x08\xFC\x0C\x82\x0F\x0A\x67\x30\x81\x23\x81\x23\xDA\x08\x34\x4C\xEF\xE7\x74\xEB"
"\x3A\xC7\x04\x75\x1C\x98\x43\x0D\x87\x78\xF0\x13\x31\x47\x99\xC8\x43\x0D\x87\xB8";
#define HTTP_HEAD_STYLE_ZIGBEE Decompress(HTTP_HEAD_STYLE_ZIGBEE_COMPRESSED,HTTP_HEAD_STYLE_ZIGBEE_SIZE).c_str()

View File

@ -0,0 +1,40 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_SCRIPT_CONSOL_SIZE = 911;
const char HTTP_SCRIPT_CONSOL_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x71\xF0\xE3\x3A\x8B\x44\x3E\x1C\x67\x51\x18\xA3\xC1\x81\x7C\x1D\x6E"
"\x72\x08\xEE\x8C\x3B\xC7\xB4\xCE\xFE\x83\x3A\xB0\xF8\x7D\x9F\x67\x80\xC2\x77\xF2"
"\xAD\x1A\xF0\x5D\x1D\xD0\xA8\xEF\x02\x4C\xD3\x14\x77\x8F\x14\x7C\x63\x8E\xE9\xF7"
"\x47\x21\xF6\x77\x8F\x05\xA6\x0E\xE8\xC3\xE1\xF0\xE4\x3B\xC7\xB4\x83\x3E\x31\xC7"
"\x74\xFB\x0C\xE4\x3E\xCE\xF1\xE0\xB0\xF8\x7D\x9F\xA0\xCE\x43\xE1\xF6\x76\xC9\xF0"
"\x78\x23\x21\x65\xF2\xD2\x0F\x06\x8C\xCE\x7D\x47\x74\x33\xA1\x9D\x84\x2D\x9D\xE3"
"\xC0\x21\x45\x3E\x1F\x67\xD9\xE2\x8E\x9E\x0F\xF8\x10\x45\x58\x30\xF8\x71\x11\xBD"
"\x2A\x01\xF1\xEE\x3E\x02\x35\x13\xC1\xEE\xD3\x07\x74\x11\xA6\x1F\x87\xCF\x71\xDE"
"\x3D\xBA\x60\xEE\x9B\x0F\xE1\xF3\x85\x84\x11\xDE\x3D\xA6\xC3\xA5\x8E\xCF\xD1\xDD"
"\x3B\xC7\x83\xDC\x6C\x3E\x73\x1F\x44\x6C\x21\xA4\x11\x0A\xAA\x18\x5F\x66\xA1\x6F"
"\xD4\x77\x4E\xF1\xE0\xD8\x74\xCE\xFB\xB1\x0C\xBD\x57\x4C\x31\x57\xC3\xCC\xF8\x08"
"\x7C\x2F\x9D\xD0\x41\xCA\x8E\x9F\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F\xD1\xFA"
"\x23\x61\xD3\xD5\x74\x2F\xC7\xC3\xE1\xCA\x6C\x81\x07\x87\xF3\x69\xD4\x21\xE0\x43"
"\xE1\xB0\xE9\xF7\xE1\x99\xDE\x65\x4C\xD9\x47\x4F\x0C\x0B\x68\xEE\x9D\x87\xB8\xE4"
"\x3B\x0E\xF1\xE0\xB4\x43\xE0\x87\x4F\x0A\xD3\x14\x77\x4E\xF1\xE3\x4C\x1D\xD0\x44"
"\x92\x7C\x3E\x1C\x67\x78\xF6\x95\x02\x2F\x0A\x27\xB8\xDA\x09\x38\x29\xB4\xE8\x13"
"\xE1\xEA\x14\x7E\x02\x2E\x06\x76\xCF\x86\xD3\xC1\xEE\x05\xCE\x1E\x41\x33\x8F\xA0"
"\xA8\xF9\xE7\x40\x89\xC8\xE9\xD4\x7D\x08\x77\x8F\x07\xB8\xF7\x1E\x0D\x87\x4C\x18"
"\xF8\xEE\x9F\x64\x3C\x4C\xA8\xFB\x3A\x8F\xB0\xFC\x76\x83\x39\x47\xC3\xEC\xED\x96"
"\x88\x76\xF0\xEA\xAF\x8B\x67\x78\xF0\x6C\x3A\x79\xF0\x87\x74\xEF\x1E\x0C\x02\x56"
"\x3A\x72\x9B\x6C\xEF\x1E\x0F\x71\x7D\xD0\xBF\xF2\x31\x61\x79\x9E\x0F\x70\xF8\x47"
"\x74\x23\xBC\x78\x33\xBF\xA1\x41\x9F\x0F\x78\xF7\xCE\xA0\xF8\xF8\x71\x90\x22\xF3"
"\x62\x28\xEE\x9D\xE3\xDA\x08\x7C\xB6\x9D\x2C\x41\x09\x99\xBE\xA2\x0B\x7D\x4F\x9F"
"\xCE\xE9\xF6\x68\xCC\x84\xC1\xFE\x3E\xCE\xA0\x44\xE3\x7D\x82\x0F\x17\xA3\x81\x13"
"\x9A\x33\xA8\x33\xE3\x3A\x1A\x33\x22\x0F\x04\x67\x8D\x30\x77\x4E\x5F\xCF\x87\xC2"
"\x0C\xFF\x1F\xE3\x98\xCF\x87\xC2\x0C\xEF\x1E\xD1\xC7\x4B\x17\x58\x1E\x0D\x18\x13"
"\xA6\x7C\x3E\xF0\xC1\x83\xEC\xF0\x7B\x8E\x5F\xCF\x87\xC2\x0C\xED\x1D\xD3\xB6\x76"
"\xC3\xE3\xF0\x50\x60\x85\xC5\x71\xFA\x3F\x47\x74\x3E\x3E\x02\x24\xB3\xBC\x75\x0E"
"\x04\x2E\x38\x85\x06\x7B\xC1\xF1\xD6\x72\x1E\xF9\xFE\x3F\xC7\xD9\xF6\x77\x8F\x3C"
"\x67\xC3\xE1\x06\x76\x8E\xE9\xC6\x7E\x1D\x67\x59\x07\xC0\x83\x88\x1C\x64\x0A\x78"
"\x41\xC9\x67\xC3\xE1\x06\x7E\x8F\xD1\xDD\x04\x4C\xC4\xFC\x39\x11\xFA\x3F\x44\x28"
"\x33\xA0\xCC\x18\x77\x4E\xF1\xD4\x28\x33\xA0\xBE\x04\x1E\x4E\x01\x0B\x1C\x3B\xC7"
"\x50\x7C\x7C\x38\xCE\xF1\xEE\x3B\xC7\x83\xDC\x43\xE1\x1D\xD1\x47\x78\xF0";
#define HTTP_SCRIPT_CONSOL Decompress(HTTP_SCRIPT_CONSOL_COMPRESSED,HTTP_SCRIPT_CONSOL_SIZE).c_str()

View File

@ -0,0 +1,30 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_SCRIPT_MODULE_TEMPLATE_SIZE = 602;
const char HTTP_SCRIPT_MODULE_TEMPLATE_COMPRESSED[] PROGMEM = "\x33\xBF\xAC\xF1\xD4\x2B\xC7\x83\x02\xF8\x3A\xDC\xE4\x1B\x3B\xBA\x75\x1A\x8E\xF1"
"\xED\x33\xBF\xAC\x3E\x09\x81\x8B\x1A\xFA\x8E\x81\xFD\xDD\x32\x61\x31\xAF\xA8\xEE"
"\x9F\x78\x32\xB7\x38\xFB\x3B\xC7\x8C\x3A\x53\x36\x51\x07\x9D\x4F\xA8\xF9\xA7\x83"
"\x51\xD2\xC6\x0C\x7C\x21\x06\x2B\x42\x10\xEE\xE1\xDE\x3C\x1E\xE0\x44\xCD\xB2\x8E"
"\xE8\xF1\xD5\xE0\x41\xCD\xAC\xF9\xE3\xF4\x71\x91\xB0\xC1\x86\x71\x9D\x44\x38\xF8"
"\x71\x9D\x44\x19\xD4\x30\xEA\x08\xEA\xA3\xE1\xAB\xC7\x74\xFB\x3C\x85\x1F\x67\x6C"
"\x78\xEF\x1D\x42\xCF\x9E\x3F\x47\x19\x1B\x0E\x37\x08\xC1\xE0\x23\xE5\x1D\x01\x07"
"\x4D\xF1\xD0\x27\xC3\xD4\x28\xF0\x63\x3E\x77\x74\xF8\x11\xE3\x4F\x1A\x75\x9D\x67"
"\x78\xF6\x8C\x04\x5B\xC7\xBD\xA7\x59\xC8\x7B\xE7\x42\x19\x7F\x7D\x45\xD8\x23\x3C"
"\x0C\x3A\x7D\x8D\xC3\x36\x08\x3B\x70\x24\xE0\x87\x78\xF0\x7B\x82\x3E\x0A\x04\xAC"
"\xC8\xE3\x3C\x16\x9E\x81\x1E\x34\xED\x9D\xB3\xBC\x7B\x43\x3E\x0A\xF1\xEF\x69\xEF"
"\x82\x17\x2A\x01\xE7\x8D\x30\x77\x6C\xF8\x7C\x0C\xEF\x1E\xD1\xC0\x89\x50\xE3\x70"
"\x8C\x1E\x07\x7D\xD9\xA1\xE0\xF7\x1E\xEF\x1F\x87\xE1\xF0\xE6\x90\x21\x64\x47\x21"
"\xE0\xB4\xF4\x3E\x0E\x04\x2C\x8D\x9D\xD3\xBB\xA7\xA1\xC8\xCE\xF1\xDA\x3B\xA7\xD9"
"\xDC\x3E\xCE\xD9\x69\xDE\x3C\xF4\xEA\xA3\xBC\x78\x3D\xCC\x71\xDD\x3E\xC5\x1F\x67"
"\x6C\x78\xEF\x1D\x0C\xEC\x21\x6C\xF8\x2C\xED\x9C\x87\x82\xA3\xA7\xA8\xC8\x26\x74"
"\x33\xDF\x68\xED\x0B\x68\xC8\xF8\x77\x47\x1F\x87\x19\xDE\x3B\x47\xD9\xF6\x79\x9F"
"\x64\x2B\x44\x11\xF1\xF6\x08\xDC\x58\xF8\xD0\xEE\xF8\xEA\x1E\x04\x3E\x42\xF3\xC7"
"\x4F\xB1\x81\x58\x6C\xEE\x9D\x87\xB8\xE5\x1D\x84\x3C\x75\x1E\xC3\xD0\x10\x78\x4B"
"\x40\x83\x9E\x9F\x67\xB0\xEF\x02\x35\xD3\x96\x76\x10\xF1\xD4\x7B\x0F\x43\xB0\x10"
"\x6F\x1F\x87\xB0\xEF\x1E\x18\xE3\xBA\x7D\x8F\x1F\x67\x6C\x78\xEF\x1D\x37\xB9\xFC"
"\x85\x15\x10\xD2\x08\xF9\x80\x8D\x48\x10\x72\x13\xBA\x3C\x7A\x1C\x48\xEF\x1D\xA2"
"\x04\x3E\x47\x4F\x3F\x1E\x34\xC0\x20\xD0\x3D\xA0\x85\xC9\xF9\xE0\xF7\x1E\xE3";
#define HTTP_SCRIPT_MODULE_TEMPLATE Decompress(HTTP_SCRIPT_MODULE_TEMPLATE_COMPRESSED,HTTP_SCRIPT_MODULE_TEMPLATE_SIZE).c_str()

View File

@ -0,0 +1,27 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_SCRIPT_ROOT_SIZE = 572;
const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x33\xBF\xA3\x14\x78\x30\x2F\x83\xAD\xCE\x41\x59\xDD\x18\x77\x8F\x6D\x9F\x06\x1F"
"\xE3\xFC\x7D\x9F\x67\x80\xC2\x77\xF2\xAD\x1A\xF0\x5D\x1D\xD3\x14\x77\x81\x26\x68"
"\x54\x77\x8F\x1A\x60\xEE\x9B\x0F\xE1\xF3\x85\x84\x11\xDE\x3D\xA6\xC3\xA5\x8E\xCF"
"\xD1\xDD\x3B\xC7\xB8\xD8\x7C\xE6\x3E\x88\xD8\x43\x48\x22\x15\x54\x30\xBE\xCD\x42"
"\xDF\xA8\xEE\x9D\xE3\xC1\xB0\xE9\x9D\xF7\x62\x19\x7A\xAE\x98\x62\xAF\x87\x99\xF0"
"\x10\xF5\x73\xBA\x77\x8F\x6E\x98\x3B\xA6\xC3\xA7\xDD\x88\x64\x5E\xAB\xA6\x7C\x3E"
"\x1C\xC3\xF4\x7E\x88\xD8\x74\xF5\x5D\x0B\xF1\xF0\xF8\x72\x9B\x3B\xC7\xB4\x8C\xEF"
"\xEB\xC7\xC3\x61\xD3\xEF\xC3\x33\xBC\xCA\x99\xB2\x8E\x9F\x63\x02\xB0\xD9\xDD\x3B"
"\x0F\x6D\x1E\xE3\xB0\x78\xEA\x3D\x87\xA5\x58\xE0\x9A\xF5\x19\x04\xCF\x87\xD8\xFE"
"\x89\x42\x8F\x33\x91\xB3\xE8\xFA\x3E\xCF\xC3\xD8\x77\x88\x11\xB0\xAF\x02\x16\x15"
"\xF3\xF0\xF4\xA1\x40\x93\x5C\x68\x20\xD7\x3B\x28\x51\xF8\x7A\x50\x80\x93\x93\x9C"
"\xA6\x43\x0D\x87\x81\xF1\x5B\x4C\xEB\xF0\xCB\x0D\x9E\x7D\x83\xFF\xB1\x80\x95\x9C"
"\xB0\x43\xC7\x84\x3F\x0F\x43\xB2\xBE\x09\x36\x43\x3D\xC7\x60\xF1\xD4\x7B\x0F\xA3"
"\xE8\xFB\x3F\x0F\x41\x34\xCC\x10\xF3\xBA\x66\xCA\x3A\xEC\x2D\x1E\xE3\xCC\x37\xD4"
"\xFE\x78\x31\x9D\x47\x58\xFB\xD1\xE1\x54\x79\x9E\xC3\xBC\x78\x63\x8E\xE9\xF6\x11"
"\xC8\x7D\x9D\xE3\xA1\x6F\x73\xF9\x0A\x2A\x2B\x21\xA4\x11\xF3\xC0\xBD\xC8\x08\x54"
"\x7C\xF3\xA0\x44\x9D\x67\x51\xF4\x21\xDE\x3C\x1E\xE3\xDC\x78\x36\x1D\x30\x63\xE3"
"\xBA\x7D\x90\xF1\x32\xA3\xEC\xEA\x3E\xCE\x87\x68\x69\xF0\xE4\x3E\xCE\xD9\x59\xD5"
"\x5F\x16\xCE\xF1\xE0\xD8\x74\xF3\xE1\x0E\xE9\xDE\x3C\x18\x04\xBC\x68\xE5\x36\xD9"
"\xDE\x3C\x1E\xE3";
#define HTTP_SCRIPT_ROOT Decompress(HTTP_SCRIPT_ROOT_COMPRESSED,HTTP_SCRIPT_ROOT_SIZE).c_str()

View File

@ -0,0 +1,17 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_SCRIPT_ROOT_PART2_SIZE = 222;
const char HTTP_SCRIPT_ROOT_PART2_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x41\x06\x77\x4C\xCE\xAD\x3A\x86\x1D\xE3\xDB\xA6\x0E\xEB\x1C"
"\x77\x4F\xBF\x1F\x67\x78\xEF\x1E\xDD\x30\x77\x4C\xCF\x87\xC3\xEC\x51\xF6\x7F\x8F"
"\xF1\x99\xF0\xF8\x7D\x88\x7D\x9D\xE3\xDA\x67\x7F\x5E\x08\xF8\xC7\x1D\xD3\xEF\xC1"
"\x1C\xC3\xEC\xEF\x1D\x08\xCE\xC2\x16\xCF\x2A\x01\x85\x87\x9D\x3D\x46\x41\x33\xA0"
"\xEB\x0C\xD0\x7B\xF8\x2F\x84\x3E\x1F\x61\x6F\x3B\xF9\xD6\x3D\xFB\x13\x5F\x51\xDD"
"\xAC\x5F\xD1\xE1\x54\x75\x7C\x78\x71\xDD\x3E\xCE\xDF\x82\x3B\x67\xD9\xF4\x7D\x1D"
"\x40\x89\x14\x10\xE2\x9D\xE3\xA8\x57\x82\x3B\xA7\xD9\xDB\x04\x1D\x14\xE5\x10\x21"
"\xE8\xA7\x6C\xFB\x3A\x8E\x46\xCF\xA3\xE8\xEA\xD6\x7D\x1F\x47\x78\xEF\x1F\x67\x83"
"\xDC\x7B\x88\x2B\x3B\xA7\xD9\xFA\x3E\xCE\xD9\x99\xDB\xD3\xB6\x7D\x9F\x0F\xB3\xB6"
"\x30\xEF\x1E\x0F\x70\xF8\x47\x74\x2B\x3B\xC7\x83";
#define HTTP_SCRIPT_ROOT_PART2 Decompress(HTTP_SCRIPT_ROOT_PART2_COMPRESSED,HTTP_SCRIPT_ROOT_PART2_SIZE).c_str()

View File

@ -0,0 +1,32 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_SCRIPT_ROOT_SIZE = 844;
const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x98\xF0\xA3\xE1\xC8\x75\x11\x8A\x3C\x18\x17\xC1\xD6\xE7\x20\xAC\xEE"
"\x8C\x3B\xC7\xB6\xCF\x83\x0F\xF1\xFE\x3E\xCF\xB3\xC0\x61\x3B\xF9\x56\x8D\x78\x2E"
"\x8E\xE9\x8A\x3B\xC0\x93\x34\x2A\x2B\x3B\xC7\x8D\x30\x77\x4D\x87\xF0\xF9\xC2\xC2"
"\x08\xEF\x1E\xD3\x61\xD2\xC7\x67\xE8\xEE\x9D\xE3\xC1\xEE\x36\x1F\x39\x8F\xA2\x36"
"\x10\xD2\x08\x85\x55\x0C\x2F\xB3\x50\xB7\xEA\x3B\xA7\x78\xF0\x6C\x3A\x67\x7D\xD8"
"\x86\x5E\xAB\xA6\x18\xAB\xE1\xE6\x7C\x04\x3D\x60\xEE\x9D\xE3\xDB\xA6\x0E\xE9\xB0"
"\xE9\xF7\x62\x19\x17\xAA\xE9\x9F\x0F\x87\x30\xFD\x1F\xA2\x36\x1D\x3D\x57\x42\xFC"
"\x7C\x3E\x1C\xA6\xCE\xF1\xED\x23\x3B\xFA\xF1\xF0\xD8\x74\xFB\xF0\xCC\xEF\x32\xA6"
"\x6C\xA3\xA7\xD8\xC0\xAC\x36\x77\x4E\xC3\xDB\x47\xB8\xEC\x1E\x3A\x8F\x61\xE9\x56"
"\x38\x26\xBD\x46\x41\x33\xE1\xF6\x3F\xA2\x50\xA3\xCC\xE4\x6C\xFA\x3E\x8F\xB3\xF0"
"\xF6\x1D\xE2\x04\x6C\x2B\xC0\x85\x85\x7C\xFC\x3D\x28\x50\x24\xD7\x1A\x08\x35\xCE"
"\xCA\x14\x7E\x1E\x94\x20\x24\xE4\xE7\x29\x90\xC3\x61\xE0\x7C\x56\xD3\x3A\xFC\x32"
"\xC3\x67\x9F\x60\xFF\xEC\x60\x25\x67\x2C\x10\xF1\xE1\x0F\xC3\xD0\xEC\xAF\x82\x4D"
"\x90\xCF\x71\xD8\x3C\x75\x1E\xC3\xE8\xFA\x3E\xCF\xC3\xD0\x4D\x33\x04\x3C\xEE\x99"
"\xB2\x8E\xBB\x0B\x47\xB8\xF3\x0D\xF5\x3F\x9E\x0C\x67\x51\xD6\x3E\xF4\x78\x55\x1E"
"\x67\xB0\xEF\x1E\x18\xE3\xBA\x7D\x84\x72\x1F\x67\x78\xE8\x5B\xDC\xFE\x42\x8A\x88"
"\x69\x04\x7C\xF0\x30\x1E\x40\xBE\x63\xC2\x8E\xF1\xED\x0A\x8F\x9E\x74\x08\x95\xEC"
"\xEA\x3E\x84\x3B\xC7\x83\xDC\x7B\x8F\x70\x22\xDE\x36\x1D\x30\x63\xE3\xBA\x7D\x90"
"\xF1\x32\xA3\xEC\xEA\x3E\xCE\x87\x68\x69\xF0\xE4\x3E\xCE\xD9\x59\xD5\x5F\x16\xCE"
"\xF1\xE0\xD8\x74\xF3\xE1\x0E\xE9\xDE\x3C\x18\x04\xBC\x90\xE5\x36\xD9\xDE\x3C\x1E"
"\xE3\xDC\x40\x89\xCD\x37\x99\x9D\x9D\xD1\x97\xF3\xAB\x4C\xEF\xE7\x78\xF6\x85\x67"
"\x74\xFB\x3F\x5E\x33\x3E\x1F\x67\x6F\x4C\xEF\xE7\x6C\xFB\x3F\x67\xD9\xDB\x19\x7F"
"\x3B\xC7\x80\x46\xC3\x74\x12\x30\xD0\x41\xE7\xE4\xF0\x0A\x78\xA7\xCC\x78\x51\xF0"
"\xE3\x20\x46\xC6\xC6\x7C\xEE\x98\x3B\xC7\xB7\x4C\x1D\xD3\x07\x78\xF6\x82\x67\x0B"
"\xA0\x99\xC3\xF8\x28\x70\xCA\x08\x5A\x79\xEE\x61\x79\x82\xF6\x40\x08\x7A\xF9\xEE";
#define HTTP_SCRIPT_ROOT Decompress(HTTP_SCRIPT_ROOT_COMPRESSED,HTTP_SCRIPT_ROOT_SIZE).c_str()

View File

@ -0,0 +1,20 @@
/////////////////////////////////////////////////////////////////////
// compressed by tools/unishox/compress-html-uncompressed.py
/////////////////////////////////////////////////////////////////////
const size_t HTTP_SCRIPT_TEMPLATE_SIZE = 303;
const char HTTP_SCRIPT_TEMPLATE_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x41\x08\x77\x45\x9D\x46\x0E\xF1\xED\x33\xBF\xA3\x61\xF3\x98"
"\xFA\x23\x61\x0D\x20\x88\x55\x50\xC2\xFB\x35\x0B\x7E\xA3\xBA\x77\x8F\x06\xC3\xA6"
"\x77\xDD\x88\x65\xEA\xBA\x61\x8A\xBE\x1E\x67\xC0\x43\xC7\x4E\xE9\xDE\x3D\xBA\x60"
"\xEE\xD0\xAD\xF1\xD3\xEE\xC4\x32\x2F\x55\xD3\x3E\x1F\x0E\x61\xFA\x3F\x45\x42\xB7"
"\xC7\x4F\x55\xD0\xBF\x1F\x0F\x87\x29\xB3\xBC\x7B\x48\x10\x70\x43\xBC\x78\x3D\xC7"
"\xB8\xF0\x6C\x3A\x60\xC7\xC7\x74\xFB\x21\xE2\x65\x47\xD9\xD4\x2C\xEA\xAF\x8B\x67"
"\x78\xF0\x6C\x3A\x79\xF0\x87\x74\xEF\x1E\x0F\x71\x9D\xFD\x06\x78\x04\x4E\x2A\x01"
"\x4D\x87\x21\xDD\x21\xC0\x83\xBF\xE9\xD4\x6B\x3A\x87\x8E\xA3\x43\xAB\x0F\x18\x7C"
"\x1C\x74\xFB\xF0\xCC\xEF\x32\xA6\x6C\xA3\xA7\x86\x05\xB4\x77\x4E\xC3\xDC\x72\x1D"
"\x87\x78\xF0\x46\x87\xCC\x3A\x78\x56\x98\xA3\xBA\x77\x8F\x1A\x60\xEE\xB1\xC7\x74"
"\xFB\xF1\xC8\x7D\x9D\xE3\xA1\x19\xD8\x42\xD9\xF0\xF8\x7D\x9F\x67\x78\xF6\x82\x55"
"\x03\x43\xC1\xEE\x1E\x04\x5C\x44\x10\xB2\x93\xEC\xEA\x3E\xCE\xF1\xE3\x3C\x7C\x3D"
"\x86";
#define HTTP_SCRIPT_TEMPLATE Decompress(HTTP_SCRIPT_TEMPLATE_COMPRESSED,HTTP_SCRIPT_TEMPLATE_SIZE).c_str()

View File

@ -0,0 +1,16 @@
const char HTTP_HEADER1[] PROGMEM =
"<!DOCTYPE html><html lang=\"%s\" class=\"\">"
"<head>"
"<meta charset='utf-8'>"
"<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,user-scalable=no\"/>"
"<title>%s - %s</title>"
"<script>"
"var x=null,lt,to,tp,pc='';" // x=null allow for abortion
// Following bytes saving ES6 syntax fails on old browsers like IE 11 - https://kangax.github.io/compat-table/es6/
"eb=s=>document.getElementById(s);" // Alias to save code space
"qs=s=>document.querySelector(s);" // Alias to save code space
"sp=i=>eb(i).type=(eb(i).type==='text'?'password':'text');" // Toggle password visibility
"wl=f=>window.addEventListener('load',f);" // Execute multiple window.onload
;

View File

@ -0,0 +1,22 @@
const char HTTP_HEADER1[] PROGMEM =
"<!DOCTYPE html><html lang=\"%s\" class=\"\">"
"<head>"
"<meta charset='utf-8'>"
"<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,user-scalable=no\"/>"
"<title>%s - %s</title>"
"<script>"
"var x=null,lt,to,tp,pc='';" // x=null allow for abortion
"function eb(s){"
"return document.getElementById(s);" // Alias to save code space
"}"
"function qs(s){" // Alias to save code space
"return document.querySelector(s);"
"}"
"function sp(i){" // Toggle password visibility
"eb(i).type=(eb(i).type==='text'?'password':'text');"
"}"
"function wl(f){" // Execute multiple window.onload
"window.addEventListener('load',f);"
"}";

View File

@ -0,0 +1,12 @@
const char HTTP_HEAD_LAST_SCRIPT[] PROGMEM =
"function jd(){" // Add label name='' based on provided id=''
"var t=0,i=document.querySelectorAll('input,button,textarea,select');"
"while(i.length>=t){"
"if(i[t]){"
"i[t]['name']=(i[t].hasAttribute('id')&&(!i[t].hasAttribute('name')))?i[t]['id']:i[t]['name'];"
"}"
"t++;"
"}"
"}"
"wl(jd);" // Add name='' to any id='' in input,button,textarea,select
"</script>";

View File

@ -0,0 +1,12 @@
const char HTTP_HEAD_STYLE1[] PROGMEM =
"<style>"
"div,fieldset,input,select{padding:5px;font-size:1em;}"
"fieldset{background:#%06x;}" // COLOR_FORM, Also update HTTP_TIMER_STYLE
"p{margin:0.5em 0;}"
"input{width:100%%;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;background:#%06x;color:#%06x;}" // COLOR_INPUT, COLOR_INPUT_TEXT
"input[type=checkbox],input[type=radio]{width:1em;margin-right:6px;vertical-align:-1px;}"
"input[type=range]{width:99%%;}"
"select{width:100%%;background:#%06x;color:#%06x;}" // COLOR_INPUT, COLOR_INPUT_TEXT
"textarea{resize:vertical;width:98%%;height:318px;padding:5px;overflow:auto;background:#%06x;color:#%06x;}" // COLOR_CONSOLE, COLOR_CONSOLE_TEXT
"body{text-align:center;font-family:verdana,sans-serif;background:#%06x;}" // COLOR_BACKGROUND
"td{padding:0px;}";

View File

@ -0,0 +1,11 @@
const char HTTP_HEAD_STYLE2[] PROGMEM =
"button{border:0;border-radius:0.3rem;background:#%06x;color:#%06x;line-height:2.4rem;font-size:1.2rem;width:100%%;-webkit-transition-duration:0.4s;transition-duration:0.4s;cursor:pointer;}" // COLOR_BUTTON, COLOR_BUTTON_TEXT
"button:hover{background:#%06x;}" // COLOR_BUTTON_HOVER
".bred{background:#%06x;}" // COLOR_BUTTON_RESET
".bred:hover{background:#%06x;}" // COLOR_BUTTON_RESET_HOVER
".bgrn{background:#%06x;}" // COLOR_BUTTON_SAVE
".bgrn:hover{background:#%06x;}" // COLOR_BUTTON_SAVE_HOVER
"a{color:#%06x;text-decoration:none;}" // COLOR_BUTTON
".p{float:left;text-align:left;}"
".q{float:right;text-align:right;}"
".r{border-radius:0.3em;padding:2px;margin:6px 2px;}";

View File

@ -0,0 +1,5 @@
const char HTTP_HEAD_STYLE_ZIGBEE[] PROGMEM =
".bt{box-sizing:border-box;position:relative;display:inline-block;width:20px;height:12px;border:2px solid;border-radius:3px;margin-left:-3px}"
".bt::after,.bt::before{content:\"\";display:block;box-sizing:border-box;position:absolute;height:6px;background:currentColor;top:1px}"
".bt::before{right:-4px;border-radius:3px;width:4px}"
".bt::after{width:var(--bl,14px);left:1px}";

View File

@ -0,0 +1,53 @@
const char HTTP_SCRIPT_CONSOL[] PROGMEM =
"var sn=0,id=0,ft;" // Scroll position, Get most of weblog initially
"function l(p){" // Console log and command service
"var c,o='';"
"clearTimeout(lt);"
"clearTimeout(ft);"
"t=eb('t1');"
"if(p==1){"
"c=eb('c1');" // Console command id
"o='&c1='+encodeURIComponent(c.value);"
"c.value='';"
"t.scrollTop=99999;"
"sn=t.scrollTop;"
"}"
"if(t.scrollTop>=sn){" // User scrolled back so no updates
"if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1)
"x=new XMLHttpRequest();"
"x.onreadystatechange=function(){"
"if(x.readyState==4&&x.status==200){"
"var z,d;"
"d=x.responseText.split(/}1/);" // Field separator
"id=d.shift();"
"if(d.shift()==0){t.value='';}"
"z=d.shift();"
"if(z.length>0){t.value+=z;}"
"t.scrollTop=99999;"
"sn=t.scrollTop;"
"clearTimeout(ft);"
"lt=setTimeout(l,%d);" // webrefresh timer....
"}"
"};"
"x.open('GET','cs?c2='+id+o,true);" // Related to Webserver->hasArg("c2") and WebGetArg("c2", stmp, sizeof(stmp))
"x.send();"
"ft=setTimeout(l,20000);" // fail timeout, triggered 20s after asking for XHR
"}"
"return false;"
"}"
"wl(l);" // Load initial console text
// Console command history
"var hc=[],cn=0;" // hc = History commands, cn = Number of history being shown
"function h(){"
// "if(!(navigator.maxTouchPoints||'ontouchstart'in document.documentElement)){eb('c1').autocomplete='off';}" // No touch so stop browser autocomplete
"eb('c1').addEventListener('keydown',function(e){"
"var b=eb('c1'),c=e.keyCode;" // c1 = Console command id
"if(38==c||40==c){b.autocomplete='off';}" // ArrowUp or ArrowDown must be a keyboard so stop browser autocomplete
"38==c?(++cn>hc.length&&(cn=hc.length),b.value=hc[cn-1]||''):" // ArrowUp
"40==c?(0>--cn&&(cn=0),b.value=hc[cn-1]||''):" // ArrowDown
"13==c&&(hc.length>19&&hc.pop(),hc.unshift(b.value),cn=0)" // Enter, 19 = Max number -1 of commands in history
"});"
"}"
"wl(h);"; // Add console command key eventlistener after name has been synced with id (= wl(jd))

View File

@ -0,0 +1,24 @@
const char HTTP_SCRIPT_MODULE_TEMPLATE[] PROGMEM =
"var os,hs;"
"function ce(i,q){" // Create index select
"var o=document.createElement('option');"
"o.textContent=i;"
"q.appendChild(o);"
"}"
"function ot(g,s){" // g = id and name, s = value
"var a=s&0xffe0,b=0,c,p,l,t=qs('#h'+g),u=s&0x001f;"
"l=t.options.length;" // Remove current options
"for(i=l;i;i--){p=t.options[i-1].parentNode;p.removeChild(t.options[i-1]);}"
"l=hs.length;" // Find max indexes for s
"for(i=0;i<l;i++){c=hs[i]&0xffe0;if(a==c){b=hs[i]&0x001f;break;}}"
"s>>=5;" // Add options
"for(i=1;i<=b;i++){ce((i<10)?(' '+i):i,t);}"
"eb('h'+g).value=u+1;" // Set selected value
"t.style.visibility=(b>0)?'':'hidden';"
"}"
"function sk(s,g){" // s = value, g = id and name
"var o=os.replace(/}2/g,\"<option value='\").replace(/}3/g,\"</option>\");"
"eb('g'+g).innerHTML=o;"
"eb('g'+g).value=(g<99)?s&0xffe0:s;"
"if(g<99){ot(g,s);}"
"}";

View File

@ -0,0 +1,24 @@
const char HTTP_SCRIPT_ROOT[] PROGMEM =
"var ft;"
"function la(p){"
"a=p||'';"
"clearTimeout(ft);clearTimeout(lt);"
"if(x!=null){x.abort()}" // Abort if no response within 2 seconds (happens on restart 1)
"x=new XMLHttpRequest();"
"x.onreadystatechange=function(){"
"if(x.readyState==4&&x.status==200){"
"var s=x.responseText.replace(/{t}/g,\"<table style='width:100%%'>\")"
".replace(/{s}/g,\"<tr><th>\")"
// ".replace(/{m}/g,\"</th><td>\")"
".replace(/{m}/g,\"</th><td style='width:20px;white-space:nowrap'>\")" // I want a right justified column with left justified text
".replace(/{e}/g,\"</td></tr>\")"
".replace(/{c}/g,\"%%'><div style='text-align:center;font-weight:\");"
"eb('l1').innerHTML=s;"
"clearTimeout(ft);clearTimeout(lt);"
"lt=setTimeout(la,%d);" // Settings.web_refresh
"}"
"};"
"x.open('GET','.?m=1'+a,true);" // ?m related to Webserver->hasArg("m")
"x.send();"
"ft=setTimeout(la,20000);" // 20s failure timeout
"}";

View File

@ -0,0 +1,11 @@
const char HTTP_SCRIPT_ROOT_PART2[] PROGMEM =
"function lc(v,i,p){"
"if(eb('s')){" // Check if Saturation is in DOM otherwise javascript fails on la()
"if(v=='h'||v=='d'){" // Hue or Brightness changed so change Saturation colors too
"var sl=eb('sl4').value;"
"eb('s').style.background='linear-gradient(to right,rgb('+sl+'%%,'+sl+'%%,'+sl+'%%),hsl('+eb('sl2').value+',100%%,50%%))';"
"}"
"}"
"la('&'+v+i+'='+p);"
"}"
"wl(la);";

View File

@ -0,0 +1,47 @@
const char HTTP_SCRIPT_ROOT[] PROGMEM =
"var rfsh=1,ft;"
"function la(p){"
"a=p||'';"
"clearTimeout(ft);clearTimeout(lt);"
"if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1)
"x=new XMLHttpRequest();"
"x.onreadystatechange=function(){"
"if(x.readyState==4&&x.status==200){"
"var s=x.responseText.replace(/{t}/g,\"<table style='width:100%%'>\")"
".replace(/{s}/g,\"<tr><th>\")"
// ".replace(/{m}/g,\"</th><td>\")"
".replace(/{m}/g,\"</th><td style='width:20px;white-space:nowrap'>\")" // I want a right justified column with left justified text
".replace(/{e}/g,\"</td></tr>\")"
".replace(/{c}/g,\"%%'><div style='text-align:center;font-weight:\");"
"eb('l1').innerHTML=s;"
"clearTimeout(ft);clearTimeout(lt);"
"if(rfsh){"
"lt=setTimeout(la,%d);" // Settings.web_refresh
"}"
"}"
"};"
"if(rfsh){"
"x.open('GET','.?m=1'+a,true);" // ?m related to Webserver->hasArg("m")
"x.send();"
"ft=setTimeout(la,20000);" // 20s failure timeout
"}"
"}"
"function seva(par,ivar){"
"la('&sv='+ivar+'_'+par);"
"}"
"function siva(par,ivar){"
"rfsh=1;"
"la('&sv='+ivar+'_'+par);"
"rfsh=0;"
"}"
"function pr(f){"
"if(f){"
"clearTimeout(lt);clearTimeout(ft);"
"lt=setTimeout(la,%d);"
"rfsh=1;"
"}else{"
"clearTimeout(lt);clearTimeout(ft);"
"rfsh=0;"
"}"
"}"
;

View File

@ -0,0 +1,21 @@
const char HTTP_SCRIPT_TEMPLATE[] PROGMEM =
"function ld(u,f){"
"var x=new XMLHttpRequest();"
"x.onreadystatechange=function(){"
"if(this.readyState==4&&this.status==200){"
"f(this);"
"}"
"};"
"x.open('GET',u,true);"
"x.send();"
"}"
"var c;" // Need a global for BASE
"function x1(b){"
"var i,j,g,k,o;"
"o=b.responseText.split(/}1/);" // Field separator
"k=o.shift();" // Template name
"if(eb('s1').value==''){"
"eb('s1').value=k;" // Set NAME if not yet set
"}"
"g=o.shift().split(',');" // GPIO - Array separator
"os=\""; // }2'0'>None (0)}3}2'17'>Button1 (17)}3...

View File

@ -1,7 +1,7 @@
/*
i18n.h - internationalization for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -425,6 +425,8 @@
#define D_CMND_DIMMER_RANGE "DimmerRange"
#define D_CMND_DIMMER_STEP "DimmerStep"
#define D_CMND_HSBCOLOR "HSBColor"
#define D_CMND_VIRTUALCT "VirtualCT"
#define D_CMND_CTRANGE "CTRange"
#define D_CMND_LED "Led"
#define D_CMND_LEDTABLE "LedTable"
#define D_CMND_FADE "Fade"

947
tasmota/language/af_AF.h Normal file
View File

@ -0,0 +1,947 @@
/*
af_AF.h - localization for Afrikaans - Afrikaans for Tasmota
Copyright (C) 2021 Christiaan Heerze
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 <http://www.gnu.org/licenses/>.
*/
#ifndef _LANGUAGE_AF_AF_H_
#define _LANGUAGE_AF_AF_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 v9.2.1.0
\*********************************************************************/
//#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 1078
// HTML (ISO 639-1) Language Code
#define D_HTML_LANGUAGE "af"
// "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 "SonMaaDinWoeDonVryDonSat"
#define D_MONTH3LIST "JanFebMaaAprMeiJunJulAugSepOktNovDes"
// Non JSON decimal separator
#define D_DECIMAL_SEPARATOR "."
// Common
#define D_ADMIN "Admin"
#define D_AIR_QUALITY "Luggehalte"
#define D_AP "AP" // Access Point
#define D_AS "as"
#define D_AUTO "AUTO"
#define D_BATT "Batt" // Short for Battery
#define D_BLINK "Flits"
#define D_BLINKOFF "FlitsAf"
#define D_BOOT_COUNT "Opstarttelling"
#define D_BRIGHTLIGHT "Helder"
#define D_BSSID "BSSId"
#define D_BUTTON "Knoppie"
#define D_BY "deur" // Written by me
#define D_BYTES "Bytes"
#define D_CELSIUS "Celsius"
#define D_CHANNEL "Kanaal"
#define D_CO2 "Koolstofdioksied"
#define D_CODE "kode" // Button code
#define D_COLDLIGHT "Koud"
#define D_COMMAND "Bevel"
#define D_CONNECTED "Gekoppel"
#define D_CORS_DOMAIN "CORS Domain"
#define D_COUNT "Telling"
#define D_COUNTER "Opnemer"
#define D_CT_POWER "CT Power"
#define D_CURRENT "Stroom" // As in Voltage and Current
#define D_DATA "Data"
#define D_DARKLIGHT "Donker"
#define D_DEBUG "Ontfout"
#define D_DEWPOINT "Dou punt"
#define D_DISABLED "Gedeaktiveer"
#define D_DISTANCE "Afstand"
#define D_DNS_SERVER "DNS"
#define D_DO "Opgeloste suurstof"
#define D_DONE "Klaar"
#define D_DST_TIME "DST"
#define D_EC "EC"
#define D_ECO2 "eCO₂"
#define D_EMULATION "Emulasie"
#define D_ENABLED "Geaktiveer"
#define D_ERASE "Vee uit"
#define D_ERROR "Fout"
#define D_FAHRENHEIT "Fahrenheit"
#define D_FAILED "Misluk "
#define D_FALLBACK "Terugval"
#define D_FALLBACK_TOPIC "Terugval onderwerp"
#define D_FALSE "Onwaar"
#define D_FILE "Lêer"
#define D_FLOW_RATE "Vloeitempo"
#define D_FREE_MEMORY "Vrye geheue"
#define D_PSR_MAX_MEMORY "PS-RAM geheue"
#define D_PSR_FREE_MEMORY "PS-RAM vrye geheue"
#define D_FREQUENCY "Frekwensie"
#define D_GAS "Gas"
#define D_GATEWAY "Gateway"
#define D_GROUP "Groep"
#define D_HOST "Gasheer"
#define D_HOSTNAME "Gasheername"
#define D_HUMIDITY "Humiditeit"
#define D_ILLUMINANCE "Verligting"
#define D_IMMEDIATE "onmiddellik" // Button immediate
#define D_INDEX "Indeks"
#define D_INFO "Inligting"
#define D_INFRARED "Infrarooi"
#define D_INITIALIZED "Geïnisialiseer"
#define D_IP_ADDRESS "IP-adresse"
#define D_LIGHT "Lig"
#define D_LWT "LWT"
#define D_LQI "LQI" // Zigbee Link Quality Index
#define D_MODULE "Module"
#define D_MOISTURE "Vog"
#define D_MQTT "MQTT"
#define D_MULTI_PRESS "multi-press"
#define D_NOISE "Geraas"
#define D_NONE "Geen"
#define D_O2 "Suurstof"
#define D_OFF "Uit"
#define D_OFFLINE "Vanlyn"
#define D_OK "Ok"
#define D_ON "aan"
#define D_ONLINE "Aanlyn"
#define D_ORP "ORP"
#define D_PASSWORD "Wagwoord"
#define D_PH "pH"
#define D_PORT "Poort"
#define D_POWER_FACTOR "Krag faktor"
#define D_POWERUSAGE "Krag"
#define D_POWERUSAGE_ACTIVE "Regte krag"
#define D_POWERUSAGE_APPARENT "Oënskynlike krag"
#define D_POWERUSAGE_REACTIVE "reaktiewe krag"
#define D_PRESSURE "Druk"
#define D_PRESSUREATSEALEVEL "Druk op seevlak"
#define D_PROGRAM_FLASH_SIZE "Program Flash Grootte"
#define D_PROGRAM_SIZE "Program Grootte"
#define D_PROJECT "Projek"
#define D_RAIN "Reën"
#define D_RANGE "Gebied"
#define D_RECEIVED "Ontvang"
#define D_RESTART "Herbegin"
#define D_RESTARTING "Herbegin"
#define D_RESTART_REASON "Herlaai rede"
#define D_RESTORE "herstel"
#define D_RETAINED "behou"
#define D_RULE "Reël"
#define D_SAVE "Stoor"
#define D_SENSOR "Sensor"
#define D_SSID "SSId"
#define D_START "Begin"
#define D_STD_TIME "STD"
#define D_STOP "Stop"
#define D_SUBNET_MASK "Subnet Masker"
#define D_SUBSCRIBE_TO "Teken in op"
#define D_UNSUBSCRIBE_FROM "Teken uit van"
#define D_SUCCESSFUL "Suksesvol"
#define D_SUNRISE "Sonsopkoms"
#define D_SUNSET "Sononder"
#define D_TEMPERATURE "Temperatuur"
#define D_TO "naar"
#define D_TOGGLE "Verwissel"
#define D_TOPIC "Onderwerp"
#define D_TOTAL_USAGE "Totale gebruik"
#define D_TRANSMIT "Stuur"
#define D_TRUE "Waar"
#define D_TVOC "TVOC"
#define D_UPGRADE "opgradeer"
#define D_UPLOAD "Laai op"
#define D_UPTIME "Uptyd"
#define D_USER "Gebruiker"
#define D_UTC_TIME "UTC"
#define D_UV_INDEX "UV Indeks"
#define D_UV_INDEX_1 "Laag"
#define D_UV_INDEX_2 "Middel"
#define D_UV_INDEX_3 "Hoog"
#define D_UV_INDEX_4 "Gevaarlik"
#define D_UV_INDEX_5 "1ste/2de graad sonbrand"
#define D_UV_INDEX_6 "3e graad sonbrand"
#define D_UV_INDEX_7 "Buite bereik" // Out of Range
#define D_UV_LEVEL "UV Level"
#define D_UV_POWER "UV krag"
#define D_VERSION "Weergawe"
#define D_VOLTAGE "Spanning"
#define D_VOLUME "Volume"
#define D_WEIGHT "Gewig"
#define D_WARMLIGHT "Warm"
#define D_WEB_SERVER "Webbediener"
// tasmota.ino
#define D_WARNING_MINIMAL_VERSION "WAARSKUWING Hierdie weergawe ondersteun nie aanhoudende instellings nie"
#define D_LEVEL_10 "level 1-0"
#define D_LEVEL_01 "level 0-1"
#define D_SERIAL_LOGGING_DISABLED "Syslog-logging is uitgeskakel"
#define D_SYSLOG_LOGGING_REENABLED "Syslog-logging is weer geaktiveer"
#define D_SET_BAUDRATE_TO "Stem Baudrate op"
#define D_RECEIVED_TOPIC "Ontvang onderwerp"
#define D_DATA_SIZE "Data grootte"
#define D_ANALOG_INPUT "Analoog"
// support.ino
#define D_OSWATCH "osWatch"
#define D_BLOCKED_LOOP "Geblokkeerde lus"
#define D_WPS_FAILED_WITH_STATUS "WPSconfig kon nie status kry nie"
#define D_ACTIVE_FOR_3_MINUTES "3 minute aktief"
#define D_FAILED_TO_START "kon nie begin nie"
#define D_PATCH_ISSUE_2186 "Patch issue 2186"
#define D_CONNECTING_TO_AP "Koppel tans aan AP"
#define D_IN_MODE "in mode"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Kon nie verbind nie omdat geen IP-adres ontvang is nie"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Kon nie verbind nie, aangesien toegang nie bereik kan word nie"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Kon nie verbind nie"
#define D_CONNECT_FAILED_AP_TIMEOUT "Kon nie verbinding maak met AP-time-out nie"
#define D_ATTEMPTING_CONNECTION "Attempting connection..."
#define D_CHECKING_CONNECTION "Probeer tans verbinding ..."
#define D_QUERY_DONE "Navraag gedoen. MQTT-dienste gevind"
#define D_MQTT_SERVICE_FOUND "MQTT-diens gevind op"
#define D_FOUND_AT "gevind op"
#define D_SYSLOG_HOST_NOT_FOUND "Syslog Host nie gevind nie"
// settings.ino
#define D_SAVED_TO_FLASH_AT "Gestoor in die flash op"
#define D_LOADED_FROM_FLASH_AT "Uit flash gelaai by"
#define D_USE_DEFAULTS "Gebruik standaardinstellings"
#define D_ERASED_SECTOR "Uitgewis sektor"
// xdrv_02_webserver.ino
#define D_NOSCRIPT "Skakel JavaScript aan om Tasmota te gebruik"
#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware <br> gradeer asseblief op"
#define D_WEBSERVER_ACTIVE_ON "Webbediener aktief op"
#define D_WITH_IP_ADDRESS "met IP-adres"
#define D_WEBSERVER_STOPPED "Webbediener gestop"
#define D_FILE_NOT_FOUND "Lêer nie gevind nie"
#define D_REDIRECTED "Herlei na captive portal"
#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifimanager stel AccessPoint in en hou Station"
#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifimanager het AccessPoint ingestel"
#define D_TRYING_TO_CONNECT "Probeer om toestel aan netwerk te koppel"
#define D_RESTART_IN "Begin weer binne"
#define D_SECONDS "sekondes"
#define D_DEVICE_WILL_RESTART "Toestel sal binne 'n paar sekondes weer begin"
#define D_BUTTON_TOGGLE "Wissel"
#define D_CONFIGURATION "Konfigurasie"
#define D_INFORMATION "Inligting"
#define D_FIRMWARE_UPGRADE "Firmware-opgradering"
#define D_CONSOLE "Konsole"
#define D_CONFIRM_RESTART "Bevestig weer te begin"
#define D_CONFIGURE_MODULE "Stel module in"
#define D_CONFIGURE_WIFI "Stel WiFi in"
#define D_CONFIGURE_MQTT "Stel MQTT in"
#define D_CONFIGURE_DOMOTICZ "Stel Domoticz in"
#define D_CONFIGURE_LOGGING "Stel logging in"
#define D_CONFIGURE_OTHER "Stel ander in"
#define D_CONFIRM_RESET_CONFIGURATION "Bevestig die herstel van die konfigurasie"
#define D_RESET_CONFIGURATION "Stel die konfigurasie terug"
#define D_BACKUP_CONFIGURATION "Rugsteun die konfigurasie"
#define D_RESTORE_CONFIGURATION "Stel die konfigurasie terug"
#define D_MAIN_MENU "Hoofkieslys"
#define D_MODULE_PARAMETERS "Moduleparameters"
#define D_MODULE_TYPE "Module tipe"
#define D_PULLUP_ENABLE "Geen knoppie/skakelaar optrek"
#define D_ADC "ADC"
#define D_GPIO "GPIO"
#define D_SERIAL_IN "Serial in"
#define D_SERIAL_OUT "Serial uit"
#define D_WIFI_PARAMETERS "Wifi-parameters"
#define D_SCAN_FOR_WIFI_NETWORKS "Soek vir wifi-netwerke"
#define D_SCAN_DONE "Skandering gedoen"
#define D_NO_NETWORKS_FOUND "Geen netwerke gevind nie"
#define D_REFRESH_TO_SCAN_AGAIN "Verfris om weer te skandeer"
#define D_DUPLICATE_ACCESSPOINT "Duplikaat AccessPoint"
#define D_SKIPPING_LOW_QUALITY "Slaan oor as gevolg van lae gehalte"
#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 Wagwoord"
#define D_AP2_SSID "AP2 SSId"
#define D_AP2_PASSWORD "AP2 Wagwoord"
#define D_MQTT_PARAMETERS "MQTT-parameters"
#define D_CLIENT "Kliënt"
#define D_FULL_TOPIC "Volledige onderwerp"
#define D_LOGGING_PARAMETERS "Logging parameters"
#define D_SERIAL_LOG_LEVEL "Serial log level"
#define D_MQTT_LOG_LEVEL "Mqtt log level"
#define D_WEB_LOG_LEVEL "Web log level"
#define D_SYS_LOG_LEVEL "Syslog level"
#define D_MORE_DEBUG "More debug"
#define D_SYSLOG_HOST "Syslog host"
#define D_SYSLOG_PORT "Syslog port"
#define D_TELEMETRY_PERIOD "Telemetry period"
#define D_OTHER_PARAMETERS "Ander parameters"
#define D_TEMPLATE "Sjabloon"
#define D_ACTIVATE "Aktiveer"
#define D_DEVICE_NAME "Toestel naam"
#define D_WEB_ADMIN_PASSWORD "Webadministrateurwagwoord"
#define D_MQTT_ENABLE "MQTT inskakel"
#define D_MQTT_TLS_ENABLE "MQTT TLS"
#define D_FRIENDLY_NAME "Vriendelike naam"
#define D_BELKIN_WEMO "Belkin WeMo"
#define D_HUE_BRIDGE "Hue Bridge"
#define D_SINGLE_DEVICE "enkele toestel"
#define D_MULTI_DEVICE "multi toestel"
#define D_CONFIGURE_TEMPLATE "Konfigureer sjabloon"
#define D_TEMPLATE_PARAMETERS "Sjabloon parameters"
#define D_TEMPLATE_NAME "Naam"
#define D_BASE_TYPE "Gebaseer op"
#define D_TEMPLATE_FLAGS "Opsies"
#define D_SAVE_CONFIGURATION "Stoor konfigurasie"
#define D_CONFIGURATION_SAVED "Konfigurasie gestoor"
#define D_CONFIGURATION_RESET "Konfigurasie terugstel"
#define D_PROGRAM_VERSION "Programweergawe"
#define D_BUILD_DATE_AND_TIME "Bou datum en tyd"
#define D_CORE_AND_SDK_VERSION "Core/SDK weergawe"
#define D_FLASH_WRITE_COUNT "Flash skryf tel"
#define D_MAC_ADDRESS "MAC adress"
#define D_MQTT_HOST "MQTT gasheer"
#define D_MQTT_PORT "MQTT poort"
#define D_MQTT_CLIENT "MQTT kliënt"
#define D_MQTT_USER "MQTT gebruiker"
#define D_MQTT_TOPIC "MQTT onderwerp"
#define D_MQTT_GROUP_TOPIC "MQTT groeponderwerp"
#define D_MQTT_FULL_TOPIC "MQTT volledige onderwerp"
#define D_MQTT_NO_RETAIN "MQTT geen behoud"
#define D_MDNS_DISCOVERY "mDNS ontdekking"
#define D_MDNS_ADVERTISE "mDNS adverteer"
#define D_ESP_CHIP_ID "ESP Chip Id"
#define D_FLASH_CHIP_ID "Flash Chip Id"
#define D_FLASH_CHIP_SIZE "Flash Size"
#define D_FREE_PROGRAM_SPACE "Vrye program grootte"
#define D_UPGRADE_BY_WEBSERVER "Opgradeer per webbediener"
#define D_OTA_URL "OTA Url"
#define D_START_UPGRADE "Begin opgradering"
#define D_UPGRADE_BY_FILE_UPLOAD "Gradeer op volgens lêeroplaai"
#define D_UPLOAD_STARTED "Oplaai begin"
#define D_UPGRADE_STARTED "Opgradering is begin"
#define D_UPLOAD_DONE "Oplaai gedoen"
#define D_UPLOAD_TRANSFER "Laai oordrag op"
#define D_TRANSFER_STARTED "Oordrag is begin"
#define D_UPLOAD_ERR_1 "Geen lêer is gekies nie"
#define D_UPLOAD_ERR_2 "Nie genoeg plek nie"
#define D_UPLOAD_ERR_3 "Ongeldige lêerhandtekening"
#define D_UPLOAD_ERR_4 "Programgrootte is groter as geheue"
#define D_UPLOAD_ERR_5 "Laai buffer verkeerd op"
#define D_UPLOAD_ERR_6 "Kon nie oplaai nie. Aktiveer logging 3"
#define D_UPLOAD_ERR_7 "Oplaai afgebreek"
#define D_UPLOAD_ERR_8 "Lêer ongeldig"
#define D_UPLOAD_ERR_9 "Lêer is te groot"
#define D_UPLOAD_ERR_10 "Kon nie RF-skyfie inisieer nie"
#define D_UPLOAD_ERR_11 "Kon nie RF-skyfie uitvee nie"
#define D_UPLOAD_ERR_12 "Kon nie na RF-skyfie skryf nie"
#define D_UPLOAD_ERR_13 "Kon nie RF-firmware dekodeer nie"
#define D_UPLOAD_ERR_14 "Nie versoenbaar nie"
#define D_UPLOAD_ERROR_CODE "Laai foutkode op"
#define D_ENTER_COMMAND "Voer die opdrag in"
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Skakel weblog 2 aan as antwoord verwag word"
#define D_NEED_USER_AND_PASSWORD "Benodig user=<gebruiker>&password=<wagwoord>"
// xdrv_01_mqtt.ino
#define D_FINGERPRINT "Verifieer TLS-vingerafdruk ..."
#define D_TLS_CONNECT_FAILED_TO "TLS Connect kon nie"
#define D_RETRY_IN "Probeer weer"
#define D_VERIFIED "Geverifieer met behulp van vingerafdruk"
#define D_INSECURE "Onveilige verbinding weens ongeldige vingerafdruk"
#define D_CONNECT_FAILED_TO "Kon nie verbind nie"
// xplg_wemohue.ino
#define D_MULTICAST_DISABLED "Multicast gedeaktiveer"
#define D_MULTICAST_REJOINED "Multicast (weer) aangesluit"
#define D_MULTICAST_JOIN_FAILED "Multicast aansluiting het misluk"
#define D_FAILED_TO_SEND_RESPONSE "Kon nie antwoord stuur nie"
#define D_WEMO "WeMo"
#define D_WEMO_BASIC_EVENT "WeMo basiese event"
#define D_WEMO_EVENT_SERVICE "WeMo geleentheids service"
#define D_WEMO_META_SERVICE "WeMo meta service"
#define D_WEMO_SETUP "WeMo opstelling"
#define D_RESPONSE_SENT "Antwoord gestuur"
#define D_HUE "Hue"
#define D_HUE_BRIDGE_SETUP "Hue opstelling"
#define D_HUE_API_NOT_IMPLEMENTED "Hue API nie geïmplementeer nie"
#define D_HUE_API "Hue API"
#define D_HUE_POST_ARGS "Hue POST args"
#define D_3_RESPONSE_PACKETS_SENT "3 antwoordpakkies gestuur"
// xdrv_07_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Domoticz parameters"
#define D_DOMOTICZ_IDX "Idx"
#define D_DOMOTICZ_KEY_IDX "Key idx"
#define D_DOMOTICZ_SWITCH_IDX "Switch idx"
#define D_DOMOTICZ_SENSOR_IDX "Sensor idx"
#define D_DOMOTICZ_TEMP "Temp"
#define D_DOMOTICZ_TEMP_HUM "Temp,Hum"
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro"
#define D_DOMOTICZ_POWER_ENERGY "Krag, Energie"
#define D_DOMOTICZ_ILLUMINANCE "Beligting"
#define D_DOMOTICZ_COUNT "Telling/PM1"
#define D_DOMOTICZ_VOLTAGE "Spanning/PM2.5"
#define D_DOMOTICZ_CURRENT "Stroom/PM10"
#define D_DOMOTICZ_AIRQUALITY "Lug kwaliteit"
#define D_DOMOTICZ_P1_SMART_METER "P1SmartMeter"
#define D_DOMOTICZ_UPDATE_TIMER "Dateer tydopdatering op"
// xdrv_09_timers.ino
#define D_CONFIGURE_TIMER "Stel timer in"
#define D_TIMER_PARAMETERS "Timer-parameters"
#define D_TIMER_ENABLE "Aktiveer timers"
#define D_TIMER_ARM "Aktiveer"
#define D_TIMER_TIME "Tyd"
#define D_TIMER_DAYS "Dae"
#define D_TIMER_REPEAT "Herhaal"
#define D_TIMER_OUTPUT "Uitset"
#define D_TIMER_ACTION "Aksie"
// xdrv_10_knx.ino
#define D_CONFIGURE_KNX "Stel KNX op"
#define D_KNX_PARAMETERS "KNX-parameters"
#define D_KNX_GENERAL_CONFIG "Algemene"
#define D_KNX_PHYSICAL_ADDRESS "Fisiese adres"
#define D_KNX_PHYSICAL_ADDRESS_NOTE "( Moet uniek wees in die KNX-netwerk )"
#define D_KNX_ENABLE "Aktiveer KNX"
#define D_KNX_GROUP_ADDRESS_TO_WRITE "Data om na groepadresse te stuur"
#define D_ADD "Voeg by"
#define D_DELETE "Vee uit"
#define D_REPLY "Antwoord"
#define D_KNX_GROUP_ADDRESS_TO_READ "Groepadresse om data van te ontvang"
#define D_RECEIVED_FROM "Ontvang van"
#define D_KNX_COMMAND_WRITE "Skryf"
#define D_KNX_COMMAND_READ "Lees"
#define D_KNX_COMMAND_OTHER "Ander"
#define D_SENT_TO "gestuur na"
#define D_KNX_WARNING "Die groepadres ( 0 / 0 / 0 ) is gereserveer en kan nie gebruik word nie."
#define D_KNX_ENHANCEMENT "Kommunikasieverbetering"
#define D_KNX_TX_SLOT "KNX TX"
#define D_KNX_RX_SLOT "KNX RX"
#define D_KNX_TX_SCENE "KNX SCENE TX"
#define D_KNX_RX_SCENE "KNX SCENE RX"
// xdrv_23_zigbee
#define D_ZIGBEE_PERMITJOIN_ACTIVE "Toestelle wat toegelaat word om aan te sluit"
#define D_ZIGBEE_MAPPING_TITLE "Tasmota Zigbee-kartering"
#define D_ZIGBEE_NOT_STARTED "Zigbee het nie begin nie"
#define D_ZIGBEE_MAPPING_IN_PROGRESS_SEC "Kartering aan die gang (% d s. Oor)"
#define D_ZIGBEE_MAPPING_NOT_PRESENT "Geen kartering nie"
#define D_ZIGBEE_MAP_REFRESH "Zigbee kartering Refresh"
#define D_ZIGBEE_MAP "Zigbee-kaart"
#define D_ZIGBEE_PERMITJOIN "Zigbee Permit sluit aan"
#define D_ZIGBEE_GENERATE_KEY "genereer ewekansige Zigbee-netwerksleutel"
#define D_ZIGBEE_UNKNOWN_DEVICE "Onbekende toestel"
#define D_ZIGBEE_UNKNOWN_ATTRIBUTE "Onbekende kenmerk"
#define D_ZIGBEE_INVALID_PARAM "Ongeldige parameter"
#define D_ZIGBEE_MISSING_PARAM "Ontbrekende parameters"
#define D_ZIGBEE_UNKNWON_ATTRIBUTE "Onbekende kenmerknaam (geïgnoreer): %s"
#define D_ZIGBEE_TOO_MANY_CLUSTERS "Nie meer as een groep-ID per opdrag nie"
#define D_ZIGBEE_WRONG_DELIMITER "Verkeerde afbakening vir payload"
#define D_ZIGBEE_UNRECOGNIZED_COMMAND "Onherkenbare zigbee-opdrag: %s"
#define D_ZIGBEE_TOO_MANY_COMMANDS "Slegs 1 opdrag toegelaat (%d)"
#define D_ZIGBEE_NO_ATTRIBUTE "Geen kenmerk in die lys nie"
#define D_ZIGBEE_UNSUPPORTED_ATTRIBUTE_TYPE "Nie-ondersteunde kenmerktipe"
#define D_ZIGBEE_JSON_REQUIRED "Config benodig JSON-voorwerpe"
#define D_ZIGBEE_RESET_1_OR_2 "1 of 2 om te herstel"
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM gevind by adres"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Ewekansige Zigbee parameters, kyk asseblief met 'ZbConfig'"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energie Vandag"
#define D_ENERGY_YESTERDAY "Energie Gister"
#define D_ENERGY_TOTAL "Energie Totaal"
// xdrv_27_shutter.ino
#define D_OPEN "Maak oop"
#define D_CLOSE "Maak toe"
#define D_DOMOTICZ_SHUTTER "Luik"
// xdrv_28_pcf8574.ino
#define D_CONFIGURE_PCF8574 "Configure PCF8574"
#define D_PCF8574_PARAMETERS "PCF8574 parameters"
#define D_INVERT_PORTS "Keer poorte om"
#define D_DEVICE "Toestel"
#define D_DEVICE_INPUT "Invoer"
#define D_DEVICE_OUTPUT "Uitvoer"
// xsns_05_ds18b20.ino
#define D_SENSOR_BUSY "Sensor besig"
#define D_SENSOR_CRC_ERROR "Sensor CRC fout"
#define D_SENSORS_FOUND "Sensors gevind"
// xsns_06_dht.ino
#define D_TIMEOUT_WAITING_FOR "Tyduitstyd wag vir"
#define D_START_SIGNAL_LOW "begin sein laag"
#define D_START_SIGNAL_HIGH "begin sein hoog"
#define D_PULSE "pols"
#define D_CHECKSUM_FAILURE "Checksum het misluk"
// xsns_07_sht1x.ino
#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor het nie ACK opdrag"
#define D_SHT1X_FOUND "SHT1X gevind"
// 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 "Deeltjies"
// xsns_27_apds9960.ino
#define D_GESTURE "Gebaar"
#define D_COLOR_RED "Rooi"
#define D_COLOR_GREEN "Groen"
#define D_COLOR_BLUE "Blou"
#define D_CCT "CCT"
#define D_PROXIMITY "Nabyheid"
// 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 "Verwyder gewig"
#define D_HX_CAL_REFERENCE "Laai verwysingsgewig"
#define D_HX_CAL_DONE "Gekalibreer"
#define D_HX_CAL_FAIL "Kon nie kalibreer nie"
#define D_RESET_HX711 "Stel die skaal terug"
#define D_CONFIGURE_HX711 "Stel skaal op"
#define D_HX711_PARAMETERS "Skaal parameters"
#define D_ITEM_WEIGHT "Gewig van die item"
#define D_REFERENCE_WEIGHT "Verwysingsgewig"
#define D_CALIBRATE "Kalibreer"
#define D_CALIBRATION "Kalibrasie"
//xsns_35_tx20.ino
#define D_TX20_WIND_DIRECTION "Windrigting"
#define D_TX20_WIND_SPEED "Wind spoed"
#define D_TX20_WIND_SPEED_MIN "Wind spoed Min"
#define D_TX20_WIND_SPEED_MAX "Wind spoed Max"
#define D_TX20_NORTH "N"
#define D_TX20_EAST "O"
#define D_TX20_SOUTH "S"
#define D_TX20_WEST "W"
// xsns_53_sml.ino
#define D_TPWRIN "Totaal-In"
#define D_TPWROUT "Totaal-Uit"
#define D_TPWRCURR "Stroom-In/Uit"
#define D_TPWRCURR1 "Stroom-In p1"
#define D_TPWRCURR2 "Stroom-In p2"
#define D_TPWRCURR3 "Stroom-In p3"
#define D_Strom_L1 "Stroom L1"
#define D_Strom_L2 "Stroom L2"
#define D_Strom_L3 "Stroom L3"
#define D_Spannung_L1 "Spanning L1"
#define D_Spannung_L2 "Spanning L2"
#define D_Spannung_L3 "Spanning L3"
#define D_METERNR "Meter nommmer"
#define D_METERSID "Service ID"
#define D_GasIN "Teller" // Gas-Verbrauch
#define D_H2oIN "Teller" // H2o-Verbrauch
#define D_StL1L2L3 "Stroom L1+L2+L3"
#define D_SpL1L2L3 "Spanning L1+L2+L3/3"
// tasmota_template.h - keep them as short as possible to be able to fit them in GUI drop down box
#define D_SENSOR_NONE "Geen"
#define D_SENSOR_USER "Gebruiker"
#define D_SENSOR_OPTION "Opsie"
#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 Speler"
#define D_SENSOR_IRSEND "IRstuurder"
#define D_SENSOR_SWITCH "SKakelaar" // Suffix "1"
#define D_SENSOR_BUTTON "Knoppie" // Suffix "1"
#define D_SENSOR_RELAY "Relais" // 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 "Teller" // Suffix "1"
#define D_SENSOR_IRRECV "IRontvanger"
#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_TX "PMS5003 Tx"
#define D_SENSOR_PMS5003_RX "PMS5003 Rx"
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
#define D_SENSOR_HPMA_RX "HPMA Rx"
#define D_SENSOR_HPMA_TX "HPMA Tx"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
#define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 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_FTC532 "FTC532"
#define D_SENSOR_TX2X_TX "TX2x"
#define D_SENSOR_RFSEND "RFstuurder"
#define D_SENSOR_RFRECV "RFontvanger"
#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_MAX31865_CS "MX31865 CS"
#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_P9813_CLK "P9813 Clk"
#define D_SENSOR_P9813_DAT "P9813 Dat"
#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 "Draai" // Suffix "1A"
#define D_SENSOR_HRE_CLOCK "HRE Klok"
#define D_SENSOR_HRE_DATA "HRE Data"
#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ"
#define D_SENSOR_BUZZER "Gonser"
#define D_SENSOR_OLED_RESET "OLED Herstel"
#define D_SENSOR_ZIGBEE_TXD "Zigbee Tx"
#define D_SENSOR_ZIGBEE_RXD "Zigbee Rx"
#define D_SENSOR_ZIGBEE_RST "Zigbee Rst"
#define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx"
#define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx"
#define D_SENSOR_IBEACON_TX "iBeacon TX"
#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_OUTPUT_HI "Output Hi"
#define D_SENSOR_OUTPUT_LO "Output Lo"
#define D_SENSOR_AS608_TX "AS608 Tx"
#define D_SENSOR_AS608_RX "AS608 Rx"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
#define D_SENSOR_SM2135_CLK "SM2135 Clk"
#define D_SENSOR_SM2135_DAT "SM2135 Dat"
#define D_SENSOR_DEEPSLEEP "Diep slaap"
#define D_SENSOR_EXS_ENABLE "EXS Inskakel"
#define D_SENSOR_CLIENT_TX "Client TX"
#define D_SENSOR_CLIENT_RX "Client RX"
#define D_SENSOR_CLIENT_RESET "Client RST"
#define D_SENSOR_GPS_RX "GPS RX"
#define D_SENSOR_GPS_TX "GPS TX"
#define D_SENSOR_HM10_RX "HM10 RX"
#define D_SENSOR_HM10_TX "HM10 TX"
#define D_SENSOR_LE01MR_RX "LE-01MR Rx"
#define D_SENSOR_LE01MR_TX "LE-01MR Tx"
#define D_SENSOR_BL0940_RX "BL0940 Rx"
#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0"
#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2"
#define D_SENSOR_HRXL_RX "HRXL Rx"
#define D_SENSOR_DYP_RX "DYP Rx"
#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx"
#define D_SENSOR_AS3935 "AS3935"
#define D_SENSOR_WINDMETER_SPEED "WindMeter Spd"
#define D_SENSOR_TELEINFO_RX "TInfo Rx"
#define D_SENSOR_TELEINFO_ENABLE "TInfo EN"
#define D_SENSOR_LMT01_PULSE "LMT01 Pulse"
#define D_SENSOR_ADC_INPUT "ADC Insette"
#define D_SENSOR_ADC_TEMP "ADC Temperatuur"
#define D_SENSOR_ADC_LIGHT "ADC Lig"
#define D_SENSOR_ADC_BUTTON "ADC Knoppie"
#define D_SENSOR_ADC_RANGE "ADC Reekse"
#define D_SENSOR_ADC_CT_POWER "ADC CT Power"
#define D_SENSOR_ADC_JOYSTICK "ADC Joystick"
#define D_GPIO_WEBCAM_PWDN "CAM_PWDN"
#define D_GPIO_WEBCAM_RESET "CAM_RESET"
#define D_GPIO_WEBCAM_XCLK "CAM_XCLK"
#define D_GPIO_WEBCAM_SIOD "CAM_SIOD"
#define D_GPIO_WEBCAM_SIOC "CAM_SIOC"
#define D_GPIO_WEBCAM_DATA "CAM_DATA"
#define D_GPIO_WEBCAM_VSYNC "CAM_VSYNC"
#define D_GPIO_WEBCAM_HREF "CAM_HREF"
#define D_GPIO_WEBCAM_PCLK "CAM_PCLK"
#define D_GPIO_WEBCAM_PSCLK "CAM_PSCLK"
#define D_GPIO_WEBCAM_HSD "CAM_HSD"
#define D_GPIO_WEBCAM_PSRCS "CAM_PSRCS"
#define D_SENSOR_ETH_PHY_POWER "ETH POWER"
#define D_SENSOR_ETH_PHY_MDC "ETH MDC"
#define D_SENSOR_ETH_PHY_MDIO "ETH MDIO"
#define D_SENSOR_TCP_TXD "TCP Tx"
#define D_SENSOR_TCP_RXD "TCP Rx"
#define D_SENSOR_IEM3000_TX "iEM3000 TX"
#define D_SENSOR_IEM3000_RX "iEM3000 RX"
#define D_SENSOR_MIEL_HVAC_TX "MiEl HVAC Tx"
#define D_SENSOR_MIEL_HVAC_RX "MiEl HVAC Rx"
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Herstel"
#define D_SENSOR_RC522_RST "RC522 Herstel"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_CELSIUS "C"
#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_DEGREE "°"
#define D_UNIT_FAHRENHEIT "F"
#define D_UNIT_HERTZ "Hz"
#define D_UNIT_HOUR "h"
#define D_UNIT_GALLONS "gal"
#define D_UNIT_GALLONS_PER_MIN "g/m"
#define D_UNIT_INCREMENTS "inc"
#define D_UNIT_KELVIN "K"
#define D_UNIT_KILOMETER "km"
#define D_UNIT_KILOGRAM "kg"
#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h"
#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LITERS "L"
#define D_UNIT_LITERS_PER_MIN "L/m"
#define D_UNIT_LUX "lx"
#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³"
#define D_UNIT_MICROMETER "µm"
#define D_UNIT_MICROSECOND "µs"
#define D_UNIT_MICROSIEMENS_PER_CM "µS/cm"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLILITERS "ml"
#define D_UNIT_MILLIMETER "mm"
#define D_UNIT_MILLIMETER_MERCURY "mmHg"
#define D_UNIT_MILLISECOND "ms"
#define D_UNIT_MILLIVOLT "mV"
#define D_UNIT_MINUTE "Min"
#define D_UNIT_PARTS_PER_BILLION "ppb"
#define D_UNIT_PARTS_PER_DECILITER "ppd"
#define D_UNIT_PARTS_PER_MILLION "ppm"
#define D_UNIT_PERCENT "%%"
#define D_UNIT_PRESSURE "hPa"
#define D_UNIT_SECOND "sec"
#define D_UNIT_SECTORS "sectors"
#define D_UNIT_VA "VA"
#define D_UNIT_VAR "VAr"
#define D_UNIT_VOLT "V"
#define D_UNIT_WATT "W"
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
//SDM220, SDM120, LE01MR
#define D_PHASE_ANGLE "Fasehoek"
#define D_IMPORT_ACTIVE "Invoer aktief"
#define D_EXPORT_ACTIVE "Uitvoer aktief"
#define D_IMPORT_REACTIVE "Import reaktief"
#define D_EXPORT_REACTIVE "Uitvoer reaktief"
#define D_TOTAL_REACTIVE "Totaal reaktief"
#define D_UNIT_KWARH "kVArh"
#define D_UNIT_ANGLE "Deg"
#define D_TOTAL_ACTIVE "Totaal aktief"
//SOLAXX1
#define D_PV1_VOLTAGE "PV1 Spanning"
#define D_PV1_CURRENT "PV1 Stroom"
#define D_PV1_POWER "PV1 Krag"
#define D_PV2_VOLTAGE "PV2 Spanning"
#define D_PV2_CURRENT "PV2 Stroom"
#define D_PV2_POWER "PV2 Krag"
#define D_SOLAR_POWER "Sonkrag"
#define D_INVERTER_POWER "Omskakelaarkrag"
#define D_STATUS "Status"
#define D_WAITING "Wag"
#define D_CHECKING "Nagaan"
#define D_WORKING "Werk"
#define D_FAILURE "Mislukking"
#define D_SOLAX_ERROR_0 "Geen foutkode nie"
#define D_SOLAX_ERROR_1 "Netspanning verlies fout"
#define D_SOLAX_ERROR_2 "Netspanning spanning fout"
#define D_SOLAX_ERROR_3 "Netspanning frekwensie fout"
#define D_SOLAX_ERROR_4 "Pv stroom fout"
#define D_SOLAX_ERROR_5 "Isolasiefout"
#define D_SOLAX_ERROR_6 "Storing by oormatige temperatuur"
#define D_SOLAX_ERROR_7 "Waaierstoring"
#define D_SOLAX_ERROR_8 "Ander toestelfout"
//xdrv_10_scripter.ino
#define D_CONFIGURE_SCRIPT "Wysig skrif"
#define D_SCRIPT "wysig skrif"
#define D_SDCARD_UPLOAD "lêer oplaai"
#define D_SDCARD_DIR "sd card directory"
#define D_UPL_DONE "Klaar"
#define D_SCRIPT_CHARS_LEFT "karakters oor"
#define D_SCRIPT_CHARS_NO_MORE "nie meer karakters nie"
#define D_SCRIPT_DOWNLOAD "Aflaai"
#define D_SCRIPT_ENABLE "skrip inskakel"
#define D_SCRIPT_UPLOAD "Laai op"
#define D_SCRIPT_UPLOAD_FILES "Laai lêers op"
//xsns_67_as3935.ino
#define D_AS3935_GAIN "versterking:"
#define D_AS3935_ENERGY "energie:"
#define D_AS3935_DISTANCE "afstand:"
#define D_AS3935_DISTURBER "steur:"
#define D_AS3935_VRMS "µVrms:"
#define D_AS3935_APRX "aprx.:"
#define D_AS3935_AWAY "weg"
#define D_AS3935_LIGHT "weerlig"
#define D_AS3935_OUT "weerlig buite bereik"
#define D_AS3935_NOT "afstand nie bepaal nie"
#define D_AS3935_ABOVE "weerlig oorhoofse"
#define D_AS3935_NOISE "geraas bespeur"
#define D_AS3935_DISTDET "steuring bespeur"
#define D_AS3935_INTNOEV "Onderbreek met geen geleentheid nie!"
#define D_AS3935_FLICKER "IRQ Pin flikker!"
#define D_AS3935_POWEROFF "Skakel af"
#define D_AS3935_NOMESS "luister..."
#define D_AS3935_ON "Aan"
#define D_AS3935_OFF "Uit"
#define D_AS3935_INDOORS "Binnenshuis"
#define D_AS3935_OUTDOORS "Buite"
#define D_AS3935_CAL_FAIL "kalibrasie het misluk"
#define D_AS3935_CAL_OK "kalibrasie ingestel op:"
//xsns_68_opentherm.ino
#define D_SENSOR_BOILER_OT_RX "OpenTherm RX"
#define D_SENSOR_BOILER_OT_TX "OpenTherm TX"
// xnrg_15_teleinfo Denky (Teleinfo)
#define D_CONTRACT "Kontrak"
#define D_POWER_LOAD "Kraglading"
#define D_CURRENT_TARIFF "Stroom tarief"
#define D_TARIFF "Tarief"
#define D_OVERLOAD "ADPS"
#define D_MAX_POWER "Max krag"
#define D_MAX_CURRENT "Max stroom"
// xsns_79_as608.ino
#define D_FP_ENROLL_PLACEFINGER "Plaas vinger"
#define D_FP_ENROLL_REMOVEFINGER "Verwyder vinger"
#define D_FP_ENROLL_PLACESAMEFINGER "Plaas dieselfde vinger weer"
#define D_FP_ENROLL_RETRY "Fout, probeer dus weer"
#define D_FP_ENROLL_RESTART "Begin oor"
#define D_FP_ENROLL_ERROR "Fout"
#define D_FP_ENROLL_RESET "Stel terug"
#define D_FP_ENROLL_ACTIVE "Aktief"
#define D_FP_ENROLL_INACTIVE "Onaktief"
// Indexed by Adafruit_Fingerprint.h defines
#define D_FP_PACKETRECIEVEERR "Komms-fout" // 0x01 Error when receiving data package
#define D_FP_NOFINGER "Geen vinger op die sensor nie" // 0x02 No finger on the sensor
#define D_FP_IMAGEFAIL "Beeldfout" // 0x03 Failed to enroll the finger
#define D_FP_IMAGEMESS "Beeld te deurmekaar" // 0x06 Failed to generate character file due to overly disorderly fingerprint image
#define D_FP_FEATUREFAIL "Vingerafdruk te klein" // 0x07 Failed to generate character file due to the lack of character point or small fingerprint image
#define D_FP_NOMATCH "Nie opgewasse" // 0x08 Finger doesn't match
#define D_FP_NOTFOUND "Kon nie 'n ekwivalent vind nie" // 0x09 Failed to find matching finger
#define D_FP_ENROLLMISMATCH "Vingerafdruk stem nie ooreen nie" // 0x0A Failed to combine the character files
#define D_FP_BADLOCATION "Slegte ligging" // 0x0B Addressed PageID is beyond the finger library
#define D_FP_DBRANGEFAIL "DB-reeksfout" // 0x0C Error when reading template from library or invalid template
#define D_FP_UPLOADFEATUREFAIL "Fout by die oplaai van funksie" // 0x0D Error when uploading template
#define D_FP_PACKETRESPONSEFAIL "Fout van pakketrespons" // 0x0E Module failed to receive the following data packages
#define D_FP_UPLOADFAIL "Oplaaifout" // 0x0F Error when uploading image
#define D_FP_DELETEFAIL "Vee fout" // 0x10 Failed to delete the template
#define D_FP_DBCLEARFAIL "DB leegfout" // 0x11 Failed to clear finger library
#define D_FP_PASSFAIL "Wagwoordfout" // 0x13 Find whether the fingerprint passed or failed
#define D_FP_INVALIDIMAGE "Prent ongeldig" // 0x15 Failed to generate image because of lac of valid primary image
#define D_FP_FLASHERR "Flash skryffout" // 0x18 Error when writing flash
#define D_FP_INVALIDREG "Ongeldige nommer" // 0x1A Invalid register number
#define D_FP_ADDRCODE "Adres kode" // 0x20 Address code
#define D_FP_PASSVERIFY "Wagwoord geverifieer" // 0x21 Verify the fingerprint passed
#define D_FP_UNKNOWNERROR "Fout" // Any other error
#endif // _LANGUAGE_AF_AF_H_

View File

@ -1,7 +1,7 @@
/*
bg-BG.h - localization for Bulgaria - Bulgarian for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -763,6 +763,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
cs-CZ.h - localization for Czech with diacritics - Czech for Tasmota
Copyright (C) 2020 Vladimír Synek
Copyright (C) 2021 Vladimír Synek
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
de-DE.h - localization for German - Germany for Tasmota
Copyright (C) 2020 VinceMasuka
Copyright (C) 2021 VinceMasuka
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
el-GR.h - localization for Greek - Greece for Tasmota
Copyright (C) 2020 Theo Arends, translated by Nick Galfas
Copyright (C) 2021 Theo Arends, translated by Nick Galfas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
en-GB.h - localization for English - United Kingdom for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
es-ES.h - localization for Spanish - Spain for Tasmota
Copyright (C) 2020 Adrian Scillato
Copyright (C) 2021 Adrian Scillato
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,6 +1,6 @@
/*
fr-FR.h - localization for French - France for Tasmota
Copyright (C) 2020 Olivier Francais
Copyright (C) 2021 Olivier Francais
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
@ -760,6 +760,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
he-HE.h - localization for Hebrew - Israel for Tasmota
Copyright (C) 2020 Yuval Mejahez
Copyright (C) 2021 Yuval Mejahez
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
hu-HU.h - localization for Hungarian in Hungary for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
it-IT.h - localization for Italian - Italy for Tasmota
Copyright (C) 2020 Gennaro Tortone - some mods by Antonio Fragola - Updated by bovirus - rev. 24.12.2020
Copyright (C) 2021 Gennaro Tortone - some mods by Antonio Fragola - Updated by bovirus - rev. 24.12.2020
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD - Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD - Reset"
#define D_SENSOR_RC522_RST "RC522 - Reset"
#define D_SENSOR_RC522_CS "RC522 - CS"
#define D_SENSOR_NRF24_CS "NRF24 - CS"
#define D_SENSOR_NRF24_DC "NRF24 - DC"
#define D_SENSOR_ILI9341_CS "ILI9341 - CS"
#define D_SENSOR_ILI9341_DC "ILI9341 - DC"
#define D_SENSOR_ILI9488_CS "ILI9488 - CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 - CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 - CS"
#define D_SENSOR_SSD1351_CS "SSD1351 - CS"
#define D_SENSOR_RA8876_CS "RA8876 - CS"
#define D_SENSOR_ST7789_CS "ST7789 - CS"
#define D_SENSOR_ST7789_DC "ST7789 - DC"
#define D_SENSOR_SSD1331_CS "SSD1331 - CS"
#define D_SENSOR_SSD1331_DC "SSD1331 - DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
ko-KO.h - localization for Korean - Korean for Tasmota
Copyright (C) 2020 Theo Arends (translated by NyaamZ)
Copyright (C) 2021 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
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
nl-NL.h - localization for Dutch - Nederland for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
pl-PL-d.h - localization for Polish with diacritics - Poland for Tasmota
Copyright (C) 2020 Theo Arends (translated by roblad - Robert L., upgraded by R. Turala)
Copyright (C) 2021 Theo Arends (translated by roblad - Robert L., upgraded by R. Turala)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
pt-BR.h - localization for Portuguese - Brazil for Tasmota
Copyright (C) 2020 Fabiano Bovo
Copyright (C) 2021 Fabiano Bovo
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
pt-PT.h - localization for Portuguese - Portugal for Tasmota
Copyright (C) 2020 Paulo Paiva
Copyright (C) 2021 Paulo Paiva
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
ro-RO.h - localization for Romanian - Romania and Moldova for Tasmota
Copyright (C) 2020 Augustin Marti
Copyright (C) 2021 Augustin Marti
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
ru-RU.h - localization for Russian - Rissia for Tasmota
Copyright (C) 2020 Theo Arends / roman-vn
Copyright (C) 2021 Theo Arends / roman-vn
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "А"

View File

@ -1,7 +1,7 @@
/*
sk-SK.h - localization for Slovak with diacritics - Slovak for Tasmota
Copyright (C) 2020 Vladimír Jendroľ
Copyright (C) 2021 Vladimír Jendroľ
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
sv-SE.h - localization for Swedish - Svenska for Tasmota
Copyright (C) 2020 Gunnar Norin
Copyright (C) 2021 Gunnar Norin
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
tr-TR.h - localization for Turkish - Turkey for Tasmota
Copyright (C) 2020 Ali Sait Teke and Theo Arends
Copyright (C) 2021 Ali Sait Teke and Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
uk-UA.h - localization for Ukrainian - Ukraine for Tasmota
Copyright (C) 2020 Theo Arends / vadym-adik
Copyright (C) 2021 Theo Arends / vadym-adik
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "А"

View File

@ -1,7 +1,7 @@
/*
vi-VN.h - localization for Vietnam for Tasmota
Copyright (C) 2020 translateb by Tâm.NT
Copyright (C) 2021 translateb by Tâm.NT
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
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "A"

View File

@ -1,7 +1,7 @@
/*
zh-CN.h - localization for Chinese (Simplified) - China for Tasmota
Copyright (C) 2020 Theo Arends (translated by killadm)
Copyright (C) 2021 Theo Arends (translated by killadm)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "安"

View File

@ -1,7 +1,7 @@
/*
zh-TW.h - localization for Chinese (Traditional) - Taiwan for Tasmota
Copyright (C) 2020 Theo Arends (translated by dannydu)
Copyright (C) 2021 Theo Arends (translated by dannydu)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -764,6 +764,20 @@
#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0"
#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset"
#define D_SENSOR_RC522_RST "RC522 Rst"
#define D_SENSOR_RC522_CS "RC522 CS"
#define D_SENSOR_NRF24_CS "NRF24 CS"
#define D_SENSOR_NRF24_DC "NRF24 DC"
#define D_SENSOR_ILI9341_CS "ILI9341 CS"
#define D_SENSOR_ILI9341_DC "ILI9341 DC"
#define D_SENSOR_ILI9488_CS "ILI9488 CS"
#define D_SENSOR_EPAPER29_CS "EPaper29 CS"
#define D_SENSOR_EPAPER42_CS "EPaper42 CS"
#define D_SENSOR_SSD1351_CS "SSD1351 CS"
#define D_SENSOR_RA8876_CS "RA8876 CS"
#define D_SENSOR_ST7789_CS "ST7789 CS"
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
// Units
#define D_UNIT_AMPERE "安培"

View File

@ -1,7 +1,7 @@
/*
my_user_config.h - user specific configuration for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -309,6 +309,7 @@
#define LIGHT_WHITE_BLEND_MODE false // [SetOption105] White Blend Mode - used to be `RGBWWTable` last value `0`, now deprecated in favor of this option
#define LIGHT_VIRTUAL_CT false // [SetOption106] Virtual CT - Creates a virtual White ColorTemp for RGBW lights
#define LIGHT_VIRTUAL_CT_CW false // [SetOption107] Virtual CT Channel - signals whether the hardware white is cold CW (true) or warm WW (false)
#define LIGHT_VIRTUAL_CT_POINTS 3 // Number of reference points for Virtual CT (min 2, default 3)
// -- Energy --------------------------------------
#define ENERGY_VOLTAGE_ALWAYS false // [SetOption21] Enable show voltage even if powered off
@ -340,6 +341,7 @@
// -- Localization --------------------------------
// If non selected the default en-GB will be used
//#define MY_LANGUAGE af_AF // Afrikaans in South Africa
//#define MY_LANGUAGE bg_BG // Bulgarian in Bulgaria
//#define MY_LANGUAGE cs_CZ // Czech in Czech
//#define MY_LANGUAGE de_DE // German in Germany
@ -415,6 +417,7 @@
#define WEB_PORT 80 // Web server Port for User and Admin mode
#define WEB_USERNAME "admin" // Web server Admin mode user name
// #define USE_JAVASCRIPT_ES6 // Enable ECMAScript6 syntax using less JavaScript code bytes (fails on IE11)
#define USE_ENHANCED_GUI_WIFI_SCAN // Enable wifi scan output with BSSID (+0k5 code)
// #define USE_WEBSEND_RESPONSE // Enable command WebSend response message (+1k code)
#define USE_EMULATION_HUE // Enable Hue Bridge emulation for Alexa (+14k code, +2k mem common)
#define USE_EMULATION_WEMO // Enable Belkin WeMo emulation for Alexa (+6k code, +2k mem common)
@ -492,6 +495,7 @@
#define USE_SONOFF_L1 // Add support for Sonoff L1 led control
#define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller (+0k3 code)
#define USE_LIGHT_PALETTE // Add support for color palette (+0k7 code)
#define USE_LIGHT_VIRTUAL_CT // Add support for Virtual White Color Temperature (+1.1k code)
#define USE_DGR_LIGHT_SEQUENCE // Add support for device group light sequencing (requires USE_DEVICE_GROUPS) (+0k2 code)
// -- Counter input -------------------------------
@ -622,8 +626,10 @@
// #define USE_DISPLAY_EPAPER_29 // [DisplayModel 5] Enable e-paper 2.9 inch display (+19k code)
// #define USE_DISPLAY_EPAPER_42 // [DisplayModel 6] Enable e-paper 4.2 inch display
// #define USE_DISPLAY_ILI9488 // [DisplayModel 8] [I2cDriver38] (Touch)
// #define USE_DISPLAY_SSD1351 // [DisplayModel 9]
// #define USE_DISPLAY_SSD1351 // [DisplayModel 9] Enable SSD1351 module
// #define USE_DISPLAY_RA8876 // [DisplayModel 10] [I2cDriver39] (Touch)
// #define USE_DISPLAY_ST7789 // [DisplayModel 12] Enable ST7789 module
// #define USE_DISPLAY_SSD1331 // [DisplayModel 14] Enable SSD1331 module
// #define USE_RC522 // Add support for MFRC522 13.56Mhz Rfid reader (+6k code)
// #define USE_RC522_DATA_FUNCTION // Add support for reading data block content (+0k4 code)
// #define USE_RC522_TYPE_INFORMATION // Add support for showing card type (+0k4 code)
@ -717,6 +723,10 @@
// -- IR Remote features - subset of IR protocols --------------------------
#define USE_IR_REMOTE // Send IR remote commands using library IRremoteESP8266 and ArduinoJson (+4k3 code, 0k3 mem, 48 iram)
#define IR_SEND_INVERTED false // Invert the output. (default = false) e.g. LED is illuminated when GPIO is LOW rather than HIGH.
// Setting inverted to something other than the default could easily destroy your IR LED if you are overdriving it.
// Unless you REALLY know what you are doing, don't change this.
#define IR_SEND_USE_MODULATION true // Do we do frequency modulation during transmission? i.e. If not, assume a 100% duty cycle.
#define USE_IR_SEND_NEC // Support IRsend NEC protocol
#define USE_IR_SEND_RC5 // Support IRsend Philips RC5 protocol
#define USE_IR_SEND_RC6 // Support IRsend Philips RC6 protocol
@ -725,6 +735,7 @@
#define IR_RCV_BUFFER_SIZE 100 // Max number of packets allowed in capture buffer (default 100 (*2 bytes ram))
#define IR_RCV_TIMEOUT 15 // Number of milli-Seconds of no-more-data before we consider a message ended (default 15)
#define IR_RCV_MIN_UNKNOWN_SIZE 6 // Set the smallest sized "UNKNOWN" message packets we actually care about (default 6, max 255)
#define IR_RCV_WHILE_SENDING 0 // Turns on receiver while sending messages, i.e. receive your own. This is unreliable and can cause IR timing issues
// -- Zigbee interface ----------------------------
//#define USE_ZIGBEE // Enable serial communication with Zigbee CC2530 flashed with ZNP (+49k code, +3k mem)

View File

@ -1,7 +1,7 @@
/*
settings.h - setting variables for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -143,8 +143,8 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t mi32_enable : 1; // bit 1 (v9.1.0.1) - SetOption115 - (ESP32 BLE) Enable ESP32 MI32 BLE (1)
uint32_t zb_disable_autoquery : 1; // bit 2 (v9.1.0.1) - SetOption116 - (Zigbee) Disable auto-query of zigbee lights and devices (1)
uint32_t fade_fixed_duration : 1; // bit 3 (v9.1.0.2) - SetOption117 - (Light) run fading at fixed duration instead of fixed slew rate
uint32_t spare04 : 1; // bit 4
uint32_t spare05 : 1; // bit 5
uint32_t zb_received_as_subtopic : 1; // bit 4 (v9.2.0.3) - SetOption118 - (Zigbee) Move ZbReceived form JSON message and into the subtopic replacing "SENSOR" default
uint32_t zb_omit_json_addr : 1; // bit 5 (v9.2.0.3) - SetOption119 - (Zigbee) Remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic
uint32_t spare06 : 1; // bit 6
uint32_t spare07 : 1; // bit 7
uint32_t spare08 : 1; // bit 8

View File

@ -1,7 +1,7 @@
/*
settings.ino - user settings for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
support.ino - support for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -111,6 +111,97 @@ String GetResetReason(void)
}
}
#ifdef ESP32
/*********************************************************************************************\
* ESP32 AutoMutex
\*********************************************************************************************/
//////////////////////////////////////////
// automutex.
// create a mute in your driver with:
// void *mutex = nullptr;
//
// then protect any function with
// TasAutoMutex m(&mutex, "somename");
// - mutex is automatically initialised if not already intialised.
// - it will be automagically released when the function is over.
// - the same thread can take multiple times (recursive).
// - advanced options m.give() and m.take() allow you fine control within a function.
// - if take=false at creat, it will not be initially taken.
// - name is used in serial log of mutex deadlock.
// - maxWait in ticks is how long it will wait before failing in a deadlock scenario (and then emitting on serial)
class TasAutoMutex {
SemaphoreHandle_t mutex;
bool taken;
int maxWait;
const char *name;
public:
TasAutoMutex(void ** mutex, const char *name = "", int maxWait = 40, bool take=true);
~TasAutoMutex();
void give();
void take();
static void init(void ** ptr);
};
//////////////////////////////////////////
TasAutoMutex::TasAutoMutex(void **mutex, const char *name, int maxWait, bool take) {
if (mutex) {
if (!(*mutex)){
TasAutoMutex::init(mutex);
}
this->mutex = (SemaphoreHandle_t)*mutex;
this->maxWait = maxWait;
this->name = name;
if (take) {
this->taken = xSemaphoreTakeRecursive(this->mutex, this->maxWait);
if (!this->taken){
Serial.printf("\r\nMutexfail %s\r\n", this->name);
}
}
} else {
this->mutex = (SemaphoreHandle_t)nullptr;
}
}
TasAutoMutex::~TasAutoMutex() {
if (this->mutex) {
if (this->taken) {
xSemaphoreGiveRecursive(this->mutex);
this->taken = false;
}
}
}
void TasAutoMutex::init(void ** ptr) {
SemaphoreHandle_t mutex = xSemaphoreCreateRecursiveMutex();
(*ptr) = (void *) mutex;
// needed, else for ESP8266 as we will initialis more than once in logging
// (*ptr) = (void *) 1;
}
void TasAutoMutex::give() {
if (this->mutex) {
if (this->taken) {
xSemaphoreGiveRecursive(this->mutex);
this->taken= false;
}
}
}
void TasAutoMutex::take() {
if (this->mutex) {
if (!this->taken) {
this->taken = xSemaphoreTakeRecursive(this->mutex, this->maxWait);
if (!this->taken){
Serial.printf("\r\nMutexfail %s\r\n", this->name);
}
}
}
}
#endif // ESP32
/*********************************************************************************************\
* Miscellaneous
\*********************************************************************************************/
@ -388,22 +479,25 @@ char* RemoveControlCharacter(char* p) {
return p;
}
char* ReplaceCommaWithDot(char* p) {
// Replace character ',' with '.'
char* ReplaceChar(char* p, char find, char replace) {
char* write = (char*)p;
char* read = (char*)p;
char ch = '.';
while (ch != '\0') {
ch = *read++;
if (ch == ',') {
ch = '.';
if (ch == find) {
ch = replace;
}
*write++ = ch;
}
return p;
}
char* ReplaceCommaWithDot(char* p) {
return ReplaceChar(p, ',', '.');
}
char* LowerCase(char* dest, const char* source)
{
char* write = dest;
@ -1227,7 +1321,7 @@ void DumpConvertTable(void) {
ResponseAppend_P(PSTR(","));
}
jsflg = true;
if ((ResponseAppend_P(PSTR("\"%d\":\"%d\""), i, data) > (LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(kGpioConvert) -1)) {
if ((ResponseAppend_P(PSTR("\"%d\":\"%d\""), i, data) > (MAX_LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(kGpioConvert) -1)) {
ResponseJsonEndEnd();
MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command);
jsflg = false;
@ -1242,7 +1336,7 @@ void DumpConvertTable(void) {
ResponseAppend_P(PSTR(","));
}
jsflg = true;
if ((ResponseAppend_P(PSTR("\"%d\":\"%d\""), i, data) > (LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(kAdcNiceList) -1)) {
if ((ResponseAppend_P(PSTR("\"%d\":\"%d\""), i, data) > (MAX_LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(kAdcNiceList) -1)) {
ResponseJsonEndEnd();
MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command);
jsflg = false;
@ -1301,6 +1395,17 @@ uint8_t ModuleNr(void)
return (USER_MODULE == Settings.module) ? 0 : Settings.module +1;
}
uint32_t ModuleTemplate(uint32_t module) {
uint32_t i = 0;
for (i = 0; i < sizeof(kModuleNiceList); i++) {
if (module == pgm_read_byte(kModuleNiceList + i)) {
break;
}
}
if (i == sizeof(kModuleNiceList)) { i = 0; }
return i;
}
bool ValidTemplateModule(uint32_t index)
{
for (uint32_t i = 0; i < sizeof(kModuleNiceList); i++) {
@ -1332,6 +1437,9 @@ String AnyModuleName(uint32_t index)
if (USER_MODULE == index) {
return String(SettingsText(SET_TEMPLATE_NAME));
} else {
#ifdef ESP32
index = ModuleTemplate(index);
#endif
char name[TOPSZ];
return String(GetTextIndexed(name, sizeof(name), index, kModuleNames));
}
@ -1396,7 +1504,7 @@ void TemplateGpios(myio *gp)
GetInternalTemplate(&src, Settings.module, 1);
#endif // ESP8266
#ifdef ESP32
memcpy_P(&src, &kModules.gp, sizeof(mycfgio));
memcpy_P(&src, &kModules[ModuleTemplate(Settings.module)].gp, sizeof(mycfgio));
#endif // ESP32
}
// 11 85 00 85 85 00 00 00 15 38 85 00 00 81
@ -1426,7 +1534,7 @@ gpio_flag ModuleFlag(void)
GetInternalTemplate(&flag, Settings.module, 2);
#endif // ESP8266
#ifdef ESP32
memcpy_P(&flag, &kModules.flag, sizeof(gpio_flag));
memcpy_P(&flag, &kModules[ModuleTemplate(Settings.module)].flag, sizeof(gpio_flag));
#endif // ESP32
}
@ -1437,13 +1545,18 @@ void ModuleDefault(uint32_t module)
{
if (USER_MODULE == module) { module = WEMOS; } // Generic
Settings.user_template_base = module;
#ifdef ESP32
module = ModuleTemplate(module);
#endif
char name[TOPSZ];
SettingsUpdateText(SET_TEMPLATE_NAME, GetTextIndexed(name, sizeof(name), module, kModuleNames));
#ifdef ESP8266
GetInternalTemplate(&Settings.user_template, module, 3);
#endif // ESP8266
#ifdef ESP32
memcpy_P(&Settings.user_template, &kModules, sizeof(mytmplt));
memcpy_P(&Settings.user_template, &kModules[module], sizeof(mytmplt));
#endif // ESP32
}
@ -1457,8 +1570,7 @@ bool FlashPin(uint32_t pin)
return (((pin > 5) && (pin < 9)) || (11 == pin));
}
uint32_t ValidPin(uint32_t pin, uint32_t gpio)
{
uint32_t ValidPin(uint32_t pin, uint32_t gpio) {
if (FlashPin(pin)) {
return GPIO_NONE; // Disable flash pins GPIO6, GPIO7, GPIO8 and GPIO11
}
@ -1473,8 +1585,7 @@ uint32_t ValidPin(uint32_t pin, uint32_t gpio)
return gpio;
}
bool ValidGPIO(uint32_t pin, uint32_t gpio)
{
bool ValidGPIO(uint32_t pin, uint32_t gpio) {
#ifdef ESP8266
#ifdef USE_ADC_VCC
if (ADC0_PIN == pin) { return false; } // ADC0 = GPIO17
@ -1483,6 +1594,16 @@ bool ValidGPIO(uint32_t pin, uint32_t gpio)
return (GPIO_USER == ValidPin(pin, BGPIO(gpio))); // Only allow GPIO_USER pins
}
bool ValidSpiPinUsed(uint32_t gpio) {
// ESP8266: If SPI pin selected chk if it's not one of the three Hardware SPI pins (12..14)
bool result = false;
if (PinUsed(gpio)) {
uint32_t pin = Pin(gpio);
result = ((pin < 12) || (pin > 14));
}
return result;
}
bool JsonTemplate(char* dataBuf)
{
// Old: {"NAME":"Shelly 2.5","GPIO":[56,0,17,0,21,83,0,0,6,82,5,22,156],"FLAG":2,"BASE":18}
@ -1936,8 +2057,15 @@ void SyslogAsync(bool refresh) {
}
bool NeedLogRefresh(uint32_t req_loglevel, uint32_t index) {
#ifdef ESP32
// this takes the mutex, and will be release when the class is destroyed -
// i.e. when the functon leaves You CAN call mutex.give() to leave early.
TasAutoMutex mutex(&TasmotaGlobal.log_buffer_mutex);
#endif // ESP32
// Skip initial buffer fill
if (strlen(TasmotaGlobal.log_buffer) < LOG_BUFFER_SIZE - LOGSZ) { return false; }
if (strlen(TasmotaGlobal.log_buffer) < LOG_BUFFER_SIZE - MAX_LOGSZ) { return false; }
char* line;
size_t len;
@ -1951,6 +2079,12 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l
if (TasmotaGlobal.uptime < 3) { return false; } // Allow time to setup correct log level
if (!req_loglevel || (index == TasmotaGlobal.log_buffer_pointer)) { return false; }
#ifdef ESP32
// this takes the mutex, and will be release when the class is destroyed -
// i.e. when the functon leaves You CAN call mutex.give() to leave early.
TasAutoMutex mutex(&TasmotaGlobal.log_buffer_mutex);
#endif // ESP32
if (!index) { // Dump all
index = TasmotaGlobal.log_buffer_pointer +1;
if (index > 255) { index = 1; }
@ -1989,6 +2123,13 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l
}
void AddLogData(uint32_t loglevel, const char* log_data) {
#ifdef ESP32
// this takes the mutex, and will be release when the class is destroyed -
// i.e. when the functon leaves You CAN call mutex.give() to leave early.
TasAutoMutex mutex(&TasmotaGlobal.log_buffer_mutex);
#endif // ESP32
char mxtime[14]; // "13:45:21.999 "
snprintf_P(mxtime, sizeof(mxtime), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d.%03d "), RtcTime.hour, RtcTime.minute, RtcTime.second, RtcMillis());
@ -2031,25 +2172,44 @@ void AddLogData(uint32_t loglevel, const char* log_data) {
void AddLog_P(uint32_t loglevel, PGM_P formatP, ...)
{
char log_data[LOGSZ];
char log_data[LOGSZ +4];
va_list arg;
va_start(arg, formatP);
vsnprintf_P(log_data, sizeof(log_data), formatP, arg);
uint32_t len = vsnprintf_P(log_data, LOGSZ +1, formatP, arg);
va_end(arg);
if (len > LOGSZ) { strcat(log_data, "..."); } // Actual data is more
#ifdef DEBUG_TASMOTA_CORE
// Profile max_len
static uint32_t max_len = 0;
if (len > max_len) {
max_len = len;
Serial.printf("PRF: AddLog_P %d\n", max_len);
}
#endif
AddLogData(loglevel, log_data);
}
void AddLog_Debug(PGM_P formatP, ...)
{
char log_data[LOGSZ];
char log_data[MAX_LOGSZ];
va_list arg;
va_start(arg, formatP);
vsnprintf_P(log_data, sizeof(log_data), formatP, arg);
uint32_t len = vsnprintf_P(log_data, sizeof(log_data), formatP, arg);
va_end(arg);
#ifdef DEBUG_TASMOTA_CORE
// Profile max_len
static uint32_t max_len = 0;
if (len > max_len) {
max_len = len;
Serial.printf("PRF: AddLog_Debug %d\n", max_len);
}
#endif
AddLogData(LOG_LEVEL_DEBUG, log_data);
}
@ -2070,13 +2230,13 @@ void AddLogMissed(const char *sensor, uint32_t misses)
}
void AddLogBufferSize(uint32_t loglevel, uint8_t *buffer, uint32_t count, uint32_t size) {
char log_data[LOGSZ];
char log_data[4 + (count * size * 3)];
snprintf_P(log_data, sizeof(log_data), PSTR("DMP:"));
for (uint32_t i = 0; i < count; i++) {
if (1 == size) { // uint8_t
if (1 == size) { // uint8_t
snprintf_P(log_data, sizeof(log_data), PSTR("%s %02X"), log_data, *(buffer));
} else { // uint16_t
} else { // uint16_t
snprintf_P(log_data, sizeof(log_data), PSTR("%s %02X%02X"), log_data, *(buffer +1), *(buffer));
}
buffer += size;
@ -2084,6 +2244,25 @@ void AddLogBufferSize(uint32_t loglevel, uint8_t *buffer, uint32_t count, uint32
AddLogData(loglevel, log_data);
}
void AddLogSpi(bool hardware, uint32_t clk, uint32_t mosi, uint32_t miso) {
// Needs optimization
uint32_t enabled = (hardware) ? TasmotaGlobal.spi_enabled : TasmotaGlobal.soft_spi_enabled;
switch(enabled) {
case SPI_MOSI:
AddLog_P(LOG_LEVEL_INFO, PSTR("SPI: %s using GPIO%02d(CLK) and GPIO%02d(MOSI)"),
(hardware) ? PSTR("Hardware") : PSTR("Software"), clk, mosi);
break;
case SPI_MISO:
AddLog_P(LOG_LEVEL_INFO, PSTR("SPI: %s using GPIO%02d(CLK) and GPIO%02d(MISO)"),
(hardware) ? PSTR("Hardware") : PSTR("Software"), clk, miso);
break;
case SPI_MOSI_MISO:
AddLog_P(LOG_LEVEL_INFO, PSTR("SPI: %s using GPIO%02d(CLK), GPIO%02d(MOSI) and GPIO%02d(MISO)"),
(hardware) ? PSTR("Hardware") : PSTR("Software"), clk, mosi, miso);
break;
}
}
/*********************************************************************************************\
* Uncompress static PROGMEM strings
\*********************************************************************************************/

View File

@ -1,7 +1,7 @@
/*
support_button.ino - button support for Tasmota
Copyright (C) 2020 Federico Leoni and Theo Arends
Copyright (C) 2021 Federico Leoni and Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
support_command.ino - command support for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -941,6 +941,11 @@ void CmndSetoption(void)
else if (4 == ptype) { // SetOption82 .. 113
bitWrite(Settings.flag4.data, pindex, XdrvMailbox.payload);
switch (pindex) {
#ifdef USE_LIGHT
case 0: // SetOption 82 - (Alexa) Reduced CT range for Alexa (1)
setAlexaCTRange();
break;
#endif
case 3: // SetOption85 - Enable Device Groups
case 6: // SetOption88 - PWM Dimmer Buttons control remote devices
case 15: // SetOption97 - Set Baud rate for TuyaMCU serial communication (0 = 9600 or 1 = 115200)
@ -1119,7 +1124,7 @@ void CmndModules(void)
}
jsflg = true;
uint32_t j = i ? midx +1 : 0;
if ((ResponseAppend_P(PSTR("\"%d\":\"%s\""), j, AnyModuleName(midx).c_str()) > (LOGSZ - TOPSZ)) || (i == sizeof(kModuleNiceList))) {
if ((ResponseAppend_P(PSTR("\"%d\":\"%s\""), j, AnyModuleName(midx).c_str()) > (MAX_LOGSZ - TOPSZ)) || (i == sizeof(kModuleNiceList))) {
ResponseJsonEndEnd();
MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command);
jsflg = false;
@ -1187,7 +1192,7 @@ void CmndGpio(void)
sensor_names = kSensorNamesFixed;
}
char stemp1[TOPSZ];
if ((ResponseAppend_P(PSTR("\"" D_CMND_GPIO "%d\":{\"%d\":\"%s%s\"}"), i, sensor_type, GetTextIndexed(stemp1, sizeof(stemp1), sensor_name_idx, sensor_names), sindex) > (LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(Settings.my_gp.io) -1)) {
if ((ResponseAppend_P(PSTR("\"" D_CMND_GPIO "%d\":{\"%d\":\"%s%s\"}"), i, sensor_type, GetTextIndexed(stemp1, sizeof(stemp1), sensor_name_idx, sensor_names), sindex) > (MAX_LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(Settings.my_gp.io) -1)) {
ResponseJsonEnd();
MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command);
jsflg2 = true;
@ -1222,7 +1227,7 @@ void ShowGpios(const uint16_t *NiceList, uint32_t size, uint32_t offset, uint32_
}
jsflg = true;
char stemp1[TOPSZ];
if ((ResponseAppend_P(PSTR("\"%d\":\"%s\""), ridx, GetTextIndexed(stemp1, sizeof(stemp1), midx, kSensorNames)) > (LOGSZ - TOPSZ)) || (i == size -1)) {
if ((ResponseAppend_P(PSTR("\"%d\":\"%s\""), ridx, GetTextIndexed(stemp1, sizeof(stemp1), midx, kSensorNames)) > (MAX_LOGSZ - TOPSZ)) || (i == size -1)) {
ResponseJsonEndEnd();
MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command);
jsflg = false;
@ -1284,12 +1289,14 @@ void CmndTemplate(void)
}
}
else {
if (JsonTemplate(XdrvMailbox.data)) { // Free 336 bytes StaticJsonBuffer stack space by moving code to function
#ifndef FIRMWARE_MINIMAL // if tasmota-minimal, `Template` is read-only
if (JsonTemplate(XdrvMailbox.data)) {
if (USER_MODULE == Settings.module) { TasmotaGlobal.restart_flag = 2; }
} else {
ResponseCmndChar_P(PSTR(D_JSON_INVALID_JSON));
error = true;
}
#endif // FIRMWARE_MINIMAL
}
if (!error) { TemplateJson(); }
}

View File

@ -1,7 +1,7 @@
/*
support_cores.ino - Arduino core support for Tasmota
Copyright (C) 2020 Theo Arends
Copyright (C) 2021 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
support_crash_recorder.ino - record the call stack in RTC in case of crash
Copyright (C) 2020 Stephan Hadinger, Theo Arends,
Copyright (C) 2021 Stephan Hadinger, Theo Arends,
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/*
support_device_groups.ino - device groups support for Tasmota
Copyright (C) 2020 Paul C Diem
Copyright (C) 2021 Paul C Diem
Device group allow multiple devices to be in a group with power, light
brightness, fade and speed settings and other module-specific settings
@ -423,7 +423,7 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de
write_log:
*log_ptr++ = 0;
AddLog_P(LOG_LEVEL_DEBUG_MORE, log_buffer);
AddLogData(LOG_LEVEL_DEBUG_MORE, log_buffer);
// If this is a received status request message, then if the requestor didn't just ack our
// previous full status update, send a full status update.

Some files were not shown because too many files have changed in this diff Show More