5.9.0 20171030
* Rewrite code (partly) using Google C++ Style Guide
(https://google.github.io/styleguide/cppguide.html)
* Rewrite code by using command lookup tables and javascript (client
side) web page expansions
* Change HTML/CSS to enable nicer form field entry
* Change default PWM assignments for H801 RGB(CW) led controller to
support optional Color/Dimmer control
*   GPIO04 (W2)    from GPIO_PWM2 to GPIO_USER to be user configurable
for GPIO_PWM5 (second White - Warm if W1 is Cold)
*   GPIO12 (Blue)  GPIO_PWM3 no change
*   GPIO13 (Green) from GPIO_PWM4 to GPIO_PWM2
*   GPIO14 (W1)    from GPIO_PWM1 to GPIO_USER to be user configurable
for GPIO_PWM4 (first White - Cold or Warm)
*   GPIO15 (Red)   from GPIO_PWM5 to GPIO_PWM1
* Change default PWM assignments for MagicHome RGB(W) led controller to
support optional Color/Dimmer control
*   GPIO05 (Green) from GPIO_PWM4 to GPIO_PWM2
*   GPIO12 (Blue)  from GPIO_PWM5 to GPIO_PWM3
*   GPIO13 (White) GPIO_USER to be user configurable for GPIO_PWM4
(White - Cold or Warm)
*   GPIO14 (Red)   from GPIO_PWM3 to GPIO_PWM1
* Change default PWM assignment for Witty Cloud to support optional
Color/Dimmer control (#976)
*   GPIO12 (Green) from GPIO_PWM4 to GPIO_PWM2
*   GPIO13 (Blue)  from GPIO_PWM5 to GPIO_PWM3
*   GPIO15 (Red)   from GPIO_PWM3 to GPIO_PWM1
* Change when another module is selected now all GPIO user configuration
is removed
* Change command name IRRemote to IRSend (#956)
* Remove Arduino IDE version too low warning as it interferes with
platformio.ini platform = espressif8266_stage
* Fix command FullTopic entry when using serial or console interface
* Fix possible UDP syslog blocking
* Fix minimum TelePeriod of 10 seconds set by web page
* Fix command GPIOx JSON response (#897)
* Fix inverted relay power on state (#909)
* Fix compile error when DOMOTICZ_UPDATE_TIMER is not defined (#930)
* Fix alignment of web page items in some browsers (#935)
* Fix setting all saved power settings to Off when SetOption0
(SaveState) = 0 (#955)
* Fix timezone range from -12/12 to -13/13 (#968)
* Fix Southern Hemisphere TIME_STD/TIME_DST (#968)
* Fix TLS MQTT SSL fingerprint test (#970, #808)
* Fix virtual relay status message used with Color/Dimmer control (#989)
* Fix command IRSend and IRHvac case sensitive parameter regression
introduced with version 5.8.0 (#993)
* Fix pressure calculation for some BMP versions regression introduced
with version 5.8.0i (#974)
* Fix Domoticz Dimmer set to same level not powering on (#945)
* Fix Blocked Loop when erasing large flash using command reset 2
(#1002)
* Fix relay power control when light power control is also configured as
regression from 5.8.0 (#1016)
* Fix Mqtt server mDNS lookup only when MqttHost name is empty (#1026)
* Add debug information to MQTT subscribe
* Add translations to I2Cscan
* Add translation to BH1750 unit lx
* Add light scheme options (Color cycle Up, Down, Random) and moving
WS2812 schemes up by 3
* Add Domoticz counter sensor to IrReceive representing Received IR
Protocol and Data
* Add option 0 to MqttHost to allow empty Mqtt host name
* Add support for Arilux AL-LC01 RGB Led controller (#370)
* Add esp8266 de-blocking to PubSubClient library (#790)
* Add Domoticz sensors for Voltage and Current (#903)
* Add platformio OTA upload support (#928, #934)
* Add warning to webpage when USE_MINIMAL is selected (#929)
* Add smoother movement of hour hand in WS2812 led clock (#936)
* Add support for Magic Home RGBW and some Arilux Led controllers (#940)
* Add command SetOption15 0 (default) for command PWM control or
SetOption15 1 for commands Color/Dimmer control to PWM RGB(CW) leds
(#941)
* Add Domoticz counter sensor to Sonoff Bridge representing Received RF
code (#943)
* Add support for Luani HVIO board
(https://luani.de/projekte/esp8266-hvio/) (#953)
* Add PWM initialization after restart (#955)
* Add IR Receiver support. Disable in user_config.h (#956)
* Add support for inverted PWM (#960)
* Add Sea level pressure calculation and Provide command Altitude (#974)
* Add support for up to 8 relays (#995)
* Add commands RfSync, RfLow, RfHigh, RfHost and RfCode to allow sending
custom RF codes (#1001)
* Add retain to ENERGY messages controlled by command SensorRetain
(#1013)
* Add commands Color2, Color3, Color4, Width2, Width3, Width4 and
SetOption16 to set Ws2812 Clock parameters (#1019)
* Add German language file (#1022)
* Add support for connecting to MQTT brokers without userid and/or
password (#1023)
* Add support for esp8266 core v2.4.0-rc2 (#1024)
* Add commands PwmRange 1,255..1023 and PwmFrequency 1,100..4000 (#1025)
* Add Polish language file (#1044, #1047)
* Add support for KMC 70011 Power Monitoring Smart Plug (#1045)
* Add support for VEML6070 I2C Ultra Violet level sensor (#1053)
* Add light turn Off Fade (#925)
* Add IrSend command option Panasonic as IrSend {"Protocol":"Panasonic",
"Bits":16388, "Data":<Panasonic data>}
*   where 16388 is 0x4004 hexadecimal (#1014)
* Add retry counter to DHT11/21/22 sensors (#1082)
This commit is contained in:
arendst 2017-10-30 15:43:39 +01:00
parent 1ef3ad6afa
commit e08d96acc2
36 changed files with 7280 additions and 4797 deletions

View File

@ -1,7 +1,7 @@
## Sonoff-Tasmota
Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE.
Current version is **5.8.0** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information.
Current version is **5.9.0** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information.
### ATTENTION All versions

View File

@ -13,10 +13,11 @@ src_dir = sonoff
; *** Uncomment one of the lines below to build/upload only one environment
;env_default = sonoff
;env_default = sonoff-NL
;env_default = sonoff-DE
;env_default = sonoff-PL
;env_default = sonoff-minimal
;env_default = sonoff-ds18x20
; *** Sonoff et al
[env:sonoff]
platform = espressif8266
framework = arduino
@ -39,7 +40,6 @@ monitor_baud = 115200
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
; *** Sonoff et al
[env:sonoff-NL]
platform = espressif8266
framework = arduino
@ -48,22 +48,23 @@ board_flash_mode = dout
build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DMY_LANGUAGE=nl-NL
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; *** Serial Monitor options
monitor_baud = 115200
[env:sonoff-DE]
platform = espressif8266
framework = arduino
board = esp01_1m
board_flash_mode = dout
build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DMY_LANGUAGE=de-DE
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; *** Upload Serial reset method for Wemos and NodeMCU
;upload_resetmethod = nodemcu
[env:sonoff-PL]
platform = espressif8266
framework = arduino
board = esp01_1m
board_flash_mode = dout
build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DMY_LANGUAGE=pl-PL
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
;extra_scripts = pio/sftp-uploader.py
; *** Upload file to OTA server using HTTP
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
; Sonoff minimal
[env:sonoff-minimal] ; Placeholder to be configured
[env:sonoff-minimal]
platform = espressif8266
framework = arduino
board = esp01_1m
@ -71,21 +72,6 @@ board_flash_mode = dout
build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DBE_MINIMAL
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; Serial Monitor options
monitor_baud = 115200
; *** Upload Serial reset method for Wemos and NodeMCU
;upload_resetmethod = nodemcu
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
;extra_scripts = pio/sftp-uploader.py
; *** Upload file to OTA server using HTTP
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
; Sonoff multiple DS18x20
[env:sonoff-ds18x20]
platform = espressif8266
framework = arduino
@ -93,17 +79,3 @@ board = esp01_1m
board_flash_mode = dout
build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=707 -DUSE_DS18x20 -DMESSZ=600
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON, OneWire
; Serial Monitor options
monitor_baud = 115200
; *** Upload Serial reset method for Wemos and NodeMCU
;upload_resetmethod = nodemcu
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
;extra_scripts = pio/sftp-uploader.py
; *** Upload file to OTA server using HTTP
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py

View File

@ -1,4 +1,80 @@
/* 5.8.0 20170918
/* 5.9.0 20171030
* Rewrite code (partly) using Google C++ Style Guide (https://google.github.io/styleguide/cppguide.html)
* Rewrite code by using command lookup tables and javascript (client side) web page expansions
* Change HTML/CSS to enable nicer form field entry
* Change default PWM assignments for H801 RGB(CW) led controller to support optional Color/Dimmer control
* GPIO04 (W2) from GPIO_PWM2 to GPIO_USER to be user configurable for GPIO_PWM5 (second White - Warm if W1 is Cold)
* GPIO12 (Blue) GPIO_PWM3 no change
* GPIO13 (Green) from GPIO_PWM4 to GPIO_PWM2
* GPIO14 (W1) from GPIO_PWM1 to GPIO_USER to be user configurable for GPIO_PWM4 (first White - Cold or Warm)
* GPIO15 (Red) from GPIO_PWM5 to GPIO_PWM1
* Change default PWM assignments for MagicHome RGB(W) led controller to support optional Color/Dimmer control
* GPIO05 (Green) from GPIO_PWM4 to GPIO_PWM2
* GPIO12 (Blue) from GPIO_PWM5 to GPIO_PWM3
* GPIO13 (White) GPIO_USER to be user configurable for GPIO_PWM4 (White - Cold or Warm)
* GPIO14 (Red) from GPIO_PWM3 to GPIO_PWM1
* Change default PWM assignment for Witty Cloud to support optional Color/Dimmer control (#976)
* GPIO12 (Green) from GPIO_PWM4 to GPIO_PWM2
* GPIO13 (Blue) from GPIO_PWM5 to GPIO_PWM3
* GPIO15 (Red) from GPIO_PWM3 to GPIO_PWM1
* Change when another module is selected now all GPIO user configuration is removed
* Change command name IRRemote to IRSend (#956)
* Remove Arduino IDE version too low warning as it interferes with platformio.ini platform = espressif8266_stage
* Fix command FullTopic entry when using serial or console interface
* Fix possible UDP syslog blocking
* Fix minimum TelePeriod of 10 seconds set by web page
* Fix command GPIOx JSON response (#897)
* Fix inverted relay power on state (#909)
* Fix compile error when DOMOTICZ_UPDATE_TIMER is not defined (#930)
* Fix alignment of web page items in some browsers (#935)
* Fix setting all saved power settings to Off when SetOption0 (SaveState) = 0 (#955)
* Fix timezone range from -12/12 to -13/13 (#968)
* Fix Southern Hemisphere TIME_STD/TIME_DST (#968)
* Fix TLS MQTT SSL fingerprint test (#970, #808)
* Fix virtual relay status message used with Color/Dimmer control (#989)
* Fix command IRSend and IRHvac case sensitive parameter regression introduced with version 5.8.0 (#993)
* Fix pressure calculation for some BMP versions regression introduced with version 5.8.0i (#974)
* Fix Domoticz Dimmer set to same level not powering on (#945)
* Fix Blocked Loop when erasing large flash using command reset 2 (#1002)
* Fix relay power control when light power control is also configured as regression from 5.8.0 (#1016)
* Fix Mqtt server mDNS lookup only when MqttHost name is empty (#1026)
* Add debug information to MQTT subscribe
* Add translations to I2Cscan
* Add translation to BH1750 unit lx
* Add light scheme options (Color cycle Up, Down, Random) and moving WS2812 schemes up by 3
* Add Domoticz counter sensor to IrReceive representing Received IR Protocol and Data
* Add option 0 to MqttHost to allow empty Mqtt host name
* Add support for Arilux AL-LC01 RGB Led controller (#370)
* Add esp8266 de-blocking to PubSubClient library (#790)
* Add Domoticz sensors for Voltage and Current (#903)
* Add platformio OTA upload support (#928, #934)
* Add warning to webpage when USE_MINIMAL is selected (#929)
* Add smoother movement of hour hand in WS2812 led clock (#936)
* Add support for Magic Home RGBW and some Arilux Led controllers (#940)
* Add command SetOption15 0 (default) for command PWM control or SetOption15 1 for commands Color/Dimmer control to PWM RGB(CW) leds (#941)
* Add Domoticz counter sensor to Sonoff Bridge representing Received RF code (#943)
* Add support for Luani HVIO board (https://luani.de/projekte/esp8266-hvio/) (#953)
* Add PWM initialization after restart (#955)
* Add IR Receiver support. Disable in user_config.h (#956)
* Add support for inverted PWM (#960)
* Add Sea level pressure calculation and Provide command Altitude (#974)
* Add support for up to 8 relays (#995)
* Add commands RfSync, RfLow, RfHigh, RfHost and RfCode to allow sending custom RF codes (#1001)
* Add retain to ENERGY messages controlled by command SensorRetain (#1013)
* Add commands Color2, Color3, Color4, Width2, Width3, Width4 and SetOption16 to set Ws2812 Clock parameters (#1019)
* Add German language file (#1022)
* Add support for connecting to MQTT brokers without userid and/or password (#1023)
* Add support for esp8266 core v2.4.0-rc2 (#1024)
* Add commands PwmRange 1,255..1023 and PwmFrequency 1,100..4000 (#1025)
* Add Polish language file (#1044, #1047)
* Add support for KMC 70011 Power Monitoring Smart Plug (#1045)
* Add support for VEML6070 I2C Ultra Violet level sensor (#1053)
* Add light turn Off Fade (#925)
* Add IrSend command option Panasonic as IrSend {"Protocol":"Panasonic", "Bits":16388, "Data":<Panasonic data>}
* where 16388 is 0x4004 hexadecimal (#1014)
* Add retry counter to DHT11/21/22 sensors (#1082)
*
* 5.8.0 20170918
* Remove the need for NeoPixelBus library for Hue support
* Consolidate WS2812 into Sonoff Led for flexible future led strip library changes
* Invert WS2812 fade speed to align with Sonoff led (Speed 1 = fast, Speed 8 = slow)
@ -934,7 +1010,7 @@
* Add reset 2 option erasing flash
* Add status 5 option displaying network info
* Add syslog check for Wifi connection
* Resize mqtt_publish log array
* Resize MqttPublish log array
* Change Wifi smartconfig active from 100 to 60 seconds
* Update Wifi initialization
*

View File

@ -17,6 +17,9 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _I18N_H_
#define _I18N_H_
#ifndef MY_LANGUAGE
#include "language/en-GB.h"
#else
@ -27,6 +30,56 @@
#endif
// Common
enum UnitNames {
UNIT_AMPERE,
UNIT_HOUR,
UNIT_KILOWATTHOUR,
UNIT_LUX,
UNIT_MICROSECOND,
UNIT_MILLIAMPERE,
UNIT_MILLISECOND,
UNIT_MINUTE,
UNIT_PRESSURE,
UNIT_SECOND,
UNIT_SECTORS,
UNIT_VOLT,
UNIT_WATT,
UNIT_WATTHOUR };
const char kUnitNames[] PROGMEM =
D_UNIT_AMPERE "|"
D_UNIT_HOUR "|"
D_UNIT_KILOWATTHOUR "|"
D_UNIT_LUX "|"
D_UNIT_MICROSECOND "|"
D_UNIT_MILLIAMPERE "|"
D_UNIT_MILLISECOND "|"
D_UNIT_MINUTE "|"
D_UNIT_PRESSURE "|"
D_UNIT_SECOND "|"
D_UNIT_SECTORS "|"
D_UNIT_VOLT "|"
D_UNIT_WATT "|"
D_UNIT_WATTHOUR ;
const char S_JSON_COMMAND_NVALUE_SPACE_UNIT[] PROGMEM = "{\"%s\":\"%d %s\"}";
const char S_JSON_COMMAND_SVALUE_SPACE_UNIT[] PROGMEM = "{\"%s\":\"%s %s\"}";
const char S_JSON_COMMAND_NVALUE_UNIT[] PROGMEM = "{\"%s\":\"%d%s\"}";
const char S_JSON_COMMAND_NVALUE_UNIT_NVALUE_UNIT[] PROGMEM = "{\"%s\":\"%d%s (%d%s)\"}";
const char S_JSON_COMMAND_NVALUE_SVALUE[] PROGMEM = "{\"%s\":\"%d (%s)\"}";
const char S_JSON_COMMAND_NVALUE_ACTIVE_NVALUE[] PROGMEM = "{\"%s\":\"%d (" D_ACTIVE " %d)\"}";
const char S_JSON_COMMAND_NVALUE[] PROGMEM = "{\"%s\":%d}";
const char S_JSON_COMMAND_SVALUE[] PROGMEM = "{\"%s\":\"%s\"}";
const char S_JSON_COMMAND_XVALUE[] PROGMEM = "{\"%s\":%s}"; // %s must provide quotes on non-number
const char S_JSON_COMMAND_INDEX_NVALUE[] PROGMEM = "{\"%s%d\":%d}";
const char S_JSON_COMMAND_INDEX_SVALUE[] PROGMEM = "{\"%s%d\":\"%s\"}";
const char S_JSON_COMMAND_INDEX_SVALUE_SVALUE[] PROGMEM = "{\"%s%d\":\"%s%s\"}";
const char JSON_SNS_TEMPHUM[] PROGMEM =
"%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s}";
const char S_LOG_HTTP[] PROGMEM = D_LOG_HTTP;
const char S_LOG_WIFI[] PROGMEM = D_LOG_WIFI;
const char S_LOG_MQTT[] PROGMEM = D_LOG_MQTT;
@ -38,29 +91,26 @@ const char S_OFFLINE[] PROGMEM = D_OFFLINE;
// sonoff.ino
#define MAX_BUTTON_COMMANDS 5 // Max number of button commands supported
const char commands[MAX_BUTTON_COMMANDS][14] PROGMEM = {
const char kCommands[MAX_BUTTON_COMMANDS][14] PROGMEM = {
D_CMND_WIFICONFIG " 1", // Press button three times
D_CMND_WIFICONFIG " 2", // Press button four times
D_CMND_WIFICONFIG " 3", // Press button five times
D_CMND_RESTART " 1", // Press button six times
D_CMND_UPGRADE " 1" }; // Press button seven times
const char wificfg[MAX_WIFI_OPTION][WCFG_MAX_STRING_LENGTH] PROGMEM = {
const char kWifiConfig[MAX_WIFI_OPTION][WCFG_MAX_STRING_LENGTH] PROGMEM = {
D_WCFG_0_RESTART,
D_WCFG_1_SMARTCONFIG,
D_WCFG_2_WIFIMANAGER,
D_WCFG_3_WPSCONFIG,
D_WCFG_4_RETRY,
D_WCFG_5_WAIT };
const char PREFIXES[3][PRFX_MAX_STRING_LENGTH] PROGMEM = {
const char kPrefixes[3][PRFX_MAX_STRING_LENGTH] PROGMEM = {
D_CMND,
D_STAT,
D_TELE };
const char JSON_SNS_TEMPHUM[] PROGMEM =
"%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s}";
// support.ino
static const char monthNames[] = D_MONTH3LIST;
static const char kMonthNames[] = D_MONTH3LIST;
// webserver.ino
const char S_MAIN_MENU[] PROGMEM = D_MAIN_MENU;
@ -78,3 +128,5 @@ const char S_FIRMWARE_UPGRADE[] PROGMEM = D_FIRMWARE_UPGRADE;
const char S_CONSOLE[] PROGMEM = D_CONSOLE;
const char S_INFORMATION[] PROGMEM = D_INFORMATION;
const char S_RESTART[] PROGMEM = D_RESTART;
#endif // _I18N_H_

691
sonoff/language/de-DE.h Normal file
View File

@ -0,0 +1,691 @@
/*
de-DE.h - localization for German - Germany for Sonoff-Tasmota
Copyright (C) 2017 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
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_DE_DE_H_
#define _LANGUAGE_DE_DE_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.
*
\*********************************************************************/
// "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 "SonMonDieMitDonFriSam"
#define D_MONTH3LIST "JanFebMaeAprMaiJunJulAugSepOktNovDez"
// Non JSON decimal separator
#define D_DECIMAL_SEPARATOR "."
// Common
#define D_ABORTED "abgebrochen"
#define D_ACTIVE "aktiv"
#define D_ADDRESS "Addresse"
#define D_ADMIN "Admin"
#define D_AIR_QUALITY "Ausschlagsqualität"
#define D_AIRQUALITY "AusschlagsQualität"
#define D_AP "AP" // Access Point
#define D_APMAC_ADDRESS "APMac"
#define D_APPENDED "angehängt"
#define D_AS "wie"
#define D_AUTO "AUTO"
#define D_BAUDRATE "Baudrate"
#define D_BLINK "Blinken"
#define D_BLINKOFF "BlinkenAus"
#define D_BOOTVERSION "Boot"
#define D_BOOT_COUNT "Boot-Zähler"
#define D_BOOTCOUNT "BootZähler"
#define D_BRIGHTLIGHT "hell"
#define D_BUILDDATETIME "BuildDatumUhrzeit"
#define D_BUTTON "Taste"
#define D_CELSIUS "Celsius"
#define D_CODE "code" // Button code
#define D_COLDLIGHT "kalt"
#define D_COMMAND "Befehl"
#define D_CONNECTED "verbunden"
#define D_COREVERSION "Kern"
#define D_COUNT "zählen"
#define D_COUNTER "Zähler"
#define D_CURRENT "Strom" // As in Voltage and Current
#define D_DATA "Daten"
#define D_DARKLIGHT "dunkel"
#define D_DEBUG "debug"
#define D_DISABLED "deaktiviert"
#define D_DNS_SERVER "DNS Server"
#define D_DNSSERVER "DNSServer"
#define D_DONE "erledigt"
#define D_DST_TIME "DST"
#define D_EMPTY "leer"
#define D_EMULATION "Emulierung"
#define D_ENABLED "aktiviert"
#define D_ENDDST "EndDST" // End Daylight Savings Time
#define D_ERASE "löschen"
#define D_ERROR "Fehler"
#define D_EVERY "alle"
#define D_FAHRENHEIT "Fahrenheit"
#define D_FAILED "fehlgeschlagen"
#define D_FALLBACK "Rückgriff"
#define D_FALLBACK_TOPIC "Rückgriff topic"
#define D_FALLBACKTOPIC "RückgriffTopic"
#define D_FALSE "falsch"
#define D_FILE "Datei"
#define D_FLASHMODE "FlashMode"
#define D_FLASHSIZE "FlashSize"
#define D_FREE_MEMORY "freier Speicher"
#define D_FREEMEMORY "frei"
#define D_FROM "von"
#define D_GATEWAY "Gateway"
#define D_GROUP "Gruppe"
#define D_HEAPSIZE "Heap-Größe"
#define D_HIGH "hoch"
#define D_HOST "host"
#define D_HOSTNAME "Hostname"
#define D_HUMIDITY "Feuchtigkeit"
#define D_ILLUMINANCE "Beleuchtungsintensität"
#define D_IMMEDIATE "direkt" // Button immediate
#define D_INDEX "Index"
#define D_INFO "Info"
#define D_INITIALIZED "initialisiert"
#define D_IP_ADDRESS "IP-Addresse"
#define D_LIGHT "Licht"
#define D_LOCAL_TIME "örtlich"
#define D_LOW "niedrig"
#define D_LWT "LWT"
#define D_MAC "Mac"
#define D_MASK "Maske"
#define D_MODULE "Modul"
#define D_MQTT "MQTT"
#define D_MULTI_PRESS "Mehrfachdruck"
#define D_NO "nein"
#define D_NOISE "Lautstärke"
#define D_NONE "keine"
#define D_OFF "aus"
#define D_OFFLINE "offline"
#define D_OK "OK"
#define D_ON "an"
#define D_ONLINE "online"
#define D_OR "oder"
#define D_PASSWORD "Passwort"
#define D_PERIOD "Punkt"
#define D_PORT "port"
#define D_POWER_FACTOR "Leistungsfaktor"
#define D_POWERFACTOR "Faktor"
#define D_POWERUSAGE "Leistung"
#define D_PRESSURE "Druck"
#define D_PRESSUREATSEALEVEL "MeeresDruck"
#define D_PROGRAM_FLASH_SIZE "Programm-Flash-Größe"
#define D_PROGRAMFLASHSIZE "ProgramFlashSize"
#define D_PROGRAM_SIZE "Programmgröße"
#define D_PROGRAMSIZE "ProgramSize"
#define D_PROJECT "Projekt"
#define D_RECEIVED "erhalten"
#define D_RESTART "Neustart"
#define D_RESTARTING "starte neu"
#define D_RESTART_REASON "Grund für Neustart"
#define D_RESTARTREASON "RestartReason"
#define D_RESTORE "wiederherstellen"
#define D_RETAINED "beibehalten"
#define D_SAVE "speichern"
#define D_SAVEADDRESS "SaveAddress"
#define D_SAVECOUNT "SaveCount"
#define D_SAVESTATE "SaveState"
#define D_SDKVERSION "SDK"
#define D_SELECTED "ausgewählt"
#define D_SENSOR "Sensor"
#define D_SERIAL "Serial"
#define D_BYTES "Bytes"
#define D_SSID "SSID"
#define D_START "Start"
#define D_STARTED "gestartet"
#define D_STARTDST "StartDST" // Start Daylight Savings Time
#define D_STD_TIME "STD"
#define D_STOP "stopp"
#define D_SUBNET_MASK "Subnetzmaske"
#define D_SUBNETMASK "Subnetmaske"
#define D_SUBSCRIBE_TO "subscribe to"
#define D_SUCCESSFUL "erfolgreich"
#define D_SWITCH "switch"
#define D_SYNC "sync"
#define D_SYS "sys" // Sys log
#define D_TEMPERATURE "Temperatur"
#define D_TEMPERATURE_UNIT "TempUnit"
#define D_TIME "Zeit"
#define D_TO "bis"
#define D_TODAY "heute"
#define D_TOGGLE "schalten"
#define D_TOPIC "topic"
#define D_TOTAL "Total"
#define D_TRANSMIT "Übertragen"
#define D_TRUE "wahr"
#define D_TYPE "Typ"
#define D_UNKNOWN "unbekannt"
#define D_UPGRADE "upgrade"
#define D_UPLOAD "upload"
#define D_UPTIME "Laufzeit"
#define D_USER "Benutzer"
#define D_UTC_TIME "UTC"
#define D_UV_LEVEL "UV Level"
#define D_VCC "VCC"
#define D_VERSION "Version"
#define D_VOLTAGE "Spannung"
#define D_WARMLIGHT "warm"
#define D_WEB "web" // Web log
#define D_WEB_SERVER "Web-Server"
#define D_WIFI "WLAN"
#define D_WRONG "falsch"
#define D_YESTERDAY "gestern"
// settings.ino
#define D_SAVED_TO_FLASH_AT "in flash gespeichert am"
#define D_LOADED_FROM_FLASH_AT "geladen aus flash am"
#define D_USE_DEFAULTS "Standard verwenden"
#define D_ERASED_SECTOR "gelöschter Sektor"
// sonoff.ino
#define D_LEVEL_10 "level 1-0"
#define D_LEVEL_01 "level 0-1"
#define D_SERIAL_LOGGING_DISABLED "serielles logging deaktiviert"
#define D_SYSLOG_LOGGING_REENABLED "syslog logging reaktiviert"
#define D_SET_BAUDRATE_TO "Baudrate eingestell auf"
#define D_RECEIVED_TOPIC "erhaltenes topic"
#define D_DATA_SIZE "Datengröße"
#define D_ANALOG_INPUT0 "Analog0"
#define D_FINGERPRINT "TLS-Fingerabdruck wird verifiziert..."
#define D_TLS_CONNECT_FAILED_TO "TLS-Verbindung fehlgeschlagen an"
#define D_RETRY_IN "Wiederversuch in"
#define D_VERIFIED "verifiziert"
#define D_INSECURE "unsichere Verbindung aufgrund ungültigen Fingerabdrucks"
#define D_CONNECT_FAILED_TO "Verbindung fehlgeschlagen aufgrund von"
// support.ino
#define D_OSWATCH "osWatch"
#define D_BLOCKED_LOOP "Blocked Loop"
#define D_WPS_FAILED_WITH_STATUS "WPSconfig fehlgeschlagen mit Status"
#define D_ACTIVE_FOR_1_MINUTE "aktiv für 1 Minute"
#define D_FAILED_TO_START "Starten fehlgeschlagen"
#define D_PATCH_ISSUE_2186 "Patch-Problem 2186"
#define D_CONNECTING_TO_AP "verbinden mit AP"
#define D_IN_MODE "in Modus"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Verbindung fehlgeschlagen da keine IP-Adresse erhalten wurde"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Verbindung fehlgeschlagen da AP nicht erreicht werden konnte"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Verbindung fehlgeschlagen mit AP falschem Passwort"
#define D_CONNECT_FAILED_AP_TIMEOUT "Verbindung fehlgeschlagen mit AP timeout"
#define D_ATTEMPTING_CONNECTION "Verbindungsversuch..."
#define D_CHECKING_CONNECTION "prüfe Verbindung..."
#define D_QUERY_DONE "Suchanfrage abgeschlossen. MQTT-Services gefunden"
#define D_MQTT_SERVICE_FOUND "MQTT-Service gefunden bei"
#define D_I2CSCAN_DEVICES_FOUND_AT "Gerät(e) gefunden bei"
#define D_FOUND_AT "gefunden bei"
#define D_I2CSCAN_UNKNOWN_ERROR_AT "unbekannter Fehler bei"
#define D_I2CSCAN_NO_DEVICES_FOUND "keine Geräte gefunden"
#define D_SYSLOG_HOST_NOT_FOUND "syslog host nicht gefunden"
// webserver.ino
#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMUM-Firmware - bitte upgraden"
#define D_WEBSERVER_ACTIVE_ON "Web-Server aktiv bei"
#define D_WITH_IP_ADDRESS "mit IP-Adresse"
#define D_WEBSERVER_STOPPED "Web-Server angehalten"
#define D_FILE_NOT_FOUND "Datei nicht gefunden"
#define D_REDIRECTED "umgeleitet zu captive portal"
#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "WLAN-Manager AccessPoint gesetzt und behält Station"
#define D_WIFIMANAGER_SET_ACCESSPOINT "WLAN-Manager AccessPoint gesetzt"
#define D_TRYING_TO_CONNECT "versuche Gerät mit Netzwerk zu verbinden"
#define D_RESTART_IN "Neustart in"
#define D_SECONDS "Sekunden"
#define D_DEVICE_WILL_RESTART "Gerät wird in wenigen Sekunden neu starten"
#define D_BUTTON_TOGGLE "schalten"
#define D_CONFIGURATION "Einstellungen"
#define D_INFORMATION "Informationen"
#define D_FIRMWARE_UPGRADE "Firmware-Upgrade"
#define D_CONSOLE "Konsole"
#define D_CONFIRM_RESTART "Neustart bestätigen"
#define D_CONFIGURE_MODULE "Modul konfigurieren"
#define D_CONFIGURE_WIFI "WLAN konfigurieren"
#define D_CONFIGURE_MQTT "MQTT konfigurieren"
#define D_CONFIGURE_DOMOTICZ "Domoticz konfigurieren"
#define D_CONFIGURE_LOGGING "Logging konfigurieren"
#define D_CONFIGURE_OTHER "Sonstige Konfiguration"
#define D_CONFIRM_RESET_CONFIGURATION "Zurücksetzen der Konfiguration bestätigen"
#define D_RESET_CONFIGURATION "Konfiguration zurücksetzen"
#define D_BACKUP_CONFIGURATION "Konfiguration sichern"
#define D_RESTORE_CONFIGURATION "Konfiguration wiederherstellen"
#define D_MAIN_MENU "Hauptmenü"
#define D_MODULE_PARAMETERS "Modul-Parameter"
#define D_MODULE_TYPE "Module-Typ"
#define D_GPIO "GPIO"
#define D_SERIAL_IN "serieller Eingang [serial in]"
#define D_SERIAL_OUT "serieller Ausgang [serial out]"
#define D_WIFI_PARAMETERS "WLAN-Parameter"
#define D_SCAN_FOR_WIFI_NETWORKS "Suche nach WLAN-Netzwerke"
#define D_SCAN_DONE "scan abgeschlossen"
#define D_NO_NETWORKS_FOUND "keine Netzwerke gefunden"
#define D_REFRESH_TO_SCAN_AGAIN "Aktualisieren um erneut zu suchen"
#define D_DUPLICATE_ACCESSPOINT "AccessPoint duplizieren"
#define D_SKIPPING_LOW_QUALITY "überspringe wegen niedriger Qualität"
#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 Password"
#define D_AP2_SSID "AP2 SSID"
#define D_AP2_PASSWORD "AP2 Password"
#define D_MQTT_PARAMETERS "MQTT-Parameter"
#define D_CLIENT "client"
#define D_FULL_TOPIC "full topic"
#define D_LOGGING_PARAMETERS "Logging-Parameter"
#define D_LOG_LEVEL "log 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 "andere Parameter"
#define D_WEB_ADMIN_PASSWORD "Web-Admin-Passwort"
#define D_MQTT_ENABLE "MQTT aktivieren"
#define D_FRIENDLY_NAME "Name [friendly name]"
#define D_BELKIN_WEMO "Belkin WeMo"
#define D_HUE_BRIDGE "Hue Bridge"
#define D_SINGLE_DEVICE "einzelnes Gerät"
#define D_MULTI_DEVICE "Mehrfachgerät"
#define D_SAVE_CONFIGURATION "Konfiguration speichern"
#define D_CONFIGURATION_SAVED "Konfiguration gespeichert"
#define D_CONFIGURATION_RESET "Konfiguration zurücksetzen"
#define D_PROGRAM_VERSION "Programmversion"
#define D_BUILD_DATE_AND_TIME "Build-Datum & -Uhrzeit"
#define D_CORE_AND_SDK_VERSION "Core-/SDK-Version"
#define D_FLASH_WRITE_COUNT "Flash-Schreibzähler"
#define D_MAC_ADDRESS "MAC-Adresse"
#define D_MQTT_HOST "MQTT host"
#define D_MQTT_PORT "MQTT port"
#define D_MQTT_CLIENT "MQTT client"
#define D_MQTT_USER "MQTT-Benutzer"
#define D_MQTT_TOPIC "MQTT topic"
#define D_MQTT_GROUP_TOPIC "MQTT group topic"
#define D_MQTT_FULL_TOPIC "MQTT full topic"
#define D_MDNS_DISCOVERY "mDNS-Ermittlung"
#define D_MDNS_ADVERTISE "mDNS-Bekanntmachung"
#define D_ESP_CHIP_ID "ESP Chip ID"
#define D_FLASH_CHIP_ID "Flash Chip ID"
#define D_FLASH_CHIP_SIZE "Flash-Größe"
#define D_FREE_PROGRAM_SPACE "freier Programmspeicherplatz"
#define D_UPGRADE_BY_WEBSERVER "Upgrade über Web-Server"
#define D_OTA_URL "OTA-URL"
#define D_START_UPGRADE "Upgrade starten"
#define D_UPGRADE_BY_FILE_UPLOAD "Upgrade per Datei-Upload"
#define D_UPLOAD_STARTED "Upload gestartet"
#define D_UPGRADE_STARTED "Upgrade gestartet"
#define D_UPLOAD_DONE "Upload abgeschlossen"
#define D_UPLOAD_ERR_1 "keine Datei ausgewählt"
#define D_UPLOAD_ERR_2 "ungenügend Speicherplatz"
#define D_UPLOAD_ERR_3 "magic byte ist nicht 0xE9"
#define D_UPLOAD_ERR_4 "Flash-Größe des Programmes ist größer als die reale Flash-Größe"
#define D_UPLOAD_ERR_5 "Upload-buffer-Vergleich weicht ab"
#define D_UPLOAD_ERR_6 "Upload fehlgeschlagen. Aktiviere logging 3"
#define D_UPLOAD_ERR_7 "Upload abgebrochen"
#define D_UPLOAD_ERR_8 "Datei ungültig"
#define D_UPLOAD_ERR_9 "Datei zu groß"
#define D_UPLOAD_ERROR_CODE "Upload-Fehler-Code"
#define D_ENTER_COMMAND "Befehl eingeben"
#define D_ENABLE_WEBLOG_FOR_RESPONSE "aktivere weblog 2 falls Reaktion erwartet"
#define D_NEED_USER_AND_PASSWORD "Benutzer benötigt=<Benutzername>&password=<Passwort>"
// xdrv_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 "Power,Energy"
#define D_DOMOTICZ_ILLUMINANCE "Illuminance"
#define D_DOMOTICZ_COUNT "Count"
#define D_DOMOTICZ_VOLTAGE "Voltage"
#define D_DOMOTICZ_CURRENT "Current"
#define D_DOMOTICZ_UPDATE_TIMER "Update timer"
// xdrv_ir-send.ino
#define D_INVALID_JSON "ungültiger JSON"
#define D_PROTOCOL_NOT_SUPPORTED "Protokoll nicht unterstützt"
#define D_IR_PROTOCOL "PROTOKOLL"
#define D_IR_BITS "BITS"
#define D_IR_DATA "DATEN"
#define D_IRHVAC_VENDOR "HERSTELLER"
#define D_IRHVAC_POWER "STROM"
#define D_IRHVAC_MODE "MODUS"
#define D_IRHVAC_FANSPEED "LÜFTERGESCHWINDIGKEIT"
#define D_IRHVAC_TEMP "TEMPERATUR"
#define D_IRRECEIVED "IrReceived"
// xdrv_snfbridge.ino
#define D_RFRECEIVED "RfReceived"
#define D_START_LEARNING "starte Anlernen"
#define D_SET_TO_DEFAULT "auf Standard zurücksetzen"
#define D_DEFAULT_SENT "Standard gesendet"
#define D_LEARNED_SENT "Anlernen gesendet"
#define D_LEARNING_ACTIVE "Anlernen aktiv"
#define D_LEARN_FAILED "Anlernen fehlgeschlagen"
#define D_LEARNED "angelernt"
#define D_SAVED "gespeichert"
// xdrv_wemohue.ino
#define D_MULTICAST_DISABLED "Multicast deaktiviert"
#define D_MULTICAST_REJOINED "Multicast (wieder-)verbunden"
#define D_MULTICAST_JOIN_FAILED "Multicast-Verbinden fehlgeschlagen"
#define D_FAILED_TO_SEND_RESPONSE "Antwort senden fehlgeschlagen"
#define D_WEMO "WeMo"
#define D_WEMO_BASIC_EVENT "WeMo basic event"
#define D_WEMO_EVENT_SERVICE "WeMo event service"
#define D_WEMO_SETUP "WeMo-Setup"
#define D_RESPONSE_SENT "Antwort gesendet"
#define D_HUE "Hue"
#define D_HUE_BRIDGE_SETUP "Hue-Setup"
#define D_HUE_API_NOT_IMPLEMENTED "Hue API nicht implementiert"
#define D_HUE_API "Hue API"
#define D_HUE_POST_ARGS "Hue POST args"
#define D_3_RESPONSE_PACKETS_SENT "3 Antwortpakete gesendet"
// xsns_dht.ino
#define D_TIMEOUT_WAITING_FOR "Timeout wartet auf"
#define D_START_SIGNAL_LOW "Startausschlag niedrig"
#define D_START_SIGNAL_HIGH "Startausschlag hoch"
#define D_PULSE "pulse"
#define D_CHECKSUM_FAILURE "Checksum-Fehler"
// xsns_ds18b20.ino
#define D_SENSOR_BUSY "Sensor beschäftigt"
#define D_SENSOR_CRC_ERROR "Sensor CRC-Fehler"
// xsns_hlw8012.ino
#define D_MAXPOWERREACHED "MaxPowerReached"
#define D_MAXPOWERREACHEDRETRY "MaxPowerReachedRetry"
#define D_POWERMONITOR "PowerMonitor"
#define D_ENERGYMONITOR "EnergyMonitor"
#define D_MAXENERGYREACHED "MaxEnergyReached"
#define D_ENERGY_TODAY "Energie heute"
#define D_ENERGY_YESTERDAY "Energie gestern"
#define D_ENERGY_TOTAL "Energie insgesamt"
// xsns_sht1x.ino
#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor hat ACK-Befehl nicht ausgeführt"
#define D_SHT1X_FOUND "SHT1X gefunden"
// sonoff_template.h
// Max string length is 8 characters including suffixes
#define D_SENSOR_NONE "None"
#define D_SENSOR_DHT11 "DHT11"
#define D_SENSOR_AM2301 "AM2301"
#define D_SENSOR_DHT22 "DHT22"
#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_IRSEND "IRsend"
#define D_SENSOR_SWITCH "Switch" // Suffix "1"
#define D_SENSOR_BUTTON "Button" // Suffix "1"
#define D_SENSOR_RELAY "Relay" // Suffix "1i"
#define D_SENSOR_LED "Led" // Suffix "1i"
#define D_SENSOR_PWM "PWM" // Suffix "1"
#define D_SENSOR_COUNTER "Counter" // Suffix "1"
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_SPI_CS "SPI CS"
#define D_SENSOR_SPI_DC "SPI DC"
#define D_SENSOR_BACKLIGHT "BLight"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_HOUR "h"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
#define D_UNIT_MICROSECOND "us"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLISECOND "ms"
#define D_UNIT_MINUTE "min"
#define D_UNIT_PRESSURE "hPa"
#define D_UNIT_SECOND "sec"
#define D_UNIT_SECTORS "Sektoren"
#define D_UNIT_VOLT "V"
#define D_UNIT_WATT "W"
#define D_UNIT_WATTHOUR "Wh"
// Log message prefix
#define D_LOG_APPLICATION "APP: "
#define D_LOG_BRIDGE "BRG: "
#define D_LOG_CONFIG "CFG: "
#define D_LOG_COMMAND "CMD: "
#define D_LOG_DHT "DHT: "
#define D_LOG_DOMOTICZ "DOM: "
#define D_LOG_DSB "DSB: "
#define D_LOG_HTTP "HTP: "
#define D_LOG_I2C "I2C: "
#define D_LOG_IRR "IRR: "
#define D_LOG_LOG "LOG: "
#define D_LOG_MODULE "MOD: "
#define D_LOG_MDNS "DNS: "
#define D_LOG_MQTT "MQT: "
#define D_LOG_OTHER "OTH: "
#define D_LOG_RESULT "RSL: "
#define D_LOG_SERIAL "SER: "
#define D_LOG_SHT1 "SHT: "
#define D_LOG_UPLOAD "UPL: "
#define D_LOG_UPNP "UPP: "
#define D_LOG_WIFI "WIF: "
// Result
#define D_RSLT_RESULT "ERGEBNIS"
#define D_RSLT_INFO "INFO"
#define D_RSLT_STATE "STATUS"
#define D_RSLT_SENSOR "SENSOR"
#define D_RSLT_UPTIME "LAUFZEIT"
#define D_RSLT_MARGINS "TOLERANZ"
#define D_RSLT_WARNING "WARNUNG"
#define D_RSLT_ENERGY "ENERGIE"
// Commands
#define D_CMND_MQTTHOST "MqttHost"
#define D_CMND_MQTTPORT "MqttPort"
#define D_CMND_MQTTRETRY "MqttRetry"
#define D_CMND_STATETEXT "StateText"
#define D_CMND_MQTTFINGERPRINT "MqttFingerprint"
#define D_CMND_MQTTCLIENT "MqttClient"
#define D_CMND_MQTTUSER "MqttUser"
#define D_CMND_MQTTPASSWORD "MqttPassword"
#define D_CMND_FULLTOPIC "FullTopic"
#define D_CMND_PREFIX "Prefix"
#define PRFX_MAX_STRING_LENGTH 5
#define D_CMND "cmnd"
#define D_STAT "stat"
#define D_TELE "tele"
#define D_CMND_GROUPTOPIC "GroupTopic"
#define D_CMND_TOPIC "Topic"
#define D_CMND_BUTTONTOPIC "ButtonTopic"
#define D_CMND_SWITCHTOPIC "SwitchTopic"
#define D_CMND_BUTTONRETAIN "ButtonRetain"
#define D_CMND_SWITCHRETAIN "SwitchRetain"
#define D_CMND_POWERRETAIN "PowerRetain"
#define D_CMND_SENSORRETAIN "SensorRetain"
#define D_CMND_BACKLOG "Backlog"
#define D_CMND_DELAY "Delay"
#define D_CMND_STATUS "Status"
#define D_STATUS1_PARAMETER "PRM"
#define D_STATUS2_FIRMWARE "FWR"
#define D_STATUS3_LOGGING "LOG"
#define D_STATUS4_MEMORY "MEM"
#define D_STATUS5_NETWORK "NET"
#define D_STATUS6_MQTT "MQT"
#define D_STATUS7_TIME "TIM"
#define D_STATUS8_POWER "PWR"
#define D_STATUS9_MARGIN "PTH"
#define D_STATUS10_SENSOR "SNS"
#define D_STATUS11_STATUS "STS"
#define D_CMND_POWER "Power"
#define D_RSLT_POWER "POWER"
#define D_CMND_POWERONSTATE "PowerOnState"
#define D_CMND_PULSETIME "PulseTime"
#define D_CMND_BLINKTIME "BlinkTime"
#define D_CMND_BLINKCOUNT "BlinkCount"
#define D_CMND_SAVEDATA "SaveData"
#define D_CMND_SETOPTION "SetOption"
#define D_CMND_TEMPERATURE_RESOLUTION "TempRes"
#define D_CMND_HUMIDITY_RESOLUTION "HumRes"
#define D_CMND_PRESSURE_RESOLUTION "PressRes"
#define D_CMND_POWER_RESOLUTION "WattRes"
#define D_CMND_VOLTAGE_RESOLUTION "VoltRes"
#define D_CMND_ENERGY_RESOLUTION "EnergyRes"
#define D_CMND_MODULE "Module"
#define D_CMND_MODULES "Modules"
#define D_CMND_GPIO "GPIO"
#define D_NOT_SUPPORTED "Not supported"
#define D_CMND_GPIOS "GPIOs"
#define D_CMND_PWM "PWM"
#define D_CMND_PWMFREQUENCY "PWMFrequency"
#define D_CMND_PWMRANGE "PWMRange"
#define D_CMND_COUNTER "Counter"
#define D_CMND_COUNTERTYPE "CounterType"
#define D_CMND_COUNTERDEBOUNCE "CounterDebounce"
#define D_CMND_SLEEP "Sleep"
#define D_CMND_UPLOAD "Upload"
#define D_CMND_UPGRADE "Upgrade"
#define D_ONE_OR_GT "1 or >%s to upgrade"
#define D_CMND_OTAURL "OtaUrl"
#define D_CMND_SERIALLOG "SerialLog"
#define D_CMND_SYSLOG "SysLog"
#define D_CMND_LOGHOST "LogHost"
#define D_CMND_LOGPORT "LogPort"
#define D_CMND_IPADDRESS "IPAddress"
#define D_CMND_NTPSERVER "NtpServer"
#define D_CMND_AP "Ap"
#define D_CMND_SSID "SSId"
#define D_CMND_PASSWORD "Password"
#define D_CMND_HOSTNAME "Hostname"
#define D_CMND_WIFICONFIG "WifiConfig"
#define WCFG_MAX_STRING_LENGTH 12
#define D_WCFG_0_RESTART "Restart"
#define D_WCFG_1_SMARTCONFIG "SmartConfig"
#define D_WCFG_2_WIFIMANAGER "WifiManager"
#define D_WCFG_3_WPSCONFIG "WPSConfig"
#define D_WCFG_4_RETRY "Retry"
#define D_WCFG_5_WAIT "Wait"
#define D_CMND_FRIENDLYNAME "FriendlyName"
#define D_CMND_SWITCHMODE "SwitchMode"
#define D_CMND_WEBSERVER "Webserver"
#define D_WEBSERVER_MODE "WebServerMode"
#define D_ACTIVE_FOR "Active for"
#define D_ON_DEVICE "on"
#define D_CMND_WEBPASSWORD "WebPassword"
#define D_CMND_WEBLOG "WebLog"
#define D_CMND_EMULATION "Emulation"
#define D_CMND_TELEPERIOD "TelePeriod"
#define D_CMND_RESTART "Restart"
#define D_ONE_TO_RESTART "1 to restart"
#define D_CMND_RESET "Reset"
#define D_RESET_AND_RESTARTING "Reset and Restarting"
#define D_ONE_TO_RESET "1 to reset"
#define D_CMND_TIMEZONE "Timezone"
#define D_CMND_ALTITUDE "Altitude"
#define D_CMND_LEDPOWER "LedPower"
#define D_CMND_LEDSTATE "LedState"
#define D_CMND_CFGDUMP "CfgDump"
#define D_CMND_I2CSCAN "I2CScan"
#define D_CMND_EXCEPTION "Exception"
// Commands xdrv_domoticz.ino
#define D_CMND_DOMOTICZ "Domoticz"
#define D_CMND_IDX "Idx"
#define D_CMND_KEYIDX "KeyIdx"
#define D_CMND_SWITCHIDX "SwitchIdx"
#define D_CMND_SENSORIDX "SensorIdx"
#define D_CMND_UPDATETIMER "UpdateTimer"
// Commands xdrv_ir_send.ino
#define D_CMND_IRSEND "IRSend"
#define D_CMND_IRHVAC "IRHVAC"
// Commands xdrv_snfbridge.ino
#define D_CMND_RFCODE "RfCode"
#define D_CMND_RFHIGH "RfHigh"
#define D_CMND_RFHOST "RfHost"
#define D_CMND_RFKEY "RfKey"
#define D_CMND_RFLOW "RfLow"
#define D_CMND_RFSYNC "RfSync"
// Commands xdrv_snfled.ino
#define D_CMND_COLOR "Color"
#define D_CMND_COLORTEMPERATURE "CT"
#define D_CMND_DIMMER "Dimmer"
#define D_CMND_LED "Led"
#define D_CMND_LEDTABLE "LedTable"
#define D_CMND_FADE "Fade"
#define D_CMND_PIXELS "Pixels"
#define D_CMND_SCHEME "Scheme"
#define D_CMND_SPEED "Speed"
#define D_CMND_WAKEUP "Wakeup"
#define D_CMND_WAKEUPDURATION "WakeUpDuration"
#define D_CMND_WIDTH "Width"
// Commands xsns_hlw8012.ino
#define D_CMND_POWERLOW "PowerLow"
#define D_CMND_POWERHIGH "PowerHigh"
#define D_CMND_VOLTAGELOW "VoltageLow"
#define D_CMND_VOLTAGEHIGH "VoltageHigh"
#define D_CMND_CURRENTLOW "CurrentLow"
#define D_CMND_CURRENTHIGH "CurrentHigh"
#define D_CMND_ENERGYRESET "EnergyReset"
#define D_CMND_HLWPCAL "HlwPcal"
#define D_CMND_HLWPSET "HlwPset"
#define D_CMND_HLWUCAL "HlwUcal"
#define D_CMND_HLWUSET "HlwUset"
#define D_CMND_HLWICAL "HlwIcal"
#define D_CMND_HLWISET "HlwIset"
#define D_CMND_MAXPOWER "MaxPower"
#define D_CMND_MAXPOWERHOLD "MaxPowerHold"
#define D_CMND_MAXPOWERWINDOW "MaxPowerWindow"
#define D_CMND_SAFEPOWER "SafePower"
#define D_CMND_SAFEPOWERHOLD "SafePowerHold"
#define D_CMND_SAFEPOWERWINDOW "SafePowerWindow"
#define D_CMND_MAXENERGY "MaxEnergy"
#define D_CMND_MAXENERGYSTART "MaxEnergyStart"
#endif // _LANGUAGE_DE_DE_H_

View File

@ -17,9 +17,13 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _LANGUAGE_EN_GB_H_
#define _LANGUAGE_EN_GB_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.
@ -134,6 +138,7 @@
#define D_POWERFACTOR "Factor"
#define D_POWERUSAGE "Power"
#define D_PRESSURE "Pressure"
#define D_PRESSUREATSEALEVEL "SeaPressure"
#define D_PROGRAM_FLASH_SIZE "Program Flash Size"
#define D_PROGRAMFLASHSIZE "ProgramFlashSize"
#define D_PROGRAM_SIZE "Program Size"
@ -163,6 +168,7 @@
#define D_STOP "Stop"
#define D_SUBNET_MASK "Subnet Mask"
#define D_SUBNETMASK "Subnetmask"
#define D_SUBSCRIBE_TO "Subscribe to"
#define D_SUCCESSFUL "Successful"
#define D_SWITCH "Switch"
#define D_SYNC "Sync"
@ -182,8 +188,9 @@
#define D_UPGRADE "upgrade"
#define D_UPLOAD "Upload"
#define D_UPTIME "Uptime"
#define D_UTC_TIME "UTC"
#define D_USER "User"
#define D_UTC_TIME "UTC"
#define D_UV_LEVEL "UV Level"
#define D_VCC "Vcc"
#define D_VERSION "Version"
#define D_VOLTAGE "Voltage"
@ -242,6 +249,7 @@
#define D_SYSLOG_HOST_NOT_FOUND "Syslog Host not found"
// webserver.ino
#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware - please upgrade"
#define D_WEBSERVER_ACTIVE_ON "Web server active on"
#define D_WITH_IP_ADDRESS "with IP address"
#define D_WEBSERVER_STOPPED "Web server stopped"
@ -366,27 +374,28 @@
#define D_DOMOTICZ_KEY_IDX "Key idx"
#define D_DOMOTICZ_SWITCH_IDX "Switch idx"
#define D_DOMOTICZ_SENSOR_IDX "Sensor idx"
#define DOMOTICZ_SENSORS_MAX_STRING_LENGTH 14
#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 "Power,Energy"
#define D_DOMOTICZ_ILLUMINANCE "Illuminance"
#define D_DOMOTICZ_COUNT "Count"
#define D_DOMOTICZ_VOLTAGE "Voltage"
#define D_DOMOTICZ_CURRENT "Current"
#define D_DOMOTICZ_UPDATE_TIMER "Update timer"
#define D_CONFIGURE_DOMOTICZ "Configure Domoticz"
// xdrv_ir-send.ino
#define D_INVALID_JSON "Invalid JSON"
#define D_PROTOCOL_NOT_SUPPORTED "Protocol not supported"
#define D_IRSEND_PROTOCOL "PROTOCOL"
#define D_IRSEND_BITS "BITS"
#define D_IRSEND_DATA "DATA"
#define D_IR_PROTOCOL "PROTOCOL"
#define D_IR_BITS "BITS"
#define D_IR_DATA "DATA"
#define D_IRHVAC_VENDOR "VENDOR"
#define D_IRHVAC_POWER "POWER"
#define D_IRHVAC_MODE "MODE"
#define D_IRHVAC_FANSPEED "FANSPEED"
#define D_IRHVAC_TEMP "TEMP"
#define D_IRRECEIVED "IrReceived"
// xdrv_snfbridge.ino
#define D_RFRECEIVED "RfReceived"
@ -397,6 +406,7 @@
#define D_LEARNING_ACTIVE "Learning active"
#define D_LEARN_FAILED "Learn failed"
#define D_LEARNED "Learned"
#define D_SAVED "Saved"
// xdrv_wemohue.ino
#define D_MULTICAST_DISABLED "Multicast disabled"
@ -452,18 +462,23 @@
#define D_SENSOR_I2C_SCL "I2C SCL"
#define D_SENSOR_I2C_SDA "I2C SDA"
#define D_SENSOR_WS2812 "WS2812"
#define D_SENSOR_IRREMOTE "IRremote"
#define D_SENSOR_IRSEND "IRsend"
#define D_SENSOR_SWITCH "Switch" // Suffix "1"
#define D_SENSOR_BUTTON "Button" // Suffix "1"
#define D_SENSOR_RELAY "Relay" // Suffix "1I"
#define D_SENSOR_LED "Led" // Suffix "1I"
#define D_SENSOR_RELAY "Relay" // Suffix "1i"
#define D_SENSOR_LED "Led" // Suffix "1i"
#define D_SENSOR_PWM "PWM" // Suffix "1"
#define D_SENSOR_COUNTER "Counter" // Suffix "1"
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_SPI_CS "SPI CS"
#define D_SENSOR_SPI_DC "SPI DC"
#define D_SENSOR_BACKLIGHT "BLight"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_HOUR "Hr"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
#define D_UNIT_MICROSECOND "us"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLISECOND "ms"
@ -485,17 +500,18 @@
#define D_LOG_DSB "DSB: "
#define D_LOG_HTTP "HTP: "
#define D_LOG_I2C "I2C: "
#define D_LOG_IRR "IRR: "
#define D_LOG_LOG "LOG: "
#define D_LOG_MODULE "MOD: "
#define D_LOG_MDNS "DNS: "
#define D_LOG_MQTT "MQT: "
#define D_LOG_OTHER "OTH: "
#define D_LOG_RESULT "RSL: "
#define D_LOG_SERIAL "SER: "
#define D_LOG_SHT1 "SHT: "
#define D_LOG_UPLOAD "UPL: "
#define D_LOG_UPNP "UPP: "
#define D_LOG_WIFI "WIF: "
#define D_LOG_SERIAL "SER: "
// Result
#define D_RSLT_RESULT "RESULT"
@ -564,6 +580,8 @@
#define D_NOT_SUPPORTED "Not supported"
#define D_CMND_GPIOS "GPIOs"
#define D_CMND_PWM "PWM"
#define D_CMND_PWMFREQUENCY "PWMFrequency"
#define D_CMND_PWMRANGE "PWMRange"
#define D_CMND_COUNTER "Counter"
#define D_CMND_COUNTERTYPE "CounterType"
#define D_CMND_COUNTERDEBOUNCE "CounterDebounce"
@ -606,6 +624,7 @@
#define D_RESET_AND_RESTARTING "Reset and Restarting"
#define D_ONE_TO_RESET "1 to reset"
#define D_CMND_TIMEZONE "Timezone"
#define D_CMND_ALTITUDE "Altitude"
#define D_CMND_LEDPOWER "LedPower"
#define D_CMND_LEDSTATE "LedState"
#define D_CMND_CFGDUMP "CfgDump"
@ -625,24 +644,26 @@
#define D_CMND_IRHVAC "IRHVAC"
// Commands xdrv_snfbridge.ino
#define D_CMND_RFCODE "RfCode"
#define D_CMND_RFHIGH "RfHigh"
#define D_CMND_RFHOST "RfHost"
#define D_CMND_RFKEY "RfKey"
#define D_CMND_RFDEFAULT "RfDefault"
#define D_CMND_RFLOW "RfLow"
#define D_CMND_RFSYNC "RfSync"
// Commands xdrv_snfled.ino
#define D_CMND_COLOR "Color"
#define D_CMND_COLORTEMPERATURE "CT"
#define D_CMND_DIMMER "Dimmer"
#define D_CMND_LED "Led"
#define D_CMND_LEDTABLE "LedTable"
#define D_CMND_FADE "Fade"
#define D_CMND_SPEED "Speed"
#define D_CMND_WAKEUPDURATION "WakeUpDuration"
#define D_CMND_WAKEUP "Wakeup"
// Commands xdrv_ws2812.ino
#define D_CMND_PIXELS "Pixels"
#define D_CMND_LED "Led"
#define D_CMND_WIDTH "Width"
#define D_CMND_SCHEME "Scheme"
#define D_CMND_SPEED "Speed"
#define D_CMND_WAKEUP "Wakeup"
#define D_CMND_WAKEUPDURATION "WakeUpDuration"
#define D_CMND_WIDTH "Width"
// Commands xsns_hlw8012.ino
#define D_CMND_POWERLOW "PowerLow"
@ -666,3 +687,5 @@
#define D_CMND_SAFEPOWERWINDOW "SafePowerWindow"
#define D_CMND_MAXENERGY "MaxEnergy"
#define D_CMND_MAXENERGYSTART "MaxEnergyStart"
#endif // _LANGUAGE_EN_GB_H_

View File

@ -17,9 +17,13 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _LANGUAGE_NL_NL_H_
#define _LANGUAGE_NL_NL_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.
@ -134,6 +138,7 @@
#define D_POWERFACTOR "Factor"
#define D_POWERUSAGE "Vermogen"
#define D_PRESSURE "Luchtdruk"
#define D_PRESSUREATSEALEVEL "ZeeLuchtdruk"
#define D_PROGRAM_FLASH_SIZE "Programma Flash Grootte"
#define D_PROGRAMFLASHSIZE "ProgrammaFlashGrootte"
#define D_PROGRAM_SIZE "Programma Grootte"
@ -163,6 +168,7 @@
#define D_STOP "Stop"
#define D_SUBNET_MASK "Subnet Masker"
#define D_SUBNETMASK "Subnetmasker"
#define D_SUBSCRIBE_TO "Abonneer op"
#define D_SUCCESSFUL "Gelukt"
#define D_SWITCH "Schakelaar"
#define D_SYNC "Sync"
@ -182,8 +188,9 @@
#define D_UPGRADE "opwaarderen"
#define D_UPLOAD "Verzenden"
#define D_UPTIME "Bedrijfstijd"
#define D_UTC_TIME "UTC"
#define D_USER "Gebruiker"
#define D_UTC_TIME "UTC"
#define D_UV_LEVEL "UV niveau"
#define D_VCC "Vcc"
#define D_VERSION "Versie"
#define D_VOLTAGE "Spanning"
@ -242,6 +249,7 @@
#define D_SYSLOG_HOST_NOT_FOUND "Syslog Host niet gevonden"
// webserver.ino
#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware - opwaarderen"
#define D_WEBSERVER_ACTIVE_ON "Webserver actief op"
#define D_WITH_IP_ADDRESS "met IP adres"
#define D_WEBSERVER_STOPPED "Webserver gestopt"
@ -336,7 +344,7 @@
#define D_ESP_CHIP_ID "ESP Chip Id"
#define D_FLASH_CHIP_ID "Flash Chip Id"
#define D_FLASH_CHIP_SIZE "Flash Grootte"
#define D_FREE_PROGRAM_SPACE "Vrij programma ruimte"
#define D_FREE_PROGRAM_SPACE "Programma ruimte over"
#define D_UPGRADE_BY_WEBSERVER "Opwaarderen dmv webserver"
#define D_OTA_URL "OTA Url"
@ -366,27 +374,28 @@
#define D_DOMOTICZ_KEY_IDX "Toets idx"
#define D_DOMOTICZ_SWITCH_IDX "Schakelaar idx"
#define D_DOMOTICZ_SENSOR_IDX "Sensor idx"
#define DOMOTICZ_SENSORS_MAX_STRING_LENGTH 14
#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 "Power,Energy"
#define D_DOMOTICZ_ILLUMINANCE "Illuminance"
#define D_DOMOTICZ_COUNT "Count"
#define D_DOMOTICZ_VOLTAGE "Spanning"
#define D_DOMOTICZ_CURRENT "Stroom"
#define D_DOMOTICZ_UPDATE_TIMER "Bijwerk timer"
#define D_CONFIGURE_DOMOTICZ "Configureer Domoticz"
// xdrv_ir-send.ino
#define D_INVALID_JSON "Ongeldig JSON"
#define D_PROTOCOL_NOT_SUPPORTED "Protocol wordt niet ondersteund"
#define D_IRSEND_PROTOCOL "PROTOCOL"
#define D_IRSEND_BITS "BITS"
#define D_IRSEND_DATA "DATA"
#define D_IR_PROTOCOL "PROTOCOL"
#define D_IR_BITS "BITS"
#define D_IR_DATA "DATA"
#define D_IRHVAC_VENDOR "VENDOR"
#define D_IRHVAC_POWER "POWER"
#define D_IRHVAC_MODE "MODE"
#define D_IRHVAC_FANSPEED "FANSPEED"
#define D_IRHVAC_TEMP "TEMP"
#define D_IRRECEIVED "IrReceived"
// xdrv_snfbridge.ino
#define D_RFRECEIVED "RfReceived"
@ -397,6 +406,7 @@
#define D_LEARNING_ACTIVE "Leren actief"
#define D_LEARN_FAILED "Leren mislukt"
#define D_LEARNED "Geleerd"
#define D_SAVED "Opgeslagen"
// xdrv_wemohue.ino
#define D_MULTICAST_DISABLED "Multicast uitgeschakeld"
@ -452,18 +462,23 @@
#define D_SENSOR_I2C_SCL "I2C SCL"
#define D_SENSOR_I2C_SDA "I2C SDA"
#define D_SENSOR_WS2812 "WS2812"
#define D_SENSOR_IRREMOTE "IRremote"
#define D_SENSOR_IRSEND "IRsend"
#define D_SENSOR_SWITCH "Switch" // Suffix "1"
#define D_SENSOR_BUTTON "Button" // Suffix "1"
#define D_SENSOR_RELAY "Relais" // Suffix "1I"
#define D_SENSOR_LED "Led" // Suffix "1I"
#define D_SENSOR_RELAY "Relais" // Suffix "1i"
#define D_SENSOR_LED "Led" // Suffix "1i"
#define D_SENSOR_PWM "PWM" // Suffix "1"
#define D_SENSOR_COUNTER "Teller" // Suffix "1"
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_SPI_CS "SPI CS"
#define D_SENSOR_SPI_DC "SPI DC"
#define D_SENSOR_BACKLIGHT "BLight"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_HOUR "Hr"
#define D_UNIT_HOUR "h"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
#define D_UNIT_MICROSECOND "us"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLISECOND "ms"
@ -485,17 +500,18 @@
#define D_LOG_DSB "DSB: "
#define D_LOG_HTTP "HTP: "
#define D_LOG_I2C "I2C: "
#define D_LOG_IRR "IRR: "
#define D_LOG_LOG "LOG: "
#define D_LOG_MODULE "MOD: "
#define D_LOG_MDNS "DNS: "
#define D_LOG_MQTT "MQT: "
#define D_LOG_OTHER "OTH: "
#define D_LOG_RESULT "RSL: "
#define D_LOG_SERIAL "SER: "
#define D_LOG_SHT1 "SHT: "
#define D_LOG_UPLOAD "UPL: "
#define D_LOG_UPNP "UPP: "
#define D_LOG_WIFI "WIF: "
#define D_LOG_SERIAL "SER: "
// Result
#define D_RSLT_RESULT "RESULTAAT"
@ -564,6 +580,8 @@
#define D_NOT_SUPPORTED "Not supported"
#define D_CMND_GPIOS "GPIOs"
#define D_CMND_PWM "PWM"
#define D_CMND_PWMFREQUENCY "PWMFrequency"
#define D_CMND_PWMRANGE "PWMRange"
#define D_CMND_COUNTER "Counter"
#define D_CMND_COUNTERTYPE "CounterType"
#define D_CMND_COUNTERDEBOUNCE "CounterDebounce"
@ -606,6 +624,7 @@
#define D_RESET_AND_RESTARTING "Reset en herstarten"
#define D_ONE_TO_RESET "1 voor reset"
#define D_CMND_TIMEZONE "Timezone"
#define D_CMND_ALTITUDE "Altitude"
#define D_CMND_LEDPOWER "LedPower"
#define D_CMND_LEDSTATE "LedState"
#define D_CMND_CFGDUMP "CfgDump"
@ -625,24 +644,26 @@
#define D_CMND_IRHVAC "IRHVAC"
// Commands xdrv_snfbridge.ino
#define D_CMND_RFCODE "RfCode"
#define D_CMND_RFHIGH "RfHigh"
#define D_CMND_RFHOST "RfHost"
#define D_CMND_RFKEY "RfKey"
#define D_CMND_RFDEFAULT "RfDefault"
#define D_CMND_RFLOW "RfLow"
#define D_CMND_RFSYNC "RfSync"
// Commands xdrv_snfled.ino
#define D_CMND_COLOR "Color"
#define D_CMND_COLORTEMPERATURE "CT"
#define D_CMND_DIMMER "Dimmer"
#define D_CMND_LED "Led"
#define D_CMND_LEDTABLE "LedTable"
#define D_CMND_FADE "Fade"
#define D_CMND_SPEED "Speed"
#define D_CMND_WAKEUPDURATION "WakeUpDuration"
#define D_CMND_WAKEUP "Wakeup"
// Commands xdrv_ws2812.ino
#define D_CMND_PIXELS "Pixels"
#define D_CMND_LED "Led"
#define D_CMND_WIDTH "Width"
#define D_CMND_SCHEME "Scheme"
#define D_CMND_SPEED "Speed"
#define D_CMND_WAKEUP "Wakeup"
#define D_CMND_WAKEUPDURATION "WakeUpDuration"
#define D_CMND_WIDTH "Width"
// Commands xsns_hlw8012.ino
#define D_CMND_POWERLOW "PowerLow"
@ -666,3 +687,5 @@
#define D_CMND_SAFEPOWERWINDOW "SafePowerWindow"
#define D_CMND_MAXENERGY "MaxEnergy"
#define D_CMND_MAXENERGYSTART "MaxEnergyStart"
#endif // _LANGUAGE_NL_NL_H_

691
sonoff/language/pl-PL.h Normal file
View File

@ -0,0 +1,691 @@
/*
pl-PL.h - localization for Polish without fonetick - Poland for Sonoff-Tasmota
Copyright (C) 2017 Theo Arends (translated by roblad - Robert L.)
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_PL_PL_H_
#define _LANGUAGE_PL_PL_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.
*
\*********************************************************************/
// "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 "PonWtoSroCzwPiaSobNie"
#define D_MONTH3LIST "StyLutMarKwiMajCzeLipSieWrzPazLisGru"
// Non JSON decimal separator
#define D_DECIMAL_SEPARATOR ","
// Common
#define D_ABORTED "Anulowany"
#define D_ACTIVE "Aktywny"
#define D_ADDRESS "Adres"
#define D_ADMIN "Admin"
#define D_AIR_QUALITY "Jakosc powietrza"
#define D_AIRQUALITY "JakPowietrza"
#define D_AP "AP" // Access Point
#define D_APMAC_ADDRESS "APMac"
#define D_APPENDED "Dolaczony"
#define D_AS "jak"
#define D_AUTO "AUTO"
#define D_BAUDRATE "Szybkosc transmisji"
#define D_BLINK "Miganie"
#define D_BLINKOFF "MiganieWyl"
#define D_BOOTVERSION "Uruchomienie"
#define D_BOOT_COUNT "Licznik uruchomienia"
#define D_BOOTCOUNT "LiczUruchomienia"
#define D_BRIGHTLIGHT "Jasny"
#define D_BUILDDATETIME "ZbudowanoDataCzas"
#define D_BUTTON "Przycisk"
#define D_CELSIUS "Celsiusza"
#define D_CODE "kod" // Button code
#define D_COLDLIGHT "Zimny"
#define D_COMMAND "Komenda"
#define D_CONNECTED "Polaczony"
#define D_COREVERSION "Wersja"
#define D_COUNT "Licz"
#define D_COUNTER "Licznik"
#define D_CURRENT "Biezacy" // As in Voltage and Current
#define D_DATA "Data"
#define D_DARKLIGHT "Ciemny"
#define D_DEBUG "Debug"
#define D_DISABLED "Zablokowany"
#define D_DNS_SERVER "Server DNS"
#define D_DNSSERVER "ServerDNS"
#define D_DONE "Wykonane"
#define D_DST_TIME "DST"
#define D_EMPTY "Pusty"
#define D_EMULATION "Emulacja"
#define D_ENABLED "Otwarty"
#define D_ENDDST "KoniecDST" // End Daylight Savings Time
#define D_ERASE "Nadpisz"
#define D_ERROR "Blad"
#define D_EVERY "Kazdy"
#define D_FAHRENHEIT "Fahrenheita"
#define D_FAILED "Bledny"
#define D_FALLBACK "Awaryjny"
#define D_FALLBACK_TOPIC "Zastepczy temat"
#define D_FALLBACKTOPIC "ZastepczyTemat"
#define D_FALSE "Falsz"
#define D_FILE "Plik"
#define D_FLASHMODE "FlashMode"
#define D_FLASHSIZE "FlashWielkosc"
#define D_FREE_MEMORY "Wolna pamiec"
#define D_FREEMEMORY "Wolne"
#define D_FROM "z"
#define D_GATEWAY "Brama"
#define D_GROUP "Grupa"
#define D_HEAPSIZE "Stos"
#define D_HIGH "Wysoki"
#define D_HOST "Serwer"
#define D_HOSTNAME "Nazwa serwera"
#define D_HUMIDITY "Wilgotnosc"
#define D_ILLUMINANCE "Oswietlenie"
#define D_IMMEDIATE "Natychmiastowe" // Button immediate
#define D_INDEX "Indeks"
#define D_INFO "Informacja"
#define D_INITIALIZED "Zainicjowany"
#define D_IP_ADDRESS "Adres IP"
#define D_LIGHT "Swiatlo"
#define D_LOCAL_TIME "Lokalny"
#define D_LOW "Niski"
#define D_LWT "LWT"
#define D_MAC "Mac"
#define D_MASK "Maska"
#define D_MODULE "Modul"
#define D_MQTT "MQTT"
#define D_MULTI_PRESS "wielokrotne-nacisniecie"
#define D_NO "Nie"
#define D_NOISE "Halas"
#define D_NONE "Brak"
#define D_OFF "Wylaczony"
#define D_OFFLINE "Nieaktywny"
#define D_OK "Ok"
#define D_ON "Wlaczony"
#define D_ONLINE "Aktywny"
#define D_OR "lub"
#define D_PASSWORD "Haslo"
#define D_PERIOD "Okres"
#define D_PORT "Port"
#define D_POWER_FACTOR "Wspolczynik mocy"
#define D_POWERFACTOR "WspolczynikMocy"
#define D_POWERUSAGE "Moc"
#define D_PRESSURE "Cisnienie"
#define D_PRESSUREATSEALEVEL "Cisnienie na poziomie morza"
#define D_PROGRAM_FLASH_SIZE "Wielkosc programu flash"
#define D_PROGRAMFLASHSIZE "ProgramFlashSize"
#define D_PROGRAM_SIZE "Wielkosc programu"
#define D_PROGRAMSIZE "ProgramSize"
#define D_PROJECT "Projekt"
#define D_RECEIVED "Otrzymany"
#define D_RESTART "Restart"
#define D_RESTARTING "Restartowanie"
#define D_RESTART_REASON "Przyczyna restartu"
#define D_RESTARTREASON "PrzyczynaRestartu"
#define D_RESTORE "Przywracanie"
#define D_RETAINED "Zachowane"
#define D_SAVE "Zapisz"
#define D_SAVEADDRESS "AdresZapisu"
#define D_SAVECOUNT "LicznikZapisu"
#define D_SAVESTATE "StanZapisu"
#define D_SDKVERSION "SDK"
#define D_SELECTED "Wybrany"
#define D_SENSOR "Czujnik"
#define D_SERIAL "Serial"
#define D_BYTES "Bajtow"
#define D_SSID "SSID"
#define D_START "Start"
#define D_STARTED "Uruchomiony"
#define D_STARTDST "StartDST" // Start Daylight Savings Time
#define D_STD_TIME "STD"
#define D_STOP "Stop"
#define D_SUBNET_MASK "Maska podsieci"
#define D_SUBNETMASK "MaskaPodsieci"
#define D_SUBSCRIBE_TO "Subskrybuj do"
#define D_SUCCESSFUL "Powodzenie"
#define D_SWITCH "Przelacznik"
#define D_SYNC "Sync"
#define D_SYS "System " // Sys log
#define D_TEMPERATURE "Temperatura"
#define D_TEMPERATURE_UNIT "JednTemp"
#define D_TIME "Czas"
#define D_TO "do"
#define D_TODAY "Dzisiaj"
#define D_TOGGLE "Przelacz"
#define D_TOPIC "Temat"
#define D_TOTAL "Suma"
#define D_TRANSMIT "Wyslij"
#define D_TRUE "Prawda"
#define D_TYPE "Typ"
#define D_UNKNOWN "Nieznany"
#define D_UPGRADE "aktualizacji"
#define D_UPLOAD "Wgraj"
#define D_UPTIME "Uptime"
#define D_USER "Uzytkownik"
#define D_UTC_TIME "UTC"
#define D_UV_LEVEL "Poziom UV"
#define D_VCC "VCC"
#define D_VERSION "Wersja"
#define D_VOLTAGE "Napiecie"
#define D_WARMLIGHT "Nagrzanie"
#define D_WEB "Web" // Web log
#define D_WEB_SERVER "Web Server"
#define D_WIFI "Wifi"
#define D_WRONG "Bledny"
#define D_YESTERDAY "Wczoraj"
// settings.ino
#define D_SAVED_TO_FLASH_AT "Zapisane do pamieci flash w"
#define D_LOADED_FROM_FLASH_AT "Wczytane z pamieci flash z"
#define D_USE_DEFAULTS "Uzyj domyslnych"
#define D_ERASED_SECTOR "Wymazany sektor"
// sonoff.ino
#define D_LEVEL_10 "poziom 1-0"
#define D_LEVEL_01 "poziom 0-1"
#define D_SERIAL_LOGGING_DISABLED "Wylaczony dziennik na porcie szeregowym"
#define D_SYSLOG_LOGGING_REENABLED "Wznowiono zapis do Syslog"
#define D_SET_BAUDRATE_TO "Ustaw szybkosc transmisji na"
#define D_RECEIVED_TOPIC "Otrzymany temat"
#define D_DATA_SIZE "Wielkosc danych"
#define D_ANALOG_INPUT0 "Wej_analogowe"
#define D_FINGERPRINT "Weryfikuj odcisk TLS..."
#define D_TLS_CONNECT_FAILED_TO "Nieudane polaczenie TLS do"
#define D_RETRY_IN "Sprobuj ponownie"
#define D_VERIFIED "Zweryfikowano"
#define D_INSECURE "Nieprawidlowe polaczenie z powodu blednego odcisku TLS"
#define D_CONNECT_FAILED_TO "Nie udalo sie nawiazac polaczenia"
// support.ino
#define D_OSWATCH "osWatch"
#define D_BLOCKED_LOOP "Petla zablokowana"
#define D_WPS_FAILED_WITH_STATUS "Blad WPSconfig ze statusem"
#define D_ACTIVE_FOR_1_MINUTE "aktywny 1 minute"
#define D_FAILED_TO_START "nie udalo sie uruchomic"
#define D_PATCH_ISSUE_2186 "Blad latki 2186"
#define D_CONNECTING_TO_AP "Laczenie z AP"
#define D_IN_MODE "w trybie"
#define D_CONNECT_FAILED_NO_IP_ADDRESS "Polaczenie nie powiodlo sie, poniewaz nie otrzymano adresu IP"
#define D_CONNECT_FAILED_AP_NOT_REACHED "Polaczenie nie powiodlo sie jako AP nie mozna osiagnac"
#define D_CONNECT_FAILED_WRONG_PASSWORD "Polaczenie nie powiodlo sie z nieprawidlowym haslem dostepu AP"
#define D_CONNECT_FAILED_AP_TIMEOUT "Nie udalo sie nawiazac polaczenia, limit czasu AP przekroczony"
#define D_ATTEMPTING_CONNECTION "Proba polaczenia..."
#define D_CHECKING_CONNECTION "Sprawdzanie polaczenia..."
#define D_QUERY_DONE "Wykonano zapytanie. Znaleziono uslugi MQTT"
#define D_MQTT_SERVICE_FOUND "Usluga MQTT została znaleziona"
#define D_I2CSCAN_DEVICES_FOUND_AT "Znaleziono urządzenie(a) na"
#define D_FOUND_AT "znalezione w"
#define D_I2CSCAN_UNKNOWN_ERROR_AT "Nieznany blad w"
#define D_I2CSCAN_NO_DEVICES_FOUND "Nie znaleziono urzadzen"
#define D_SYSLOG_HOST_NOT_FOUND "Syslog Host nie znaleziony"
// webserver.ino
#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Oprogramowanie MINIMAL - prosze uaktualnic"
#define D_WEBSERVER_ACTIVE_ON "Aktywny serwer Web"
#define D_WITH_IP_ADDRESS "z adresem IP"
#define D_WEBSERVER_STOPPED "Serwer Web zatrzymany"
#define D_FILE_NOT_FOUND "Plik nie odnaleziony"
#define D_REDIRECTED "Przekierowano do wlasnego portalu"
#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Menedzer Wifi ustawia punkt dostepowy i zachowuje stacje"
#define D_WIFIMANAGER_SET_ACCESSPOINT "Menedzer sieci Wi-Fi Access Point"
#define D_TRYING_TO_CONNECT "Probuje polaczyc urzadzenie z siecia"
#define D_RESTART_IN "Zrestartuj"
#define D_SECONDS "sekund"
#define D_DEVICE_WILL_RESTART "Urzadzenie zrestartuje sie za kilka sekund"
#define D_BUTTON_TOGGLE "Przelacznik"
#define D_CONFIGURATION "Konfiguracja"
#define D_INFORMATION "Informacje"
#define D_FIRMWARE_UPGRADE "Uaktualnienie oprogramowania"
#define D_CONSOLE "Konsola"
#define D_CONFIRM_RESTART "Potwierdz restart"
#define D_CONFIGURE_MODULE "Konfiguruj modul"
#define D_CONFIGURE_WIFI "Konfiguruj WiFi"
#define D_CONFIGURE_MQTT "Konfiguruj MQTT"
#define D_CONFIGURE_DOMOTICZ "Konfiguruj Domoticz"
#define D_CONFIGURE_LOGGING "Konfiguruj zapis dziennika"
#define D_CONFIGURE_OTHER "Konfiguruj inne"
#define D_CONFIRM_RESET_CONFIGURATION "Potwierdz reset ustawien"
#define D_RESET_CONFIGURATION "Reset ustawien"
#define D_BACKUP_CONFIGURATION "Kopia ustawien"
#define D_RESTORE_CONFIGURATION "Przywrocenie ustawien"
#define D_MAIN_MENU "Menu glowne"
#define D_MODULE_PARAMETERS "Parametery modulu"
#define D_MODULE_TYPE "Typ modulu"
#define D_GPIO "GPIO"
#define D_SERIAL_IN "Serial In"
#define D_SERIAL_OUT "Serial Out"
#define D_WIFI_PARAMETERS "Parametry WiFi"
#define D_SCAN_FOR_WIFI_NETWORKS "Skanuj sieci WiFi"
#define D_SCAN_DONE "Skan wykonany"
#define D_NO_NETWORKS_FOUND "Nie znaleziono sieci"
#define D_REFRESH_TO_SCAN_AGAIN "Odswiez aby ponownie zeskanowac"
#define D_DUPLICATE_ACCESSPOINT "Kopiuj AP"
#define D_SKIPPING_LOW_QUALITY "Pominieto z powodu niskiej jakości sygnalu"
#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 "Haslo AP1"
#define D_AP2_SSID "AP2 SSID"
#define D_AP2_PASSWORD "Haslo AP2"
#define D_MQTT_PARAMETERS "Parametery MQTT"
#define D_CLIENT "Klient"
#define D_FULL_TOPIC "Pelen temat"
#define D_LOGGING_PARAMETERS "Opcje dziennika"
#define D_LOG_LEVEL "poziom dziennika"
#define D_MORE_DEBUG "Wiecej informacji debugujacych"
#define D_SYSLOG_HOST "Syslog host"
#define D_SYSLOG_PORT "Syslog port"
#define D_TELEMETRY_PERIOD "Okres telemetrii"
#define D_OTHER_PARAMETERS "Inne parametery"
#define D_WEB_ADMIN_PASSWORD "Haslo administratora Web"
#define D_MQTT_ENABLE "MQTT aktywne"
#define D_FRIENDLY_NAME "Przyjazna nazwa"
#define D_BELKIN_WEMO "Belkin WeMo"
#define D_HUE_BRIDGE "Hue Bridge"
#define D_SINGLE_DEVICE "single device"
#define D_MULTI_DEVICE "multi device"
#define D_SAVE_CONFIGURATION "Zapisz ustawienia"
#define D_CONFIGURATION_SAVED "Ustawienia zapisane"
#define D_CONFIGURATION_RESET "Ustawienia zresetowane"
#define D_PROGRAM_VERSION "Wersja programu"
#define D_BUILD_DATE_AND_TIME "Dzien i godzina kompilacji"
#define D_CORE_AND_SDK_VERSION "Wersja Core/SDK"
#define D_FLASH_WRITE_COUNT "Liczba zapisow do pamieci"
#define D_MAC_ADDRESS "Adres Mac"
#define D_MQTT_HOST "Host MQTT"
#define D_MQTT_PORT "Port MQTT"
#define D_MQTT_CLIENT "Klient MQTT"
#define D_MQTT_USER "Uzytkownik MQTT"
#define D_MQTT_TOPIC "Temat MQTT"
#define D_MQTT_GROUP_TOPIC "Temat grupy MQTT"
#define D_MQTT_FULL_TOPIC "Pelen temat MQTT"
#define D_MDNS_DISCOVERY "Wykrywanie mDNS"
#define D_MDNS_ADVERTISE "Rozglaszanie mDNS"
#define D_ESP_CHIP_ID "ID ukladu ESP"
#define D_FLASH_CHIP_ID "ID ukladu pamieci flash"
#define D_FLASH_CHIP_SIZE "Rozmiar flash"
#define D_FREE_PROGRAM_SPACE "Wolne miejsce programu"
#define D_UPGRADE_BY_WEBSERVER "Aktualizacja z serwera Web"
#define D_OTA_URL "URL OTA"
#define D_START_UPGRADE "Start aktualizacji"
#define D_UPGRADE_BY_FILE_UPLOAD "Aktualizacja poprzez wgranie pliku"
#define D_UPLOAD_STARTED "Wgrywanie rozpoczete"
#define D_UPGRADE_STARTED "Aktualizacja rozpoczeta"
#define D_UPLOAD_DONE "Wgrywanie zakonczone"
#define D_UPLOAD_ERR_1 "Nie wybrano pliku"
#define D_UPLOAD_ERR_2 "Niewystarczajaca ilosc miejsca"
#define D_UPLOAD_ERR_3 "Magiczny bajt jest inny niz 0xE9"
#define D_UPLOAD_ERR_4 "Rozmiar programu jest wiekszy niz rzeczywisty rozmiar pamieci flash"
#define D_UPLOAD_ERR_5 "Wgrywanie, bufor niezgodnosci stanu porownywanych bitow"
#define D_UPLOAD_ERR_6 "Blad wgrywania. Uruchomiono zapis do dziennika na poziomie 3"
#define D_UPLOAD_ERR_7 "Wgrywanie przerwane"
#define D_UPLOAD_ERR_8 "Bledny plik"
#define D_UPLOAD_ERR_9 "Plik jest za duzy"
#define D_UPLOAD_ERROR_CODE "Blad wgrywania"
#define D_ENTER_COMMAND "Wprowadz polecenie"
#define D_ENABLE_WEBLOG_FOR_RESPONSE "Wlacz poziom 2 zapisu Weblog, jesli oczekiwana jest odpowiedz"
#define D_NEED_USER_AND_PASSWORD "Wymagany uzytkownik=<username>&haslo=<password>"
// xdrv_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Parametry Domoticz"
#define D_DOMOTICZ_IDX "Idx"
#define D_DOMOTICZ_KEY_IDX "Key idx"
#define D_DOMOTICZ_SWITCH_IDX "Przelacznik idx"
#define D_DOMOTICZ_SENSOR_IDX "Sensor idx"
#define D_DOMOTICZ_TEMP "Temp"
#define D_DOMOTICZ_TEMP_HUM "Temp,Wilg"
#define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Wilg,Cis"
#define D_DOMOTICZ_POWER_ENERGY "Moc,Energia"
#define D_DOMOTICZ_ILLUMINANCE "Oswietl."
#define D_DOMOTICZ_COUNT "Licznik"
#define D_DOMOTICZ_VOLTAGE "Napiecie"
#define D_DOMOTICZ_CURRENT "Prad"
#define D_DOMOTICZ_UPDATE_TIMER "Zaktualizuj czasomierz"
// xdrv_ir-send.ino
#define D_INVALID_JSON "Invalid JSON"
#define D_PROTOCOL_NOT_SUPPORTED "Protokol nie jest obslugiwany"
#define D_IR_PROTOCOL "PROTOCOL"
#define D_IR_BITS "BITS"
#define D_IR_DATA "DATA"
#define D_IRHVAC_VENDOR "VENDOR"
#define D_IRHVAC_POWER "POWER"
#define D_IRHVAC_MODE "MODE"
#define D_IRHVAC_FANSPEED "FANSPEED"
#define D_IRHVAC_TEMP "TEMP"
#define D_IRRECEIVED "IrReceived"
// xdrv_snfbridge.ino
#define D_RFRECEIVED "RfReceived"
#define D_START_LEARNING "Zacznij nauke"
#define D_SET_TO_DEFAULT "Ustaw domyslne"
#define D_DEFAULT_SENT "Domyslne wyslane"
#define D_LEARNED_SENT "Wyuczone wyslane"
#define D_LEARNING_ACTIVE "Wyuczone aktywne"
#define D_LEARN_FAILED "Uczenie niepowodzenie"
#define D_LEARNED "Wyuczone"
#define D_SAVED "Zapisane"
// xdrv_wemohue.ino
#define D_MULTICAST_DISABLED "Multicast jest wylaczony"
#define D_MULTICAST_REJOINED "Multicast (re)dolaczony"
#define D_MULTICAST_JOIN_FAILED "Multicast nie powiodlo sie"
#define D_FAILED_TO_SEND_RESPONSE "Nie udalo sie wyslac odpowiedzi"
#define D_WEMO "WeMo"
#define D_WEMO_BASIC_EVENT "WeMo podstawowe zdarzenie"
#define D_WEMO_EVENT_SERVICE "WeMo zdarzenie service"
#define D_WEMO_SETUP "WeMo setup"
#define D_RESPONSE_SENT "Odpowiedz wyslana"
#define D_HUE "Hue"
#define D_HUE_BRIDGE_SETUP "Hue setup"
#define D_HUE_API_NOT_IMPLEMENTED "Hue API nie zaimplementowane"
#define D_HUE_API "Hue API"
#define D_HUE_POST_ARGS "Hue POST args"
#define D_3_RESPONSE_PACKETS_SENT "3 pakiety odpowiedzi wysylane"
// xsns_dht.ino
#define D_TIMEOUT_WAITING_FOR "Trwa oczekiwanie"
#define D_START_SIGNAL_LOW "sygnał startowy niski"
#define D_START_SIGNAL_HIGH "sygnał startowy wysoki"
#define D_PULSE "pulse"
#define D_CHECKSUM_FAILURE "Bledna suma kontrolmna"
// xsns_ds18b20.ino
#define D_SENSOR_BUSY "Czujnik DS18x20 zajety"
#define D_SENSOR_CRC_ERROR "Czujnik DS18x20 blad CRC"
// xsns_hlw8012.ino
#define D_MAXPOWERREACHED "MaksMocOsiagnieta"
#define D_MAXPOWERREACHEDRETRY "MaksMocOsiagnietaPonowienie"
#define D_POWERMONITOR "MonitorMocy"
#define D_ENERGYMONITOR "MonitorEnergii"
#define D_MAXENERGYREACHED "MaksEnergiaOsiagnieta"
#define D_ENERGY_TODAY "Energia Dzisiaj"
#define D_ENERGY_YESTERDAY "Energia Wczoraj"
#define D_ENERGY_TOTAL "Energia suma"
// xsns_sht1x.ino
#define D_SENSOR_DID_NOT_ACK_COMMAND "Czujnik nie otrzymal komendy ACK"
#define D_SHT1X_FOUND "SHT1X znaleziony"
// sonoff_template.h
// Max string length is 8 characters including suffixes
#define D_SENSOR_NONE "Brak"
#define D_SENSOR_DHT11 "DHT11"
#define D_SENSOR_AM2301 "AM2301"
#define D_SENSOR_DHT22 "DHT22"
#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_IRSEND "IRsend"
#define D_SENSOR_SWITCH "Przela" // Suffix "1"
#define D_SENSOR_BUTTON "Przyci" // Suffix "1"
#define D_SENSOR_RELAY "Przek" // Suffix "1i"
#define D_SENSOR_LED "Led" // Suffix "1i"
#define D_SENSOR_PWM "PWM" // Suffix "1"
#define D_SENSOR_COUNTER "Liczni" // Suffix "1"
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_SPI_CS "SPI CS"
#define D_SENSOR_SPI_DC "SPI DC"
#define D_SENSOR_BACKLIGHT "BLight"
// Units
#define D_UNIT_AMPERE "A"
#define D_UNIT_HOUR "Godz"
#define D_UNIT_KILOWATTHOUR "kWh"
#define D_UNIT_LUX "lx"
#define D_UNIT_MICROSECOND "us"
#define D_UNIT_MILLIAMPERE "mA"
#define D_UNIT_MILLISECOND "ms"
#define D_UNIT_MINUTE "Min"
#define D_UNIT_PRESSURE "hPa"
#define D_UNIT_SECOND "sec"
#define D_UNIT_SECTORS "sektory"
#define D_UNIT_VOLT "V"
#define D_UNIT_WATT "W"
#define D_UNIT_WATTHOUR "Wh"
// Log message prefix
#define D_LOG_APPLICATION "APP: "
#define D_LOG_BRIDGE "BRG: "
#define D_LOG_CONFIG "CFG: "
#define D_LOG_COMMAND "CMD: "
#define D_LOG_DHT "DHT: "
#define D_LOG_DOMOTICZ "DOM: "
#define D_LOG_DSB "DSB: "
#define D_LOG_HTTP "HTP: "
#define D_LOG_I2C "I2C: "
#define D_LOG_IRR "IRR: "
#define D_LOG_LOG "LOG: "
#define D_LOG_MODULE "MOD: "
#define D_LOG_MDNS "DNS: "
#define D_LOG_MQTT "MQT: "
#define D_LOG_OTHER "OTH: "
#define D_LOG_RESULT "RSL: "
#define D_LOG_SERIAL "SER: "
#define D_LOG_SHT1 "SHT: "
#define D_LOG_UPLOAD "UPL: "
#define D_LOG_UPNP "UPP: "
#define D_LOG_WIFI "WIF: "
// Result
#define D_RSLT_RESULT "REZULTAT"
#define D_RSLT_INFO "INFO"
#define D_RSLT_STATE "STAN"
#define D_RSLT_SENSOR "SENSOR"
#define D_RSLT_UPTIME "UPTIME"
#define D_RSLT_MARGINS "MARGINES"
#define D_RSLT_WARNING "OSTRZEZENIE"
#define D_RSLT_ENERGY "ENERGIA"
// Commands
#define D_CMND_MQTTHOST "MqttHost"
#define D_CMND_MQTTPORT "MqttPort"
#define D_CMND_MQTTRETRY "MqttRetry"
#define D_CMND_STATETEXT "StateText"
#define D_CMND_MQTTFINGERPRINT "MqttFingerprint"
#define D_CMND_MQTTCLIENT "MqttClient"
#define D_CMND_MQTTUSER "MqttUser"
#define D_CMND_MQTTPASSWORD "MqttPassword"
#define D_CMND_FULLTOPIC "FullTopic"
#define D_CMND_PREFIX "Prefix"
#define PRFX_MAX_STRING_LENGTH 5
#define D_CMND "cmnd"
#define D_STAT "stat"
#define D_TELE "tele"
#define D_CMND_GROUPTOPIC "GroupTopic"
#define D_CMND_TOPIC "Topic"
#define D_CMND_BUTTONTOPIC "ButtonTopic"
#define D_CMND_SWITCHTOPIC "SwitchTopic"
#define D_CMND_BUTTONRETAIN "ButtonRetain"
#define D_CMND_SWITCHRETAIN "SwitchRetain"
#define D_CMND_POWERRETAIN "PowerRetain"
#define D_CMND_SENSORRETAIN "SensorRetain"
#define D_CMND_BACKLOG "Backlog"
#define D_CMND_DELAY "Delay"
#define D_CMND_STATUS "Status"
#define D_STATUS1_PARAMETER "PRM"
#define D_STATUS2_FIRMWARE "FWR"
#define D_STATUS3_LOGGING "LOG"
#define D_STATUS4_MEMORY "MEM"
#define D_STATUS5_NETWORK "NET"
#define D_STATUS6_MQTT "MQT"
#define D_STATUS7_TIME "TIM"
#define D_STATUS8_POWER "PWR"
#define D_STATUS9_MARGIN "PTH"
#define D_STATUS10_SENSOR "SNS"
#define D_STATUS11_STATUS "STS"
#define D_CMND_POWER "Power"
#define D_RSLT_POWER "POWER"
#define D_CMND_POWERONSTATE "PowerOnState"
#define D_CMND_PULSETIME "PulseTime"
#define D_CMND_BLINKTIME "BlinkTime"
#define D_CMND_BLINKCOUNT "BlinkCount"
#define D_CMND_SAVEDATA "SaveData"
#define D_CMND_SETOPTION "SetOption"
#define D_CMND_TEMPERATURE_RESOLUTION "TempRes"
#define D_CMND_HUMIDITY_RESOLUTION "HumRes"
#define D_CMND_PRESSURE_RESOLUTION "PressRes"
#define D_CMND_POWER_RESOLUTION "WattRes"
#define D_CMND_VOLTAGE_RESOLUTION "VoltRes"
#define D_CMND_ENERGY_RESOLUTION "EnergyRes"
#define D_CMND_MODULE "Module"
#define D_CMND_MODULES "Modules"
#define D_CMND_GPIO "GPIO"
#define D_NOT_SUPPORTED "Not supported"
#define D_CMND_GPIOS "GPIOs"
#define D_CMND_PWM "PWM"
#define D_CMND_PWMFREQUENCY "PWMFrequency"
#define D_CMND_PWMRANGE "PWMRange"
#define D_CMND_COUNTER "Counter"
#define D_CMND_COUNTERTYPE "CounterType"
#define D_CMND_COUNTERDEBOUNCE "CounterDebounce"
#define D_CMND_SLEEP "Sleep"
#define D_CMND_UPLOAD "Upload"
#define D_CMND_UPGRADE "Upgrade"
#define D_ONE_OR_GT "1 or >%s to upgrade"
#define D_CMND_OTAURL "OtaUrl"
#define D_CMND_SERIALLOG "SerialLog"
#define D_CMND_SYSLOG "SysLog"
#define D_CMND_LOGHOST "LogHost"
#define D_CMND_LOGPORT "LogPort"
#define D_CMND_IPADDRESS "IPAddress"
#define D_CMND_NTPSERVER "NtpServer"
#define D_CMND_AP "Ap"
#define D_CMND_SSID "SSID"
#define D_CMND_PASSWORD "Password"
#define D_CMND_HOSTNAME "Hostname"
#define D_CMND_WIFICONFIG "WifiConfig"
#define WCFG_MAX_STRING_LENGTH 12
#define D_WCFG_0_RESTART "Restart"
#define D_WCFG_1_SMARTCONFIG "SmartConfig"
#define D_WCFG_2_WIFIMANAGER "WifiManager"
#define D_WCFG_3_WPSCONFIG "WPSConfig"
#define D_WCFG_4_RETRY "Retry"
#define D_WCFG_5_WAIT "Wait"
#define D_CMND_FRIENDLYNAME "FriendlyName"
#define D_CMND_SWITCHMODE "SwitchMode"
#define D_CMND_WEBSERVER "Webserver"
#define D_WEBSERVER_MODE "WebServerMode"
#define D_ACTIVE_FOR "Active for"
#define D_ON_DEVICE "on"
#define D_CMND_WEBPASSWORD "WebPassword"
#define D_CMND_WEBLOG "WebLog"
#define D_CMND_EMULATION "Emulation"
#define D_CMND_TELEPERIOD "TelePeriod"
#define D_CMND_RESTART "Restart"
#define D_ONE_TO_RESTART "1 to restart"
#define D_CMND_RESET "Reset"
#define D_RESET_AND_RESTARTING "Reset and Restarting"
#define D_ONE_TO_RESET "1 to reset"
#define D_CMND_TIMEZONE "Timezone"
#define D_CMND_ALTITUDE "Altitude"
#define D_CMND_LEDPOWER "LedPower"
#define D_CMND_LEDSTATE "LedState"
#define D_CMND_CFGDUMP "CfgDump"
#define D_CMND_I2CSCAN "I2CScan"
#define D_CMND_EXCEPTION "Exception"
// Commands xdrv_domoticz.ino
#define D_CMND_DOMOTICZ "Domoticz"
#define D_CMND_IDX "Idx"
#define D_CMND_KEYIDX "KeyIdx"
#define D_CMND_SWITCHIDX "SwitchIdx"
#define D_CMND_SENSORIDX "SensorIdx"
#define D_CMND_UPDATETIMER "UpdateTimer"
// Commands xdrv_ir_send.ino
#define D_CMND_IRSEND "IRSend"
#define D_CMND_IRHVAC "IRHVAC"
// Commands xdrv_snfbridge.ino
#define D_CMND_RFCODE "RfCode"
#define D_CMND_RFHIGH "RfHigh"
#define D_CMND_RFHOST "RfHost"
#define D_CMND_RFKEY "RfKey"
#define D_CMND_RFLOW "RfLow"
#define D_CMND_RFSYNC "RfSync"
// Commands xdrv_snfled.ino
#define D_CMND_COLOR "Color"
#define D_CMND_COLORTEMPERATURE "CT"
#define D_CMND_DIMMER "Dimmer"
#define D_CMND_LED "Led"
#define D_CMND_LEDTABLE "LedTable"
#define D_CMND_FADE "Fade"
#define D_CMND_PIXELS "Pixels"
#define D_CMND_SCHEME "Scheme"
#define D_CMND_SPEED "Speed"
#define D_CMND_WAKEUP "Wakeup"
#define D_CMND_WAKEUPDURATION "WakeUpDuration"
#define D_CMND_WIDTH "Width"
// Commands xsns_hlw8012.ino
#define D_CMND_POWERLOW "PowerLow"
#define D_CMND_POWERHIGH "PowerHigh"
#define D_CMND_VOLTAGELOW "VoltageLow"
#define D_CMND_VOLTAGEHIGH "VoltageHigh"
#define D_CMND_CURRENTLOW "CurrentLow"
#define D_CMND_CURRENTHIGH "CurrentHigh"
#define D_CMND_ENERGYRESET "EnergyReset"
#define D_CMND_HLWPCAL "HlwPcal"
#define D_CMND_HLWPSET "HlwPset"
#define D_CMND_HLWUCAL "HlwUcal"
#define D_CMND_HLWUSET "HlwUset"
#define D_CMND_HLWICAL "HlwIcal"
#define D_CMND_HLWISET "HlwIset"
#define D_CMND_MAXPOWER "MaxPower"
#define D_CMND_MAXPOWERHOLD "MaxPowerHold"
#define D_CMND_MAXPOWERWINDOW "MaxPowerWindow"
#define D_CMND_SAFEPOWER "SafePower"
#define D_CMND_SAFEPOWERHOLD "SafePowerHold"
#define D_CMND_SAFEPOWERWINDOW "SafePowerWindow"
#define D_CMND_MAXENERGY "MaxEnergy"
#define D_CMND_MAXENERGYSTART "MaxEnergyStart"
#endif // _LANGUAGE_PL_PL_H_

View File

@ -17,12 +17,15 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _SETTINGS_H_
#define _SETTINGS_H_
#define PARAM8_SIZE 23 // Number of param bytes
typedef union { // Restricted by MISRA-C Rule 18.4 but so usefull...
uint32_t data; // Allow bit manipulation using SetOption
struct {
uint32_t savestate : 1; // bit 0
uint32_t save_state : 1; // bit 0
uint32_t button_restrict : 1; // bit 1
uint32_t value_units : 1; // bit 2
uint32_t mqtt_enabled : 1; // bit 3
@ -37,9 +40,9 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t stop_flash_rotate : 1; // bit 12 (v5.2.0)
uint32_t button_single : 1; // bit 13 (v5.4.0)
uint32_t interlock : 1; // bit 14 (v5.6.0)
uint32_t spare15 : 1;
uint32_t spare16 : 1;
uint32_t spare17 : 1;
uint32_t pwm_control : 1; // bit 15 (v5.8.1)
uint32_t ws_clock_reverse : 1; // bit 16 (v5.8.1)
uint32_t decimal_text : 1; // bit 17 (v5.8.1)
uint32_t spare18 : 1;
uint32_t wattage_resolution : 1;
uint32_t voltage_resolution : 1;
@ -49,175 +52,200 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t humidity_resolution : 2;
uint32_t temperature_resolution : 2;
};
} sysBitfield;
} SysBitfield;
struct SYSCFG {
unsigned long cfg_holder;
unsigned long saveFlag;
unsigned long version;
unsigned long bootcount;
sysBitfield flag; // Add flag since 5.0.2
int16_t savedata;
unsigned long cfg_holder; // 000
unsigned long save_flag; // 004
unsigned long version; // 008
unsigned long bootcount; // 00C
SysBitfield flag; // 010 Add flag since 5.0.2
int16_t save_data; // 014
int8_t timezone; // 016
char ota_url[101]; // 017
char mqtt_prefix[3][11]; // 07C
int8_t timezone;
char otaUrl[101];
byte free_09D[1]; // 09D
char mqtt_prefix[3][11]; // was ex_friendlyname[33] until 3.2.5
byte seriallog_level; // 09E
uint8_t sta_config; // 09F
byte sta_active; // 0A0
char sta_ssid[2][33]; // 0A1
char sta_pwd[2][65]; // 0E3
char hostname[33]; // 165
char syslog_host[33]; // 186
byte serial_enable; // Not used (ever)
byte seriallog_level;
uint8_t sta_config;
byte sta_active;
char sta_ssid[2][33];
char sta_pwd[2][65];
char hostname[33];
char syslog_host[33];
uint16_t syslog_port;
byte syslog_level;
uint8_t webserver;
byte weblog_level;
byte free_1A7[1]; // 1A7
char mqtt_fingerprint[60];
char mqtt_host[33];
uint16_t mqtt_port;
char mqtt_client[33];
char mqtt_user[33];
char mqtt_pwd[33];
char mqtt_topic[33];
char button_topic[33];
char mqtt_grptopic[33];
char ex_state_text[3][11]; // was state_text until 5.1.6, was ex_mqtt_subtopic[33] until 4.1.1
byte ex_mqtt_button_retain; // Not used since 5.0.2
byte ex_mqtt_power_retain; // Not used since 5.0.2
byte ex_value_units; // Not used since 5.0.2
byte ex_button_restrict; // Not used since 5.0.2
uint16_t tele_period;
uint16_t syslog_port; // 1A8
byte syslog_level; // 1AA
uint8_t webserver; // 1AB
byte weblog_level; // 1AC
char mqtt_fingerprint[60]; // 1AD To be freed by binary fingerprint
char mqtt_host[33]; // 1E9
uint16_t mqtt_port; // 20A
char mqtt_client[33]; // 20C
char mqtt_user[33]; // 22D
char mqtt_pwd[33]; // 24E
char mqtt_topic[33]; // 26F
char button_topic[33]; // 290
char mqtt_grptopic[33]; // 2B1
uint8_t mqtt_fingerprinth[20]; // 2D2 Reserved for binary fingerprint
uint8_t power;
uint8_t ledstate;
uint16_t pwm_frequency; // 2E6
power_t power; // 2E8
uint16_t pwm_value[MAX_PWMS]; // 2EC
uint8_t param[PARAM8_SIZE]; // was domoticz_in_topic until 5.1.6
char state_text[4][11]; // was domoticz_out_topic until 5.1.6
int16_t altitude; // 2F6 Add since 5.8.0i
uint16_t tele_period; // 2F8
uint8_t ex_power; // 2FA Not used since 5.8.0j
uint8_t ledstate; // 2FB
uint8_t param[PARAM8_SIZE]; // 2FC was domoticz_in_topic until 5.1.6
char state_text[4][11]; // 313
uint16_t domoticz_update_timer;
unsigned long domoticz_relay_idx[4];
unsigned long domoticz_key_idx[4];
byte free_33F[1]; // 33F
unsigned long hlw_pcal;
unsigned long hlw_ucal;
unsigned long hlw_ical;
unsigned long hlw_kWhtoday;
unsigned long hlw_kWhyesterday;
uint16_t hlw_kWhdoy;
uint16_t hlw_pmin;
uint16_t hlw_pmax;
uint16_t hlw_umin;
uint16_t hlw_umax;
uint16_t hlw_imin;
uint16_t hlw_imax;
uint16_t hlw_mpl; // MaxPowerLimit
uint16_t hlw_mplh; // MaxPowerLimitHold
uint16_t hlw_mplw; // MaxPowerLimitWindow
uint16_t hlw_mspl; // MaxSafePowerLimit
uint16_t hlw_msplh; // MaxSafePowerLimitHold
uint16_t hlw_msplw; // MaxSafePowerLimitWindow
uint16_t hlw_mkwh; // MaxEnergy
uint16_t hlw_mkwhs; // MaxEnergyStart
uint16_t domoticz_update_timer; // 340
uint16_t pwm_range; // 342
// 3.0.6
uint16_t mqtt_retry; // was ex_pulsetime until 4.0.4
unsigned long domoticz_relay_idx[MAX_DOMOTICZ_IDX]; // 344
unsigned long domoticz_key_idx[MAX_DOMOTICZ_IDX]; // 354
// 3.1.1
uint8_t poweronstate;
unsigned long hlw_power_calibration; // 364
unsigned long hlw_voltage_calibration; // 368
unsigned long hlw_current_calibration; // 36C
unsigned long hlw_kWhtoday; // 370
unsigned long hlw_kWhyesterday; // 374
uint16_t hlw_kWhdoy; // 378
uint16_t hlw_pmin; // 37A
uint16_t hlw_pmax; // 37C
uint16_t hlw_umin; // 37E
uint16_t hlw_umax; // 380
uint16_t hlw_imin; // 382
uint16_t hlw_imax; // 384
uint16_t hlw_mpl; // 386 MaxPowerLimit
uint16_t hlw_mplh; // 388 MaxPowerLimitHold
uint16_t hlw_mplw; // 38A MaxPowerLimitWindow
uint16_t hlw_mspl; // 38C MaxSafePowerLimit
uint16_t hlw_msplh; // 38E MaxSafePowerLimitHold
uint16_t hlw_msplw; // 390 MaxSafePowerLimitWindow
uint16_t hlw_mkwh; // 392 MaxEnergy
uint16_t hlw_mkwhs; // 394 MaxEnergyStart
uint16_t mqtt_retry; // 396
uint8_t poweronstate; // 398
// 3.1.6
uint16_t blinktime;
uint16_t blinkcount;
byte free_399[1]; // 399
// 3.2.4
uint16_t ws_pixels;
uint8_t ws_red;
uint8_t ws_green;
uint8_t ws_blue;
uint8_t ws_ledtable;
uint8_t ws_dimmer;
uint8_t ws_fade;
uint8_t ws_speed;
uint8_t ws_scheme;
uint8_t ws_width;
uint16_t ws_wakeup;
uint16_t blinktime; // 39A
uint16_t blinkcount; // 39C
uint16_t ws_pixels; // 39E Not used since 5.8.0
uint8_t ws_red; // 3A0 Not used since 5.8.0
uint8_t ws_green; // 3A1 Not used since 5.8.0
uint8_t ws_blue; // 3A2 Not used since 5.8.0
uint8_t ws_ledtable; // 3A3 Not used since 5.8.0
uint8_t ws_dimmer; // 3A4 Not used since 5.8.0
uint8_t ws_fade; // 3A5 Not used since 5.8.0
uint8_t ws_speed; // 3A6 Not used since 5.8.0
uint8_t ws_scheme; // 3A7 Not used since 5.8.0
uint8_t ex_ws_width; // 3A8 Not used since 5.8.0
// 3.2.5
char friendlyname[4][33];
byte free_3A9[1]; // 3A9
// 3.2.8
char switch_topic[33];
byte ex_mqtt_switch_retain; // Not used since 5.0.2
uint8_t ex_mqtt_enabled; // Not used since 5.0.2
uint16_t ws_wakeup; // 3AA Not used since 5.8.0
char friendlyname[MAX_FRIENDLYNAMES][33]; // 3AC
char switch_topic[33]; // 430
// 3.2.12
uint8_t sleep;
byte free_451[2]; // 451
// 3.9.3
uint16_t domoticz_switch_idx[4];
uint16_t domoticz_sensor_idx[12];
uint8_t module;
mytmplt my_module;
uint16_t led_pixels;
uint8_t led_color[5];
uint8_t led_table;
uint8_t led_dimmer[3];
uint8_t led_fade;
uint8_t led_speed;
uint8_t led_scheme;
uint8_t led_width;
uint16_t led_wakeup;
uint8_t sleep; // 453
uint16_t domoticz_switch_idx[MAX_DOMOTICZ_IDX]; // 454
uint16_t domoticz_sensor_idx[12]; // 45C
uint8_t module; // 474
// 3.9.7
uint8_t ex_emulation; // Not used since 5.0.2
uint8_t ws_color[4][3]; // 475
uint8_t ws_width[3]; // 481
// 3.9.20
char web_password[33];
myio my_gp; // 484
uint16_t light_pixels; // 496
uint8_t light_color[5]; // 498
uint8_t light_correction; // 49D
uint8_t light_dimmer; // 49E
// 3.9.21
uint8_t switchmode[4];
byte free_49F[2]; // 49F
// 4.0.4
char ntp_server[3][33];
uint16_t pulsetime[MAX_PULSETIMERS];
uint8_t light_fade; // 4A1
uint8_t light_speed; // 4A2
uint8_t light_scheme; // 4A3
uint8_t light_width; // 4A4
// 4.0.7
uint16_t pwmvalue[5];
byte free_4A5[1]; // 4A5
// 4.0.9
uint32_t ip_address[4];
uint16_t light_wakeup; // 4A6
// 5.0.4
unsigned long hlw_kWhtotal;
byte free_4A8[1]; // 4A8
// 5.0.4a
char mqtt_fulltopic[101];
char web_password[33]; // 4A9
uint8_t switchmode[MAX_SWITCHES]; // 4CA
char ntp_server[3][33]; // 4CE
// 5.1.1
unsigned long pCounter[MAX_COUNTERS];
uint16_t pCounterType;
uint16_t pCounterDebounce;
byte free_531[1]; // 531
// 5.4.1
uint8_t sfb_code[17][9];
uint16_t pulse_timer[MAX_PULSETIMERS]; // 532
} sysCfg;
byte free_542[2]; // 542
uint32_t ip_address[4]; // 544
unsigned long hlw_kWhtotal; // 554
char mqtt_fulltopic[101]; // 558
byte free_5BD[3]; // 5BD
unsigned long pulse_counter[MAX_COUNTERS]; // 5C0
uint16_t pulse_counter_type; // 5D0
uint16_t pulse_counter_debounce; // 5D2
uint8_t rf_code[17][9]; // 5D4
} Settings;
struct RTCMEM {
uint16_t valid;
byte osw_flag;
uint8_t power;
unsigned long hlw_kWhtoday;
unsigned long hlw_kWhtotal;
unsigned long pCounter[MAX_COUNTERS];
} rtcMem;
uint16_t valid; // 000
byte oswatch_blocked_loop; // 002
uint8_t unused; // 003
unsigned long hlw_kWhtoday; // 004
unsigned long hlw_kWhtotal; // 008
unsigned long pulse_counter[MAX_COUNTERS]; // 00C
power_t power; // 01C
} RtcSettings;
struct TIME_T {
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t day_of_week; // sunday is day 1
uint8_t day_of_month;
uint8_t month;
char name_of_month[4];
uint16_t day_of_year;
uint16_t year;
unsigned long valid;
} RtcTime;
struct TimeChangeRule
{
uint8_t hemis; // 0-Northern, 1=Southern Hemisphere (=Opposite DST/STD)
uint8_t week; // 1=First, 2=Second, 3=Third, 4=Fourth, or 0=Last week of the month
uint8_t dow; // day of week, 1=Sun, 2=Mon, ... 7=Sat
uint8_t month; // 1=Jan, 2=Feb, ... 12=Dec
uint8_t hour; // 0-23
int offset; // offset from UTC in minutes
};
TimeChangeRule DaylightSavingTime = { TIME_DST }; // Daylight Saving Time
TimeChangeRule StandardTime = { TIME_STD }; // Standard Time
// See issue https://github.com/esp8266/Arduino/issues/2913
#ifdef USE_ADC_VCC
ADC_MODE(ADC_VCC); // Set ADC input for Power Supply Voltage usage
#endif
#endif // _SETTINGS_H_

File diff suppressed because it is too large Load Diff

116
sonoff/sonoff.h Normal file
View File

@ -0,0 +1,116 @@
/*
sonoff.h - Master header file for Sonoff-Tasmota
Copyright (C) 2017 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _SONOFF_H_
#define _SONOFF_H_
/*********************************************************************************************\
* Power Type
\*********************************************************************************************/
typedef unsigned long power_t; // Power (Relay) type
#define POWER_MASK 0xffffffffUL // Power (Relay) full mask
/*********************************************************************************************\
* Defines
\*********************************************************************************************/
// Changes to the following MAX_ defines will impact settings layout
#define MAX_RELAYS 8 // Max number of relays
#define MAX_LEDS 4 // Max number of leds
#define MAX_KEYS 4 // Max number of keys or buttons
#define MAX_SWITCHES 4 // Max number of switches
#define MAX_PWMS 5 // Max number of PWM channels
#define MAX_COUNTERS 4 // Max number of counter sensors
#define MAX_PULSETIMERS 8 // Max number of supported pulse timers
#define MAX_FRIENDLYNAMES 4 // Max number of Friendly names
#define MAX_DOMOTICZ_IDX 4 // Max number of Domoticz device, key and switch indices
#define MODULE SONOFF_BASIC // [Module] Select default model
#define MQTT_TOKEN_PREFIX "%prefix%" // To be substituted by mqtt_prefix[x]
#define MQTT_TOKEN_TOPIC "%topic%" // To be substituted by mqtt_topic, mqtt_grptopic, mqtt_buttontopic, mqtt_switchtopic
#define WIFI_HOSTNAME "%s-%04d" // Expands to <MQTT_TOPIC>-<last 4 decimal chars of MAC address>
#define CONFIG_FILE_SIGN 0xA5 // Configuration file signature
#define CONFIG_FILE_XOR 0x5A // Configuration file xor (0 = No Xor)
#define HLW_PREF_PULSE 12530 // was 4975us = 201Hz = 1000W
#define HLW_UREF_PULSE 1950 // was 1666us = 600Hz = 220V
#define HLW_IREF_PULSE 3500 // was 1666us = 600Hz = 4.545A
#define MQTT_RETRY_SECS 10 // Minimum seconds to retry MQTT connection
#define APP_POWER 0 // Default saved power state Off
#define WS2812_MAX_LEDS 512 // Max number of LEDs
#define PWM_RANGE 1023 // 255..1023 needs to be devisible by 256
//#define PWM_FREQ 1000 // 100..1000 Hz led refresh
//#define PWM_FREQ 910 // 100..1000 Hz led refresh (iTead value)
#define PWM_FREQ 880 // 100..1000 Hz led refresh (BN-SZ01 value)
#define MAX_POWER_HOLD 10 // Time in SECONDS to allow max agreed power (Pow)
#define MAX_POWER_WINDOW 30 // Time in SECONDS to disable allow max agreed power (Pow)
#define SAFE_POWER_HOLD 10 // Time in SECONDS to allow max unit safe power (Pow)
#define SAFE_POWER_WINDOW 30 // Time in MINUTES to disable allow max unit safe power (Pow)
#define MAX_POWER_RETRY 5 // Retry count allowing agreed power limit overflow (Pow)
#define STATES 20 // State loops per second
#define SYSLOG_TIMER 600 // Seconds to restore syslog_level
#define SERIALLOG_TIMER 600 // Seconds to disable SerialLog
#define OTA_ATTEMPTS 10 // Number of times to try fetching the new firmware
#define INPUT_BUFFER_SIZE 250 // Max number of characters in (serial) command buffer
#define CMDSZ 24 // Max number of characters in command
#define TOPSZ 100 // Max number of characters in topic string
#ifdef USE_MQTT_TLS
#define MAX_LOG_LINES 10 // Max number of lines in weblog
#else
#define MAX_LOG_LINES 20 // Max number of lines in weblog
#endif
#define MAX_BACKLOG 16 // Max number of commands in backlog (chk backlog_index and backlog_pointer code)
#define MIN_BACKLOG_DELAY 2 // Minimal backlog delay in 0.1 seconds
#define APP_BAUDRATE 115200 // Default serial baudrate
#define MAX_STATUS 11 // Max number of status lines
/*********************************************************************************************\
* Enumeration
\*********************************************************************************************/
enum WeekInMonthOptions {Last, First, Second, Third, Fourth};
enum DayOfTheWeekOptions {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat};
enum MonthNamesOptions {Jan=1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
enum HemisphereOptions {North, South};
enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL};
enum WifiConfigOptions {WIFI_RESTART, WIFI_SMARTCONFIG, WIFI_MANAGER, WIFI_WPSCONFIG, WIFI_RETRY, WIFI_WAIT, MAX_WIFI_OPTION};
enum SwitchModeOptions {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, MAX_SWITCH_OPTION};
enum LedStateOptions {LED_OFF, LED_POWER, LED_MQTTSUB, LED_POWER_MQTTSUB, LED_MQTTPUB, LED_POWER_MQTTPUB, LED_MQTT, LED_POWER_MQTT, MAX_LED_OPTION};
enum EmulationOptions {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX};
enum ButtonStates {PRESSED, NOT_PRESSED};
enum SettingsParmaIndex {P_HOLD_TIME, P_MAX_POWER_RETRY, P_MAX_PARAM8};
enum Ws2812ClockIndex {WS_SECOND, WS_MINUTE, WS_HOUR};
enum Ws2812Color {WS_RED, WS_GREEN, WS_BLUE};
enum LightTypes {LT_BASIC, LT_PWM1, LT_PWM2, LT_PWM3, LT_PWM4, LT_PWM5, LT_PWM6, LT_PWM7, LT_NU8, LT_NU9, LT_NU10, LT_WS2812, LT_RGBW, LT_RGBWC};
enum LichtSubtypes {LST_NONE, LST_SINGLE, LST_COLDWARM, LST_RGB, LST_RGBW, LST_RGBWC};
enum LichtSchemes {LS_POWER, LS_WAKEUP, LS_CYCLEUP, LS_CYCLEDN, LS_RANDOM, LS_MAX};
const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 };
#endif // _SONOFF_H_

File diff suppressed because it is too large Load Diff

102
sonoff/sonoff_post.h Normal file
View File

@ -0,0 +1,102 @@
/*
sonoff_post.h - Post header file for Sonoff-Tasmota
Copyright (C) 2017 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _SONOFF_POST_H_
#define _SONOFF_POST_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "user_interface.h"
// Function prototypes
void WifiWpsStatusCallback(wps_cb_status status);
#ifdef __cplusplus
}
#endif
#define USE_DHT // Default DHT11 sensor needs no external library
#ifndef USE_DS18x20
#define USE_DS18B20 // Default DS18B20 sensor needs no external library
#endif
//#define DEBUG_THEO // Add debug code
#ifdef BE_MINIMAL
#ifdef USE_MQTT_TLS
#undef USE_MQTT_TLS // Disable TLS support won't work as the MQTTHost is not set
#endif
#ifdef USE_DISCOVERY
#undef USE_DISCOVERY // Disable Discovery services for both MQTT and web server
#endif
#ifdef USE_DOMOTICZ
#undef USE_DOMOTICZ // Disable Domoticz
#endif
//#ifdef USE_WEBSERVER
//#undef USE_WEBSERVER // Disable Webserver
//#endif
#ifdef USE_EMULATION
#undef USE_EMULATION // Disable Wemo or Hue emulation
#endif
#ifdef USE_DS18x20
#undef USE_DS18x20 // Disable DS18x20 sensor
#endif
#ifdef USE_I2C
#undef USE_I2C // Disable all I2C sensors and devices
#endif
#ifdef USE_SPI
#undef USE_SPI // Disable all SPI devices
#endif
#ifdef USE_WS2812
#undef USE_WS2812 // Disable WS2812 Led string
#endif
#ifdef USE_DS18B20
#undef USE_DS18B20 // Disable internal DS18B20 sensor
#endif
#ifdef USE_DHT
#undef USE_DHT // Disable internal DHT sensor
#endif
#ifdef USE_IR_REMOTE
#undef USE_IR_REMOTE // Disable IR driver
#endif
#ifdef DEBUG_THEO
#undef DEBUG_THEO // Disable debug code
#endif
#endif // BE_MINIMAL
#ifndef SWITCH_MODE
#define SWITCH_MODE TOGGLE // TOGGLE, FOLLOW or FOLLOW_INV (the wall switch state)
#endif
#ifndef MQTT_FINGERPRINT
#define MQTT_FINGERPRINT "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07"
#endif
#ifndef WS2812_LEDS
#define WS2812_LEDS 30 // [Pixels] Number of LEDs
#endif
#ifndef MESSZ
#define MESSZ 405 // Max number of characters in JSON message string (4 x DS18x20 sensors)
#endif
#endif // _SONOFF_POST_H_

View File

@ -17,8 +17,11 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _SONOFF_TEMPLATE_H_
#define _SONOFF_TEMPLATE_H_
// User selectable GPIO functionality
enum upins_t {
enum UserSelectablePins {
GPIO_NONE, // Not used
GPIO_DHT11, // DHT11
GPIO_DHT21, // DHT21, AM2301
@ -40,10 +43,33 @@ enum upins_t {
GPIO_REL2,
GPIO_REL3,
GPIO_REL4,
GPIO_REL5,
GPIO_REL6,
GPIO_REL7,
GPIO_REL8,
GPIO_REL1_INV,
GPIO_REL2_INV,
GPIO_REL3_INV,
GPIO_REL4_INV,
GPIO_REL5_INV,
GPIO_REL6_INV,
GPIO_REL7_INV,
GPIO_REL8_INV,
GPIO_PWM1, // RGB Red or C Cold White
GPIO_PWM2, // RGB Green or CW Warm White
GPIO_PWM3, // RGB Blue
GPIO_PWM4, // RGBW (Cold) White
GPIO_PWM5, // RGBCW Warm White
GPIO_CNTR1,
GPIO_CNTR2,
GPIO_CNTR3,
GPIO_CNTR4,
GPIO_PWM1_INV, // RGB Red or C Cold White
GPIO_PWM2_INV, // RGB Green or CW Warm White
GPIO_PWM3_INV, // RGB Blue
GPIO_PWM4_INV, // RGBW (Cold) White
GPIO_PWM5_INV, // RGBCW Warm White
GPIO_IRRECV, // IR receiver
GPIO_LED1, // Leds
GPIO_LED2,
GPIO_LED3,
@ -52,19 +78,10 @@ enum upins_t {
GPIO_LED2_INV,
GPIO_LED3_INV,
GPIO_LED4_INV,
GPIO_PWM1, // Sonoff Led Cold
GPIO_PWM2, // Sonoff Led Warm
GPIO_PWM3, // Red (swapped with Blue from original)
GPIO_PWM4, // Green
GPIO_PWM5, // Blue (swapped with Red from original)
GPIO_CNTR1,
GPIO_CNTR2,
GPIO_CNTR3,
GPIO_CNTR4,
GPIO_SENSOR_END };
// Text in webpage Module Parameters and commands GPIOS and GPIO
const char sensors[GPIO_SENSOR_END][9] PROGMEM = {
const char kSensors[GPIO_SENSOR_END][9] PROGMEM = {
D_SENSOR_NONE,
D_SENSOR_DHT11,
D_SENSOR_AM2301,
@ -73,7 +90,7 @@ const char sensors[GPIO_SENSOR_END][9] PROGMEM = {
D_SENSOR_I2C_SCL,
D_SENSOR_I2C_SDA,
D_SENSOR_WS2812,
D_SENSOR_IRREMOTE,
D_SENSOR_IRSEND,
D_SENSOR_SWITCH "1",
D_SENSOR_SWITCH "2",
D_SENSOR_SWITCH "3",
@ -86,18 +103,18 @@ const char sensors[GPIO_SENSOR_END][9] PROGMEM = {
D_SENSOR_RELAY "2",
D_SENSOR_RELAY "3",
D_SENSOR_RELAY "4",
D_SENSOR_RELAY "1I",
D_SENSOR_RELAY "2I",
D_SENSOR_RELAY "3I",
D_SENSOR_RELAY "4I",
D_SENSOR_LED "1",
D_SENSOR_LED "2",
D_SENSOR_LED "3",
D_SENSOR_LED "4",
D_SENSOR_LED "1I",
D_SENSOR_LED "2I",
D_SENSOR_LED "3I",
D_SENSOR_LED "4I",
D_SENSOR_RELAY "5",
D_SENSOR_RELAY "6",
D_SENSOR_RELAY "7",
D_SENSOR_RELAY "8",
D_SENSOR_RELAY "1i",
D_SENSOR_RELAY "2i",
D_SENSOR_RELAY "3i",
D_SENSOR_RELAY "4i",
D_SENSOR_RELAY "5i",
D_SENSOR_RELAY "6i",
D_SENSOR_RELAY "7i",
D_SENSOR_RELAY "8i",
D_SENSOR_PWM "1",
D_SENSOR_PWM "2",
D_SENSOR_PWM "3",
@ -106,11 +123,25 @@ const char sensors[GPIO_SENSOR_END][9] PROGMEM = {
D_SENSOR_COUNTER "1",
D_SENSOR_COUNTER "2",
D_SENSOR_COUNTER "3",
D_SENSOR_COUNTER "4"
};
D_SENSOR_COUNTER "4",
D_SENSOR_PWM "1i",
D_SENSOR_PWM "2i",
D_SENSOR_PWM "3i",
D_SENSOR_PWM "4i",
D_SENSOR_PWM "5i",
D_SENSOR_IRRECV,
D_SENSOR_LED "1",
D_SENSOR_LED "2",
D_SENSOR_LED "3",
D_SENSOR_LED "4",
D_SENSOR_LED "1i",
D_SENSOR_LED "2i",
D_SENSOR_LED "3i",
D_SENSOR_LED "4i"
};
// Programmer selectable GPIO functionality offset by user selectable GPIOs
enum fpins_t {
enum ProgramSelectablePins {
GPIO_RXD = GPIO_SENSOR_END, // Serial interface
GPIO_TXD, // Serial interface
GPIO_HLW_SEL, // HLW8012 Sel output (Sonoff Pow)
@ -125,7 +156,7 @@ enum fpins_t {
/********************************************************************************************/
// Supported hardware modules
enum module_t {
enum SupportedModules {
SONOFF_BASIC,
SONOFF_RF,
SONOFF_SV,
@ -159,12 +190,18 @@ enum module_t {
SUPLA1,
WITTY,
YUNSHAN,
MAGICHOME,
LUANIHVIO,
KMC_70011,
ARILUX,
MAXMODULE };
/********************************************************************************************/
#define MAX_GPIO_PIN 18 // Number of supported GPIO
const char PINS_WEMOS[] PROGMEM = "D3TXD4RXD2D1flashcontrolD6D7D5D8D0A0";
typedef struct MYIO {
uint8_t io[MAX_GPIO_PIN];
} myio;
@ -174,7 +211,7 @@ typedef struct MYTMPLT {
myio gp;
} mytmplt;
const uint8_t nicelist[MAXMODULE] PROGMEM = {
const uint8_t kNiceList[MAXMODULE] PROGMEM = {
SONOFF_BASIC,
SONOFF_RF,
SONOFF_TH,
@ -201,17 +238,21 @@ const uint8_t nicelist[MAXMODULE] PROGMEM = {
ELECTRODRAGON,
EXS_RELAY,
SUPLA1,
LUANIHVIO,
YUNSHAN,
WION,
H801,
MAGICHOME,
ARILUX,
HUAFAN_SS,
KMC_70011,
AILIGHT,
WEMOS,
WITTY
};
// Default module settings
const mytmplt modules[MAXMODULE] PROGMEM = {
const mytmplt kModules[MAXMODULE] PROGMEM = {
{ "Sonoff Basic", // Sonoff Basic (ESP8266)
GPIO_KEY1, // GPIO00 Button
GPIO_USER, // GPIO01 Serial RXD and Optional sensor
@ -465,13 +506,13 @@ const mytmplt modules[MAXMODULE] PROGMEM = {
GPIO_LED1, // GPIO01 Green LED
GPIO_TXD, // GPIO02 RX - Pin next to TX on the PCB
GPIO_RXD, // GPIO03 TX - Pin next to GND on the PCB
GPIO_PWM2, // GPIO04 W2
GPIO_USER, // GPIO04 W2 - PWM5
GPIO_LED2_INV, // GPIO05 Red LED
0, 0, 0, 0, 0, 0, // Flash connection
GPIO_PWM3, // GPIO12 Blue
GPIO_PWM4, // GPIO13 Green
GPIO_PWM1, // GPIO14 W1
GPIO_PWM5, // GPIO15 Red
GPIO_PWM2, // GPIO13 Green
GPIO_USER, // GPIO14 W1 - PWM4
GPIO_PWM1, // GPIO15 Red
0, 0
},
{ "Sonoff SC", // Sonoff SC (ESP8266)
@ -633,10 +674,10 @@ const mytmplt modules[MAXMODULE] PROGMEM = {
GPIO_KEY1, // GPIO04 D2 push button on ESP-12F board
GPIO_USER, // GPIO05 D1 optional sensor
0, 0, 0, 0, 0, 0, // Flash connection
GPIO_PWM4, // GPIO12 D6 RGB LED Green
GPIO_PWM5, // GPIO13 D7 RGB LED Blue
GPIO_PWM2, // GPIO12 D6 RGB LED Green
GPIO_PWM3, // GPIO13 D7 RGB LED Blue
GPIO_USER, // GPIO14 D5 optional sensor
GPIO_PWM3, // GPIO15 D8 RGB LED Red
GPIO_PWM1, // GPIO15 D8 RGB LED Red
GPIO_USER, // GPIO16 D0 optional sensor
GPIO_ADC0 // ADC0 A0 Light sensor / Requires USE_ADC_VCC in user_config.h to be disabled
},
@ -650,6 +691,55 @@ const mytmplt modules[MAXMODULE] PROGMEM = {
GPIO_KEY1, // GPIO05 Blue Led and OptoCoupler input - Module Pin 9
0, 0, 0, 0, 0, 0, // Flash connection
0, 0, 0, 0, 0
},
{ "MagicHome", // Magic Home (aka Flux-light) (ESP8266) - https://www.aliexpress.com/item/Magic-Home-Mini-RGB-RGBW-Wifi-Controller-For-Led-Strip-Panel-light-Timing-Function-16million-colors/32686853650.html
0, 0,
GPIO_LED1_INV, // GPIO02 Blue onboard LED
0,
GPIO_USER, // GPIO04 IR receiver (optional)
GPIO_PWM2, // GPIO05 RGB LED Green
0, 0, 0, 0, 0, 0, // Flash connection
GPIO_PWM3, // GPIO12 RGB LED Blue
GPIO_USER, // GPIO13 RGBW LED White (optional - set to PWM4 for Cold White or Warm White)
GPIO_PWM1, // GPIO14 RGB LED Red
0, 0, 0
},
{ "Luani HVIO", // ESP8266_HVIO - https://luani.de/projekte/esp8266-hvio/
0, // GPIO00 Flash jumper
GPIO_USER, // GPIO01 Serial RXD and Optional sensor
GPIO_USER, // GPIO02 Optional sensor / I2C SDA pad
GPIO_USER, // GPIO03 Serial TXD and Optional sensor
GPIO_REL1, // GPIO04 Relay 1 (0 = Off, 1 = On)
GPIO_REL2, // GPIO05 Relay 2 (0 = Off, 1 = On)
0, 0, 0, 0, 0, 0, // Flash connection
GPIO_SWT1, // GPIO12 External input 1 (0 = On, 1 = Off)
GPIO_SWT2, // GPIO13 External input 2 (0 = On, 1 = Off)
GPIO_USER, // GPIO14 Optional sensor / I2C SCL pad
GPIO_LED1, // GPIO15 Led (1 = On, 0 = Off)
0,
GPIO_ADC0 // ADC0 A0 Analog input
},
{ "KMC 70011", // KMC 70011 (https://www.amazon.com/KMC-Timing-Monitoring-Network-125V-240V/dp/B06XRX2GTQ)
GPIO_KEY1, // GPIO00 Button
0, 0, 0,
GPIO_HLW_CF, // GPIO04 HLW8012 CF
GPIO_HLW_CF1, // GPIO05 HLW8012 CF1
0, 0, 0, 0, 0, 0, // Flash connection
GPIO_HLW_SEL, // GPIO12 HLW8012 SEL
GPIO_LED1_INV, // GPIO13 Green Led
GPIO_REL1, // GPIO14 Relay
0, 0, 0
},
{ "Arilux", // Arilux AL-LC01 (ESP8285) - https://www.banggood.com/nl/ARILUX-AL-LC01-Super-Mini-LED-WIFI-Smart-RGB-Controller-For-RGB-LED-Strip-Light-DC-9-12V-p-1058603.html
0, 0, 0, 0, // (PwmFrequency 1111Hz)
GPIO_USER, // GPIO04 IR or RF receiver (optional)
GPIO_PWM1, // GPIO05 RGB LED Red
0, 0, 0, 0, 0, 0, // Flash connection
GPIO_PWM2, // GPIO12 RGB LED Green
GPIO_PWM3, // GPIO13 RGB LED Blue
GPIO_USER, // GPIO14 RGBW LED White (optional - set to PWM4 for Cold White or Warm White)
0, 0, 0
}
};
#endif // _SONOFF_TEMPLATE_H_

View File

@ -1,36 +0,0 @@
/*
support.h - parameters used by platformio for Sonoff-Tasmota
Copyright (C) 2017 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef __cplusplus
extern "C" {
#endif
#ifndef __SUPPORT_H__
#define __SUPPORT_H__
#include "user_interface.h"
/* Function prototypes. */
void WIFI_wps_status_cb(wps_cb_status status);
#endif // ifndef __SUPPORT_H__
#ifdef __cplusplus
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -17,6 +17,9 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _USER_CONFIG_H_
#define _USER_CONFIG_H_
/*********************************************************************************************\
* ATTENTION: Changes to most PARAMETER defines will only override flash settings if you change
* define CFG_HOLDER.
@ -26,8 +29,10 @@
\*********************************************************************************************/
// -- Localization --------------------------------
//#define MY_LANGUAGE en-GB // Enabled by Default
//#define MY_LANGUAGE nl-NL
//#define MY_LANGUAGE en-GB // English in Great Britain. Enabled by Default
//#define MY_LANGUAGE nl-NL // Dutch in the Netherlands
//#define MY_LANGUAGE de-DE // German in Germany
//#define MY_LANGUAGE pl-PL // Polish in Poland
// -- Project -------------------------------------
#define PROJECT "sonoff" // PROJECT is used as the default topic delimiter and OTA file name
@ -39,7 +44,7 @@
// -- Wifi ----------------------------------------
#define WIFI_IP_ADDRESS "0.0.0.0" // [IpAddress1] Set to 0.0.0.0 for using DHCP or IP address
#define WIFI_GATEWAY "192.168.2.254" // {IpAddress2] If not using DHCP set Gateway IP address
#define WIFI_GATEWAY "192.168.2.254" // [IpAddress2] If not using DHCP set Gateway IP address
#define WIFI_SUBNETMASK "255.255.255.0" // [IpAddress3] If not using DHCP set Network mask
#define WIFI_DNS "192.168.2.27" // [IpAddress4] If not using DHCP set DNS IP address (might be equal to WIFI_GATEWAY)
@ -105,13 +110,13 @@
#define TELE_PERIOD 300 // [TelePeriod] Telemetry (0 = disable, 10 - 3600 seconds)
// -- MQTT - Domoticz -----------------------------
#define USE_DOMOTICZ // Enable Domoticz (+7k code, +0.3k mem) - Disable by //
#define USE_DOMOTICZ // Enable Domoticz (+6k code, +0.3k mem) - Disable by //
#define DOMOTICZ_IN_TOPIC "domoticz/in" // Domoticz Input Topic
#define DOMOTICZ_OUT_TOPIC "domoticz/out" // Domoticz Output Topic
#define DOMOTICZ_UPDATE_TIMER 0 // [DomoticzUpdateTimer] Send relay status (0 = disable, 1 - 3600 seconds) (Optional)
// -- HTTP ----------------------------------------
#define USE_WEBSERVER // Enable web server and wifi manager (+62k code, +8k mem) - Disable by //
#define USE_WEBSERVER // Enable web server and wifi manager (+66k code, +8k mem) - Disable by //
#define WEB_SERVER 2 // [WebServer] Web server (0 = Off, 1 = Start as User, 2 = Start as Admin)
#define WEB_PORT 80 // Web server Port for User and Admin mode
#define WEB_USERNAME "admin" // Web server Admin mode user name
@ -131,10 +136,10 @@
#define NTP_SERVER3 "0.nl.pool.ntp.org" // [NtpServer3] Select third NTP server by name or IP address (93.94.224.67)
// -- Time - Start Daylight Saving Time and timezone offset from UTC in minutes
#define TIME_DST Last, Sun, Mar, 2, +120 // Last sunday in march at 02:00 +120 minutes
#define TIME_DST North, Last, Sun, Mar, 2, +120 // Northern Hemisphere, Last sunday in march at 02:00 +120 minutes
// -- Time - Start Standard Time and timezone offset from UTC in minutes
#define TIME_STD Last, Sun, Oct, 3, +60 // Last sunday in october 02:00 +60 minutes
#define TIME_STD North, Last, Sun, Oct, 3, +60 // Northern Hemisphere, Last sunday in october 02:00 +60 minutes
// -- Application ---------------------------------
#define APP_TIMEZONE 1 // [Timezone] +1 hour (Amsterdam) (-12 .. 12 = hours from UTC, 99 = use TIME_DST/TIME_STD)
@ -162,17 +167,18 @@
#define USE_I2C // I2C using library wire (+10k code, 0.2k mem) - Disable by //
#define USE_BH1750 // Add I2C code for BH1750 sensor
// #define USE_VEML6070 // Add I2C code for VEML6070 sensor (+0.5k code)
#define USE_BMP // Add I2C code for BMP/BME280 sensor
#define USE_HTU // Add I2C code for HTU21/SI7013/SI7020/SI7021 sensor
#define USE_SHT // Add I2C emulating code for SHT1X sensor
#define USE_IR_REMOTE // Send IR remote commands using library IRremoteESP8266 and ArduinoJson (+3k code, 0.3k mem)
// #define USE_IR_HVAC // Support for HVAC system using IR (+2k code)
#define USE_IR_RECEIVE // Support for IR receiver (+4k code)
#define USE_WS2812 // WS2812 Led string using library NeoPixelBus (+5k code, +1k mem) - Disable by //
#define USE_WS2812_CTYPE 1 // WS2812 Color type (0 - RGB, 1 - GRB)
// #define USE_WS2812_DMA // DMA supports only GPIO03 (= Serial RXD) (+1k mem)
// When USE_WS2812_DMA is enabled expect Exceptions on Pow
// #define USE_WS2812_DMA // DMA supports only GPIO03 (= Serial RXD) (+1k mem). When USE_WS2812_DMA is enabled expect Exceptions on Pow
/*********************************************************************************************\
* Compile a minimal version if upgrade memory gets tight ONLY TO BE USED FOR UPGRADE STEP 1!
@ -191,7 +197,4 @@
#error "Select either USE_MQTT_TLS or USE_WEBSERVER as there is just not enough memory to play with"
#endif
#if (ARDUINO < 10610)
#error "This software is supported with Arduino IDE starting from 1.6.10 and ESP8266 Release 2.3.0"
#endif
#endif // _USER_CONFIG_H_

View File

@ -17,6 +17,9 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _USER_CONFIG_OVERRIDE_H_
#define _USER_CONFIG_OVERRIDE_H_
/*****************************************************************************************************\
* ATTENTION: - Changes to most PARAMETER defines will only override flash settings if you change
* define CFG_HOLDER.
@ -38,3 +41,4 @@
//#endif
//#define STA_SSID1 "yourssid1"
#endif // _USER_CONFIG_OVERRIDE_H_

File diff suppressed because it is too large Load Diff

View File

@ -19,26 +19,31 @@
#ifdef USE_DOMOTICZ
#define DOMOTICZ_MAX_SENSORS 6
#ifdef USE_WEBSERVER
const char HTTP_FORM_DOMOTICZ[] PROGMEM =
"<fieldset><legend><b>&nbsp;" D_DOMOTICZ_PARAMETERS "&nbsp;</b></legend><form method='post' action='sv'>"
"<input id='w' name='w' value='4' hidden><input id='r' name='r' value='1' hidden>"
"<br/><table style='width:97%'>";
"<br/><table>";
const char HTTP_FORM_DOMOTICZ_RELAY[] PROGMEM =
"<tr><td><b>" D_DOMOTICZ_IDX " {1</b></td></td><td width='20%'><input id='r{1' name='r{1' length=8 placeholder='0' value='{2'></td></tr>"
"<tr><td><b>" D_DOMOTICZ_KEY_IDX " {1</b></td><td><input id='k{1' name='k{1' length=8 placeholder='0' value='{3'></td></tr>";
const char HTTP_FORM_DOMOTICZ_SWITCH[] PROGMEM =
"<tr><td><b>" D_DOMOTICZ_SWITCH_IDX " {1</b></td><td width='20%'><input id='s{1' name='s{1' length=8 placeholder='0' value='{4'></td></tr>";
"<tr><td width='260'><b>" D_DOMOTICZ_IDX " {1</b></td><td width='70'><input id='r{1' name='r{1' placeholder='0' value='{2'></td></tr>"
"<tr><td width='260'><b>" D_DOMOTICZ_KEY_IDX " {1</b></td><td width='70'><input id='k{1' name='k{1' placeholder='0' value='{3'></td></tr>";
const char HTTP_FORM_DOMOTICZ_SWITCH[] PROGMEM =
"<tr><td width='260'><b>" D_DOMOTICZ_SWITCH_IDX " {1</b></td><td width='70'><input id='s{1' name='s{1' placeholder='0' value='{4'></td></tr>";
const char HTTP_FORM_DOMOTICZ_SENSOR[] PROGMEM =
"<tr><td><b>" D_DOMOTICZ_SENSOR_IDX " {1</b> - {2</td><td width='20%'><input id='l{1' name='l{1' length=8 placeholder='0' value='{5'></td></tr>";
"<tr><td width='260'><b>" D_DOMOTICZ_SENSOR_IDX " {1</b> {2</td><td width='70'><input id='l{1' name='l{1' placeholder='0' value='{5'></td></tr>";
const char HTTP_FORM_DOMOTICZ_TIMER[] PROGMEM =
"<tr><td><b>" D_DOMOTICZ_UPDATE_TIMER "</b> (" STR(DOMOTICZ_UPDATE_TIMER) ")</td><td><input id='ut' name='ut' length=32 placeholder='" STR(DOMOTICZ_UPDATE_TIMER) "' value='{6'</td></tr>";
"<tr><td width='260'><b>" D_DOMOTICZ_UPDATE_TIMER "</b> (" STR(DOMOTICZ_UPDATE_TIMER) ")</td><td width='70'><input id='ut' name='ut' placeholder='" STR(DOMOTICZ_UPDATE_TIMER) "' value='{6'</td></tr>";
#endif // USE_WEBSERVER
const char domoticz_sensors[DOMOTICZ_MAX_SENSORS][DOMOTICZ_SENSORS_MAX_STRING_LENGTH] PROGMEM =
{ D_DOMOTICZ_TEMP, D_DOMOTICZ_TEMP_HUM, D_DOMOTICZ_TEMP_HUM_BARO, D_DOMOTICZ_POWER_ENERGY, D_DOMOTICZ_ILLUMINANCE, D_DOMOTICZ_COUNT };
enum DomoticzCommands {
CMND_IDX, CMND_KEYIDX, CMND_SWITCHIDX, CMND_SENSORIDX, CMND_UPDATETIMER };
const char kDomoticzCommands[] PROGMEM =
D_CMND_IDX "|" D_CMND_KEYIDX "|" D_CMND_SWITCHIDX "|" D_CMND_SENSORIDX "|" D_CMND_UPDATETIMER ;
enum DomoticzSensors {DZ_TEMP, DZ_TEMP_HUM, DZ_TEMP_HUM_BARO, DZ_POWER_ENERGY, DZ_ILLUMINANCE, DZ_COUNT, DZ_VOLTAGE, DZ_CURRENT, DZ_MAX_SENSORS};
const char kDomoticzSensors[] PROGMEM =
D_DOMOTICZ_TEMP "|" D_DOMOTICZ_TEMP_HUM "|" D_DOMOTICZ_TEMP_HUM_BARO "|" D_DOMOTICZ_POWER_ENERGY "|" D_DOMOTICZ_ILLUMINANCE "|" D_DOMOTICZ_COUNT "|" D_DOMOTICZ_VOLTAGE "|" D_DOMOTICZ_CURRENT ;
char domoticz_in_topic[] = DOMOTICZ_IN_TOPIC;
char domoticz_out_topic[] = DOMOTICZ_OUT_TOPIC;
@ -47,69 +52,62 @@ boolean domoticz_subscribe = false;
int domoticz_update_timer = 0;
byte domoticz_update_flag = 1;
void mqtt_publishDomoticzPowerState(byte device)
void MqttPublishDomoticzPowerState(byte device)
{
if (sysCfg.flag.mqtt_enabled && sysCfg.domoticz_relay_idx[device -1]) {
if ((device < 1) || (device > Maxdevice)) {
device = 1;
}
if (sfl_flg) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"idx\":%d,\"nvalue\":2,\"svalue\":\"%d\"}"),
sysCfg.domoticz_relay_idx[device -1], sysCfg.led_dimmer[device -1]);
mqtt_publish(domoticz_in_topic);
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"idx\":%d,\"nvalue\":%d,\"svalue\":\"\"}"),
sysCfg.domoticz_relay_idx[device -1], (power & (0x01 << (device -1))) ? 1 : 0);
mqtt_publish(domoticz_in_topic);
char sdimmer[8];
if ((device < 1) || (device > devices_present)) {
device = 1;
}
if (Settings.flag.mqtt_enabled && Settings.domoticz_relay_idx[device -1]) {
snprintf_P(sdimmer, sizeof(sdimmer), PSTR("%d"), Settings.light_dimmer);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"idx\":%d,\"nvalue\":%d,\"svalue\":\"%s\"}"),
Settings.domoticz_relay_idx[device -1], (power & (1 << (device -1))) ? 1 : 0, (light_type) ? sdimmer : "");
MqttPublish(domoticz_in_topic);
}
}
void domoticz_updatePowerState(byte device)
void DomoticzUpdatePowerState(byte device)
{
if (domoticz_update_flag) {
mqtt_publishDomoticzPowerState(device);
MqttPublishDomoticzPowerState(device);
}
domoticz_update_flag = 1;
}
void domoticz_mqttUpdate()
void DomoticzMqttUpdate()
{
if (domoticz_subscribe && (sysCfg.domoticz_update_timer || domoticz_update_timer)) {
if (domoticz_subscribe && (Settings.domoticz_update_timer || domoticz_update_timer)) {
domoticz_update_timer--;
if (domoticz_update_timer <= 0) {
domoticz_update_timer = sysCfg.domoticz_update_timer;
for (byte i = 1; i <= Maxdevice; i++) {
mqtt_publishDomoticzPowerState(i);
domoticz_update_timer = Settings.domoticz_update_timer;
for (byte i = 1; i <= devices_present; i++) {
MqttPublishDomoticzPowerState(i);
}
}
}
}
void domoticz_setUpdateTimer(uint16_t value)
void DomoticzSetUpdateTimer(uint16_t value)
{
domoticz_update_timer = value;
}
void domoticz_mqttSubscribe()
void DomoticzMqttSubscribe()
{
for (byte i = 0; i < Maxdevice; i++) {
if (sysCfg.domoticz_relay_idx[i]) {
uint8_t maxdev = (devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : devices_present;
for (byte i = 0; i < maxdev; i++) {
if (Settings.domoticz_relay_idx[i]) {
domoticz_subscribe = true;
}
}
if (domoticz_subscribe) {
char stopic[TOPSZ];
snprintf_P(stopic, sizeof(stopic), PSTR("%s/#"), domoticz_out_topic); // domoticz topic
mqttClient.subscribe(stopic);
mqttClient.loop(); // Solve LmacRxBlk:1 messages
MqttSubscribe(stopic);
}
}
boolean domoticz_update()
{
return domoticz_update_flag;
}
/*
* ArduinoJSON Domoticz Switch entry used to calculate jsonBuf: JSON_OBJECT_SIZE(11) + 129 = 313
{
@ -127,7 +125,7 @@ boolean domoticz_update()
}
*/
boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uint16_t sdataBuf)
boolean DomoticzMqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uint16_t sdataBuf)
{
char stemp1[10];
char scommand[10];
@ -136,7 +134,7 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
int16_t found = 0;
domoticz_update_flag = 1;
if (!strncmp(topicBuf, domoticz_out_topic, strlen(domoticz_out_topic)) != 0) {
if (!strncmp(topicBuf, domoticz_out_topic, strlen(domoticz_out_topic))) {
if (sdataBuf < 20) {
return 1;
}
@ -152,25 +150,26 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
nvalue = domoticz["nvalue"];
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DOMOTICZ "idx %d, nvalue %d"), idx, nvalue);
addLog(LOG_LEVEL_DEBUG_MORE);
AddLog(LOG_LEVEL_DEBUG_MORE);
if (nvalue >= 0 && nvalue <= 2) {
for (byte i = 0; i < Maxdevice; i++) {
if ((idx > 0) && (idx == sysCfg.domoticz_relay_idx[i])) {
if ((idx > 0) && (nvalue >= 0) && (nvalue <= 2)) {
uint8_t maxdev = (devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : devices_present;
for (byte i = 0; i < maxdev; i++) {
if (idx == Settings.domoticz_relay_idx[i]) {
snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1);
if (2 == nvalue) {
nvalue = domoticz["svalue1"];
if (sfl_flg && (sysCfg.led_dimmer[i] == nvalue)) {
if (light_type && (Settings.light_dimmer == nvalue) && ((power >> i) &1)) {
return 1;
}
snprintf_P(topicBuf, stopicBuf, PSTR("/" D_CMND_DIMMER "%s"), (Maxdevice > 1) ? stemp1 : "");
snprintf_P(topicBuf, stopicBuf, PSTR("/" D_CMND_DIMMER));
snprintf_P(dataBuf, sdataBuf, PSTR("%d"), nvalue);
found = 1;
} else {
if (((power >> i) &1) == nvalue) {
return 1;
}
snprintf_P(topicBuf, stopicBuf, PSTR("/" D_CMND_POWER "%s"), (Maxdevice > 1) ? stemp1 : "");
snprintf_P(topicBuf, stopicBuf, PSTR("/" D_CMND_POWER "%s"), (devices_present > 1) ? stemp1 : "");
snprintf_P(dataBuf, sdataBuf, PSTR("%d"), nvalue);
found = 1;
}
@ -183,7 +182,7 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
}
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DOMOTICZ D_RECEIVED_TOPIC " %s, " D_DATA " %s"), topicBuf, dataBuf);
addLog(LOG_LEVEL_DEBUG_MORE);
AddLog(LOG_LEVEL_DEBUG_MORE);
domoticz_update_flag = 0;
}
@ -194,42 +193,44 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
* Commands
\*********************************************************************************************/
boolean domoticz_command(const char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
boolean DomoticzCommand(const char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
{
char command [CMDSZ];
boolean serviced = true;
uint8_t dmtcz_len = strlen(D_CMND_DOMOTICZ); // Prep for string length change
if (!strncasecmp_P(type, PSTR(D_CMND_DOMOTICZ), dmtcz_len)) { // Prefix
if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_IDX)) && (index > 0) && (index <= Maxdevice)) {
int command_code = GetCommandCode(command, sizeof(command), type +dmtcz_len, kDomoticzCommands);
if ((CMND_IDX == command_code) && (index > 0) && (index <= MAX_DOMOTICZ_IDX)) {
if (payload >= 0) {
sysCfg.domoticz_relay_idx[index -1] = payload;
restartflag = 2;
Settings.domoticz_relay_idx[index -1] = payload;
restart_flag = 2;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ D_CMND_IDX "%d\":%d}"), index, sysCfg.domoticz_relay_idx[index -1]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ "%s%d\":%d}"), command, index, Settings.domoticz_relay_idx[index -1]);
}
else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_KEYIDX)) && (index > 0) && (index <= Maxdevice)) {
else if ((CMND_KEYIDX == command_code) && (index > 0) && (index <= MAX_DOMOTICZ_IDX)) {
if (payload >= 0) {
sysCfg.domoticz_key_idx[index -1] = payload;
Settings.domoticz_key_idx[index -1] = payload;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ D_CMND_KEYIDX "%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ "%s%d\":%d}"), command, index, Settings.domoticz_key_idx[index -1]);
}
else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_SWITCHIDX)) && (index > 0) && (index <= Maxdevice)) {
else if ((CMND_SWITCHIDX == command_code) && (index > 0) && (index <= MAX_DOMOTICZ_IDX)) {
if (payload >= 0) {
sysCfg.domoticz_switch_idx[index -1] = payload;
Settings.domoticz_switch_idx[index -1] = payload;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ D_CMND_SWITCHIDX "%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ "%s%d\":%d}"), command, index, Settings.domoticz_key_idx[index -1]);
}
else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_SENSORIDX)) && (index > 0) && (index <= DOMOTICZ_MAX_SENSORS)) {
else if ((CMND_SENSORIDX == command_code) && (index > 0) && (index <= DZ_MAX_SENSORS)) {
if (payload >= 0) {
sysCfg.domoticz_sensor_idx[index -1] = payload;
Settings.domoticz_sensor_idx[index -1] = payload;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ D_CMND_SENSORIDX "%d\":%d}"), index, sysCfg.domoticz_sensor_idx[index -1]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ "%s%d\":%d}"), command, index, Settings.domoticz_sensor_idx[index -1]);
}
else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_UPDATETIMER))) {
else if (CMND_UPDATETIMER == command_code) {
if ((payload >= 0) && (payload < 3601)) {
sysCfg.domoticz_update_timer = payload;
Settings.domoticz_update_timer = payload;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ D_CMND_UPDATETIMER "\":%d}"), sysCfg.domoticz_update_timer);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ "%s\":%d}"), command, Settings.domoticz_update_timer);
}
else serviced = false;
}
@ -237,12 +238,12 @@ boolean domoticz_command(const char *type, uint16_t index, char *dataBuf, uint16
return serviced;
}
boolean domoticz_button(byte key, byte device, byte state, byte svalflg)
boolean DomoticzButton(byte key, byte device, byte state, byte svalflg)
{
if ((sysCfg.domoticz_key_idx[device -1] || sysCfg.domoticz_switch_idx[device -1]) && (svalflg)) {
if ((Settings.domoticz_key_idx[device -1] || Settings.domoticz_switch_idx[device -1]) && (svalflg)) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"command\":\"switchlight\",\"idx\":%d,\"switchcmd\":\"%s\"}"),
(key) ? sysCfg.domoticz_switch_idx[device -1] : sysCfg.domoticz_key_idx[device -1], (state) ? (2 == state) ? "Toggle" : "On" : "Off");
mqtt_publish(domoticz_in_topic);
(key) ? Settings.domoticz_switch_idx[device -1] : Settings.domoticz_key_idx[device -1], (state) ? (2 == state) ? "Toggle" : "On" : "Off");
MqttPublish(domoticz_in_topic);
return 1;
} else {
return 0;
@ -253,63 +254,51 @@ boolean domoticz_button(byte key, byte device, byte state, byte svalflg)
* Sensors
\*********************************************************************************************/
uint8_t dom_hum_stat(char *hum)
uint8_t DomoticzHumidityState(char *hum)
{
uint8_t h = atoi(hum);
return (!h) ? 0 : (h < 40) ? 2 : (h > 70) ? 3 : 1;
}
void dom_sensor(byte idx, char *data)
void DomoticzSensor(byte idx, char *data)
{
if (sysCfg.domoticz_sensor_idx[idx]) {
if (Settings.domoticz_sensor_idx[idx]) {
char dmess[64];
memcpy(dmess, mqtt_data, sizeof(dmess));
snprintf_P(mqtt_data, sizeof(dmess), PSTR("{\"idx\":%d,\"nvalue\":0,\"svalue\":\"%s\"}"),
sysCfg.domoticz_sensor_idx[idx], data);
mqtt_publish(domoticz_in_topic);
Settings.domoticz_sensor_idx[idx], data);
MqttPublish(domoticz_in_topic);
memcpy(mqtt_data, dmess, sizeof(dmess));
}
}
void domoticz_sensor1(char *temp)
{
dom_sensor(0, temp);
}
void domoticz_sensor2(char *temp, char *hum)
void DomoticzSensor(byte idx, uint32_t value)
{
char data[16];
snprintf_P(data, sizeof(data), PSTR("%s;%s;%d"), temp, hum, dom_hum_stat(hum));
dom_sensor(1, data);
snprintf_P(data, sizeof(data), PSTR("%d"), value);
DomoticzSensor(idx, data);
}
void domoticz_sensor3(char *temp, char *hum, char *baro)
void DomoticzTempHumSensor(char *temp, char *hum)
{
char data[16];
snprintf_P(data, sizeof(data), PSTR("%s;%s;%d"), temp, hum, DomoticzHumidityState(hum));
DomoticzSensor(DZ_TEMP_HUM, data);
}
void DomoticzTempHumPressureSensor(char *temp, char *hum, char *baro)
{
char data[32];
snprintf_P(data, sizeof(data), PSTR("%s;%s;%d;%s;5"), temp, hum, dom_hum_stat(hum), baro);
dom_sensor(2, data);
snprintf_P(data, sizeof(data), PSTR("%s;%s;%d;%s;5"), temp, hum, DomoticzHumidityState(hum), baro);
DomoticzSensor(DZ_TEMP_HUM_BARO, data);
}
void domoticz_sensor4(uint16_t power, char *energy)
void DomoticzSensorPowerEnergy(uint16_t power, char *energy)
{
char data[16];
snprintf_P(data, sizeof(data), PSTR("%d;%s"), power, energy);
dom_sensor(3, data);
}
void domoticz_sensor5(uint16_t lux)
{
char data[8];
snprintf_P(data, sizeof(data), PSTR("%d"), lux);
dom_sensor(4, data);
}
void domoticz_sensor6(uint32_t count)
{
char data[16];
snprintf_P(data, sizeof(data), PSTR("%d"), count);
dom_sensor(5, data);
DomoticzSensor(DZ_POWER_ENERGY, data);
}
/*********************************************************************************************\
@ -319,73 +308,73 @@ void domoticz_sensor6(uint32_t count)
#ifdef USE_WEBSERVER
const char S_CONFIGURE_DOMOTICZ[] PROGMEM = D_CONFIGURE_DOMOTICZ;
void handleDomoticz()
void HandleDomoticzConfiguration()
{
if (HTTP_USER == _httpflag) {
handleRoot();
if (HTTP_USER == webserver_state) {
HandleRoot();
return;
}
addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_DOMOTICZ);
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_DOMOTICZ);
char stemp[20];
char stemp[32];
char *sensortype;
String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), FPSTR(S_CONFIGURE_DOMOTICZ));
page += FPSTR(HTTP_FORM_DOMOTICZ);
for (int i = 0; i < 4; i++) {
if (i < Maxdevice) {
for (int i = 0; i < MAX_DOMOTICZ_IDX; i++) {
if (i < devices_present) {
page += FPSTR(HTTP_FORM_DOMOTICZ_RELAY);
page.replace("{2", String((int)sysCfg.domoticz_relay_idx[i]));
page.replace("{3", String((int)sysCfg.domoticz_key_idx[i]));
page.replace("{2", String((int)Settings.domoticz_relay_idx[i]));
page.replace("{3", String((int)Settings.domoticz_key_idx[i]));
}
if (pin[GPIO_SWT1 +i] < 99) {
page += FPSTR(HTTP_FORM_DOMOTICZ_SWITCH);
page.replace("{4", String((int)sysCfg.domoticz_switch_idx[i]));
page.replace("{4", String((int)Settings.domoticz_switch_idx[i]));
}
page.replace("{1", String(i +1));
}
for (int i = 0; i < DOMOTICZ_MAX_SENSORS; i++) {
for (int i = 0; i < DZ_MAX_SENSORS; i++) {
page += FPSTR(HTTP_FORM_DOMOTICZ_SENSOR);
page.replace("{1", String(i +1));
snprintf_P(stemp, sizeof(stemp), domoticz_sensors[i]);
page.replace("{2", stemp);
page.replace("{5", String((int)sysCfg.domoticz_sensor_idx[i]));
page.replace("{2", GetTextIndexed(stemp, sizeof(stemp), i, kDomoticzSensors));
page.replace("{5", String((int)Settings.domoticz_sensor_idx[i]));
}
page += FPSTR(HTTP_FORM_DOMOTICZ_TIMER);
page.replace("{6", String((int)sysCfg.domoticz_update_timer));
page.replace("{6", String((int)Settings.domoticz_update_timer));
page += F("</table>");
page += FPSTR(HTTP_FORM_END);
page += FPSTR(HTTP_BTN_CONF);
showPage(page);
ShowPage(page);
}
void domoticz_saveSettings()
void DomoticzSaveSettings()
{
char stemp[20];
for (byte i = 0; i < 4; i++) {
for (byte i = 0; i < MAX_DOMOTICZ_IDX; i++) {
snprintf_P(stemp, sizeof(stemp), PSTR("r%d"), i +1);
sysCfg.domoticz_relay_idx[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str());
Settings.domoticz_relay_idx[i] = (!strlen(WebServer->arg(stemp).c_str())) ? 0 : atoi(WebServer->arg(stemp).c_str());
snprintf_P(stemp, sizeof(stemp), PSTR("k%d"), i +1);
sysCfg.domoticz_key_idx[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str());
Settings.domoticz_key_idx[i] = (!strlen(WebServer->arg(stemp).c_str())) ? 0 : atoi(WebServer->arg(stemp).c_str());
snprintf_P(stemp, sizeof(stemp), PSTR("s%d"), i +1);
sysCfg.domoticz_switch_idx[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str());
Settings.domoticz_switch_idx[i] = (!strlen(WebServer->arg(stemp).c_str())) ? 0 : atoi(WebServer->arg(stemp).c_str());
}
for (byte i = 0; i < DOMOTICZ_MAX_SENSORS; i++) {
for (byte i = 0; i < DZ_MAX_SENSORS; i++) {
snprintf_P(stemp, sizeof(stemp), PSTR("l%d"), i +1);
sysCfg.domoticz_sensor_idx[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str());
Settings.domoticz_sensor_idx[i] = (!strlen(WebServer->arg(stemp).c_str())) ? 0 : atoi(WebServer->arg(stemp).c_str());
}
sysCfg.domoticz_update_timer = (!strlen(webServer->arg("ut").c_str())) ? DOMOTICZ_UPDATE_TIMER : atoi(webServer->arg("ut").c_str());
Settings.domoticz_update_timer = (!strlen(WebServer->arg("ut").c_str())) ? DOMOTICZ_UPDATE_TIMER : atoi(WebServer->arg("ut").c_str());
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DOMOTICZ D_CMND_IDX " %d, %d, %d, %d, " D_CMND_UPDATETIMER " %d"),
sysCfg.domoticz_relay_idx[0], sysCfg.domoticz_relay_idx[1], sysCfg.domoticz_relay_idx[2], sysCfg.domoticz_relay_idx[3],
sysCfg.domoticz_update_timer);
addLog(LOG_LEVEL_INFO);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DOMOTICZ D_CMND_KEYIDX " %d, %d, %d, %d, " D_CMND_SWITCHIDX " %d, %d, %d, %d, " D_CMND_SENSORIDX " %d, %d, %d, %d, %d, %d"),
sysCfg.domoticz_key_idx[0], sysCfg.domoticz_key_idx[1], sysCfg.domoticz_key_idx[2], sysCfg.domoticz_key_idx[3],
sysCfg.domoticz_switch_idx[0], sysCfg.domoticz_switch_idx[1], sysCfg.domoticz_switch_idx[2], sysCfg.domoticz_switch_idx[3],
sysCfg.domoticz_sensor_idx[0], sysCfg.domoticz_sensor_idx[1], sysCfg.domoticz_sensor_idx[2], sysCfg.domoticz_sensor_idx[3],
sysCfg.domoticz_sensor_idx[4], sysCfg.domoticz_sensor_idx[5]);
addLog(LOG_LEVEL_INFO);
Settings.domoticz_relay_idx[0], Settings.domoticz_relay_idx[1], Settings.domoticz_relay_idx[2], Settings.domoticz_relay_idx[3],
Settings.domoticz_update_timer);
AddLog(LOG_LEVEL_INFO);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DOMOTICZ D_CMND_KEYIDX " %d, %d, %d, %d, " D_CMND_SWITCHIDX " %d, %d, %d, %d, " D_CMND_SENSORIDX " %d, %d, %d, %d, %d, %d, %d, %d"),
Settings.domoticz_key_idx[0], Settings.domoticz_key_idx[1], Settings.domoticz_key_idx[2], Settings.domoticz_key_idx[3],
Settings.domoticz_switch_idx[0], Settings.domoticz_switch_idx[1], Settings.domoticz_switch_idx[2], Settings.domoticz_switch_idx[3],
Settings.domoticz_sensor_idx[0], Settings.domoticz_sensor_idx[1], Settings.domoticz_sensor_idx[2], Settings.domoticz_sensor_idx[3],
Settings.domoticz_sensor_idx[4], Settings.domoticz_sensor_idx[5], Settings.domoticz_sensor_idx[6], Settings.domoticz_sensor_idx[7]);
AddLog(LOG_LEVEL_INFO);
}
#endif // USE_WEBSERVER
#endif // USE_DOMOTICZ

View File

@ -1,7 +1,7 @@
/*
xdrv_ir_send.ino - infra red support for Sonoff-Tasmota
Copyright (C) 2017 Heiko Krupp and Theo Arends
Copyright (C) 2017 Heiko Krupp, Lazar Obradovic and Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -19,35 +19,39 @@
#ifdef USE_IR_REMOTE
/*********************************************************************************************\
* IR Remote send using IRremoteESP8266 library
* IR Remote send and receive using IRremoteESP8266 library
\*********************************************************************************************/
#ifndef USE_IR_HVAC
#include <IRremoteESP8266.h>
#include <IRremoteESP8266.h>
#else
#include <IRMitsubishiAC.h>
#include <IRMitsubishiAC.h>
// HVAC TOSHIBA_
#define HVAC_TOSHIBA_HDR_MARK 4400
#define HVAC_TOSHIBA_HDR_SPACE 4300
#define HVAC_TOSHIBA_BIT_MARK 543
#define HVAC_TOSHIBA_ONE_SPACE 1623
#define HVAC_MISTUBISHI_ZERO_SPACE 472
#define HVAC_TOSHIBA_RPT_MARK 440
#define HVAC_TOSHIBA_RPT_SPACE 7048 // Above original iremote limit
#define HVAC_TOSHIBA_DATALEN 9
// HVAC TOSHIBA_
#define HVAC_TOSHIBA_HDR_MARK 4400
#define HVAC_TOSHIBA_HDR_SPACE 4300
#define HVAC_TOSHIBA_BIT_MARK 543
#define HVAC_TOSHIBA_ONE_SPACE 1623
#define HVAC_MISTUBISHI_ZERO_SPACE 472
#define HVAC_TOSHIBA_RPT_MARK 440
#define HVAC_TOSHIBA_RPT_SPACE 7048 // Above original iremote limit
#define HVAC_TOSHIBA_DATALEN 9
IRMitsubishiAC *mitsubir = NULL;
IRMitsubishiAC *mitsubir = NULL;
const char FANSPEED[] = "A12345S";
const char HVACMODE[] = "HDCA";
const char kFanSpeedOptions[] = "A12345S";
const char kHvacModeOptions[] = "HDCA";
#endif
/*********************************************************************************************\
* IR Send
\*********************************************************************************************/
IRsend *irsend = NULL;
void ir_send_init(void)
void IrSendInit(void)
{
irsend = new IRsend(pin[GPIO_IRSEND]); // an IR led is at GPIO_IRSEND
irsend = new IRsend(pin[GPIO_IRSEND]); // an IR led is at GPIO_IRSEND
irsend->begin();
#ifdef USE_IR_HVAC
@ -55,138 +59,106 @@ void ir_send_init(void)
#endif //USE_IR_HVAC
}
#ifdef USE_IR_RECEIVE
/*********************************************************************************************\
* Commands
* IR Receive
\*********************************************************************************************/
/*
* ArduinoJSON entry used to calculate jsonBuf: JSON_OBJECT_SIZE(3) + 40 = 96
IRsend:
{ "protocol": "SAMSUNG", "bits": 32, "data": 551502015 }
#define IR_TIME_AVOID_DUPLICATE 500 // Milliseconds
IRhvac:
{ "Vendor": "<Toshiba|Mitsubishi>", "Power": <0|1>, "Mode": "<Hot|Cold|Dry|Auto>", "FanSpeed": "<1|2|3|4|5|Auto|Silence>", "Temp": <17..30> }
*/
// Based on IRremoteESP8266.h enum decode_type_t
const char kIrRemoteProtocols[] PROGMEM =
"UNKNOWN|RC5|RC6|NEC|SONY|PANASONIC|JVC|SAMSUNG|WHYNTER|AIWA_RC_T501|LG|SANYO|MITSUBISHI|DISH|SHARP";
boolean ir_send_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
IRrecv *irrecv = NULL;
unsigned long ir_lasttime = 0;
void IrReceiveInit(void)
{
boolean serviced = true;
boolean error = false;
const char *protocol;
uint8_t bits = 0;
uint32_t data = 0;
irrecv = new IRrecv(pin[GPIO_IRRECV]); // an IR led is at GPIO_IRRECV
irrecv->enableIRIn(); // Start the receiver
const char *HVAC_Mode;
const char *HVAC_FanMode;
const char *HVAC_Vendor;
int HVAC_Temp = 21;
boolean HVAC_Power = true;
if (!strcasecmp_P(type, PSTR(D_CMND_IRSEND))) {
if (data_len) {
StaticJsonBuffer<128> jsonBuf;
JsonObject &ir_json = jsonBuf.parseObject(dataBuf);
if (!ir_json.success()) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_INVALID_JSON "\"}")); // JSON decode failed
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_DONE "\"}"));
protocol = ir_json[D_IRSEND_PROTOCOL];
bits = ir_json[D_IRSEND_BITS];
data = ir_json[D_IRSEND_DATA];
if (protocol && bits && data) {
if (!strcasecmp_P(protocol, PSTR("NEC"))) irsend->sendNEC(data, bits);
else if (!strcasecmp_P(protocol, PSTR("SONY"))) irsend->sendSony(data, bits);
else if (!strcasecmp_P(protocol, PSTR("RC5"))) irsend->sendRC5(data, bits);
else if (!strcasecmp_P(protocol, PSTR("RC6"))) irsend->sendRC6(data, bits);
else if (!strcasecmp_P(protocol, PSTR("DISH"))) irsend->sendDISH(data, bits);
else if (!strcasecmp_P(protocol, PSTR("JVC"))) irsend->sendJVC(data, bits, 1);
else if (!strcasecmp_P(protocol, PSTR("SAMSUNG"))) irsend->sendSAMSUNG(data, bits);
else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_PROTOCOL_NOT_SUPPORTED "\"}"));
}
} else error = true;
}
} else error = true;
if (error) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_NO D_IRSEND_PROTOCOL ", " D_IRSEND_BITS " " D_OR " " D_IRSEND_DATA "\"}"));
}
}
#ifdef USE_IR_HVAC
else if (!strcasecmp_P(type, PSTR(D_CMND_IRHVAC))) {
if (data_len) {
StaticJsonBuffer<164> jsonBufer;
JsonObject &root = jsonBufer.parseObject(dataBuf);
if (!root.success()) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRHVAC "\":\"" D_INVALID_JSON "\"}")); // JSON decode failed
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRHVAC "\":\"" D_DONE "\"}"));
HVAC_Vendor = root[D_IRHVAC_VENDOR];
HVAC_Power = root[D_IRHVAC_POWER];
HVAC_Mode = root[D_IRHVAC_MODE];
HVAC_FanMode = root[D_IRHVAC_FANSPEED];
HVAC_Temp = root[D_IRHVAC_TEMP];
// snprintf_P(log_data, sizeof(log_data), PSTR("IRHVAC: Received Vendor %s, Power %d, Mode %s, FanSpeed %s, Temp %d"),
// HVAC_Vendor, HVAC_Power, HVAC_Mode, HVAC_FanMode, HVAC_Temp);
// addLog(LOG_LEVEL_DEBUG);
if (HVAC_Vendor == NULL || !strcasecmp_P(HVAC_Vendor, PSTR("TOSHIBA"))) {
error = ir_hvac_toshiba(HVAC_Mode, HVAC_FanMode, HVAC_Power, HVAC_Temp);
}
else if (!strcasecmp_P(HVAC_Vendor, PSTR("MITSUBISHI"))) {
error = ir_hvac_mitsubishi(HVAC_Mode, HVAC_FanMode, HVAC_Power, HVAC_Temp);
}
else error = true;
}
} else error = true;
if (error) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRHVAC "\":\"" D_WRONG D_IRHVAC_VENDOR ", " D_IRHVAC_MODE " " D_OR " " D_IRHVAC_FANSPEED "\"}"));
}
}
#endif // USE_IR_HVAC
else {
serviced = false; // Unknown command
}
return serviced;
// AddLog_P(LOG_LEVEL_DEBUG, PSTR("IrReceive initialized"));
}
#ifdef USE_IR_HVAC
boolean ir_hvac_toshiba(const char *HVAC_Mode, const char *HVAC_FanMode, boolean HVAC_Power, int HVAC_Temp)
void IrReceiveCheck()
{
unsigned int rawdata[2 + 2*8*HVAC_TOSHIBA_DATALEN + 2];
byte data[HVAC_TOSHIBA_DATALEN] = { 0xF2, 0x0D, 0x03, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00 };
char sirtype[14]; // Max is AIWA_RC_T501
int8_t iridx = 0;
decode_results results;
if (irrecv->decode(&results)) {
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_IRR "RawLen %d, Bits %d, Value %08X, Decode %d"),
results.rawlen, results.bits, results.value, results.decode_type);
AddLog(LOG_LEVEL_DEBUG);
unsigned long now = millis();
if ((now - ir_lasttime > IR_TIME_AVOID_DUPLICATE) && (UNKNOWN != results.decode_type) && (results.bits > 0)) {
ir_lasttime = now;
iridx = results.decode_type;
if ((iridx < 0) || (iridx > 14)) {
iridx = 0;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_IRRECEIVED "\":{\"" D_IR_PROTOCOL "\":\"%s\", \"" D_IR_BITS "\":%d, \"" D_IR_DATA "\":\"%X\"}}"),
GetTextIndexed(sirtype, sizeof(sirtype), iridx, kIrRemoteProtocols), results.bits, results.value);
MqttPublishPrefixTopic_P(6, PSTR(D_IRRECEIVED));
#ifdef USE_DOMOTICZ
unsigned long value = results.value | (iridx << 28); // [Protocol:4, Data:28]
DomoticzSensor(DZ_COUNT, value); // Send data as Domoticz Counter value
#endif // USE_DOMOTICZ
}
irrecv->resume();
}
}
#endif // USE_IR_RECEIVE
#ifdef USE_IR_HVAC
/*********************************************************************************************\
* IR Heating, Ventilation and Air Conditioning using IRMitsubishiAC library
\*********************************************************************************************/
boolean IrHvacToshiba(const char *HVAC_Mode, const char *HVAC_FanMode, boolean HVAC_Power, int HVAC_Temp)
{
unsigned int rawdata[2 + 2 * 8 * HVAC_TOSHIBA_DATALEN + 2];
byte data[HVAC_TOSHIBA_DATALEN] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00};
char *p;
char *token;
uint8_t mode;
if (HVAC_Mode == NULL) {
p = (char*)HVACMODE; // default HVAC_HOT
} else {
p = strchr(HVACMODE, toupper(HVAC_Mode[0]));
p = (char *)kHvacModeOptions; // default HVAC_HOT
}
else {
p = strchr(kHvacModeOptions, toupper(HVAC_Mode[0]));
}
if (!p) {
return true;
}
data[6] = (p - HVACMODE) ^ 0x03; // HOT = 0x03, DRY = 0x02, COOL = 0x01, AUTO = 0x00
data[6] = (p - kHvacModeOptions) ^ 0x03; // HOT = 0x03, DRY = 0x02, COOL = 0x01, AUTO = 0x00
if (!HVAC_Power) {
data[6] = (byte) 0x07; // Turn OFF HVAC
data[6] = (byte)0x07; // Turn OFF HVAC
}
if (HVAC_FanMode == NULL) {
p = (char*)FANSPEED; // default FAN_SPEED_AUTO
} else {
p = strchr(FANSPEED, toupper(HVAC_FanMode[0]));
p = (char *)kFanSpeedOptions; // default FAN_SPEED_AUTO
}
else {
p = strchr(kFanSpeedOptions, toupper(HVAC_FanMode[0]));
}
if (!p) {
return true;
}
mode = p - FANSPEED +1;
mode = p - kFanSpeedOptions + 1;
if ((1 == mode) || (7 == mode)) {
mode = 0;
}
mode = mode << 5; // AUTO = 0x00, SPEED = 0x40, 0x60, 0x80, 0xA0, 0xC0, SILENT = 0x00
mode = mode << 5; // AUTO = 0x00, SPEED = 0x40, 0x60, 0x80, 0xA0, 0xC0, SILENT = 0x00
data[6] = data[6] | mode;
byte Temp;
@ -199,11 +171,11 @@ boolean ir_hvac_toshiba(const char *HVAC_Mode, const char *HVAC_FanMode, boolean
else {
Temp = HVAC_Temp;
}
data[5] = (byte) Temp - 17 << 4;
data[5] = (byte)Temp - 17 << 4;
data[HVAC_TOSHIBA_DATALEN-1] = 0;
data[HVAC_TOSHIBA_DATALEN - 1] = 0;
for (int x = 0; x < HVAC_TOSHIBA_DATALEN - 1; x++) {
data[HVAC_TOSHIBA_DATALEN-1] = (byte) data[x] ^ data[HVAC_TOSHIBA_DATALEN -1]; // CRC is a simple bits addition
data[HVAC_TOSHIBA_DATALEN - 1] = (byte)data[x] ^ data[HVAC_TOSHIBA_DATALEN - 1]; // CRC is a simple bits addition
}
int i = 0;
@ -232,14 +204,14 @@ boolean ir_hvac_toshiba(const char *HVAC_Mode, const char *HVAC_FanMode, boolean
rawdata[i++] = HVAC_TOSHIBA_RPT_SPACE;
noInterrupts();
irsend->sendRaw(rawdata,i,38);
irsend->sendRaw(rawdata,i,38);
irsend->sendRaw(rawdata, i, 38);
irsend->sendRaw(rawdata, i, 38);
interrupts();
return false;
}
boolean ir_hvac_mitsubishi(const char *HVAC_Mode,const char *HVAC_FanMode, boolean HVAC_Power, int HVAC_Temp)
boolean IrHvacMitsubishi(const char *HVAC_Mode, const char *HVAC_FanMode, boolean HVAC_Power, int HVAC_Temp)
{
char *p;
char *token;
@ -248,38 +220,164 @@ boolean ir_hvac_mitsubishi(const char *HVAC_Mode,const char *HVAC_FanMode, boole
mitsubir->stateReset();
if (HVAC_Mode == NULL) {
p = (char*)HVACMODE; // default HVAC_HOT
} else {
p = strchr(HVACMODE, toupper(HVAC_Mode[0]));
p = (char *)kHvacModeOptions; // default HVAC_HOT
}
else {
p = strchr(kHvacModeOptions, toupper(HVAC_Mode[0]));
}
if (!p) {
return true;
}
mode = (p - HVACMODE +1) << 3; // HOT = 0x08, DRY = 0x10, COOL = 0x18, AUTO = 0x20
mode = (p - kHvacModeOptions + 1) << 3; // HOT = 0x08, DRY = 0x10, COOL = 0x18, AUTO = 0x20
mitsubir->setMode(mode);
mitsubir->setPower(HVAC_Power);
if (HVAC_FanMode == NULL) {
p = (char*)FANSPEED; // default FAN_SPEED_AUTO
} else {
p = strchr(FANSPEED, toupper(HVAC_FanMode[0]));
p = (char *)kFanSpeedOptions; // default FAN_SPEED_AUTO
}
else {
p = strchr(kFanSpeedOptions, toupper(HVAC_FanMode[0]));
}
if (!p) {
return true;
}
mode = p - FANSPEED; // AUTO = 0, SPEED = 1 .. 5, SILENT = 6
mode = p - kFanSpeedOptions; // AUTO = 0, SPEED = 1 .. 5, SILENT = 6
mitsubir->setFan(mode);
mitsubir->setTemp(HVAC_Temp);
mitsubir->setVane(MITSUBISHI_AC_VANE_AUTO);
mitsubir->send();
// snprintf_P(log_data, sizeof(log_data), PSTR("IRHVAC: Mitsubishi Power %d, Mode %d, FanSpeed %d, Temp %d, VaneMode %d"),
// mitsubir->getPower(), mitsubir->getMode(), mitsubir->getFan(), mitsubir->getTemp(), mitsubir->getVane());
// addLog(LOG_LEVEL_DEBUG);
// snprintf_P(log_data, sizeof(log_data), PSTR("IRHVAC: Mitsubishi Power %d, Mode %d, FanSpeed %d, Temp %d, VaneMode %d"),
// mitsubir->getPower(), mitsubir->getMode(), mitsubir->getFan(), mitsubir->getTemp(), mitsubir->getVane());
// AddLog(LOG_LEVEL_DEBUG);
return false;
}
#endif // USE_IR_HVAC
#endif // USE_IR_REMOTE
#endif // USE_IR_HVAC
/*********************************************************************************************\
* Commands
\*********************************************************************************************/
/*
* ArduinoJSON entry used to calculate jsonBuf: JSON_OBJECT_SIZE(3) + 40 = 96
IRsend:
{ "protocol": "SAMSUNG", "bits": 32, "data": 551502015 }
IRhvac:
{ "Vendor": "<Toshiba|Mitsubishi>", "Power": <0|1>, "Mode": "<Hot|Cold|Dry|Auto>", "FanSpeed": "<1|2|3|4|5|Auto|Silence>", "Temp": <17..30> }
*/
boolean IrSendCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
{
boolean serviced = true;
boolean error = false;
char dataBufUc[data_len];
char protocol_text[20];
const char *protocol;
uint32_t bits = 0;
uint32_t data = 0;
const char *HVAC_Mode;
const char *HVAC_FanMode;
const char *HVAC_Vendor;
int HVAC_Temp = 21;
boolean HVAC_Power = true;
for (uint16_t i = 0; i <= sizeof(dataBufUc); i++) {
dataBufUc[i] = toupper(dataBuf[i]);
}
if (!strcasecmp_P(type, PSTR(D_CMND_IRSEND))) {
if (data_len) {
StaticJsonBuffer<128> jsonBuf;
JsonObject &ir_json = jsonBuf.parseObject(dataBufUc);
if (!ir_json.success()) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_INVALID_JSON "\"}")); // JSON decode failed
}
else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_DONE "\"}"));
protocol = ir_json[D_IR_PROTOCOL];
bits = ir_json[D_IR_BITS];
data = ir_json[D_IR_DATA];
if (protocol && bits && data) {
int protocol_code = GetCommandCode(protocol_text, sizeof(protocol_text), protocol, kIrRemoteProtocols);
switch (protocol_code) {
case NEC:
irsend->sendNEC(data, bits); break;
case SONY:
irsend->sendSony(data, bits); break;
case RC5:
irsend->sendRC5(data, bits); break;
case RC6:
irsend->sendRC6(data, bits); break;
case DISH:
irsend->sendDISH(data, bits); break;
case JVC:
irsend->sendJVC(data, bits, 1); break;
case SAMSUNG:
irsend->sendSAMSUNG(data, bits); break;
case PANASONIC:
irsend->sendPanasonic(bits, data); break;
default:
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_PROTOCOL_NOT_SUPPORTED "\"}"));
}
}
else {
error = true;
}
}
}
else {
error = true;
}
if (error) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_NO " " D_IR_PROTOCOL ", " D_IR_BITS " " D_OR " " D_IR_DATA "\"}"));
}
}
#ifdef USE_IR_HVAC
else if (!strcasecmp_P(type, PSTR(D_CMND_IRHVAC))) {
if (data_len) {
StaticJsonBuffer<164> jsonBufer;
JsonObject &root = jsonBufer.parseObject(dataBufUc);
if (!root.success()) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRHVAC "\":\"" D_INVALID_JSON "\"}")); // JSON decode failed
}
else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRHVAC "\":\"" D_DONE "\"}"));
HVAC_Vendor = root[D_IRHVAC_VENDOR];
HVAC_Power = root[D_IRHVAC_POWER];
HVAC_Mode = root[D_IRHVAC_MODE];
HVAC_FanMode = root[D_IRHVAC_FANSPEED];
HVAC_Temp = root[D_IRHVAC_TEMP];
// snprintf_P(log_data, sizeof(log_data), PSTR("IRHVAC: Received Vendor %s, Power %d, Mode %s, FanSpeed %s, Temp %d"),
// HVAC_Vendor, HVAC_Power, HVAC_Mode, HVAC_FanMode, HVAC_Temp);
// AddLog(LOG_LEVEL_DEBUG);
if (HVAC_Vendor == NULL || !strcasecmp_P(HVAC_Vendor, PSTR("TOSHIBA"))) {
error = IrHvacToshiba(HVAC_Mode, HVAC_FanMode, HVAC_Power, HVAC_Temp);
}
else if (!strcasecmp_P(HVAC_Vendor, PSTR("MITSUBISHI"))) {
error = IrHvacMitsubishi(HVAC_Mode, HVAC_FanMode, HVAC_Power, HVAC_Temp);
}
else {
error = true;
}
}
}
else {
error = true;
}
if (error) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRHVAC "\":\"" D_WRONG " " D_IRHVAC_VENDOR ", " D_IRHVAC_MODE " " D_OR " " D_IRHVAC_FANSPEED "\"}"));
}
}
#endif // USE_IR_HVAC
else {
serviced = false; // Unknown command
}
return serviced;
}
#endif // USE_IR_REMOTE

View File

@ -23,128 +23,153 @@
#define SFB_TIME_AVOID_DUPLICATE 2000 // Milliseconds
uint8_t sfb_rcvflg = 0;
uint8_t sfb_learnKey = 1;
uint8_t sfb_learnFlg = 0;
uint32_t sfb_lastrid = 0;
unsigned long sfb_lasttime = 0;
enum SonoffBridgeCommands {
CMND_RFSYNC, CMND_RFLOW, CMND_RFHIGH, CMND_RFHOST, CMND_RFCODE, CMND_RFKEY };
const char kSonoffBridgeCommands[] PROGMEM =
D_CMND_RFSYNC "|" D_CMND_RFLOW "|" D_CMND_RFHIGH "|" D_CMND_RFHOST "|" D_CMND_RFCODE "|" D_CMND_RFKEY ;
void sb_received()
uint8_t sonoff_bridge_receive_flag = 0;
uint8_t sonoff_bridge_learn_key = 1;
uint8_t sonoff_bridge_learn_active = 0;
uint32_t sonoff_bridge_last_received_id = 0;
uint32_t sonoff_bridge_last_send_code = 0;
unsigned long sonoff_bridge_last_time = 0;
void SonoffBridgeReceived()
{
uint8_t i = 0;
uint32_t sid = 0;
uint32_t rid = 0;
uint16_t rsy = 0;
uint16_t rlo = 0;
uint16_t rhi = 0;
uint16_t sync_time = 0;
uint16_t low_time = 0;
uint16_t high_time = 0;
uint32_t received_id = 0;
char svalue[90];
char rfkey[8];
svalue[0] = '\0';
for (i = 0; i < SerialInByteCounter; i++) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%02X "), svalue, serialInBuf[i]);
for (byte i = 0; i < serial_in_byte_counter; i++) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%02X "), svalue, serial_in_buffer[i]);
}
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_BRIDGE D_RECEIVED " %s"), svalue);
addLog(LOG_LEVEL_DEBUG);
AddLog(LOG_LEVEL_DEBUG);
if (0xA2 == serialInBuf[0]) { // Learn timeout
sfb_learnFlg = 0;
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARN_FAILED "\"}"), sfb_learnKey);
mqtt_publish_topic_P(5, PSTR(D_CMND_RFKEY));
if (0xA2 == serial_in_buffer[0]) { // Learn timeout
sonoff_bridge_learn_active = 0;
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, D_CMND_RFKEY, sonoff_bridge_learn_key, D_LEARN_FAILED);
MqttPublishPrefixTopic_P(5, PSTR(D_CMND_RFKEY));
}
else if (0xA3 == serialInBuf[0]) { // Learned A3 20 F8 01 18 03 3E 2E 1A 22 55
sfb_learnFlg = 0;
rlo = serialInBuf[3] << 8 | serialInBuf[4]; // Low time in uSec
rhi = serialInBuf[5] << 8 | serialInBuf[6]; // High time in uSec
if (rlo && rhi) {
for (i = 0; i < 9; i++) {
sysCfg.sfb_code[sfb_learnKey][i] = serialInBuf[i +1];
else if (0xA3 == serial_in_buffer[0]) { // Learned A3 20 F8 01 18 03 3E 2E 1A 22 55
sonoff_bridge_learn_active = 0;
low_time = serial_in_buffer[3] << 8 | serial_in_buffer[4]; // Low time in uSec
high_time = serial_in_buffer[5] << 8 | serial_in_buffer[6]; // High time in uSec
if (low_time && high_time) {
for (byte i = 0; i < 9; i++) {
Settings.rf_code[sonoff_bridge_learn_key][i] = serial_in_buffer[i +1];
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNED "\"}"), sfb_learnKey);
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, D_CMND_RFKEY, sonoff_bridge_learn_key, D_LEARNED);
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARN_FAILED "\"}"), sfb_learnKey);
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, D_CMND_RFKEY, sonoff_bridge_learn_key, D_LEARN_FAILED);
}
mqtt_publish_topic_P(5, PSTR(D_CMND_RFKEY));
MqttPublishPrefixTopic_P(5, PSTR(D_CMND_RFKEY));
}
else if (0xA4 == serialInBuf[0]) { // Received RF data A4 20 EE 01 18 03 3E 2E 1A 22 55
rsy = serialInBuf[1] << 8 | serialInBuf[2]; // Sync time in uSec
rlo = serialInBuf[3] << 8 | serialInBuf[4]; // Low time in uSec
rhi = serialInBuf[5] << 8 | serialInBuf[6]; // High time in uSec
rid = serialInBuf[7] << 16 | serialInBuf[8] << 8 | serialInBuf[9];
else if (0xA4 == serial_in_buffer[0]) { // Received RF data A4 20 EE 01 18 03 3E 2E 1A 22 55
sync_time = serial_in_buffer[1] << 8 | serial_in_buffer[2]; // Sync time in uSec
low_time = serial_in_buffer[3] << 8 | serial_in_buffer[4]; // Low time in uSec
high_time = serial_in_buffer[5] << 8 | serial_in_buffer[6]; // High time in uSec
received_id = serial_in_buffer[7] << 16 | serial_in_buffer[8] << 8 | serial_in_buffer[9];
unsigned long now = millis();
if (!((rid == sfb_lastrid) && (now - sfb_lasttime < SFB_TIME_AVOID_DUPLICATE))) {
sfb_lastrid = rid;
sfb_lasttime = now;
if (!((received_id == sonoff_bridge_last_received_id) && (now - sonoff_bridge_last_time < SFB_TIME_AVOID_DUPLICATE))) {
sonoff_bridge_last_received_id = received_id;
sonoff_bridge_last_time = now;
strncpy_P(rfkey, PSTR("\"" D_NONE "\""), sizeof(rfkey));
for (i = 1; i <= 16; i++) {
if (sysCfg.sfb_code[i][0]) {
sid = sysCfg.sfb_code[i][6] << 16 | sysCfg.sfb_code[i][7] << 8 | sysCfg.sfb_code[i][8];
if (sid == rid) {
for (byte i = 1; i <= 16; i++) {
if (Settings.rf_code[i][0]) {
uint32_t send_id = Settings.rf_code[i][6] << 16 | Settings.rf_code[i][7] << 8 | Settings.rf_code[i][8];
if (send_id == received_id) {
snprintf_P(rfkey, sizeof(rfkey), PSTR("%d"), i);
break;
}
}
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_RFRECEIVED "\":{\"" D_SYNC "\":%d, \"" D_LOW "\":%d, \"" D_HIGH "\":%d, \"" D_DATA "\":\"%06X\", \"" D_CMND_RFKEY "\":%s}}"),
rsy, rlo, rhi, rid, rfkey);
mqtt_publish_topic_P(6, PSTR(D_RFRECEIVED));
sync_time, low_time, high_time, received_id, rfkey);
MqttPublishPrefixTopic_P(6, PSTR(D_RFRECEIVED));
#ifdef USE_DOMOTICZ
DomoticzSensor(DZ_COUNT, received_id); // Send rid as Domoticz Counter value
#endif // USE_DOMOTICZ
}
}
}
boolean sb_serial()
boolean SonoffBridgeSerialInput()
{
if (sfb_rcvflg) {
if (!((SerialInByteCounter == 0) && (SerialInByte == 0))) { // Skip leading 0
serialInBuf[SerialInByteCounter++] = SerialInByte;
if (0x55 == SerialInByte) { // 0x55 - End of text
sb_received();
sfb_rcvflg = 0;
if (sonoff_bridge_receive_flag) {
if (!((serial_in_byte_counter == 0) && (serial_in_byte == 0))) { // Skip leading 0
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
if (0x55 == serial_in_byte) { // 0x55 - End of text
SonoffBridgeReceived();
sonoff_bridge_receive_flag = 0;
return 1;
}
}
SerialInByte = 0;
serial_in_byte = 0;
}
if (0xAA == SerialInByte) { // 0xAA - Start of text
SerialInByteCounter = 0;
SerialInByte = 0;
sfb_rcvflg = 1;
if (0xAA == serial_in_byte) { // 0xAA - Start of text
serial_in_byte_counter = 0;
serial_in_byte = 0;
sonoff_bridge_receive_flag = 1;
}
return 0;
}
void sb_sendAck()
void SonoffBridgeSendAck()
{
Serial.write(0xAA); // Start of Text
Serial.write(0xA0); // Acknowledge
Serial.write(0x55); // End of Text
}
void sb_send(uint8_t idx, uint8_t key)
void SonoffBridgeSendCode(uint32_t code)
{
Serial.write(0xAA); // Start of Text
Serial.write(0xA5); // Send following code
for (byte i = 0; i < 6; i++) {
Serial.write(Settings.rf_code[0][i]);
}
Serial.write((code >> 16) & 0xff);
Serial.write((code >> 8) & 0xff);
Serial.write(code & 0xff);
Serial.write(0x55); // End of Text
Serial.flush();
}
void SonoffBridgeSend(uint8_t idx, uint8_t key)
{
uint8_t code;
key--; // Support 1 to 16
Serial.write(0xAA); // Start of Text
Serial.write(0xA5); // Send following code
for (uint8_t i = 0; i < 8; i++) {
Serial.write(sysCfg.sfb_code[idx][i]);
for (byte i = 0; i < 8; i++) {
Serial.write(Settings.rf_code[idx][i]);
}
if (0 == idx) {
code = (0x10 << (key >> 2)) | (0x01 << (key & 3)); // 11,12,14,18,21,22,24,28,41,42,44,48,81,82,84,88
code = (0x10 << (key >> 2)) | (1 << (key & 3)); // 11,12,14,18,21,22,24,28,41,42,44,48,81,82,84,88
} else {
code = sysCfg.sfb_code[idx][8];
code = Settings.rf_code[idx][8];
}
Serial.write(code);
Serial.write(0x55); // End of Text
Serial.flush();
#ifdef USE_DOMOTICZ
// uint32_t rid = Settings.rf_code[idx][6] << 16 | Settings.rf_code[idx][7] << 8 | code;
// DomoticzSensor(DZ_COUNT, rid); // Send rid as Domoticz Counter value
#endif // USE_DOMOTICZ
}
void sb_learn(uint8_t key)
void SonoffBridgeLearn(uint8_t key)
{
sfb_learnKey = key;
sfb_learnFlg = 1;
sonoff_bridge_learn_key = key;
sonoff_bridge_learn_active = 1;
Serial.write(0xAA); // Start of Text
Serial.write(0xA1); // Start learning
Serial.write(0x55); // End of Text
@ -154,47 +179,90 @@ void sb_learn(uint8_t key)
* Commands
\*********************************************************************************************/
boolean sb_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
boolean SonoffBridgeCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
{
char command [CMDSZ];
boolean serviced = true;
char *p;
if (!strcasecmp_P(type, PSTR(D_CMND_RFDEFAULT))) {
if (4 == data_len) {
uint16_t hexcode = strtol(dataBuf, &p, 16);
uint8_t msb = hexcode >> 8;
uint8_t lsb = hexcode & 0xFF;
if ((hexcode > 0) && (hexcode < 0x7FFF) && (msb != 0x55) && (lsb != 0x55)) {
sysCfg.sfb_code[0][6] = msb;
sysCfg.sfb_code[0][7] = lsb;
int command_code = GetCommandCode(command, sizeof(command), type, kSonoffBridgeCommands);
if ((command_code >= CMND_RFSYNC) && (command_code <= CMND_RFCODE)) { // RfSync, RfLow, RfHigh, RfHost and RfCode
char *p;
char stemp [10];
uint32_t code = 0;
uint8_t radix = 10;
uint8_t set_index = command_code *2;
if (dataBuf[0] == '#') {
dataBuf++;
data_len--;
radix = 16;
}
if (data_len) {
code = strtol(dataBuf, &p, radix);
if (code) {
if (CMND_RFCODE == command_code) {
sonoff_bridge_last_send_code = code;
SonoffBridgeSendCode(code);
} else {
if (1 == payload) {
code = pgm_read_byte(kDefaultRfCode + set_index) << 8 | pgm_read_byte(kDefaultRfCode + set_index +1);
}
uint8_t msb = code >> 8;
uint8_t lsb = code & 0xFF;
if ((code > 0) && (code < 0x7FFF) && (msb != 0x55) && (lsb != 0x55)) { // Check for End of Text codes
Settings.rf_code[0][set_index] = msb;
Settings.rf_code[0][set_index +1] = lsb;
}
}
}
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFDEFAULT "\":\"%0X%0X\"}"), sysCfg.sfb_code[0][6], sysCfg.sfb_code[0][7]);
if (CMND_RFCODE == command_code) {
code = sonoff_bridge_last_send_code;
} else {
code = Settings.rf_code[0][set_index] << 8 | Settings.rf_code[0][set_index +1];
}
if (10 == radix) {
snprintf_P(stemp, sizeof(stemp), PSTR("%d"), code);
} else {
snprintf_P(stemp, sizeof(stemp), PSTR("\"#%X\""), code);
}
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_XVALUE, command, stemp);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_RFKEY)) && (index > 0) && (index <= 16)) {
if (!sfb_learnFlg) {
if (2 == payload) {
sb_learn(index);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_START_LEARNING "\"}"), index);
else if ((CMND_RFKEY == command_code) && (index > 0) && (index <= 16)) {
if (!sonoff_bridge_learn_active) {
if (2 == payload) { // Learn RF data
SonoffBridgeLearn(index);
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, D_START_LEARNING);
}
else if (3 == payload) {
sysCfg.sfb_code[index][0] = 0;
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_SET_TO_DEFAULT "\"}"), index);
else if (3 == payload) { // Unlearn RF data
Settings.rf_code[index][0] = 0;
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, D_SET_TO_DEFAULT);
}
else if (4 == payload) { // Save RF data provided by RFSync, RfLow, RfHigh and last RfCode
for (byte i = 0; i < 6; i++) {
Settings.rf_code[index][i] = Settings.rf_code[0][i];
}
Settings.rf_code[index][6] = (sonoff_bridge_last_send_code >> 16) & 0xff;
Settings.rf_code[index][7] = (sonoff_bridge_last_send_code >> 8) & 0xff;
Settings.rf_code[index][8] = sonoff_bridge_last_send_code & 0xff;
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, D_SAVED);
} else {
if ((1 == payload) || (0 == sysCfg.sfb_code[index][0])) {
sb_send(0, index);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_DEFAULT_SENT "\"}"), index);
if ((1 == payload) || (0 == Settings.rf_code[index][0])) {
SonoffBridgeSend(0, index); // Send default RF data
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, D_DEFAULT_SENT);
} else {
sb_send(index, 0);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNED_SENT "\"}"), index);
SonoffBridgeSend(index, 0); // Send learned RF data
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, D_LEARNED_SENT);
}
}
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNING_ACTIVE "\"}"), sfb_learnKey);
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, sonoff_bridge_learn_key, D_LEARNING_ACTIVE);
}
} else {
serviced = false;
}
else {
serviced = false; // Unknown command
}
return serviced;
}

File diff suppressed because it is too large Load Diff

View File

@ -55,29 +55,29 @@
uint16_t sc_value[5] = { 0 };
void sc_send(const char *data)
void SonoffScSend(const char *data)
{
Serial.write(data);
Serial.write('\x1B');
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_SERIAL D_TRANSMIT " %s"), data);
addLog(LOG_LEVEL_DEBUG);
AddLog(LOG_LEVEL_DEBUG);
}
void sc_init()
void SonoffScInit()
{
// sc_send("AT+DEVCONFIG=\"uploadFreq\":1800");
sc_send("AT+START");
// sc_send("AT+STATUS");
// SonoffScSend("AT+DEVCONFIG=\"uploadFreq\":1800");
SonoffScSend("AT+START");
// SonoffScSend("AT+STATUS");
}
void sc_rcvstat(char *rcvstat)
void SonoffScSerialInput(char *rcvstat)
{
char *p;
char *str;
uint16_t value[5] = { 0 };
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_SERIAL D_RECEIVED " %s"), rcvstat);
addLog(LOG_LEVEL_DEBUG);
AddLog(LOG_LEVEL_DEBUG);
if (!strncasecmp_P(rcvstat, PSTR("AT+UPDATE="), 10)) {
int8_t i = -1;
@ -91,13 +91,13 @@ void sc_rcvstat(char *rcvstat)
sc_value[2] = (11 - sc_value[2]) * 10; // Invert light level
sc_value[3] *= 10;
sc_value[4] = (11 - sc_value[4]) * 10; // Invert dust level
sc_send("AT+SEND=ok");
SonoffScSend("AT+SEND=ok");
} else {
sc_send("AT+SEND=fail");
SonoffScSend("AT+SEND=fail");
}
}
else if (!strcasecmp_P(rcvstat, PSTR("AT+STATUS?"))) {
sc_send("AT+STATUS=4");
SonoffScSend("AT+STATUS=4");
}
}
@ -105,28 +105,28 @@ void sc_rcvstat(char *rcvstat)
* Presentation
\*********************************************************************************************/
void sc_mqttPresent(uint8_t* djson)
void MqttShowSonoffSC(uint8_t* djson)
{
if (sc_value[0] > 0) {
char stemp1[10];
char stemp2[10];
float t = convertTemp(sc_value[1]);
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
float t = ConvertTemp(sc_value[1]);
dtostrfd(t, Settings.flag.temperature_resolution, stemp1);
float h = sc_value[0];
dtostrfd(h, sysCfg.flag.humidity_resolution, stemp2);
dtostrfd(h, Settings.flag.humidity_resolution, stemp2);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s, \"" D_LIGHT "\":%d, \"" D_NOISE "\":%d, \"" D_AIRQUALITY "\":%d"),
mqtt_data, stemp1, stemp2, sc_value[2], sc_value[3], sc_value[4]);
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor2(stemp1, stemp2);
domoticz_sensor5(sc_value[2]);
DomoticzTempHumSensor(stemp1, stemp2);
DomoticzSensor(DZ_ILLUMINANCE, sc_value[2]);
#endif // USE_DOMOTICZ
}
}
#ifdef USE_WEBSERVER
String sc_webPresent()
String WebShowSonoffSc()
{
String page = "";
@ -135,12 +135,12 @@ String sc_webPresent()
char sensor[80];
char scstype[] = "";
float t = convertTemp(sc_value[1]);
dtostrfi(t, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, scstype, stemp, tempUnit());
float t = ConvertTemp(sc_value[1]);
dtostrfi(t, Settings.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, scstype, stemp, TempUnit());
page += sensor;
float h = sc_value[0];
dtostrfi(h, sysCfg.flag.humidity_resolution, stemp);
dtostrfi(h, Settings.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, scstype, stemp);
page += sensor;
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_LIGHT, scstype, sc_value[2]);

View File

@ -25,11 +25,11 @@
#define UDP_BUFFER_SIZE 200 // Max UDP buffer size needed for M-SEARCH message
boolean udpConnected = false;
boolean udp_connected = false;
char packetBuffer[UDP_BUFFER_SIZE]; // buffer to hold incoming UDP packet
char packet_buffer[UDP_BUFFER_SIZE]; // buffer to hold incoming UDP packet
IPAddress ipMulticast(239, 255, 255, 250); // Simple Service Discovery Protocol (SSDP)
uint32_t portMulticast = 1900; // Multicast address and port
uint32_t port_multicast = 1900; // Multicast address and port
/*********************************************************************************************\
* WeMo UPNP support routines
@ -40,16 +40,16 @@ const char WEMO_MSEARCH[] PROGMEM =
"CACHE-CONTROL: max-age=86400\r\n"
"DATE: Fri, 15 Apr 2016 04:56:29 GMT\r\n"
"EXT:\r\n"
"LOCATION: http://{r1}:80/setup.xml\r\n"
"LOCATION: http://{r1:80/setup.xml\r\n"
"OPT: \"http://schemas.upnp.org/upnp/1/0/\"; ns=01\r\n"
"01-NLS: b9200ebb-736d-4b93-bf03-835149d13983\r\n"
"SERVER: Unspecified, UPnP/1.0, Unspecified\r\n"
"ST: urn:Belkin:device:**\r\n"
"USN: uuid:{r2}::urn:Belkin:device:**\r\n"
"USN: uuid:{r2::urn:Belkin:device:**\r\n"
"X-User-Agent: redsonic\r\n"
"\r\n";
String wemo_serial()
String WemoSerialnumber()
{
char serial[16];
@ -57,31 +57,31 @@ String wemo_serial()
return String(serial);
}
String wemo_UUID()
String WemoUuid()
{
char uuid[27];
snprintf_P(uuid, sizeof(uuid), PSTR("Socket-1_0-%s"), wemo_serial().c_str());
snprintf_P(uuid, sizeof(uuid), PSTR("Socket-1_0-%s"), WemoSerialnumber().c_str());
return String(uuid);
}
void wemo_respondToMSearch()
void WemoRespondToMSearch()
{
char message[TOPSZ];
if (portUDP.beginPacket(portUDP.remoteIP(), portUDP.remotePort())) {
if (PortUdp.beginPacket(PortUdp.remoteIP(), PortUdp.remotePort())) {
String response = FPSTR(WEMO_MSEARCH);
response.replace("{r1}", WiFi.localIP().toString());
response.replace("{r2}", wemo_UUID());
portUDP.write(response.c_str());
portUDP.endPacket();
response.replace("{r1", WiFi.localIP().toString());
response.replace("{r2", WemoUuid());
PortUdp.write(response.c_str());
PortUdp.endPacket();
snprintf_P(message, sizeof(message), PSTR(D_RESPONSE_SENT));
} else {
snprintf_P(message, sizeof(message), PSTR(D_FAILED_TO_SEND_RESPONSE));
}
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPNP D_WEMO " %s " D_TO " %s:%d"),
message, portUDP.remoteIP().toString().c_str(), portUDP.remotePort());
addLog(LOG_LEVEL_DEBUG);
message, PortUdp.remoteIP().toString().c_str(), PortUdp.remotePort());
AddLog(LOG_LEVEL_DEBUG);
}
/*********************************************************************************************\
@ -97,23 +97,23 @@ const char HUE_RESPONSE[] PROGMEM =
"HOST: 239.255.255.250:1900\r\n"
"CACHE-CONTROL: max-age=100\r\n"
"EXT:\r\n"
"LOCATION: http://{r1}:80/description.xml\r\n"
"LOCATION: http://{r1:80/description.xml\r\n"
"SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/1.17.0\r\n"
"hue-bridgeid: {r2}\r\n";
"hue-bridgeid: {r2\r\n";
const char HUE_ST1[] PROGMEM =
"ST: upnp:rootdevice\r\n"
"USN: uuid:{r3}::upnp:rootdevice\r\n"
"USN: uuid:{r3::upnp:rootdevice\r\n"
"\r\n";
const char HUE_ST2[] PROGMEM =
"ST: uuid:{r3}\r\n"
"USN: uuid:{r3}\r\n"
"ST: uuid:{r3\r\n"
"USN: uuid:{r3\r\n"
"\r\n";
const char HUE_ST3[] PROGMEM =
"ST: urn:schemas-upnp-org:device:basic:1\r\n"
"USN: uuid:{r3}\r\n"
"USN: uuid:{r3\r\n"
"\r\n";
String hue_bridgeid()
String HueBridgeId()
{
String temp = WiFi.macAddress();
temp.replace(":", "");
@ -121,7 +121,7 @@ String hue_bridgeid()
return bridgeid; // 5CCF7FFFFE139F3D
}
String hue_serial()
String HueSerialnumber()
{
String serial = WiFi.macAddress();
serial.replace(":", "");
@ -129,106 +129,106 @@ String hue_serial()
return serial; // 5ccf7f139f3d
}
String hue_UUID()
String HueUuid()
{
String uuid = F("f6543a06-da50-11ba-8d8f-");
uuid += hue_serial();
uuid += HueSerialnumber();
return uuid; // f6543a06-da50-11ba-8d8f-5ccf7f139f3d
}
void hue_respondToMSearch()
void HueRespondToMSearch()
{
char message[TOPSZ];
if (portUDP.beginPacket(portUDP.remoteIP(), portUDP.remotePort())) {
if (PortUdp.beginPacket(PortUdp.remoteIP(), PortUdp.remotePort())) {
String response1 = FPSTR(HUE_RESPONSE);
response1.replace("{r1}", WiFi.localIP().toString());
response1.replace("{r2}", hue_bridgeid());
response1.replace("{r1", WiFi.localIP().toString());
response1.replace("{r2", HueBridgeId());
String response = response1;
response += FPSTR(HUE_ST1);
response.replace("{r3}", hue_UUID());
portUDP.write(response.c_str());
portUDP.endPacket();
response.replace("{r3", HueUuid());
PortUdp.write(response.c_str());
PortUdp.endPacket();
response = response1;
response += FPSTR(HUE_ST2);
response.replace("{r3}", hue_UUID());
portUDP.write(response.c_str());
portUDP.endPacket();
response.replace("{r3", HueUuid());
PortUdp.write(response.c_str());
PortUdp.endPacket();
response = response1;
response += FPSTR(HUE_ST3);
response.replace("{r3}", hue_UUID());
portUDP.write(response.c_str());
portUDP.endPacket();
response.replace("{r3", HueUuid());
PortUdp.write(response.c_str());
PortUdp.endPacket();
snprintf_P(message, sizeof(message), PSTR(D_3_RESPONSE_PACKETS_SENT));
} else {
snprintf_P(message, sizeof(message), PSTR(D_FAILED_TO_SEND_RESPONSE));
}
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPNP D_HUE " %s " D_TO " %s:%d"),
message, portUDP.remoteIP().toString().c_str(), portUDP.remotePort());
addLog(LOG_LEVEL_DEBUG);
message, PortUdp.remoteIP().toString().c_str(), PortUdp.remotePort());
AddLog(LOG_LEVEL_DEBUG);
}
/*********************************************************************************************\
* Belkin WeMo and Philips Hue bridge UDP multicast support
\*********************************************************************************************/
boolean UDP_Disconnect()
boolean UdpDisconnect()
{
if (udpConnected) {
if (udp_connected) {
WiFiUDP::stopAll();
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP D_MULTICAST_DISABLED));
udpConnected = false;
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP D_MULTICAST_DISABLED));
udp_connected = false;
}
return udpConnected;
return udp_connected;
}
boolean UDP_Connect()
boolean UdpConnect()
{
if (!udpConnected) {
if (portUDP.beginMulticast(WiFi.localIP(), ipMulticast, portMulticast)) {
addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_UPNP D_MULTICAST_REJOINED));
udpConnected = true;
if (!udp_connected) {
if (PortUdp.beginMulticast(WiFi.localIP(), ipMulticast, port_multicast)) {
AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_UPNP D_MULTICAST_REJOINED));
udp_connected = true;
} else {
addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_UPNP D_MULTICAST_JOIN_FAILED));
udpConnected = false;
AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_UPNP D_MULTICAST_JOIN_FAILED));
udp_connected = false;
}
}
return udpConnected;
return udp_connected;
}
void pollUDP()
void PollUdp()
{
if (udpConnected) {
if (portUDP.parsePacket()) {
int len = portUDP.read(packetBuffer, UDP_BUFFER_SIZE -1);
if (udp_connected) {
if (PortUdp.parsePacket()) {
int len = PortUdp.read(packet_buffer, UDP_BUFFER_SIZE -1);
if (len > 0) {
packetBuffer[len] = 0;
packet_buffer[len] = 0;
}
String request = packetBuffer;
String request = packet_buffer;
// addLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("UDP: Packet received"));
// addLog_P(LOG_LEVEL_DEBUG_MORE, packetBuffer);
// AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("UDP: Packet received"));
// AddLog_P(LOG_LEVEL_DEBUG_MORE, packet_buffer);
if (request.indexOf("M-SEARCH") >= 0) {
request.toLowerCase();
request.replace(" ", "");
// addLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("UDP: M-SEARCH Packet received"));
// addLog_P(LOG_LEVEL_DEBUG_MORE, request.c_str());
// AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("UDP: M-SEARCH Packet received"));
// AddLog_P(LOG_LEVEL_DEBUG_MORE, request.c_str());
if ((EMUL_WEMO == sysCfg.flag.emulation) && (request.indexOf(F("urn:belkin:device:**")) > 0)) {
wemo_respondToMSearch();
if ((EMUL_WEMO == Settings.flag.emulation) && (request.indexOf(F("urn:belkin:device:**")) > 0)) {
WemoRespondToMSearch();
}
else if ((EMUL_HUE == sysCfg.flag.emulation) &&
else if ((EMUL_HUE == Settings.flag.emulation) &&
((request.indexOf(F("st:urn:schemas-upnp-org:device:basic:1")) > 0) ||
(request.indexOf(F("st:upnp:rootdevice")) > 0) ||
(request.indexOf(F("st:ssdpsearch:all")) > 0) ||
(request.indexOf(F("st:ssdp:all")) > 0))) {
hue_respondToMSearch();
HueRespondToMSearch();
}
}
}
@ -273,12 +273,12 @@ const char WEMO_SETUP_XML[] PROGMEM =
"<root>"
"<device>"
"<deviceType>urn:Belkin:device:controllee:1</deviceType>"
"<friendlyName>{x1}</friendlyName>"
"<friendlyName>{x1</friendlyName>"
"<manufacturer>Belkin International Inc.</manufacturer>"
"<modelName>Sonoff Socket</modelName>"
"<modelNumber>3.1415</modelNumber>"
"<UDN>uuid:{x2}</UDN>"
"<serialNumber>{x3}</serialNumber>"
"<UDN>uuid:{x2</UDN>"
"<serialNumber>{x3</serialNumber>"
"<binaryState>0</binaryState>"
"<serviceList>"
"<service>"
@ -295,36 +295,36 @@ const char WEMO_SETUP_XML[] PROGMEM =
/********************************************************************************************/
void handleUPnPevent()
void HandleUpnpEvent()
{
addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_BASIC_EVENT));
String request = webServer->arg(0);
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_BASIC_EVENT));
String request = WebServer->arg(0);
if (request.indexOf(F("State>1</Binary")) > 0) {
// do_cmnd_power(1, 1);
do_cmnd_power(Maxdevice, 1);
// ExecuteCommandPower(1, 1);
ExecuteCommandPower(devices_present, 1);
}
if (request.indexOf(F("State>0</Binary")) > 0) {
// do_cmnd_power(1, 0);
do_cmnd_power(Maxdevice, 0);
// ExecuteCommandPower(1, 0);
ExecuteCommandPower(devices_present, 0);
}
webServer->send(200, FPSTR(HDR_CTYPE_PLAIN), "");
WebServer->send(200, FPSTR(HDR_CTYPE_PLAIN), "");
}
void handleUPnPservice()
void HandleUpnpService()
{
addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_EVENT_SERVICE));
webServer->send(200, FPSTR(HDR_CTYPE_PLAIN), FPSTR(WEMO_EVENTSERVICE_XML));
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_EVENT_SERVICE));
WebServer->send(200, FPSTR(HDR_CTYPE_PLAIN), FPSTR(WEMO_EVENTSERVICE_XML));
}
void handleUPnPsetupWemo()
void HandleUpnpSetupWemo()
{
addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_SETUP));
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_SETUP));
String setup_xml = FPSTR(WEMO_SETUP_XML);
setup_xml.replace("{x1}", sysCfg.friendlyname[0]);
setup_xml.replace("{x2}", wemo_UUID());
setup_xml.replace("{x3}", wemo_serial());
webServer->send(200, FPSTR(HDR_CTYPE_XML), setup_xml);
setup_xml.replace("{x1", Settings.friendlyname[0]);
setup_xml.replace("{x2", WemoUuid());
setup_xml.replace("{x3", WemoSerialnumber());
WebServer->send(200, FPSTR(HDR_CTYPE_XML), setup_xml);
}
/*********************************************************************************************\
@ -338,22 +338,22 @@ const char HUE_DESCRIPTION_XML[] PROGMEM =
"<major>1</major>"
"<minor>0</minor>"
"</specVersion>"
// "<URLBase>http://{x1}/</URLBase>"
"<URLBase>http://{x1}:80/</URLBase>"
// "<URLBase>http://{x1/</URLBase>"
"<URLBase>http://{x1:80/</URLBase>"
"<device>"
"<deviceType>urn:schemas-upnp-org:device:Basic:1</deviceType>"
"<friendlyName>Amazon-Echo-HA-Bridge ({x1})</friendlyName>"
// "<friendlyName>Philips hue ({x1})</friendlyName>"
"<friendlyName>Amazon-Echo-HA-Bridge ({x1)</friendlyName>"
// "<friendlyName>Philips hue ({x1)</friendlyName>"
"<manufacturer>Royal Philips Electronics</manufacturer>"
"<modelDescription>Philips hue Personal Wireless Lighting</modelDescription>"
"<modelName>Philips hue bridge 2012</modelName>"
"<modelNumber>929000226503</modelNumber>"
"<serialNumber>{x3}</serialNumber>"
"<UDN>uuid:{x2}</UDN>"
"<serialNumber>{x3</serialNumber>"
"<UDN>uuid:{x2</UDN>"
"</device>"
"</root>\r\n"
"\r\n";
const char HUE_LIGHT_STATUS_JSON[] PROGMEM =
const char HueLightStatus_JSON[] PROGMEM =
"\"on\":{state},"
"\"bri\":{b},"
"\"hue\":{h},"
@ -366,31 +366,31 @@ const char HUE_LIGHT_STATUS_JSON[] PROGMEM =
"\"reachable\":true";
const char HUE_LIGHTS_STATUS_JSON[] PROGMEM =
"\"type\":\"Extended color light\","
"\"name\":\"{j1}\","
"\"name\":\"{j1\","
"\"modelid\":\"LCT007\","
"\"uniqueid\":\"{j2}\","
"\"uniqueid\":\"{j2\","
"\"swversion\":\"5.50.1.19085\""
"}";
const char HUE_GROUP0_STATUS_JSON[] PROGMEM =
"{\"name\":\"Group 0\","
"\"lights\":[{l1}],"
"\"lights\":[{l1],"
"\"type\":\"LightGroup\","
"\"action\":{";
// "\"scene\":\"none\",";
const char HUE_CONFIG_RESPONSE_JSON[] PROGMEM =
const char HueConfigResponse_JSON[] PROGMEM =
"{\"name\":\"Philips hue\","
"\"mac\":\"{mac}\","
"\"mac\":\"{ma\","
"\"dhcp\":true,"
"\"ipaddress\":\"{ip}\","
"\"netmask\":\"{mask}\","
"\"gateway\":\"{gw}\","
"\"ipaddress\":\"{ip\","
"\"netmask\":\"{ms\","
"\"gateway\":\"{gw\","
"\"proxyaddress\":\"none\","
"\"proxyport\":0,"
"\"bridgeid\":\"{bid}\","
"\"UTC\":\"{dt}\","
"\"whitelist\":{\"{id}\":{"
"\"last use date\":\"{dt}\","
"\"create date\":\"{dt}\","
"\"bridgeid\":\"{br\","
"\"UTC\":\"{dt\","
"\"whitelist\":{\"{id\":{"
"\"last use date\":\"{dt\","
"\"create date\":\"{dt\","
"\"name\":\"Remote\"}},"
"\"swversion\":\"01039019\","
"\"apiversion\":\"1.17.0\","
@ -399,20 +399,20 @@ const char HUE_CONFIG_RESPONSE_JSON[] PROGMEM =
"\"portalservices\":false"
"}";
const char HUE_LIGHT_RESPONSE_JSON[] PROGMEM =
"{\"success\":{\"/lights/{id}/state/{cmd}\":{res}}}";
"{\"success\":{\"/lights/{id/state/{cm\":{re}}";
const char HUE_ERROR_JSON[] PROGMEM =
"[{\"error\":{\"type\":901,\"address\":\"/\",\"description\":\"Internal Error\"}}]";
/********************************************************************************************/
String hue_deviceId(uint8_t id)
String GetHueDeviceId(uint8_t id)
{
String deviceid = WiFi.macAddress() + F(":00:11-") + String(id);
deviceid.toLowerCase();
return deviceid; // 5c:cf:7f:13:9f:3d:00:11-1
}
String hue_userId()
String GetHueUserId()
{
char userid[7];
@ -420,50 +420,50 @@ String hue_userId()
return String(userid);
}
void handleUPnPsetupHue()
void HandleUpnpSetupHue()
{
addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_HUE_BRIDGE_SETUP));
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_HUE_BRIDGE_SETUP));
String description_xml = FPSTR(HUE_DESCRIPTION_XML);
description_xml.replace("{x1}", WiFi.localIP().toString());
description_xml.replace("{x2}", hue_UUID());
description_xml.replace("{x3}", hue_serial());
webServer->send(200, FPSTR(HDR_CTYPE_XML), description_xml);
description_xml.replace("{x1", WiFi.localIP().toString());
description_xml.replace("{x2", HueUuid());
description_xml.replace("{x3", HueSerialnumber());
WebServer->send(200, FPSTR(HDR_CTYPE_XML), description_xml);
}
void hue_todo(String *path)
void HueNotImplemented(String *path)
{
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_HTTP D_HUE_API_NOT_IMPLEMENTED " (%s)"), path->c_str());
addLog(LOG_LEVEL_DEBUG_MORE);
AddLog(LOG_LEVEL_DEBUG_MORE);
webServer->send(200, FPSTR(HDR_CTYPE_JSON), "{}");
WebServer->send(200, FPSTR(HDR_CTYPE_JSON), "{}");
}
void hue_config_response(String *response)
void HueConfigResponse(String *response)
{
*response += FPSTR(HUE_CONFIG_RESPONSE_JSON);
response->replace("{mac}", WiFi.macAddress());
response->replace("{ip}", WiFi.localIP().toString());
response->replace("{mask}", WiFi.subnetMask().toString());
response->replace("{gw}", WiFi.gatewayIP().toString());
response->replace("{bid}", hue_bridgeid());
response->replace("{dt}", getUTCDateTime());
response->replace("{id}", hue_userId());
*response += FPSTR(HueConfigResponse_JSON);
response->replace("{ma", WiFi.macAddress());
response->replace("{ip", WiFi.localIP().toString());
response->replace("{ms", WiFi.subnetMask().toString());
response->replace("{gw", WiFi.gatewayIP().toString());
response->replace("{br", HueBridgeId());
response->replace("{dt", GetUtcDateAndTime());
response->replace("{id", GetHueUserId());
}
void hue_config(String *path)
void HueConfig(String *path)
{
String response = "";
hue_config_response(&response);
webServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
HueConfigResponse(&response);
WebServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
}
void hue_light_status(byte device, String *response)
void HueLightStatus(byte device, String *response)
{
*response += FPSTR(HUE_LIGHT_STATUS_JSON);
response->replace("{state}", (power & (0x01 << (device-1))) ? "true" : "false");
*response += FPSTR(HueLightStatus_JSON);
response->replace("{state}", (power & (1 << (device-1))) ? "true" : "false");
if (sfl_flg) {
sl_replaceHSB(response);
if (light_type) {
LightReplaceHsb(response);
} else {
response->replace("{h}", "0");
response->replace("{s}", "0");
@ -471,39 +471,40 @@ void hue_light_status(byte device, String *response)
}
}
void hue_global_cfg(String *path)
void HueGlobalConfig(String *path)
{
String response;
uint8_t maxhue = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present;
path->remove(0,1); // cut leading / to get <id>
path->remove(0,1); // cut leading / to get <id>
response = F("{\"lights\":{\"");
for (uint8_t i = 1; i <= Maxdevice; i++) {
for (uint8_t i = 1; i <= maxhue; i++) {
response += i;
response += F("\":{\"state\":{");
hue_light_status(i, &response);
HueLightStatus(i, &response);
response += "},";
response += FPSTR(HUE_LIGHTS_STATUS_JSON);
response.replace("{j1}", sysCfg.friendlyname[i-1]);
response.replace("{j2}", hue_deviceId(i));
if (i < Maxdevice) {
response.replace("{j1", Settings.friendlyname[i-1]);
response.replace("{j2", GetHueDeviceId(i));
if (i < maxhue) {
response += ",\"";
}
}
response += F("},\"groups\":{},\"schedules\":{},\"config\":");
hue_config_response(&response);
HueConfigResponse(&response);
response += "}";
webServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
WebServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
}
void hue_auth(String *path)
void HueAuthentication(String *path)
{
char response[38];
snprintf_P(response, sizeof(response), PSTR("[{\"success\":{\"username\":\"%s\"}}]"), hue_userId().c_str());
webServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
snprintf_P(response, sizeof(response), PSTR("[{\"success\":{\"username\":\"%s\"}}]"), GetHueUserId().c_str());
WebServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
}
void hue_lights(String *path)
void HueLights(String *path)
{
/*
* http://sonoff/api/username/lights/1/state?1={"on":true,"hue":56100,"sat":254,"bri":254,"alert":"none","transitiontime":40}
@ -520,60 +521,61 @@ void hue_lights(String *path)
bool on = false;
bool change = false;
char id[4];
uint8_t maxhue = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present;
path->remove(0,path->indexOf("/lights")); // Remove until /lights
if (path->endsWith("/lights")) { // Got /lights
path->remove(0,path->indexOf("/lights")); // Remove until /lights
if (path->endsWith("/lights")) { // Got /lights
response = "{\"";
for (uint8_t i = 1; i <= Maxdevice; i++) {
for (uint8_t i = 1; i <= maxhue; i++) {
response += i;
response += F("\":{\"state\":{");
hue_light_status(i, &response);
HueLightStatus(i, &response);
response += "},";
response += FPSTR(HUE_LIGHTS_STATUS_JSON);
response.replace("{j1}", sysCfg.friendlyname[i-1]);
response.replace("{j2}", hue_deviceId(i));
if (i < Maxdevice) {
response.replace("{j1", Settings.friendlyname[i-1]);
response.replace("{j2", GetHueDeviceId(i));
if (i < maxhue) {
response += ",\"";
}
}
response += "}";
webServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
WebServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
}
else if (path->endsWith("/state")) { // Got ID/state
path->remove(0,8); // Remove /lights/
path->remove(path->indexOf("/state")); // Remove /state
else if (path->endsWith("/state")) { // Got ID/state
path->remove(0,8); // Remove /lights/
path->remove(path->indexOf("/state")); // Remove /state
device = atoi(path->c_str());
if ((device < 1) || (device > Maxdevice)) {
if ((device < 1) || (device > maxhue)) {
device = 1;
}
if (1 == webServer->args()) {
if (1 == WebServer->args()) {
response = "[";
StaticJsonBuffer<400> jsonBuffer;
JsonObject &hue_json = jsonBuffer.parseObject(webServer->arg(0));
JsonObject &hue_json = jsonBuffer.parseObject(WebServer->arg(0));
if (hue_json.containsKey("on")) {
response += FPSTR(HUE_LIGHT_RESPONSE_JSON);
response.replace("{id}", String(device));
response.replace("{cmd}", "on");
response.replace("{id", String(device));
response.replace("{cm", "on");
on = hue_json["on"];
switch(on)
{
case false : do_cmnd_power(device, 0);
response.replace("{res}", "false");
case false : ExecuteCommandPower(device, 0);
response.replace("{re", "false");
break;
case true : do_cmnd_power(device, 1);
response.replace("{res}", "true");
case true : ExecuteCommandPower(device, 1);
response.replace("{re", "true");
break;
default : response.replace("{res}", (power & (0x01 << (device-1))) ? "true" : "false");
default : response.replace("{re", (power & (1 << (device-1))) ? "true" : "false");
break;
}
resp = true;
}
if (sfl_flg) {
sl_getHSB(&hue,&sat,&bri);
if (light_type) {
LightGetHsb(&hue,&sat,&bri);
}
if (hue_json.containsKey("bri")) {
@ -583,9 +585,9 @@ void hue_lights(String *path)
response += ",";
}
response += FPSTR(HUE_LIGHT_RESPONSE_JSON);
response.replace("{id}", String(device));
response.replace("{cmd}", "bri");
response.replace("{res}", String(tmp));
response.replace("{id", String(device));
response.replace("{cm", "bri");
response.replace("{re", String(tmp));
resp = true;
change = true;
}
@ -596,9 +598,9 @@ void hue_lights(String *path)
response += ",";
}
response += FPSTR(HUE_LIGHT_RESPONSE_JSON);
response.replace("{id}", String(device));
response.replace("{cmd}", "hue");
response.replace("{res}", String(tmp));
response.replace("{id", String(device));
response.replace("{cm", "hue");
response.replace("{re", String(tmp));
resp = true;
change = true;
}
@ -609,25 +611,25 @@ void hue_lights(String *path)
response += ",";
}
response += FPSTR(HUE_LIGHT_RESPONSE_JSON);
response.replace("{id}", String(device));
response.replace("{cmd}", "sat");
response.replace("{res}", String(tmp));
response.replace("{id", String(device));
response.replace("{cm", "sat");
response.replace("{re", String(tmp));
change = true;
}
if (hue_json.containsKey("ct")) { // Color temperature 153 (Cold) to 500 (Warm)
if (hue_json.containsKey("ct")) { // Color temperature 153 (Cold) to 500 (Warm)
ct = hue_json["ct"];
if (resp) {
response += ",";
}
response += FPSTR(HUE_LIGHT_RESPONSE_JSON);
response.replace("{id}", String(device));
response.replace("{cmd}", "ct");
response.replace("{res}", String(ct));
response.replace("{id", String(device));
response.replace("{cm", "ct");
response.replace("{re", String(ct));
change = true;
}
if (change) {
if (sfl_flg) {
sl_setHSB(hue, sat, bri, ct);
if (light_type) {
LightSetHsb(hue, sat, bri, ct);
}
change = false;
}
@ -640,49 +642,50 @@ void hue_lights(String *path)
response = FPSTR(HUE_ERROR_JSON);
}
webServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
WebServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
}
else if(path->indexOf("/lights/") >= 0) { // Got /lights/ID
path->remove(0,8); // Remove /lights/
else if(path->indexOf("/lights/") >= 0) { // Got /lights/ID
path->remove(0,8); // Remove /lights/
device = atoi(path->c_str());
if ((device < 1) || (device > Maxdevice)) {
if ((device < 1) || (device > maxhue)) {
device = 1;
}
response += F("{\"state\":{");
hue_light_status(device, &response);
HueLightStatus(device, &response);
response += "},";
response += FPSTR(HUE_LIGHTS_STATUS_JSON);
response.replace("{j1}", sysCfg.friendlyname[device-1]);
response.replace("{j2}", hue_deviceId(device));
webServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
response.replace("{j1", Settings.friendlyname[device-1]);
response.replace("{j2", GetHueDeviceId(device));
WebServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
}
else {
webServer->send(406, FPSTR(HDR_CTYPE_JSON), "{}");
WebServer->send(406, FPSTR(HDR_CTYPE_JSON), "{}");
}
}
void hue_groups(String *path)
void HueGroups(String *path)
{
/*
* http://sonoff/api/username/groups?1={"name":"Woonkamer","lights":[],"type":"Room","class":"Living room"})
*/
String response = "{}";
uint8_t maxhue = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present;
if (path->endsWith("/0")) {
response = FPSTR(HUE_GROUP0_STATUS_JSON);
String lights = F("\"1\"");
for (uint8_t i = 2; i <= Maxdevice; i++) {
for (uint8_t i = 2; i <= maxhue; i++) {
lights += ",\"" + String(i) + "\"";
}
response.replace("{l1}", lights);
hue_light_status(1, &response);
response.replace("{l1", lights);
HueLightStatus(1, &response);
response += F("}}");
}
webServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
WebServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
}
void handle_hue_api(String *path)
void HandleHueApi(String *path)
{
/* HUE API uses /api/<userid>/<command> syntax. The userid is created by the echo device and
* on original HUE the pressed button allows for creation of this user. We simply ignore the
@ -696,24 +699,24 @@ void handle_hue_api(String *path)
path->remove(0, 4); // remove /api
uint16_t apilen = path->length();
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_HTTP D_HUE_API " (%s)"), path->c_str());
addLog(LOG_LEVEL_DEBUG_MORE);
for (args = 0; args < webServer->args(); args++) {
String json = webServer->arg(args);
AddLog(LOG_LEVEL_DEBUG_MORE); // HTP: Hue API (//lights/1/state)
for (args = 0; args < WebServer->args(); args++) {
String json = WebServer->arg(args);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_HTTP D_HUE_POST_ARGS " (%s)"), json.c_str());
addLog(LOG_LEVEL_DEBUG_MORE);
AddLog(LOG_LEVEL_DEBUG_MORE); // HTP: Hue POST args ({"on":false})
}
if (path->endsWith("/invalid/")) {} // Just ignore
else if (!apilen) hue_auth(path); // New HUE App setup
else if (path->endsWith("/")) hue_auth(path); // New HUE App setup
else if (path->endsWith("/config")) hue_config(path);
else if (path->indexOf("/lights") >= 0) hue_lights(path);
else if (path->indexOf("/groups") >= 0) hue_groups(path);
else if (path->endsWith("/schedules")) hue_todo(path);
else if (path->endsWith("/sensors")) hue_todo(path);
else if (path->endsWith("/scenes")) hue_todo(path);
else if (path->endsWith("/rules")) hue_todo(path);
else hue_global_cfg(path);
if (path->endsWith("/invalid/")) {} // Just ignore
else if (!apilen) HueAuthentication(path); // New HUE App setup
else if (path->endsWith("/")) HueAuthentication(path); // New HUE App setup
else if (path->endsWith("/config")) HueConfig(path);
else if (path->indexOf("/lights") >= 0) HueLights(path);
else if (path->indexOf("/groups") >= 0) HueGroups(path);
else if (path->endsWith("/schedules")) HueNotImplemented(path);
else if (path->endsWith("/sensors")) HueNotImplemented(path);
else if (path->endsWith("/scenes")) HueNotImplemented(path);
else if (path->endsWith("/rules")) HueNotImplemented(path);
else HueGlobalConfig(path);
}
#endif // USE_WEBSERVER
#endif // USE_EMULATION

View File

@ -38,65 +38,54 @@
#endif // USE_WS2812_CTYPE
#endif // USE_WS2812_DMA
struct wsColor {
struct WsColor {
uint8_t red, green, blue;
};
struct ColorScheme {
wsColor* colors;
WsColor* colors;
uint8_t count;
};
wsColor incandescent[2] = { 255, 140, 20, 0, 0, 0 };
wsColor rgb[3] = { 255, 0, 0, 0, 255, 0, 0, 0, 255 };
wsColor christmas[2] = { 255, 0, 0, 0, 255, 0 };
wsColor hanukkah[2] = { 0, 0, 255, 255, 255, 255 };
wsColor kwanzaa[3] = { 255, 0, 0, 0, 0, 0, 0, 255, 0 };
wsColor rainbow[7] = { 255, 0, 0, 255, 128, 0, 255, 255, 0, 0, 255, 0, 0, 0, 255, 128, 0, 255, 255, 0, 255 };
wsColor fire[3] = { 255, 0, 0, 255, 102, 0, 255, 192, 0 };
ColorScheme schemes[7] = {
incandescent, 2,
rgb, 3,
christmas, 2,
hanukkah, 2,
WsColor kIncandescent[2] = { 255, 140, 20, 0, 0, 0 };
WsColor kRgb[3] = { 255, 0, 0, 0, 255, 0, 0, 0, 255 };
WsColor kChristmas[2] = { 255, 0, 0, 0, 255, 0 };
WsColor kHanukkah[2] = { 0, 0, 255, 255, 255, 255 };
WsColor kwanzaa[3] = { 255, 0, 0, 0, 0, 0, 0, 255, 0 };
WsColor kRainbow[7] = { 255, 0, 0, 255, 128, 0, 255, 255, 0, 0, 255, 0, 0, 0, 255, 128, 0, 255, 255, 0, 255 };
WsColor kFire[3] = { 255, 0, 0, 255, 102, 0, 255, 192, 0 };
ColorScheme kSchemes[7] = {
kIncandescent, 2,
kRgb, 3,
kChristmas, 2,
kHanukkah, 2,
kwanzaa, 3,
rainbow, 7,
fire, 3 };
kRainbow, 7,
kFire, 3 };
uint8_t widthValues[5] = {
uint8_t kWidth[5] = {
1, // Small
2, // Medium
4, // Large
8, // Largest
255 }; // All
uint8_t repeatValues[5] = {
uint8_t kRepeat[5] = {
8, // Small
6, // Medium
4, // Large
2, // Largest
1 }; // All
uint8_t speedValues[9] = {
0, // None
1 * (STATES / 10), // Fastest
3 * (STATES / 10),
5 * (STATES / 10), // Fast
7 * (STATES / 10),
9 * (STATES / 10),
11 * (STATES / 10), // Slow
13 * (STATES / 10),
15 * (STATES / 10) }; // Slowest
uint8_t ws2812_showNext = 1;
uint8_t ws_show_next = 1;
/********************************************************************************************/
void ws2812_stripShow()
void Ws2812StripShow()
{
RgbColor c;
if (sysCfg.led_table) {
for (uint16_t i = 0; i < sysCfg.led_pixels; i++) {
if (Settings.light_correction) {
for (uint16_t i = 0; i < Settings.light_pixels; i++) {
c = strip->GetPixelColor(i);
strip->SetPixelColor(i, RgbColor(ledTable[c.R], ledTable[c.G], ledTable[c.B]));
}
@ -113,44 +102,56 @@ int mod(int a, int b)
return ret;
}
void ws2812_clock()
#define cmin(a,b) ((a)<(b)?(a):(b))
void Ws2812UpdatePixelColor(int position, struct RgbColor hand_color, uint8_t hand)
{
RgbColor c;
RgbColor color;
strip->ClearTo(0); // Reset strip
float newDim = 100 / (float)sysCfg.led_dimmer[0];
float f1 = 255 / newDim;
uint8_t i1 = (uint8_t)f1;
float f2 = 127 / newDim;
uint8_t i2 = (uint8_t)f2;
float f3 = 63 / newDim;
uint8_t i3 = (uint8_t)f3;
uint16_t mod_position = mod(position, (int)Settings.light_pixels);
int j = sysCfg.led_pixels;
int clksize = 600 / j;
int i = (rtcTime.Second * 10) / clksize;
c = strip->GetPixelColor(mod(i, j)); c.B = i1; strip->SetPixelColor(mod(i, j), c);
i = (rtcTime.Minute * 10) / clksize;
c = strip->GetPixelColor(mod(i -1, j)); c.G = i3; strip->SetPixelColor(mod(i -1, j), c);
c = strip->GetPixelColor(mod(i, j)); c.G = i1; strip->SetPixelColor(mod(i, j), c);
c = strip->GetPixelColor(mod(i +1, j)); c.G = i3; strip->SetPixelColor(mod(i +1, j), c);
i = (rtcTime.Hour % 12) * (50 / clksize);
c = strip->GetPixelColor(mod(i -2, j)); c.R = i3; strip->SetPixelColor(mod(i -2, j), c);
c = strip->GetPixelColor(mod(i -1, j)); c.R = i2; strip->SetPixelColor(mod(i -1, j), c);
c = strip->GetPixelColor(mod(i, j)); c.R = i1; strip->SetPixelColor(mod(i, j), c);
c = strip->GetPixelColor(mod(i +1, j)); c.R = i2; strip->SetPixelColor(mod(i +1, j), c);
c = strip->GetPixelColor(mod(i +2, j)); c.R = i3; strip->SetPixelColor(mod(i +2, j), c);
ws2812_stripShow();
color = strip->GetPixelColor(mod_position);
float dimmer = 100 / (float)Settings.light_dimmer;
uint8_t offset = 1 << hand;
color.R = cmin(color.R + ((hand_color.R / dimmer) / offset), 255);
color.G = cmin(color.G + ((hand_color.G / dimmer) / offset), 255);
color.B = cmin(color.B + ((hand_color.B / dimmer) / offset), 255);
strip->SetPixelColor(mod_position, color);
}
void ws2812_gradientColor(uint8_t schemenr, struct wsColor* mColor, uint16_t range, uint16_t gradRange, uint16_t i)
void Ws2812UpdateHand(int position, uint8_t index)
{
if (Settings.flag.ws_clock_reverse) {
position = Settings.light_pixels -position;
}
RgbColor hand_color = RgbColor(Settings.ws_color[index][WS_RED], Settings.ws_color[index][WS_GREEN], Settings.ws_color[index][WS_BLUE]);
Ws2812UpdatePixelColor(position, hand_color, 0);
for (uint8_t h = 1; h <= ((Settings.ws_width[index] -1) / 2); h++) {
Ws2812UpdatePixelColor(position -h, hand_color, h);
Ws2812UpdatePixelColor(position +h, hand_color, h);
}
}
void Ws2812Clock()
{
strip->ClearTo(0); // Reset strip
int clksize = 600 / (int)Settings.light_pixels;
Ws2812UpdateHand((RtcTime.second * 10) / clksize, WS_SECOND);
Ws2812UpdateHand((RtcTime.minute * 10) / clksize, WS_MINUTE);
// Ws2812UpdateHand((RtcTime.hour % 12) * (50 / clksize), WS_HOUR);
Ws2812UpdateHand(((RtcTime.hour % 12) * (50 / clksize)) + ((RtcTime.minute * 10) / (12 * clksize)), WS_HOUR);
Ws2812StripShow();
}
void Ws2812GradientColor(uint8_t schemenr, struct WsColor* mColor, uint16_t range, uint16_t gradRange, uint16_t i)
{
/*
* Compute the color of a pixel at position i using a gradient of the color scheme.
* This function is used internally by the gradient function.
*/
ColorScheme scheme = schemes[schemenr];
ColorScheme scheme = kSchemes[schemenr];
uint16_t curRange = i / range;
uint16_t rangeIndex = i % range;
uint16_t colorIndex = rangeIndex / gradRange;
@ -160,16 +161,16 @@ void ws2812_gradientColor(uint8_t schemenr, struct wsColor* mColor, uint16_t ran
start = (scheme.count -1) - start;
end = (scheme.count -1) - end;
}
float newDim = 100 / (float)sysCfg.led_dimmer[0];
float fmyRed = (float)map(rangeIndex % gradRange, 0, gradRange, scheme.colors[start].red, scheme.colors[end].red) / newDim;
float fmyGrn = (float)map(rangeIndex % gradRange, 0, gradRange, scheme.colors[start].green, scheme.colors[end].green) / newDim;
float fmyBlu = (float)map(rangeIndex % gradRange, 0, gradRange, scheme.colors[start].blue, scheme.colors[end].blue) / newDim;
float dimmer = 100 / (float)Settings.light_dimmer;
float fmyRed = (float)map(rangeIndex % gradRange, 0, gradRange, scheme.colors[start].red, scheme.colors[end].red) / dimmer;
float fmyGrn = (float)map(rangeIndex % gradRange, 0, gradRange, scheme.colors[start].green, scheme.colors[end].green) / dimmer;
float fmyBlu = (float)map(rangeIndex % gradRange, 0, gradRange, scheme.colors[start].blue, scheme.colors[end].blue) / dimmer;
mColor->red = (uint8_t)fmyRed;
mColor->green = (uint8_t)fmyGrn;
mColor->blue = (uint8_t)fmyBlu;
}
void ws2812_gradient(uint8_t schemenr)
void Ws2812Gradient(uint8_t schemenr)
{
/*
* This routine courtesy Tony DiCola (Adafruit)
@ -178,28 +179,29 @@ void ws2812_gradient(uint8_t schemenr)
*/
RgbColor c;
ColorScheme scheme = schemes[schemenr];
ColorScheme scheme = kSchemes[schemenr];
if (scheme.count < 2) {
return;
}
uint8_t repeat = repeatValues[sysCfg.led_width]; // number of scheme.count per ledcount
uint16_t range = (uint16_t)ceil((float)sysCfg.led_pixels / (float)repeat);
uint8_t repeat = kRepeat[Settings.light_width]; // number of scheme.count per ledcount
uint16_t range = (uint16_t)ceil((float)Settings.light_pixels / (float)repeat);
uint16_t gradRange = (uint16_t)ceil((float)range / (float)(scheme.count - 1));
uint16_t offset = speedValues[sysCfg.led_speed] > 0 ? stripTimerCntr / speedValues[sysCfg.led_speed] : 0;
uint16_t speed = ((Settings.light_speed * 2) -1) * (STATES / 10);
uint16_t offset = speed > 0 ? strip_timer_counter / speed : 0;
wsColor oldColor, currentColor;
ws2812_gradientColor(schemenr, &oldColor, range, gradRange, offset);
WsColor oldColor, currentColor;
Ws2812GradientColor(schemenr, &oldColor, range, gradRange, offset);
currentColor = oldColor;
for (uint16_t i = 0; i < sysCfg.led_pixels; i++) {
if (repeatValues[sysCfg.led_width] > 1) {
ws2812_gradientColor(schemenr, &currentColor, range, gradRange, i +offset);
for (uint16_t i = 0; i < Settings.light_pixels; i++) {
if (kRepeat[Settings.light_width] > 1) {
Ws2812GradientColor(schemenr, &currentColor, range, gradRange, i +offset);
}
if (sysCfg.led_speed > 0) {
if (Settings.light_speed > 0) {
// Blend old and current color based on time for smooth movement.
c.R = map(stripTimerCntr % speedValues[sysCfg.led_speed], 0, speedValues[sysCfg.led_speed], oldColor.red, currentColor.red);
c.G = map(stripTimerCntr % speedValues[sysCfg.led_speed], 0, speedValues[sysCfg.led_speed], oldColor.green, currentColor.green);
c.B = map(stripTimerCntr % speedValues[sysCfg.led_speed], 0, speedValues[sysCfg.led_speed], oldColor.blue, currentColor.blue);
c.R = map(strip_timer_counter % speed, 0, speed, oldColor.red, currentColor.red);
c.G = map(strip_timer_counter % speed, 0, speed, oldColor.green, currentColor.green);
c.B = map(strip_timer_counter % speed, 0, speed, oldColor.blue, currentColor.blue);
}
else {
// No animation, just use the current color.
@ -210,10 +212,10 @@ void ws2812_gradient(uint8_t schemenr)
strip->SetPixelColor(i, c);
oldColor = currentColor;
}
ws2812_stripShow();
Ws2812StripShow();
}
void ws2812_bars(uint8_t schemenr)
void Ws2812Bars(uint8_t schemenr)
{
/*
* This routine courtesy Tony DiCola (Adafruit)
@ -223,44 +225,45 @@ void ws2812_bars(uint8_t schemenr)
RgbColor c;
uint16_t i;
ColorScheme scheme = schemes[schemenr];
ColorScheme scheme = kSchemes[schemenr];
uint16_t maxSize = sysCfg.led_pixels / scheme.count;
if (widthValues[sysCfg.led_width] > maxSize) {
uint16_t maxSize = Settings.light_pixels / scheme.count;
if (kWidth[Settings.light_width] > maxSize) {
maxSize = 0;
}
uint8_t offset = speedValues[sysCfg.led_speed] > 0 ? stripTimerCntr / speedValues[sysCfg.led_speed] : 0;
uint16_t speed = ((Settings.light_speed * 2) -1) * (STATES / 10);
uint8_t offset = speed > 0 ? strip_timer_counter / speed : 0;
wsColor mcolor[scheme.count];
WsColor mcolor[scheme.count];
memcpy(mcolor, scheme.colors, sizeof(mcolor));
float newDim = 100 / (float)sysCfg.led_dimmer[0];
float dimmer = 100 / (float)Settings.light_dimmer;
for (i = 0; i < scheme.count; i++) {
float fmyRed = (float)mcolor[i].red / newDim;
float fmyGrn = (float)mcolor[i].green / newDim;
float fmyBlu = (float)mcolor[i].blue / newDim;
float fmyRed = (float)mcolor[i].red / dimmer;
float fmyGrn = (float)mcolor[i].green / dimmer;
float fmyBlu = (float)mcolor[i].blue / dimmer;
mcolor[i].red = (uint8_t)fmyRed;
mcolor[i].green = (uint8_t)fmyGrn;
mcolor[i].blue = (uint8_t)fmyBlu;
}
uint8_t colorIndex = offset % scheme.count;
for (i = 0; i < sysCfg.led_pixels; i++) {
for (i = 0; i < Settings.light_pixels; i++) {
if (maxSize) {
colorIndex = ((i + offset) % (scheme.count * widthValues[sysCfg.led_width])) / widthValues[sysCfg.led_width];
colorIndex = ((i + offset) % (scheme.count * kWidth[Settings.light_width])) / kWidth[Settings.light_width];
}
c.R = mcolor[colorIndex].red;
c.G = mcolor[colorIndex].green;
c.B = mcolor[colorIndex].blue;
strip->SetPixelColor(i, c);
}
ws2812_stripShow();
Ws2812StripShow();
}
/*********************************************************************************************\
* Public
\*********************************************************************************************/
void ws2812_init()
void Ws2812Init()
{
#ifdef USE_WS2812_DMA
#if (USE_WS2812_CTYPE == 1)
@ -276,17 +279,17 @@ void ws2812_init()
#endif // USE_WS2812_CTYPE
#endif // USE_WS2812_DMA
strip->Begin();
ws2812_clear();
Ws2812Clear();
}
void ws2812_clear()
void Ws2812Clear()
{
strip->ClearTo(0);
strip->Show();
ws2812_showNext = 1;
ws_show_next = 1;
}
void ws2812_setColor(uint16_t led, uint8_t red, uint8_t green, uint8_t blue)
void Ws2812SetColor(uint16_t led, uint8_t red, uint8_t green, uint8_t blue)
{
RgbColor lcolor;
lcolor.R = red;
@ -296,15 +299,15 @@ void ws2812_setColor(uint16_t led, uint8_t red, uint8_t green, uint8_t blue)
strip->SetPixelColor(led -1, lcolor); // Led 1 is strip Led 0 -> substract offset 1
} else {
// strip->ClearTo(lcolor); // Set WS2812_MAX_LEDS pixels
for (uint16_t i = 0; i < sysCfg.led_pixels; i++) {
for (uint16_t i = 0; i < Settings.light_pixels; i++) {
strip->SetPixelColor(i, lcolor);
}
}
strip->Show();
ws2812_showNext = 1;
ws_show_next = 1;
}
char* ws2812_getColor(uint16_t led, char* scolor)
char* Ws2812GetColor(uint16_t led, char* scolor)
{
uint8_t sl_ledcolor[3];
@ -314,27 +317,31 @@ char* ws2812_getColor(uint16_t led, char* scolor)
sl_ledcolor[2] = lcolor.B;
scolor[0] = '\0';
for (byte i = 0; i < 3; i++) {
snprintf_P(scolor, 11, PSTR("%s%02X"), scolor, sl_ledcolor[i]);
if (Settings.flag.decimal_text) {
snprintf_P(scolor, 25, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", sl_ledcolor[i]);
} else {
snprintf_P(scolor, 25, PSTR("%s%02X"), scolor, sl_ledcolor[i]);
}
}
return scolor;
}
void ws2812_showScheme(uint8_t scheme)
void Ws2812ShowScheme(uint8_t scheme)
{
switch (scheme) {
case 0: // Clock
if (((STATES/10)*2 == state) || (ws2812_showNext)) {
ws2812_clock();
ws2812_showNext = 0;
if (((STATES/10)*2 == state) || (ws_show_next)) {
Ws2812Clock();
ws_show_next = 0;
}
break;
default:
if (1 == sysCfg.led_fade) {
ws2812_gradient(scheme -1);
if (1 == Settings.light_fade) {
Ws2812Gradient(scheme -1);
} else {
ws2812_bars(scheme -1);
Ws2812Bars(scheme -1);
}
ws2812_showNext = 1;
ws_show_next = 1;
break;
}
}

View File

@ -28,48 +28,48 @@
#define BH1750_CONTINUOUS_HIGH_RES_MODE 0x10 // Start measurement at 1lx resolution. Measurement time is approx 120ms.
uint8_t bh1750addr;
uint8_t bh1750type = 0;
char bh1750stype[7];
uint8_t bh1750_address;
uint8_t bh1750_type = 0;
char bh1750_types[7];
uint16_t bh1750_readLux(void)
uint16_t Bh1750ReadLux()
{
Wire.requestFrom(bh1750addr, (uint8_t)2);
Wire.requestFrom(bh1750_address, (uint8_t)2);
byte msb = Wire.read();
byte lsb = Wire.read();
uint16_t value = ((msb << 8) | lsb) / 1.2;
return value;
}
boolean bh1750_detect()
boolean Bh1750Detect()
{
if (bh1750type) {
if (bh1750_type) {
return true;
}
uint8_t status;
boolean success = false;
bh1750addr = BH1750_ADDR1;
Wire.beginTransmission(bh1750addr);
bh1750_address = BH1750_ADDR1;
Wire.beginTransmission(bh1750_address);
Wire.write(BH1750_CONTINUOUS_HIGH_RES_MODE);
status = Wire.endTransmission();
if (status) {
bh1750addr = BH1750_ADDR2;
Wire.beginTransmission(bh1750addr);
bh1750_address = BH1750_ADDR2;
Wire.beginTransmission(bh1750_address);
Wire.write(BH1750_CONTINUOUS_HIGH_RES_MODE);
status = Wire.endTransmission();
}
if (!status) {
success = true;
bh1750type = 1;
strcpy_P(bh1750stype, PSTR("BH1750"));
bh1750_type = 1;
strcpy_P(bh1750_types, PSTR("BH1750"));
}
if (success) {
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), bh1750stype, bh1750addr);
addLog(LOG_LEVEL_DEBUG);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), bh1750_types, bh1750_address);
AddLog(LOG_LEVEL_DEBUG);
} else {
bh1750type = 0;
bh1750_type = 0;
}
return success;
}
@ -78,30 +78,30 @@ boolean bh1750_detect()
* Presentation
\*********************************************************************************************/
void bh1750_mqttPresent(uint8_t* djson)
void MqttShowBh1750(uint8_t* djson)
{
if (!bh1750type) {
if (!bh1750_type) {
return;
}
uint16_t l = bh1750_readLux();
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"%s\":{\"" D_ILLUMINANCE "\":%d}"), mqtt_data, bh1750stype, l);
uint16_t l = Bh1750ReadLux();
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"%s\":{\"" D_ILLUMINANCE "\":%d}"), mqtt_data, bh1750_types, l);
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor5(l);
DomoticzSensor(DZ_ILLUMINANCE, l);
#endif // USE_DOMOTICZ
}
#ifdef USE_WEBSERVER
const char HTTP_SNS_ILLUMINANCE[] PROGMEM =
"<tr><th>BH1750 " D_ILLUMINANCE "</th><td>%d lx</td></tr>";
"<tr><th>BH1750 " D_ILLUMINANCE "</th><td>%d " D_UNIT_LUX "</td></tr>";
String bh1750_webPresent()
String WebShowBh1750()
{
String page = "";
if (bh1750type) {
if (bh1750_type) {
char sensor[80];
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_ILLUMINANCE, bh1750_readLux());
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_ILLUMINANCE, Bh1750ReadLux());
page += sensor;
}
return page;

View File

@ -33,14 +33,13 @@
#define BMP_REGISTER_CHIPID 0xD0
uint8_t bmpaddr;
uint8_t bmptype = 0;
char bmpstype[7];
double bmp_sealevel = 0.0;
uint8_t bmp_address;
uint8_t bmp_type = 0;
char bmp_types[7];
/*********************************************************************************************\
* BMP085 and BME180
*
* Programmer : Heiko Krupp with changes from Theo Arends
\*********************************************************************************************/
#define BMP180_REG_CONTROL 0xF4
@ -62,91 +61,91 @@ char bmpstype[7];
#define BMP180_OSS 3
int16_t cal_ac1;
int16_t cal_ac2;
int16_t cal_ac3;
int16_t cal_b1;
int16_t cal_b2;
int16_t cal_mc;
int16_t cal_md;
int16_t cal_ac1;
int16_t cal_ac2;
int16_t cal_ac3;
int16_t cal_b1;
int16_t cal_b2;
int16_t cal_mc;
int16_t cal_md;
uint16_t cal_ac4;
uint16_t cal_ac5;
uint16_t cal_ac6;
int32_t bmp180_b5 = 0;
int32_t bmp180_b5 = 0;
boolean bmp180_calibration()
boolean Bmp180Calibration()
{
cal_ac1 = i2c_read16(bmpaddr, BMP180_AC1);
cal_ac2 = i2c_read16(bmpaddr, BMP180_AC2);
cal_ac3 = i2c_read16(bmpaddr, BMP180_AC3);
cal_ac4 = i2c_read16(bmpaddr, BMP180_AC4);
cal_ac5 = i2c_read16(bmpaddr, BMP180_AC5);
cal_ac6 = i2c_read16(bmpaddr, BMP180_AC6);
cal_b1 = i2c_read16(bmpaddr, BMP180_VB1);
cal_b2 = i2c_read16(bmpaddr, BMP180_VB2);
cal_mc = i2c_read16(bmpaddr, BMP180_MC);
cal_md = i2c_read16(bmpaddr, BMP180_MD);
cal_ac1 = I2cRead16(bmp_address, BMP180_AC1);
cal_ac2 = I2cRead16(bmp_address, BMP180_AC2);
cal_ac3 = I2cRead16(bmp_address, BMP180_AC3);
cal_ac4 = I2cRead16(bmp_address, BMP180_AC4);
cal_ac5 = I2cRead16(bmp_address, BMP180_AC5);
cal_ac6 = I2cRead16(bmp_address, BMP180_AC6);
cal_b1 = I2cRead16(bmp_address, BMP180_VB1);
cal_b2 = I2cRead16(bmp_address, BMP180_VB2);
cal_mc = I2cRead16(bmp_address, BMP180_MC);
cal_md = I2cRead16(bmp_address, BMP180_MD);
// Check for Errors in calibration data. Value never is 0x0000 or 0xFFFF
if (!cal_ac1 | !cal_ac2 | !cal_ac3 | !cal_ac4 | !cal_ac5 | !cal_ac6 | !cal_b1 | !cal_b2 | !cal_mc | !cal_md) {
return false;
}
if ((cal_ac1 == 0xFFFF)|
(cal_ac2 == 0xFFFF)|
(cal_ac3 == 0xFFFF)|
(cal_ac4 == 0xFFFF)|
(cal_ac5 == 0xFFFF)|
(cal_ac6 == 0xFFFF)|
(cal_b1 == 0xFFFF)|
(cal_b2 == 0xFFFF)|
(cal_mc == 0xFFFF)|
if ((cal_ac1 == 0xFFFF) |
(cal_ac2 == 0xFFFF) |
(cal_ac3 == 0xFFFF) |
(cal_ac4 == 0xFFFF) |
(cal_ac5 == 0xFFFF) |
(cal_ac6 == 0xFFFF) |
(cal_b1 == 0xFFFF) |
(cal_b2 == 0xFFFF) |
(cal_mc == 0xFFFF) |
(cal_md == 0xFFFF)) {
return false;
}
return true;
}
double bmp180_readTemperature()
double Bmp180ReadTemperature()
{
i2c_write8(bmpaddr, BMP180_REG_CONTROL, BMP180_TEMPERATURE);
I2cWrite8(bmp_address, BMP180_REG_CONTROL, BMP180_TEMPERATURE);
delay(5); // 5ms conversion time
int ut = i2c_read16(bmpaddr, BMP180_REG_RESULT);
int ut = I2cRead16(bmp_address, BMP180_REG_RESULT);
int32_t x1 = (ut - (int32_t)cal_ac6) * ((int32_t)cal_ac5) >> 15;
int32_t x2 = ((int32_t)cal_mc << 11) / (x1+(int32_t)cal_md);
bmp180_b5=x1+x2;
int32_t x2 = ((int32_t)cal_mc << 11) / (x1 + (int32_t)cal_md);
bmp180_b5 = x1 + x2;
return ((bmp180_b5+8)>>4)/10.0;
return ((bmp180_b5 + 8) >> 4) / 10.0;
}
double bmp180_readPressure()
double Bmp180ReadPressure()
{
int32_t p;
uint8_t msb;
uint8_t lsb;
uint8_t xlsb;
i2c_write8(bmpaddr, BMP180_REG_CONTROL, BMP180_PRESSURE3); // Highest resolution
delay(2 + (4 << BMP180_OSS)); // 26ms conversion time at ultra high resolution
uint32_t up = i2c_read24(bmpaddr, BMP180_REG_RESULT);
I2cWrite8(bmp_address, BMP180_REG_CONTROL, BMP180_PRESSURE3); // Highest resolution
delay(2 + (4 << BMP180_OSS)); // 26ms conversion time at ultra high resolution
uint32_t up = I2cRead24(bmp_address, BMP180_REG_RESULT);
up >>= (8 - BMP180_OSS);
int32_t b6 = bmp180_b5 - 4000;
int32_t x1 = ((int32_t)cal_b2 * ( (b6 * b6)>>12 )) >> 11;
int32_t x1 = ((int32_t)cal_b2 * ((b6 * b6) >> 12)) >> 11;
int32_t x2 = ((int32_t)cal_ac2 * b6) >> 11;
int32_t x3 = x1 + x2;
int32_t b3 = ((((int32_t)cal_ac1*4 + x3) << BMP180_OSS) + 2)>>2;
int32_t b3 = ((((int32_t)cal_ac1 * 4 + x3) << BMP180_OSS) + 2) >> 2;
x1 = ((int32_t)cal_ac3 * b6) >> 13;
x2 = ((int32_t)cal_b1 * ((b6 * b6) >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
uint32_t b4 = ((uint32_t)cal_ac4 * (uint32_t)(x3 + 32768)) >> 15;
uint32_t b7 = ((uint32_t)up - b3) * (uint32_t)( 50000UL >> BMP180_OSS);
uint32_t b7 = ((uint32_t)up - b3) * (uint32_t)(50000UL >> BMP180_OSS);
if (b7 < 0x80000000) {
p = (b7 * 2) / b4;
} else {
}
else {
p = (b7 / b4) * 2;
}
@ -154,14 +153,8 @@ double bmp180_readPressure()
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
p += ((x1 + x2 + (int32_t)3791)>>4);
return p/100.0; // convert to mbar
}
double bmp180_calcSealevelPressure(float pAbs, float altitude_meters)
{
double pressure = pAbs*100.0;
return (double)(pressure / pow(1.0-altitude_meters/44330, 5.255))/100.0;
p += ((x1 + x2 + (int32_t)3791) >> 4);
return p / 100.0; // convert to mbar
}
/*********************************************************************************************\
@ -170,32 +163,32 @@ double bmp180_calcSealevelPressure(float pAbs, float altitude_meters)
* Programmer : BMP280/BME280 Datasheet and Adafruit with changes by Theo Arends
\*********************************************************************************************/
#define BME280_REGISTER_CONTROLHUMID 0xF2
#define BME280_REGISTER_CONTROL 0xF4
#define BME280_REGISTER_PRESSUREDATA 0xF7
#define BME280_REGISTER_TEMPDATA 0xFA
#define BME280_REGISTER_HUMIDDATA 0xFD
#define BME280_REGISTER_CONTROLHUMID 0xF2
#define BME280_REGISTER_CONTROL 0xF4
#define BME280_REGISTER_PRESSUREDATA 0xF7
#define BME280_REGISTER_TEMPDATA 0xFA
#define BME280_REGISTER_HUMIDDATA 0xFD
#define BME280_REGISTER_DIG_T1 0x88
#define BME280_REGISTER_DIG_T2 0x8A
#define BME280_REGISTER_DIG_T3 0x8C
#define BME280_REGISTER_DIG_P1 0x8E
#define BME280_REGISTER_DIG_P2 0x90
#define BME280_REGISTER_DIG_P3 0x92
#define BME280_REGISTER_DIG_P4 0x94
#define BME280_REGISTER_DIG_P5 0x96
#define BME280_REGISTER_DIG_P6 0x98
#define BME280_REGISTER_DIG_P7 0x9A
#define BME280_REGISTER_DIG_P8 0x9C
#define BME280_REGISTER_DIG_P9 0x9E
#define BME280_REGISTER_DIG_H1 0xA1
#define BME280_REGISTER_DIG_H2 0xE1
#define BME280_REGISTER_DIG_H3 0xE3
#define BME280_REGISTER_DIG_H4 0xE4
#define BME280_REGISTER_DIG_H5 0xE5
#define BME280_REGISTER_DIG_H6 0xE7
#define BME280_REGISTER_DIG_T1 0x88
#define BME280_REGISTER_DIG_T2 0x8A
#define BME280_REGISTER_DIG_T3 0x8C
#define BME280_REGISTER_DIG_P1 0x8E
#define BME280_REGISTER_DIG_P2 0x90
#define BME280_REGISTER_DIG_P3 0x92
#define BME280_REGISTER_DIG_P4 0x94
#define BME280_REGISTER_DIG_P5 0x96
#define BME280_REGISTER_DIG_P6 0x98
#define BME280_REGISTER_DIG_P7 0x9A
#define BME280_REGISTER_DIG_P8 0x9C
#define BME280_REGISTER_DIG_P9 0x9E
#define BME280_REGISTER_DIG_H1 0xA1
#define BME280_REGISTER_DIG_H2 0xE1
#define BME280_REGISTER_DIG_H3 0xE3
#define BME280_REGISTER_DIG_H4 0xE4
#define BME280_REGISTER_DIG_H5 0xE5
#define BME280_REGISTER_DIG_H6 0xE7
struct bme280_calib_data
struct BME280CALIBDATA
{
uint16_t dig_T1;
int16_t dig_T2;
@ -215,212 +208,201 @@ struct bme280_calib_data
int16_t dig_H4;
int16_t dig_H5;
int8_t dig_H6;
} _bme280_calib;
} Bme280CalibrationData;
int32_t t_fine;
boolean bmp280_calibrate()
boolean Bmx280Calibrate()
{
// if (i2c_read8(bmpaddr, BMP_REGISTER_CHIPID) != BMP280_CHIPID) return false;
// if (I2cRead8(bmp_address, BMP_REGISTER_CHIPID) != BME280_CHIPID) return false;
_bme280_calib.dig_T1 = i2c_read16_LE(bmpaddr, BME280_REGISTER_DIG_T1);
_bme280_calib.dig_T2 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_T2);
_bme280_calib.dig_T3 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_T3);
_bme280_calib.dig_P1 = i2c_read16_LE(bmpaddr, BME280_REGISTER_DIG_P1);
_bme280_calib.dig_P2 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P2);
_bme280_calib.dig_P3 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P3);
_bme280_calib.dig_P4 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P4);
_bme280_calib.dig_P5 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P5);
_bme280_calib.dig_P6 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P6);
_bme280_calib.dig_P7 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P7);
_bme280_calib.dig_P8 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P8);
_bme280_calib.dig_P9 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P9);
Bme280CalibrationData.dig_T1 = I2cRead16LE(bmp_address, BME280_REGISTER_DIG_T1);
Bme280CalibrationData.dig_T2 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_T2);
Bme280CalibrationData.dig_T3 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_T3);
Bme280CalibrationData.dig_P1 = I2cRead16LE(bmp_address, BME280_REGISTER_DIG_P1);
Bme280CalibrationData.dig_P2 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_P2);
Bme280CalibrationData.dig_P3 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_P3);
Bme280CalibrationData.dig_P4 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_P4);
Bme280CalibrationData.dig_P5 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_P5);
Bme280CalibrationData.dig_P6 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_P6);
Bme280CalibrationData.dig_P7 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_P7);
Bme280CalibrationData.dig_P8 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_P8);
Bme280CalibrationData.dig_P9 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_P9);
if (BME280_CHIPID == bmp_type) {
Bme280CalibrationData.dig_H1 = I2cRead8(bmp_address, BME280_REGISTER_DIG_H1);
Bme280CalibrationData.dig_H2 = I2cReadS16_LE(bmp_address, BME280_REGISTER_DIG_H2);
Bme280CalibrationData.dig_H3 = I2cRead8(bmp_address, BME280_REGISTER_DIG_H3);
Bme280CalibrationData.dig_H4 = (I2cRead8(bmp_address, BME280_REGISTER_DIG_H4) << 4) | (I2cRead8(bmp_address, BME280_REGISTER_DIG_H4 + 1) & 0xF);
Bme280CalibrationData.dig_H5 = (I2cRead8(bmp_address, BME280_REGISTER_DIG_H5 + 1) << 4) | (I2cRead8(bmp_address, BME280_REGISTER_DIG_H5) >> 4);
Bme280CalibrationData.dig_H6 = (int8_t)I2cRead8(bmp_address, BME280_REGISTER_DIG_H6);
// i2c_write8(bmpaddr, BME280_REGISTER_CONTROL, 0x3F); // Temp 1x oversampling, Press 16x oversampling, normal mode (Adafruit)
i2c_write8(bmpaddr, BME280_REGISTER_CONTROL, 0xB7); // 16x oversampling, normal mode (Adafruit)
// Set before CONTROL_meas (DS 5.4.3)
I2cWrite8(bmp_address, BME280_REGISTER_CONTROLHUMID, 0x05); // 16x oversampling (Adafruit)
}
I2cWrite8(bmp_address, BME280_REGISTER_CONTROL, 0xB7); // 16x oversampling, normal mode (Adafruit)
return true;
}
boolean bme280_calibrate()
{
// if (i2c_read8(bmpaddr, BMP_REGISTER_CHIPID) != BME280_CHIPID) return false;
_bme280_calib.dig_T1 = i2c_read16_LE(bmpaddr, BME280_REGISTER_DIG_T1);
_bme280_calib.dig_T2 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_T2);
_bme280_calib.dig_T3 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_T3);
_bme280_calib.dig_P1 = i2c_read16_LE(bmpaddr, BME280_REGISTER_DIG_P1);
_bme280_calib.dig_P2 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P2);
_bme280_calib.dig_P3 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P3);
_bme280_calib.dig_P4 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P4);
_bme280_calib.dig_P5 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P5);
_bme280_calib.dig_P6 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P6);
_bme280_calib.dig_P7 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P7);
_bme280_calib.dig_P8 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P8);
_bme280_calib.dig_P9 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_P9);
_bme280_calib.dig_H1 = i2c_read8(bmpaddr, BME280_REGISTER_DIG_H1);
_bme280_calib.dig_H2 = i2c_readS16_LE(bmpaddr, BME280_REGISTER_DIG_H2);
_bme280_calib.dig_H3 = i2c_read8(bmpaddr, BME280_REGISTER_DIG_H3);
_bme280_calib.dig_H4 = (i2c_read8(bmpaddr, BME280_REGISTER_DIG_H4) << 4) | (i2c_read8(bmpaddr, BME280_REGISTER_DIG_H4 + 1) & 0xF);
_bme280_calib.dig_H5 = (i2c_read8(bmpaddr, BME280_REGISTER_DIG_H5 + 1) << 4) | (i2c_read8(bmpaddr, BME280_REGISTER_DIG_H5) >> 4);
_bme280_calib.dig_H6 = (int8_t)i2c_read8(bmpaddr, BME280_REGISTER_DIG_H6);
// Set before CONTROL_meas (DS 5.4.3)
i2c_write8(bmpaddr, BME280_REGISTER_CONTROLHUMID, 0x05); // 16x oversampling (Adafruit)
i2c_write8(bmpaddr, BME280_REGISTER_CONTROL, 0xB7); // 16x oversampling, normal mode (Adafruit)
return true;
}
double bmp280_readTemperature(void)
double Bme280ReadTemperature(void)
{
int32_t var1;
int32_t var2;
int32_t adc_T = i2c_read24(bmpaddr, BME280_REGISTER_TEMPDATA);
int32_t adc_T = I2cRead24(bmp_address, BME280_REGISTER_TEMPDATA);
adc_T >>= 4;
var1 = ((((adc_T>>3) - ((int32_t)_bme280_calib.dig_T1 <<1))) * ((int32_t)_bme280_calib.dig_T2)) >> 11;
var2 = (((((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1)) * ((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1))) >> 12) *
((int32_t)_bme280_calib.dig_T3)) >> 14;
var1 = ((((adc_T >> 3) - ((int32_t)Bme280CalibrationData.dig_T1 << 1))) * ((int32_t)Bme280CalibrationData.dig_T2)) >> 11;
var2 = (((((adc_T >> 4) - ((int32_t)Bme280CalibrationData.dig_T1)) * ((adc_T >> 4) - ((int32_t)Bme280CalibrationData.dig_T1))) >> 12) *
((int32_t)Bme280CalibrationData.dig_T3)) >> 14;
t_fine = var1 + var2;
double T = (t_fine * 5 + 128) >> 8;
double T = (t_fine * 5 + 128) >> 8;
return T / 100.0;
}
double bmp280_readPressure(void)
double Bme280ReadPressure(void)
{
int64_t var1;
int64_t var2;
int64_t p;
// Must be done first to get the t_fine variable set up
// bmp280_readTemperature();
// Must be done first to get the t_fine variable set up
// Bme280ReadTemperature();
int32_t adc_P = i2c_read24(bmpaddr, BME280_REGISTER_PRESSUREDATA);
int32_t adc_P = I2cRead24(bmp_address, BME280_REGISTER_PRESSUREDATA);
adc_P >>= 4;
var1 = ((int64_t)t_fine) - 128000;
var2 = var1 * var1 * (int64_t)_bme280_calib.dig_P6;
var2 = var2 + ((var1 * (int64_t)_bme280_calib.dig_P5) << 17);
var2 = var2 + (((int64_t)_bme280_calib.dig_P4) << 35);
var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3) >> 8) + ((var1 * (int64_t)_bme280_calib.dig_P2) << 12);
var1 = (((((int64_t)1) << 47) + var1)) * ((int64_t)_bme280_calib.dig_P1) >> 33;
var2 = var1 * var1 * (int64_t)Bme280CalibrationData.dig_P6;
var2 = var2 + ((var1 * (int64_t)Bme280CalibrationData.dig_P5) << 17);
var2 = var2 + (((int64_t)Bme280CalibrationData.dig_P4) << 35);
var1 = ((var1 * var1 * (int64_t)Bme280CalibrationData.dig_P3) >> 8) + ((var1 * (int64_t)Bme280CalibrationData.dig_P2) << 12);
var1 = (((((int64_t)1) << 47) + var1)) * ((int64_t)Bme280CalibrationData.dig_P1) >> 33;
if (0 == var1) {
return 0; // avoid exception caused by division by zero
return 0; // avoid exception caused by division by zero
}
p = 1048576 - adc_P;
p = (((p << 31) - var2) * 3125) / var1;
var1 = (((int64_t)_bme280_calib.dig_P9) * (p >> 13) * (p >> 13)) >> 25;
var2 = (((int64_t)_bme280_calib.dig_P8) * p) >> 19;
p = ((p + var1 + var2) >> 8) + (((int64_t)_bme280_calib.dig_P7) << 4);
var1 = (((int64_t)Bme280CalibrationData.dig_P9) * (p >> 13) * (p >> 13)) >> 25;
var2 = (((int64_t)Bme280CalibrationData.dig_P8) * p) >> 19;
p = ((p + var1 + var2) >> 8) + (((int64_t)Bme280CalibrationData.dig_P7) << 4);
return (double)p / 25600.0;
}
double bme280_readHumidity(void)
double Bme280ReadHumidity(void)
{
int32_t v_x1_u32r;
// Must be done first to get the t_fine variable set up
// bmp280_readTemperature();
// Must be done first to get the t_fine variable set up
// Bme280ReadTemperature();
int32_t adc_H = i2c_read16(bmpaddr, BME280_REGISTER_HUMIDDATA);
int32_t adc_H = I2cRead16(bmp_address, BME280_REGISTER_HUMIDDATA);
v_x1_u32r = (t_fine - ((int32_t)76800));
v_x1_u32r = (((((adc_H << 14) - (((int32_t)_bme280_calib.dig_H4) << 20) -
(((int32_t)_bme280_calib.dig_H5) * v_x1_u32r)) + ((int32_t)16384)) >> 15) *
(((((((v_x1_u32r * ((int32_t)_bme280_calib.dig_H6)) >> 10) *
(((v_x1_u32r * ((int32_t)_bme280_calib.dig_H3)) >> 11) + ((int32_t)32768))) >> 10) +
((int32_t)2097152)) * ((int32_t)_bme280_calib.dig_H2) + 8192) >> 14));
v_x1_u32r = (((((adc_H << 14) - (((int32_t)Bme280CalibrationData.dig_H4) << 20) -
(((int32_t)Bme280CalibrationData.dig_H5) * v_x1_u32r)) + ((int32_t)16384)) >> 15) *
(((((((v_x1_u32r * ((int32_t)Bme280CalibrationData.dig_H6)) >> 10) *
(((v_x1_u32r * ((int32_t)Bme280CalibrationData.dig_H3)) >> 11) + ((int32_t)32768))) >> 10) +
((int32_t)2097152)) * ((int32_t)Bme280CalibrationData.dig_H2) + 8192) >> 14));
v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) *
((int32_t)_bme280_calib.dig_H1)) >> 4));
((int32_t)Bme280CalibrationData.dig_H1)) >> 4));
v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r;
v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r;
double h = (v_x1_u32r >> 12);
return h / 1024.0;
return h / 1024.0;
}
/*********************************************************************************************\
* BMP
\*********************************************************************************************/
double bmp_readTemperature(void)
double BmpReadTemperature(void)
{
double t = NAN;
switch (bmptype) {
switch (bmp_type)
{
case BMP180_CHIPID:
t = bmp180_readTemperature();
t = Bmp180ReadTemperature();
break;
case BMP280_CHIPID:
case BME280_CHIPID:
t = bmp280_readTemperature();
t = Bme280ReadTemperature();
}
if (!isnan(t)) {
t = convertTemp(t);
if (!isnan(t))
{
t = ConvertTemp(t);
return t;
}
return 0;
}
double bmp_readPressure(void)
double BmpReadPressure(void)
{
switch (bmptype) {
double pressure = 0.0;
switch (bmp_type) {
case BMP180_CHIPID:
return bmp180_readPressure();
pressure = Bmp180ReadPressure();
break;
case BMP280_CHIPID:
case BME280_CHIPID:
return bmp280_readPressure();
pressure = Bme280ReadPressure();
}
return 0;
if (pressure != 0.0) {
// bmp_sealevel = pressure / pow(1.0 - ((float)Settings.altitude / 44330.0), 5.255); // pow adds 8k to the code
bmp_sealevel = (pressure / FastPrecisePow(1.0 - ((float)Settings.altitude / 44330.0), 5.255)) - 21.6;
}
return pressure;
}
double bmp_readHumidity(void)
double BmpReadHumidity(void)
{
switch (bmptype) {
switch (bmp_type) {
case BMP180_CHIPID:
case BMP280_CHIPID:
break;
case BME280_CHIPID:
return bme280_readHumidity();
return Bme280ReadHumidity();
}
return 0;
}
boolean bmp_detect()
boolean BmpDetect()
{
if (bmptype) {
if (bmp_type) {
return true;
}
boolean success = false;
bmpaddr = BMP_ADDR;
bmptype = i2c_read8(bmpaddr, BMP_REGISTER_CHIPID);
if (!bmptype) {
bmpaddr--;
bmptype = i2c_read8(bmpaddr, BMP_REGISTER_CHIPID);
bmp_address = BMP_ADDR;
bmp_type = I2cRead8(bmp_address, BMP_REGISTER_CHIPID);
if (!bmp_type) {
bmp_address--;
bmp_type = I2cRead8(bmp_address, BMP_REGISTER_CHIPID);
}
strcpy_P(bmpstype, PSTR("BMP"));
switch (bmptype) {
strcpy_P(bmp_types, PSTR("BMP"));
switch (bmp_type) {
case BMP180_CHIPID:
success = bmp180_calibration();
strcpy_P(bmpstype, PSTR("BMP180"));
success = Bmp180Calibration();
strcpy_P(bmp_types, PSTR("BMP180"));
break;
case BMP280_CHIPID:
success = bmp280_calibrate();
strcpy_P(bmpstype, PSTR("BMP280"));
success = Bmx280Calibrate();
strcpy_P(bmp_types, PSTR("BMP280"));
break;
case BME280_CHIPID:
success = bme280_calibrate();
strcpy_P(bmpstype, PSTR("BME280"));
success = Bmx280Calibrate();
strcpy_P(bmp_types, PSTR("BME280"));
}
if (success) {
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), bmpstype, bmpaddr);
addLog(LOG_LEVEL_DEBUG);
} else {
bmptype = 0;
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), bmp_types, bmp_address);
AddLog(LOG_LEVEL_DEBUG);
}
else {
bmp_type = 0;
}
return success;
}
@ -429,61 +411,71 @@ boolean bmp_detect()
* Presentation
\*********************************************************************************************/
void bmp_mqttPresent(uint8_t* djson)
void MqttShowBmp(uint8_t *djson)
{
if (!bmptype) {
if (!bmp_type) {
return;
}
char stemp1[10];
char stemp2[10];
char stemp3[10];
char temperature[10];
char pressure[10];
char humidity[10];
char sea_pressure[10];
char sealevel[40];
double t = bmp_readTemperature();
double p = bmp_readPressure();
double h = bmp_readHumidity();
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
dtostrfd(p, sysCfg.flag.pressure_resolution, stemp2);
dtostrfd(h, sysCfg.flag.humidity_resolution, stemp3);
if (!strcmp(bmpstype,"BME280")) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s, \"" D_PRESSURE "\":%s}"),
mqtt_data, bmpstype, stemp1, stemp3, stemp2);
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_PRESSURE "\":%s}"),
mqtt_data, bmpstype, stemp1, stemp2);
double t = BmpReadTemperature();
double p = BmpReadPressure();
double h = BmpReadHumidity();
dtostrfd(t, Settings.flag.temperature_resolution, temperature);
dtostrfd(p, Settings.flag.pressure_resolution, pressure);
dtostrfd(h, Settings.flag.humidity_resolution, humidity);
dtostrfd(bmp_sealevel, Settings.flag.pressure_resolution, sea_pressure);
snprintf_P(sealevel, sizeof(sealevel), PSTR(", \"" D_PRESSUREATSEALEVEL "\":%s"), sea_pressure);
if (BME280_CHIPID == bmp_type) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s, \"" D_PRESSURE "\":%s%s}"),
mqtt_data, bmp_types, temperature, humidity, pressure, (Settings.altitude != 0) ? sealevel : "");
}
else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_PRESSURE "\":%s%s}"),
mqtt_data, bmp_types, temperature, pressure, (Settings.altitude != 0) ? sealevel : "");
}
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor3(stemp1, stemp3, stemp2);
#endif // USE_DOMOTICZ
DomoticzTempHumPressureSensor(temperature, humidity, pressure);
#endif // USE_DOMOTICZ
}
#ifdef USE_WEBSERVER
String bmp_webPresent()
String WebShowBmp()
{
String page = "";
if (bmptype) {
if (bmp_type) {
char stemp[10];
char sensor[80];
double t_bmp = bmp_readTemperature();
double p_bmp = bmp_readPressure();
double h_bmp = bmp_readHumidity();
dtostrfi(t_bmp, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, bmpstype, stemp, tempUnit());
double t = BmpReadTemperature();
double p = BmpReadPressure();
double h = BmpReadHumidity();
dtostrfi(t, Settings.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, bmp_types, stemp, TempUnit());
page += sensor;
if (!strcmp(bmpstype,"BME280")) {
dtostrfi(h_bmp, sysCfg.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, bmpstype, stemp);
if (BME280_CHIPID == bmp_type) {
dtostrfi(h, Settings.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, bmp_types, stemp);
page += sensor;
}
dtostrfi(p_bmp, sysCfg.flag.pressure_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_PRESSURE, bmpstype, stemp);
dtostrfi(p, Settings.flag.pressure_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_PRESSURE, bmp_types, stemp);
page += sensor;
if (Settings.altitude != 0) {
dtostrfi(bmp_sealevel, Settings.flag.pressure_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_PRESSUREATSEALEVEL, bmp_types, stemp);
page += sensor;
}
}
return page;
}
#endif // USE_WEBSERVER
#endif // USE_BMP
#endif // USE_I2C
#endif // USE_WEBSERVER
#endif // USE_BMP
#endif // USE_I2C

View File

@ -21,57 +21,57 @@
* Counter sensors (water meters, electricity meters etc.)
\*********************************************************************************************/
unsigned long pTimeLast[MAX_COUNTERS]; // Last counter time in milli seconds
unsigned long last_counter_timer[MAX_COUNTERS]; // Last counter time in milli seconds
void counter_update(byte index)
void CounterUpdate(byte index)
{
unsigned long pTime = millis() - pTimeLast[index -1];
if (pTime > sysCfg.pCounterDebounce) {
pTimeLast[index -1] = millis();
if (bitRead(sysCfg.pCounterType, index -1)) {
rtcMem.pCounter[index -1] = pTime;
unsigned long counter_debounce_time = millis() - last_counter_timer[index -1];
if (counter_debounce_time > Settings.pulse_counter_debounce) {
last_counter_timer[index -1] = millis();
if (bitRead(Settings.pulse_counter_type, index -1)) {
RtcSettings.pulse_counter[index -1] = counter_debounce_time;
} else {
rtcMem.pCounter[index -1]++;
RtcSettings.pulse_counter[index -1]++;
}
// snprintf_P(log_data, sizeof(log_data), PSTR("CNTR: Interrupt %d"), index);
// addLog(LOG_LEVEL_DEBUG);
// AddLog(LOG_LEVEL_DEBUG);
}
}
void counter_update1()
void CounterUpdate1()
{
counter_update(1);
CounterUpdate(1);
}
void counter_update2()
void CounterUpdate2()
{
counter_update(2);
CounterUpdate(2);
}
void counter_update3()
void CounterUpdate3()
{
counter_update(3);
CounterUpdate(3);
}
void counter_update4()
void CounterUpdate4()
{
counter_update(4);
CounterUpdate(4);
}
void counter_savestate()
void CounterSaveState()
{
for (byte i = 0; i < MAX_COUNTERS; i++) {
if (pin[GPIO_CNTR1 +i] < 99) {
sysCfg.pCounter[i] = rtcMem.pCounter[i];
Settings.pulse_counter[i] = RtcSettings.pulse_counter[i];
}
}
}
void counter_init()
void CounterInit()
{
typedef void (*function) () ;
function counter_callbacks[] = { counter_update1, counter_update2, counter_update3, counter_update4 };
function counter_callbacks[] = { CounterUpdate1, CounterUpdate2, CounterUpdate3, CounterUpdate4 };
for (byte i = 0; i < MAX_COUNTERS; i++) {
if (pin[GPIO_CNTR1 +i] < 99) {
@ -85,24 +85,24 @@ void counter_init()
* Presentation
\*********************************************************************************************/
void counter_mqttPresent(uint8_t* djson)
void MqttShowCounter(uint8_t* djson)
{
char stemp[16];
byte dsxflg = 0;
for (byte i = 0; i < MAX_COUNTERS; i++) {
if (pin[GPIO_CNTR1 +i] < 99) {
if (bitRead(sysCfg.pCounterType, i)) {
dtostrfd((double)rtcMem.pCounter[i] / 1000, 3, stemp);
if (bitRead(Settings.pulse_counter_type, i)) {
dtostrfd((double)RtcSettings.pulse_counter[i] / 1000, 3, stemp);
} else {
dsxflg++;
dtostrfd(rtcMem.pCounter[i], 0, stemp);
dtostrfd(RtcSettings.pulse_counter[i], 0, stemp);
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"" D_COUNTER "%d\":%s"), mqtt_data, i +1, stemp);
*djson = 1;
#ifdef USE_DOMOTICZ
if (1 == dsxflg) {
domoticz_sensor6(rtcMem.pCounter[i]);
DomoticzSensor(DZ_COUNT, RtcSettings.pulse_counter[i]);
dsxflg++;
}
#endif // USE_DOMOTICZ
@ -114,7 +114,7 @@ void counter_mqttPresent(uint8_t* djson)
const char HTTP_SNS_COUNTER[] PROGMEM =
"<tr><th>" D_COUNTER "%d</th><td>%s%s</td></tr>";
String counter_webPresent()
String WebShowCounter()
{
String page = "";
char stemp[16];
@ -122,12 +122,12 @@ String counter_webPresent()
for (byte i = 0; i < MAX_COUNTERS; i++) {
if (pin[GPIO_CNTR1 +i] < 99) {
if (bitRead(sysCfg.pCounterType, i)) {
dtostrfi((double)rtcMem.pCounter[i] / 1000, 3, stemp);
if (bitRead(Settings.pulse_counter_type, i)) {
dtostrfi((double)RtcSettings.pulse_counter[i] / 1000, 3, stemp);
} else {
dtostrfi(rtcMem.pCounter[i], 0, stemp);
dtostrfi(RtcSettings.pulse_counter[i], 0, stemp);
}
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_COUNTER, i+1, stemp, (bitRead(sysCfg.pCounterType, i)) ? " " D_UNIT_SECOND : "");
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_COUNTER, i+1, stemp, (bitRead(Settings.pulse_counter_type, i)) ? " " D_UNIT_SECOND : "");
page += sensor;
}
}

View File

@ -27,9 +27,10 @@
\*********************************************************************************************/
#define DHT_MAX_SENSORS 3
#define DHT_MAX_RETRY 8
#define MIN_INTERVAL 2000
uint32_t dht_maxcycles;
uint32_t dht_max_cycles;
uint8_t dht_data[5];
byte dht_sensors = 0;
@ -38,67 +39,72 @@ struct DHTSTRUCT {
byte type;
char stype[10];
uint32_t lastreadtime;
uint16_t lastresult;
uint8_t lastresult;
float t;
float h = 0;
} dht[DHT_MAX_SENSORS];
} Dht[DHT_MAX_SENSORS];
void dht_readPrep()
void DhtReadPrep()
{
for (byte i = 0; i < dht_sensors; i++) {
digitalWrite(dht[i].pin, HIGH);
digitalWrite(Dht[i].pin, HIGH);
}
}
uint32_t dht_expectPulse(byte sensor, bool level)
uint32_t DhtExpectPulse(byte sensor, bool level)
{
uint32_t count = 0;
while (digitalRead(dht[sensor].pin) == level) {
if (count++ >= dht_maxcycles) {
while (digitalRead(Dht[sensor].pin) == level) {
if (count++ >= dht_max_cycles) {
return 0;
}
}
return count;
}
void dht_read(byte sensor)
void DhtRead(byte sensor)
{
uint32_t cycles[80];
uint32_t currenttime = millis();
if ((currenttime - dht[sensor].lastreadtime) < 2000) {
if ((currenttime - Dht[sensor].lastreadtime) < MIN_INTERVAL) {
return;
}
dht[sensor].lastreadtime = currenttime;
Dht[sensor].lastreadtime = currenttime;
dht_data[0] = dht_data[1] = dht_data[2] = dht_data[3] = dht_data[4] = 0;
// digitalWrite(dht[sensor].pin, HIGH);
// digitalWrite(Dht[sensor].pin, HIGH);
// delay(250);
pinMode(dht[sensor].pin, OUTPUT);
digitalWrite(dht[sensor].pin, LOW);
if (Dht[sensor].lastresult > DHT_MAX_RETRY) {
Dht[sensor].lastresult = 0;
digitalWrite(Dht[sensor].pin, HIGH); // Retry read prep
delay(250);
}
pinMode(Dht[sensor].pin, OUTPUT);
digitalWrite(Dht[sensor].pin, LOW);
delay(20);
noInterrupts();
digitalWrite(dht[sensor].pin, HIGH);
digitalWrite(Dht[sensor].pin, HIGH);
delayMicroseconds(40);
pinMode(dht[sensor].pin, INPUT_PULLUP);
pinMode(Dht[sensor].pin, INPUT_PULLUP);
delayMicroseconds(10);
if (0 == dht_expectPulse(sensor, LOW)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_LOW " " D_PULSE));
dht[sensor].lastresult++;
if (0 == DhtExpectPulse(sensor, LOW)) {
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_LOW " " D_PULSE));
Dht[sensor].lastresult++;
return;
}
if (0 == dht_expectPulse(sensor, HIGH)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_HIGH " " D_PULSE));
dht[sensor].lastresult++;
if (0 == DhtExpectPulse(sensor, HIGH)) {
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_HIGH " " D_PULSE));
Dht[sensor].lastresult++;
return;
}
for (int i = 0; i < 80; i += 2) {
cycles[i] = dht_expectPulse(sensor, LOW);
cycles[i+1] = dht_expectPulse(sensor, HIGH);
cycles[i] = DhtExpectPulse(sensor, LOW);
cycles[i+1] = DhtExpectPulse(sensor, HIGH);
}
interrupts();
@ -106,8 +112,8 @@ void dht_read(byte sensor)
uint32_t lowCycles = cycles[2*i];
uint32_t highCycles = cycles[2*i+1];
if ((0 == lowCycles) || (0 == highCycles)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_PULSE));
dht[sensor].lastresult++;
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_PULSE));
Dht[sensor].lastresult++;
return;
}
dht_data[i/8] <<= 1;
@ -118,36 +124,36 @@ void dht_read(byte sensor)
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DHT D_RECEIVED " %02X, %02X, %02X, %02X, %02X =? %02X"),
dht_data[0], dht_data[1], dht_data[2], dht_data[3], dht_data[4], (dht_data[0] + dht_data[1] + dht_data[2] + dht_data[3]) & 0xFF);
addLog(LOG_LEVEL_DEBUG);
AddLog(LOG_LEVEL_DEBUG);
if (dht_data[4] == ((dht_data[0] + dht_data[1] + dht_data[2] + dht_data[3]) & 0xFF)) {
dht[sensor].lastresult = 0;
Dht[sensor].lastresult = 0;
} else {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_CHECKSUM_FAILURE));
dht[sensor].lastresult++;
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_CHECKSUM_FAILURE));
Dht[sensor].lastresult++;
}
}
boolean dht_readTempHum(byte sensor, float &t, float &h)
boolean DhtReadTempHum(byte sensor, float &t, float &h)
{
if (!dht[sensor].h) {
if (!Dht[sensor].h) {
t = NAN;
h = NAN;
} else {
if (dht[sensor].lastresult > 8) { // Reset after 8 misses
dht[sensor].t = NAN;
dht[sensor].h = NAN;
if (Dht[sensor].lastresult > DHT_MAX_RETRY) { // Reset after 8 misses
Dht[sensor].t = NAN;
Dht[sensor].h = NAN;
}
t = dht[sensor].t;
h = dht[sensor].h;
t = Dht[sensor].t;
h = Dht[sensor].h;
}
dht_read(sensor);
if (!dht[sensor].lastresult) {
switch (dht[sensor].type) {
DhtRead(sensor);
if (!Dht[sensor].lastresult) {
switch (Dht[sensor].type) {
case GPIO_DHT11:
h = dht_data[0];
t = convertTemp(dht_data[2]);
t = ConvertTemp(dht_data[2]);
break;
case GPIO_DHT22:
case GPIO_DHT21:
@ -162,52 +168,52 @@ boolean dht_readTempHum(byte sensor, float &t, float &h)
if (dht_data[2] & 0x80) {
t *= -1;
}
t = convertTemp(t);
t = ConvertTemp(t);
break;
}
if (!isnan(t)) {
dht[sensor].t = t;
Dht[sensor].t = t;
}
if (!isnan(h)) {
dht[sensor].h = h;
Dht[sensor].h = h;
}
}
return (!isnan(t) && !isnan(h));
}
boolean dht_setup(byte pin, byte type)
boolean DhtSetup(byte pin, byte type)
{
boolean success = false;
if (dht_sensors < DHT_MAX_SENSORS) {
dht[dht_sensors].pin = pin;
dht[dht_sensors].type = type;
Dht[dht_sensors].pin = pin;
Dht[dht_sensors].type = type;
dht_sensors++;
success = true;
}
return success;
}
void dht_init()
void DhtInit()
{
dht_maxcycles = microsecondsToClockCycles(1000); // 1 millisecond timeout for reading pulses from DHT sensor.
dht_max_cycles = microsecondsToClockCycles(1000); // 1 millisecond timeout for reading pulses from DHT sensor.
for (byte i = 0; i < dht_sensors; i++) {
pinMode(dht[i].pin, INPUT_PULLUP);
dht[i].lastreadtime = 0;
dht[i].lastresult = 0;
switch (dht[i].type) {
pinMode(Dht[i].pin, INPUT_PULLUP);
Dht[i].lastreadtime = 0;
Dht[i].lastresult = 0;
switch (Dht[i].type) {
case GPIO_DHT11:
strcpy_P(dht[i].stype, PSTR("DHT11"));
strcpy_P(Dht[i].stype, PSTR("DHT11"));
break;
case GPIO_DHT21:
strcpy_P(dht[i].stype, PSTR("AM2301"));
strcpy_P(Dht[i].stype, PSTR("AM2301"));
break;
case GPIO_DHT22:
strcpy_P(dht[i].stype, PSTR("DHT22"));
strcpy_P(Dht[i].stype, PSTR("DHT22"));
}
if (dht_sensors > 1) {
snprintf_P(dht[i].stype, sizeof(dht[i].stype), PSTR("%s-%02d"), dht[i].stype, dht[i].pin);
snprintf_P(Dht[i].stype, sizeof(Dht[i].stype), PSTR("%s-%02d"), Dht[i].stype, Dht[i].pin);
}
}
}
@ -216,7 +222,7 @@ void dht_init()
* Presentation
\*********************************************************************************************/
void dht_mqttPresent(uint8_t* djson)
void MqttShowDht(uint8_t* djson)
{
char stemp1[10];
char stemp2[10];
@ -225,14 +231,14 @@ void dht_mqttPresent(uint8_t* djson)
byte dsxflg = 0;
for (byte i = 0; i < dht_sensors; i++) {
if (dht_readTempHum(i, t, h)) { // Read temperature
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
dtostrfd(h, sysCfg.flag.humidity_resolution, stemp2);
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, dht[i].stype, stemp1, stemp2);
if (DhtReadTempHum(i, t, h)) { // Read temperature
dtostrfd(t, Settings.flag.temperature_resolution, stemp1);
dtostrfd(h, Settings.flag.humidity_resolution, stemp2);
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, Dht[i].stype, stemp1, stemp2);
*djson = 1;
#ifdef USE_DOMOTICZ
if (!dsxflg) {
domoticz_sensor2(stemp1, stemp2);
DomoticzTempHumSensor(stemp1, stemp2);
dsxflg++;
}
#endif // USE_DOMOTICZ
@ -241,7 +247,7 @@ void dht_mqttPresent(uint8_t* djson)
}
#ifdef USE_WEBSERVER
String dht_webPresent()
String WebShowDht()
{
String page = "";
char stemp[10];
@ -250,12 +256,12 @@ String dht_webPresent()
float h;
for (byte i = 0; i < dht_sensors; i++) {
if (dht_readTempHum(i, t, h)) {
dtostrfi(t, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, dht[i].stype, stemp, tempUnit());
if (DhtReadTempHum(i, t, h)) {
dtostrfi(t, Settings.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, Dht[i].stype, stemp, TempUnit());
page += sensor;
dtostrfi(h, sysCfg.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, dht[i].stype, stemp);
dtostrfi(h, Settings.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, Dht[i].stype, stemp);
page += sensor;
}
}

View File

@ -24,10 +24,10 @@
* Source: Marinus vd Broek https://github.com/ESP8266nu/ESPEasy and AlexTransit (CRC)
\*********************************************************************************************/
float dsb_mt = 0;
uint16_t dsb_lastresult = 0;
float ds18b20_last_temperature = 0;
uint16_t ds18b20_last_result = 0;
uint8_t dsb_reset()
uint8_t Ds18b20Reset()
{
uint8_t r;
uint8_t retries = 125;
@ -49,7 +49,7 @@ uint8_t dsb_reset()
return r;
}
uint8_t dsb_read_bit(void)
uint8_t Ds18b20ReadBit(void)
{
uint8_t r;
@ -63,20 +63,20 @@ uint8_t dsb_read_bit(void)
return r;
}
uint8_t dsb_read(void)
uint8_t Ds18b20Read(void)
{
uint8_t bitMask;
uint8_t bit_mask;
uint8_t r = 0;
for (bitMask = 0x01; bitMask; bitMask <<= 1) {
if (dsb_read_bit()) {
r |= bitMask;
for (bit_mask = 1; bit_mask; bit_mask <<= 1) {
if (Ds18b20ReadBit()) {
r |= bit_mask;
}
}
return r;
}
void dsb_write_bit(uint8_t v)
void Ds18b20WriteBit(uint8_t v)
{
if (v & 1) {
digitalWrite(pin[GPIO_DSB], LOW);
@ -93,16 +93,16 @@ void dsb_write_bit(uint8_t v)
}
}
void dsb_write(uint8_t ByteToWrite)
void Ds18b20Write(uint8_t byte_to_write)
{
uint8_t bitMask;
uint8_t bit_mask;
for (bitMask = 0x01; bitMask; bitMask <<= 1) {
dsb_write_bit((bitMask & ByteToWrite) ? 1 : 0);
for (bit_mask = 1; bit_mask; bit_mask <<= 1) {
Ds18b20WriteBit((bit_mask & byte_to_write) ? 1 : 0);
}
}
uint8 dsb_crc(uint8 inp, uint8 crc)
uint8 Ds18b20Crc(uint8 inp, uint8 crc)
{
inp ^= crc;
crc = 0;
@ -117,66 +117,66 @@ uint8 dsb_crc(uint8 inp, uint8 crc)
return crc;
}
void dsb_readTempPrep()
void Ds18b20ReadTempPrep()
{
dsb_reset();
dsb_write(0xCC); // Skip ROM
dsb_write(0x44); // Start conversion
Ds18b20Reset();
Ds18b20Write(0xCC); // Skip ROM
Ds18b20Write(0x44); // Start conversion
}
boolean dsb_readTemp(float &t)
boolean Ds18b20ReadTemperature(float &t)
{
int16_t DSTemp;
byte msb, lsb, crc, sign = 1;
if (!dsb_mt) {
if (!ds18b20_last_temperature) {
t = NAN;
} else {
dsb_lastresult++;
if (dsb_lastresult > 8) { // Reset after 8 misses
dsb_mt = NAN;
ds18b20_last_result++;
if (ds18b20_last_result > 8) { // Reset after 8 misses
ds18b20_last_temperature = NAN;
}
t = dsb_mt;
t = ds18b20_last_temperature;
}
if (!dsb_read_bit()) { //check measurement end
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_BUSY));
if (!Ds18b20ReadBit()) { //check measurement end
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_BUSY));
return !isnan(t);
}
/*
dsb_reset();
dsb_write(0xCC); // Skip ROM
dsb_write(0x44); // Start conversion
Ds18b20Reset();
Ds18b20Write(0xCC); // Skip ROM
Ds18b20Write(0x44); // Start conversion
delay(800);
*/
dsb_reset();
dsb_write(0xCC); // Skip ROM
dsb_write(0xBE); // Read scratchpad
lsb = dsb_read();
msb = dsb_read();
crc = dsb_crc(lsb, crc);
crc = dsb_crc(msb, crc);
crc = dsb_crc(dsb_read(), crc);
crc = dsb_crc(dsb_read(), crc);
crc = dsb_crc(dsb_read(), crc);
crc = dsb_crc(dsb_read(), crc);
crc = dsb_crc(dsb_read(), crc);
crc = dsb_crc(dsb_read(), crc);
crc = dsb_crc(dsb_read(), crc);
dsb_reset();
Ds18b20Reset();
Ds18b20Write(0xCC); // Skip ROM
Ds18b20Write(0xBE); // Read scratchpad
lsb = Ds18b20Read();
msb = Ds18b20Read();
crc = Ds18b20Crc(lsb, crc);
crc = Ds18b20Crc(msb, crc);
crc = Ds18b20Crc(Ds18b20Read(), crc);
crc = Ds18b20Crc(Ds18b20Read(), crc);
crc = Ds18b20Crc(Ds18b20Read(), crc);
crc = Ds18b20Crc(Ds18b20Read(), crc);
crc = Ds18b20Crc(Ds18b20Read(), crc);
crc = Ds18b20Crc(Ds18b20Read(), crc);
crc = Ds18b20Crc(Ds18b20Read(), crc);
Ds18b20Reset();
if (crc) { //check crc
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_CRC_ERROR));
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_CRC_ERROR));
} else {
DSTemp = (msb << 8) + lsb;
if (DSTemp > 2047) {
DSTemp = (~DSTemp) +1;
sign = -1;
}
t = convertTemp((float)sign * DSTemp * 0.0625);
dsb_lastresult = 0;
t = ConvertTemp((float)sign * DSTemp * 0.0625);
ds18b20_last_result = 0;
}
if (!isnan(t)) {
dsb_mt = t;
ds18b20_last_temperature = t;
}
return !isnan(t);
}
@ -185,37 +185,37 @@ boolean dsb_readTemp(float &t)
* Presentation
\*********************************************************************************************/
void dsb_mqttPresent(uint8_t* djson)
void MqttShowDs18b20(uint8_t* djson)
{
char stemp1[10];
float t;
if (dsb_readTemp(t)) { // Check if read failed
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
if (Ds18b20ReadTemperature(t)) { // Check if read failed
dtostrfd(t, Settings.flag.temperature_resolution, stemp1);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"DS18B20\":{\"" D_TEMPERATURE "\":%s}"), mqtt_data, stemp1);
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor1(stemp1);
DomoticzSensor(DZ_TEMP, stemp1);
#endif // USE_DOMOTICZ
}
}
#ifdef USE_WEBSERVER
String dsb_webPresent()
String WebShowDs18b20()
{
// Needs TelePeriod to refresh data (Do not do it here as it takes too much time)
String page = "";
float st;
if (dsb_readTemp(st)) { // Check if read failed
if (Ds18b20ReadTemperature(st)) { // Check if read failed
char stemp[10];
char sensor[80];
dtostrfi(st, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, "DS18B20", stemp, tempUnit());
dtostrfi(st, Settings.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, "DS18B20", stemp, TempUnit());
page += sensor;
}
dsb_readTempPrep();
Ds18b20ReadTempPrep();
return page;
}
#endif // USE_WEBSERVER

View File

@ -36,64 +36,62 @@
OneWire *ds = NULL;
uint8_t ds18x20_addr[DS18X20_MAX_SENSORS][8];
uint8_t ds18x20_idx[DS18X20_MAX_SENSORS];
uint8_t ds18x20_snsrs = 0;
char dsbstype[9];
uint8_t ds18x20_address[DS18X20_MAX_SENSORS][8];
uint8_t ds18x20_index[DS18X20_MAX_SENSORS];
uint8_t ds18x20_sensors = 0;
char ds18x20_types[9];
void ds18x20_init()
void Ds18x20Init()
{
ds = new OneWire(pin[GPIO_DSB]);
}
void ds18x20_search()
void Ds18x20Search()
{
uint8_t num_sensors=0;
uint8_t sensor = 0;
uint8_t i;
ds->reset_search();
for (num_sensors = 0; num_sensors < DS18X20_MAX_SENSORS; num_sensors) {
if (!ds->search(ds18x20_addr[num_sensors])) {
if (!ds->search(ds18x20_address[num_sensors])) {
ds->reset_search();
break;
}
// If CRC Ok and Type DS18S20, DS18B20 or MAX31850
if ((OneWire::crc8(ds18x20_addr[num_sensors], 7) == ds18x20_addr[num_sensors][7]) &&
((ds18x20_addr[num_sensors][0]==DS18S20_CHIPID) || (ds18x20_addr[num_sensors][0]==DS18B20_CHIPID) || (ds18x20_addr[num_sensors][0]==MAX31850_CHIPID))) {
if ((OneWire::crc8(ds18x20_address[num_sensors], 7) == ds18x20_address[num_sensors][7]) &&
((ds18x20_address[num_sensors][0]==DS18S20_CHIPID) || (ds18x20_address[num_sensors][0]==DS18B20_CHIPID) || (ds18x20_address[num_sensors][0]==MAX31850_CHIPID))) {
num_sensors++;
}
}
for (int i = 0; i < num_sensors; i++) {
ds18x20_idx[i] = i;
for (byte i = 0; i < num_sensors; i++) {
ds18x20_index[i] = i;
}
for (int i = 0; i < num_sensors; i++) {
for (int j = i + 1; j < num_sensors; j++) {
if (uint32_t(ds18x20_addr[ds18x20_idx[i]]) > uint32_t(ds18x20_addr[ds18x20_idx[j]])) {
std::swap(ds18x20_idx[i], ds18x20_idx[j]);
for (byte i = 0; i < num_sensors; i++) {
for (byte j = i + 1; j < num_sensors; j++) {
if (uint32_t(ds18x20_address[ds18x20_index[i]]) > uint32_t(ds18x20_address[ds18x20_index[j]])) {
std::swap(ds18x20_index[i], ds18x20_index[j]);
}
}
}
ds18x20_snsrs = num_sensors;
ds18x20_sensors = num_sensors;
}
uint8_t ds18x20_sensors()
uint8_t Ds18x20Sensors()
{
return ds18x20_snsrs;
return ds18x20_sensors;
}
String ds18x20_address(uint8_t sensor)
String Ds18x20Addresses(uint8_t sensor)
{
char addrStr[20];
uint8_t i;
char address[20];
for (i = 0; i < 8; i++) {
sprintf(addrStr+2*i, "%02X", ds18x20_addr[ds18x20_idx[sensor]][i]);
for (byte i = 0; i < 8; i++) {
sprintf(address+2*i, "%02X", ds18x20_address[ds18x20_index[sensor]][i]);
}
return String(addrStr);
return String(address);
}
void ds18x20_convert()
void Ds18x20Convert()
{
ds->reset();
ds->write(W1_SKIP_ROM); // Address all Sensors on Bus
@ -101,40 +99,25 @@ void ds18x20_convert()
// delay(750); // 750ms should be enough for 12bit conv
}
boolean ds18x20_read(uint8_t sensor, float &t)
boolean Ds18x20Read(uint8_t sensor, float &t)
{
byte data[12];
int8_t sign = 1;
uint8_t i = 0;
float temp9 = 0.0;
uint8_t present = 0;
t = NAN;
ds->reset();
ds->select(ds18x20_addr[ds18x20_idx[sensor]]);
ds->select(ds18x20_address[ds18x20_index[sensor]]);
ds->write(W1_READ_SCRATCHPAD); // Read Scratchpad
for (i = 0; i < 9; i++) {
for (byte i = 0; i < 9; i++) {
data[i] = ds->read();
}
if (OneWire::crc8(data, 8) == data[8]) {
switch(ds18x20_addr[ds18x20_idx[sensor]][0]) {
switch(ds18x20_address[ds18x20_index[sensor]][0]) {
case DS18S20_CHIPID: // DS18S20
/*
// App_note AN162.pdf page 9
int temp_lsb, temp_msb;
temp_msb = data[1]; // Sign byte + lsbit
temp_lsb = data[0]; // Temp data plus lsb
if (temp_msb <= 0x80) temp_lsb = (temp_lsb/2); // Shift to get whole degree
temp_msb = temp_msb & 0x80; // Mask all but the sign bit
if (temp_msb >= 0x80) { // Negative temperature
temp_lsb = (~temp_lsb)+1; // Twos complement
temp_lsb = (temp_lsb/2); // Shift to get whole degree
temp_lsb = ((-1)*temp_lsb); // Add sign bit
}
t = (int)temp_lsb; // Temperature in whole degree
*/
if (data[1] > 0x80) {
data[0] = (~data[0]) +1;
sign = -1; // App-Note fix possible sign error
@ -144,7 +127,7 @@ boolean ds18x20_read(uint8_t sensor, float &t)
} else {
temp9 = (data[0] >> 1) * sign;
}
t = convertTemp((temp9 - 0.25) + ((16.0 - data[6]) / 16.0));
t = ConvertTemp((temp9 - 0.25) + ((16.0 - data[6]) / 16.0));
break;
case DS18B20_CHIPID: // DS18B20
case MAX31850_CHIPID: // MAX31850
@ -153,7 +136,7 @@ boolean ds18x20_read(uint8_t sensor, float &t)
temp12 = (~temp12) +1;
sign = -1;
}
t = convertTemp(sign * temp12 * 0.0625);
t = ConvertTemp(sign * temp12 * 0.0625);
break;
}
}
@ -164,33 +147,33 @@ boolean ds18x20_read(uint8_t sensor, float &t)
* Presentation
\*********************************************************************************************/
void ds18x20_type(uint8_t sensor)
void Ds18x20Type(uint8_t sensor)
{
strcpy_P(dsbstype, PSTR("DS18x20"));
switch(ds18x20_addr[ds18x20_idx[sensor]][0]) {
strcpy_P(ds18x20_types, PSTR("DS18x20"));
switch(ds18x20_address[ds18x20_index[sensor]][0]) {
case DS18S20_CHIPID:
strcpy_P(dsbstype, PSTR("DS18S20"));
strcpy_P(ds18x20_types, PSTR("DS18S20"));
break;
case DS18B20_CHIPID:
strcpy_P(dsbstype, PSTR("DS18B20"));
strcpy_P(ds18x20_types, PSTR("DS18B20"));
break;
case MAX31850_CHIPID:
strcpy_P(dsbstype, PSTR("MAX31850"));
strcpy_P(ds18x20_types, PSTR("MAX31850"));
break;
}
}
void ds18x20_mqttPresent(uint8_t* djson)
void MqttShowDs18x20(uint8_t* djson)
{
char stemp1[10];
char stemp2[10];
float t;
byte dsxflg = 0;
for (byte i = 0; i < ds18x20_sensors(); i++) {
if (ds18x20_read(i, t)) { // Check if read failed
ds18x20_type(i);
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp2);
for (byte i = 0; i < Ds18x20Sensors(); i++) {
if (Ds18x20Read(i, t)) { // Check if read failed
Ds18x20Type(i);
dtostrfd(t, Settings.flag.temperature_resolution, stemp2);
if (!dsxflg) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"DS18x20\":{"), mqtt_data);
*djson = 1;
@ -198,10 +181,12 @@ void ds18x20_mqttPresent(uint8_t* djson)
}
dsxflg++;
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"DS%d\":{\"" D_TYPE "\":\"%s\", \"" D_ADDRESS "\":\"%s\", \"" D_TEMPERATURE "\":%s}"),
mqtt_data, stemp1, i +1, dsbstype, ds18x20_address(i).c_str(), stemp2);
mqtt_data, stemp1, i +1, ds18x20_types, Ds18x20Addresses(i).c_str(), stemp2);
strcpy(stemp1, ", ");
#ifdef USE_DOMOTICZ
if (1 == dsxflg) domoticz_sensor1(stemp2);
if (1 == dsxflg) {
DomoticzSensor(DZ_TEMP, stemp2);
}
#endif // USE_DOMOTICZ
}
}
@ -211,7 +196,7 @@ void ds18x20_mqttPresent(uint8_t* djson)
}
#ifdef USE_WEBSERVER
String ds18x20_webPresent()
String WebShowDs18x20()
{
String page = "";
char stemp[10];
@ -219,17 +204,17 @@ String ds18x20_webPresent()
char sensor[80];
float t;
for (byte i = 0; i < ds18x20_sensors(); i++) {
if (ds18x20_read(i, t)) { // Check if read failed
ds18x20_type(i);
dtostrfi(t, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(stemp2, sizeof(stemp2), PSTR("%s-%d"), dsbstype, i +1);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, stemp2, stemp, tempUnit());
for (byte i = 0; i < Ds18x20Sensors(); i++) {
if (Ds18x20Read(i, t)) { // Check if read failed
Ds18x20Type(i);
dtostrfi(t, Settings.flag.temperature_resolution, stemp);
snprintf_P(stemp2, sizeof(stemp2), PSTR("%s-%d"), ds18x20_types, i +1);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, stemp2, stemp, TempUnit());
page += sensor;
}
}
ds18x20_search(); // Check for changes in sensors number
ds18x20_convert(); // Start Conversion, takes up to one second
Ds18x20Search(); // Check for changes in sensors number
Ds18x20Convert(); // Start Conversion, takes up to one second
return page;
}
#endif // USE_WEBSERVER

File diff suppressed because it is too large Load Diff

View File

@ -52,13 +52,13 @@
#define HTU21_CRC8_POLYNOM 0x13100
uint8_t htuaddr;
uint8_t htutype = 0;
uint8_t delayT;
uint8_t delayH = 50;
char htustype[7];
uint8_t htu_address;
uint8_t htu_type = 0;
uint8_t delay_temp;
uint8_t delay_humidity = 50;
char htu_types[7];
uint8_t check_crc8(uint16_t data)
uint8_t HtuCheckCrc8(uint16_t data)
{
for (uint8_t bit = 0; bit < 16; bit++) {
if (data & 0x8000) {
@ -70,7 +70,7 @@ uint8_t check_crc8(uint16_t data)
return data >>= 8;
}
uint8_t htu21_readDeviceID(void)
uint8_t HtuReadDeviceId(void)
{
uint16_t deviceID = 0;
uint8_t checksum = 0;
@ -84,7 +84,7 @@ uint8_t htu21_readDeviceID(void)
deviceID = Wire.read() << 8;
deviceID |= Wire.read();
checksum = Wire.read();
if (check_crc8(deviceID) == checksum) {
if (HtuCheckCrc8(deviceID) == checksum) {
deviceID = deviceID >> 8;
} else {
deviceID = 0;
@ -92,15 +92,15 @@ uint8_t htu21_readDeviceID(void)
return (uint8_t)deviceID;
}
void htu21_setRes(uint8_t resolution)
void HtuSetResolution(uint8_t resolution)
{
uint8_t current = i2c_read8(HTU21_ADDR, HTU21_READREG);
uint8_t current = I2cRead8(HTU21_ADDR, HTU21_READREG);
current &= 0x7E; // Replace current resolution bits with 0
current |= resolution; // Add new resolution bits to register
i2c_write8(HTU21_ADDR, HTU21_WRITEREG, current);
I2cWrite8(HTU21_ADDR, HTU21_WRITEREG, current);
}
void htu21_reset(void)
void HtuReset(void)
{
Wire.beginTransmission(HTU21_ADDR);
Wire.write(HTU21_RESET);
@ -108,9 +108,9 @@ void htu21_reset(void)
delay(15); // Reset takes 15ms
}
void htu21_heater(uint8_t heater)
void HtuHeater(uint8_t heater)
{
uint8_t current = i2c_read8(HTU21_ADDR, HTU21_READREG);
uint8_t current = I2cRead8(HTU21_ADDR, HTU21_READREG);
switch(heater)
{
@ -121,18 +121,18 @@ void htu21_heater(uint8_t heater)
default : current &= heater;
break;
}
i2c_write8(HTU21_ADDR, HTU21_WRITEREG, current);
I2cWrite8(HTU21_ADDR, HTU21_WRITEREG, current);
}
boolean htu21_init()
boolean HtuInit()
{
htu21_reset();
htu21_heater(HTU21_HEATER_OFF);
htu21_setRes(HTU21_RES_RH12_T14);
HtuReset();
HtuHeater(HTU21_HEATER_OFF);
HtuSetResolution(HTU21_RES_RH12_T14);
return true;
}
float htu21_readHumidity(void)
float HtuReadHumidity(void)
{
uint8_t checksum = 0;
uint16_t sensorval = 0;
@ -143,7 +143,7 @@ float htu21_readHumidity(void)
if (Wire.endTransmission() != 0) {
return 0.0; // In case of error
}
delay(delayH); // Sensor time at max resolution
delay(delay_humidity); // Sensor time at max resolution
Wire.requestFrom(HTU21_ADDR, 3);
if (3 <= Wire.available()) {
@ -151,7 +151,7 @@ float htu21_readHumidity(void)
sensorval |= Wire.read(); // LSB
checksum = Wire.read();
}
if (check_crc8(sensorval) != checksum) {
if (HtuCheckCrc8(sensorval) != checksum) {
return 0.0; // Checksum mismatch
}
@ -168,7 +168,7 @@ float htu21_readHumidity(void)
return humidity;
}
float htu21_readTemperature()
float HtuReadTemperature()
{
uint8_t checksum=0;
uint16_t sensorval=0;
@ -179,7 +179,7 @@ float htu21_readTemperature()
if (Wire.endTransmission() != 0) {
return 0.0; // In case of error
}
delay(delayT); // Sensor time at max resolution
delay(delay_temp); // Sensor time at max resolution
Wire.requestFrom(HTU21_ADDR, 3);
if (3 == Wire.available()) {
@ -187,15 +187,15 @@ float htu21_readTemperature()
sensorval |= Wire.read(); // LSB
checksum = Wire.read();
}
if (check_crc8(sensorval) != checksum) {
if (HtuCheckCrc8(sensorval) != checksum) {
return 0.0; // Checksum mismatch
}
t = convertTemp(0.002681 * (float)sensorval - 46.85);
t = ConvertTemp(0.002681 * (float)sensorval - 46.85);
return t;
}
float htu21_compensatedHumidity(float humidity, float temperature)
float HtuCompensatedHumidity(float humidity, float temperature)
{
if(humidity == 0.00 && temperature == 0.00) {
return 0.0;
@ -205,48 +205,48 @@ float htu21_compensatedHumidity(float humidity, float temperature)
}
}
uint8_t htu_detect()
uint8_t HtuDetect()
{
if (htutype) {
if (htu_type) {
return true;
}
boolean success = false;
htuaddr = HTU21_ADDR;
htutype = htu21_readDeviceID();
success = htu21_init();
switch (htutype) {
htu_address = HTU21_ADDR;
htu_type = HtuReadDeviceId();
success = HtuInit();
switch (htu_type) {
case HTU21_CHIPID:
strcpy_P(htustype, PSTR("HTU21"));
delayT=50;
delayH=16;
strcpy_P(htu_types, PSTR("HTU21"));
delay_temp=50;
delay_humidity=16;
break;
case SI7013_CHIPID:
strcpy_P(htustype, PSTR("SI7013"));
delayT=12;
delayH=23;
strcpy_P(htu_types, PSTR("SI7013"));
delay_temp=12;
delay_humidity=23;
break;
case SI7020_CHIPID:
strcpy_P(htustype, PSTR("SI7020"));
delayT=12;
delayH=23;
strcpy_P(htu_types, PSTR("SI7020"));
delay_temp=12;
delay_humidity=23;
break;
case SI7021_CHIPID:
strcpy_P(htustype, PSTR("SI7021"));
delayT=12;
delayH=23;
strcpy_P(htu_types, PSTR("SI7021"));
delay_temp=12;
delay_humidity=23;
break;
default:
strcpy_P(htustype, PSTR("T/RH?"));
delayT=50;
delayH=23;
strcpy_P(htu_types, PSTR("T/RH?"));
delay_temp=50;
delay_humidity=23;
}
if (success) {
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), htustype, htuaddr);
addLog(LOG_LEVEL_DEBUG);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), htu_types, htu_address);
AddLog(LOG_LEVEL_DEBUG);
} else {
htutype = 0;
htu_type = 0;
}
return success;
}
@ -255,43 +255,43 @@ uint8_t htu_detect()
* Presentation
\*********************************************************************************************/
void htu_mqttPresent(uint8_t* djson)
void MqttShowHtu(uint8_t* djson)
{
if (!htutype) {
if (!htu_type) {
return;
}
char stemp1[10];
char stemp2[10];
float t = htu21_readTemperature();
float h = htu21_readHumidity();
h = htu21_compensatedHumidity(h, t);
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
dtostrfd(h, sysCfg.flag.humidity_resolution, stemp2);
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, htustype, stemp1, stemp2);
float t = HtuReadTemperature();
float h = HtuReadHumidity();
h = HtuCompensatedHumidity(h, t);
dtostrfd(t, Settings.flag.temperature_resolution, stemp1);
dtostrfd(h, Settings.flag.humidity_resolution, stemp2);
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, htu_types, stemp1, stemp2);
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor2(stemp1, stemp2);
DomoticzTempHumSensor(stemp1, stemp2);
#endif // USE_DOMOTICZ
}
#ifdef USE_WEBSERVER
String htu_webPresent()
String WebShowHtu()
{
String page = "";
if (htutype) {
if (htu_type) {
char stemp[10];
char sensor[80];
float t_htu21 = htu21_readTemperature();
float h_htu21 = htu21_readHumidity();
h_htu21 = htu21_compensatedHumidity(h_htu21, t_htu21);
dtostrfi(t_htu21, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, htustype, stemp, tempUnit());
float t_htu21 = HtuReadTemperature();
float h_htu21 = HtuReadHumidity();
h_htu21 = HtuCompensatedHumidity(h_htu21, t_htu21);
dtostrfi(t_htu21, Settings.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, htu_types, stemp, TempUnit());
page += sensor;
dtostrfi(h_htu21, sysCfg.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, htustype, stemp);
dtostrfi(h_htu21, Settings.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, htu_types, stemp);
page += sensor;
}
return page;

View File

@ -34,9 +34,9 @@ enum {
uint8_t sht_sda_pin;
uint8_t sht_scl_pin;
uint8_t shttype = 0;
uint8_t sht_type = 0;
boolean sht_reset()
boolean ShtReset()
{
pinMode(sht_sda_pin, INPUT_PULLUP);
pinMode(sht_scl_pin, OUTPUT);
@ -45,12 +45,12 @@ boolean sht_reset()
digitalWrite(sht_scl_pin, HIGH);
digitalWrite(sht_scl_pin, LOW);
}
boolean success = sht_sendCommand(SHT1X_CMD_SOFT_RESET);
boolean success = ShtSendCommand(SHT1X_CMD_SOFT_RESET);
delay(11);
return success;
}
boolean sht_sendCommand(const byte cmd)
boolean ShtSendCommand(const byte cmd)
{
pinMode(sht_sda_pin, OUTPUT);
// Transmission Start sequence
@ -76,13 +76,13 @@ boolean sht_sendCommand(const byte cmd)
ackerror = true;
}
if (ackerror) {
shttype = 0;
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_SHT1 D_SENSOR_DID_NOT_ACK_COMMAND));
sht_type = 0;
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_SHT1 D_SENSOR_DID_NOT_ACK_COMMAND));
}
return (!ackerror);
}
boolean sht_awaitResult()
boolean ShtAwaitResult()
{
// Maximum 320ms for 14 bit measurement
for (byte i = 0; i < 16; i++) {
@ -91,12 +91,12 @@ boolean sht_awaitResult()
}
delay(20);
}
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_SHT1 D_SENSOR_BUSY));
shttype = 0;
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_SHT1 D_SENSOR_BUSY));
sht_type = 0;
return false;
}
int sht_readData()
int ShtReadData()
{
int val = 0;
@ -117,7 +117,7 @@ int sht_readData()
return val;
}
boolean sht_readTempHum(float &t, float &h)
boolean ShtReadTempHum(float &t, float &h)
{
float tempRaw;
float humRaw;
@ -126,27 +126,27 @@ boolean sht_readTempHum(float &t, float &h)
t = NAN;
h = NAN;
if (!sht_reset()) {
if (!ShtReset()) {
return false;
}
if (!sht_sendCommand(SHT1X_CMD_MEASURE_TEMP)) {
if (!ShtSendCommand(SHT1X_CMD_MEASURE_TEMP)) {
return false;
}
if (!sht_awaitResult()) {
if (!ShtAwaitResult()) {
return false;
}
tempRaw = sht_readData();
tempRaw = ShtReadData();
// Temperature conversion coefficients from SHT1X datasheet for version 4
const float d1 = -39.7; // 3.5V
const float d2 = 0.01; // 14-bit
t = d1 + (tempRaw * d2);
if (!sht_sendCommand(SHT1X_CMD_MEASURE_RH)) {
if (!ShtSendCommand(SHT1X_CMD_MEASURE_RH)) {
return false;
}
if (!sht_awaitResult()) {
if (!ShtAwaitResult()) {
return false;
}
humRaw = sht_readData();
humRaw = ShtReadData();
// Temperature conversion coefficients from SHT1X datasheet for version 4
const float c1 = -2.0468;
const float c2 = 0.0367;
@ -155,13 +155,13 @@ boolean sht_readTempHum(float &t, float &h)
const float t2 = 0.00008;
rhLinear = c1 + c2 * humRaw + c3 * humRaw * humRaw;
h = (t - 25) * (t1 + t2 * humRaw) + rhLinear;
t = convertTemp(t);
t = ConvertTemp(t);
return (!isnan(t) && !isnan(h));
}
boolean sht_detect()
boolean ShtDetect()
{
if (shttype) {
if (sht_type) {
return true;
}
@ -170,59 +170,59 @@ boolean sht_detect()
sht_sda_pin = pin[GPIO_I2C_SDA];
sht_scl_pin = pin[GPIO_I2C_SCL];
if (sht_readTempHum(t, h)) {
shttype = 1;
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_I2C D_SHT1X_FOUND));
if (ShtReadTempHum(t, h)) {
sht_type = 1;
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_I2C D_SHT1X_FOUND));
} else {
Wire.begin(sht_sda_pin, sht_scl_pin);
shttype = 0;
sht_type = 0;
}
return shttype;
return sht_type;
}
/*********************************************************************************************\
* Presentation
\*********************************************************************************************/
void sht_mqttPresent(uint8_t* djson)
void MqttShowSht(uint8_t* djson)
{
if (!shttype) {
if (!sht_type) {
return;
}
float t;
float h;
if (sht_readTempHum(t, h)) {
if (ShtReadTempHum(t, h)) {
char stemp[10];
char shum[10];
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp);
dtostrfd(h, sysCfg.flag.humidity_resolution, shum);
dtostrfd(t, Settings.flag.temperature_resolution, stemp);
dtostrfd(h, Settings.flag.humidity_resolution, shum);
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, "SHT1X", stemp, shum);
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor2(stemp, shum);
DomoticzTempHumSensor(stemp, shum);
#endif // USE_DOMOTICZ
}
}
#ifdef USE_WEBSERVER
String sht_webPresent()
String WebShowSht()
{
float t;
float h;
String page = "";
if (shttype) {
if (sht_readTempHum(t, h)) {
if (sht_type) {
if (ShtReadTempHum(t, h)) {
char stemp[10];
char shum[10];
char sensor[80];
dtostrfi(t, sysCfg.flag.temperature_resolution, stemp);
dtostrfi(h, sysCfg.flag.humidity_resolution, shum);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, "SHT1X", stemp, tempUnit());
dtostrfi(t, Settings.flag.temperature_resolution, stemp);
dtostrfi(h, Settings.flag.humidity_resolution, shum);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, "SHT1X", stemp, TempUnit());
page += sensor;
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, "SHT1X", shum);
page += sensor;

113
sonoff/xsns_veml6070.ino Normal file
View File

@ -0,0 +1,113 @@
/*
xsns_veml6070.ino - VEML6070 ultra violet light sensor support for Sonoff-Tasmota
Copyright (C) 2017 Theo Arends
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef USE_I2C
#ifdef USE_VEML6070
/*********************************************************************************************\
* VEML6070 - Ultra Violet Light Intensity
\*********************************************************************************************/
#define VEML6070_ADDR_H 0x39
#define VEML6070_ADDR_L 0x38
#define VEML6070_INTEGRATION_TIME 3 // 500msec integration time
uint8_t veml6070_address;
uint8_t veml6070_type = 0;
char veml6070_types[9];
uint16_t Veml6070ReadUv()
{
if (Wire.requestFrom(VEML6070_ADDR_H, 1) != 1) {
return -1;
}
uint16_t uvi = Wire.read();
uvi <<= 8;
if (Wire.requestFrom(VEML6070_ADDR_L, 1) != 1) {
return -1;
}
uvi |= Wire.read();
return uvi;
}
boolean Veml6070Detect()
{
if (veml6070_type) {
return true;
}
uint8_t status;
uint8_t itime = VEML6070_INTEGRATION_TIME;
boolean success = false;
veml6070_address = VEML6070_ADDR_L;
Wire.beginTransmission(veml6070_address);
Wire.write((itime << 2) | 0x02);
status = Wire.endTransmission();
if (!status) {
success = true;
veml6070_type = 1;
strcpy_P(veml6070_types, PSTR("VEML6070"));
}
if (success) {
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), veml6070_types, veml6070_address);
AddLog(LOG_LEVEL_DEBUG);
} else {
veml6070_type = 0;
}
return success;
}
/*********************************************************************************************\
* Presentation
\*********************************************************************************************/
void MqttShowVeml6070(uint8_t* djson)
{
if (!veml6070_type) {
return;
}
uint16_t uv = Veml6070ReadUv();
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"%s\":{\"" D_UV_LEVEL "\":%d}"), mqtt_data, veml6070_types, uv);
*djson = 1;
#ifdef USE_DOMOTICZ
DomoticzSensor(DZ_ILLUMINANCE, uv);
#endif // USE_DOMOTICZ
}
#ifdef USE_WEBSERVER
const char HTTP_SNS_ULTRAVIOLET[] PROGMEM =
"<tr><th>VEML6070 " D_UV_LEVEL "</th><td>%d</td></tr>";
String WebShowVeml6070()
{
String page = "";
if (veml6070_type) {
char sensor[80];
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_ULTRAVIOLET, Veml6070ReadUv());
page += sensor;
}
return page;
}
#endif // USE_WEBSERVER
#endif // USE_VEML6070
#endif // USE_I2C