mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
Compare commits
18 Commits
43f61fd2df
...
ea484e15f9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ea484e15f9 | ||
|
|
cce99a8b1d | ||
|
|
f29faafd78 | ||
|
|
c3eafbcd85 | ||
|
|
65e18ab4e2 | ||
|
|
8bb16ed3a7 | ||
|
|
e685284f72 | ||
|
|
86d2805642 | ||
|
|
29b98a15a4 | ||
|
|
ba9df92b12 | ||
|
|
0eac1c9bf9 | ||
|
|
515feb9f9e | ||
|
|
0b84b79e1d | ||
|
|
ba334930fe | ||
|
|
982d64ddca | ||
|
|
3577300361 | ||
|
|
0478e0ff7c | ||
|
|
c2cfd0a1b0 |
58
.github/workflows/dev_release.yml
vendored
58
.github/workflows/dev_release.yml
vendored
@@ -18,17 +18,17 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Install python 3.13
|
- name: Install python 3.13
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: '3.13'
|
python-version: '3.13'
|
||||||
|
|
||||||
- name: Install Node.js 22
|
- name: Install Node.js 24
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Enable Corepack
|
- name: Enable Corepack
|
||||||
run: corepack enable pnpm
|
run: corepack enable pnpm
|
||||||
@@ -45,20 +45,48 @@ jobs:
|
|||||||
pip install -U platformio
|
pip install -U platformio
|
||||||
python -m pip install intelhex
|
python -m pip install intelhex
|
||||||
|
|
||||||
- name: Build the WebUI
|
- name: Build webUI
|
||||||
run: |
|
run: |
|
||||||
cd interface
|
platformio run -e build_webUI
|
||||||
pnpm install
|
|
||||||
pnpm typesafe-i18n --no-watch
|
|
||||||
sed -i "s/= 'pl'/= 'en'/" ./src/i18n/i18n-util.ts
|
|
||||||
pnpm build
|
|
||||||
pnpm webUI
|
|
||||||
|
|
||||||
- name: Build all PIO target environments
|
- name: Build modbus
|
||||||
|
run: |
|
||||||
|
platformio run -e build_modbus
|
||||||
|
|
||||||
|
- name: Build standalone
|
||||||
|
run: |
|
||||||
|
platformio run -e build_standalone
|
||||||
|
|
||||||
|
- name: Build all PIO target environments, from default_envs
|
||||||
run: |
|
run: |
|
||||||
platformio run
|
platformio run
|
||||||
env:
|
|
||||||
NO_BUILD_WEBUI: true
|
- name: Commit the generated files
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@v5
|
||||||
|
with:
|
||||||
|
commit_message: "chore: update generated files"
|
||||||
|
|
||||||
|
- name: Configure Git
|
||||||
|
run: |
|
||||||
|
git config --local user.email "action@github.com"
|
||||||
|
git config --local user.name "GitHub Action"
|
||||||
|
|
||||||
|
- name: Check for changes and commit
|
||||||
|
run: |
|
||||||
|
if [ -n "$(git status --porcelain)" ]; then
|
||||||
|
echo "Changes detected, committing..."
|
||||||
|
git add .
|
||||||
|
git commit -m "Auto-commit build artifacts and configuration updates
|
||||||
|
|
||||||
|
- Updated build configurations
|
||||||
|
- Generated build artifacts
|
||||||
|
- Version: ${{steps.build_info.outputs.VERSION}}"
|
||||||
|
|
||||||
|
echo "Pushing changes to repository..."
|
||||||
|
git push origin dev
|
||||||
|
else
|
||||||
|
echo "No changes to commit"
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Create GitHub Release
|
- name: Create GitHub Release
|
||||||
id: 'automatic_releases'
|
id: 'automatic_releases'
|
||||||
|
|||||||
8
.github/workflows/pr_check.yml
vendored
8
.github/workflows/pr_check.yml
vendored
@@ -20,12 +20,12 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Install python 3.11
|
- name: Install python 3.13
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: '3.11'
|
python-version: '3.13'
|
||||||
|
|
||||||
- name: Install PlatformIO
|
- name: Install PlatformIO
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
2
.github/workflows/sonar_check.yml
vendored
2
.github/workflows/sonar_check.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
BUILD_WRAPPER_OUT_DIR: bw-output
|
BUILD_WRAPPER_OUT_DIR: bw-output
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Install Build Wrapper
|
- name: Install Build Wrapper
|
||||||
|
|||||||
31
.github/workflows/stable_release.yml
vendored
31
.github/workflows/stable_release.yml
vendored
@@ -16,17 +16,17 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Install python 3.13
|
- name: Install python 3.13
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: '3.13'
|
python-version: '3.13'
|
||||||
|
|
||||||
- name: Install Node.js 22
|
- name: Install Node.js 24
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Enable Corepack
|
- name: Enable Corepack
|
||||||
run: corepack enable pnpm
|
run: corepack enable pnpm
|
||||||
@@ -37,20 +37,21 @@ jobs:
|
|||||||
pip install -U platformio
|
pip install -U platformio
|
||||||
python -m pip install intelhex
|
python -m pip install intelhex
|
||||||
|
|
||||||
- name: Build the WebUI
|
- name: Build webUI
|
||||||
run: |
|
run: |
|
||||||
cd interface
|
platformio run -e build_webUI
|
||||||
pnpm install
|
|
||||||
pnpm typesafe-i18n --no-watch
|
|
||||||
sed -i "s/= 'pl'/= 'en'/" ./src/i18n/i18n-util.ts
|
|
||||||
pnpm build
|
|
||||||
pnpm webUI
|
|
||||||
|
|
||||||
- name: Build all PIO target environments
|
- name: Build modbus
|
||||||
|
run: |
|
||||||
|
platformio run -e build_modbus
|
||||||
|
|
||||||
|
- name: Build standalone
|
||||||
|
run: |
|
||||||
|
platformio run -e build_standalone
|
||||||
|
|
||||||
|
- name: Build all PIO target environments, from default_envs
|
||||||
run: |
|
run: |
|
||||||
platformio run
|
platformio run
|
||||||
env:
|
|
||||||
NO_BUILD_WEBUI: true
|
|
||||||
|
|
||||||
- name: Create GitHub Release
|
- name: Create GitHub Release
|
||||||
uses: emsesp/action-automatic-releases@v1.0.0
|
uses: emsesp/action-automatic-releases@v1.0.0
|
||||||
|
|||||||
6
.github/workflows/stale_issues.yml
vendored
6
.github/workflows/stale_issues.yml
vendored
@@ -1,4 +1,8 @@
|
|||||||
name: "Mark or close stale issues and PRs"
|
name: "Mark or close stale issues and PRs"
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
@@ -8,7 +12,7 @@ jobs:
|
|||||||
stale:
|
stale:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v10
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
days-before-stale: 30
|
days-before-stale: 30
|
||||||
|
|||||||
33
.github/workflows/test_release.yml
vendored
33
.github/workflows/test_release.yml
vendored
@@ -4,7 +4,7 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- 'dev2'
|
- 'test'
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -18,17 +18,17 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Install python 3.13
|
- name: Install python 3.13
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: '3.13'
|
python-version: '3.13'
|
||||||
|
|
||||||
- name: Install Node.js 22
|
- name: Install Node.js 24
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Enable Corepack
|
- name: Enable Corepack
|
||||||
run: corepack enable pnpm
|
run: corepack enable pnpm
|
||||||
@@ -45,20 +45,21 @@ jobs:
|
|||||||
pip install -U platformio
|
pip install -U platformio
|
||||||
python -m pip install intelhex
|
python -m pip install intelhex
|
||||||
|
|
||||||
- name: Build the WebUI
|
- name: Build webUI
|
||||||
run: |
|
run: |
|
||||||
cd interface
|
platformio run -e build_webUI
|
||||||
pnpm install
|
|
||||||
pnpm typesafe-i18n --no-watch
|
|
||||||
sed -i "s/= 'pl'/= 'en'/" ./src/i18n/i18n-util.ts
|
|
||||||
pnpm build
|
|
||||||
pnpm webUI
|
|
||||||
|
|
||||||
- name: Build all target environments
|
- name: Build modbus
|
||||||
|
run: |
|
||||||
|
platformio run -e build_modbus
|
||||||
|
|
||||||
|
- name: Build standalone
|
||||||
|
run: |
|
||||||
|
platformio run -e build_standalone
|
||||||
|
|
||||||
|
- name: Build all PIO target environments, from default_envs
|
||||||
run: |
|
run: |
|
||||||
platformio run
|
platformio run
|
||||||
env:
|
|
||||||
NO_BUILD_WEBUI: true
|
|
||||||
|
|
||||||
- name: Create GitHub Release
|
- name: Create GitHub Release
|
||||||
id: 'automatic_releases'
|
id: 'automatic_releases'
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -72,3 +72,5 @@ CMakeLists.txt
|
|||||||
logs/*
|
logs/*
|
||||||
sdkconfig.*
|
sdkconfig.*
|
||||||
sdkconfig_tasmota_esp32
|
sdkconfig_tasmota_esp32
|
||||||
|
pnpm-lock.yaml
|
||||||
|
package.json
|
||||||
|
|||||||
11566
docs/dump_entities.csv
11566
docs/dump_entities.csv
File diff suppressed because it is too large
Load Diff
@@ -1,231 +1,231 @@
|
|||||||
telegram_type_id,name,is_fetched
|
telegram_type_id,name,is_fetched
|
||||||
0x04,UBAFactory,fetched
|
0x04,UBAFactory,fetched
|
||||||
0x06,RCTime,
|
0x06,RCTime,
|
||||||
0x0A,EasyMonitor,fetched
|
0x0A,EasyMonitor,fetched
|
||||||
0x10,UBAErrorMessage1,
|
0x10,UBAErrorMessage1,
|
||||||
0x11,UBAErrorMessage2,
|
0x11,UBAErrorMessage2,
|
||||||
0x12,RCErrorMessage,
|
0x12,RCErrorMessage,
|
||||||
0x13,RCErrorMessage2,
|
0x13,RCErrorMessage2,
|
||||||
0x14,UBATotalUptime,fetched
|
0x14,UBATotalUptime,fetched
|
||||||
0x15,UBAMaintenanceData,
|
0x15,UBAMaintenanceData,
|
||||||
0x16,UBAParameters,fetched
|
0x16,UBAParameters,fetched
|
||||||
0x18,UBAMonitorFast,
|
0x18,UBAMonitorFast,
|
||||||
0x19,UBAMonitorSlow,
|
0x19,UBAMonitorSlow,
|
||||||
0x1A,UBASetPoints,
|
0x1A,UBASetPoints,
|
||||||
0x1C,UBAMaintenanceStatus,
|
0x1C,UBAMaintenanceStatus,
|
||||||
0x1E,HydrTemp,
|
0x1E,HydrTemp,
|
||||||
0x23,JunkersSetMixer,fetched
|
0x23,JunkersSetMixer,fetched
|
||||||
0x27,UBASettingsWW,fetched
|
0x27,UBASettingsWW,fetched
|
||||||
0x28,WeatherComp,fetched
|
0x28,WeatherComp,fetched
|
||||||
0x2A,MC110Status,
|
0x2A,MC110Status,
|
||||||
0x2E,Meters,
|
0x2E,Meters,
|
||||||
0x33,UBAParameterWW,fetched
|
0x33,UBAParameterWW,fetched
|
||||||
0x34,UBAMonitorWW,
|
0x34,UBAMonitorWW,
|
||||||
0x35,UBAFlags,
|
0x35,UBAFlags,
|
||||||
0x37,WWSettings,fetched
|
0x37,WWSettings,fetched
|
||||||
0x38,WWTimer,fetched
|
0x38,WWTimer,fetched
|
||||||
0x39,WWCircTimer,fetched
|
0x39,WWCircTimer,fetched
|
||||||
0x3A,RC30WWSettings,fetched
|
0x3A,RC30WWSettings,fetched
|
||||||
0x3B,Energy,
|
0x3B,Energy,
|
||||||
0x3D,RC35Set,
|
0x3D,RC35Set,
|
||||||
0x3E,RC35Monitor,
|
0x3E,RC35Monitor,
|
||||||
0x3F,RC35Timer,
|
0x3F,RC35Timer,
|
||||||
0x40,RC30Temp,
|
0x40,RC30Temp,
|
||||||
0x41,RC30Monitor,
|
0x41,RC30Monitor,
|
||||||
0x42,RC35Timer2,
|
0x42,RC35Timer2,
|
||||||
0x47,RC35Set,
|
0x47,RC35Set,
|
||||||
0x48,RC35Monitor,
|
0x48,RC35Monitor,
|
||||||
0x49,RC35Timer,
|
0x49,RC35Timer,
|
||||||
0x4C,RC35Timer2,
|
0x4C,RC35Timer2,
|
||||||
0x51,RC35Set,
|
0x51,RC35Set,
|
||||||
0x52,RC35Monitor,
|
0x52,RC35Monitor,
|
||||||
0x53,RC35Timer,
|
0x53,RC35Timer,
|
||||||
0x56,RC35Timer2,
|
0x56,RC35Timer2,
|
||||||
0x5B,RC35Set,
|
0x5B,RC35Set,
|
||||||
0x5C,RC35Monitor,
|
0x5C,RC35Monitor,
|
||||||
0x5D,RC35Timer,
|
0x5D,RC35Timer,
|
||||||
0x60,RC35Timer2,
|
0x60,RC35Timer2,
|
||||||
0x96,SM10Config,fetched
|
0x96,SM10Config,fetched
|
||||||
0x97,SM10Monitor,
|
0x97,SM10Monitor,
|
||||||
0x9C,WM10MonitorMessage,
|
0x9C,WM10MonitorMessage,
|
||||||
0x9D,WM10SetMessage,
|
0x9D,WM10SetMessage,
|
||||||
0xA2,RCError,
|
0xA2,RCError,
|
||||||
0xA3,RCOutdoorTemp,
|
0xA3,RCOutdoorTemp,
|
||||||
0xA5,IBASettings,fetched
|
0xA5,IBASettings,fetched
|
||||||
0xA7,RC30Set,
|
0xA7,RC30Set,
|
||||||
0xA9,RC30Vacation,fetched
|
0xA9,RC30Vacation,fetched
|
||||||
0xAA,MMConfigMessage,fetched
|
0xAA,MMConfigMessage,fetched
|
||||||
0xAB,MMStatusMessage,
|
0xAB,MMStatusMessage,
|
||||||
0xAC,MMSetMessage,
|
0xAC,MMSetMessage,
|
||||||
0xAF,RC20Remote,
|
0xAF,RC20Remote,
|
||||||
0xB0,RC10Set,
|
0xB0,RC10Set,
|
||||||
0xB1,RC10Monitor,
|
0xB1,RC10Monitor,
|
||||||
0xBB,HybridSettings,fetched
|
0xBB,HybridSettings,fetched
|
||||||
0xBF,ErrorMessage,
|
0xBF,ErrorMessage,
|
||||||
0xC0,RCErrorMessage,
|
0xC0,RCErrorMessage,
|
||||||
0xC2,UBAErrorMessage3,
|
0xC2,UBAErrorMessage3,
|
||||||
0xC6,UBAErrorMessage3,
|
0xC6,UBAErrorMessage3,
|
||||||
0xD1,UBAOutdoorTemp,
|
0xD1,UBAOutdoorTemp,
|
||||||
0xE3,UBAMonitorSlowPlus2,
|
0xE3,UBAMonitorSlowPlus2,
|
||||||
0xE4,UBAMonitorFastPlus,
|
0xE4,UBAMonitorFastPlus,
|
||||||
0xE5,UBAMonitorSlowPlus,
|
0xE5,UBAMonitorSlowPlus,
|
||||||
0xE6,UBAParametersPlus,fetched
|
0xE6,UBAParametersPlus,fetched
|
||||||
0xE9,UBAMonitorWWPlus,
|
0xE9,UBAMonitorWWPlus,
|
||||||
0xEA,UBAParameterWWPlus,fetched
|
0xEA,UBAParameterWWPlus,fetched
|
||||||
0x0101,ISM1Set,fetched
|
0x0101,ISM1Set,fetched
|
||||||
0x0103,ISM1StatusMessage,fetched
|
0x0103,ISM1StatusMessage,fetched
|
||||||
0x0104,ISM2StatusMessage,
|
0x0104,ISM2StatusMessage,
|
||||||
0x010C,IPMStatusMessage,
|
0x010C,IPMStatusMessage,
|
||||||
0x011E,JunkersDisp,fetched
|
0x011E,JunkersDisp,fetched
|
||||||
0x012E,HPEnergy1,
|
0x012E,HPEnergy1,
|
||||||
0x013B,HPEnergy2,
|
0x013B,HPEnergy2,
|
||||||
0x0165,JunkersSet,
|
0x0165,JunkersSet,
|
||||||
0x0166,JunkersSet,
|
0x0166,JunkersSet,
|
||||||
0x0167,JunkersSet,
|
0x0167,JunkersSet,
|
||||||
0x0168,JunkersSet,
|
0x0168,JunkersSet,
|
||||||
0x016E,Absent,fetched
|
0x016E,Absent,fetched
|
||||||
0x016F,JunkersMonitor,
|
0x016F,JunkersMonitor,
|
||||||
0x0170,JunkersMonitor,
|
0x0170,JunkersMonitor,
|
||||||
0x0171,JunkersMonitor,
|
0x0171,JunkersMonitor,
|
||||||
0x0172,JunkersMonitor,
|
0x0172,JunkersMonitor,
|
||||||
0x0179,JunkersSet,
|
0x0179,JunkersSet,
|
||||||
0x017A,JunkersSet,
|
0x017A,JunkersSet,
|
||||||
0x017B,JunkersSet,
|
0x017B,JunkersSet,
|
||||||
0x017C,JunkersSet,
|
0x017C,JunkersSet,
|
||||||
0x01D3,JunkersDhw,fetched
|
0x01D3,JunkersDhw,fetched
|
||||||
0x023A,RC300OutdoorTemp,fetched
|
0x023A,RC300OutdoorTemp,fetched
|
||||||
0x023E,PVSettings,fetched
|
0x023E,PVSettings,fetched
|
||||||
0x0240,RC300Settings,fetched
|
0x0240,RC300Settings,fetched
|
||||||
0x0241,RC300Settings,fetched
|
0x0241,RC300Settings,fetched
|
||||||
0x0267,RC300Floordry,
|
0x0267,RC300Floordry,
|
||||||
0x0269,RC300Holiday,fetched
|
0x0269,RC300Holiday,fetched
|
||||||
0x0291,HPMode,fetched
|
0x0291,HPMode,fetched
|
||||||
0x0292,HPMode,fetched
|
0x0292,HPMode,fetched
|
||||||
0x0293,HPMode,fetched
|
0x0293,HPMode,fetched
|
||||||
0x0294,HPMode,fetched
|
0x0294,HPMode,fetched
|
||||||
0x029B,RC300Curves,
|
0x029B,RC300Curves,
|
||||||
0x029C,RC300Curves,
|
0x029C,RC300Curves,
|
||||||
0x029D,RC300Curves,
|
0x029D,RC300Curves,
|
||||||
0x029E,RC300Curves,
|
0x029E,RC300Curves,
|
||||||
0x029F,RC300Curves,
|
0x029F,RC300Curves,
|
||||||
0x02A0,RC300Curves,
|
0x02A0,RC300Curves,
|
||||||
0x02A1,RC300Curves,
|
0x02A1,RC300Curves,
|
||||||
0x02A2,RC300Curves,
|
0x02A2,RC300Curves,
|
||||||
0x02A5,RC300Monitor,
|
0x02A5,RC300Monitor,
|
||||||
0x02A6,RC300Monitor,
|
0x02A6,RC300Monitor,
|
||||||
0x02A7,RC300Monitor,
|
0x02A7,RC300Monitor,
|
||||||
0x02A8,RC300Monitor,
|
0x02A8,RC300Monitor,
|
||||||
0x02A9,RC300Monitor,
|
0x02A9,RC300Monitor,
|
||||||
0x02AA,RC300Monitor,
|
0x02AA,RC300Monitor,
|
||||||
0x02AB,RC300Monitor,
|
0x02AB,RC300Monitor,
|
||||||
0x02AC,RC300Monitor,
|
0x02AC,RC300Monitor,
|
||||||
0x02AF,RC300Summer,
|
0x02AF,RC300Summer,
|
||||||
0x02B0,RC300Summer,
|
0x02B0,RC300Summer,
|
||||||
0x02B1,RC300Summer,
|
0x02B1,RC300Summer,
|
||||||
0x02B2,RC300Summer,
|
0x02B2,RC300Summer,
|
||||||
0x02B3,RC300Summer,
|
0x02B3,RC300Summer,
|
||||||
0x02B4,RC300Summer,
|
0x02B4,RC300Summer,
|
||||||
0x02B5,RC300Summer,
|
0x02B5,RC300Summer,
|
||||||
0x02B6,RC300Summer,
|
0x02B6,RC300Summer,
|
||||||
0x02B9,RC300Set,
|
0x02B9,RC300Set,
|
||||||
0x02BA,RC300Set,
|
0x02BA,RC300Set,
|
||||||
0x02BB,RC300Set,
|
0x02BB,RC300Set,
|
||||||
0x02BC,RC300Set,
|
0x02BC,RC300Set,
|
||||||
0x02BD,RC300Set,
|
0x02BD,RC300Set,
|
||||||
0x02BE,RC300Set,
|
0x02BE,RC300Set,
|
||||||
0x02BF,RC300Set,
|
0x02BF,RC300Set,
|
||||||
0x02C0,RC300Set,
|
0x02C0,RC300Set,
|
||||||
0x02CC,HPPressure,fetched
|
0x02CC,HPPressure,fetched
|
||||||
0x02CD,MMPLUSConfigMessage,fetched
|
0x02CD,MMPLUSConfigMessage,fetched
|
||||||
0x02CE,RC300Set2,
|
0x02CE,RC300Set2,
|
||||||
0x02D0,RC300Set2,
|
0x02D0,RC300Set2,
|
||||||
0x02D2,RC300Set2,
|
0x02D2,RC300Set2,
|
||||||
0x02D6,HPPump2,fetched
|
0x02D6,HPPump2,fetched
|
||||||
0x02D7,MMPLUSStatusMessage,
|
0x02D7,MMPLUSStatusMessage,
|
||||||
0x02E0,UBASetPoints,
|
0x02E0,UBASetPoints,
|
||||||
0x02F5,RC300WWmode,fetched
|
0x02F5,RC300WWmode,fetched
|
||||||
0x02F6,RC300WW2mode,fetched
|
0x02F6,RC300WW2mode,fetched
|
||||||
0x0313,MMPLUSConfigMessage_WWC,fetched
|
0x0313,MMPLUSConfigMessage_WWC,fetched
|
||||||
0x031B,RC300WWtemp,fetched
|
0x031B,RC300WWtemp,fetched
|
||||||
0x031D,RC300WWmode2,
|
0x031D,RC300WWmode2,
|
||||||
0x031E,RC300WWmode2,
|
0x031E,RC300WWmode2,
|
||||||
0x0331,MMPLUSStatusMessage_WWC,
|
0x0331,MMPLUSStatusMessage_WWC,
|
||||||
0x0358,SM100SystemConfig,fetched
|
0x0358,SM100SystemConfig,fetched
|
||||||
0x035A,SM100CircuitConfig,fetched
|
0x035A,SM100CircuitConfig,fetched
|
||||||
0x035C,SM100HeatAssist,fetched
|
0x035C,SM100HeatAssist,fetched
|
||||||
0x035D,SM100Circuit2Config,fetched
|
0x035D,SM100Circuit2Config,fetched
|
||||||
0x035F,SM100Config1,fetched
|
0x035F,SM100Config1,fetched
|
||||||
0x0361,SM100Differential,fetched
|
0x0361,SM100Differential,fetched
|
||||||
0x0362,SM100Monitor,
|
0x0362,SM100Monitor,
|
||||||
0x0363,SM100Monitor2,
|
0x0363,SM100Monitor2,
|
||||||
0x0364,SM100Status,
|
0x0364,SM100Status,
|
||||||
0x0366,SM100Config,
|
0x0366,SM100Config,
|
||||||
0x036A,SM100Status2,
|
0x036A,SM100Status2,
|
||||||
0x0380,SM100CollectorConfig,fetched
|
0x0380,SM100CollectorConfig,fetched
|
||||||
0x038E,SM100Energy,fetched
|
0x038E,SM100Energy,fetched
|
||||||
0x0391,SM100Time,fetched
|
0x0391,SM100Time,fetched
|
||||||
0x043F,CRHolidays,fetched
|
0x043F,CRHolidays,fetched
|
||||||
0x0467,HPSet,
|
0x0467,HPSet,
|
||||||
0x0468,HPSet,
|
0x0468,HPSet,
|
||||||
0x0469,HPSet,
|
0x0469,HPSet,
|
||||||
0x046A,HPSet,
|
0x046A,HPSet,
|
||||||
0x0471,RC300Summer2,
|
0x0471,RC300Summer2,
|
||||||
0x0472,RC300Summer2,
|
0x0472,RC300Summer2,
|
||||||
0x0473,RC300Summer2,
|
0x0473,RC300Summer2,
|
||||||
0x0474,RC300Summer2,
|
0x0474,RC300Summer2,
|
||||||
0x0475,RC300Summer2,
|
0x0475,RC300Summer2,
|
||||||
0x0476,RC300Summer2,
|
0x0476,RC300Summer2,
|
||||||
0x0477,RC300Summer2,
|
0x0477,RC300Summer2,
|
||||||
0x0478,RC300Summer2,
|
0x0478,RC300Summer2,
|
||||||
0x047B,HP2,
|
0x047B,HP2,
|
||||||
0x0484,HPSilentMode,fetched
|
0x0484,HPSilentMode,fetched
|
||||||
0x0485,HpCooling,fetched
|
0x0485,HpCooling,fetched
|
||||||
0x0486,HpInConfig,fetched
|
0x0486,HpInConfig,fetched
|
||||||
0x0488,HPValve,fetched
|
0x0488,HPValve,fetched
|
||||||
0x048A,HpPool,fetched
|
0x048A,HpPool,fetched
|
||||||
0x048B,HPPumps,fetched
|
0x048B,HPPumps,fetched
|
||||||
0x048D,HpPower,fetched
|
0x048D,HpPower,fetched
|
||||||
0x048F,HpTemperatures,
|
0x048F,HpTemperatures,
|
||||||
0x0491,HPAdditionalHeater,fetched
|
0x0491,HPAdditionalHeater,fetched
|
||||||
0x0492,HpHeaterConfig,fetched
|
0x0492,HpHeaterConfig,fetched
|
||||||
0x0494,UBAEnergySupplied,
|
0x0494,UBAEnergySupplied,
|
||||||
0x0495,UBAInformation,
|
0x0495,UBAInformation,
|
||||||
0x0499,HPDhwSettings,fetched
|
0x0499,HPDhwSettings,fetched
|
||||||
0x049C,HPSettings2,fetched
|
0x049C,HPSettings2,fetched
|
||||||
0x049D,HPSettings3,fetched
|
0x049D,HPSettings3,fetched
|
||||||
0x04A2,HpInput,fetched
|
0x04A2,HpInput,fetched
|
||||||
0x04A5,HPFan,fetched
|
0x04A5,HPFan,fetched
|
||||||
0x04A7,HPPowerLimit,fetched
|
0x04A7,HPPowerLimit,fetched
|
||||||
0x04AA,HPPower2,fetched
|
0x04AA,HPPower2,fetched
|
||||||
0x04AE,HPEnergy,fetched
|
0x04AE,HPEnergy,fetched
|
||||||
0x04AF,HPMeters,fetched
|
0x04AF,HPMeters,fetched
|
||||||
0x055C,VentilationSet,fetched
|
0x055C,VentilationSet,fetched
|
||||||
0x056B,VentilationMode,fetched
|
0x056B,VentilationMode,fetched
|
||||||
0x0583,VentilationMonitor,
|
0x0583,VentilationMonitor,
|
||||||
0x0585,Blowerspeed,
|
0x0585,Blowerspeed,
|
||||||
0x0587,Bypass,
|
0x0587,Bypass,
|
||||||
0x05BA,HpPoolStatus,fetched
|
0x05BA,HpPoolStatus,fetched
|
||||||
0x05D9,Airquality,
|
0x05D9,Airquality,
|
||||||
0x0772,HIUSettings,
|
0x0772,HIUSettings,
|
||||||
0x0779,HIUMonitor,
|
0x0779,HIUMonitor,
|
||||||
0x07A5,SM100wwCirc,fetched
|
0x07A5,SM100wwCirc,fetched
|
||||||
0x07A6,SM100wwParam,fetched
|
0x07A6,SM100wwParam,fetched
|
||||||
0x07AA,SM100wwStatus,
|
0x07AA,SM100wwStatus,
|
||||||
0x07AB,SM100wwCommand,
|
0x07AB,SM100wwCommand,
|
||||||
0x07AC,SM100wwParam1,
|
0x07AC,SM100wwParam1,
|
||||||
0x07AD,SM100ValveStatus,
|
0x07AD,SM100ValveStatus,
|
||||||
0x07AE,SM100wwKeepWarm,fetched
|
0x07AE,SM100wwKeepWarm,fetched
|
||||||
0x07D6,SM100wwTemperature,
|
0x07D6,SM100wwTemperature,
|
||||||
0x07E0,SM100wwStatus2,fetched
|
0x07E0,SM100wwStatus2,fetched
|
||||||
0x0935,EM100SetMessage,fetched
|
0x0935,EM100SetMessage,fetched
|
||||||
0x0936,EM100OutMessage,
|
0x0936,EM100OutMessage,
|
||||||
0x0937,EM100TempMessage,
|
0x0937,EM100TempMessage,
|
||||||
0x0938,EM100InputMessage,
|
0x0938,EM100InputMessage,
|
||||||
0x0939,EM100MonitorMessage,
|
0x0939,EM100MonitorMessage,
|
||||||
0x093A,EM100ConfigMessage,
|
0x093A,EM100ConfigMessage,
|
||||||
0x0998,HPSettings,fetched
|
0x0998,HPSettings,fetched
|
||||||
0x0999,HPFunctionTest,fetched
|
0x0999,HPFunctionTest,fetched
|
||||||
0x099A,HPStarts,
|
0x099A,HPStarts,
|
||||||
0x099B,HPFlowTemp,
|
0x099B,HPFlowTemp,
|
||||||
0x099C,HPComp,
|
0x099C,HPComp,
|
||||||
0x09A0,HPTemperature,
|
0x09A0,HPTemperature,
|
||||||
|
|||||||
|
@@ -44,7 +44,7 @@
|
|||||||
"typescript": "^5.9.3"
|
"typescript": "^5.9.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.28.4",
|
"@babel/core": "^7.28.5",
|
||||||
"@eslint/js": "^9.38.0",
|
"@eslint/js": "^9.38.0",
|
||||||
"@preact/compat": "^18.3.1",
|
"@preact/compat": "^18.3.1",
|
||||||
"@preact/preset-vite": "^2.10.2",
|
"@preact/preset-vite": "^2.10.2",
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
"rollup-plugin-visualizer": "^6.0.5",
|
"rollup-plugin-visualizer": "^6.0.5",
|
||||||
"terser": "^5.44.0",
|
"terser": "^5.44.0",
|
||||||
"typescript-eslint": "^8.46.2",
|
"typescript-eslint": "^8.46.2",
|
||||||
"vite": "^7.1.11",
|
"vite": "^7.1.12",
|
||||||
"vite-plugin-imagemin": "^0.6.1",
|
"vite-plugin-imagemin": "^0.6.1",
|
||||||
"vite-tsconfig-paths": "^5.1.4"
|
"vite-tsconfig-paths": "^5.1.4"
|
||||||
},
|
},
|
||||||
|
|||||||
182
interface/pnpm-lock.yaml
generated
182
interface/pnpm-lock.yaml
generated
@@ -70,8 +70,8 @@ importers:
|
|||||||
version: 5.9.3
|
version: 5.9.3
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@babel/core':
|
'@babel/core':
|
||||||
specifier: ^7.28.4
|
specifier: ^7.28.5
|
||||||
version: 7.28.4
|
version: 7.28.5
|
||||||
'@eslint/js':
|
'@eslint/js':
|
||||||
specifier: ^9.38.0
|
specifier: ^9.38.0
|
||||||
version: 9.38.0
|
version: 9.38.0
|
||||||
@@ -80,7 +80,7 @@ importers:
|
|||||||
version: 18.3.1(preact@10.27.2)
|
version: 18.3.1(preact@10.27.2)
|
||||||
'@preact/preset-vite':
|
'@preact/preset-vite':
|
||||||
specifier: ^2.10.2
|
specifier: ^2.10.2
|
||||||
version: 2.10.2(@babel/core@7.28.4)(preact@10.27.2)(vite@7.1.11(@types/node@24.9.1)(terser@5.44.0))
|
version: 2.10.2(@babel/core@7.28.5)(preact@10.27.2)(vite@7.1.12(@types/node@24.9.1)(terser@5.44.0))
|
||||||
'@trivago/prettier-plugin-sort-imports':
|
'@trivago/prettier-plugin-sort-imports':
|
||||||
specifier: ^5.2.2
|
specifier: ^5.2.2
|
||||||
version: 5.2.2(prettier@3.6.2)
|
version: 5.2.2(prettier@3.6.2)
|
||||||
@@ -115,14 +115,14 @@ importers:
|
|||||||
specifier: ^8.46.2
|
specifier: ^8.46.2
|
||||||
version: 8.46.2(eslint@9.38.0)(typescript@5.9.3)
|
version: 8.46.2(eslint@9.38.0)(typescript@5.9.3)
|
||||||
vite:
|
vite:
|
||||||
specifier: ^7.1.11
|
specifier: ^7.1.12
|
||||||
version: 7.1.11(@types/node@24.9.1)(terser@5.44.0)
|
version: 7.1.12(@types/node@24.9.1)(terser@5.44.0)
|
||||||
vite-plugin-imagemin:
|
vite-plugin-imagemin:
|
||||||
specifier: ^0.6.1
|
specifier: ^0.6.1
|
||||||
version: 0.6.1(vite@7.1.11(@types/node@24.9.1)(terser@5.44.0))
|
version: 0.6.1(vite@7.1.12(@types/node@24.9.1)(terser@5.44.0))
|
||||||
vite-tsconfig-paths:
|
vite-tsconfig-paths:
|
||||||
specifier: ^5.1.4
|
specifier: ^5.1.4
|
||||||
version: 5.1.4(typescript@5.9.3)(vite@7.1.11(@types/node@24.9.1)(terser@5.44.0))
|
version: 5.1.4(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.1)(terser@5.44.0))
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
@@ -138,16 +138,16 @@ packages:
|
|||||||
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
|
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/compat-data@7.28.4':
|
'@babel/compat-data@7.28.5':
|
||||||
resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==}
|
resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/core@7.28.4':
|
'@babel/core@7.28.5':
|
||||||
resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==}
|
resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/generator@7.28.3':
|
'@babel/generator@7.28.5':
|
||||||
resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
|
resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/helper-annotate-as-pure@7.27.3':
|
'@babel/helper-annotate-as-pure@7.27.3':
|
||||||
@@ -180,8 +180,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
|
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/helper-validator-identifier@7.27.1':
|
'@babel/helper-validator-identifier@7.28.5':
|
||||||
resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
|
resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/helper-validator-option@7.27.1':
|
'@babel/helper-validator-option@7.27.1':
|
||||||
@@ -192,8 +192,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
|
resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/parser@7.28.4':
|
'@babel/parser@7.28.5':
|
||||||
resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==}
|
resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -223,12 +223,12 @@ packages:
|
|||||||
resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
|
resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/traverse@7.28.4':
|
'@babel/traverse@7.28.5':
|
||||||
resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==}
|
resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/types@7.28.4':
|
'@babel/types@7.28.5':
|
||||||
resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==}
|
resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@emotion/babel-plugin@11.13.5':
|
'@emotion/babel-plugin@11.13.5':
|
||||||
@@ -1014,8 +1014,8 @@ packages:
|
|||||||
base64-js@1.5.1:
|
base64-js@1.5.1:
|
||||||
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
||||||
|
|
||||||
baseline-browser-mapping@2.8.19:
|
baseline-browser-mapping@2.8.20:
|
||||||
resolution: {integrity: sha512-zoKGUdu6vb2jd3YOq0nnhEDQVbPcHhco3UImJrv5dSkvxTc2pl2WjOPsjZXDwPDSl5eghIMuY3R6J9NDKF3KcQ==}
|
resolution: {integrity: sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
bin-build@3.0.0:
|
bin-build@3.0.0:
|
||||||
@@ -2976,8 +2976,8 @@ packages:
|
|||||||
vite:
|
vite:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
vite@7.1.11:
|
vite@7.1.12:
|
||||||
resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==}
|
resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -3084,23 +3084,23 @@ snapshots:
|
|||||||
|
|
||||||
'@babel/code-frame@7.27.1':
|
'@babel/code-frame@7.27.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/helper-validator-identifier': 7.27.1
|
'@babel/helper-validator-identifier': 7.28.5
|
||||||
js-tokens: 4.0.0
|
js-tokens: 4.0.0
|
||||||
picocolors: 1.1.1
|
picocolors: 1.1.1
|
||||||
|
|
||||||
'@babel/compat-data@7.28.4': {}
|
'@babel/compat-data@7.28.5': {}
|
||||||
|
|
||||||
'@babel/core@7.28.4':
|
'@babel/core@7.28.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.27.1
|
'@babel/code-frame': 7.27.1
|
||||||
'@babel/generator': 7.28.3
|
'@babel/generator': 7.28.5
|
||||||
'@babel/helper-compilation-targets': 7.27.2
|
'@babel/helper-compilation-targets': 7.27.2
|
||||||
'@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)
|
'@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
|
||||||
'@babel/helpers': 7.28.4
|
'@babel/helpers': 7.28.4
|
||||||
'@babel/parser': 7.28.4
|
'@babel/parser': 7.28.5
|
||||||
'@babel/template': 7.27.2
|
'@babel/template': 7.27.2
|
||||||
'@babel/traverse': 7.28.4
|
'@babel/traverse': 7.28.5
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
'@jridgewell/remapping': 2.3.5
|
'@jridgewell/remapping': 2.3.5
|
||||||
convert-source-map: 2.0.0
|
convert-source-map: 2.0.0
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
@@ -3110,21 +3110,21 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@babel/generator@7.28.3':
|
'@babel/generator@7.28.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.28.4
|
'@babel/parser': 7.28.5
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
'@jridgewell/gen-mapping': 0.3.13
|
'@jridgewell/gen-mapping': 0.3.13
|
||||||
'@jridgewell/trace-mapping': 0.3.31
|
'@jridgewell/trace-mapping': 0.3.31
|
||||||
jsesc: 3.1.0
|
jsesc: 3.1.0
|
||||||
|
|
||||||
'@babel/helper-annotate-as-pure@7.27.3':
|
'@babel/helper-annotate-as-pure@7.27.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
|
|
||||||
'@babel/helper-compilation-targets@7.27.2':
|
'@babel/helper-compilation-targets@7.27.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/compat-data': 7.28.4
|
'@babel/compat-data': 7.28.5
|
||||||
'@babel/helper-validator-option': 7.27.1
|
'@babel/helper-validator-option': 7.27.1
|
||||||
browserslist: 4.27.0
|
browserslist: 4.27.0
|
||||||
lru-cache: 5.1.1
|
lru-cache: 5.1.1
|
||||||
@@ -3134,17 +3134,17 @@ snapshots:
|
|||||||
|
|
||||||
'@babel/helper-module-imports@7.27.1':
|
'@babel/helper-module-imports@7.27.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/traverse': 7.28.4
|
'@babel/traverse': 7.28.5
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)':
|
'@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.4
|
'@babel/core': 7.28.5
|
||||||
'@babel/helper-module-imports': 7.27.1
|
'@babel/helper-module-imports': 7.27.1
|
||||||
'@babel/helper-validator-identifier': 7.27.1
|
'@babel/helper-validator-identifier': 7.28.5
|
||||||
'@babel/traverse': 7.28.4
|
'@babel/traverse': 7.28.5
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -3152,39 +3152,39 @@ snapshots:
|
|||||||
|
|
||||||
'@babel/helper-string-parser@7.27.1': {}
|
'@babel/helper-string-parser@7.27.1': {}
|
||||||
|
|
||||||
'@babel/helper-validator-identifier@7.27.1': {}
|
'@babel/helper-validator-identifier@7.28.5': {}
|
||||||
|
|
||||||
'@babel/helper-validator-option@7.27.1': {}
|
'@babel/helper-validator-option@7.27.1': {}
|
||||||
|
|
||||||
'@babel/helpers@7.28.4':
|
'@babel/helpers@7.28.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/template': 7.27.2
|
'@babel/template': 7.27.2
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
|
|
||||||
'@babel/parser@7.28.4':
|
'@babel/parser@7.28.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
|
|
||||||
'@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)':
|
'@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.4
|
'@babel/core': 7.28.5
|
||||||
'@babel/helper-plugin-utils': 7.27.1
|
'@babel/helper-plugin-utils': 7.27.1
|
||||||
|
|
||||||
'@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.4)':
|
'@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.5)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.4
|
'@babel/core': 7.28.5
|
||||||
'@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4)
|
'@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4)':
|
'@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.4
|
'@babel/core': 7.28.5
|
||||||
'@babel/helper-annotate-as-pure': 7.27.3
|
'@babel/helper-annotate-as-pure': 7.27.3
|
||||||
'@babel/helper-module-imports': 7.27.1
|
'@babel/helper-module-imports': 7.27.1
|
||||||
'@babel/helper-plugin-utils': 7.27.1
|
'@babel/helper-plugin-utils': 7.27.1
|
||||||
'@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4)
|
'@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5)
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -3193,25 +3193,25 @@ snapshots:
|
|||||||
'@babel/template@7.27.2':
|
'@babel/template@7.27.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.27.1
|
'@babel/code-frame': 7.27.1
|
||||||
'@babel/parser': 7.28.4
|
'@babel/parser': 7.28.5
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
|
|
||||||
'@babel/traverse@7.28.4':
|
'@babel/traverse@7.28.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.27.1
|
'@babel/code-frame': 7.27.1
|
||||||
'@babel/generator': 7.28.3
|
'@babel/generator': 7.28.5
|
||||||
'@babel/helper-globals': 7.28.0
|
'@babel/helper-globals': 7.28.0
|
||||||
'@babel/parser': 7.28.4
|
'@babel/parser': 7.28.5
|
||||||
'@babel/template': 7.27.2
|
'@babel/template': 7.27.2
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@babel/types@7.28.4':
|
'@babel/types@7.28.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/helper-string-parser': 7.27.1
|
'@babel/helper-string-parser': 7.27.1
|
||||||
'@babel/helper-validator-identifier': 7.27.1
|
'@babel/helper-validator-identifier': 7.28.5
|
||||||
|
|
||||||
'@emotion/babel-plugin@11.13.5':
|
'@emotion/babel-plugin@11.13.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3575,18 +3575,18 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
preact: 10.27.2
|
preact: 10.27.2
|
||||||
|
|
||||||
'@preact/preset-vite@2.10.2(@babel/core@7.28.4)(preact@10.27.2)(vite@7.1.11(@types/node@24.9.1)(terser@5.44.0))':
|
'@preact/preset-vite@2.10.2(@babel/core@7.28.5)(preact@10.27.2)(vite@7.1.12(@types/node@24.9.1)(terser@5.44.0))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.4
|
'@babel/core': 7.28.5
|
||||||
'@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4)
|
'@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5)
|
||||||
'@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.4)
|
'@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5)
|
||||||
'@prefresh/vite': 2.4.10(preact@10.27.2)(vite@7.1.11(@types/node@24.9.1)(terser@5.44.0))
|
'@prefresh/vite': 2.4.10(preact@10.27.2)(vite@7.1.12(@types/node@24.9.1)(terser@5.44.0))
|
||||||
'@rollup/pluginutils': 4.2.1
|
'@rollup/pluginutils': 4.2.1
|
||||||
babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.4)
|
babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.5)
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
picocolors: 1.1.1
|
picocolors: 1.1.1
|
||||||
vite: 7.1.11(@types/node@24.9.1)(terser@5.44.0)
|
vite: 7.1.12(@types/node@24.9.1)(terser@5.44.0)
|
||||||
vite-prerender-plugin: 0.5.12(vite@7.1.11(@types/node@24.9.1)(terser@5.44.0))
|
vite-prerender-plugin: 0.5.12(vite@7.1.12(@types/node@24.9.1)(terser@5.44.0))
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- preact
|
- preact
|
||||||
- supports-color
|
- supports-color
|
||||||
@@ -3599,15 +3599,15 @@ snapshots:
|
|||||||
|
|
||||||
'@prefresh/utils@1.2.1': {}
|
'@prefresh/utils@1.2.1': {}
|
||||||
|
|
||||||
'@prefresh/vite@2.4.10(preact@10.27.2)(vite@7.1.11(@types/node@24.9.1)(terser@5.44.0))':
|
'@prefresh/vite@2.4.10(preact@10.27.2)(vite@7.1.12(@types/node@24.9.1)(terser@5.44.0))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.4
|
'@babel/core': 7.28.5
|
||||||
'@prefresh/babel-plugin': 0.5.2
|
'@prefresh/babel-plugin': 0.5.2
|
||||||
'@prefresh/core': 1.5.8(preact@10.27.2)
|
'@prefresh/core': 1.5.8(preact@10.27.2)
|
||||||
'@prefresh/utils': 1.2.1
|
'@prefresh/utils': 1.2.1
|
||||||
'@rollup/pluginutils': 4.2.1
|
'@rollup/pluginutils': 4.2.1
|
||||||
preact: 10.27.2
|
preact: 10.27.2
|
||||||
vite: 7.1.11(@types/node@24.9.1)(terser@5.44.0)
|
vite: 7.1.12(@types/node@24.9.1)(terser@5.44.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -3695,10 +3695,10 @@ snapshots:
|
|||||||
|
|
||||||
'@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.6.2)':
|
'@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.6.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/generator': 7.28.3
|
'@babel/generator': 7.28.5
|
||||||
'@babel/parser': 7.28.4
|
'@babel/parser': 7.28.5
|
||||||
'@babel/traverse': 7.28.4
|
'@babel/traverse': 7.28.5
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
javascript-natural-sort: 0.7.1
|
javascript-natural-sort: 0.7.1
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
prettier: 3.6.2
|
prettier: 3.6.2
|
||||||
@@ -3928,15 +3928,15 @@ snapshots:
|
|||||||
cosmiconfig: 7.1.0
|
cosmiconfig: 7.1.0
|
||||||
resolve: 1.22.11
|
resolve: 1.22.11
|
||||||
|
|
||||||
babel-plugin-transform-hook-names@1.0.2(@babel/core@7.28.4):
|
babel-plugin-transform-hook-names@1.0.2(@babel/core@7.28.5):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.4
|
'@babel/core': 7.28.5
|
||||||
|
|
||||||
balanced-match@1.0.2: {}
|
balanced-match@1.0.2: {}
|
||||||
|
|
||||||
base64-js@1.5.1: {}
|
base64-js@1.5.1: {}
|
||||||
|
|
||||||
baseline-browser-mapping@2.8.19: {}
|
baseline-browser-mapping@2.8.20: {}
|
||||||
|
|
||||||
bin-build@3.0.0:
|
bin-build@3.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3993,7 +3993,7 @@ snapshots:
|
|||||||
|
|
||||||
browserslist@4.27.0:
|
browserslist@4.27.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
baseline-browser-mapping: 2.8.19
|
baseline-browser-mapping: 2.8.20
|
||||||
caniuse-lite: 1.0.30001751
|
caniuse-lite: 1.0.30001751
|
||||||
electron-to-chromium: 1.5.239
|
electron-to-chromium: 1.5.239
|
||||||
node-releases: 2.0.26
|
node-releases: 2.0.26
|
||||||
@@ -5935,7 +5935,7 @@ snapshots:
|
|||||||
spdx-correct: 3.2.0
|
spdx-correct: 3.2.0
|
||||||
spdx-expression-parse: 3.0.1
|
spdx-expression-parse: 3.0.1
|
||||||
|
|
||||||
vite-plugin-imagemin@0.6.1(vite@7.1.11(@types/node@24.9.1)(terser@5.44.0)):
|
vite-plugin-imagemin@0.6.1(vite@7.1.12(@types/node@24.9.1)(terser@5.44.0)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/imagemin': 7.0.1
|
'@types/imagemin': 7.0.1
|
||||||
'@types/imagemin-gifsicle': 7.0.4
|
'@types/imagemin-gifsicle': 7.0.4
|
||||||
@@ -5960,11 +5960,11 @@ snapshots:
|
|||||||
imagemin-webp: 6.1.0
|
imagemin-webp: 6.1.0
|
||||||
jpegtran-bin: 6.0.1
|
jpegtran-bin: 6.0.1
|
||||||
pathe: 0.2.0
|
pathe: 0.2.0
|
||||||
vite: 7.1.11(@types/node@24.9.1)(terser@5.44.0)
|
vite: 7.1.12(@types/node@24.9.1)(terser@5.44.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
vite-prerender-plugin@0.5.12(vite@7.1.11(@types/node@24.9.1)(terser@5.44.0)):
|
vite-prerender-plugin@0.5.12(vite@7.1.12(@types/node@24.9.1)(terser@5.44.0)):
|
||||||
dependencies:
|
dependencies:
|
||||||
kolorist: 1.8.0
|
kolorist: 1.8.0
|
||||||
magic-string: 0.30.19
|
magic-string: 0.30.19
|
||||||
@@ -5972,20 +5972,20 @@ snapshots:
|
|||||||
simple-code-frame: 1.3.0
|
simple-code-frame: 1.3.0
|
||||||
source-map: 0.7.6
|
source-map: 0.7.6
|
||||||
stack-trace: 1.0.0-pre2
|
stack-trace: 1.0.0-pre2
|
||||||
vite: 7.1.11(@types/node@24.9.1)(terser@5.44.0)
|
vite: 7.1.12(@types/node@24.9.1)(terser@5.44.0)
|
||||||
|
|
||||||
vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.11(@types/node@24.9.1)(terser@5.44.0)):
|
vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.1)(terser@5.44.0)):
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
globrex: 0.1.2
|
globrex: 0.1.2
|
||||||
tsconfck: 3.1.6(typescript@5.9.3)
|
tsconfck: 3.1.6(typescript@5.9.3)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
vite: 7.1.11(@types/node@24.9.1)(terser@5.44.0)
|
vite: 7.1.12(@types/node@24.9.1)(terser@5.44.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
- typescript
|
- typescript
|
||||||
|
|
||||||
vite@7.1.11(@types/node@24.9.1)(terser@5.44.0):
|
vite@7.1.12(@types/node@24.9.1)(terser@5.44.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild: 0.25.11
|
esbuild: 0.25.11
|
||||||
fdir: 6.5.0(picomatch@4.0.3)
|
fdir: 6.5.0(picomatch@4.0.3)
|
||||||
|
|||||||
58
mock-api/pnpm-lock.yaml
generated
58
mock-api/pnpm-lock.yaml
generated
@@ -30,8 +30,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
|
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/generator@7.28.3':
|
'@babel/generator@7.28.5':
|
||||||
resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
|
resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/helper-globals@7.28.0':
|
'@babel/helper-globals@7.28.0':
|
||||||
@@ -42,12 +42,12 @@ packages:
|
|||||||
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
|
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/helper-validator-identifier@7.27.1':
|
'@babel/helper-validator-identifier@7.28.5':
|
||||||
resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
|
resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/parser@7.28.4':
|
'@babel/parser@7.28.5':
|
||||||
resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==}
|
resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -55,12 +55,12 @@ packages:
|
|||||||
resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
|
resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/traverse@7.28.4':
|
'@babel/traverse@7.28.5':
|
||||||
resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==}
|
resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@babel/types@7.28.4':
|
'@babel/types@7.28.5':
|
||||||
resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==}
|
resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@jridgewell/gen-mapping@0.3.13':
|
'@jridgewell/gen-mapping@0.3.13':
|
||||||
@@ -160,14 +160,14 @@ snapshots:
|
|||||||
|
|
||||||
'@babel/code-frame@7.27.1':
|
'@babel/code-frame@7.27.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/helper-validator-identifier': 7.27.1
|
'@babel/helper-validator-identifier': 7.28.5
|
||||||
js-tokens: 4.0.0
|
js-tokens: 4.0.0
|
||||||
picocolors: 1.1.1
|
picocolors: 1.1.1
|
||||||
|
|
||||||
'@babel/generator@7.28.3':
|
'@babel/generator@7.28.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.28.4
|
'@babel/parser': 7.28.5
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
'@jridgewell/gen-mapping': 0.3.13
|
'@jridgewell/gen-mapping': 0.3.13
|
||||||
'@jridgewell/trace-mapping': 0.3.31
|
'@jridgewell/trace-mapping': 0.3.31
|
||||||
jsesc: 3.1.0
|
jsesc: 3.1.0
|
||||||
@@ -176,34 +176,34 @@ snapshots:
|
|||||||
|
|
||||||
'@babel/helper-string-parser@7.27.1': {}
|
'@babel/helper-string-parser@7.27.1': {}
|
||||||
|
|
||||||
'@babel/helper-validator-identifier@7.27.1': {}
|
'@babel/helper-validator-identifier@7.28.5': {}
|
||||||
|
|
||||||
'@babel/parser@7.28.4':
|
'@babel/parser@7.28.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
|
|
||||||
'@babel/template@7.27.2':
|
'@babel/template@7.27.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.27.1
|
'@babel/code-frame': 7.27.1
|
||||||
'@babel/parser': 7.28.4
|
'@babel/parser': 7.28.5
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
|
|
||||||
'@babel/traverse@7.28.4':
|
'@babel/traverse@7.28.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.27.1
|
'@babel/code-frame': 7.27.1
|
||||||
'@babel/generator': 7.28.3
|
'@babel/generator': 7.28.5
|
||||||
'@babel/helper-globals': 7.28.0
|
'@babel/helper-globals': 7.28.0
|
||||||
'@babel/parser': 7.28.4
|
'@babel/parser': 7.28.5
|
||||||
'@babel/template': 7.27.2
|
'@babel/template': 7.27.2
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@babel/types@7.28.4':
|
'@babel/types@7.28.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/helper-string-parser': 7.27.1
|
'@babel/helper-string-parser': 7.27.1
|
||||||
'@babel/helper-validator-identifier': 7.27.1
|
'@babel/helper-validator-identifier': 7.28.5
|
||||||
|
|
||||||
'@jridgewell/gen-mapping@0.3.13':
|
'@jridgewell/gen-mapping@0.3.13':
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -229,10 +229,10 @@ snapshots:
|
|||||||
|
|
||||||
'@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.6.2)':
|
'@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.6.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/generator': 7.28.3
|
'@babel/generator': 7.28.5
|
||||||
'@babel/parser': 7.28.4
|
'@babel/parser': 7.28.5
|
||||||
'@babel/traverse': 7.28.4
|
'@babel/traverse': 7.28.5
|
||||||
'@babel/types': 7.28.4
|
'@babel/types': 7.28.5
|
||||||
javascript-natural-sort: 0.7.1
|
javascript-natural-sort: 0.7.1
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
prettier: 3.6.2
|
prettier: 3.6.2
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ default_envs = debug
|
|||||||
|
|
||||||
; uncomment if you want to upload the firmware via OTA (must have upload_protocol = custom)
|
; uncomment if you want to upload the firmware via OTA (must have upload_protocol = custom)
|
||||||
extra_scripts =
|
extra_scripts =
|
||||||
pre:scripts/build_interface.py ; builds the WebUI (unless NO_BUILD_WEBUI is set) - comment out if you don't want to build each time
|
pre:scripts/build_interface.py ; builds the WebUI - comment out if you don't want to build each time
|
||||||
scripts/rename_fw.py ; renames the firmware .bin file - comment out if not needed
|
scripts/rename_fw.py ; renames the firmware .bin file - comment out if not needed
|
||||||
scripts/upload.py ; optionally upload the firmware via OTA (must have upload_protocol = custom)
|
scripts/upload.py ; optionally upload the firmware via OTA (must have upload_protocol = custom)
|
||||||
|
|
||||||
|
|||||||
@@ -98,9 +98,9 @@ build_flags =
|
|||||||
build_unflags =
|
build_unflags =
|
||||||
${common.unbuild_flags}
|
${common.unbuild_flags}
|
||||||
extra_scripts =
|
extra_scripts =
|
||||||
pre:scripts/build_interface.py ; builds the WebUI (unless NO_BUILD_WEBUI is set)
|
; pre:scripts/build_interface.py ; builds the WebUI
|
||||||
scripts/rename_fw.py ; renames the firmware .bin file
|
scripts/rename_fw.py ; renames the firmware .bin file
|
||||||
scripts/upload.py ; optionally upload the firmware via OTA (if upload_protocol = custom)
|
; scripts/upload.py ; optionally upload the firmware via OTA (if upload_protocol = custom)
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
monitor_filters = direct
|
monitor_filters = direct
|
||||||
build_type = release
|
build_type = release
|
||||||
@@ -111,11 +111,16 @@ lib_deps =
|
|||||||
ESP32Async/ESPAsyncWebServer @ 3.8.1
|
ESP32Async/ESPAsyncWebServer @ 3.8.1
|
||||||
https://github.com/emsesp/EMS-ESP-Modules.git @ 1.0.8
|
https://github.com/emsesp/EMS-ESP-Modules.git @ 1.0.8
|
||||||
|
|
||||||
|
|
||||||
|
; builds the web interface only, not the firmware
|
||||||
|
[env:build_webUI]
|
||||||
|
platform = native
|
||||||
|
targets = build
|
||||||
|
extra_scripts = post:scripts/build_interface.py
|
||||||
|
|
||||||
;
|
;
|
||||||
; Builds for different board types
|
; Builds for different board types
|
||||||
; We use Tasmota for boards without PSRAM as this framework has mbedtls removed to save memory.
|
; We use Tasmota for boards without PSRAM as this framework has mbedtls removed to save memory.
|
||||||
;
|
|
||||||
; Note, if the system environment variable (windows or linux) "NO_BUILD_WEBUI" is set, the WebUI will not be built.
|
|
||||||
; If you're building for a single target environment, we recommend creating a pio_local.ini (see example file)
|
; If you're building for a single target environment, we recommend creating a pio_local.ini (see example file)
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -175,6 +180,7 @@ board = seeed_xiao_esp32c6
|
|||||||
build_flags =
|
build_flags =
|
||||||
${common.build_flags}
|
${common.build_flags}
|
||||||
-DBOARD_C6
|
-DBOARD_C6
|
||||||
|
|
||||||
;
|
;
|
||||||
; Building and testing natively, standalone without an ESP32.
|
; Building and testing natively, standalone without an ESP32.
|
||||||
; See https://docs.platformio.org/en/latest/platforms/native.html
|
; See https://docs.platformio.org/en/latest/platforms/native.html
|
||||||
@@ -193,15 +199,12 @@ build_flags =
|
|||||||
;
|
;
|
||||||
[env:native]
|
[env:native]
|
||||||
platform = native
|
platform = native
|
||||||
extra_scripts =
|
build_type = debug
|
||||||
build_flags =
|
build_src_flags =
|
||||||
-DARDUINOJSON_ENABLE_ARDUINO_STRING=1
|
-DARDUINOJSON_ENABLE_ARDUINO_STRING=1
|
||||||
-DEMSESP_STANDALONE -DEMSESP_TEST
|
-DEMSESP_STANDALONE -DEMSESP_TEST
|
||||||
-DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.7.3-dev.0\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32\"
|
-DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.7.3-dev.0\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32\"
|
||||||
-std=gnu++17 -Og -ggdb
|
-std=gnu++17 -Og -ggdb
|
||||||
build_unflags = -std=gnu++11 -std=gnu++14
|
|
||||||
build_type = debug
|
|
||||||
build_src_flags =
|
|
||||||
-Wall -Wextra
|
-Wall -Wextra
|
||||||
-Wno-unused-parameter -Wno-sign-compare -Wno-missing-braces
|
-Wno-unused-parameter -Wno-sign-compare -Wno-missing-braces
|
||||||
-I./src/core
|
-I./src/core
|
||||||
@@ -232,7 +235,6 @@ lib_deps =
|
|||||||
; then re-run and capture the output between "START - CUT HERE" and "END - CUT HERE" into the test_api.h file
|
; then re-run and capture the output between "START - CUT HERE" and "END - CUT HERE" into the test_api.h file
|
||||||
[env:native-test]
|
[env:native-test]
|
||||||
platform = native
|
platform = native
|
||||||
extra_scripts =
|
|
||||||
test_build_src = true
|
test_build_src = true
|
||||||
build_flags =
|
build_flags =
|
||||||
; -DEMSESP_UNITY_CREATE
|
; -DEMSESP_UNITY_CREATE
|
||||||
@@ -271,3 +273,30 @@ lib_ldf_mode = off
|
|||||||
lib_deps = Unity
|
lib_deps = Unity
|
||||||
test_testing_command =
|
test_testing_command =
|
||||||
${platformio.build_dir}/${this.__env__}/program
|
${platformio.build_dir}/${this.__env__}/program
|
||||||
|
|
||||||
|
# builds the modbus_entity_parameters.hpp header file
|
||||||
|
# pio run -e build_modbus -t build
|
||||||
|
[env:build_modbus]
|
||||||
|
extends = env:native
|
||||||
|
targets = build
|
||||||
|
extra_scripts =
|
||||||
|
pre:scripts/build_modbus_entity_parameters_pre.py
|
||||||
|
post:scripts/build_run_test.py
|
||||||
|
build_flags = -DEMSESP_MODBUS
|
||||||
|
custom_test_command = entity_dump
|
||||||
|
custom_output_file = dump_entities.csv
|
||||||
|
custom_post_script = scripts/build_modbus_entity_parameters_post.py
|
||||||
|
|
||||||
|
; builds the real dump_entities.csv and dump_telegrams.csv files
|
||||||
|
; and the Modbus-Entity-Registers.md file
|
||||||
|
; to be run after build_modbus with: pio run -e build_standalone -t clean -t build
|
||||||
|
[env:build_standalone]
|
||||||
|
extends = env:native
|
||||||
|
targets = build
|
||||||
|
extra_scripts =
|
||||||
|
post:scripts/build_run_test.py
|
||||||
|
build_flags = -DEMSESP_STANDALONE
|
||||||
|
custom_test_command = entity_dump
|
||||||
|
custom_output_file = dump_entities.csv
|
||||||
|
custom_post_script = scripts/build_modbus_generate_doc_post.py
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,120 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import os
|
import os
|
||||||
|
import subprocess
|
||||||
|
import shutil
|
||||||
|
|
||||||
Import("env")
|
Import("env")
|
||||||
|
|
||||||
|
|
||||||
def buildWeb():
|
def get_pnpm_executable():
|
||||||
os.chdir("interface")
|
"""Get the appropriate pnpm executable for the current platform."""
|
||||||
print("Building web interface...")
|
# Try different pnpm executable names
|
||||||
|
pnpm_names = ['pnpm', 'pnpm.cmd', 'pnpm.exe']
|
||||||
|
|
||||||
|
for name in pnpm_names:
|
||||||
|
if shutil.which(name):
|
||||||
|
return name
|
||||||
|
|
||||||
|
# Fallback to pnpm if not found
|
||||||
|
return 'pnpm'
|
||||||
|
|
||||||
|
|
||||||
|
def run_command_in_directory(command, directory):
|
||||||
|
"""Run a command in a specific directory."""
|
||||||
try:
|
try:
|
||||||
env.Execute("pnpm install")
|
result = subprocess.run(
|
||||||
env.Execute("pnpm typesafe-i18n")
|
command,
|
||||||
with open("./src/i18n/i18n-util.ts") as r:
|
shell=True,
|
||||||
text = r.read().replace("Locales = 'pl'", "Locales = 'en'")
|
cwd=directory,
|
||||||
with open("./src/i18n/i18n-util.ts", "w") as w:
|
check=True,
|
||||||
w.write(text)
|
capture_output=True,
|
||||||
print("Setting WebUI locale to 'en'")
|
text=True
|
||||||
env.Execute("pnpm build")
|
)
|
||||||
env.Execute("pnpm webUI")
|
|
||||||
finally:
|
if result.stdout:
|
||||||
os.chdir("..")
|
print(result.stdout)
|
||||||
|
if result.stderr:
|
||||||
|
print(result.stderr)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"Command failed: {command}")
|
||||||
|
print(f"Error: {e}")
|
||||||
|
if e.stdout:
|
||||||
|
print(f"Output: {e.stdout}")
|
||||||
|
if e.stderr:
|
||||||
|
print(f"Error output: {e.stderr}")
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Unexpected error running command '{command}': {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
# Don't buuld webUI if called from GitHub Actions
|
def buildWeb():
|
||||||
if "NO_BUILD_WEBUI" in os.environ:
|
interface_dir = Path("interface")
|
||||||
print("!! Skipping the build of the web interface !!")
|
pnpm_exe = get_pnpm_executable()
|
||||||
else:
|
|
||||||
if not (env.IsCleanTarget()):
|
# Set CI environment variable to make pnpm use silent mode
|
||||||
buildWeb()
|
os.environ['CI'] = 'true'
|
||||||
|
|
||||||
|
print("Building web interface...")
|
||||||
|
|
||||||
|
# Check if interface directory exists
|
||||||
|
if not interface_dir.exists():
|
||||||
|
print(f"Error: Interface directory '{interface_dir}' not found!")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Check if pnpm is available
|
||||||
|
if not shutil.which(pnpm_exe):
|
||||||
|
print(f"Error: '{pnpm_exe}' not found in PATH!")
|
||||||
|
return False
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Run pnpm commands in the interface directory
|
||||||
|
commands = [
|
||||||
|
f"{pnpm_exe} install",
|
||||||
|
f"{pnpm_exe} typesafe-i18n",
|
||||||
|
f"{pnpm_exe} build",
|
||||||
|
f"{pnpm_exe} webUI"
|
||||||
|
]
|
||||||
|
|
||||||
|
for command in commands:
|
||||||
|
print(f"Running: {command}")
|
||||||
|
if not run_command_in_directory(command, interface_dir):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Modify i18n-util.ts file
|
||||||
|
i18n_file = interface_dir / "src" / "i18n" / "i18n-util.ts"
|
||||||
|
if i18n_file.exists():
|
||||||
|
with open(i18n_file, 'r') as r:
|
||||||
|
text = r.read().replace("Locales = 'pl'", "Locales = 'en'")
|
||||||
|
with open(i18n_file, 'w') as w:
|
||||||
|
w.write(text)
|
||||||
|
print("Setting WebUI locale to 'en'")
|
||||||
|
else:
|
||||||
|
print(f"Warning: {i18n_file} not found, skipping locale modification")
|
||||||
|
|
||||||
|
print("Web interface build completed successfully!")
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error building web interface: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def build_webUI(*args, **kwargs):
|
||||||
|
success = buildWeb()
|
||||||
|
if not success:
|
||||||
|
print("Web interface build failed!")
|
||||||
|
env.Exit(1)
|
||||||
|
env.Exit(0)
|
||||||
|
|
||||||
|
# Create custom target that only runs the script
|
||||||
|
env.AddCustomTarget(
|
||||||
|
name="build",
|
||||||
|
dependencies=None,
|
||||||
|
actions=[build_webUI],
|
||||||
|
title="build web interface",
|
||||||
|
description="installs pnpm packages, updates libraries and builds web UI"
|
||||||
|
)
|
||||||
|
|||||||
52
scripts/build_modbus_entity_parameters_post.py
Executable file
52
scripts/build_modbus_entity_parameters_post.py
Executable file
@@ -0,0 +1,52 @@
|
|||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import shutil
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
def get_python_executable():
|
||||||
|
"""Get the appropriate Python executable for the current platform."""
|
||||||
|
# Try different Python executable names
|
||||||
|
python_names = ['python3', 'python', 'py']
|
||||||
|
|
||||||
|
for name in python_names:
|
||||||
|
if shutil.which(name):
|
||||||
|
return name
|
||||||
|
|
||||||
|
# Fallback to sys.executable if available
|
||||||
|
return sys.executable
|
||||||
|
|
||||||
|
|
||||||
|
def csv_to_header(csv_file_path, header_file_path, script_path):
|
||||||
|
|
||||||
|
# Ensure the output directory exists
|
||||||
|
Path(header_file_path).parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# delete the output file if it exists
|
||||||
|
if os.path.exists(header_file_path):
|
||||||
|
os.remove(header_file_path)
|
||||||
|
|
||||||
|
# Read CSV file and pipe to Python script to generate header
|
||||||
|
python_exe = get_python_executable()
|
||||||
|
|
||||||
|
with open(csv_file_path, 'r') as csv_file:
|
||||||
|
with open(header_file_path, 'w') as header_file:
|
||||||
|
subprocess.run(
|
||||||
|
[python_exe, script_path],
|
||||||
|
stdin=csv_file,
|
||||||
|
stdout=header_file,
|
||||||
|
check=True
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f"Generated header file: {header_file_path} ({os.path.getsize(header_file_path)} bytes)")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
csv_file = os.path.join("docs", "dump_entities.csv")
|
||||||
|
header_file = os.path.join("src", "core", "modbus_entity_parameters.hpp")
|
||||||
|
script_file = os.path.join("scripts", "update_modbus_registers.py")
|
||||||
|
|
||||||
|
csv_to_header(csv_file, header_file, script_file)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
40
scripts/build_modbus_entity_parameters_pre.py
Executable file
40
scripts/build_modbus_entity_parameters_pre.py
Executable file
@@ -0,0 +1,40 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
import os
|
||||||
|
Import("env")
|
||||||
|
|
||||||
|
def create_dummy_modbus_header():
|
||||||
|
"""Create a dummy modbus_entity_parameters.hpp so the first pass compiles."""
|
||||||
|
header_content = '''#include "modbus.h"
|
||||||
|
#include "emsdevice.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is auto-generated. Do not modify.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
|
||||||
|
namespace emsesp {
|
||||||
|
|
||||||
|
using dt = EMSdevice::DeviceType;
|
||||||
|
|
||||||
|
#define REGISTER_MAPPING(device_type, device_value_tag_type, long_name, modbus_register_offset, modbus_register_count) \\
|
||||||
|
{ device_type, device_value_tag_type, long_name[0], modbus_register_offset, modbus_register_count }
|
||||||
|
|
||||||
|
// IMPORTANT: This list MUST be ordered by keys "device_type", "device_value_tag_type" and "modbus_register_offset" in this order.
|
||||||
|
const std::initializer_list<Modbus::EntityModbusInfo> Modbus::modbus_register_mappings = {};
|
||||||
|
|
||||||
|
} // namespace emsesp
|
||||||
|
|
||||||
|
// clang-format on
|
||||||
|
'''
|
||||||
|
|
||||||
|
header_path = Path("src") / "core" / "modbus_entity_parameters.hpp"
|
||||||
|
header_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
with open(header_path, 'w') as f:
|
||||||
|
f.write(header_content)
|
||||||
|
|
||||||
|
print(f"Created dummy header file: {header_path} ({os.path.getsize(header_path)} bytes)")
|
||||||
|
|
||||||
|
if not (env.IsCleanTarget()):
|
||||||
|
create_dummy_modbus_header()
|
||||||
64
scripts/build_modbus_generate_doc_post.py
Executable file
64
scripts/build_modbus_generate_doc_post.py
Executable file
@@ -0,0 +1,64 @@
|
|||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import shutil
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Import the streaming function from the separate module
|
||||||
|
from run_executable import run_with_streaming_input
|
||||||
|
|
||||||
|
def get_python_executable():
|
||||||
|
"""Get the appropriate Python executable for the current platform."""
|
||||||
|
# Try different Python executable names
|
||||||
|
python_names = ['python3', 'python', 'py']
|
||||||
|
|
||||||
|
for name in python_names:
|
||||||
|
if shutil.which(name):
|
||||||
|
return name
|
||||||
|
|
||||||
|
# Fallback to sys.executable if available
|
||||||
|
return sys.executable
|
||||||
|
|
||||||
|
|
||||||
|
def csv_to_md(csv_file_path, output_file_path, script_path):
|
||||||
|
|
||||||
|
# Ensure the output directory exists
|
||||||
|
Path(output_file_path).parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# delete the output file if it exists
|
||||||
|
if os.path.exists(output_file_path):
|
||||||
|
os.remove(output_file_path)
|
||||||
|
|
||||||
|
# Read CSV file and pipe to Python script to generate header
|
||||||
|
python_exe = get_python_executable()
|
||||||
|
|
||||||
|
with open(csv_file_path, 'r') as csv_file:
|
||||||
|
with open(output_file_path, 'w') as output_file:
|
||||||
|
subprocess.run(
|
||||||
|
[python_exe, script_path],
|
||||||
|
stdin=csv_file,
|
||||||
|
stdout=output_file,
|
||||||
|
check=True
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f"Generated MD file: {output_file_path} ({os.path.getsize(output_file_path)} bytes)")
|
||||||
|
|
||||||
|
|
||||||
|
def main(program_path="./emsesp"):
|
||||||
|
csv_file = os.path.join("docs", "dump_entities.csv")
|
||||||
|
output_file = os.path.join("docs", "Modbus-Entity-Registers.md")
|
||||||
|
script_file = os.path.join("scripts", "generate-modbus-register-doc.py")
|
||||||
|
|
||||||
|
# generate the MD file
|
||||||
|
csv_to_md(csv_file, output_file, script_file)
|
||||||
|
|
||||||
|
# run the test command and generate the dump_telegrams.csv file
|
||||||
|
test_command = "test telegram_dump"
|
||||||
|
telegram_output_file = os.path.join("docs", "dump_telegrams.csv")
|
||||||
|
print(f"Running test command: telegram_dump > {telegram_output_file}")
|
||||||
|
run_with_streaming_input(program_path, test_command, telegram_output_file)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Get program path from command line argument or use default
|
||||||
|
program_path = sys.argv[1] if len(sys.argv) > 1 else "./emsesp"
|
||||||
|
main(program_path)
|
||||||
46
scripts/build_run_test.py
Executable file
46
scripts/build_run_test.py
Executable file
@@ -0,0 +1,46 @@
|
|||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
Import("env")
|
||||||
|
|
||||||
|
# Import the streaming function from the separate module
|
||||||
|
from run_executable import run_with_streaming_input
|
||||||
|
|
||||||
|
def get_python_executable():
|
||||||
|
"""Get the appropriate Python executable for the current platform."""
|
||||||
|
# Try different Python executable names
|
||||||
|
python_names = ['python3', 'python', 'py']
|
||||||
|
|
||||||
|
for name in python_names:
|
||||||
|
if shutil.which(name):
|
||||||
|
return name
|
||||||
|
|
||||||
|
# Fallback to sys.executable if available
|
||||||
|
return sys.executable
|
||||||
|
|
||||||
|
|
||||||
|
def build_run_test(source, target, env):
|
||||||
|
|
||||||
|
# Get the executable path
|
||||||
|
program_path = source[0].get_abspath()
|
||||||
|
|
||||||
|
# Get output file and test command from environment variable or use defaults
|
||||||
|
output_file = os.path.join("docs", env.GetProjectOption("custom_output_file", "dump_default_output.txt"))
|
||||||
|
test_command = env.GetProjectOption("custom_test_command", "test entity_dump")
|
||||||
|
|
||||||
|
# run the test command and save the output to the output file
|
||||||
|
run_with_streaming_input(program_path, test_command, output_file)
|
||||||
|
|
||||||
|
# if we have a post command defined run it
|
||||||
|
post_script = env.GetProjectOption("custom_post_script", None)
|
||||||
|
if post_script:
|
||||||
|
print(f"Running post script: {post_script}")
|
||||||
|
python_exe = get_python_executable()
|
||||||
|
subprocess.run([python_exe, post_script, program_path], check=True)
|
||||||
|
|
||||||
|
env.AddCustomTarget(
|
||||||
|
"build",
|
||||||
|
"$BUILD_DIR/${PROGNAME}$PROGSUFFIX",
|
||||||
|
build_run_test
|
||||||
|
)
|
||||||
14
scripts/force_clean.py
Normal file
14
scripts/force_clean.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
Import("env")
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
def force_clean(source, target, env):
|
||||||
|
"""Remove build directory before building"""
|
||||||
|
build_dir = env.subst("$BUILD_DIR")
|
||||||
|
if os.path.exists(build_dir):
|
||||||
|
print(f"Force cleaning: {build_dir}")
|
||||||
|
shutil.rmtree(build_dir)
|
||||||
|
|
||||||
|
# Register the callback to run before building
|
||||||
|
env.AddPreAction("$BUILD_DIR/${PROGNAME}$PROGSUFFIX", force_clean)
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
#
|
|
||||||
# Builds the dump_*.csv files, modbus headers and modbus documentation.
|
|
||||||
# Run as `sh scripts/generate_csv_and_headers.sh` from the root of the repository.
|
|
||||||
|
|
||||||
# create a dummy modbus_entity_parameters.hpp so the first pass compiles
|
|
||||||
cat >./src/core/modbus_entity_parameters.hpp <<EOL
|
|
||||||
#include "modbus.h"
|
|
||||||
#include "emsdevice.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is auto-generated. Do not modify.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// clang-format off
|
|
||||||
|
|
||||||
namespace emsesp {
|
|
||||||
|
|
||||||
using dt = EMSdevice::DeviceType;
|
|
||||||
|
|
||||||
#define REGISTER_MAPPING(device_type, device_value_tag_type, long_name, modbus_register_offset, modbus_register_count) \\
|
|
||||||
{ device_type, device_value_tag_type, long_name[0], modbus_register_offset, modbus_register_count }
|
|
||||||
|
|
||||||
// IMPORTANT: This list MUST be ordered by keys "device_type", "device_value_tag_type" and "modbus_register_offset" in this order.
|
|
||||||
const std::initializer_list<Modbus::EntityModbusInfo> Modbus::modbus_register_mappings = {};
|
|
||||||
|
|
||||||
} // namespace emsesp
|
|
||||||
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
EOL
|
|
||||||
|
|
||||||
# First generate Modbus entity parameters
|
|
||||||
# build the modbus_entity_parameters.hpp header file
|
|
||||||
make clean
|
|
||||||
make -s ARGS=-DEMSESP_MODBUS
|
|
||||||
rm -f ./src/core/modbus_entity_parameters.hpp ./docs/dump_entities.csv
|
|
||||||
echo "test entity_dump" | ./emsesp | python3 ./scripts/strip_csv.py > ./docs/dump_entities.csv
|
|
||||||
cat ./docs/dump_entities.csv | python3 ./scripts/update_modbus_registers.py > ./src/core/modbus_entity_parameters.hpp
|
|
||||||
|
|
||||||
# regenerate dump_entities.csv but without the Modbus entity parameters
|
|
||||||
make clean
|
|
||||||
make -s ARGS=-DEMSESP_STANDALONE
|
|
||||||
rm -f ./docs/dump_entities.csv
|
|
||||||
echo "test entity_dump" | ./emsesp | python3 ./scripts/strip_csv.py > ./docs/dump_entities.csv
|
|
||||||
|
|
||||||
# generate Modbus doc - Modbus-Entity-Registers.md used in the emsesp.org documentation
|
|
||||||
rm -f ./docs/Modbus-Entity-Registers.md
|
|
||||||
cat ./docs/dump_entities.csv | python3 ./scripts/generate-modbus-register-doc.py > ./docs/Modbus-Entity-Registers.md
|
|
||||||
|
|
||||||
# dump_telegrams.csv
|
|
||||||
rm -f ./docs/dump_telegrams.csv
|
|
||||||
echo "test telegram_dump" | ./emsesp | python3 ./scripts/strip_csv.py > ./docs/dump_telegrams.csv
|
|
||||||
|
|
||||||
ls -al ./src/core/modbus_entity_parameters.hpp
|
|
||||||
ls -al ./docs/Modbus-Entity-Registers.md
|
|
||||||
ls -al ./docs/dump_entities.csv
|
|
||||||
ls -al ./docs/dump_telegrams.csv
|
|
||||||
135
scripts/run_executable.py
Executable file
135
scripts/run_executable.py
Executable file
@@ -0,0 +1,135 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
"""
|
||||||
|
Utility functions for running executables with streaming input and CSV output extraction.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def run_with_streaming_input(program_path, test_command, output_file=None):
|
||||||
|
"""
|
||||||
|
Run the executable and stream text input to it.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
program_path (str): Path to the executable to run
|
||||||
|
test_command (str): Command to send to the executable
|
||||||
|
output_file (str, optional): Path to save CSV output. If None, no file is saved.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
int: Return code of the executed process
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Start the process with pipes for stdin, stdout, and stderr
|
||||||
|
process = subprocess.Popen(
|
||||||
|
[str(program_path)],
|
||||||
|
stdin=subprocess.PIPE,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
text=True,
|
||||||
|
bufsize=1 # Line buffered
|
||||||
|
)
|
||||||
|
|
||||||
|
# add "test " to test_command if it doesn't already start with "test "
|
||||||
|
if not test_command.startswith("test "):
|
||||||
|
test_command = "test " + test_command
|
||||||
|
|
||||||
|
# Stream input line by line
|
||||||
|
for line in test_command.strip().split('\n'):
|
||||||
|
process.stdin.write(line + '\n')
|
||||||
|
process.stdin.flush()
|
||||||
|
|
||||||
|
# Close stdin to signal end of input
|
||||||
|
process.stdin.close()
|
||||||
|
|
||||||
|
# Read and collect output between CSV START and CSV END, then export to file
|
||||||
|
in_cvs_section = False
|
||||||
|
csv_output = []
|
||||||
|
|
||||||
|
for line in process.stdout:
|
||||||
|
if "---- CSV START ----" in line:
|
||||||
|
in_cvs_section = True
|
||||||
|
continue
|
||||||
|
elif "---- CSV END ----" in line:
|
||||||
|
in_cvs_section = False
|
||||||
|
continue
|
||||||
|
elif in_cvs_section:
|
||||||
|
csv_output.append(line)
|
||||||
|
# print(line, end='')
|
||||||
|
|
||||||
|
# Export CSV output to file if output_file is specified
|
||||||
|
if output_file:
|
||||||
|
# Ensure the output directory exists
|
||||||
|
Path(output_file).parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# delete the output file if it exists
|
||||||
|
if os.path.exists(output_file):
|
||||||
|
os.remove(output_file)
|
||||||
|
|
||||||
|
# Export CSV output to file
|
||||||
|
with open(output_file, 'w') as f:
|
||||||
|
f.writelines(csv_output)
|
||||||
|
print(f"CSV file created: {output_file} ({os.path.getsize(output_file)} bytes)")
|
||||||
|
|
||||||
|
# Wait for process to complete
|
||||||
|
return_code = process.wait()
|
||||||
|
|
||||||
|
# Print any errors
|
||||||
|
stderr_output = process.stderr.read()
|
||||||
|
if stderr_output:
|
||||||
|
print("\nErrors:", file=sys.stderr)
|
||||||
|
print(stderr_output, file=sys.stderr)
|
||||||
|
|
||||||
|
return return_code
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error running executable: {e}", file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
def run_executable_with_command(program_path, command, output_file=None):
|
||||||
|
"""
|
||||||
|
Simplified interface to run an executable with a command and optionally save output.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
program_path (str): Path to the executable to run
|
||||||
|
command (str): Command to send to the executable
|
||||||
|
output_file (str, optional): Path to save CSV output. If None, no file is saved.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
int: Return code of the executed process
|
||||||
|
"""
|
||||||
|
return run_with_streaming_input(program_path, command, output_file)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Command-line interface for running executables with streaming input."""
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
print("Usage: python3 run_executable.py <program_path> <command> [output_file]")
|
||||||
|
print("Example: python3 run_executable.py ./emsesp entity_dump ./output.csv")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
program_path = sys.argv[1]
|
||||||
|
command = sys.argv[2]
|
||||||
|
output_file = sys.argv[3] if len(sys.argv) > 3 else None
|
||||||
|
|
||||||
|
print(f"Running: {program_path}")
|
||||||
|
print(f"Command: {command}")
|
||||||
|
if output_file:
|
||||||
|
print(f"Output file: {output_file}")
|
||||||
|
|
||||||
|
return_code = run_with_streaming_input(program_path, command, output_file)
|
||||||
|
|
||||||
|
if return_code == 0:
|
||||||
|
print("Execution completed successfully!")
|
||||||
|
else:
|
||||||
|
print(f"Execution failed with return code: {return_code}")
|
||||||
|
|
||||||
|
sys.exit(return_code)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -26,4 +26,3 @@ pnpm webUI
|
|||||||
cd ..
|
cd ..
|
||||||
npx cspell "**"
|
npx cspell "**"
|
||||||
|
|
||||||
sh ./scripts/generate_csv_and_headers.sh
|
|
||||||
|
|||||||
@@ -228,10 +228,12 @@ void RxService::add(uint8_t * data, uint8_t length) {
|
|||||||
// create the telegram
|
// create the telegram
|
||||||
auto telegram = std::make_shared<Telegram>(operation, src, dest, type_id, offset, message_data, message_length);
|
auto telegram = std::make_shared<Telegram>(operation, src, dest, type_id, offset, message_data, message_length);
|
||||||
|
|
||||||
// check if queue is full, if so remove top item to make space
|
// check if queue is full, if so remove top item to make space, except if we're in standalone mode
|
||||||
|
#ifndef EMSESP_STANDALONE
|
||||||
if (rx_telegrams_.size() >= MAX_RX_TELEGRAMS) {
|
if (rx_telegrams_.size() >= MAX_RX_TELEGRAMS) {
|
||||||
rx_telegrams_.pop_front();
|
rx_telegrams_.pop_front();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
rx_telegrams_.emplace_back(rx_telegram_id_++, std::move(telegram)); // add to queue
|
rx_telegrams_.emplace_back(rx_telegram_id_++, std::move(telegram)); // add to queue
|
||||||
}
|
}
|
||||||
@@ -239,7 +241,7 @@ void RxService::add(uint8_t * data, uint8_t length) {
|
|||||||
// add empty telegram to rx-queue
|
// add empty telegram to rx-queue
|
||||||
void RxService::add_empty(const uint8_t src, const uint8_t dest, const uint16_t type_id, uint8_t offset) {
|
void RxService::add_empty(const uint8_t src, const uint8_t dest, const uint16_t type_id, uint8_t offset) {
|
||||||
auto telegram = std::make_shared<Telegram>(Telegram::Operation::RX, src, dest, type_id, offset, nullptr, 0);
|
auto telegram = std::make_shared<Telegram>(Telegram::Operation::RX, src, dest, type_id, offset, nullptr, 0);
|
||||||
// only if queue is not full
|
// only if queue is not full
|
||||||
if (rx_telegrams_.size() < MAX_RX_TELEGRAMS) {
|
if (rx_telegrams_.size() < MAX_RX_TELEGRAMS) {
|
||||||
rx_telegrams_.emplace_back(rx_telegram_id_++, std::move(telegram)); // add to queue
|
rx_telegrams_.emplace_back(rx_telegram_id_++, std::move(telegram)); // add to queue
|
||||||
}
|
}
|
||||||
@@ -442,6 +444,7 @@ void TxService::add(const uint8_t operation,
|
|||||||
|
|
||||||
LOG_DEBUG("New Tx [#%d] telegram, length %d", tx_telegram_id_, message_length);
|
LOG_DEBUG("New Tx [#%d] telegram, length %d", tx_telegram_id_, message_length);
|
||||||
|
|
||||||
|
#ifndef EMSESP_STANDALONE
|
||||||
// if the queue is full, make room by removing the last one
|
// if the queue is full, make room by removing the last one
|
||||||
if (tx_telegrams_.size() >= MAX_TX_TELEGRAMS) {
|
if (tx_telegrams_.size() >= MAX_TX_TELEGRAMS) {
|
||||||
LOG_WARNING("Tx queue overflow, skip one message");
|
LOG_WARNING("Tx queue overflow, skip one message");
|
||||||
@@ -452,6 +455,7 @@ void TxService::add(const uint8_t operation,
|
|||||||
}
|
}
|
||||||
tx_telegrams_.pop_front();
|
tx_telegrams_.pop_front();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (front) {
|
if (front) {
|
||||||
tx_telegrams_.emplace_front(tx_telegram_id_++, std::move(telegram), false, validateid); // add to front of queue
|
tx_telegrams_.emplace_front(tx_telegram_id_++, std::move(telegram), false, validateid); // add to front of queue
|
||||||
|
|||||||
@@ -32,13 +32,8 @@
|
|||||||
|
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
|
|
||||||
#if defined(EMSESP_STANDALONE)
|
|
||||||
#define MAX_RX_TELEGRAMS 100 // size of Rx queue
|
#define MAX_RX_TELEGRAMS 100 // size of Rx queue
|
||||||
#define MAX_TX_TELEGRAMS 200 // size of Tx queue
|
|
||||||
#else
|
|
||||||
#define MAX_RX_TELEGRAMS 10 // size of Rx queue
|
|
||||||
#define MAX_TX_TELEGRAMS 160 // size of Tx queue
|
#define MAX_TX_TELEGRAMS 160 // size of Tx queue
|
||||||
#endif
|
|
||||||
|
|
||||||
// default values for null values
|
// default values for null values
|
||||||
static constexpr uint8_t EMS_VALUE_BOOL = 0xFF; // used to mark that something is a boolean
|
static constexpr uint8_t EMS_VALUE_BOOL = 0xFF; // used to mark that something is a boolean
|
||||||
|
|||||||
Reference in New Issue
Block a user