Compare commits

...

8 Commits

Author SHA1 Message Date
dependabot[bot] 6292305143 chore: bump cssnano from 7.1.9 to 8.0.0
Bumps [cssnano](https://github.com/cssnano/cssnano) from 7.1.9 to 8.0.0.
- [Release notes](https://github.com/cssnano/cssnano/releases)
- [Commits](https://github.com/cssnano/cssnano/compare/cssnano@7.1.9...cssnano@8.0.0)

---
updated-dependencies:
- dependency-name: cssnano
  dependency-version: 8.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-06 15:25:29 +00:00
dependabot[bot] 4775d36f1b chore: bump gulp-html-minifier-terser from 7.1.0 to 8.0.0 (#224)
Bumps [gulp-html-minifier-terser](https://github.com/pioug/gulp-html-minifier-terser) from 7.1.0 to 8.0.0.
- [Release notes](https://github.com/pioug/gulp-html-minifier-terser/releases)
- [Commits](https://github.com/pioug/gulp-html-minifier-terser/compare/v7.1.0...v8.0.0)

---
updated-dependencies:
- dependency-name: gulp-html-minifier-terser
  dependency-version: 8.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-16 23:36:56 +03:00
Yurii 1f895690db chore: bump milesburton/DallasTemperature from 4.0.5 to 4.0.6 #213
https://github.com/milesburton/Arduino-Temperature-Control-Library/pull/289
2026-02-13 14:10:08 +03:00
Yurii 13e8bedf3f fix: added await for lang.build() 2026-02-13 11:21:17 +03:00
Yurii 3a6bb03456 chore: fix build 2026-02-12 23:32:39 +03:00
Yurii 7fcca3c4aa chore: fix ha blueprints to support all source sensors 2026-01-26 02:09:57 +03:00
Yurii 2f6bd237c7 chore: updated ha blueprints for new releases 2026-01-26 01:59:03 +03:00
Yurii e4d1ba7d7b refactor: added different timeouts for wired and wireless sensors 2026-01-26 01:03:26 +03:00
13 changed files with 43 additions and 38 deletions
+5 -2
View File
@@ -1,5 +1,5 @@
# Blueprint for reporting indoor/outdoor temperature to OpenTherm Gateway from any home assistant sensor # Blueprint for reporting indoor/outdoor temperature to OpenTherm Gateway from any home assistant sensor
# Updated: 03.09.2024 # Updated: 26.01.2026
blueprint: blueprint:
name: Report temp to OpenTherm Gateway name: Report temp to OpenTherm Gateway
@@ -15,7 +15,6 @@ blueprint:
multiple: false multiple: false
filter: filter:
- domain: sensor - domain: sensor
device_class: temperature
target_entity: target_entity:
name: Target entity name: Target entity
description: "Usually ``number.opentherm_indoor_temp`` or ``number.opentherm_outdoor_temp``" description: "Usually ``number.opentherm_indoor_temp`` or ``number.opentherm_outdoor_temp``"
@@ -38,8 +37,12 @@ condition:
value_template: "{{ states(source_entity) != 'unavailable' and states(target_entity) != 'unavailable' }}" value_template: "{{ states(source_entity) != 'unavailable' and states(target_entity) != 'unavailable' }}"
action: action:
- if: - if:
- condition: or
conditions:
- condition: template - condition: template
value_template: "{{ (states(source_entity)|float(0) - states(target_entity)|float(0)) | abs | round(2) >= 0.01 }}" value_template: "{{ (states(source_entity)|float(0) - states(target_entity)|float(0)) | abs | round(2) >= 0.01 }}"
- condition: template
value_template: "{{ (as_timestamp(now()) - as_timestamp(states[target_entity].last_updated)) | int(0) > 300 }}"
then: then:
- service: number.set_value - service: number.set_value
data: data:
@@ -1,5 +1,5 @@
# Blueprint for reporting temperature to OpenTherm Gateway from home assistant weather integration # Blueprint for reporting temperature to OpenTherm Gateway from home assistant weather integration
# Updated: 03.09.2024 # Updated: 26.01.2026
blueprint: blueprint:
name: Report temp to OpenTherm Gateway from Weather name: Report temp to OpenTherm Gateway from Weather
@@ -37,8 +37,12 @@ condition:
value_template: "{{ states(source_entity) != 'unavailable' and states(target_entity) != 'unavailable' }}" value_template: "{{ states(source_entity) != 'unavailable' and states(target_entity) != 'unavailable' }}"
action: action:
- if: - if:
- condition: or
conditions:
- condition: template - condition: template
value_template: "{{ (state_attr(source_entity, 'temperature')|float(0) - states(target_entity)|float(0)) | abs | round(2) >= 0.1 }}" value_template: "{{ (state_attr(source_entity, 'temperature')|float(0) - states(target_entity)|float(0)) | abs | round(2) >= 0.1 }}"
- condition: template
value_template: "{{ (as_timestamp(now()) - as_timestamp(states[target_entity].last_updated)) | int(0) > 300 }}"
then: then:
- service: number.set_value - service: number.set_value
data: data:
+2 -2
View File
@@ -4,12 +4,12 @@
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"devDependencies": { "devDependencies": {
"cssnano": "^7.0.2", "cssnano": "^8.0.0",
"cssnano-preset-advanced": "^7.0.2", "cssnano-preset-advanced": "^7.0.2",
"gulp": "^5.0.0", "gulp": "^5.0.0",
"gulp-concat": "^2.6.1", "gulp-concat": "^2.6.1",
"gulp-gzip": "^1.4.2", "gulp-gzip": "^1.4.2",
"gulp-html-minifier-terser": "^7.1.0", "gulp-html-minifier-terser": "^8.0.0",
"gulp-jsonminify": "^1.1.0", "gulp-jsonminify": "^1.1.0",
"gulp-postcss": "^10.0.0", "gulp-postcss": "^10.0.0",
"gulp-terser": "^2.1.0", "gulp-terser": "^2.1.0",
+2 -4
View File
@@ -26,11 +26,9 @@ lib_deps =
gyverlibs/GyverPID@^3.3.2 gyverlibs/GyverPID@^3.3.2
gyverlibs/GyverBlinker@^1.1.1 gyverlibs/GyverBlinker@^1.1.1
pstolarz/OneWireNg@^0.14.1 pstolarz/OneWireNg@^0.14.1
;milesburton/DallasTemperature@^4.0.5 milesburton/DallasTemperature@^4.0.6
https://github.com/Laxilef/Arduino-Temperature-Control-Library#fix_85c
laxilef/TinyLogger@^1.1.1 laxilef/TinyLogger@^1.1.1
lib_ignore = lib_ignore = OneWire
paulstoffregen/OneWire
build_type = ${secrets.build_type} build_type = ${secrets.build_type}
build_flags = build_flags =
-mtext-section-literals -mtext-section-literals
-2
View File
@@ -135,8 +135,6 @@ protected:
tMqtt->disable(); tMqtt->disable();
} }
Sensors::setConnectionStatusByType(Sensors::Type::MANUAL, !settings.mqtt.enabled || vars.mqtt.connected, false);
} else { } else {
if (this->ntpStarted) { if (this->ntpStarted) {
this->ntpStarted = false; this->ntpStarted = false;
+10 -5
View File
@@ -66,7 +66,8 @@ public:
} }
protected: protected:
const unsigned int disconnectedTimeout = 120000; const unsigned int wiredDisconnectTimeout = 180000u;
const unsigned int wirelessDisconnectTimeout = 600000u;
const unsigned short dallasSearchInterval = 60000; const unsigned short dallasSearchInterval = 60000;
const unsigned short dallasPollingInterval = 10000; const unsigned short dallasPollingInterval = 10000;
const unsigned short globalPollingInterval = 15000; const unsigned short globalPollingInterval = 15000;
@@ -1004,12 +1005,16 @@ protected:
} else if (rSensor.connected && sSensor.purpose == Sensors::Purpose::NOT_CONFIGURED) { } else if (rSensor.connected && sSensor.purpose == Sensors::Purpose::NOT_CONFIGURED) {
Sensors::setConnectionStatusById(sensorId, false, false); Sensors::setConnectionStatusById(sensorId, false, false);
} else if (sSensor.type != Sensors::Type::MANUAL && rSensor.connected && (millis() - rSensor.activityTime) > this->disconnectedTimeout) { } else if (rSensor.connected) {
if (sSensor.type == Sensors::Type::MANUAL || sSensor.type == Sensors::Type::BLUETOOTH) {
if ((millis() - rSensor.activityTime) > this->wirelessDisconnectTimeout) {
Sensors::setConnectionStatusById(sensorId, false, false); Sensors::setConnectionStatusById(sensorId, false, false);
}
}/* else if (!rSensor.connected) { } else if ((millis() - rSensor.activityTime) > this->wiredDisconnectTimeout) {
rSensor.connected = true; Sensors::setConnectionStatusById(sensorId, false, false);
}*/ }
}
} }
} }
+8 -11
View File
@@ -2109,21 +2109,18 @@ bool jsonToSensorResult(const uint8_t sensorId, const JsonVariantConst src) {
return false; return false;
} }
auto& dst = Sensors::results[sensorId];
bool changed = false;
// value // value
if (!src[FPSTR(S_VALUE)].isNull()) { if (!src[FPSTR(S_VALUE)].isNull()) {
float value = src[FPSTR(S_VALUE)].as<float>(); return Sensors::setValueById(
sensorId,
uint8_t vType = static_cast<uint8_t>(Sensors::ValueType::PRIMARY); src[FPSTR(S_VALUE)].as<float>(),
if (fabsf(value - dst.values[vType]) > 0.0001f) { Sensors::ValueType::PRIMARY,
dst.values[vType] = roundf(value, 2); true,
changed = true; true
} );
} }
return changed; return false;
} }
void varsToJson(const Variables& src, JsonVariant dst) { void varsToJson(const Variables& src, JsonVariant dst) {
+1 -1
View File
@@ -320,7 +320,7 @@
document.addEventListener('DOMContentLoaded', async () => { document.addEventListener('DOMContentLoaded', async () => {
const lang = new Lang(document.getElementById('lang')); const lang = new Lang(document.getElementById('lang'));
lang.build(); await lang.build();
let actionTimer = null; let actionTimer = null;
let actionLongPress = false; let actionLongPress = false;
+1 -1
View File
@@ -169,7 +169,7 @@
<script> <script>
document.addEventListener('DOMContentLoaded', async () => { document.addEventListener('DOMContentLoaded', async () => {
const lang = new Lang(document.getElementById('lang')); const lang = new Lang(document.getElementById('lang'));
lang.build(); await lang.build();
setTimeout(async function onLoadPage() { setTimeout(async function onLoadPage() {
try { try {
+1 -1
View File
@@ -179,7 +179,7 @@
<script> <script>
document.addEventListener('DOMContentLoaded', async () => { document.addEventListener('DOMContentLoaded', async () => {
const lang = new Lang(document.getElementById('lang')); const lang = new Lang(document.getElementById('lang'));
lang.build(); await lang.build();
const fillData = (data) => { const fillData = (data) => {
setInputValue("[name='hostname']", data.hostname); setInputValue("[name='hostname']", data.hostname);
+1 -1
View File
@@ -201,7 +201,7 @@
<script> <script>
document.addEventListener("DOMContentLoaded", async () => { document.addEventListener("DOMContentLoaded", async () => {
const lang = new Lang(document.getElementById("lang")); const lang = new Lang(document.getElementById("lang"));
lang.build(); await lang.build();
const container = document.querySelector("article"); const container = document.querySelector("article");
const templateNode = container.querySelector("#template"); const templateNode = container.querySelector("#template");
+1 -1
View File
@@ -925,7 +925,7 @@
<script> <script>
document.addEventListener('DOMContentLoaded', async () => { document.addEventListener('DOMContentLoaded', async () => {
const lang = new Lang(document.getElementById('lang')); const lang = new Lang(document.getElementById('lang'));
lang.build(); await lang.build();
let etChart = null; let etChart = null;
let etChartConfig = { let etChartConfig = {
+1 -1
View File
@@ -105,7 +105,7 @@
<script> <script>
document.addEventListener('DOMContentLoaded', async () => { document.addEventListener('DOMContentLoaded', async () => {
const lang = new Lang(document.getElementById('lang')); const lang = new Lang(document.getElementById('lang'));
lang.build(); await lang.build();
setupRestoreBackupForm('#restore'); setupRestoreBackupForm('#restore');
setupUpgradeForm('#upgrade'); setupUpgradeForm('#upgrade');