Модернизированный Sonoff-Tasmota
Текущий номер релиза Sonoff-Tasmota 6.2.1.13 20181008
Необходимость данного форка вызвана тем, что для автоматизации дома на базе OpenHub потребовалось изменить некоторые модули и написать новые модули для поддержки новых устройств.
Прошивка обновляется по мере наличия свободного времени от строительства дома.
-
xsns_05_ds18x20_legacy.ino - увеличено количество датчиков до 24. Более компактные поля вывода MQTT, т.к. не хватало длины стандартного MQTT сообщения.
-
Добавлена поддержка нескольких
ADS1115
(для автоматизации дома требуется 16 ЦАП - обработка обратной связи с приводов воздушных заслонок). -
На базе драйвера xdrv_15_pca9685.ino сделан сенсор xsns_33_pca9685_lva.ino в нем добавлен вывод информации на WEBGUI.
-
Сделан драйвер MODBUS to MQTT для
Danfoss FC51
.
Для облегчения поддержки и обновлений до текущих версий Sonoff-Tasmota в оригинальные файлы вносятся минимальные изменения и добавляются собственные.
-
DS18B20 добавить поддержку двух ветвей 1-ware датчиков на одном устройстве.
-
Сделать драйвер для счетчика
Меркурий 231
(MODBUS RTU -> MQTT )
-
patformio. ini - отключены лишние варианты сборок, в команде сборки включен ключ определения ***_LVA*** активизирующий все мои изменения (без него должен собираться оригинальный Sonoff-Tasmota), настроен ком.порт.
-
xdrv_02_webserver.ino - добавлена возможность выделения цветом ячеек. К станадрному ключу замены
{m}
добавлены ключи{mr}
и{mr}
-
sanoff/xdrv_interface.ino - был добавлен дебаг вызова модулей, требуется при отладке собственных модулей
-
sanoff/xsns_12_ads1115_ada.ino - переделан вывод строк.
-
sanoff/sonoff.ino - добавлен
DEBUG
для MQTT сообщений. Подключается в lva_post.h. -
user_config.h - не все можно выключить (например
#define USE_I2C
) через user_config_override.h, по этому правим user_config.h -
user_config_override.h - мои переопределение #define по умолчанию. Здесь надо указать под вариант моей сборки. Включаем стандартную сборку Sonoff-Tasmota
USE_CLASSIC
. -
sanoff/xdrv_interface.ino - добавлен
LVA_DEBUG
на сериал при выполнении функцииXdrvCommand
. -
sanoff/xsns_05_ds18x20_legacy.ino - увеличено количество датчиков до 24 (зачем столько, если их всего у меня максимум на шине 16, а вспомнил для двух шин ;) ), сокращен вывод информации на webpage и MQTT. (надо довести до ума, бросил.)
-
sanoff/xsns_12_ads1115.ino - стандартная библиотека переделанная на сокращенный вывод MQTT. Только одну микросхему поддерживает. Устарела надо использовать xsns_12_ads1115_lva.ino. ___ Во всех откорректированных оригинальных файлах в пятой строке добавлен текст
UPDATED LVA
Изменения в самом тексте обрамлены строками:
// LVA <--
#ifndef \_LVA
#else
#endif
// LVA -->
-
sanoff/lva_post.h - здесь отключаем все лишнее из
USE_CLASSIC
, и делаем свои компоновки. Запускается последним из конфигурационных ".h". Файлом lva_post.h уточняем последними #define (если чего-то надо переопределить). -
sanoff/xsns_12_ads1115_lva.ino - собственная библиотека поддержки 4 микросхем, надо проверять на совместимость с последней версией Tasmota.
-
sanoff/xsns_91mcp_lva.ino - собственная библиотека для
MCP23017
, ранее в Tasmota не было поддержкиMCP23017
, сейчас появилась (xsns_29_mcp230xx.ino) надо разбираться. Возможно надо убирать. -
xsns_34_DanfosFC51.ino - собственный драйвер для частотника
Danfos FC51
умеет включать, выключать, изменять частоту подаваемую на привод. Частота задается в процентах от 0 до 100% от максимально установленной в параметре 3-30. Драйвер умеет работать как сМАX485
(есть задаваемый в настройках пин для дерганья в момент передачи) так и с более продвинутыми микросхемами-драйверами RS485. Пока тестировался только на скорости19200
, при больших скоростях возможно надо будет добавить время на реакциюDFC51
.
Новая версия Sonoff-Tasmota научилась пуллить по MODBUS разные устройства используя программный сериал на скорости 9600.
-
xsns_23_ sdm120 .ino - Eastron SDM120 -Modbus-измеритель мощности. По умолчанию включено варианте сборки sensors. Поддержка включается в sonoff_post.h. Функция
SDM120250ms
опрашивает устройство и читает 8 адресов по порядку, причет в функции сначала проверяется чтение, а только потом посылается запрос устройству. Только чтение и публикация по MQTT 8 параметров. -
xnrg_05_pzem2.ino - PZEM-003,017 и PZEM-014,016 Поддержка датчика энергопотребления Modbus.
-
xsns_17_senseair.ino - Поддержка датчика CO2 SenseAir K30, K70 и S8.
все эти датчики не плохой вариант считывать меркурий 230, думаю должны быть очень похожие таблицы.
Сравнивая эти модули, думаю самым аккуратно написанным является xsns_23_ sdm120.ino
Соединения на время отладки
esp D6 -> TX -> mcp D6
esp D7 -> RX -> mcp D7
esp D5 -> TX_E ->mcp D5
сначала обрабатывается sonoff.ino, где включается user_config.h и т.д.
-
xdr_ - драйвера
-
xdsp_ - модули для работы с дисплеями
-
xnr_ - модули для работы с сенсорами мощности
-
xsns_ - модули для работы с прочими сенсорами
-
Камин. Датчики температуры (5 шт.) подключены к
D4
. -
Отопление. Датчики температуры (11 шт) подключены к
D4
) модуль отопления постоянно висит, горит светодиодGPIO2 (D4)
или он все таки наТХ (GPI01)
пине?
Надо сделать по принципу оригинала: разные ключи под прошивки для разных устройств:
-
камин (температурные датчики 5 шт., электрический счетчик отопления)
-
отопление (температурные датчики, расширитель портов для контроля напряжений, управления АВР дизеля)
-
Меркурий (для счетчика на столбе)
-
чердак (данфосы, de-icing, температурные датчики, управление приводами вентиляции)
DATA: [====== ] 58.5% (used 47952 bytes from 81920 bytes)
PROGRAM: [=== ] 33.2% (used 347915 bytes from 1048576 bytes)
!!! При этом выключили USE_KNX_WEB_MENU
Взято от сюда.
на WebGui выводятся только порты которые сконфигурированы на OUT !!! Формат команды в консоли (как в MQTT пока не понятно)
sensor29 9,?
15:06:25 RSL: RESULT = {"Sensor29_D9":{"MODE":1,"PULL_UP":"OFF","INT_MODE":"DISABLED","STATE":"OFF"}}
sensor29 pin,pinmode,pullup
где
-
pin
: от 0 до 15 -
pinmode
: -
1 =
INPUT
(данные телеметрической передачи с плавающей точкой будут отправляться в соответствии с интервалами конфигурации прошивки Tasmota -
2 =
INPUT
сINTERRUPT
наCHANGE
(Будет отправлен вывод MQTT при изменении состояния отLOW
доHIGH
иHIGH
доLOW
) -
3 =
INPUT
сINTERRUPT
наCHANGE
доLOW
(отправит вывод MQTT с изменением состояния только отHIGH
доLOW
) -
4 =
INPUT
сINTERRUPT
наCHANGE
доHIGH
(выведет выход MQTT с изменением состояния только отLOW
доHIGH
) -
5 =
OUTPUT
(если включено с#define USE_MCP230xx_OUTPUT
) -
pullup
= Рабочий режим штыря следующим образом: -
0 = подтяжка ОТКЛЮЧЕНА
-
1 = подтяжка ВКЛЮЧЕНА
-
intmode
= Необязательно указать режим представления прерываний следующим образом - по умолчанию 0, если не указано -
0 = Отчет о немедленном прерывании с использованием TELEMETRY и EVENT
-
1 = Только немедленное СОБЫТИЕ (телеметрия не указана)
-
2 = Непосредственная ТЕЛЕМЕТРИЯ (не вызвано событием)
Примеры некоторых вариантов конфигурации контактов:
sensor29 4,1,0_ - Включит `D4` для `INPUT` без внутреннего подтягивающего резистора
sensor29 3,1,1_ - Включит `D3` для `INPUT` с внутренним подтягивающим резистором `ENABLED`
sensor29 5,2,1_ - Включит `D5` для `INPUT` и сообщит о состоянии изменения от `LOW до HIGH` и `HIGH до LOW` через MQTT
sensor29 6,3,1_ - Включит `D6` для `INPUT` и сообщит о состоянии изменения от `HIGH` до `LOW` (также включена подсветка)
sensor29 2,4,0_ - Включит `D2` для `INPUT` и сообщит о состоянии изменения от `LOW до HIGH` (заметка подтягивания не включена)
sensor29 reset // Reset all pins INPUT, no interrupt, no pull-up by default
sensor29 reset1 // Reset all pins INPUT, no interrupt, no pull-up by default
sensor29 reset2 // Reset all pins INT on CHANGE, with pull-up enabled by default
sensor29 reset3 // Reset all pins INT on LOW, with pull-up enabled by default
sensor29 reset4 // Reset all pins INT on HIGH, with pull-up enabled by default
sensor29 reset5 // Reset all pins to OUTPUT mode (if enabled by #define USE_MCP230xx_OUTPUT)
sensor29 0,5,0 // Configure pin 0 as OUTPUT and default to OFF on reset/power-up
sensor29 0,5,1 // Configure pin 0 as OUTPUT and default to ON on reset/power-up
sensor29 0,6,0 // Configure pin 0 as INVERTED OUTPUT and default to ON on reset/power-up
sensor29 0,6,1 // Configure pin 0 as INVERTED OUTPUT and default to OFF on reset/power-up
sensor29 9,5,0 - пин на OUT по умолчанию выключен
sensor29 9,5,1 - пин на OUT по умолчанию включен
sensor29 9,ON // Turn pin ON (HIGH if pinmode 5 or LOW if pinmode 6(inverted))
sensor29 9,OFF // Turn pin OFF (LOW if pinmode 5 or HIGH if pinmode 6(inverted))
sensor29 9,T // Toggle the current state of pin from ON to OFF, or OFF to ON
sensor29 reset2
sensor29 9,5,0
sensor29 9,ON
sensor29 9,OFF
sensor29 9,T
-
На отладочной плате кнопка на D4, светодиоды на: D8 (снят резестор), D9, D10.
-
Полезная опция I2Cscan
driver15 pwmf,frequency // where frequency is the PWM frequency from 24 to 1526 in Hz
driver15 pwm,pin,pwmvalue // where pin = LED pin 0 through 15 and pwmvalue is the pulse width between 0 and 4096
driver15 pwm,pin,ON // Fully turn a specific pin/LED ON
driver15 pwm,pin,OFF // Fully turn a specific pin/LED OFF
driver15 reset // Reset to power-up settings - i.e. F=50hz and all pins in OFF state
driver15 pwm,15,OFF
driver15 pwm,15,ON
driver15 pwm,15,1024
driver15 pwm,15,10
//driver15
sensor33 pwm,15,ON
sensor33 pwm,15,3900
sensor33 pwm,15,OFF
sensor33 pwm,15,ON
sensor33 pwm,15,ON
sensor33 pwm,15,4096
sensor33 pwm,15,4095
sensor33 pwm,15,4095
sensor33 pwm,13,4096
sensor33 pwm,14,40
USE_DS18x20_LEGACY
USE_DS18x20_LEGACY_2 -не смог переделать, переделываю просто USE_DS18x20 DATA: [====== ] 61.7% (used 50520 bytes from 81920 bytes) PROGRAM: [==== ] 38.1% (used 399791 bytes from 1048576 bytes)
Текущая основная проблема, у меня микросхема-драйвер MAX485
, она требует
переключения прием/передача, надо третьей ногой включать/выключать передачу.
Править библиотеку TasmotaSerial не надо, достаточно перед записью в порт
опускать ногу, а по окончании поднимать. см. ниже раздел дергаем ногой
.
-
Поддержка нескольких частотников (легко увеличить достаточно изменить
FC51_DEVICES
, тестировалось на 3!). -
Расширенная диагностика статуса частотника с выводом информации на WebGUI и MQTT (возможно лишнее, но это легко отключить).
-
Включать выключать мотор Доступны ключи: Для включения
START
,ON
,2
. Для выключенияSTOP
,OFF
,1
. Регистр неважен (Stop
,stop stoP
- все пройдет). -
Управлять скоростью привода. Скорость задается ключом
SPEED
в процентах (0...100%) от максимальной (MaxFRQ
), только целые значения! (дробная часть отбрасывается) Для того, чтобы вычислить истинную скорость мотора в диагностической информации имеется параметрMaxFRQ
, с размерностью в Hz. Если подать изменение скорости, то после задания новой частоты, если привод был выключен, то он включится. Если задать скорость0
, то привод выключится, при этом задание новой скорости не произойдет (сделано для упрощения написания скриптов в OpenHub). КлючSPEED
-
Для включения MODBUS необходимо задать ноги
MODBUS Tx
иMODBUS Rx
. Опционально можно задать ноку дляMODBUS TX ENABLE
(если у вас как у меня MAX485, которая не умеет сама следить за передачей). -
Проверена интеграция OpenHub. Работает: отображение статусов, включение выключение привода, изменение скорости привода.
-
Добавлена подсветка статуса в WebGui: зеленый - стоп, красный - пуск.
-
Оставлено много комментариев и закомментированной отладочной информации т.к. версия драйвера предварительная и будет дорабатываться, особенно после интеграции с OpenHub.
-
Временно приостанавливаю разработку драйвера, от Danfos идут сильные помехи по сети, аж нечитаются датчики температуры DS18B20, надо ставить фильры. (пока отлдадил через OH2 только включачать/выключать выключать привод, SPEED пока в правилах не задействовал в связи с описанной выше проблемой)
Пример вывода MQTT
tele/Roof/SENSOR {"Time":"2018-11-30T20:43:56","FC1":{"STATUS":"Off","CTW":1084,"STW":515,"MaxFRQ":50,"ReferFRQ":49.80,"FRQ":0.00,"POWER":0,"STWdecode":"Off"},"FC2":{"STATUS":"On","CTW":1084,"STW":3847,"MaxFRQ":50,"ReferFRQ":26.79,"FRQ":26.79,"POWER":40,"STWdecode":"On"},"FC3":{"STATUS":"On","CTW":1084,"STW":3847,"MaxFRQ":50,"ReferFRQ":86.60,"FRQ":86.60,"POWER":132,"STWdecode":"On"}}
Не удалось сделать массив структур для хранения данных (можно было бы сэкономить память), код был бы красивее. Пока заготовки оставил, может доведу до ума.
sensor94 1 start
sensor94 1 STOP
sensor94 2 start
sensor94 2 STOP
sensor94 2 SPEED 0
sensor94 2 SPEED 10
sensor94 2 SPEED 100
sensor94 3 ON
sensor94 3 OFF
String FcKitchenStatus "[%s]" (Danfos) {mqtt=">[fms:cmnd/Roof/sensor94:command:*:1,${command}], <[fms:stat/Roof/FC1_STATUS:state:default],<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC1.STATUS)]" }
Number FcKitchenCTW "Кух.CTW[%d]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC1.CTW)]"}
Number FcKitchenSTW "Кух.STW[%d]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC1.STW)]"}
Number FcKitchenMaxFRQ "Кух.Макс. Частота [%.1fHz]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC1.MaxFRQ)]"}
Number FcKitchenReferFRQ "Кух.Задан. Частота [%.1f%%]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC1.ReferFRQ)]"}
Number FcKitchenOutFRQ "Кух.Текущая Частота [%.1f%%]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC1.FRQ)]"}
Number FcKitchenOutPOWER "Кух.Текущая Мощьность [%.1fW]"(Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC1.POWER)]"}
String FcKitchenSTWdecode "Кух.STW[%s]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC1.STWdecode)]"}
String FcBathroomsStatus "[%s]" (Danfos) {mqtt=">[fms:cmnd/Roof/sensor94:command:*:2,${command}], <[fms:stat/Roof/FC2_STATUS:state:default],<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC2.STATUS)]" }
Number FcBathroomsCTW "C/У.CTW[%d]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC2.CTW)]"}
Number FcBathroomsSTW "C/У.STW[%d]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC2.STW)]"}
Number FcBathroomsMaxFRQ "C/У.Макс. Частота [%.1fHz]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC2.MaxFRQ)]"}
Number FcBathroomsReferFRQ "C/У.Задан. Частота [%.1f%%]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC2.ReferFRQ)]"}
Number FcBathroomsOutFRQ "C/У.Текущая Частота [%.1f%%]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC2.FRQ)]"}
Number FcBathroomsOutPOWER "C/У.Текущая Мощьность [%.1fW]"(Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC2.POWER)]"}
String FcBathroomsSTWdecode "C/У.STW[%s]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC2.STWdecode)]"}
/*
*/
String FcInflowStatus "[%s]" (Danfos) {mqtt=">[fms:cmnd/Roof/sensor94:command:*:3,${command}], <[fms:stat/Roof/FC3_STATUS:state:default],<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC3.STATUS)]" }
Number FcInflowCTW "Приток.CTW[%d]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC3.CTW)]"}
Number FcInflowSTW "Приток.STW[%d]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC3.STW)]"}
Number FcInflowMaxFRQ "Приток.Макс. Частота [%.1fHz]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC3.MaxFRQ)]"}
Number FcInflowReferFRQ "Приток.Задан. Частота [%.1f%%]" (Danfos) {mqtt=">[fms:cmnd/Roof/sensor94:command:*:3,SPEED,${command}], <[fms:stat/Roof/FC3_SPEED:state:default], <[fms:tele/Roof/SENSOR:state:JSONPATH($.FC3.ReferFRQ)]"}
Number FcInflowOutFRQ "Приток.Текущая Частота [%.1f%%]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC3.FRQ)]"}
Number FcInflowOutPOWER "Приток.Текущая Мощьность [%.1fW]"(Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC3.POWER)]"}
String FcInflowSTWdecode "Приток.STW[%s]" (Danfos) {mqtt="<[fms:tele/Roof/SENSOR:state:JSONPATH($.FC3.STWdecode)]"}
Text item=Danfos label="Danfos" {
Frame label="Кухня Вытяжка" {
Switch item=FcKitchenStatus label="Status"
Text item=FcKitchenCTW label="CTW"
Text item=FcKitchenSTW label="STW"
Text item=FcKitchenMaxFRQ label="MaxFRQ"
Text item=FcKitchenReferFRQ label="ReferFRQ"
Setpoint item=FcKitchenReferFRQ minValue=00 maxValue=10 step=1
Text item=FcKitchenOutFRQ label="OutFRQ"
Text item=FcKitchenOutPOWER label="OutPOWER"
Text item=FcKitchenSTWdecode label="STWdecode"
}
Frame label="С/У Вытяжка" {
Switch item=FcBathroomsStatus label="Status"
Text item=FcBathroomsCTW label="CTW"
Text item=FcBathroomsSTW label="STW"
Text item=FcBathroomsMaxFRQ label="MaxFRQ"
Text item=FcBathroomsReferFRQ label="ReferFRQ"
Setpoint item=FcBathroomsReferFRQ minValue=00 maxValue=10 step=1
Text item=FcBathroomsOutFRQ label="OutFRQ"
Text item=FcBathroomsOutPOWER label="OutPOWER"
Text item=FcBathroomsSTWdecode label="STWdecode"
}
Frame label="Приток" {
Switch item=FcInflowStatus label="Status"
Text item=FcInflowCTW label="CTW"
Text item=FcInflowSTW label="STW"
Text item=FcInflowMaxFRQ label="MaxFRQ"
Text item=FcInflowReferFRQ label="ReferFRQ"
Setpoint item=FcInflowReferFRQ minValue=00 maxValue=10 step=1
Text item=FcInflowOutFRQ label="OutFRQ"
Text item=FcInflowOutPOWER label="OutPOWER"
Text item=FcInflowSTWdecode label="STWdecode"
}
}
// таймер для костыля
import org.openhab.model.script.actions.Timer
import org.joda.time.*
rule "Kamin_Air_Switch"
when
Item KaminAirOut changed
then
var KAO=(KaminAirOut.state as DecimalType) // создаем переменную с этим значением
if( KAO > 31 && FcInflowStatus.state != ON) //&& ReleyAirInVent.state==0 )
{
FcInflowStatus.sendCommand(ON)
// далее это костыль т.к. при включении вентиляции из-за помех отваливаются датчики температуры
if (RULES_Kamin_Air_Switch.state != 1) {
sendCommand(RULES_Kamin_Air_Switch, 1)
Thread::sleep(180 * 1000)
FcInflowStatus.sendCommand(OFF)
sendCommand(RULES_Kamin_Air_Switch, 0)
}
// конец костыля
}
if(KAO < 30 && FcInflowStatus.state == ON )
{
FcInflowStatus.sendCommand(OFF)
}
if( KAO < 18 && FcInflowStatus.state != OFF )
{
FcInflowStatus.sendCommand(OFF)
sendTelegram( "Fazenda_2018_bot", "Kamin_Air_Switch: ReleyAirInVent OFF т.к. температура ниже 18 град." )
}
//sendTelegram("Fazenda_2018_bot", "KaminAirOut:" )
//sendTelegram("Fazenda_2018_bot", "item KaminAirOut changed to %s and number is %.1f", KaminAirOut.state.toString, KAO)
//sendTelegram("Fazenda_2018_bot", "item AirInVent status to %s and number is %d", AirInVent.state.toString, AirInVent.state)
/*
if(ReleyAirInVent.state == ON) // && AirInVent.state(1) )
{
sendTelegram("Fazenda_2018_bot", "ReleyAirInVent ON" )
}
if(ReleyAirInVent.state == OFF) // && AirInVent.state(1) )
{
sendTelegram("Fazenda_2018_bot", "ReleyAirInVent OFF" )
}
*/
//logInfo("Kamin_Air_Switch", "end")
end
sonoff_template.h :
-
в enum UserSelectablePins добавляем название переменной (
GPIO_MODBUS_TX, GPIO_MODBUS_RX, GPIO_MODBUS_TX_ENABLE
) -
const char kSensorNames[] PROGMEM добавляем имя шаблона во ФЛЕШ памяти для отображаемого наименования пина (
D_SENSOR_MODBUS_TX "|" D_SENSOR_MODBUS_RX "|" D_SENSOR_MODBUS_TX_ENABLE "|"
) -
const uint8_t kGpioNiceList[GPIO_SENSOR_END] PROGMEM добавляем название переменной (
GPIO_MODBUS_TX, GPIO_MODBUS_RX, GPIO_MODBUS_TX_ENABLE
) -
в языковом файле объявляем шаблон:
#define D_SENSOR_MODBUS_TX "MODBUS Tx"
#define D_SENSOR_MODBUS_RX "MODBUS Rx"
#define D_SENSOR_MODBUS_TX_ENABLE "MODBUS ENABLE"
В оригинальном файле xdrv_02_webserver.ino
добавляем два ключа {mg}
и {mg}
путем замены строчки
// LVA EDIT
//"var s=x.responseText.replace(/{t}/g,\"<table style='width:100%'>\").replace(/{s}/g,\"<tr><th>\").replace(/{m}/g,\"</th><td>\").replace(/{e}/g,\"</td></tr>\").replace(/{c}/g,\"%'><div style='text-align:center;font-weight:\");"
"var s=x.responseText.replace(/{t}/g,\"<table style='width:100%'>\").replace(/{s}/g,\"<tr><th>\").replace(/{m}/g,\"</th><td>\").replace(/{mr}/g,\"</th><td bgcolor=OrangeRed>\").replace(/{mg}/g,\"</th><td bgcolor=Lime>\").replace(/{e}/g,\"</td></tr>\").replace(/{c}/g,\"%'><div style='text-align:center;font-weight:\");"
// END LVA
Пример использования в теле модуля ключей подстановки
const char HTTP_FC51_STR_4[] PROGMEM = "%s" "{s}" D_FC51 ":%i %s:" "{m}%s" "{e}"; обычный
const char HTTP_FC51_STR_4R[] PROGMEM = "%s" "{s}" D_FC51 ":%i %s:" "{mr}%s" "{e}"; красный
const char HTTP_FC51_STR_4G[] PROGMEM = "%s" "{s}" D_FC51 ":%i %s:" "{mg}%s" "{e}"; зеленый
Памятка надо делать команду на RESET !!! (что была ;) )
-
ПРИМЕР ВСТАВКИ КАРТИНКИ
-
Как найти в файлах всей папки - сочетание клавиш Shift + Ctrl + F. Замена во всех файлах проекта также делается.
-
[Правила оформления файла README.MD на GITHUB] (http://webdesign.ru.net/article/pravila-oformleniya-fayla-readmemd-na-github.html)
Надо чтобы был установлен уровень LOG_LEVEL_INFO
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DEBUG "MODBUS inited"));
AddLog(LOG_LEVEL_INFO);
китайская кнопка ese-20c(d)4-3.step (только здесь 4 контакта)
попытка обновится до последнего релиза 6.4.1