diff --git a/.gitignore b/.gitignore index 584ce9a..f491eb1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .pio +.dummy .vscode .PVS-Studio build/* @@ -10,5 +11,4 @@ package-lock.json *.lock sdkconfig.* CMakeLists.txt -!sdkconfig.defaults !.gitkeep \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index f7f6091..17398ca 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,13 +17,14 @@ lib_deps = ESP32Async/AsyncTCP@^3.4.10 gyverlibs/GyverPID@^3.3.2 gyverlibs/GyverBlinker@^1.1.1 pstolarz/OneWireNg@^0.14.1 - ;milesburton/DallasTemperature@^4.0.5 - https://github.com/Laxilef/Arduino-Temperature-Control-Library#fix_85c + milesburton/DallasTemperature@^4.0.6 + https://github.com/Laxilef/esp32DHT#idf5 ;laxilef/TinyLogger@^1.1.1 https://github.com/Laxilef/TinyLogger#custom_handlers -lib_ignore = paulstoffregen/OneWire +lib_ignore = OneWire build_type = ${secrets.build_type} -build_flags = -mtext-section-literals +build_flags = ;-mtext-section-literals + -O2 -Wno-deprecated-declarations -D MQTT_CLIENT_STD_FUNCTION_CALLBACK=1 ;-D DEBUG_ESP_CORE -D DEBUG_ESP_WIFI -D DEBUG_ESP_HTTP_SERVER -D DEBUG_ESP_PORT=Serial @@ -33,6 +34,7 @@ build_flags = -mtext-section-literals -D ARDUINOJSON_USE_DOUBLE=0 -D ARDUINOJSON_USE_LONG_LONG=0 -D TINYLOGGER_GLOBAL + -D DHT_TASK_STACK_SIZE=4096 -D DEFAULT_SERIAL_ENABLED=${secrets.serial_enabled} -D DEFAULT_SERIAL_BAUD=${secrets.serial_baud} -D DEFAULT_WEBSERIAL_ENABLED=${secrets.webserial_enabled} @@ -61,7 +63,7 @@ check_flags = ;pvs-studio: --analysis-mode=4 --exclude-path=./.pio/l ; Defaults [esp32_defaults] -platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.36/platform-espressif32.zip +platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.37/platform-espressif32.zip platform_packages = ${env.platform_packages} board_build.partitions = esp32_partitions.csv lib_deps = ${env.lib_deps} @@ -96,7 +98,8 @@ custom_component_remove = espressif/esp_hosted espressif/esp-zboss-lib espressif/esp-zigbee-lib chmorgan/esp-libhelix-mp3 -extra_scripts = post:tools/esp32.py +extra_scripts = pre:tools/add_build_commit.py + post:tools/esp32.py post:tools/build.py build_type = ${env.build_type} build_flags = ${env.build_flags} @@ -144,7 +147,7 @@ extends = esp32_defaults board = lolin_c3_mini lib_deps = ${esp32_defaults.lib_deps} ${esp32_defaults.nimble_lib} -build_unflags = -mtext-section-literals +;build_unflags = -mtext-section-literals build_flags = ${esp32_defaults.build_flags} -D MYNEWT_VAL_BLE_EXT_ADV=1 -D USE_BLE=1 @@ -192,7 +195,7 @@ extends = esp32_defaults board = esp32-c6-devkitc-1 lib_deps = ${esp32_defaults.lib_deps} ${esp32_defaults.nimble_lib} -build_unflags = -mtext-section-literals +;build_unflags = -mtext-section-literals build_flags = ${esp32_defaults.build_flags} -D USE_BLE=1 -D DEFAULT_OT_IN_GPIO=15 @@ -201,13 +204,18 @@ build_flags = ${esp32_defaults.build_flags} -D DEFAULT_SENSOR_INDOOR_GPIO=0 -D DEFAULT_STATUS_LED_GPIO=11 -D DEFAULT_OT_RX_LED_GPIO=10 +custom_sdkconfig = '# CONFIG_OPENTHREAD_ENABLED is not set' + '# CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT is not set' + '# CONFIG_LWIP_IPV6 is not set' + '# CONFIG_LWIP_IPV6_AUTOCONFIG is not set' + '# CONFIG_LWIP_PPP_SUPPORT is not set' [env:otthing] extends = esp32_defaults board = lolin_c3_mini lib_deps = ${esp32_defaults.lib_deps} ${esp32_defaults.nimble_lib} -build_unflags = -mtext-section-literals +;build_unflags = -mtext-section-literals build_flags = ${esp32_defaults.build_flags} -D MYNEWT_VAL_BLE_EXT_ADV=1 -D USE_BLE=1 diff --git a/sdkconfig.defaults b/sdkconfig.defaults deleted file mode 100644 index cd05530..0000000 --- a/sdkconfig.defaults +++ /dev/null @@ -1,33 +0,0 @@ -# Source: -# https://github.com/pioarduino/platform-espressif32/tree/main/examples/espidf-arduino-h2zero-BLE_scan - -CONFIG_FREERTOS_HZ=1000 -CONFIG_MBEDTLS_PSK_MODES=y -CONFIG_MBEDTLS_KEY_EXCHANGE_PSK=y -CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y -CONFIG_COMPILER_OPTIMIZATION_SIZE=y -CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y -CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE=y - -# -# BT config -CONFIG_BT_ENABLED=y -CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y -CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n -CONFIG_BTDM_CTRL_MODE_BTDM=n -CONFIG_BT_BLUEDROID_ENABLED=n -CONFIG_BT_NIMBLE_ENABLED=y - -# -# Arduino Configuration -CONFIG_AUTOSTART_ARDUINO=y -CONFIG_ARDUINO_SELECTIVE_COMPILATION=y -CONFIG_ARDUINO_SELECTIVE_Zigbee=n -CONFIG_ARDUINO_SELECTIVE_Matter=n -CONFIG_ARDUINO_SELECTIVE_WiFiProv=n -CONFIG_ARDUINO_SELECTIVE_BLE=n -CONFIG_ARDUINO_SELECTIVE_BluetoothSerial=n -CONFIG_ARDUINO_SELECTIVE_SimpleBLE=n -CONFIG_ARDUINO_SELECTIVE_RainMaker=n -CONFIG_ARDUINO_SELECTIVE_OpenThread=n -CONFIG_ARDUINO_SELECTIVE_Insights=n \ No newline at end of file diff --git a/src/HaHelper.h b/src/HaHelper.h index 88a5d4d..77b6bfc 100644 --- a/src/HaHelper.h +++ b/src/HaHelper.h @@ -176,9 +176,10 @@ public: objId.c_str() ); - // set device class, name, value template for bluetooth sensors + // set device class, name, value template for Bluetooth/DHT sensors // or name & value template for another sensors - if (sSensor.type == Sensors::Type::BLUETOOTH) { + if (sSensor.type == Sensors::Type::BLUETOOTH || + sSensor.type == Sensors::Type::DHT11 || sSensor.type == Sensors::Type::DHT22) { // available state topic doc[FPSTR(HA_AVAILABILITY)][1][FPSTR(HA_TOPIC)] = doc[FPSTR(HA_STATE_TOPIC)]; doc[FPSTR(HA_AVAILABILITY)][1][FPSTR(HA_VALUE_TEMPLATE)] = JsonString(AVAILABILITY_SENSOR_CONN, true); diff --git a/src/MqttTask.h b/src/MqttTask.h index f7f780e..cfb9a05 100644 --- a/src/MqttTask.h +++ b/src/MqttTask.h @@ -292,6 +292,14 @@ protected: this->haHelper->deleteDynamicSensor(prevSettings, Sensors::ValueType::RSSI); break; + case Sensors::Type::DHT11: + case Sensors::Type::DHT22: + this->haHelper->deleteConnectionDynamicSensor(prevSettings); + this->haHelper->deleteSignalQualityDynamicSensor(prevSettings); + this->haHelper->deleteDynamicSensor(prevSettings, Sensors::ValueType::TEMPERATURE); + this->haHelper->deleteDynamicSensor(prevSettings, Sensors::ValueType::HUMIDITY); + break; + case Sensors::Type::DALLAS_TEMP: this->haHelper->deleteConnectionDynamicSensor(prevSettings); this->haHelper->deleteSignalQualityDynamicSensor(prevSettings); @@ -319,6 +327,14 @@ protected: this->haHelper->publishDynamicSensor(sSettings, Sensors::ValueType::RSSI, settings.system.unitSystem, false); break; + case Sensors::Type::DHT11: + case Sensors::Type::DHT22: + this->haHelper->publishConnectionDynamicSensor(sSettings); + this->haHelper->publishSignalQualityDynamicSensor(sSettings, false); + this->haHelper->publishDynamicSensor(sSettings, Sensors::ValueType::TEMPERATURE, settings.system.unitSystem); + this->haHelper->publishDynamicSensor(sSettings, Sensors::ValueType::HUMIDITY, settings.system.unitSystem); + break; + case Sensors::Type::DALLAS_TEMP: this->haHelper->publishConnectionDynamicSensor(sSettings); this->haHelper->publishSignalQualityDynamicSensor(sSettings, false); diff --git a/src/PortalTask.h b/src/PortalTask.h index edabc12..5b4505f 100644 --- a/src/PortalTask.h +++ b/src/PortalTask.h @@ -552,6 +552,7 @@ protected: auto docBuild = doc[FPSTR(S_BUILD)].to(); docBuild[FPSTR(S_VERSION)] = BUILD_VERSION; + docBuild[FPSTR(S_COMMIT)] = BUILD_COMMIT; docBuild[FPSTR(S_DATE)] = __DATE__ " " __TIME__; docBuild[FPSTR(S_ENV)] = BUILD_ENV; docBuild[FPSTR(S_CORE)] = ESP.getCoreVersion(); @@ -592,6 +593,7 @@ protected: auto docBuild = doc[FPSTR(S_BUILD)].to(); docBuild[FPSTR(S_VERSION)] = BUILD_VERSION; + docBuild[FPSTR(S_COMMIT)] = BUILD_COMMIT; docBuild[FPSTR(S_DATE)] = __DATE__ " " __TIME__; docBuild[FPSTR(S_ENV)] = BUILD_ENV; docBuild[FPSTR(S_CORE)] = ESP.getCoreVersion(); diff --git a/src/RegulatorTask.h b/src/RegulatorTask.h index 4b7c3c0..88d2175 100644 --- a/src/RegulatorTask.h +++ b/src/RegulatorTask.h @@ -32,7 +32,7 @@ protected: return 4; } #endif - + void loop() { if (vars.states.restarting || vars.states.upgrading) { return; @@ -159,7 +159,7 @@ protected: ); float etResult = settings.heating.target + settings.equitherm.shift + sf * ( tempDelta >= 0 - ? pow(tempDelta, 1.0f / settings.equitherm.exponent) + ? pow(tempDelta, 1.0f / settings.equitherm.exponent) : -(pow(-(tempDelta), 1.0f / settings.equitherm.exponent)) ); @@ -208,7 +208,7 @@ protected: }*/ float error = pidRegulator.setpoint - pidRegulator.input; - bool hasDeadband = settings.pid.deadband.enabled + bool hasDeadband = settings.pid.deadband.enabled && (error > -(settings.pid.deadband.thresholdHigh)) && (error < settings.pid.deadband.thresholdLow); diff --git a/src/Sensors.h b/src/Sensors.h index 71b9ac3..bd9b524 100644 --- a/src/Sensors.h +++ b/src/Sensors.h @@ -39,6 +39,8 @@ public: NTC_10K_TEMP = 50, DALLAS_TEMP = 51, BLUETOOTH = 52, + DHT11 = 53, + DHT22 = 54, HEATING_SETPOINT_TEMP = 253, MANUAL = 254, diff --git a/src/SensorsTask.h b/src/SensorsTask.h index 2c8322b..7c5fa6e 100644 --- a/src/SensorsTask.h +++ b/src/SensorsTask.h @@ -1,6 +1,7 @@ #include #include #include +#include #if USE_BLE #include @@ -304,11 +305,13 @@ public: class SensorsTask : public LeanTask { public: SensorsTask(bool _enabled = false, unsigned long _interval = 0) : LeanTask(_enabled, _interval) { + this->gpioLastPollingTime.reserve(2); + + // OneWire this->owInstances.reserve(2); this->dallasInstances.reserve(2); this->dallasSearchTime.reserve(2); this->dallasPolling.reserve(2); - this->dallasLastPollingTime.reserve(2); #if USE_BLE this->pBLEScanCallbacks = new BluetoothScanCallbacks(); @@ -316,11 +319,13 @@ public: } ~SensorsTask() { + this->gpioLastPollingTime.clear(); + + // OneWire this->dallasInstances.clear(); this->owInstances.clear(); this->dallasSearchTime.clear(); this->dallasPolling.clear(); - this->dallasLastPollingTime.clear(); #if USE_BLE delete this->pBLEScanCallbacks; @@ -332,13 +337,21 @@ protected: const unsigned int wirelessDisconnectTimeout = 600000u; const unsigned short dallasSearchInterval = 60000u; const unsigned short dallasPollingInterval = 10000u; + const unsigned short dhtPollingInterval = 15000; const unsigned short globalPollingInterval = 15000u; + std::unordered_map gpioLastPollingTime; + + // OneWire std::unordered_map owInstances; std::unordered_map dallasInstances; std::unordered_map dallasSearchTime; std::unordered_map dallasPolling; - std::unordered_map dallasLastPollingTime; + + // DHT + DHT dhtInstance; + bool dhtIsPolling = false; + #if USE_BLE NimBLEScan* pBLEScan = nullptr; BluetoothScanCallbacks* pBLEScanCallbacks = nullptr; @@ -379,6 +392,9 @@ protected: this->yield(); } + pollingDhtSensors(); + this->yield(); + if (millis() - this->globalLastPollingTime > this->globalPollingInterval) { cleanDallasInstances(); makeDallasInstances(); @@ -435,7 +451,7 @@ protected: this->dallasSearchTime[sSensor.gpio] = 0; this->dallasPolling[sSensor.gpio] = false; - this->dallasLastPollingTime[sSensor.gpio] = 0; + this->gpioLastPollingTime[sSensor.gpio] = 0; auto& instance = this->dallasInstances[sSensor.gpio]; instance.setOneWire(&owInstance); @@ -470,7 +486,7 @@ protected: this->owInstances.erase(gpio); this->dallasSearchTime.erase(gpio); this->dallasPolling.erase(gpio); - this->dallasLastPollingTime.erase(gpio); + this->gpioLastPollingTime.erase(gpio); Log.sinfoln(FPSTR(L_SENSORS_DALLAS), F("Stopped on GPIO %hhu"), gpio); continue; @@ -591,7 +607,7 @@ protected: if (this->dallasPolling[gpio]) { unsigned long minPollingTime = instance.millisToWaitForConversion(12) * 2; - unsigned long estimatePollingTime = ts - this->dallasLastPollingTime[gpio]; + unsigned long estimatePollingTime = ts - this->gpioLastPollingTime[gpio]; // check conversion time // isConversionComplete does not work with chinese clones! @@ -643,7 +659,7 @@ protected: this->dallasPolling[gpio] = false; } else if (newPolling) { - auto estimateLastPollingTime = ts - this->dallasLastPollingTime[gpio]; + auto estimateLastPollingTime = ts - this->gpioLastPollingTime[gpio]; // check last polling time if (estimateLastPollingTime < this->dallasPollingInterval) { @@ -654,13 +670,102 @@ protected: instance.setResolution(12); instance.requestTemperatures(); this->dallasPolling[gpio] = true; - this->dallasLastPollingTime[gpio] = ts; + this->gpioLastPollingTime[gpio] = ts; Log.straceln(FPSTR(L_SENSORS_DALLAS), F("GPIO %hhu, polling..."), gpio); } } } + void pollingDhtSensors() { + if (this->dhtIsPolling) { + // busy + return; + } + + for (uint8_t sensorId = 0; sensorId <= Sensors::getMaxSensorId(); sensorId++) { + auto& sSensor = Sensors::settings[sensorId]; + + if (!sSensor.enabled || sSensor.purpose == Sensors::Purpose::NOT_CONFIGURED) { + continue; + } + + if (sSensor.type != Sensors::Type::DHT11 && sSensor.type != Sensors::Type::DHT22) { + continue; + } + + if (this->gpioLastPollingTime.count(sSensor.gpio) && millis() - this->gpioLastPollingTime[sSensor.gpio] < this->dhtPollingInterval) { + continue; + } + + const auto sensorGpio = static_cast(sSensor.gpio); + if (this->dhtInstance.getGpio() != sensorGpio) { + this->dhtInstance.reset(); + this->dhtInstance.onData([this, sensorId](float humidity, float temperature) { + auto& sSensor = Sensors::settings[sensorId]; + + Log.straceln( + FPSTR(L_SENSORS_DHT), F("GPIO %hhu, sensor #%hhu '%s', temp: %.2f, humidity: %.2f%%"), + sSensor.gpio, sensorId, sSensor.name, temperature, humidity + ); + + // set temperature + Sensors::setValueById(sensorId, temperature, Sensors::ValueType::TEMPERATURE, true, true); + + // set humidity + Sensors::setValueById(sensorId, humidity, Sensors::ValueType::HUMIDITY, true, true); + + auto& rSensor = Sensors::results[sensorId]; + if (rSensor.signalQuality < 100) { + rSensor.signalQuality++; + } + + this->gpioLastPollingTime[sSensor.gpio] = millis(); + this->dhtIsPolling = false; + }); + + this->dhtInstance.onError([this, sensorId](DHT::Status status) { + auto& sSensor = Sensors::settings[sensorId]; + + Log.swarningln( + FPSTR(L_SENSORS_DHT), F("GPIO %hhu, sensor #%hhu '%s': failed receiving data (err: %s)"), + sSensor.gpio, sensorId, sSensor.name, DHT::statusToString(this->dhtInstance.getStatus()) + ); + + auto& rSensor = Sensors::results[sensorId]; + if (rSensor.signalQuality > 0) { + rSensor.signalQuality--; + } + + this->gpioLastPollingTime[sSensor.gpio] = millis(); + this->dhtIsPolling = false; + }); + + DHT::Type sType = DHT::Type::DHT22; + if (sSensor.type == Sensors::Type::DHT11) { + sType = DHT::Type::DHT11; + + } else if (sSensor.type == Sensors::Type::DHT22) { + sType = DHT::Type::DHT22; + } + + if (this->dhtInstance.setup(sensorGpio, sType)) { + Log.sinfoln(FPSTR(L_SENSORS_DHT), F("Started on GPIO %hhu"), sSensor.gpio); + + } else { + Log.swarningln( + FPSTR(L_SENSORS_DHT), F("Failed to start on GPIO %hhu (err: %s)"), + sSensor.gpio, DHT::statusToString(this->dhtInstance.getStatus()) + ); + } + } + + this->dhtIsPolling = this->dhtInstance.poll(); + + break; + } + } + void pollingNtcSensors() { for (uint8_t sensorId = 0; sensorId <= Sensors::getMaxSensorId(); sensorId++) { auto& sSensor = Sensors::settings[sensorId]; diff --git a/src/defines.h b/src/defines.h index 3b71bfb..411b770 100644 --- a/src/defines.h +++ b/src/defines.h @@ -30,6 +30,10 @@ #define BUILD_VERSION "0.0.0" #endif +#ifndef BUILD_COMMIT + #define BUILD_COMMIT "undefined" +#endif + #ifndef BUILD_ENV #define BUILD_ENV "undefined" #endif diff --git a/src/idf_component.yml b/src/idf_component.yml deleted file mode 100644 index 8f66bbe..0000000 --- a/src/idf_component.yml +++ /dev/null @@ -1,3 +0,0 @@ -dependencies: - idf: ">=5.3.2" - h2zero/esp-nimble-cpp: ">=2.2.1" \ No newline at end of file diff --git a/src/strings.h b/src/strings.h index 6b3f362..218fe28 100644 --- a/src/strings.h +++ b/src/strings.h @@ -24,6 +24,7 @@ const char L_OT_CH2[] PROGMEM = "OT.CH2"; const char L_SENSORS[] PROGMEM = "SENSORS"; const char L_SENSORS_SETTINGS[] PROGMEM = "SENSORS.SETTINGS"; const char L_SENSORS_DALLAS[] PROGMEM = "SENSORS.DALLAS"; +const char L_SENSORS_DHT[] PROGMEM = "SENSORS.DHT"; const char L_SENSORS_NTC[] PROGMEM = "SENSORS.NTC"; const char L_SENSORS_BLE[] PROGMEM = "SENSORS.BLE"; const char L_REGULATOR[] PROGMEM = "REGULATOR"; @@ -56,6 +57,7 @@ const char S_CHANNEL[] PROGMEM = "channel"; const char S_CH2_ALWAYS_ENABLED[] PROGMEM = "ch2AlwaysEnabled"; const char S_CHIP[] PROGMEM = "chip"; const char S_CODE[] PROGMEM = "code"; +const char S_COMMIT[] PROGMEM = "commit"; const char S_CONNECTED[] PROGMEM = "connected"; const char S_CONTINUES[] PROGMEM = "continues"; const char S_COOLING[] PROGMEM = "cooling"; diff --git a/src/utils.h b/src/utils.h index 0ec8225..6c39e1d 100644 --- a/src/utils.h +++ b/src/utils.h @@ -1927,6 +1927,8 @@ bool jsonToSensorSettings(const uint8_t sensorId, const JsonVariantConst src, Se case static_cast(Sensors::Type::NTC_10K_TEMP): case static_cast(Sensors::Type::DALLAS_TEMP): case static_cast(Sensors::Type::BLUETOOTH): + case static_cast(Sensors::Type::DHT11): + case static_cast(Sensors::Type::DHT22): case static_cast(Sensors::Type::HEATING_SETPOINT_TEMP): case static_cast(Sensors::Type::MANUAL): case static_cast(Sensors::Type::NOT_CONFIGURED): @@ -1943,7 +1945,8 @@ bool jsonToSensorSettings(const uint8_t sensorId, const JsonVariantConst src, Se // gpio if (!src[FPSTR(S_GPIO)].isNull()) { - if (dst.type != Sensors::Type::DALLAS_TEMP && dst.type != Sensors::Type::NTC_10K_TEMP) { + if (dst.type != Sensors::Type::DALLAS_TEMP && dst.type != Sensors::Type::NTC_10K_TEMP && + dst.type != Sensors::Type::DHT11 && dst.type != Sensors::Type::DHT22) { if (dst.gpio != GPIO_IS_NOT_CONFIGURED) { dst.gpio = GPIO_IS_NOT_CONFIGURED; changed = true; @@ -2084,6 +2087,10 @@ void sensorResultToJson(const uint8_t sensorId, JsonVariant dst) { dst[FPSTR(S_BATTERY)] = roundf(rSensor.values[static_cast(Sensors::ValueType::BATTERY)], 1); dst[FPSTR(S_RSSI)] = roundf(rSensor.values[static_cast(Sensors::ValueType::RSSI)], 0); + } else if (sSensor.type == Sensors::Type::DHT11 || sSensor.type == Sensors::Type::DHT22) { + dst[FPSTR(S_TEMPERATURE)] = roundf(rSensor.values[static_cast(Sensors::ValueType::TEMPERATURE)], 3); + dst[FPSTR(S_HUMIDITY)] = roundf(rSensor.values[static_cast(Sensors::ValueType::HUMIDITY)], 3); + } else { dst[FPSTR(S_VALUE)] = roundf(rSensor.values[static_cast(Sensors::ValueType::PRIMARY)], 3); } diff --git a/src_data/locales/cn.json b/src_data/locales/cn.json index 2e74d48..2870fe1 100644 --- a/src_data/locales/cn.json +++ b/src_data/locales/cn.json @@ -44,6 +44,7 @@ "build": { "title": "Build", "version": "固件版本", + "commit": "Commit", "date": "日期", "core": "内核版本", "sdk": "SDK" @@ -248,6 +249,8 @@ "ntcTemp": "NTC 传感器", "dallasTemp": "DALLAS 传感器", "bluetooth": "BLE 传感器", + "dht11": "DHT11 传感器", + "dht22": "DHT22 传感器", "heatSetpointTemp": "Heating, setpoint temp", "manual": "通过 MQTT/API 手动配置", "notConfigured": "未配置" diff --git a/src_data/locales/en.json b/src_data/locales/en.json index 9739e7d..e0a6168 100644 --- a/src_data/locales/en.json +++ b/src_data/locales/en.json @@ -44,6 +44,7 @@ "build": { "title": "Build", "version": "Version", + "commit": "Commit", "date": "Date", "core": "Core", "sdk": "SDK" @@ -248,6 +249,8 @@ "ntcTemp": "NTC sensor", "dallasTemp": "DALLAS sensor", "bluetooth": "BLE sensor", + "dht11": "DHT11 sensor", + "dht22": "DHT22 sensor", "heatSetpointTemp": "Heating, setpoint temp", "manual": "Manual via MQTT/API", "notConfigured": "Not configured" diff --git a/src_data/locales/it.json b/src_data/locales/it.json index 7e2c9e5..910add2 100644 --- a/src_data/locales/it.json +++ b/src_data/locales/it.json @@ -44,6 +44,7 @@ "build": { "title": "Build", "version": "Versione", + "commit": "Commit", "date": "Data", "core": "Core", "sdk": "SDK" @@ -248,6 +249,8 @@ "ntcTemp": "Sensore NTC", "dallasTemp": "Sensore DALLAS", "bluetooth": "Sensore BLE", + "dht11": "Sensore DHT11", + "dht22": "Sensore DHT22", "heatSetpointTemp": "Riscaldamento, temp impostata", "manual": "Manuale via MQTT/API", "notConfigured": "Non configurato" diff --git a/src_data/locales/nl.json b/src_data/locales/nl.json index 8d978be..7f5006a 100644 --- a/src_data/locales/nl.json +++ b/src_data/locales/nl.json @@ -40,6 +40,7 @@ "build": { "title": "Build", "version": "Versie", + "commit": "Commit", "date": "Datum", "core": "Core", "sdk": "SDK" @@ -227,6 +228,8 @@ "ntcTemp": "NTC-sensor", "dallasTemp": "DALLAS-sensor", "bluetooth": "BLE-sensor", + "dht11": "DHT11-sensor", + "dht22": "DHT22-sensor", "heatSetpointTemp": "Verwarming, insteltemperatuur", "manual": "Handmatig via MQTT/API", "notConfigured": "Niet geconfigureerd" diff --git a/src_data/locales/ru.json b/src_data/locales/ru.json index 3f3a036..0eabef8 100644 --- a/src_data/locales/ru.json +++ b/src_data/locales/ru.json @@ -44,6 +44,7 @@ "build": { "title": "Билд", "version": "Версия", + "commit": "Коммит", "date": "Дата", "core": "Ядро", "sdk": "SDK" @@ -248,6 +249,8 @@ "ntcTemp": "NTC датчик", "dallasTemp": "DALLAS датчик", "bluetooth": "BLE датчик", + "dht11": "DHT11 датчик", + "dht22": "DHT22 датчик", "heatSetpointTemp": "Отопление, температура уставки", "manual": "Вручную через MQTT/API", "notConfigured": "Не сконфигурировано" diff --git a/src_data/pages/index.html b/src_data/pages/index.html index c309190..a44fbd8 100644 --- a/src_data/pages/index.html +++ b/src_data/pages/index.html @@ -104,6 +104,7 @@ index.system.build.title Env:
+ index.system.build.commit:
index.system.build.date:
index.system.build.core:
index.system.build.sdk: @@ -206,6 +207,7 @@ setBusy('#main-busy', '#main-table', false); setValue('#build-version', result.build.version); + setValue('#build-commit', result.build.commit); setValue('#build-date', result.build.date); setValue('#build-env', result.build.env); setValue('#build-core', result.build.core); diff --git a/src_data/pages/sensors.html b/src_data/pages/sensors.html index 47f9986..8d7e435 100644 --- a/src_data/pages/sensors.html +++ b/src_data/pages/sensors.html @@ -118,6 +118,8 @@ + + @@ -271,27 +273,35 @@ } switch(parseInt(event.target.value)) { - // ntc + // NTC10K case 50: parentGpio.classList.remove("hidden"); parentAddress.classList.add("hidden"); address.removeAttribute("pattern"); break; - // dallas + // OneWire case 51: parentGpio.classList.remove("hidden"); parentAddress.classList.remove("hidden"); address.setAttribute("pattern", "([A-Fa-f0-9]{2}:){7}[A-Fa-f0-9]{2}"); break; - // ble + // Bluetooth case 52: parentGpio.classList.add("hidden"); parentAddress.classList.remove("hidden"); address.setAttribute("pattern", "([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}"); break; + // DHT + case 53: + case 54: + parentGpio.classList.remove("hidden"); + parentAddress.classList.add("hidden"); + address.removeAttribute("pattern"); + break; + // other default: parentGpio.classList.add("hidden"); diff --git a/tools/add_build_commit.py b/tools/add_build_commit.py new file mode 100644 index 0000000..8142b23 --- /dev/null +++ b/tools/add_build_commit.py @@ -0,0 +1,16 @@ +import subprocess +Import("env") + +try: + commit_hash = "undefined" + result = subprocess.check_output( + ["git", "rev-parse", "--short", "HEAD"] + ) + commit_hash = result.decode("utf-8").strip() + env.Append( + CPPDEFINES=[ + ("BUILD_COMMIT", '\\"{}\\"'.format(commit_hash)) + ] + ) +except Exception as error: + print("Failed to get commit hash: {}".format(error)) \ No newline at end of file