diff --git a/interface/src/app/main/OptionIcon.tsx b/interface/src/app/main/OptionIcon.tsx index 9cb094e19..6b9fa5bc1 100644 --- a/interface/src/app/main/OptionIcon.tsx +++ b/interface/src/app/main/OptionIcon.tsx @@ -13,11 +13,7 @@ import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; import type { SvgIconProps } from '@mui/material'; export type OptionType = - | 'deleted' - | 'readonly' - | 'web_exclude' - | 'api_mqtt_exclude' - | 'favorite'; + 'deleted' | 'readonly' | 'web_exclude' | 'api_mqtt_exclude' | 'favorite'; type IconPair = [ React.ComponentType, diff --git a/interface/src/app/settings/NTPSettings.tsx b/interface/src/app/settings/NTPSettings.tsx index 7fc947b7b..d6e0ea275 100644 --- a/interface/src/app/settings/NTPSettings.tsx +++ b/interface/src/app/settings/NTPSettings.tsx @@ -8,11 +8,11 @@ import { Box, Button, Checkbox, - Grid, Dialog, DialogActions, DialogContent, DialogTitle, + Grid, MenuItem, TextField, Typography @@ -40,7 +40,12 @@ import { formatLocalDateTime, updateValueDirty, useRest } from 'utils'; import { ValidationError, validate } from 'validators'; import { NTP_SETTINGS_VALIDATOR } from 'validators/ntp'; -import { TIME_ZONES, selectedTimeZone, useTimeZoneSelectItems, timeZoneSelectItemsT } from './TZ'; +import { + TIME_ZONES, + selectedTimeZone, + timeZoneSelectItemsT, + useTimeZoneSelectItems +} from './TZ'; const NTPSettings = () => { const { @@ -225,9 +230,11 @@ const NTPSettings = () => { select > {LL.OFF()} - {LL.ON()} - {LL.USE()} {LL.TIME_ZONE()} - + {LL.ON()} + + {LL.USE()} {LL.TIME_ZONE()} + + {data.thermostat_sync === 2 && ( diff --git a/mock-api/package.json b/mock-api/package.json index 2c65bf4e7..b0251231e 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -12,8 +12,8 @@ "@msgpack/msgpack": "^3.1.3", "@trivago/prettier-plugin-sort-imports": "^6.0.2", "formidable": "^3.5.4", - "itty-router": "^5.0.23", - "prettier": "^3.8.3" + "itty-router": "^5.0.24", + "prettier": "^3.9.6" }, "packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800" } diff --git a/mock-api/pnpm-lock.yaml b/mock-api/pnpm-lock.yaml index 1ddedb1b1..de078b2b3 100644 --- a/mock-api/pnpm-lock.yaml +++ b/mock-api/pnpm-lock.yaml @@ -13,54 +13,54 @@ importers: version: 3.1.3 '@trivago/prettier-plugin-sort-imports': specifier: ^6.0.2 - version: 6.0.2(prettier@3.8.3) + version: 6.0.2(prettier@3.9.6) formidable: specifier: ^3.5.4 version: 3.5.4 itty-router: - specifier: ^5.0.23 - version: 5.0.23 + specifier: ^5.0.24 + version: 5.0.24 prettier: - specifier: ^3.8.3 - version: 3.8.3 + specifier: ^3.9.6 + version: 3.9.6 packages: - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.3': - resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} '@jridgewell/gen-mapping@0.3.13': @@ -112,8 +112,8 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - brace-expansion@2.1.0: - resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -131,8 +131,8 @@ packages: resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} engines: {node: '>=14.0.0'} - itty-router@5.0.23: - resolution: {integrity: sha512-i49WU+SNPrwOZA4Z61En1RYd5h2Lcqa+5IvCpMrNi4dxymzJK15ozUUnRrWIUAv95Zamd4eJPAot2UvHRrQg7w==} + itty-router@5.0.24: + resolution: {integrity: sha512-PXij1qGKtE6jg3dLgrTRdh/Frovl5Wc4Av67sD2xfhDPrgNt4u79++/il8/c/OfZGkhD/8uYJub8tjo+H165rA==} javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} @@ -167,8 +167,8 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - prettier@3.8.3: - resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true @@ -177,52 +177,52 @@ packages: snapshots: - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.29.1': + '@babel/generator@7.29.8': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.29.3': + '@babel/parser@7.29.8': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.8 - '@babel/template@7.28.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.8': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': + '@babel/types@7.29.8': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -246,17 +246,17 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 - '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3)': + '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.9.6)': dependencies: - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.3 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.8 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 javascript-natural-sort: 0.7.1 lodash-es: 4.18.1 minimatch: 9.0.9 parse-imports-exports: 0.2.4 - prettier: 3.8.3 + prettier: 3.9.6 transitivePeerDependencies: - supports-color @@ -264,7 +264,7 @@ snapshots: balanced-match@1.0.2: {} - brace-expansion@2.1.0: + brace-expansion@2.1.4: dependencies: balanced-match: 1.0.2 @@ -283,7 +283,7 @@ snapshots: dezalgo: 1.0.4 once: 1.4.0 - itty-router@5.0.23: {} + itty-router@5.0.24: {} javascript-natural-sort@0.7.1: {} @@ -295,7 +295,7 @@ snapshots: minimatch@9.0.9: dependencies: - brace-expansion: 2.1.0 + brace-expansion: 2.1.4 ms@2.1.3: {} @@ -311,6 +311,6 @@ snapshots: picocolors@1.1.1: {} - prettier@3.8.3: {} + prettier@3.9.6: {} wrappy@1.0.2: {} diff --git a/mock-api/restServer.ts b/mock-api/restServer.ts index 355d4ae9b..446d05bfd 100644 --- a/mock-api/restServer.ts +++ b/mock-api/restServer.ts @@ -141,8 +141,8 @@ let system_status = { let DEV_VERSION_IS_UPGRADEABLE: boolean; let STABLE_VERSION_IS_UPGRADEABLE: boolean; let THIS_VERSION: string; -let LATEST_STABLE_VERSION = '3.8.2'; -let LATEST_DEV_VERSION = '3.8.3-dev.2'; +let LATEST_STABLE_VERSION = '3.8.3'; +let LATEST_DEV_VERSION = '3.9.0-dev.0'; // scenarios for testing versioning let version_test = 0; // on latest stable, or switch to dev diff --git a/scripts/update_all.sh b/scripts/update_all.sh index 283e892c5..45a725f41 100644 --- a/scripts/update_all.sh +++ b/scripts/update_all.sh @@ -3,28 +3,34 @@ # run from root folder, like `sh ./scripts/update_all.sh` # as well as GNUMake (make) and python3 +# abort on first error so a failed lint/build isn't silently swallowed +set -e + cd interface rm -rf node_modules -corepack use pnpm@latest-10 -pnpm update --latest +corepack use pnpm@latest +pnpm update pnpm install pnpm format pnpm lint +pnpm build-webUI cd ../mock-api rm -rf node_modules -corepack use pnpm@latest-10 -pnpm update --latest +corepack use pnpm@latest +pnpm update pnpm install pnpm format -cd .. -cd interface -pnpm build-webUI - cd .. npx cspell "**" -# platformio run -e build_modbus -# platformio run -e build_standalone -# platformio run -e native-test -t exec +# build files that go into docs folder + +platformio run -e build_modbus -t clean +platformio run -e build_modbus +platformio run -e build_standalone -t clean +platformio run -e build_standalone + +# run tests +platformio run -e native-test -t exec diff --git a/src/ESP32React/WiFiScanner.cpp b/src/ESP32React/WiFiScanner.cpp index 425992f98..743637faa 100644 --- a/src/ESP32React/WiFiScanner.cpp +++ b/src/ESP32React/WiFiScanner.cpp @@ -38,8 +38,8 @@ void WiFiScanner::listNetworks(AsyncWebServerRequest * request) { } else if (numNetworks == -1) { request->send(202); // special code to indicate scan in progress } else { - auto * response = new AsyncJsonResponse(false); - JsonObject root = response->getRoot(); + auto * response = new AsyncJsonResponse(false); + JsonObject root = response->getRoot(); root["networks"].to(); response->setLength(); request->send(response); diff --git a/src/core/roomcontrol.h b/src/core/roomcontrol.h index 765982135..741c3678d 100644 --- a/src/core/roomcontrol.h +++ b/src/core/roomcontrol.h @@ -34,7 +34,7 @@ class Roomctrl { static bool is_remote(const uint8_t hc) { return (hc < 4 && remotetemp_[hc] != EMS_VALUE_INT16_NOTSET); } - static void set_timeout(uint8_t t); + static void set_timeout(uint8_t t); private: static constexpr uint32_t SEND_INTERVAL = 15000; // 15 sec diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index e48f67a1a..f3c7a316f 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -304,7 +304,7 @@ class Thermostat : public EMSdevice { uint8_t instantstart; uint8_t coolstart; uint8_t coolondelay; - uint8_t cooloffdelay; + uint8_t cooloffdelay; // HybridHP uint8_t hybridStrategy_; // co2 = 1, cost = 2, temperature = 3, mix = 4 diff --git a/src/devices/water.cpp b/src/devices/water.cpp index 131aaf826..8a963fa02 100644 --- a/src/devices/water.cpp +++ b/src/devices/water.cpp @@ -362,7 +362,8 @@ bool Water::set_wwCircTc(const char * value, const int8_t id) { write_command(0x33B + dhw_, 4, b ? 0x01 : 0x00, 0x33B + dhw_); } else { // SM100 write_command(0x7A5, 4, b ? 0xFF : 0x00, 0x7A5); - } return true; + } + return true; } bool Water::set_wwKeepWarm(const char * value, const int8_t id) { diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 110b4c43a..662177bb2 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.3-dev.10" +#define EMSESP_APP_VERSION "3.8.3-dev.11" diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index d18d5d8de..f632754fe 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -348,8 +348,8 @@ uint8_t WebSchedulerService::count_entities(bool cmd_only) { bool WebSchedulerService::command(const char * name, const std::string & command, const std::string & data) { std::string cmd = Helpers::toLower(command); if (cmd == "system/message") { - EMSESP::logger().info("Message: %s", data.c_str()); // send to log - Mqtt::queue_publish(F_(message), data); // send to MQTT if enabled + EMSESP::logger().info("Message: %s", data.c_str()); // send to log + Mqtt::queue_publish(F_(message), data); // send to MQTT if enabled return true; } // check http commands. e.g.