mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
Compare commits
8 Commits
07d0de0151
...
25ea7d8b0c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25ea7d8b0c | ||
|
|
68f067f2c4 | ||
|
|
e20fa5ab39 | ||
|
|
bee307a91d | ||
|
|
f85226ce55 | ||
|
|
f112e6f6cc | ||
|
|
5df82b7e2c | ||
|
|
ea75a34c82 |
@@ -32,6 +32,7 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/).
|
|||||||
- solar temperature TS16 [#2690](https://github.com/emsesp/EMS-ESP32/issues/2690)
|
- solar temperature TS16 [#2690](https://github.com/emsesp/EMS-ESP32/issues/2690)
|
||||||
- pumpmode enum for HT3 boilers, add commands for manual defrost, chimneysweeper [#2727](https://github.com/emsesp/EMS-ESP32/issues/2727)
|
- pumpmode enum for HT3 boilers, add commands for manual defrost, chimneysweeper [#2727](https://github.com/emsesp/EMS-ESP32/issues/2727)
|
||||||
- pid settings [#2735](https://github.com/emsesp/EMS-ESP32/issues/2735)
|
- pid settings [#2735](https://github.com/emsesp/EMS-ESP32/issues/2735)
|
||||||
|
- refresh MQTT button added to MQTT Settings page
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
|
|
||||||
|
|||||||
18
interface/pnpm-lock.yaml
generated
18
interface/pnpm-lock.yaml
generated
@@ -1225,8 +1225,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
|
resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
|
||||||
engines: {node: '>=8.0.0'}
|
engines: {node: '>=8.0.0'}
|
||||||
|
|
||||||
csstype@3.2.2:
|
csstype@3.2.3:
|
||||||
resolution: {integrity: sha512-D80T+tiqkd/8B0xNlbstWDG4x6aqVfO52+OlSUNIdkTvmNw0uQpJLeos2J/2XvpyidAFuTPmpad+tUxLndwj6g==}
|
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
|
||||||
|
|
||||||
currently-unhandled@0.4.1:
|
currently-unhandled@0.4.1:
|
||||||
resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==}
|
resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==}
|
||||||
@@ -3290,7 +3290,7 @@ snapshots:
|
|||||||
'@emotion/memoize': 0.9.0
|
'@emotion/memoize': 0.9.0
|
||||||
'@emotion/unitless': 0.10.0
|
'@emotion/unitless': 0.10.0
|
||||||
'@emotion/utils': 1.4.2
|
'@emotion/utils': 1.4.2
|
||||||
csstype: 3.2.2
|
csstype: 3.2.3
|
||||||
|
|
||||||
'@emotion/sheet@1.4.0': {}
|
'@emotion/sheet@1.4.0': {}
|
||||||
|
|
||||||
@@ -3507,7 +3507,7 @@ snapshots:
|
|||||||
'@popperjs/core': 2.11.8
|
'@popperjs/core': 2.11.8
|
||||||
'@types/react-transition-group': 4.4.12(@types/react@19.2.5)
|
'@types/react-transition-group': 4.4.12(@types/react@19.2.5)
|
||||||
clsx: 2.1.1
|
clsx: 2.1.1
|
||||||
csstype: 3.2.2
|
csstype: 3.2.3
|
||||||
prop-types: 15.8.1
|
prop-types: 15.8.1
|
||||||
react: 19.2.0
|
react: 19.2.0
|
||||||
react-dom: 19.2.0(react@19.2.0)
|
react-dom: 19.2.0(react@19.2.0)
|
||||||
@@ -3533,7 +3533,7 @@ snapshots:
|
|||||||
'@emotion/cache': 11.14.0
|
'@emotion/cache': 11.14.0
|
||||||
'@emotion/serialize': 1.3.3
|
'@emotion/serialize': 1.3.3
|
||||||
'@emotion/sheet': 1.4.0
|
'@emotion/sheet': 1.4.0
|
||||||
csstype: 3.2.2
|
csstype: 3.2.3
|
||||||
prop-types: 15.8.1
|
prop-types: 15.8.1
|
||||||
react: 19.2.0
|
react: 19.2.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
@@ -3548,7 +3548,7 @@ snapshots:
|
|||||||
'@mui/types': 7.4.8(@types/react@19.2.5)
|
'@mui/types': 7.4.8(@types/react@19.2.5)
|
||||||
'@mui/utils': 7.3.5(@types/react@19.2.5)(react@19.2.0)
|
'@mui/utils': 7.3.5(@types/react@19.2.5)(react@19.2.0)
|
||||||
clsx: 2.1.1
|
clsx: 2.1.1
|
||||||
csstype: 3.2.2
|
csstype: 3.2.3
|
||||||
prop-types: 15.8.1
|
prop-types: 15.8.1
|
||||||
react: 19.2.0
|
react: 19.2.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
@@ -3796,7 +3796,7 @@ snapshots:
|
|||||||
|
|
||||||
'@types/react@19.2.5':
|
'@types/react@19.2.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
csstype: 3.2.2
|
csstype: 3.2.3
|
||||||
|
|
||||||
'@types/responselike@1.0.3':
|
'@types/responselike@1.0.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4211,7 +4211,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
css-tree: 1.1.3
|
css-tree: 1.1.3
|
||||||
|
|
||||||
csstype@3.2.2: {}
|
csstype@3.2.3: {}
|
||||||
|
|
||||||
currently-unhandled@0.4.1:
|
currently-unhandled@0.4.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4294,7 +4294,7 @@ snapshots:
|
|||||||
dom-helpers@5.2.1:
|
dom-helpers@5.2.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime': 7.28.4
|
'@babel/runtime': 7.28.4
|
||||||
csstype: 3.2.2
|
csstype: 3.2.3
|
||||||
|
|
||||||
dom-serializer@1.4.1:
|
dom-serializer@1.4.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -447,7 +447,7 @@ const Sensors = () => {
|
|||||||
item={as}
|
item={as}
|
||||||
onClick={() => updateAnalogSensor(as)}
|
onClick={() => updateAnalogSensor(as)}
|
||||||
>
|
>
|
||||||
<Cell stiff>{as.g}</Cell>
|
<Cell stiff>{as.g !== 99 ? as.g : ''}</Cell>
|
||||||
<Cell>{as.n}</Cell>
|
<Cell>{as.n}</Cell>
|
||||||
<Cell stiff>{AnalogTypeNames[as.t]} </Cell>
|
<Cell stiff>{AnalogTypeNames[as.t]} </Cell>
|
||||||
{(as.t === AnalogType.DIGITAL_OUT &&
|
{(as.t === AnalogType.DIGITAL_OUT &&
|
||||||
@@ -455,10 +455,14 @@ const Sensors = () => {
|
|||||||
as.g !== GPIO_26) ||
|
as.g !== GPIO_26) ||
|
||||||
as.t === AnalogType.DIGITAL_IN ||
|
as.t === AnalogType.DIGITAL_IN ||
|
||||||
as.t === AnalogType.PULSE ? (
|
as.t === AnalogType.PULSE ? (
|
||||||
<Cell stiff>{as.v ? LL.ON() : LL.OFF()}</Cell>
|
<Cell stiff>
|
||||||
|
{as.g !== 99 ? (as.v ? LL.ON() : LL.OFF()) : ''}
|
||||||
|
</Cell>
|
||||||
) : (
|
) : (
|
||||||
<Cell stiff>
|
<Cell stiff>
|
||||||
{as.t !== AnalogType.NOTUSED ? formatValue(as.v, as.u) : ''}
|
{as.t !== AnalogType.NOTUSED && as.g !== 99
|
||||||
|
? formatValue(as.v, as.u)
|
||||||
|
: ''}
|
||||||
</Cell>
|
</Cell>
|
||||||
)}
|
)}
|
||||||
</Row>
|
</Row>
|
||||||
|
|||||||
@@ -155,7 +155,14 @@ void AnalogSensor::reload(bool get_nvs) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
sensors_.emplace_back(sensor.gpio, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type, sensor.is_system);
|
// check if the GPIO is valid before registering. If not, force set the sensor to disabled, but don't remove it
|
||||||
|
// should only trigger if uploading a customization file with invalid gpios.
|
||||||
|
if (!EMSESP::system_.is_valid_gpio(sensor.gpio)) {
|
||||||
|
LOG_WARNING("Bad GPIO %d for Sensor %s. Disabling.", sensor.gpio, sensor.name.c_str());
|
||||||
|
sensors_.emplace_back(99, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type, sensor.is_system);
|
||||||
|
} else {
|
||||||
|
sensors_.emplace_back(sensor.gpio, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type, sensor.is_system);
|
||||||
|
}
|
||||||
sensors_.back().ha_registered = false; // this will trigger recreate of the HA config
|
sensors_.back().ha_registered = false; // this will trigger recreate of the HA config
|
||||||
if (sensor.type == AnalogType::COUNTER || sensor.type >= AnalogType::DIGITAL_OUT) {
|
if (sensor.type == AnalogType::COUNTER || sensor.type >= AnalogType::DIGITAL_OUT) {
|
||||||
sensors_.back().set_value(sensor.offset);
|
sensors_.back().set_value(sensor.offset);
|
||||||
@@ -187,16 +194,8 @@ void AnalogSensor::reload(bool get_nvs) {
|
|||||||
for (auto & sensor : sensors_) {
|
for (auto & sensor : sensors_) {
|
||||||
sensor.ha_registered = false; // force HA configs to be re-created
|
sensor.ha_registered = false; // force HA configs to be re-created
|
||||||
|
|
||||||
// first check if the GPIO is valid. If not, force set the sensor to disabled, but don't remove it
|
if (sensor.type() == AnalogType::COUNTER || sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::RATE
|
||||||
if (!EMSESP::system_.is_valid_gpio(sensor.gpio())) {
|
|| sensor.type() == AnalogType::TIMER) {
|
||||||
LOG_WARNING("Bad GPIO %d for Sensor %s. Disabling.", sensor.gpio(), sensor.name().c_str());
|
|
||||||
sensor.set_type(AnalogType::NOTUSED); // set disabled
|
|
||||||
continue; // skip this loop pass
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((sensor.gpio() == 25 || sensor.gpio() == 26)
|
|
||||||
&& (sensor.type() == AnalogType::COUNTER || sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::RATE
|
|
||||||
|| sensor.type() == AnalogType::TIMER)) {
|
|
||||||
// pullup is mapped to DAC, so set to 3.3V
|
// pullup is mapped to DAC, so set to 3.3V
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
if (sensor.gpio() == 25 || sensor.gpio() == 26) {
|
if (sensor.gpio() == 25 || sensor.gpio() == 26) {
|
||||||
@@ -521,7 +520,9 @@ bool AnalogSensor::update(uint8_t gpio, std::string & name, double offset, doubl
|
|||||||
}
|
}
|
||||||
|
|
||||||
// we didn't find it, it's new, so create and store it in the customization list
|
// we didn't find it, it's new, so create and store it in the customization list
|
||||||
if (!found_sensor) {
|
// gpio is already checked in web interface, should never trigger.
|
||||||
|
if (!found_sensor && EMSESP::system_.is_valid_gpio(gpio)) {
|
||||||
|
found_sensor = true;
|
||||||
EMSESP::webCustomizationService.update([&](WebCustomization & settings) {
|
EMSESP::webCustomizationService.update([&](WebCustomization & settings) {
|
||||||
auto newSensor = AnalogCustomization();
|
auto newSensor = AnalogCustomization();
|
||||||
newSensor.gpio = gpio;
|
newSensor.gpio = gpio;
|
||||||
@@ -538,11 +539,12 @@ bool AnalogSensor::update(uint8_t gpio, std::string & name, double offset, doubl
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reloads the sensors in the customizations file into the sensors list
|
// reloads the sensors in the customizations file into the sensors list
|
||||||
reload();
|
if (found_sensor) {
|
||||||
|
reload();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// return false if it's an invalid GPIO, an error will show in WebUI
|
return false;
|
||||||
// and reported as an error in the log
|
|
||||||
return EMSESP::system_.is_valid_gpio(gpio);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// check to see if values have been updated
|
// check to see if values have been updated
|
||||||
|
|||||||
@@ -414,13 +414,17 @@ void System::reload_settings() {
|
|||||||
dallas_gpio_ = 0;
|
dallas_gpio_ = 0;
|
||||||
EMSESP::webSettingsService.read([&](WebSettings & settings) {
|
EMSESP::webSettingsService.read([&](WebSettings & settings) {
|
||||||
version_ = settings.version;
|
version_ = settings.version;
|
||||||
|
// first check gpios, priority to rx and tx
|
||||||
|
rx_gpio_ = is_valid_gpio(settings.rx_gpio) ? settings.rx_gpio : 0;
|
||||||
|
tx_gpio_ = is_valid_gpio(settings.tx_gpio) ? settings.tx_gpio : 0;
|
||||||
|
pbutton_gpio_ = is_valid_gpio(settings.pbutton_gpio) ? settings.pbutton_gpio : 0;
|
||||||
|
dallas_gpio_ = is_valid_gpio(settings.dallas_gpio) ? settings.dallas_gpio : 0;
|
||||||
|
led_gpio_ = is_valid_gpio(settings.led_gpio) ? settings.led_gpio : 0;
|
||||||
|
|
||||||
pbutton_gpio_ = is_valid_gpio(settings.pbutton_gpio) ? settings.pbutton_gpio : 0;
|
|
||||||
analog_enabled_ = settings.analog_enabled;
|
analog_enabled_ = settings.analog_enabled;
|
||||||
low_clock_ = settings.low_clock;
|
low_clock_ = settings.low_clock;
|
||||||
hide_led_ = settings.hide_led;
|
hide_led_ = settings.hide_led;
|
||||||
led_type_ = settings.led_type;
|
led_type_ = settings.led_type;
|
||||||
led_gpio_ = is_valid_gpio(settings.led_gpio) ? settings.led_gpio : 0;
|
|
||||||
board_profile_ = settings.board_profile;
|
board_profile_ = settings.board_profile;
|
||||||
telnet_enabled_ = settings.telnet_enabled;
|
telnet_enabled_ = settings.telnet_enabled;
|
||||||
|
|
||||||
@@ -430,9 +434,6 @@ void System::reload_settings() {
|
|||||||
modbus_timeout_ = settings.modbus_timeout;
|
modbus_timeout_ = settings.modbus_timeout;
|
||||||
|
|
||||||
tx_mode_ = settings.tx_mode;
|
tx_mode_ = settings.tx_mode;
|
||||||
rx_gpio_ = is_valid_gpio(settings.rx_gpio) ? settings.rx_gpio : 0;
|
|
||||||
tx_gpio_ = is_valid_gpio(settings.tx_gpio) ? settings.tx_gpio : 0;
|
|
||||||
dallas_gpio_ = is_valid_gpio(settings.dallas_gpio) ? settings.dallas_gpio : 0;
|
|
||||||
syslog_enabled_ = settings.syslog_enabled;
|
syslog_enabled_ = settings.syslog_enabled;
|
||||||
syslog_level_ = settings.syslog_level;
|
syslog_level_ = settings.syslog_level;
|
||||||
syslog_mark_interval_ = settings.syslog_mark_interval;
|
syslog_mark_interval_ = settings.syslog_mark_interval;
|
||||||
@@ -457,7 +458,8 @@ void System::reload_settings() {
|
|||||||
|
|
||||||
// check for valid ESP32 pins
|
// check for valid ESP32 pins
|
||||||
bool System::is_valid_gpio(uint8_t pin) {
|
bool System::is_valid_gpio(uint8_t pin) {
|
||||||
return std::find(valid_gpio_list().begin(), valid_gpio_list().end(), pin) != valid_gpio_list().end();
|
auto valid_gpios = valid_gpio_list();
|
||||||
|
return std::find(valid_gpios.begin(), valid_gpios.end(), pin) != valid_gpios.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Starts up the UART Serial bridge
|
// Starts up the UART Serial bridge
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) {
|
|||||||
obj["t"] = sensor.type();
|
obj["t"] = sensor.type();
|
||||||
obj["s"] = sensor.is_system();
|
obj["s"] = sensor.is_system();
|
||||||
|
|
||||||
if (sensor.type() != AnalogSensor::AnalogType::NOTUSED) {
|
if (sensor.type() != AnalogSensor::AnalogType::NOTUSED && sensor.gpio() != 99) {
|
||||||
obj["v"] = Helpers::transformNumFloat(sensor.value()); // is optional and is a float
|
obj["v"] = Helpers::transformNumFloat(sensor.value()); // is optional and is a float
|
||||||
} else {
|
} else {
|
||||||
obj["v"] = 0; // must have a value for web sorting to work
|
obj["v"] = 0; // must have a value for web sorting to work
|
||||||
@@ -435,41 +435,39 @@ void WebDataService::dashboard_data(AsyncWebServerRequest * request) {
|
|||||||
JsonArray nodes = obj["nodes"].to<JsonArray>();
|
JsonArray nodes = obj["nodes"].to<JsonArray>();
|
||||||
uint8_t count = 0;
|
uint8_t count = 0;
|
||||||
for (const auto & sensor : EMSESP::analogsensor_.sensors()) {
|
for (const auto & sensor : EMSESP::analogsensor_.sensors()) {
|
||||||
// ignore system sensors
|
// ignore system and disabled sensors
|
||||||
if (sensor.is_system()) {
|
if (sensor.is_system() || sensor.type() == AnalogSensor::AnalogType::NOTUSED || sensor.gpio() == 99) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (sensor.type() != AnalogSensor::AnalogType::NOTUSED) { // ignore disabled
|
JsonObject node = nodes.add<JsonObject>();
|
||||||
JsonObject node = nodes.add<JsonObject>();
|
node["id"] = (EMSdevice::DeviceTypeUniqueID::ANALOGSENSOR_UID * 100) + count++;
|
||||||
node["id"] = (EMSdevice::DeviceTypeUniqueID::ANALOGSENSOR_UID * 100) + count++;
|
|
||||||
|
|
||||||
JsonObject dv = node["dv"].to<JsonObject>();
|
JsonObject dv = node["dv"].to<JsonObject>();
|
||||||
dv["id"] = "00" + sensor.name();
|
dv["id"] = "00" + sensor.name();
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
if (sensor.type() == AnalogSensor::AnalogType::DIGITAL_OUT && (sensor.gpio() == 25 || sensor.gpio() == 26)) {
|
if (sensor.type() == AnalogSensor::AnalogType::DIGITAL_OUT && (sensor.gpio() == 25 || sensor.gpio() == 26)) {
|
||||||
obj["v"] = Helpers::transformNumFloat(sensor.value());
|
obj["v"] = Helpers::transformNumFloat(sensor.value());
|
||||||
} else
|
} else
|
||||||
#elif CONFIG_IDF_TARGET_ESP32S2
|
#elif CONFIG_IDF_TARGET_ESP32S2
|
||||||
if (sensor.type() == AnalogSensor::AnalogType::DIGITAL_OUT && (sensor.gpio() == 17 || sensor.gpio() == 18)) {
|
if (sensor.type() == AnalogSensor::AnalogType::DIGITAL_OUT && (sensor.gpio() == 17 || sensor.gpio() == 18)) {
|
||||||
obj["v"] = Helpers::transformNumFloat(sensor.value());
|
obj["v"] = Helpers::transformNumFloat(sensor.value());
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
if (sensor.type() == AnalogSensor::AnalogType::DIGITAL_OUT || sensor.type() == AnalogSensor::AnalogType::DIGITAL_IN
|
if (sensor.type() == AnalogSensor::AnalogType::DIGITAL_OUT || sensor.type() == AnalogSensor::AnalogType::DIGITAL_IN
|
||||||
|| sensor.type() == AnalogSensor::AnalogType::PULSE) {
|
|| sensor.type() == AnalogSensor::AnalogType::PULSE) {
|
||||||
char s[12];
|
char s[12];
|
||||||
dv["v"] = Helpers::render_boolean(s, sensor.value() != 0, true);
|
dv["v"] = Helpers::render_boolean(s, sensor.value() != 0, true);
|
||||||
JsonArray l = dv["l"].to<JsonArray>();
|
JsonArray l = dv["l"].to<JsonArray>();
|
||||||
l.add(Helpers::render_boolean(s, false, true));
|
l.add(Helpers::render_boolean(s, false, true));
|
||||||
l.add(Helpers::render_boolean(s, true, true));
|
l.add(Helpers::render_boolean(s, true, true));
|
||||||
} else {
|
} else {
|
||||||
dv["v"] = Helpers::transformNumFloat(sensor.value());
|
dv["v"] = Helpers::transformNumFloat(sensor.value());
|
||||||
dv["u"] = sensor.uom();
|
dv["u"] = sensor.uom();
|
||||||
}
|
}
|
||||||
if (sensor.type() == AnalogSensor::AnalogType::COUNTER
|
if (sensor.type() == AnalogSensor::AnalogType::COUNTER
|
||||||
|| (sensor.type() >= AnalogSensor::AnalogType::DIGITAL_OUT && sensor.type() <= AnalogSensor::AnalogType::PWM_2)
|
|| (sensor.type() >= AnalogSensor::AnalogType::DIGITAL_OUT && sensor.type() <= AnalogSensor::AnalogType::PWM_2)
|
||||||
|| sensor.type() == AnalogSensor::AnalogType::RGB || sensor.type() == AnalogSensor::AnalogType::PULSE) {
|
|| sensor.type() == AnalogSensor::AnalogType::RGB || sensor.type() == AnalogSensor::AnalogType::PULSE) {
|
||||||
dv["c"] = sensor.name();
|
dv["c"] = sensor.name();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user